package org.qii.weiciyuan.ui.login; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.AccountBean; import org.qii.weiciyuan.bean.UserBean; import org.qii.weiciyuan.dao.login.OAuthDao; import org.qii.weiciyuan.support.database.AccountDBTask; import org.qii.weiciyuan.support.debug.AppLogger; import org.qii.weiciyuan.support.error.WeiboException; import org.qii.weiciyuan.support.lib.MyAsyncTask; import org.qii.weiciyuan.support.lib.sinasso.SsoHandler; import org.qii.weiciyuan.support.utils.Utility; import org.qii.weiciyuan.ui.interfaces.AbstractAppActivity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import java.lang.ref.WeakReference; /** * User: qii * Date: 13-6-18 */ public class SSOActivity extends AbstractAppActivity { private SSOTask task; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().setTitle(R.string.official_app_login); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setDisplayShowHomeEnabled(false); SsoHandler ssoHandler = new SsoHandler(SSOActivity.this); ssoHandler.authorize(); } @Override protected void onPause() { super.onPause(); Utility.cancelTasks(task); } private static class SSOTask extends MyAsyncTask<String, UserBean, OAuthActivity.DBResult> { private WeakReference<SSOActivity> sSOActivityWeakReference; private WeiboException e; private OAuthActivity.ProgressFragment progressFragment = OAuthActivity.ProgressFragment .newInstance(); private String token; private String expiresIn; public SSOTask(SSOActivity ssoActivity, String token, String expiresIn) { this.sSOActivityWeakReference = new WeakReference<SSOActivity>(ssoActivity); this.token = token; this.expiresIn = expiresIn; } @Override protected void onPreExecute() { progressFragment.setAsyncTask(this); SSOActivity activity = sSOActivityWeakReference.get(); if (activity != null) { progressFragment.show(activity.getSupportFragmentManager(), ""); } } @Override protected OAuthActivity.DBResult doInBackground(String... params) { try { UserBean user = new OAuthDao(token).getOAuthUserInfo(); AccountBean account = new AccountBean(); account.setAccess_token(token); account.setExpires_time( System.currentTimeMillis() + Long.valueOf(expiresIn) * 1000); account.setInfo(user); AppLogger .e("token expires in " + Utility.calcTokenExpiresInDays(account) + " days"); return AccountDBTask.addOrUpdateAccount(account, false); } catch (WeiboException e) { AppLogger.e(e.getError()); this.e = e; cancel(true); return null; } } @Override protected void onCancelled(OAuthActivity.DBResult dbResult) { super.onCancelled(dbResult); if (progressFragment != null) { progressFragment.dismissAllowingStateLoss(); } SSOActivity activity = sSOActivityWeakReference.get(); if (activity == null) { return; } if (e != null) { Toast.makeText(activity, e.getError(), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(activity, R.string.you_cancel_login, Toast.LENGTH_SHORT).show(); } activity.finish(); } @Override protected void onPostExecute(OAuthActivity.DBResult dbResult) { if (progressFragment.isVisible()) { progressFragment.dismissAllowingStateLoss(); } SSOActivity activity = sSOActivityWeakReference.get(); if (activity == null) { return; } switch (dbResult) { case add_successfuly: Bundle values = new Bundle(); values.putString("expires_in", expiresIn); Intent intent = new Intent(); intent.putExtras(values); activity.setResult(RESULT_OK, intent); activity.finish(); Toast.makeText(activity, activity.getString(R.string.login_success), Toast.LENGTH_SHORT).show(); break; case update_successfully: Toast.makeText(activity, activity.getString(R.string.update_account_success), Toast.LENGTH_SHORT).show(); break; } activity.finish(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_CANCELED || data == null) { Toast.makeText(this, R.string.you_cancel_login, Toast.LENGTH_SHORT).show(); finish(); return; } // Check OAuth 2.0/2.10 error code. String error = data.getStringExtra("error"); if (error == null) { error = data.getStringExtra("error_type"); } // error occurred. if (error != null) { if (error.equals("access_denied") || error.equals("OAuthAccessDeniedException")) { Log.d("Weibo-authorize", "Login canceled by user."); Toast.makeText(this, R.string.you_cancel_login, Toast.LENGTH_SHORT).show(); finish(); } else { String description = data .getStringExtra("error_description"); if (description != null) { error = error + ":" + description; } Log.d("Weibo-authorize", "Login failed: " + error); Toast.makeText(this, getString(R.string.login_failed) + error, Toast.LENGTH_SHORT) .show(); finish(); } return; } final String KEY_TOKEN = "access_token"; final String KEY_EXPIRES = "expires_in"; final String KEY_REFRESHTOKEN = "refresh_token"; String token = data.getStringExtra(KEY_TOKEN); String expires = data .getStringExtra(KEY_EXPIRES); String refreshToken = data.getStringExtra(KEY_REFRESHTOKEN); if (Utility.isTaskStopped(task)) { task = new SSOTask(SSOActivity.this, token, expires); task.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } } }