1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android; 2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 3ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.Activity; 4ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.AlertDialog; 5ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.IntentService; 6ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.Notification; 7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.NotificationManager; 8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.PendingIntent; 9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.app.TaskStackBuilder; 10ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.content.BroadcastReceiver; 11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.content.Context; 12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.content.DialogInterface; 13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.content.Intent; 14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.graphics.BitmapFactory; 15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.graphics.drawable.BitmapDrawable; 16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.net.wifi.WifiConfiguration; 17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.net.wifi.WifiInfo; 18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.net.wifi.WifiManager; 19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.os.Binder; 20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.os.Bundle; 21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.os.IBinder; 22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.util.Log; 23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.view.LayoutInflater; 24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.view.View; 25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.view.ViewGroup; 26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.widget.AdapterView; 27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.widget.ArrayAdapter; 28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.widget.ImageView; 29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.widget.ListView; 30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport android.widget.TextView; 31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.anqp.OSUProvider; 33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.AppBridge; 34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.PasspointMatch; 35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.osu.OSUInfo; 36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport com.android.hotspot2.osu.OSUManager; 37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport org.xml.sax.SAXException; 39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.io.IOException; 41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Collections; 42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.List; 43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.Locale; 44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.concurrent.TimeUnit; 45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist//import com.android.Osu.R; 47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist/** 49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist * Main activity. 50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist */ 51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class MainActivity extends Activity { 52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static final int NOTIFICATION_ID = 0; // Used for OSU count 53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static final int NOTIFICATION_MESSAGE_ID = 1; // Used for other messages 54ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static final Locale LOCALE = java.util.Locale.getDefault(); 55ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 56ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static volatile OSUService sOsuService; 57ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 58ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private ListView osuListView; 59ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private OsuListAdapter2 osuListAdapter; 60ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private String message; 61ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 62ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public MainActivity() { 63ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 64ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 65ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 66ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 67ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist protected void onResume() { 68ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super.onResume(); 69ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (message != null) { 70ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist showDialog(message); 71ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist message = null; 72ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 73ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 74ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 75ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 76ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void onCreate(Bundle savedInstanceState) { 77ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super.onCreate(savedInstanceState); 78ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 79ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Intent intent = getIntent(); 80ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Bundle bundle = intent.getExtras(); 81ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 82ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (bundle == null) { // User interaction 83ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (sOsuService == null) { 84ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Intent serviceIntent = new Intent(this, OSUService.class); 85ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist serviceIntent.putExtra(ACTION_KEY, "dummy-key"); 86ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist startService(serviceIntent); 87ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return; 88ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 89ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 90ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist List<OSUInfo> osuInfos = sOsuService.getOsuInfos(); 91ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 92ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist setContentView(R.layout.activity_main); 93ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d("osu", "osu count:" + osuInfos.size()); 94ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist View noOsuView = findViewById(R.id.no_osu); 95ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (osuInfos.size() > 0) { 96ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist noOsuView.setVisibility(View.GONE); 97ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuListAdapter = new OsuListAdapter2(this, osuInfos); 98ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuListView = (ListView) findViewById(R.id.profile_list); 99ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuListView.setAdapter(osuListAdapter); 100ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 101ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 102ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 103ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist OSUInfo osuData = (OSUInfo) adapterView.getAdapter().getItem(position); 104ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d("osu", "launch osu:" + osuData.getName(LOCALE) 105ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist + " id:" + osuData.getOsuID()); 106ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sOsuService.selectOsu(osuData.getOsuID()); 107ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist finish(); 108ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 109ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist }); 110ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 111ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist noOsuView.setVisibility(View.VISIBLE); 112ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 113ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else if (intent.getAction().equals(AppBridge.ACTION_OSU_NOTIFICATION)) { 114ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (bundle.containsKey(AppBridge.OSU_COUNT)) { 115ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist showOsuCount(bundle.getInt("osu-count", 0), Collections.<OSUInfo>emptyList()); 116ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else if (bundle.containsKey(AppBridge.PROV_SUCCESS)) { 117ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist showStatus(bundle.getBoolean(AppBridge.PROV_SUCCESS), 118ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getString(AppBridge.SP_NAME), 119ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getString(AppBridge.PROV_MESSAGE), 120ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist null); 121ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else if (bundle.containsKey(AppBridge.DEAUTH)) { 122ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist showDeauth(bundle.getString(AppBridge.SP_NAME), 123ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getBoolean(AppBridge.DEAUTH), 124ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getInt(AppBridge.DEAUTH_DELAY), 125ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getString(AppBridge.DEAUTH_URL)); 126ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 127ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist /* 128ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist else if (bundle.containsKey(AppBridge.OSU_INFO)) { 129ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist List<OsuData> osus = printOsuDataList(bundle.getParcelableArray(AppBridge.OSU_INFO)); 130ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist showOsuList(osus); 131ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 132ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist */ 133ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 134ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 135ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 136ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void showOsuCount(int osuCount, List<OSUInfo> osus) { 137ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (osuCount > 0) { 138ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist printOsuDataList(osus); 139ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendNotification(osuCount); 140ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 141ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist cancelNotification(); 142ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 143ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist finish(); 144ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 145ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 146ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void showStatus(boolean provSuccess, String spName, String provMessage, 147ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String remoteStatus) { 148ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (provSuccess) { 149ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 150ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("Credentials for %s was successfully installed", spName)); 151ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 152ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (spName != null) { 153ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (remoteStatus != null) { 154ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 155ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("Failed to install credentials for %s: %s: %s", 156ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist spName, provMessage, remoteStatus)); 157ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 158ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 159ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("Failed to install credentials for %s: %s", 160ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist spName, provMessage)); 161ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 162ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 163ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 164ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("Failed to contact OSU: %s", provMessage)); 165ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 166ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 167ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 168ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 169ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void showDeauth(String spName, boolean ess, int delay, String url) { 170ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String delayReadable = getReadableTimeInSeconds(delay); 171ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (ess) { 172ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (delay > 60) { 173ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 174ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("There is an issue connecting to %s [for the next %s]. " + 175ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "Please visit %s for details", spName, delayReadable, url)); 176ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 177ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 178ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("There is an issue connecting to %s. " + 179ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "Please visit %s for details", spName, url)); 180ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 181ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 182ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sendDialogMessage( 183ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String.format("There is an issue with the closest Access Point for %s. " + 184ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "You may wait %s or move to another Access Point to " + 185ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist "regain access. Please visit %s for details.", 186ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist spName, delayReadable, url)); 187ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 188ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 189ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 190ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static final String ACTION_KEY = "action"; 191ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 192ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public static class WifiReceiver extends BroadcastReceiver { 193ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 194ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void onReceive(Context c, Intent intent) { 195ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d(OSUManager.TAG, "OSU App got intent: " + intent.getAction()); 196ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Intent serviceIntent; 197ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist serviceIntent = new Intent(c, OSUService.class); 198ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist serviceIntent.putExtra(ACTION_KEY, intent.getAction()); 199ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist serviceIntent.putExtras(intent); 200ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist c.startService(serviceIntent); 201ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 202ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 203ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 204ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public static class OSUService extends IntentService { 205ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private OSUManager mOsuManager; 206ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private final IBinder mBinder = new Binder(); 207ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 208ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public OSUService() { 209ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super("OSUService"); 210ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 211ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 212ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 213ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public int onStartCommand(Intent intent, int flags, int startId) { 214ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist onHandleIntent(intent); 215ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return START_STICKY; 216ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 217ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 218ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 219ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void onCreate() { 220ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super.onCreate(); 221ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d("YYY", String.format("Service %x running, OSU %x", 222ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist System.identityHashCode(this), System.identityHashCode(mOsuManager))); 223ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (mOsuManager == null) { 224ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager = new OSUManager(this); 225ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 226ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist sOsuService = this; 227ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 228ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 229ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 230ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void onDestroy() { 231ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super.onDestroy(); 232ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d("YYY", String.format("Service %x killed", System.identityHashCode(this))); 233ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 234ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 235ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 236ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public IBinder onBind(Intent intent) { 237ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mBinder; 238ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 239ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 240ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 241ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist protected void onHandleIntent(Intent intent) { 242ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Bundle bundle = intent.getExtras(); 243ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 244ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d(OSUManager.TAG, "OSU Service got intent: " + intent.getStringExtra(ACTION_KEY)); 245ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist switch (intent.getStringExtra(ACTION_KEY)) { 246ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION: 247ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.pushScanResults(wifiManager.getScanResults()); 248ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist break; 249ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist case WifiManager.PASSPOINT_WNM_FRAME_RECEIVED_ACTION: 250ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist long bssid = bundle.getLong(WifiManager.EXTRA_PASSPOINT_WNM_BSSID); 251ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist String url = bundle.getString(WifiManager.EXTRA_PASSPOINT_WNM_URL); 252ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 253ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist try { 254ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (bundle.containsKey(WifiManager.EXTRA_PASSPOINT_WNM_METHOD)) { 255ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int method = bundle.getInt(WifiManager.EXTRA_PASSPOINT_WNM_METHOD); 256ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (method != OSUProvider.OSUMethod.SoapXml.ordinal()) { 257ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.w(OSUManager.TAG, "Unsupported remediation method: " + method); 258ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 259ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist PasspointMatch match = null; 260ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (bundle.containsKey(WifiManager.EXTRA_PASSPOINT_WNM_PPOINT_MATCH)) { 261ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int ordinal = 262ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getInt(WifiManager.EXTRA_PASSPOINT_WNM_PPOINT_MATCH); 263ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (ordinal >= 0 && ordinal < PasspointMatch.values().length) { 264ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist match = PasspointMatch.values()[ordinal]; 265ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 266ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 267ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.wnmRemediate(bssid, url, match); 268ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else if (bundle.containsKey(WifiManager.EXTRA_PASSPOINT_WNM_ESS)) { 269ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist boolean ess = bundle.getBoolean(WifiManager.EXTRA_PASSPOINT_WNM_ESS); 270ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int delay = bundle.getInt(WifiManager.EXTRA_PASSPOINT_WNM_DELAY); 271ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.deauth(bssid, ess, delay, url); 272ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 273ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.w(OSUManager.TAG, "Unknown WNM event"); 274ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 275ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } catch (IOException | SAXException e) { 276ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.w(OSUManager.TAG, "Remediation event failed to parse: " + e); 277ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 278ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist break; 279ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist case WifiManager.PASSPOINT_ICON_RECEIVED_ACTION: 280ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.notifyIconReceived( 281ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getLong(WifiManager.EXTRA_PASSPOINT_ICON_BSSID), 282ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getString(WifiManager.EXTRA_PASSPOINT_ICON_FILE), 283ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist bundle.getByteArray(WifiManager.EXTRA_PASSPOINT_ICON_DATA)); 284ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist break; 285ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist case WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION: 286ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.networkConfigChange((WifiConfiguration) 287ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist intent.getParcelableExtra(WifiManager.EXTRA_WIFI_CONFIGURATION)); 288ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist break; 289ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist case WifiManager.WIFI_STATE_CHANGED_ACTION: 290ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist int state = bundle.getInt(WifiManager.EXTRA_WIFI_STATE); 291ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (state == WifiManager.WIFI_STATE_DISABLED) { 292ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.wifiStateChange(false); 293ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else if (state == WifiManager.WIFI_STATE_ENABLED) { 294ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.wifiStateChange(true); 295ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 296ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist break; 297ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist case WifiManager.NETWORK_STATE_CHANGED_ACTION: 298ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.networkConnectEvent((WifiInfo) 299ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO)); 300ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist break; 301ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 302ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 303ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 304ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public List<OSUInfo> getOsuInfos() { 305ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return mOsuManager.getAvailableOSUs(); 306ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 307ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 308ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void selectOsu(int id) { 309ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist mOsuManager.setOSUSelection(id); 310ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 311ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 312ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 313ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private String getReadableTimeInSeconds(int timeSeconds) { 314ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist long hours = TimeUnit.SECONDS.toHours(timeSeconds); 315ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist long minutes = TimeUnit.SECONDS.toMinutes(timeSeconds) - TimeUnit.HOURS.toMinutes(hours); 316ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist long seconds = 317ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist timeSeconds - TimeUnit.HOURS.toSeconds(hours) - TimeUnit.MINUTES.toSeconds(minutes); 318ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (hours > 0) { 319ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return String.format("%02d:%02d:%02d", hours, minutes, seconds); 320ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } else { 321ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return String.format("%ds", seconds); 322ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 323ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 324ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 325ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void sendNotification(int count) { 326ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Notification.Builder builder = 327ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist new Notification.Builder(this) 328ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setContentTitle(String.format("%s OSU available", count)) 329ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setContentText("Choose one to connect") 330ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setSmallIcon(android.R.drawable.ic_dialog_info) 331ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setAutoCancel(false); 332ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Intent resultIntent = new Intent(this, MainActivity.class); 333ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 334ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 335ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist stackBuilder.addParentStack(MainActivity.class); 336ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist stackBuilder.addNextIntent(resultIntent); 337ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist PendingIntent resultPendingIntent = 338ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 339ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist builder.setContentIntent(resultPendingIntent); 340ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist NotificationManager notificationManager = 341ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 342ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist notificationManager.notify(NOTIFICATION_ID, builder.build()); 343ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 344ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 345ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void cancelNotification() { 346ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist NotificationManager notificationManager = 347ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 348ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist notificationManager.cancel(NOTIFICATION_ID); 349ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 350ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 351ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void sendDialogMessage(String message) { 352ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist// sendNotificationMessage(message); 353ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist this.message = message; 354ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 355ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 356ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void showDialog(String message) { 357ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist AlertDialog.Builder builder = new AlertDialog.Builder(this); 358ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist builder.setMessage(message) 359ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setTitle("OSU"); 360ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 361ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 362ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public void onCancel(DialogInterface dialogInterface) { 363ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist dialogInterface.cancel(); 364ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist finish(); 365ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 366ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist }); 367ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist AlertDialog dialog = builder.create(); 368ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist dialog.show(); 369ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 370ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 371ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void sendNotificationMessage(String title) { 372ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Notification.Builder builder = 373ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist new Notification.Builder(this) 374ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setContentTitle(title) 375ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setContentText("Click to dismiss.") 376ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setSmallIcon(android.R.drawable.ic_dialog_info) 377ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist .setAutoCancel(true); 378ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist NotificationManager notificationManager = 379ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 380ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist notificationManager.notify(NOTIFICATION_MESSAGE_ID, builder.build()); 381ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 382ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 383ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private static class OsuListAdapter2 extends ArrayAdapter<OSUInfo> { 384ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private Activity activity; 385ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 386ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public OsuListAdapter2(Activity activity, List<OSUInfo> osuDataList) { 387ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist super(activity, R.layout.list_item, osuDataList); 388ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist this.activity = activity; 389ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 390ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 391ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist @Override 392ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist public View getView(int position, View convertView, ViewGroup parent) { 393ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist View view = convertView; 394ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist if (view == null) { 395ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist view = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false); 396ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 397ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist OSUInfo osuData = getItem(position); 398ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist TextView osuName = (TextView) view.findViewById(R.id.profile_name); 399ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuName.setText(osuData.getName(LOCALE)); 400ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist TextView osuDetail = (TextView) view.findViewById(R.id.profile_detail); 401ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuDetail.setText(osuData.getServiceDescription(LOCALE)); 402ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist ImageView osuIcon = (ImageView) view.findViewById(R.id.profile_logo); 403ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist byte[] iconData = osuData.getIconFileElement().getIconData(); 404ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuIcon.setImageDrawable( 405ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist new BitmapDrawable(activity.getResources(), 406ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist BitmapFactory.decodeByteArray(iconData, 0, iconData.length))); 407ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist return view; 408ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 409ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 410ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 411ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist private void printOsuDataList(List<OSUInfo> osuDataList) { 412ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist for (OSUInfo osuData : osuDataList) { 413ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist Log.d("osu", String.format("OSUData:[%s][%s][%d]", 414ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuData.getName(LOCALE), osuData.getServiceDescription(LOCALE), 415ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist osuData.getOsuID())); 416ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 417ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist } 418ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist 419ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist} 420