| Index: remoting/android/java/src/org/chromium/chromoting/Chromoting.java
|
| diff --git a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
|
| index cd258d2532bb4fafa6be1cd6545eba976d1e6725..520690d89d11f898185ca8553252b57496d9ae07 100644
|
| --- a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
|
| +++ b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
|
| @@ -11,18 +11,14 @@ import android.accounts.AccountManagerFuture;
|
| import android.accounts.AuthenticatorException;
|
| import android.accounts.OperationCanceledException;
|
| import android.app.Activity;
|
| -import android.content.Context;
|
| import android.content.Intent;
|
| import android.content.SharedPreferences;
|
| import android.os.Bundle;
|
| import android.os.Handler;
|
| import android.os.HandlerThread;
|
| -import android.text.Html;
|
| import android.util.Log;
|
| import android.view.Menu;
|
| import android.view.MenuItem;
|
| -import android.view.View;
|
| -import android.view.ViewGroup;
|
| import android.widget.ArrayAdapter;
|
| import android.widget.ListView;
|
| import android.widget.TextView;
|
| @@ -54,11 +50,9 @@ public class Chromoting extends Activity {
|
| private static final String HOST_LIST_PATH =
|
| "https://www.googleapis.com/chromoting/v1/@me/hosts?key=";
|
|
|
| - /** Color to use for hosts that are online. */
|
| - private static final String HOST_COLOR_ONLINE = "green";
|
| -
|
| - /** Color to use for hosts that are offline. */
|
| - private static final String HOST_COLOR_OFFLINE = "red";
|
| + /** Lock to protect |mAccount| and |mToken|. */
|
| + // TODO(lambroslambrou): |mHosts| needs to be protected as well.
|
| + private Object mLock = new Object();
|
|
|
| /** User's account details. */
|
| private Account mAccount;
|
| @@ -188,12 +182,37 @@ public class Chromoting extends Activity {
|
| return true;
|
| }
|
|
|
| + /** Called when the user taps on a host entry. */
|
| + public void connectToHost(JSONObject host) {
|
| + try {
|
| + synchronized (mLock) {
|
| + JniInterface.connectToHost(mAccount.name, mToken, host.getString("jabberId"),
|
| + host.getString("hostId"), host.getString("publicKey"),
|
| + new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + startActivity(new Intent(Chromoting.this, Desktop.class));
|
| + }
|
| + });
|
| + }
|
| + } catch (JSONException ex) {
|
| + Log.w("host", ex);
|
| + Toast.makeText(this, getString(R.string.error_reading_host),
|
| + Toast.LENGTH_LONG).show();
|
| + // Close the application.
|
| + finish();
|
| + }
|
| + }
|
| +
|
| /**
|
| * Processes the authentication token once the system provides it. Once in possession of such a
|
| * token, attempts to request a host list from the directory server. In case of a bad response,
|
| * this is retried once in case the system's cached auth token had expired.
|
| */
|
| private class HostListDirectoryGrabber implements AccountManagerCallback<Bundle> {
|
| + // TODO(lambroslambrou): Refactor this class to provide async interface usable on the UI
|
| + // thread.
|
| +
|
| /** Whether authentication has already been attempted. */
|
| private boolean mAlreadyTried;
|
|
|
| @@ -221,7 +240,7 @@ public class Chromoting extends Activity {
|
| String authToken = result.getString(AccountManager.KEY_AUTHTOKEN);
|
| Log.i("auth", "Received an auth token from system");
|
|
|
| - synchronized (mUi) {
|
| + synchronized (mLock) {
|
| mAccount = new Account(accountName, accountType);
|
| mToken = authToken;
|
| getPreferences(MODE_PRIVATE).edit().putString("account_name", accountName).
|
| @@ -262,7 +281,7 @@ public class Chromoting extends Activity {
|
| if (!mAlreadyTried) {
|
| // This was our first connection attempt.
|
|
|
| - synchronized (mUi) {
|
| + synchronized (mLock) {
|
| if (mAccount != null) {
|
| // We got an account, but couldn't log into it. We'll retry in case
|
| // the system's cached authentication token had already expired.
|
| @@ -289,7 +308,6 @@ public class Chromoting extends Activity {
|
| }
|
| } else if (ex instanceof JSONException) {
|
| explanation = getString(R.string.error_unexpected_response);
|
| - runOnUiThread(new HostListDisplayer(mUi));
|
| }
|
|
|
| mHosts = null;
|
| @@ -298,126 +316,51 @@ public class Chromoting extends Activity {
|
| }
|
|
|
| // Share our findings with the user.
|
| - runOnUiThread(new HostListDisplayer(mUi));
|
| + runOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + updateUi();
|
| + }
|
| + });
|
| }
|
| }
|
|
|
| - /** Formats the host list and offers it to the user. */
|
| - private class HostListDisplayer implements Runnable {
|
| - /** Communication with the screen. */
|
| - private Activity mUi;
|
| -
|
| - /** Constructor. */
|
| - public HostListDisplayer(Activity ui) {
|
| - mUi = ui;
|
| - }
|
| -
|
| - /**
|
| - * Updates the infotext and host list display.
|
| - * This method affects the UI and must be run on its same thread.
|
| - */
|
| - @Override
|
| - public void run() {
|
| - synchronized (mUi) {
|
| - mRefreshButton.setEnabled(mAccount != null);
|
| - if (mAccount != null) {
|
| - mAccountSwitcher.setTitle(mAccount.name);
|
| - }
|
| - }
|
| -
|
| - if (mHosts == null) {
|
| - mGreeting.setText(getString(R.string.inst_empty_list));
|
| - mList.setAdapter(null);
|
| - return;
|
| - }
|
| -
|
| - mGreeting.setText(getString(R.string.inst_host_list));
|
| -
|
| - ArrayAdapter<JSONObject> displayer = new HostListAdapter(mUi, R.layout.host);
|
| - Log.i("hostlist", "About to populate host list display");
|
| - try {
|
| - int index = 0;
|
| - while (!mHosts.isNull(index)) {
|
| - displayer.add(mHosts.getJSONObject(index));
|
| - ++index;
|
| - }
|
| - mList.setAdapter(displayer);
|
| - }
|
| - catch(JSONException ex) {
|
| - Log.w("hostlist", ex);
|
| - Toast.makeText(
|
| - mUi, getString(R.string.error_cataloging_hosts), Toast.LENGTH_LONG).show();
|
| -
|
| - // Close the application.
|
| - finish();
|
| + /**
|
| + * Updates the infotext and host list display.
|
| + * This method affects the UI and must be run on the main thread.
|
| + */
|
| + private void updateUi() {
|
| + synchronized (mLock) {
|
| + mRefreshButton.setEnabled(mAccount != null);
|
| + if (mAccount != null) {
|
| + mAccountSwitcher.setTitle(mAccount.name);
|
| }
|
| }
|
| - }
|
|
|
| - /** Describes the appearance and behavior of each host list entry. */
|
| - private class HostListAdapter extends ArrayAdapter<JSONObject> {
|
| - /** Constructor. */
|
| - public HostListAdapter(Context context, int textViewResourceId) {
|
| - super(context, textViewResourceId);
|
| + if (mHosts == null) {
|
| + mGreeting.setText(getString(R.string.inst_empty_list));
|
| + mList.setAdapter(null);
|
| + return;
|
| }
|
|
|
| - /** Generates a View corresponding to this particular host. */
|
| - @Override
|
| - public View getView(int position, View convertView, ViewGroup parent) {
|
| - TextView target = (TextView)super.getView(position, convertView, parent);
|
| + mGreeting.setText(getString(R.string.inst_host_list));
|
|
|
| - try {
|
| - final JSONObject host = getItem(position);
|
| - target.setText(Html.fromHtml(host.getString("hostName") + " (<font color = \"" +
|
| - (host.getString("status").equals("ONLINE") ? HOST_COLOR_ONLINE :
|
| - HOST_COLOR_OFFLINE) + "\">" + host.getString("status") + "</font>)"));
|
| -
|
| - if (host.getString("status").equals("ONLINE")) { // Host is online.
|
| - target.setOnClickListener(new View.OnClickListener() {
|
| - @Override
|
| - public void onClick(View v) {
|
| - try {
|
| - synchronized (getContext()) {
|
| - JniInterface.connectToHost(mAccount.name, mToken,
|
| - host.getString("jabberId"),
|
| - host.getString("hostId"),
|
| - host.getString("publicKey"),
|
| - new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - startActivity(
|
| - new Intent(getContext(), Desktop.class));
|
| - }
|
| - });
|
| - }
|
| - }
|
| - catch(JSONException ex) {
|
| - Log.w("host", ex);
|
| - Toast.makeText(getContext(),
|
| - getString(R.string.error_reading_host),
|
| - Toast.LENGTH_LONG).show();
|
| -
|
| - // Close the application.
|
| - finish();
|
| - }
|
| - }
|
| - });
|
| - } else { // Host is offline.
|
| - // Disallow interaction with this entry.
|
| - target.setEnabled(false);
|
| - }
|
| + ArrayAdapter<JSONObject> displayer = new HostListAdapter(this, R.layout.host);
|
| + Log.i("hostlist", "About to populate host list display");
|
| + try {
|
| + int index = 0;
|
| + while (!mHosts.isNull(index)) {
|
| + displayer.add(mHosts.getJSONObject(index));
|
| + ++index;
|
| }
|
| - catch(JSONException ex) {
|
| - Log.w("hostlist", ex);
|
| - Toast.makeText(getContext(),
|
| - getString(R.string.error_displaying_host),
|
| - Toast.LENGTH_LONG).show();
|
| -
|
| - // Close the application.
|
| - finish();
|
| - }
|
| -
|
| - return target;
|
| + mList.setAdapter(displayer);
|
| + } catch (JSONException ex) {
|
| + Log.w("hostlist", ex);
|
| + Toast.makeText(this, getString(R.string.error_cataloging_hosts),
|
| + Toast.LENGTH_LONG).show();
|
| +
|
| + // Close the application.
|
| + finish();
|
| }
|
| }
|
| }
|
|
|