UserUtilAction.java 13.4 KB
package com.cnlive.strike.user;

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;

import com.cnlive.libs.base.application.AppConfig;
import com.cnlive.libs.base.logic.Logic;
import com.cnlive.libs.base.logic.callback.DataCallback;
import com.cnlive.libs.data.network.Subscriber;
import com.cnlive.strike.data.network.api.ApiRequest;
import com.cnlive.strike.data.network.api.ApiServiceOpen;
import com.cnlive.strike.data.network.api.ApiSubscriber;
import com.cnlive.strike.data.network.model.BaseInfo;
import com.cnlive.strike.data.network.model.FaceData;
import com.cnlive.strike.data.network.model.TokenData;
import com.cnlive.strike.data.network.model.UserData;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import top.zibin.luban.Luban;

import static com.cnlive.libs.base.logic.Config.SUCCESS;


/**
 * Created by Lynn on 2018/10/15.
 */

public class UserUtilAction {
    public static int TOKEN_ERROR_CODE = -900001;
    public static String TOKEN_ERROR_MSG = "用户token为空";

    /**
     * 快捷登录前发送手机验证码
     *
     * @param context
     * @param mobile  手机号
     * @return
     */
    public static Logic.Action<Object, BaseInfo> sendMsgBefQuickLoginAction(final Context context, final String mobile, String countryCode) {
        return (data, callback) -> {
            Map<String, String> requestMap = new HashMap<>();
            requestMap.put("appId", AppConfig.getAppId());
            requestMap.put("mobile", mobile);
            requestMap.put("countryCode", countryCode);
            requestMap.put("clientPlat", "a");
            return ApiRequest.service(ApiServiceOpen.class, service -> service.sendVerifyCodeBefQuickLogin(requestMap)).subscribe(context, callback);
        };

    }

    /**
     * 快捷登录
     *
     * @param context
     * @param userPhone 手机号
     * @param userCode  验证码
     * @return
     */
    public static Logic.Action<Object, BaseInfo<UserData>> quickLoginAction(Context context, String userPhone, String userCode, String countryCode) {
        return (data, callback) -> {
            Map<String, String> requestMap = new HashMap<>();
            requestMap.put("appId", AppConfig.getAppId());
            requestMap.put("userName", userPhone);
            requestMap.put("verificationCode", userCode);
            requestMap.put("uuid", AppConfig.getAppUUID());
            requestMap.put("frmId", AppConfig.getAppChannel());
            requestMap.put("countryCode", countryCode);
            requestMap.put("clientPlat", "a");
            return ApiRequest.service(ApiServiceOpen.class, service -> service.quickLogin(requestMap)).subscribe(context, callback);
        };
    }

    /**
     * 登录
     *
     * @param context
     * @param userName 用户名
     * @param pwd      密码
     * @return
     */
    public static Logic.Action<Object, BaseInfo<UserData>> loginAction(Context context, String userName, String pwd) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("userName", userName);
            map.put("pwd", pwd);
            map.put("uuid", AppConfig.getAppUUID());
            map.put("frmId", "");
            map.put("clientPlat", "a");
            return ApiRequest.service(ApiServiceOpen.class, service -> service.login(map)).subscribe(context, callback);
        };
    }

    /**
     * 查询用户信息
     *
     * @param context
     * @param userId  用户ID
     * @param srcUid  被查询用户ID
     * @param token   查询者平台TOKEN
     * @return
     */
    public static Logic.Action<Object, BaseInfo<UserData>> queryUserInfo(Context context, String userId, String srcUid, String token) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("uid", userId);
            map.put("srcUid", srcUid);
            map.put("clientPlat", "a");
            map.put("token", token);
            if (TextUtils.isEmpty(token)) {
                callback.callback(TOKEN_ERROR_CODE, TOKEN_ERROR_MSG, null);
            }
            return ApiRequest.service(ApiServiceOpen.class, service -> service.queryUserInfo(map)).subscribe(context, callback);
        };
    }

    /**
     * 修改用户附加信息
     *
     * @param context
     * @param userId  用户id
     * @param extInfo 扩展信息
     * @param token   平台token
     * @return
     */
    public static Logic.Action<Object, BaseInfo> updateUserExtInfo(Context context, String userId, String extInfo, String token) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("uid", userId);
            map.put("extInfo", extInfo);
            map.put("token", token);
            map.put("clientPlat", "a");
            if (TextUtils.isEmpty(token)) {
                callback.callback(TOKEN_ERROR_CODE, TOKEN_ERROR_MSG, null);
            }
            return ApiRequest.service(ApiServiceOpen.class, service -> service.updateUserExtInfo(map)).subscribe(context, callback);
        };
    }

    /**
     * 修改用户单项信息
     *
     * @param context
     * @param uid     用户Id
     * @param type    nickName-昵称,gender-性别,email-邮箱, location-联系方式
     * @param value   对应的信息,性别,m:男、f:女、n:未知
     * @param token   平台TOKEN
     * @return
     */
    public static Logic.Action<Object, BaseInfo> modifyUserInfo(Context context, String uid, String type, String value, String token) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("uid", uid);
            map.put("type", type);
            map.put("value", value);
            map.put("clientPlat", "a");
            map.put("token", token);
            if (TextUtils.isEmpty(token)) {
                callback.callback(TOKEN_ERROR_CODE, TOKEN_ERROR_MSG, null);
            }
            return ApiRequest.service(ApiServiceOpen.class, service -> service.modifyUserInfo(map)).subscribe(context, callback);
        };
    }

    /**
     * 注册或修改手机号前发手机验证码
     *
     * @param context
     * @param mobile  手机号
     * @return
     */
    public static Logic.Action<Object, BaseInfo> sendVerifyCodeForUnRegistered(Context context, String mobile, String countryCode) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("mobile", mobile);
            map.put("clientPlat", "a");
            map.put("countryCode", countryCode);
            return ApiRequest.service(ApiServiceOpen.class, service -> service.sendVerifyCodeForUnRegistered(map)).subscribe(context, callback);
        };
    }

    /**
     * 更新手机号
     *
     * @param context
     * @param uid              用户ID
     * @param mobile           手机号
     * @param verificationCode 手机验证码
     * @param token            平台TOKEN
     * @return
     */
    public static Logic.Action<Object, BaseInfo> updateMobile(Context context, String uid, String mobile, String verificationCode, String token, String countryCode) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("uid", uid);
            map.put("mobile", mobile);
            map.put("verificationCode", verificationCode);
            map.put("clientPlat", "a");
            map.put("countryCode", countryCode);
            map.put("token", token);
            if (TextUtils.isEmpty(token)) {
                callback.callback(TOKEN_ERROR_CODE, TOKEN_ERROR_MSG, null);
            }
            return ApiRequest.service(ApiServiceOpen.class, service -> service.updateMobile(map)).subscribe(context, callback);
        };
    }

    /**
     * 注册
     *
     * @param context
     * @param userName         邮箱或手机
     * @param pwd              密码
     * @param verificationCode 手机验证码(手机号注册时必填)
     * @return
     */
    public static Logic.Action<Object, BaseInfo<UserData>> register(Context context, String userName, String pwd, String verificationCode) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("userName", userName);
            map.put("pwd", pwd);
            map.put("verificationCode", verificationCode);
            map.put("invitationCode", "");
            map.put("uuid", AppConfig.getAppUUID());
            map.put("frmId", "");
            map.put("clientPlat", "a");
            return ApiRequest.service(ApiServiceOpen.class, service -> service.register(map)).subscribe(context, callback);
        };
    }


    /**
     * 获取access_token
     *
     * @param context
     * @return
     */
    public static Logic.Action<Object, BaseInfo<TokenData>> accessToken(Context context) {
        return (data, callback) -> {
            Map<String, String> map = new HashMap<>();
            map.put("appId", AppConfig.getAppId());
            map.put("secret", AppConfig.getAppSceret());
            return ApiRequest.service(ApiServiceOpen.class, service -> service.accessToken(map)).subscribe(context, callback);
        };
    }

    /**
     * 上传头像
     *
     * @param context
     * @param uid          用户ID
     * @param face         头像文件
     * @param token        平台TOKEN
     * @param access_token
     * @return
     */
    public static Disposable updateUserFace(Context context, String uid, File face, String token, String access_token, DataCallback<BaseInfo<FaceData>> callback) {
        Map<String, RequestBody> params = new HashMap<>();

        if (TextUtils.isEmpty(token)) {
            callback.callback(TOKEN_ERROR_CODE, TOKEN_ERROR_MSG, null);
        }

        params.put("uid", getRequestString(uid));
        params.put("clientPlat", getRequestString("a"));
        params.put("token", getRequestString(token));
        params.put("access_token", getRequestString(access_token));

        RequestBody requestFace = RequestBody.create(MediaType.parse("multipart/form-data"), face);
        MultipartBody.Part faceBody = MultipartBody.Part.createFormData("face", face.getName(), requestFace);

        List<MultipartBody.Part> parts = new ArrayList<>();
        parts.add(faceBody);


        Subscriber<BaseInfo<FaceData>> subscriber = new Subscriber<BaseInfo<FaceData>>(context, ApiSubscriber.subscriberBuild) {
            @Override
            public void onCompleted(String s, String s1, BaseInfo<FaceData> faceDataBaseInfo) {
                if (callback == null) return;
                callback.callback(SUCCESS, "", faceDataBaseInfo);
            }

            @Override
            public void onError(String s, String s1) {
                if (callback == null) return;
                int errorCode = -1;
                try {
                    errorCode = Integer.valueOf(s);
                } catch (Exception ignored) {
                } finally {
                    callback.callback(errorCode, s1, null);
                }
            }
        };

        return ApiRequest.subscribe(ApiRequest.service(ApiServiceOpen.class).updateUserFace(params, parts), subscriber);
//        return ApiRequest.service(ApiServiceOpen.class, service -> service.updateUserFace(params, parts)).subscribe(context, callback);
    }

    private static RequestBody getRequestString(String value) {
        RequestBody requestString = RequestBody.create(MediaType.parse("text/plain"), value);
        return requestString;
    }

    public static Disposable zipFiles(Context context, List<String> imageFiles, DataCallback<List<String>> callback) {
        if (imageFiles == null || imageFiles.size() == 0) {
            callback.callback(0, "", imageFiles);
        } else {
            return Flowable.just(imageFiles)
                    .observeOn(Schedulers.io())
                    .map(list -> Luban.with(context)
                            .ignoreBy(500)
                            .setTargetDir(getPath())
                            .load(list)
                            .get())
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnError(throwable -> callback.callback(0, "", imageFiles))
                    .onErrorResumeNext(Flowable.empty())
                    .subscribe(
                            list -> {
                                List<String> files = new ArrayList<>();
                                for (File file : list) files.add(file.getPath());
                                callback.callback(0, "", files);
                            });
        }
        return null;
    }

    private static String getPath() {
        String path = Environment.getExternalStorageDirectory() + "/strike/image/";
        File file = new File(path);
        if (file.mkdirs()) {
            return path;
        }
        return path;
    }
}