package com.metis.base.activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.res.AssetManager; import android.support.v7.app.AlertDialog; import android.os.Bundle; import android.telephony.SmsMessage; import android.text.TextUtils; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.metis.base.ActivityDispatcher; import com.metis.base.R; import com.metis.base.manager.AccountManager; import com.metis.base.manager.RequestCallback; import com.metis.base.module.User; import com.metis.base.utils.Log; import com.metis.base.utils.SystemUtils; import com.metis.base.utils.TimeUtils; import com.metis.msnetworklib.contract.ReturnInfo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Serializable; import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; public class RegisterActivity extends TitleBarActivity implements View.OnClickListener{ private static final String TAG = RegisterActivity.class.getSimpleName(); public static final int MODE_REGISTER = 0, MODE_RESET_PWD = 1; public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"; private TextView mRegisterBtn; private TextView mGetCodeBtn; private EditText mPhoneEt; private EditText mCodeEt; private EditText mPwdEt; private EditText mPwdConfirmEt; private RelativeLayout mAgreeContainer; private CheckBox mAgreeCb; private TextView mAgreeTitleTv; private String mAgreementStr = null; private long mStartTime = 0; private DecimalFormat mFormat = new DecimalFormat("00"); private Runnable mTimerRunnable = new Runnable() { @Override public void run() { long now = System.currentTimeMillis(); long delay = now - mStartTime; long seconds = (TimeUtils.MINUTE_LONG - delay) / 1000; mGetCodeBtn.setText(mFormat.format(seconds)); if (delay < TimeUtils.MINUTE_LONG) { mGetCodeBtn.postDelayed(this, 1000); } else { mGetCodeBtn.setText(R.string.text_get_register_code); mGetCodeBtn.setEnabled(true); } } }; private boolean mSmsReceiverRegistered = false; private BroadcastReceiver mSmsReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsMessage msg = null; if (null != bundle) { Object[] smsObj = (Object[]) bundle.get("pdus"); for (Object object : smsObj) { msg = SmsMessage.createFromPdu((byte[]) object); if (msg == null) { continue; } String content = msg.getMessageBody(); Pattern pattern = Pattern.compile("\\d{4}"); Matcher matcher = pattern.matcher(content); if (matcher.find()) { mCodeEt.setText(matcher.group()); mGetCodeBtn.removeCallbacks(mTimerRunnable); mGetCodeBtn.setEnabled(true); mGetCodeBtn.setText(R.string.text_get_register_code); } /*if (mCode != null && content != null) { int index = content.indexOf(mCode); if (index >= 0) { unregisterSmsReceiver(); mGetCodeBtn.removeCallbacks(mTimerRunnable); mGetCodeBtn.setEnabled(true); mGetCodeBtn.setText(R.string.text_get_register_code); mCodeEt.setText(mCode); return; } }*/ } } } }; private int mMode = MODE_REGISTER; private String mPhoneNum = null, mPwd = null; private boolean isAlreadyIn = false; private EventHandler mHandler = new EventHandler() { @Override public void afterEvent(final int event, final int result, final Object data) { runOnUiThread(new Runnable() { @Override public void run() { Log.v(TAG, "afterEvent " + " event=" + event + " result=" + result + " data=" + data); if (result == SMSSDK.RESULT_COMPLETE) { //回调完成 if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码成功 if (isResetMode()) { AccountManager.getInstance(RegisterActivity.this).resetPwd(mPhoneNum, "12345", mPwd, new RequestCallback() { @Override public void callback(ReturnInfo returnInfo, String callbackId) { if (returnInfo.isSuccess()) { Toast.makeText(RegisterActivity.this, R.string.toast_reset_pwd_success, Toast.LENGTH_SHORT).show(); com.metis.base.ActivityDispatcher.loginActivity(RegisterActivity.this); finish(); } else { Toast.makeText(RegisterActivity.this, getString(R.string.toast_reset_pwd_failed, returnInfo.getMessage()), Toast.LENGTH_SHORT).show(); } } }); //TODO } else { AccountManager.getInstance(RegisterActivity.this).register(mPhoneNum, "12345", mPwd, 0, new RequestCallback<User>() { @Override public void callback(ReturnInfo<User> returnInfo, String callbackId) { if (returnInfo.isSuccess()) { Toast.makeText(RegisterActivity.this, R.string.toast_register_success, Toast.LENGTH_SHORT).show(); User me = returnInfo.getData(); if (me.userRole == 0) { ActivityDispatcher.userRoleActivity(RegisterActivity.this, me, isAlreadyIn); } else { if (isAlreadyIn) { Intent data = new Intent(); setResult(RESULT_OK, data); } else { ActivityDispatcher.mainActivity(RegisterActivity.this); } } finish(); //TODO } else { Toast.makeText(RegisterActivity.this, getString(R.string.toast_register_failed, returnInfo.getMessage()), Toast.LENGTH_SHORT).show(); } } }); //TODO } } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码成功 unregisterSmsReceiver(); Toast.makeText(RegisterActivity.this, R.string.toast_register_code_requested, Toast.LENGTH_SHORT).show(); mStartTime = System.currentTimeMillis(); mGetCodeBtn.post(mTimerRunnable); registerSmsReceiver(); } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { //返回支持发送验证码的国家列表 } } else { ((Throwable) data).printStackTrace(); try { SmsException exception = new Gson().fromJson(((Throwable) data).getMessage(), new TypeToken<SmsException>(){}.getType()); switch (exception.status) { case SmsException.ERROR_CODE_SUBMIT_TOO_SOON_467: Toast.makeText(RegisterActivity.this, R.string.toast_verify_too_soon, Toast.LENGTH_SHORT).show(); break; case SmsException.ERROR_CODE_VERIFY_CODE_NOT_MATCH_468: Toast.makeText(RegisterActivity.this, R.string.toast_verify_not_match, Toast.LENGTH_SHORT).show(); break; case SmsException.ERROR_CODE_PHONE_ILLEGAL_FORMAT_457: Toast.makeText(RegisterActivity.this, R.string.toast_verify_phone_illegal_format, Toast.LENGTH_SHORT).show(); break; } } catch (Exception e) { e.printStackTrace(); } if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码失败 } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码失败 mGetCodeBtn.setEnabled(true); } else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) { //返回支持发送验证码的国家列表 } } } }); } }; @Override protected void onCreate(Bundle savedInstanceState) { mMode = getIntent().getIntExtra(ActivityDispatcher.KEY_MODE, MODE_REGISTER); isAlreadyIn = getIntent().getBooleanExtra(ActivityDispatcher.KEY_STATUS, false); super.onCreate(savedInstanceState); setContentView(R.layout.activity_register); mRegisterBtn = (TextView)findViewById(R.id.register_btn); mGetCodeBtn = (TextView)findViewById(R.id.register_get_code); mPhoneEt = (EditText)findViewById(R.id.register_phone); mCodeEt = (EditText)findViewById(R.id.register_code); mPwdEt = (EditText)findViewById(R.id.register_pwd); mPwdConfirmEt = (EditText)findViewById(R.id.register_pwd_confirm); mAgreeContainer = (RelativeLayout)findViewById(R.id.register_agreement_container); mAgreeCb = (CheckBox)findViewById(R.id.register_agreement); mAgreeTitleTv = (TextView)findViewById(R.id.register_agreement_title); if (isResetMode()) { mRegisterBtn.setText(R.string.title_activity_reset_pwd); } mAgreeContainer.setVisibility(isResetMode() ? View.GONE : View.VISIBLE); mAgreeTitleTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mAgreementStr == null) { AssetManager assetManager = getAssets(); try { InputStream is = assetManager.open("agreement"); InputStreamReader reader = new InputStreamReader(is); BufferedReader bufferedReader = new BufferedReader(reader); String line = null; StringBuilder builder = new StringBuilder(); while ((line = bufferedReader.readLine()) != null) { builder.append(line + "\n"); } mAgreementStr = builder.toString(); } catch (IOException e) { e.printStackTrace(); } } final AlertDialog alertDialog = new AlertDialog.Builder(RegisterActivity.this) .setMessage(mAgreementStr) .setPositiveButton(R.string.btn_agree, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .create(); alertDialog.show(); } }); mRegisterBtn.setOnClickListener(this); mGetCodeBtn.setOnClickListener(this); AccountManager.getInstance(this).registerEventHandler(mHandler); } private boolean isResetMode () { return mMode == MODE_RESET_PWD; } @Override public CharSequence getTitleCenter() { if (isResetMode()) { return getString(R.string.title_activity_reset_pwd); } return null; } @Override protected void onDestroy() { super.onDestroy(); unregisterSmsReceiver(); AccountManager.getInstance(this).unregisterEventHandler(mHandler); } private void registerSmsReceiver () { if (mSmsReceiverRegistered) { return; } IntentFilter filter = new IntentFilter(SMS_RECEIVED_ACTION); registerReceiver(mSmsReceiver, filter); mSmsReceiverRegistered = true; } private void unregisterSmsReceiver () { if (!mSmsReceiverRegistered) { return; } unregisterReceiver(mSmsReceiver); mSmsReceiverRegistered = false; } @Override public void onClick (View v) { final String phone = mPhoneEt.getText().toString(); if (TextUtils.isEmpty(phone)) { Toast.makeText(this, R.string.toast_login_empty_account, Toast.LENGTH_SHORT).show(); mPhoneEt.requestFocus(); SystemUtils.showIME(this, mPhoneEt); return; } final int id = v.getId(); if (id == mRegisterBtn.getId()) { final String code = mCodeEt.getText().toString(); if (TextUtils.isEmpty(code)) { Toast.makeText(this, R.string.toast_register_empty_code, Toast.LENGTH_SHORT).show(); mCodeEt.requestFocus(); SystemUtils.showIME(this, mCodeEt); return; } final String pwd = mPwdEt.getText().toString(); if (TextUtils.isEmpty(pwd)) { Toast.makeText(this, R.string.toast_login_empty_pwd, Toast.LENGTH_SHORT).show(); mPwdEt.requestFocus(); SystemUtils.showIME(this, mPwdEt); return; } final String pwdConfirm = mPwdConfirmEt.getText().toString(); if (TextUtils.isEmpty(pwdConfirm)) { Toast.makeText(this, R.string.toast_register_empty_pwd_confirm, Toast.LENGTH_SHORT).show(); mPwdConfirmEt.requestFocus(); SystemUtils.showIME(this, mPwdConfirmEt); return; } if (!pwd.equals(pwdConfirm)) { Toast.makeText(this, R.string.toast_register_empty_pwd_cannot_confirm, Toast.LENGTH_SHORT).show(); return; } if (pwd.length()<= 6) { Toast.makeText(this, R.string.toast_register_short_pwd, Toast.LENGTH_SHORT).show(); return; } if (!mAgreeCb.isChecked()) { Toast.makeText(this, R.string.toast_register_agreement_not_checked, Toast.LENGTH_SHORT).show(); return; } mPhoneNum = phone; mPwd = pwd; AccountManager.getInstance(this).submitVerificationCode(phone, code); } else if (id == mGetCodeBtn.getId()) { mGetCodeBtn.setEnabled(false); AccountManager.getInstance(this).askForSms(phone); } } @Override public boolean showAsUpEnable() { return true; } private class SmsException implements Serializable { public static final int ERROR_CODE_APP_KEY_EMPTY_405 = 405, ERROR_CODE_APP_KEY_ILLEGAL_406 = 406, ERROR_CODE_COUNTRY_CODE_OR_PHONE_EMPTY_456 = 456, ERROR_CODE_PHONE_ILLEGAL_FORMAT_457 = 457, ERROR_CODE_VERIFY_CODE_EMPTY_466 = 466, ERROR_CODE_SUBMIT_TOO_SOON_467 = 467, ERROR_CODE_VERIFY_CODE_NOT_MATCH_468 = 468, ERROR_CODE_NO_VERIFY_SERVICE_474 = 474; public String detail; public int status; public String description; } }