/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2014年 mob.com. All rights reserved.
*/
package cn.smssdk.gui;
import static com.mob.tools.utils.R.getBitmapRes;
import static com.mob.tools.utils.R.getStringRes;
import static com.mob.tools.utils.R.getStyleRes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.json.JSONObject;
import android.app.Dialog;
import android.content.Context;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.Html;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import cn.smssdk.EventHandler;
import cn.smssdk.OnSendMessageHandler;
import cn.smssdk.SMSSDK;
import cn.smssdk.UserInterruptException;
import cn.smssdk.gui.layout.RegisterPageLayout;
import cn.smssdk.gui.layout.Res;
import cn.smssdk.gui.layout.SendMsgDialogLayout;
import cn.smssdk.utils.SMSLog;
import com.mob.tools.FakeActivity;
/** 短信注册页面*/
public class RegisterPage extends FakeActivity implements OnClickListener,
TextWatcher {
// 默认使用中国区号
private static final String DEFAULT_COUNTRY_ID = "42";
private EventHandler callback;
// 国家
private TextView tvCountry;
// 手机号码
private EditText etPhoneNum;
// 国家编号
private TextView tvCountryNum;
// clear 号码
private ImageView ivClear;
// 下一步按钮
private Button btnNext;
private String currentId;
private String currentCode;
private EventHandler handler;
// 国家号码规则
private HashMap<String, String> countryRules;
private Dialog pd;
private OnSendMessageHandler osmHandler;
public void setRegisterCallback(EventHandler callback) {
this.callback = callback;
}
public void setOnSendMessageHandler(OnSendMessageHandler h) {
osmHandler = h;
}
public void show(Context context) {
super.show(context, null);
}
public void onCreate() {
RegisterPageLayout page = new RegisterPageLayout(activity);
LinearLayout layout = page.getLayout();
if (layout != null) {
activity.setContentView(layout);
currentId = DEFAULT_COUNTRY_ID;
View llBack = activity.findViewById(Res.id.ll_back);
TextView tv = (TextView) activity.findViewById(Res.id.tv_title);
int resId = getStringRes(activity, "smssdk_regist");
if (resId > 0) {
tv.setText(resId);
}
View viewCountry = activity.findViewById(Res.id.rl_country);
btnNext = (Button) activity.findViewById(Res.id.btn_next);
tvCountry = (TextView) activity.findViewById(Res.id.tv_country);
String[] country = getCurrentCountry();
// String[] country = SMSSDK.getCountry(currentId);
if (country != null) {
currentCode = country[1];
tvCountry.setText(country[0]);
}
tvCountryNum = (TextView) activity.findViewById(Res.id.tv_country_num);
tvCountryNum.setText("+" + currentCode);
etPhoneNum = (EditText) activity.findViewById(Res.id.et_write_phone);
etPhoneNum.setText("");
etPhoneNum.addTextChangedListener(this);
etPhoneNum.requestFocus();
if (etPhoneNum.getText().length() > 0) {
btnNext.setEnabled(true);
ivClear = (ImageView) activity.findViewById(Res.id.iv_clear);
ivClear.setVisibility(View.VISIBLE);
resId = getBitmapRes(activity, "smssdk_btn_enable");
if (resId > 0) {
btnNext.setBackgroundResource(resId);
}
}
ivClear = (ImageView) activity.findViewById(Res.id.iv_clear);
llBack.setOnClickListener(this);
btnNext.setOnClickListener(this);
ivClear.setOnClickListener(this);
viewCountry.setOnClickListener(this);
handler = new EventHandler() {
@SuppressWarnings("unchecked")
public void afterEvent(final int event, final int result,
final Object data) {
runOnUIThread(new Runnable() {
public void run() {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
if (result == SMSSDK.RESULT_COMPLETE) {
if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES) {
// 请求支持国家列表
onCountryListGot((ArrayList<HashMap<String, Object>>) data);
} else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
// 请求验证码后,跳转到验证码填写页面
afterVerificationCodeRequested();
}
} else {
if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE
&& data != null
&& (data instanceof UserInterruptException)) {
// 由于此处是开发者自己决定要中断发送的,因此什么都不用做
return;
}
// 根据服务器返回的网络错误,给toast提示
try {
((Throwable) data).printStackTrace();
Throwable throwable = (Throwable) data;
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 (Exception e) {
SMSLog.getInstance().w(e);
}
// 如果木有找到资源,默认提示
int resId = getStringRes(activity,
"smssdk_network_error");
if (resId > 0) {
Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show();
}
}
}
});
}
};
}
}
private String[] getCurrentCountry() {
String mcc = getMCC();
String[] country = null;
if (!TextUtils.isEmpty(mcc)) {
country = SMSSDK.getCountryByMCC(mcc);
}
if (country == null) {
Log.w("SMSSDK", "no country found by MCC: " + mcc);
country = SMSSDK.getCountry(DEFAULT_COUNTRY_ID);
}
return country;
}
private String getMCC() {
TelephonyManager tm = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE);
// 返回当前手机注册的网络运营商所在国家的MCC+MNC. 如果没注册到网络就为空.
String networkOperator = tm.getNetworkOperator();
if (!TextUtils.isEmpty(networkOperator)) {
return networkOperator;
}
// 返回SIM卡运营商所在国家的MCC+MNC. 5位或6位. 如果没有SIM卡返回空
return tm.getSimOperator();
}
public void onResume() {
SMSSDK.registerEventHandler(handler);
}
public void onPause() {
SMSSDK.unregisterEventHandler(handler);
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 0) {
btnNext.setEnabled(true);
ivClear.setVisibility(View.VISIBLE);
int resId = getBitmapRes(activity, "smssdk_btn_enable");
if (resId > 0) {
btnNext.setBackgroundResource(resId);
}
} else {
btnNext.setEnabled(false);
ivClear.setVisibility(View.GONE);
int resId = getBitmapRes(activity, "smssdk_btn_disenable");
if (resId > 0) {
btnNext.setBackgroundResource(resId);
}
}
}
public void afterTextChanged(Editable s) {
}
public void onClick(View v) {
int id = v.getId();
int id_ll_back = Res.id.ll_back;
int id_rl_country = Res.id.rl_country;
int id_btn_next = Res.id.btn_next;
int id_iv_clear = Res.id.iv_clear;
if (id == id_ll_back) {
finish();
} else if (id == id_rl_country) {
// 国家列表
CountryPage countryPage = new CountryPage();
countryPage.setCountryId(currentId);
countryPage.setCountryRuls(countryRules);
countryPage.showForResult(activity, null, this);
} else if (id == id_btn_next) {
// 请求发送短信验证码
if (countryRules == null || countryRules.size() <= 0) {
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
pd = CommonDialog.ProgressDialog(activity);
if (pd != null) {
pd.show();
}
SMSSDK.getSupportedCountries();
} else {
String phone = etPhoneNum.getText().toString().trim().replaceAll("\\s*", "");
String code = tvCountryNum.getText().toString().trim();
checkPhoneNum(phone, code);
}
} else if (id == id_iv_clear) {
// 清除电话号码输入框
etPhoneNum.getText().clear();
}
}
@SuppressWarnings("unchecked")
public void onResult(HashMap<String, Object> data) {
if (data != null) {
int page = (Integer) data.get("page");
if (page == 1) {
// 国家列表返回
currentId = (String) data.get("id");
countryRules = (HashMap<String, String>) data.get("rules");
String[] country = SMSSDK.getCountry(currentId);
if (country != null) {
currentCode = country[1];
tvCountryNum.setText("+" + currentCode);
tvCountry.setText(country[0]);
}
} else if (page == 2) {
// 验证码校验返回
Object res = data.get("res");
HashMap<String, Object> phoneMap = (HashMap<String, Object>) data.get("phone");
if (res != null && phoneMap != null) {
int resId = getStringRes(activity, "smssdk_your_ccount_is_verified");
if (resId > 0) {
Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show();
}
if (callback != null) {
callback.afterEvent(
SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE,
SMSSDK.RESULT_COMPLETE, phoneMap);
}
finish();
}
}
}
}
private void onCountryListGot(ArrayList<HashMap<String, Object>> countries) {
// 解析国家列表
for (HashMap<String, Object> country : countries) {
String code = (String) country.get("zone");
String rule = (String) country.get("rule");
if (TextUtils.isEmpty(code) || TextUtils.isEmpty(rule)) {
continue;
}
if (countryRules == null) {
countryRules = new HashMap<String, String>();
}
countryRules.put(code, rule);
}
// 检查手机号码
String phone = etPhoneNum.getText().toString().trim().replaceAll("\\s*", "");
String code = tvCountryNum.getText().toString().trim();
checkPhoneNum(phone, code);
}
/** 分割电话号码 */
private String splitPhoneNum(String phone) {
StringBuilder builder = new StringBuilder(phone);
builder.reverse();
for (int i = 4, len = builder.length(); i < len; i += 5) {
builder.insert(i, ' ');
}
builder.reverse();
return builder.toString();
}
/** 检查电话号码 */
private void checkPhoneNum(String phone, String code) {
if (code.startsWith("+")) {
code = code.substring(1);
}
if (TextUtils.isEmpty(phone)) {
int resId = getStringRes(activity, "smssdk_write_mobile_phone");
if (resId > 0) {
Toast.makeText(getContext(), resId, Toast.LENGTH_SHORT).show();
}
return;
}
if (countryRules == null || countryRules.size() <= 0) {
if (code == "86") {
showDialog(phone, code);
} else {
int resId = getStringRes(activity, "smssdk_country_not_support_currently");
if (resId > 0) {
Toast.makeText(getContext(), resId, Toast.LENGTH_SHORT).show();
}
}
return;
}
String rule = countryRules.get(code);
Pattern p = Pattern.compile(rule);
Matcher m = p.matcher(phone);
int resId = 0;
if (!m.matches()) {
resId = getStringRes(activity, "smssdk_write_right_mobile_phone");
if (resId > 0) {
Toast.makeText(getContext(), resId, Toast.LENGTH_SHORT).show();
}
return;
}
showDialog(phone, code);
}
/** 是否请求发送验证码,对话框 */
public void showDialog(final String phone, final String code) {
int resId = getStyleRes(activity, "CommonDialog");
if (resId > 0) {
final String phoneNum = "+" + code + " " + splitPhoneNum(phone);
final Dialog dialog = new Dialog(getContext(), resId);
LinearLayout layout = SendMsgDialogLayout.create(getContext());
if (layout != null) {
dialog.setContentView(layout);
((TextView) dialog.findViewById(Res.id.tv_phone)).setText(phoneNum);
TextView tv = (TextView) dialog.findViewById(Res.id.tv_dialog_hint);
resId = getStringRes(activity, "smssdk_make_sure_mobile_detail");
if (resId > 0) {
String text = getContext().getString(resId);
tv.setText(Html.fromHtml(text));
}
((Button) dialog.findViewById(Res.id.btn_dialog_ok)).setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
// 跳转到验证码页面
dialog.dismiss();
if (pd != null && pd.isShowing()) {
pd.dismiss();
}
pd = CommonDialog.ProgressDialog(activity);
if (pd != null) {
pd.show();
}
Log.e("verification phone ==>>", phone);
SMSSDK.getVerificationCode(code, phone.trim(), osmHandler);
}
});
((Button) dialog.findViewById(Res.id.btn_dialog_cancel)).setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
}
}
/** 请求验证码后,跳转到验证码填写页面 */
private void afterVerificationCodeRequested() {
String phone = etPhoneNum.getText().toString().trim().replaceAll("\\s*", "");
String code = tvCountryNum.getText().toString().trim();
if (code.startsWith("+")) {
code = code.substring(1);
}
String formatedPhone = "+" + code + " " + splitPhoneNum(phone);
// 验证码页面
IdentifyNumPage page = new IdentifyNumPage();
page.setPhone(phone, code, formatedPhone);
page.showForResult(activity, null, this);
}
}