From 10d6c0360d7d167a95b200992dca9661325fb7b2 Mon Sep 17 00:00:00 2001 From: Felix Kloft Date: Wed, 15 May 2013 11:24:27 +0200 Subject: [PATCH] Use Android integrated Google login --- mobile/AndroidManifest.xml | 4 +- mobile/res/values/strings.xml | 1 + .../iitc_mobile/DeviceAccountLogin.java | 141 ++++++++++++++++++ .../com/cradle/iitc_mobile/IITC_Mobile.java | 28 +++- .../iitc_mobile/IITC_WebViewClient.java | 5 + 5 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 mobile/src/com/cradle/iitc_mobile/DeviceAccountLogin.java diff --git a/mobile/AndroidManifest.xml b/mobile/AndroidManifest.xml index 25606ea8..5fd825d1 100644 --- a/mobile/AndroidManifest.xml +++ b/mobile/AndroidManifest.xml @@ -8,9 +8,11 @@ android:minSdkVersion="14" android:targetSdkVersion="17" /> - + + + Faction Info Debug + Choose account to login \ No newline at end of file diff --git a/mobile/src/com/cradle/iitc_mobile/DeviceAccountLogin.java b/mobile/src/com/cradle/iitc_mobile/DeviceAccountLogin.java new file mode 100644 index 00000000..9d008028 --- /dev/null +++ b/mobile/src/com/cradle/iitc_mobile/DeviceAccountLogin.java @@ -0,0 +1,141 @@ +package com.cradle.iitc_mobile; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.BaseAdapter; +import android.widget.TextView; +import android.widget.Toast; + +public class DeviceAccountLogin implements AccountManagerCallback { + private class AccountAdapter extends BaseAdapter { + @Override + public int getCount() { + return mAccounts.length; + } + + @Override + public Account getItem(int position) { + return mAccounts[position]; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater inflater = mActivity.getLayoutInflater(); + View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false); + + TextView tv = (TextView) v.findViewById(android.R.id.text1); + tv.setText(mAccounts[position].name); + + return tv; + } + } + + private Account mAccount; + private AccountAdapter mAccountAdapter; + private AccountManager mAccountManager; + private Account[] mAccounts; + private IITC_Mobile mActivity; + private String mAuthToken; + private WebView mWebView; + + private DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which >= 0 && which < mAccounts.length) { + mAccount = mAccounts[which]; + startAuthentication(); + } + dialog.cancel(); + } + }; + + public DeviceAccountLogin(IITC_Mobile activity, WebView webView, WebViewClient webViewClient) { + mActivity = activity; + mWebView = webView; + mAccountManager = AccountManager.get(activity); + mAccountAdapter = new AccountAdapter(); + } + + private void displayAccountList() { + AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); + builder + .setTitle(R.string.choose_account_to_login) + .setSingleChoiceItems(mAccountAdapter, 0, onClickListener) + .setNegativeButton(android.R.string.cancel, onClickListener); + + AlertDialog dialog = builder.create(); + dialog.show(); + } + + private void onLoginFailed() { + Toast.makeText(mActivity, "Login failed.", Toast.LENGTH_SHORT).show(); + // TODO l10n + } + + private void startAuthentication() { + mAccountManager.getAuthToken(mAccount, mAuthToken, null, mActivity, this, null); + } + + public void onActivityResult(int resultCode, Intent data) { + if (resultCode == Activity.RESULT_OK) + startAuthentication(); + else + onLoginFailed(); + } + + @Override + public void run(AccountManagerFuture value) { + try { + Intent launch = (Intent) value.getResult().get(AccountManager.KEY_INTENT); + if (launch != null) { + mActivity.startLoginActivity(launch); + return; + } + + String result = value.getResult().getString(AccountManager.KEY_AUTHTOKEN); + if (result != null) { + mWebView.loadUrl(result); + } else { + onLoginFailed(); + } + } catch (Exception e) { + onLoginFailed(); + } + } + + public void startLogin(String realm, String accountName, String args) { + mAccounts = mAccountManager.getAccountsByType(realm); + mAccountAdapter.notifyDataSetChanged(); + mAuthToken = "weblogin:" + args; + + if (mAccounts.length == 0) { + return; + } + + for (Account account : mAccounts) { + if (account.name.equals(accountName)) { + mAccountManager.getAuthToken(account, mAuthToken, null, mActivity, this, null); + return; + } + } + + displayAccountList(); + } +} diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java index a30c8fd9..dff1098f 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java @@ -24,10 +24,13 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; +import android.webkit.WebView; import android.widget.Toast; public class IITC_Mobile extends Activity { + private static final int REQUEST_LOGIN = 1; + private IITC_WebView iitc_view; private boolean back_button_pressed = false; private OnSharedPreferenceChangeListener listener; @@ -38,6 +41,7 @@ public class IITC_Mobile extends Activity { private boolean fullscreen_mode = false; private boolean fullscreen_actionbar = false; private ActionBar actionBar; + private DeviceAccountLogin mLogin; @Override protected void onCreate(Bundle savedInstanceState) { @@ -68,7 +72,7 @@ public class IITC_Mobile extends Activity { user_loc = sharedPreferences.getBoolean("pref_user_loc", false); if (key.equals("pref_fullscreen_actionbar")) { - fullscreen_actionbar =sharedPreferences.getBoolean("pref_fullscreen_actionbar", + fullscreen_actionbar = sharedPreferences.getBoolean("pref_fullscreen_actionbar", false); if (fullscreen_mode) IITC_Mobile.this.getActionBar().hide(); @@ -360,4 +364,26 @@ public class IITC_Mobile extends Activity { public IITC_WebView getWebView() { return this.iitc_view; } + + public void startLoginActivity(Intent launch) { + startActivityForResult(launch, REQUEST_LOGIN); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case REQUEST_LOGIN : + mLogin.onActivityResult(resultCode, data); + break; + + default : + super.onActivityResult(requestCode, resultCode, data); + } + } + + public void onReceivedLoginRequest(IITC_WebViewClient client, WebView view, + String realm, String account, String args) { + mLogin = new DeviceAccountLogin(this, view, client); + mLogin.startLogin(realm, account, args); + } } diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java index f606d5ac..647e8189 100644 --- a/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java +++ b/mobile/src/com/cradle/iitc_mobile/IITC_WebViewClient.java @@ -133,6 +133,11 @@ public class IITC_WebViewClient extends WebViewClient { handler.proceed(); }; + @Override + public void onReceivedLoginRequest(WebView view, String realm, String account, String args) { + ((IITC_Mobile) context).onReceivedLoginRequest(this, view, realm, account, args); + } + // plugins should be loaded after the main script is injected @Override public void onPageFinished(WebView view, String url) {