package cn.smssdk.gui; import static cn.smssdk.framework.utils.R.dipToPx; import static cn.smssdk.framework.utils.R.getBitmapRes; import static cn.smssdk.framework.utils.R.getColorRes; import static cn.smssdk.framework.utils.R.getIdRes; import static cn.smssdk.framework.utils.R.getLayoutRes; import static cn.smssdk.framework.utils.R.getStringRes; import static cn.smssdk.framework.utils.R.getStyleRes; import java.util.HashMap; import org.json.JSONException; import org.json.JSONObject; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.IntentFilter; import android.text.Editable; import android.text.Html; import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import cn.sharesdk.analysis.MobclickAgent; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; import cn.smssdk.framework.FakeActivity; /** 验证码输入页面*/ public class IdentifyNumPage extends FakeActivity implements OnClickListener, TextWatcher{ private static final int RETRY_INTERVAL = 60; private String phone; private String code; private String formatedPhone; private int time = RETRY_INTERVAL; private EventHandler handler; private Dialog pd; private EditText etIdentifyNum; private TextView tvTitle; private TextView tvPhone; private TextView tvIdentifyNotify; private TextView tvUnreceiveIdentify; private ImageView ivClear; private Button btnSubmit; private BroadcastReceiver smsReceiver; public void setPhone(String phone, String code, String formatedPhone) { this.phone = phone; this.code = code; this.formatedPhone = formatedPhone; } public void onCreate() { int resId = getLayoutRes(activity, "smssdk_input_identify_num_page"); if (resId > 0) { activity.setContentView(resId); resId = getIdRes(activity, "ll_back"); activity.findViewById(resId).setOnClickListener(this); resId = getIdRes(activity, "btn_submit"); btnSubmit = (Button) activity.findViewById(resId); btnSubmit.setOnClickListener(this); btnSubmit.setEnabled(false); resId = getIdRes(activity, "tv_title"); tvTitle = (TextView) activity.findViewById(resId); resId = getStringRes(activity, "smssdk_write_identify_code"); if (resId > 0) { tvTitle.setText(resId); } resId = getIdRes(activity, "et_put_identify"); etIdentifyNum = (EditText) activity.findViewById(resId); etIdentifyNum.addTextChangedListener(this); resId = getIdRes(activity, "tv_identify_notify"); tvIdentifyNotify = (TextView) activity.findViewById(resId); resId = getStringRes(activity, "smssdk_send_mobile_detail"); if (resId > 0) { String text = getContext().getString(resId); tvIdentifyNotify.setText(Html.fromHtml(text)); } resId = getIdRes(activity, "tv_phone"); tvPhone = (TextView) activity.findViewById(resId); tvPhone.setText(formatedPhone); resId = getIdRes(activity, "tv_unreceive_identify"); tvUnreceiveIdentify = (TextView) activity.findViewById(resId); resId = getStringRes(activity, "smssdk_receive_msg"); if (resId > 0) { String unReceive = getContext().getString(resId, time); tvUnreceiveIdentify.setText(Html.fromHtml(unReceive)); } tvUnreceiveIdentify.setOnClickListener(this); tvUnreceiveIdentify.setEnabled(false); resId = getIdRes(activity, "iv_clear"); ivClear = (ImageView)activity.findViewById(resId); ivClear.setOnClickListener(this); handler = new EventHandler(){ public void afterEvent(int event, int result, Object data) { if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { // 提交验证码 afterSubmit(result, data); } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { // 获取验证码成功后的执行动作 afterGet(result, data); } } }; SMSSDK.registerEventHandler(handler); countDown(); } smsReceiver = new SMSReceiver(new SMSSDK.VerifyCodeReadListener() { @Override public void onReadVerifyCode(final String verifyCode) { runOnUIThread(new Runnable() { @Override public void run() { etIdentifyNum.setText(verifyCode); } }); } }); activity.registerReceiver(smsReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); } @Override public void onResume(){ super.onResume(); MobclickAgent.onPageStart("IdentifyNumPage"); } @Override public void onPause() { super.onPause(); MobclickAgent.onPageEnd("IdentifyNumPage"); } public boolean onFinish() { SMSSDK.unregisterEventHandler(handler); activity.unregisterReceiver(smsReceiver); return super.onFinish(); } // 倒数计时 private void countDown() { runOnUIThread(new Runnable() { public void run() { time--; if (time == 0) { int resId = getStringRes(activity, "smssdk_unreceive_identify_code"); if (resId > 0) { String unReceive = getContext().getString(resId, time); tvUnreceiveIdentify.setText(Html.fromHtml(unReceive)); } tvUnreceiveIdentify.setEnabled(true); time = RETRY_INTERVAL; } else { int resId = getStringRes(activity, "smssdk_receive_msg"); if (resId > 0) { String unReceive = getContext().getString(resId, time); tvUnreceiveIdentify.setText(Html.fromHtml(unReceive)); } tvUnreceiveIdentify.setEnabled(false); runOnUIThread(this, 1000); } } }, 1000); } public void onTextChanged(CharSequence s, int start, int before, int count) { // 如果输入框木有,就隐藏delbtn if(s.length() > 0){ btnSubmit.setEnabled(true); ivClear.setVisibility(View.VISIBLE); int resId = getBitmapRes(activity, "smssdk_btn_enable"); if (resId > 0) { btnSubmit.setBackgroundResource(resId); } }else { btnSubmit.setEnabled(false); ivClear.setVisibility(View.GONE); int resId = getBitmapRes(activity, "smssdk_btn_disenable"); if (resId > 0) { btnSubmit.setBackgroundResource(resId); } } } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void afterTextChanged(Editable s) { } public void onClick(View v) { int id = v.getId(); int id_ll_back = getIdRes(activity, "ll_back"); int id_btn_submit = getIdRes(activity, "btn_submit"); int id_tv_unreceive_identify = getIdRes(activity, "tv_unreceive_identify"); int id_iv_clear = getIdRes(activity, "iv_clear"); if (id == id_ll_back) { runOnUIThread(new Runnable() { public void run() { showNotifyDialog(); } }); } else if (id == id_btn_submit) { // 提交验证 String verificationCode = etIdentifyNum.getText().toString().trim(); if(!TextUtils.isEmpty(code)){ if (pd != null && pd.isShowing()) { pd.dismiss(); } pd = CommonDialog.ProgressDialog(activity); if (pd != null) { pd.show(); } SMSSDK.submitVerificationCode(code, phone, verificationCode); }else{ int resId = getStringRes(activity, "smssdk_write_identify_code"); if (resId > 0) { Toast.makeText(getContext(), resId, Toast.LENGTH_SHORT).show(); } } } else if (id == id_tv_unreceive_identify) { // 没有接收到短信 showDialog(); } else if (id == id_iv_clear) { // 清除editText的值 etIdentifyNum.getText().clear(); } } // 弹出重新发送短信对话框 private void showDialog(){ int resId = getStyleRes(activity, "CommonDialog"); if (resId > 0) { final Dialog dialog = new Dialog(getContext(), resId); TextView tv = new TextView(getContext()); resId = getStringRes(activity, "smssdk_resend_identify_code"); if (resId > 0) { tv.setText(resId); } tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); resId = getColorRes(activity, "smssdk_white"); if (resId > 0) { tv.setTextColor(getContext().getResources().getColor(resId)); } int dp_10 = dipToPx(getContext(), 10); tv.setPadding(dp_10, dp_10, dp_10, dp_10); dialog.setContentView(tv); tv.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 重新获取验证码短信 dialog.dismiss(); tvUnreceiveIdentify.setEnabled(false); if (pd != null && pd.isShowing()) { pd.dismiss(); } pd = CommonDialog.ProgressDialog(activity); if (pd != null) { pd.show(); } SMSSDK.getVerificationCode(code, phone.trim()); } }); dialog.setCanceledOnTouchOutside(true); dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { tvUnreceiveIdentify.setEnabled(true); } }); dialog.show(); } } /** * 提交验证码成功后的执行事件 * @param result * @param data */ private void afterSubmit(final int result, final Object data) { runOnUIThread(new Runnable() { public void run() { if (pd != null && pd.isShowing()) { pd.dismiss(); } if (result == SMSSDK.RESULT_COMPLETE) { HashMap<String, Object> res = new HashMap<String, Object>(); res.put("res", true); res.put("page", 2); res.put("phone", data); setResult(res); finish(); } else { ((Throwable) data).printStackTrace(); // 验证码不正确 int resId = getStringRes(activity, "smssdk_virificaition_code_wrong"); if (resId > 0) { Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show(); } } } }); } /** * 获取验证码成功后,的执行动作 * @param result * @param data */ private void afterGet(final int result, final Object data) { runOnUIThread(new Runnable() { public void run() { if (pd != null && pd.isShowing()) { pd.dismiss(); } if (result == SMSSDK.RESULT_COMPLETE) { int resId = getStringRes(activity, "smssdk_virificaition_code_sent"); if (resId > 0) { Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show(); } resId = getStringRes(activity, "smssdk_receive_msg"); if (resId > 0) { String unReceive = getContext().getString(resId, time); tvUnreceiveIdentify.setText(Html.fromHtml(unReceive)); } time = 60; countDown(); } else { ((Throwable) data).printStackTrace(); Throwable throwable = (Throwable) data; // 根据服务器返回的网络错误,给toast提示 try { JSONObject object = new JSONObject(throwable.getMessage()); String des = object.optString("detail"); if (!TextUtils.isEmpty(des)) { Toast.makeText(activity, des, Toast.LENGTH_SHORT).show(); return; } } catch (JSONException e) { e.printStackTrace(); } // 如果木有找到资源,默认提示 int resId = getStringRes(activity, "smssdk_network_error"); if (resId > 0) { Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show(); } } } }); } // 按返回键时,弹出的提示对话框 private void showNotifyDialog(){ int resId = getStyleRes(activity, "CommonDialog"); if (resId > 0) { final Dialog dialog = new Dialog(getContext(), resId); resId = getLayoutRes(activity, "smssdk_back_verify_dialog"); if (resId > 0) { dialog.setContentView(resId); resId = getIdRes(activity, "tv_dialog_hint"); TextView tv = (TextView) dialog.findViewById(resId); resId = getStringRes(activity, "smssdk_close_identify_page_dialog"); if (resId > 0) { tv.setText(resId); } resId = getIdRes(activity, "btn_dialog_ok"); Button waitBtn = (Button) dialog.findViewById(resId); resId = getStringRes(activity, "smssdk_wait"); if (resId > 0) { waitBtn.setText(resId); } waitBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { dialog.dismiss(); } }); resId = getIdRes(activity, "btn_dialog_cancel"); Button backBtn = (Button) dialog.findViewById(resId); resId = getStringRes(activity, "smssdk_back"); if (resId > 0) { backBtn.setText(resId); } backBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { dialog.dismiss(); finish(); } }); dialog.setCanceledOnTouchOutside(true); dialog.show(); } } } @Override public boolean onKeyEvent(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ runOnUIThread(new Runnable() { public void run() { showNotifyDialog(); } }); return true; }else{ return false; } } }