package org.qii.weiciyuan.ui.blackmagic; import org.qii.weiciyuan.R; import org.qii.weiciyuan.bean.AccountBean; import org.qii.weiciyuan.bean.UserBean; import org.qii.weiciyuan.dao.login.BMOAuthDao; 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.utils.Utility; import org.qii.weiciyuan.ui.interfaces.AbstractAppActivity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.Spinner; import android.widget.SpinnerAdapter; import android.widget.Toast; import java.lang.ref.WeakReference; /** * User: qii * Date: 12-11-9 */ public class BlackMagicActivity extends AbstractAppActivity { private EditText username; private EditText password; private Spinner spinner; private String appkey; private String appSecret; private LoginTask loginTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.blackmagicactivity_layout); getActionBar().setDisplayHomeAsUpEnabled(false); getActionBar().setDisplayShowHomeEnabled(false); getActionBar().setTitle(getString(R.string.hack_login)); username = (EditText) findViewById(R.id.username); password = (EditText) findViewById(R.id.password); spinner = (Spinner) findViewById(R.id.spinner); SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.tail, android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(mSpinnerAdapter); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String[] array = getResources().getStringArray(R.array.tail_value); String value = array[position]; appkey = value.substring(0, value.indexOf(",")); appSecret = value.substring(value.indexOf(",") + 1); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } @Override protected void onDestroy() { super.onDestroy(); Utility.cancelTasks(loginTask); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.actionbar_menu_blackmagicactivity, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_login: if (username.getText().toString().length() == 0) { username.setError(getString(R.string.email_cant_be_empty)); return true; } if (password.getText().toString().length() == 0) { password.setError(getString(R.string.password_cant_be_empty)); return true; } if (Utility.isTaskStopped(loginTask)) { loginTask = new LoginTask(this, username.getText().toString(), password.getText().toString(), appkey, appSecret); loginTask.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } return true; default: return super.onOptionsItemSelected(item); } } private static class LoginTask extends MyAsyncTask<Void, Void, String[]> { private WeiboException e; private ProgressFragment progressFragment = ProgressFragment.newInstance(); private WeakReference<BlackMagicActivity> mBlackMagicActivityWeakReference; private String username; private String password; private String appkey; private String appSecret; private LoginTask(BlackMagicActivity activity, String username, String password, String appkey, String appSecret) { mBlackMagicActivityWeakReference = new WeakReference<BlackMagicActivity>(activity); this.username = username; this.password = password; this.appkey = appkey; this.appSecret = appSecret; } @Override protected void onPreExecute() { super.onPreExecute(); progressFragment.setAsyncTask(LoginTask.this); BlackMagicActivity activity = mBlackMagicActivityWeakReference.get(); if (activity != null) { progressFragment.show(activity.getSupportFragmentManager(), ""); } } @Override protected String[] doInBackground(Void... params) { try { String[] result = new BMOAuthDao(username, password, appkey, appSecret).login(); UserBean user = new OAuthDao(result[0]).getOAuthUserInfo(); AccountBean account = new AccountBean(); account.setAccess_token(result[0]); account.setInfo(user); account.setExpires_time( System.currentTimeMillis() + Long.valueOf(result[1]) * 1000); AccountDBTask.addOrUpdateAccount(account, true); AppLogger .e("token expires in " + Utility.calcTokenExpiresInDays(account) + " days"); return result; } catch (WeiboException e) { this.e = e; cancel(true); } return null; } @Override protected void onCancelled(String[] s) { super.onCancelled(s); if (progressFragment != null) { progressFragment.dismissAllowingStateLoss(); } BlackMagicActivity activity = mBlackMagicActivityWeakReference.get(); if (activity == null) { return; } if (e != null) { Toast.makeText(activity, e.getError(), Toast.LENGTH_SHORT).show(); } } @Override protected void onPostExecute(String[] s) { super.onPostExecute(s); if (progressFragment != null) { progressFragment.dismissAllowingStateLoss(); } BlackMagicActivity activity = mBlackMagicActivityWeakReference.get(); if (activity == null) { return; } Bundle values = new Bundle(); values.putString("expires_in", s[1]); Intent intent = new Intent(); intent.putExtras(values); activity.setResult(RESULT_OK, intent); activity.finish(); } } public static class ProgressFragment extends DialogFragment { private MyAsyncTask asyncTask = null; public static ProgressFragment newInstance() { ProgressFragment frag = new ProgressFragment(); frag.setRetainInstance(true); Bundle args = new Bundle(); frag.setArguments(args); return frag; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { ProgressDialog dialog = new ProgressDialog(getActivity()); dialog.setMessage(getString(R.string.logining)); dialog.setIndeterminate(false); dialog.setCancelable(true); return dialog; } @Override public void onCancel(DialogInterface dialog) { if (asyncTask != null) { asyncTask.cancel(true); } super.onCancel(dialog); } void setAsyncTask(MyAsyncTask task) { asyncTask = task; } } }