app/src/main/AndroidManifest.xml
@@ -19,7 +19,7 @@ <meta-data android:name="UMENG_CHANNEL" android:value="QQ"> android:value="VIVO"> </meta-data> app/src/main/java/com/ysvideo/zhibo/app/ui/SplashActivity.java
@@ -141,6 +141,7 @@ AppConfigUtil.saveUnRegisterLink(getApplicationContext(), data.optString("unRegisterLink")); AppConfigUtil.saveAboutUsLink(getApplicationContext(), data.optString("aboutUsLink")); AppConfigUtil.saveFeedBackLink(getApplicationContext(), data.optString("feedBackLink")); AppConfigUtil.saveOnLining(getApplicationContext(), data.optBoolean("onLining")); AdUtil.saveAdConfig(getApplicationContext(), ad); app/src/main/java/com/ysvideo/zhibo/app/ui/main/HomeFragment.java
@@ -7,10 +7,12 @@ import com.androidquery.AQuery; import com.ysvideo.zhibo.app.R; import com.ysvideo.zhibo.app.entity.ad.AdPositionEnum; import com.ysvideo.zhibo.app.ui.mine.MyCollectionActivity; import com.ysvideo.zhibo.app.ui.video.SearchActivity; import com.ysvideo.zhibo.app.ui.video.WatchHistoryActivity; import com.ysvideo.zhibo.lib.common.RetainViewFragment; import com.ysvideo.zhibo.library_ad.AdUtil; public class HomeFragment extends RetainViewFragment { @@ -45,6 +47,13 @@ startActivity(new Intent(getContext(), SearchActivity.class)); } }); // if (AdUtil.getAdType(getContext(), AdPositionEnum.videoDetailFullVideo.name()) != null) { // mAquery.id(R.id.ll_search).visibility(View.VISIBLE); // } else { // mAquery.id(R.id.ll_search).visibility(View.GONE); // } mDYVideoFragment = new DYVideoFragment(); getChildFragmentManager().beginTransaction().replace(R.id.fl_container, mDYVideoFragment).commitAllowingStateLoss(); } app/src/main/java/com/ysvideo/zhibo/app/util/AppConfigUtil.java
@@ -111,6 +111,30 @@ return getConfig("helpLink", context); } /** * 是否正在上线 * * @param context * @param onLining */ public static void saveOnLining(Context context, boolean onLining) { saveConfig("onLining", onLining + "", context); } /** * 是否正在上线 * * @param context * @return */ public static boolean isOnLining(Context context) { String result = getConfig("onLining", context); if (result == null) { return false; } return Boolean.parseBoolean(result); } private static void saveConfig(String key, String value, Context context) { SharedPreferences.Editor editor = context.getSharedPreferences("config", Context.MODE_PRIVATE).edit(); app/src/main/java/com/ysvideo/zhibo/app/util/LoginUtil.java
@@ -14,6 +14,7 @@ import com.ysvideo.zhibo.library_login.inter.ILoginListener; import com.ysvideo.zhibo.library_login.inter.LoginApiCallBack; import com.ysvideo.zhibo.library_login.ui.EmailLoginActivity; import com.ysvideo.zhibo.library_login.ui.PhoneLoginActivity; import org.apache.http.Header; import org.json.JSONObject; @@ -29,9 +30,84 @@ private static ILoginListener loginListener = new ILoginListener() { @Override public void sendSmsCode(Context context, String phone, LoginApiCallBack callBack) { super.sendSmsCode(context, phone, callBack); HttpApiUtil.sendSMSCode(context, phone, new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { super.onSuccessPerfect(statusCode, headers, jsonObject); if (jsonObject.optBoolean("IsPost")) { callBack.onCallBack(new LoginApiResult(LoginApiResult.CODE_OK, "")); } else { callBack.onCallBack(new LoginApiResult(LoginApiResult.CODE_ERROR, jsonObject.optString("Error"))); } } @Override public void onFailure(Call call, IOException e) { super.onFailure(call, e); callBack.onCallBack(new LoginApiResult(LoginApiResult.CODE_ERROR, "网络请求出错")); } @Override public void onStart() { super.onStart(); callBack.onStart(); } @Override public void onFinish() { super.onFinish(); callBack.onFinish(); } }); } @Override public void emailLogin(Context context, String email, String pwd, LoginApiCallBack callBack) { super.emailLogin(context, email, pwd, callBack); HttpApiUtil.emailLogin(context, email, pwd, new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { super.onSuccessPerfect(statusCode, headers, jsonObject); if (jsonObject.optBoolean("IsPost")) { JSONObject data = jsonObject.optJSONObject("Data"); UserInfo userInfo = new UserInfo(); userInfo.setPortrait(data.optString("Portrait")); userInfo.setId(data.getString("Id")); userInfo.setNickName(data.optString("Nickname")); UserUtil.loginSuccess(context, userInfo); callBack.onCallBack(new LoginApiResult(LoginApiResult.CODE_OK, "")); } else { callBack.onCallBack(new LoginApiResult(LoginApiResult.CODE_ERROR, jsonObject.optString("Error"))); } } @Override public void onFailure(Call call, IOException e) { super.onFailure(call, e); callBack.onCallBack(new LoginApiResult(LoginApiResult.CODE_ERROR, "网络请求出错")); } @Override public void onStart() { super.onStart(); callBack.onStart(); } @Override public void onFinish() { super.onFinish(); callBack.onFinish(); } }); } @Override public void phoneLogin(Context context, String phone, String code, LoginApiCallBack callBack) { super.phoneLogin(context, phone, code, callBack); HttpApiUtil.phoneLogin(context, phone, code, new BasicTextHttpResponseHandler() { @Override public void onSuccessPerfect(int statusCode, Header[] headers, JSONObject jsonObject) throws Exception { super.onSuccessPerfect(statusCode, headers, jsonObject); @@ -199,7 +275,9 @@ * @param context */ public static void goLogin(Context context) { context.startActivity(new Intent(context, EmailLoginActivity.class).addFlags(FLAG_ACTIVITY_NEW_TASK).putExtra("listener", LoginUtil.loginListener)); boolean onLining = AppConfigUtil.isOnLining(context); //是否正在上线 context.startActivity(new Intent(context, onLining ? PhoneLoginActivity.class : EmailLoginActivity.class).addFlags(FLAG_ACTIVITY_NEW_TASK).putExtra("listener", LoginUtil.loginListener)); } } app/src/main/java/com/ysvideo/zhibo/app/util/api/HttpApiUtil.java
@@ -326,6 +326,26 @@ commonPost(context, BASE_URL + "user", params, handler); } /** * 电话号码登录 * * @param context * @param phone * @param code * @param handler */ public static void phoneLogin(Context context, String phone, String code, BasicTextHttpResponseHandler handler) { LinkedHashMap<String, String> params = new LinkedHashMap<String, String>(); params.put("phone", phone); params.put("code", code); params.put("Method", "phoneLogin"); commonPost(context, BASE_URL + "user", params, handler); } /** * 获取验证码 * @@ -340,6 +360,22 @@ commonPost(context, BASE_URL + "user", params, handler); } /** * 发送短信验证码 * @param context * @param name * @param handler */ public static void sendSMSCode(Context context, String name, BasicTextHttpResponseHandler handler) { LinkedHashMap<String, String> params = new LinkedHashMap<>(); params.put("phone", name); params.put("Method", "sendSMSCode"); commonPost(context, BASE_URL + "user", params, handler); } /** * Email注册 * app/src/main/res/layout/fragment_home.xml
@@ -22,6 +22,7 @@ <LinearLayout android:id="@+id/ll_search" android:visibility="gone" android:layout_width="match_parent" android:layout_height="wrap_content" library-common/src/com/ysvideo/zhibo/lib/common/util/common/StringUtils.java
@@ -135,7 +135,7 @@ // 判断字符串是否为手机号码 public static boolean isMobileNumber(String aTelNumber) { Pattern p = Pattern.compile("(^1((((3[5-9])|(47)|(5[0-2])|(5[7-9])|(82)|(8[7-8]))\\d{8})|((34[0-8])\\d{7}))$)|(^1((3[0-2])|(5[5-6])|(8[0-6]))\\d{8}$)|(^1((33[0-9])|(349)|(53[0-9])|(80[0-9])|(89[0-9]))\\d{7}$)"); Pattern p = Pattern.compile("^((13[0-9])|(14[0-9])|(16[0-9])|(17[0-9])|(15[0-9])|(18[0-9])|(19[0-9]))\\d{8}$"); Matcher m = p.matcher(aTelNumber); return m.matches(); } library-login/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@ <activity android:name=".ui.RegisterActivity"></activity> <activity android:name=".ui.ForgetPwdActivity"></activity> <activity android:name=".ui.EmailLoginActivity"></activity> <activity android:name=".ui.PhoneLoginActivity"></activity> </application> </manifest> library-login/src/main/java/com/ysvideo/zhibo/library_login/ui/PhoneLoginActivity.java
New file @@ -0,0 +1,196 @@ package com.ysvideo.zhibo.library_login.ui; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import com.ysvideo.zhibo.lib.common.activity.BaseActivity; import com.ysvideo.zhibo.lib.common.util.SingleToast; import com.ysvideo.zhibo.lib.common.util.common.StringUtils; import com.ysvideo.zhibo.library_login.R; import com.ysvideo.zhibo.library_login.entity.LoginApiResult; import com.ysvideo.zhibo.library_login.inter.ILoginListener; import com.ysvideo.zhibo.library_login.inter.LoginApiCallBack; import java.util.Timer; import java.util.TimerTask; /** * Created by weikou2015 on 2016/10/27. */ public class PhoneLoginActivity extends BaseActivity implements View.OnClickListener { private LinearLayout ll_login_content; private EditText et_phone; private EditText et_verfication_code; private TextView tv_obtain_verfication_code; private CheckBox cb_user_agreement; private TextView tv_confirm; private ILoginListener loginListener; public void setLoginListener(ILoginListener loginListener) { this.loginListener = loginListener; } @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_login_phone); loginListener = (ILoginListener) (getIntent().getSerializableExtra("listener")); et_phone = findViewById(R.id.et_phone); et_verfication_code = findViewById(R.id.et_verfication_code); tv_obtain_verfication_code = findViewById(R.id.tv_obtain_verfication_code); cb_user_agreement = findViewById(R.id.cb_user_agreement); tv_confirm = findViewById(R.id.tv_confirm); ll_login_content = findViewById(R.id.ll_login_content); int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); ll_login_content.measure(w, h); tv_obtain_verfication_code.setOnClickListener(this); tv_confirm.setOnClickListener(this); findViewById(R.id.tv_back).setOnClickListener(this); findViewById(R.id.tv_user_agreement).setOnClickListener(this); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.tv_back) { finish(); } else if (id == R.id.tv_user_agreement) { loginListener.onProtocol(PhoneLoginActivity.this); } else if (id == R.id.tv_obtain_verfication_code) { String phone = et_phone.getText().toString(); if (StringUtils.isEmpty(phone)) { SingleToast.showToast(PhoneLoginActivity.this, "请先输入手机号"); return; } if (!StringUtils.isMobileNumber(phone)) { SingleToast.showToast(PhoneLoginActivity.this, "输入的手机号有误,请查证!"); return; } tv_obtain_verfication_code.setEnabled(false); getVerficationCode(phone); } else if (id == R.id.tv_confirm) { String phone = et_phone.getText().toString(); String verficationCode = et_verfication_code.getText().toString(); if (StringUtils.isEmpty(phone)) { SingleToast.showToast(PhoneLoginActivity.this, "请先输入手机号"); return; } if (!StringUtils.isMobileNumber(phone)) { SingleToast.showToast(PhoneLoginActivity.this, "请输入正确的手机号"); return; } if (StringUtils.isEmpty(verficationCode)) { SingleToast.showToast(PhoneLoginActivity.this, "验证码不能为空"); return; } if (!cb_user_agreement.isChecked()) { SingleToast.showToast(PhoneLoginActivity.this, "选择同意用户协议后方可登录"); return; } phoneLogin(); } } private void phoneLogin() { loginListener.phoneLogin(PhoneLoginActivity.this, et_phone.getText().toString(), et_verfication_code.getText().toString(), new LoginApiCallBack() { @Override public void onCallBack(LoginApiResult result) { if (result.getCode() == LoginApiResult.CODE_OK) { SingleToast.showToast(PhoneLoginActivity.this, "登录成功!"); finish(); } else { SingleToast.showToast(PhoneLoginActivity.this, result.getMsg()); } } @Override public void onStart() { super.onStart(); showLoading(); } @Override public void onFinish() { super.onFinish(); hideLoading(); } }); } Timer timer; int timecount = 59; private void getVerficationCode(String phone) { timer = new Timer(); timer.schedule(new MyTask(), 1000, 1000); loginListener.sendSmsCode(PhoneLoginActivity.this, phone, new LoginApiCallBack() { @Override public void onCallBack(LoginApiResult result) { tv_obtain_verfication_code.setEnabled(true); if (result == null) return; if (result.getCode() == LoginApiResult.CODE_OK) { SingleToast.showToast(PhoneLoginActivity.this, "短信发送成功,请注意查收"); } else { SingleToast.showToast(PhoneLoginActivity.this, "获取验证码失败,请重新获取!"); handler.sendEmptyMessage(1); } } @Override public void onFinish() { super.onFinish(); tv_obtain_verfication_code.setEnabled(true); } }); } class MyTask extends TimerTask { @Override public void run() { if (timecount > 0) { handler.sendEmptyMessage(0); } else { handler.sendEmptyMessage(1); } } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: tv_obtain_verfication_code.setClickable(false); tv_obtain_verfication_code.setText("重新发送(" + timecount + "s)"); timecount--; break; case 1: timer.cancel(); tv_obtain_verfication_code.setText("获取验证码"); tv_obtain_verfication_code.setClickable(true); timecount = 59; break; } } }; } library-login/src/main/res/drawable-xhdpi/icon_login_account_phone.png
library-login/src/main/res/layout/activity_login_phone.xml
New file @@ -0,0 +1,215 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <View android:id="@+id/v_status_bar" android:layout_width="match_parent" android:layout_height="15dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/fl_nav" android:layout_width="match_parent" android:layout_height="48dp"> <TextView android:id="@+id/tv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:drawableLeft="@drawable/ic_back" android:drawablePadding="3dp" android:gravity="center_vertical" android:padding="19dp" android:text="返回" android:textColor="@color/white" android:textSize="16sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingTop="6dp" android:paddingBottom="6dp" android:text="注册" android:textColor="@color/white" android:textSize="20sp" /> </FrameLayout> <LinearLayout android:id="@+id/ll_login_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginLeft="50dp" android:layout_marginTop="120dp" android:layout_marginRight="50dp" android:layout_weight="1" android:gravity="top" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="center_vertical" android:orientation="horizontal" android:paddingTop="12dp" android:paddingBottom="12dp"> <ImageView android:layout_width="18dp" android:layout_height="wrap_content" android:src="@drawable/icon_login_account_phone"></ImageView> <EditText android:id="@+id/et_phone" style="@style/loginInputStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="18dp" android:digits="@string/rule_phone" android:hint="请输入手机号" android:inputType="textEmailAddress" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@color/cut_line"></View> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="end|bottom" android:orientation="horizontal" android:paddingTop="12dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_vertical"> <ImageView android:layout_width="18dp" android:layout_height="wrap_content" android:src="@drawable/icon_login_code"></ImageView> <EditText android:id="@+id/et_verfication_code" style="@style/loginInputStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginLeft="18dp" android:layout_weight="1" android:digits="@string/rule_password" android:hint="请输入验证码" android:inputType="textPassword" /> </LinearLayout> <TextView android:id="@+id/tv_obtain_verfication_code" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_gravity="right|center_vertical" android:layout_margin="3dp" android:background="@color/small_btn" android:gravity="center" android:paddingLeft="15dp" android:paddingRight="15dp" android:text="获取验证码" android:textColor="@color/theme" android:textSize="13sp"></TextView> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="1px" android:background="@color/cut_line"></View> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="58dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_confirm" android:layout_width="match_parent" android:layout_height="37dp" android:background="@color/theme" android:gravity="center" android:paddingLeft="14dp" android:paddingRight="14dp" android:text="登 录" android:textColor="@color/white" android:textSize="17sp" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginBottom="14dp" android:gravity="center_horizontal" android:orientation="horizontal"> <CheckBox android:id="@+id/cb_user_agreement" android:layout_width="15dp" android:layout_height="15dp" android:layout_gravity="center_vertical" android:background="@drawable/selector_user_agreement_checkbox" android:button="@null" android:gravity="center" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="6.5dp" android:text="注册并同意 " android:textColor="#FF999999" android:textSize="11sp" /> <TextView android:id="@+id/tv_user_agreement" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/user_agreement" android:textColor="@color/theme" android:textSize="11sp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 和 " android:textColor="#FF999999" android:textSize="11sp" /> <TextView android:id="@+id/tv_privacy_policy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/privacy_policy" android:textColor="@color/theme" android:textSize="11sp" /> </LinearLayout> </LinearLayout> </LinearLayout> library-login/src/main/res/values/strings.xml
@@ -4,4 +4,5 @@ <string name="privacy_policy">隐私政策</string> <string name="rule_password">0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`¬!"£$%^*()~=#{}[];':,./?/*-_+<>@&</string> <string name="rule_email">0123456789abcdefghijklmnopqrstuvwxyz@.</string> <string name="rule_phone">0123456789</string> </resources>