admin
2022-01-13 b9ed091e3b607af409e30aca468958cdb08641ad
电话号码登录
10个文件已修改
3个文件已添加
568 ■■■■■ 已修改文件
app/src/main/AndroidManifest.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/ysvideo/zhibo/app/ui/SplashActivity.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/ysvideo/zhibo/app/ui/main/HomeFragment.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/ysvideo/zhibo/app/util/AppConfigUtil.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/ysvideo/zhibo/app/util/LoginUtil.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/ysvideo/zhibo/app/util/api/HttpApiUtil.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_home.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-common/src/com/ysvideo/zhibo/lib/common/util/common/StringUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-login/src/main/AndroidManifest.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-login/src/main/java/com/ysvideo/zhibo/library_login/ui/PhoneLoginActivity.java 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-login/src/main/res/drawable-xhdpi/icon_login_account_phone.png 补丁 | 查看 | 原始文档 | blame | 历史
library-login/src/main/res/layout/activity_login_phone.xml 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
library-login/src/main/res/values/strings.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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`¬!"£$%^*()~=#{}[];':,./?/*-_+&#060;&#062;&#064;&#038;</string>
    <string name="rule_email">0123456789abcdefghijklmnopqrstuvwxyz@.</string>
    <string name="rule_phone">0123456789</string>
</resources>