diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index f2d95df3e..3c1625e6f 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -321,6 +321,8 @@ + diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmGoogleAuthActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmGoogleAuthActivity.java new file mode 100644 index 000000000..a8c2b280d --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmGoogleAuthActivity.java @@ -0,0 +1,190 @@ +/* + * ASTRID: Android's Simple Task Recording Dashboard + * + * Copyright (c) 2009 Tim Su + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.todoroo.astrid.actfm; + +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.app.ListActivity; +import android.app.ProgressDialog; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.Toast; + +import com.google.api.client.googleapis.extensions.android2.auth.GoogleAccountManager; +import com.timsu.astrid.R; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.ContextManager; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DialogUtilities; +import com.todoroo.astrid.actfm.sync.ActFmInvoker; +import com.todoroo.astrid.service.AstridDependencyInjector; +import com.todoroo.astrid.service.StatisticsService; + +/** + * This activity allows users to sign in or log in to Google Tasks + * through the Android account manager + * + * @author Sam Bosley + * + */ +public class ActFmGoogleAuthActivity extends ListActivity { + + private static final String AUTH_TOKEN_TYPE = "oauth2:https://www.astrid.com"; //$NON-NLS-1$ + + public static final String RESULT_EMAIL = "email"; //$NON-NLS-1$ + public static final String RESULT_TOKEN = "token"; //$NON-NLS-1$ + + @Autowired ActFmInvoker actFmInvoker; + + // --- ui initialization + + private GoogleAccountManager accountManager; + private String[] nameArray; + + private String authToken; + private String accountName; + + static { + AstridDependencyInjector.initialize(); + } + + public ActFmGoogleAuthActivity() { + super(); + DependencyInjectionService.getInstance().inject(this); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ContextManager.setContext(this); + + setContentView(R.layout.gtasks_login_activity); + setTitle(R.string.actfm_GAA_title); + + accountManager = new GoogleAccountManager(this); + Account[] accounts = accountManager.getAccounts(); + ArrayList accountNames = new ArrayList(); + for (Account a : accounts) { + accountNames.add(a.name); + } + + nameArray = accountNames.toArray(new String[accountNames.size()]); + setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, nameArray)); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + final ProgressDialog pd = DialogUtilities.progressDialog(this, this.getString(R.string.gtasks_GLA_authenticating)); + pd.show(); + final Account a = accountManager.getAccountByName(nameArray[position]); + accountName = a.name; + getAuthToken(a, pd); + } + + private void getAuthToken(Account a, final ProgressDialog pd) { + AccountManagerCallback callback = new AccountManagerCallback() { + public void run(final AccountManagerFuture future) { + new Thread() { + @Override + public void run() { + try { + Bundle bundle = future.getResult(30, TimeUnit.SECONDS); + if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { + authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); + onAuthTokenSuccess(); + } + } catch (Exception e) { + Log.e("actfm-google-auth", "Login Error", e); //$NON-NLS-1$ //$NON-NLS-2$ + ActFmGoogleAuthActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(ActFmGoogleAuthActivity.this, + R.string.gtasks_GLA_errorAuth, + Toast.LENGTH_LONG).show(); + } + }); + } finally { + DialogUtilities.dismissDialog(ActFmGoogleAuthActivity.this, pd); + } + } + }.start(); + } + }; + accountManager.manager.getAuthToken(a, AUTH_TOKEN_TYPE, null, this, callback, null); + } + + private void onAuthCancel() { + setResult(RESULT_CANCELED); + finish(); + } + + private void onAuthTokenSuccess() { + Intent data = new Intent(); + data.putExtra(RESULT_EMAIL, accountName); + data.putExtra(RESULT_TOKEN, authToken); + setResult(RESULT_OK, data); + finish(); + } + + + @Override + protected void onResume() { + super.onResume(); + StatisticsService.sessionStart(this); + } + + @Override + protected void onPause() { + super.onPause(); + StatisticsService.sessionPause(); + } + + @Override + protected void onStop() { + super.onStop(); + StatisticsService.sessionStop(this); + } + + private static final int REQUEST_AUTHENTICATE = 0; + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode == REQUEST_AUTHENTICATE && resultCode == RESULT_OK){ + final ProgressDialog pd = DialogUtilities.progressDialog(this, this.getString(R.string.gtasks_GLA_authenticating)); + pd.show(); + final Account a = accountManager.getAccountByName(accountName); + getAuthToken(a, pd); + } else { + onAuthCancel(); + } + } + +} \ No newline at end of file diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java index f1cc30489..2f6632588 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java @@ -21,9 +21,7 @@ package com.todoroo.astrid.actfm; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; -import java.security.NoSuchAlgorithmException; import java.util.Random; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -79,9 +77,9 @@ import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.TaskService; /** - * This activity allows users to sign in or log in to Producteev + * This activity allows users to sign in or log in to Astrid.com * - * @author arne.jans + * @author Tim Su * */ public class ActFmLoginActivity extends Activity implements AuthListener { @@ -102,13 +100,14 @@ public class ActFmLoginActivity extends Activity implements AuthListener { private TextView errors; protected boolean noSync = false; - public static final String SHOW_TOAST = "show_toast"; + public static final String SHOW_TOAST = "show_toast"; //$NON-NLS-1$ + private boolean showToast; // --- ui initialization private static final int REQUEST_CODE_GOOGLE_ACCOUNTS = 1; - private static final int REQUEST_CODE_OAUTH = 2; + private static final int REQUEST_CODE_GOOGLE = 2; static { AstridDependencyInjector.initialize(); @@ -129,7 +128,6 @@ public class ActFmLoginActivity extends Activity implements AuthListener { DependencyInjectionService.getInstance().inject(this); } - @SuppressWarnings("nls") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -186,6 +184,7 @@ public class ActFmLoginActivity extends Activity implements AuthListener { StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_SHOW); } + @SuppressWarnings("nls") protected void initializeUI() { facebook = new Facebook(APP_ID); facebookRunner = new AsyncFacebookRunner(facebook); @@ -204,21 +203,11 @@ public class ActFmLoginActivity extends Activity implements AuthListener { protected final OnClickListener googleListener = new OnClickListener() { @Override - @SuppressWarnings("nls") public void onClick(View arg0) { Intent intent = new Intent(ActFmLoginActivity.this, - OAuthLoginActivity.class); - try { - String url = actFmInvoker.createFetchUrl("user_oauth", - "provider", "google"); - intent.putExtra(OAuthLoginActivity.URL_TOKEN, url); - startActivityForResult(intent, REQUEST_CODE_OAUTH); - StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_START); - } catch (UnsupportedEncodingException e) { - handleError(e); - } catch (NoSuchAlgorithmException e) { - handleError(e); - } + ActFmGoogleAuthActivity.class); + startActivityForResult(intent, REQUEST_CODE_GOOGLE); + StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_START); } }; @@ -538,15 +527,10 @@ public class ActFmLoginActivity extends Activity implements AuthListener { onFBAuthSucceed(); } errors.setVisibility(View.GONE); - } else if (requestCode == REQUEST_CODE_OAUTH) { - String result = data.getStringExtra(OAuthLoginActivity.DATA_RESPONSE); - try { - JSONObject json = new JSONObject(result); - postAuthenticate(json, json.getString("token")); - StatisticsService.reportEvent(StatisticsConstants.ACTFM_LOGIN_GL_SUCCESS); - } catch (JSONException e) { - handleError(e); - } + } else if (requestCode == REQUEST_CODE_GOOGLE) { + String email= data.getStringExtra(ActFmGoogleAuthActivity.RESULT_EMAIL); + String token = data.getStringExtra(ActFmGoogleAuthActivity.RESULT_TOKEN); + authenticate(email, email, "google", token); } } @@ -565,4 +549,4 @@ public class ActFmLoginActivity extends Activity implements AuthListener { REQUEST_CODE_GOOGLE_ACCOUNTS, false); } -} \ No newline at end of file +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java index 814b340dd..393311e07 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java @@ -81,8 +81,9 @@ public class GtasksLoginActivity extends ListActivity { super.onCreate(savedInstanceState); ContextManager.setContext(this); + setContentView(R.layout.gtasks_login_activity); setTitle(R.string.gtasks_GLA_title); - getListView().setBackgroundColor(getResources().getColor(android.R.color.background_dark)); + accountManager = new GoogleAccountManager(this); Account[] accounts = accountManager.getAccounts(); ArrayList accountNames = new ArrayList(); diff --git a/astrid/res/layout/gtasks_login_activity.xml b/astrid/res/layout/gtasks_login_activity.xml index 7e1fd031f..c573b861e 100644 --- a/astrid/res/layout/gtasks_login_activity.xml +++ b/astrid/res/layout/gtasks_login_activity.xml @@ -1,14 +1,18 @@ - + + android:layout_width="fill_parent" + android:layout_height="fill_parent"/> + + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:text="@string/gtasks_GLA_noaccounts" + android:gravity="center" + style="@style/TextAppearance.TLA_NoItems" /> - \ No newline at end of file + \ No newline at end of file diff --git a/astrid/res/values/strings-actfm.xml b/astrid/res/values/strings-actfm.xml index c7082ab02..c7db8beb3 100644 --- a/astrid/res/values/strings-actfm.xml +++ b/astrid/res/values/strings-actfm.xml @@ -220,11 +220,8 @@ Login to Astrid.com - - Please connect to Google: - - - Astrid won\'t send messages e-mails without permission. + + Select a Google account: