LoginViewModel.java 13.9 KB
package com.cnlive.goldenline.viewmodel;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.databinding.BaseObservable;
import android.os.CountDownTimer;
import android.text.Editable;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;

import com.cnlive.goldenline.R;
import com.cnlive.goldenline.api.UserAPI;
import com.cnlive.goldenline.application.GoldenLineApplication;
import com.cnlive.goldenline.databinding.ActivityRegisterBinding;
import com.cnlive.goldenline.model.User;
import com.cnlive.goldenline.model.mine.SyncUserRequestBean;
import com.cnlive.goldenline.ui.activity.UpdatePhoneActivity;
import com.cnlive.goldenline.ui.base.GoldenlineCall;
import com.cnlive.goldenline.util.ChannelUtil;
import com.cnlive.goldenline.util.RestAdapterUtils;
import com.cnlive.goldenline.util.SPUtils;
import com.cnlive.goldenline.util.ShareSdkUtil;
import com.cnlive.goldenline.util.StringUtils;
import com.cnlive.goldenline.util.SystemTools;
import com.cnlive.goldenline.util.ToastUtil;
import com.cnlive.goldenline.util.UserService;
import com.cnlive.libs.user.IUserService;
import com.cnlive.libs.user.UserUtil;
import com.cnlive.libs.user.model.DataEntity;
import com.cnlive.libs.user.model.UserData;

import java.util.HashMap;
import java.util.Locale;

import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.wechat.friends.Wechat;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;

/**
 * Created by ZJL on 2017/5/10.
 */

public class LoginViewModel extends BaseObservable{
    /**
     * 当前时间
     */
    private int count = COUNTDOWN_TIME;
    /**
     * 验证码计算时间
     */
    private final static int COUNTDOWN_TIME = 60;

    /**
     * 倒数计数器
     */
    private CountDownTimer countDownTimer;

    private String mPhone;
    private ActivityRegisterBinding activityRegisterBinding;

    private String phone = "";
    private ProgressDialog progressDialog;
    private UserService mUserService;
    private Context context;

    public LoginViewModel(ActivityRegisterBinding activityRegisterBinding, Context context){
        this.activityRegisterBinding=activityRegisterBinding;
        this.context=context;
        mUserService = new UserService(context);
    }
    public String getMPhone() {
        return mPhone;
    }

    public void setMPhone(String mPhone) {
        this.mPhone = mPhone;
    }

    /**
     * 处理验证码
     *
     * @param code
     */
    public void formatCode(Editable code) {
        if (phone.length() == 11 && StringUtils.checkPhoneNumber(phone.toString()) && code.length() == 6) {
            activityRegisterBinding.buttonLogin.setBackgroundResource(R.drawable.login_canuse);
            activityRegisterBinding.buttonLogin.setEnabled(true);
        } else {
            activityRegisterBinding.buttonLogin.setBackgroundResource(R.drawable.login_nouse);
            activityRegisterBinding.buttonLogin.setEnabled(false);
        }
    }
    public void phoneChanged(Editable phone) {
        Log.i("name","titleChanged");
        this.phone = phone.toString();
        if (phone.length() == 11 && StringUtils.checkPhoneNumber(phone.toString())) {
            activityRegisterBinding.buttonSendcode.setBackgroundResource(R.mipmap.verificationcode_canuse);
            activityRegisterBinding.buttonSendcode.setTextColor(GoldenLineApplication.getInstance().getResources().getColor(R.color.color_ff6633));
            activityRegisterBinding.buttonSendcode.setEnabled(true);
        } else {
            activityRegisterBinding.buttonSendcode.setBackgroundResource(R.mipmap.verificationcode_nouse);
            activityRegisterBinding.buttonSendcode.setTextColor(GoldenLineApplication.getInstance().getResources().getColor(R.color.color_959595));
            activityRegisterBinding.buttonSendcode.setEnabled(false);
        }
    }
    public void sendSMS(View view){
        UserUtil.sendMessage(IUserService.QUICK_LOGIN, activityRegisterBinding.etPhone.getText().toString(), new MobileCall());

    }
    public void toLogin(View view){
        showLogin();
        UserUtil.quickLogin(String.valueOf(activityRegisterBinding.etPhone.getText()), String.valueOf(activityRegisterBinding.etCode.getText()), ChannelUtil.getChannelFromApk(context), userDataCall);
    }
    public void weixinLogin(View view){
        getOtherInfo("1", Wechat.NAME);
        showLogin();
    }
    public void weiboLogin(View view){
        getOtherInfo("2", SinaWeibo.NAME);
        showLogin();
    }
    public void qqLogin(View view){
        getOtherInfo("3", QQ.NAME);
        showLogin();
    }
    public void closeAct(View view){
        ( (Activity)context).finish();
    }
    /**
     * 发送验证码sdk
     */
    class MobileCall extends GoldenlineCall {
        @Override
        protected void dowork(int what, String extra, Object obj) {
            switch (what) {
                case IUserService.SUCCESS:
                    ToastUtil.showToast("验证码已发送");
                    startTimer();
                    break;
                default:
                    ToastUtil.showToast("验证码发送失败");
                    updateSendButtonText(true);
                    break;
            }

        }

        /**
         * 开始计数器
         */
        private void startTimer() {
            countDownTimer = new CountDownTimer(COUNTDOWN_TIME * 1000, 990) {
                @Override
                public void onTick(long leftTimeInMilliseconds) {
                    long seconds = leftTimeInMilliseconds / 1000;
                    count = (int) (seconds % 60);
                    updateSendButtonText(false);
                }

                @Override
                public void onFinish() {
                    updateSendButtonText(true);
                }

            };
            countDownTimer.start();
        }

        /**
         * 更新按钮的状态
         *
         * @param showNormal
         */
        private void updateSendButtonText(boolean showNormal) {
            if (showNormal) {
                activityRegisterBinding.buttonSendcode.setText(GoldenLineApplication.getInstance().getResources().getString(R.string.logoin_getcode));
                activityRegisterBinding.buttonSendcode.setBackgroundResource(R.mipmap.verificationcode_canuse);
                activityRegisterBinding.buttonSendcode.setTextColor(GoldenLineApplication.getInstance().getResources().getColor(R.color.color_ff6633));
                activityRegisterBinding.buttonSendcode.setEnabled(true);
            } else {
                String s = String.format(Locale.CHINESE, GoldenLineApplication.getInstance().getString(R.string.format_verify_countdown), count);
                activityRegisterBinding.buttonSendcode.setText(s);
                activityRegisterBinding.buttonSendcode.setBackgroundResource(R.mipmap.verificationcode_nouse);
                activityRegisterBinding.buttonSendcode.setTextColor(GoldenLineApplication.getInstance().getResources().getColor(R.color.color_959595));
                activityRegisterBinding.buttonSendcode.setEnabled(false);
            }
        }
    }
    /**
     * 显示等待框
     */
    private void showLogin() {
        progressDialog = ProgressDialog.show(context, "登录中...", "请稍候...", true, false);
        progressDialog.setCancelable(true);// 设置是否可以通过点击Back键取消
        progressDialog.setCanceledOnTouchOutside(false);// 设置在点击Dialog外是否取消Dialog进度条
    }
    private GoldenlineCall userDataCall = new GoldenlineCall() {
        @Override
        protected void dowork(int what, String extra, Object obj) {
            UserData userData = (UserData) obj;
            DataEntity data = userData.getData();
            GoldenLineApplication.mEdit.clear();
            GoldenLineApplication.mEdit.putBoolean("isQuckLogin", true);
            GoldenLineApplication.mEdit.putString("uid", data.getUid());
            GoldenLineApplication.mEdit.putString("hUid", data.gethUid());
            GoldenLineApplication.mEdit.apply();
            if (null != data) {
                //手机号为空必须要进行绑定,这是正在上演的逻辑
                if(TextUtils.isEmpty(data.getMobile())){
                    Intent starter = new Intent(context, UpdatePhoneActivity.class);
                    starter.putExtra("title","绑定手机号");
                    starter.putExtra("uid",data.getUid());
                    starter.putExtra("data",data);
                    ( (Activity)context).startActivityForResult(starter,101);
                }else{
                    doNetWork(data);
                }
            }
        }

        @Override
        public void onState(int what, String extra, Object obj) {
            super.onState(what, extra, obj);
            if (what != IUserService.SUCCESS) {
                progressDialog.dismiss();
            }
        }
    };
    /**
     * 登陆完成后调用此方法同步用户其他信息
     */
    public void doNetWork(final DataEntity data) {
        final UserAPI userApi = RestAdapterUtils.getRestAPI(UserAPI.class);
        SyncUserRequestBean request = new SyncUserRequestBean(context);
        request.setEmail(data.getEmail());
        request.setExtInfo(data.getExtInfo());
        request.setFaceUrl(data.getFaceUrl());
        request.setGender(data.getGender().equals("m") ? 0 : (data.getGender().equals("f") ? 1 : 2));
        request.sethUid(data.gethUid());
        request.setLocation(data.getLocation());
        request.setMobile(data.getMobile());
        request.setNickName(data.getNickName());
        request.setUid(data.getUid());
        userApi.syncUserById(request, new Callback<User>() {
            @Override
            public void success(User user, Response response) {
                progressDialog.dismiss();
                if (null != user && user.getErrorCode().equals("0")) {
                    mUserService.setUserInfo(user, "");
                    SPUtils.put(context, "isSubscribeSuccess", true);
                    //登录成功关闭页面
                    ( (Activity)context).finish();
                }else{
                    ToastUtil.showToast(GoldenLineApplication.getInstance().getString(R.string.login_error));
                }
            }

            @Override
            public void failure(RetrofitError error) {
                ToastUtil.showToast(GoldenLineApplication.getInstance().getString(R.string.login_error));
                progressDialog.dismiss();
            }
        });
    }
    public void getOtherInfo(final String tag, String s) {
        ShareSdkUtil.loginThirdPlatform(context, s, new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {//授权成功

                progressDialog.dismiss();

                if (null != hashMap && hashMap.size() > 0) {
                    if ("1" == tag) {
                        //微信登录
                        String uid = (String) hashMap.get("unionid");
                        String nick = platform.getDb().getUserName();
                        String location = (String) hashMap.get("city");
                        String avatar = (String) hashMap.get("headimgurl");
                        //为了红包提现,把uid传为openid
                        String openid = (String) hashMap.get("openid");
                        String userSex = "n";
                        int sex = (int) hashMap.get("sex");
                        if (sex == 1) {
                            userSex = "m";
                        } else if (sex == 2) {
                            userSex = "f";
                        }
                        UserUtil.thirdPartyLogin(3, uid, nick, userSex, location, avatar,
                                ChannelUtil.getChannelFromApk(context), userDataCall);
                    }else if ("2" == tag) {
                        //微博登录
                        String uid = platform.getDb().getUserId();
                        String nick = (String) hashMap.get("name");
                        String location = (String) hashMap.get("location");
                        String userSex = (String) hashMap.get("gender");
                        String avatar = (String) hashMap.get("profile_image_url");
                        UserUtil.thirdPartyLogin(1, uid, nick, userSex, location, avatar,
                                ChannelUtil.getChannelFromApk(context), userDataCall);
                    } else if("3" == tag){
                        //QQ登录
                        String uid = platform.getDb().getUserId();
                        String nick = (String) hashMap.get("nickname");
                        String location = (String) hashMap.get("city");
                        String avatar = hashMap.get("figureurl_qq_2").toString();
                        String userSex = "n";
                        String sex = (String) hashMap.get("gender");
                        if (sex.equals("男")) {
                            userSex = "m";
                        } else if (sex.equals("女")) {
                            userSex = "f";
                        }
                        UserUtil.thirdPartyLogin(2, uid, nick, userSex, location, avatar,
                                ChannelUtil.getChannelFromApk(context), userDataCall);
                    }
                }
            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {//授权失败
                progressDialog.dismiss();
            }

            @Override
            public void onCancel(Platform platform, int i) {//取消
                SystemTools.show_msg(GoldenLineApplication.getInstance().getBaseContext(), "已取消");
                progressDialog.dismiss();
            }
        });
    }
}