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