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: