package com.qunar.rn_service.rnplugins;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;

import com.bigkoo.pickerview.builder.TimePickerBuilder;
import com.bigkoo.pickerview.listener.OnTimeSelectListener;
import com.bigkoo.pickerview.view.TimePickerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.Target;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableMapKeySetIterator;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray;
import com.facebook.react.bridge.WritableNativeMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.orhanobut.logger.Logger;
import com.qunar.im.base.jsonbean.SetWorkWorldRemindResponse;
import com.qunar.im.base.module.CityLocal;
import com.qunar.im.base.jsonbean.LogInfo;
import com.qunar.im.base.module.MedalsInfo;
import com.qunar.im.base.module.UserHaveMedalStatus;
import com.qunar.im.base.protocol.HttpRequestCallback;
import com.qunar.im.core.utils.GlobalConfigManager;
import com.qunar.im.log.LogConstans;
import com.qunar.im.log.LogService;
import com.qunar.im.log.QLog;
import com.qunar.im.other.CacheDataType;
import com.qunar.im.permission.PermissionCallback;
import com.qunar.im.permission.PermissionDispatcher;
import com.qunar.im.utils.ConnectionUtil;
import com.qunar.im.utils.HttpUtil;
import com.qunar.im.base.common.BackgroundExecutor;
import com.qunar.im.base.common.CommonUploader;
import com.qunar.im.base.common.QunarIMApp;
import com.qunar.im.base.jsonbean.LeadInfo;
import com.qunar.im.base.jsonbean.LogInfo;
import com.qunar.im.base.jsonbean.NewRemoteConfig;
import com.qunar.im.base.jsonbean.SeatStatusResult;
import com.qunar.im.base.jsonbean.SetMucVCardResult;
import com.qunar.im.base.jsonbean.SetVCardResult;
import com.qunar.im.base.jsonbean.SetWorkWorldRemindResponse;
import com.qunar.im.base.jsonbean.UploadImageResult;
import com.qunar.im.base.module.AreaLocal;
import com.qunar.im.base.module.AvailableRoomRequest;
import com.qunar.im.base.module.AvailableRoomResponse;
import com.qunar.im.base.module.CalendarTrip;
import com.qunar.im.base.module.CityLocal;
import com.qunar.im.base.module.GroupMember;
import com.qunar.im.base.module.IMMessage;
import com.qunar.im.base.module.MedalsInfo;
import com.qunar.im.base.module.Nick;
import com.qunar.im.base.module.TripMemberCheckResponse;
import com.qunar.im.base.module.UserConfigData;
import com.qunar.im.base.protocol.HttpRequestCallback;
import com.qunar.im.base.protocol.NativeApi;
import com.qunar.im.base.protocol.PayApi;
import com.qunar.im.base.protocol.Protocol;
import com.qunar.im.base.protocol.ProtocolCallback;
import com.qunar.im.base.protocol.ThirdProviderAPI;
import com.qunar.im.base.protocol.VCardAPI;
import com.qunar.im.base.structs.PushSettinsStatus;
import com.qunar.im.base.structs.SetMucVCardData;
import com.qunar.im.base.structs.SetVCardData;
import com.qunar.im.base.transit.IUploadRequestComplete;
import com.qunar.im.base.transit.UploadImageRequest;
import com.qunar.im.base.util.Constants;
import com.qunar.im.base.util.DataUtils;
import com.qunar.im.base.util.EventBusEvent;
import com.qunar.im.base.util.FileUtils;
import com.qunar.im.base.util.HanziToPinyin;
import com.qunar.im.base.util.IMUserDefaults;
import com.qunar.im.base.util.InternDatas;
import com.qunar.im.base.util.JsonUtils;
import com.qunar.im.base.util.ListUtil;
import com.qunar.im.base.util.graphics.MyDiskCache;
import com.qunar.im.common.CommonConfig;
import com.qunar.im.core.manager.IMDatabaseManager;
import com.qunar.im.core.manager.IMLogicManager;
import com.qunar.im.core.manager.IMNotificaitonCenter;
import com.qunar.im.core.services.QtalkNavicationService;
import com.qunar.im.core.utils.GlobalConfigManager;
import com.qunar.im.google.auth.OtpProvider;
import com.qunar.im.log.LogConstans;
import com.qunar.im.log.LogService;
import com.qunar.im.log.QLog;
import com.qunar.im.other.CacheDataType;
import com.qunar.im.permission.PermissionCallback;
import com.qunar.im.permission.PermissionDispatcher;
import com.qunar.im.protobuf.Event.QtalkEvent;
import com.qunar.im.protobuf.common.CurrentPreference;
import com.qunar.im.utils.CalendarSynchronousUtil;
import com.qunar.im.utils.ConnectionUtil;
import com.qunar.im.utils.HttpUtil;
import com.qunar.im.utils.MD5;
import com.qunar.im.utils.QRUtil;
import com.qunar.im.utils.QtalkStringUtils;
import com.qunar.rn_service.activity.QtalkServiceRNActivity;
import com.qunar.rn_service.rnmanage.QtalkServiceExternalRNViewInstanceManager;
import com.qunar.rn_service.util.DateUtil;
import com.qunar.rn_service.util.QTalkServicePatchDownloadHelper;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutionException;

import de.greenrobot.event.EventBus;


/**
 * Created by hubin on 2018/1/18.
 */

public class QimRNBModule extends ReactContextBaseJavaModule implements IMNotificaitonCenter.NotificationCenterDelegate, PermissionCallback {

    private static final String MyMedal = "MyMedal";
    private static final String MyRedBag = "MyRedBag";
    private static final String BalanceInquiry = "BalanceInquiry";
    private static final String AccountInfo = "AccountInfo";
    private static final String MyFile = "MyFile";
    private static final String DeveloperChat = "DeveloperChat";
    private static final String DressUpVc = "DressUpVc";
    private static final String McConfig = "McConfig";
    private static final String About = "About";
    private static final String searchChatHistory = "searchChatHistory";
    private static final String NotReadMsg = "NotReadMsg";
    private static final String publicNumber = "publicNumber";
    private static final String GroupChat = "GroupChat";
    private static final String SearchContact = "SearchContact";
    private static final String Organizational = "Organizational";
    private static final String SystemSetting = "SystemSetting";
    private static final String AccountSwitch = "AccountSwitch";
    private static final String DomainSearch = "DomainSearch";
    private static final String OpenToCManager = "OpenToCManager";
    private static final String NavAddress = "NavAddress";
    private static final String OpenNavigationConfig = "NavigationConfig";


    private static final String InternalApplication = "InternalApplication";
    private static final String ExternalApplication = "ExternalApplication";
    private static final String WebApplication = "WebApplication";

    private static final String StateNotSet = "0";
    private static final String StateWorkOff = "1";
    private static final String StateWorkOn = "4";


    public static final int REQUEST_GRANT_CAMERA = PermissionDispatcher.getRequestCode();
    public static final int REQUEST_GRANT_LOCAL = PermissionDispatcher.getRequestCode();
    public static final int REQUEST_GRANT_CALL = PermissionDispatcher.getRequestCode();

    public Activity mActivity;//activity 为华为push要用
    //转发 分享 创建的群
    public static Map<String, ReadableMap> createGroups = new HashMap<>();

    @Override
    public void responsePermission(int requestCode, boolean granted) {

    }
    public enum AppEnum {
        InternalApplication("1"), ExternalApplication("2"), WebApplication("3");
        private String appType;

        AppEnum(String apptype) {
            this.appType = apptype;
        }

        public static AppEnum fromTypeName(String typeName) {
            for (AppEnum type : AppEnum.values()) {
                if (type.getAppType().equals(typeName)) {
                    return type;
                }
            }
            return null;
        }

        public String getAppType() {
            return appType;
        }

        public void setAppType(String appType) {
            this.appType = appType;
        }
    }


    public static String defaultUserImage = QtalkNavicationService.getInstance().getInnerFiltHttpHost() + "/file/v2/download/perm/3ca05f2d92f6c0034ac9aee14d341fc7.png";
    public static String defaultMucImage = QtalkNavicationService.getInstance().getInnerFiltHttpHost() + "/file/v2/download/perm/2227ff2e304cb44a1980e9c1a3d78164.png";

    private static List<String> inviteUserList = new ArrayList<>();
    private static String inviteName = new String();


    public QimRNBModule(ReactApplicationContext reactContext) {
        super(reactContext);
        addEvent();

    }

    public QimRNBModule(ReactApplicationContext reactContext, Activity mActivity) {
        super(reactContext);
        this.mActivity = mActivity;
        addEvent();
    }

    private void addEvent() {
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.Del_Muc_Register);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.Update_Muc_Vcard);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.Destory_Muc);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.IQ_CREATE_MUC);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.Muc_Invite_User_V2);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.GravanterSelected);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.FEED_BACK_RESULT);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.SELECT_DATE);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.WORK_WORLD_PERMISSIONS);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.Group_Member_Update);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.Remove_Session);
        ConnectionUtil.getInstance().addEvent(this,QtalkEvent.UPDATE_MEDAL_SELF);
        ConnectionUtil.getInstance().addEvent(this, QtalkEvent.PAY_SUCCESS);
    }

    @Override
    public String getName() {
        return "QimRNBModule";
    }

    private Object getApplicationMetaData(String key) {
        if (CommonConfig.globalContext != null) {
            ApplicationInfo applicationInfo = null;
            try {
                applicationInfo = CommonConfig.globalContext.getPackageManager().getApplicationInfo(CommonConfig.globalContext.getPackageName(), PackageManager.GET_META_DATA);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            if (applicationInfo == null || applicationInfo.metaData == null) {
                return null;
            } else {
                return applicationInfo.metaData.get(key);
            }
        } else {
            return null;
        }
    }

    @ReactMethod
    public void appConfig(Callback callback) {
        try {


            WritableNativeMap map = new WritableNativeMap();
            map.putString("userId", CurrentPreference.getInstance().getUserid());
            map.putString("clientIp", "192.168.0.1");
            map.putString("domain", QtalkNavicationService.getInstance().getXmppdomain());
//            map.putString("token", CurrentPreference.getInstance().getToken());
//            map.putString("q_auth", CurrentPreference.getInstance().getVerifyKey() == null ? "404" : CurrentPreference.getInstance().getVerifyKey());
            map.putString("ckey", getCKey());
            map.putString("httpHost", QtalkNavicationService.getInstance().getJavaUrl());
            map.putString("fileUrl", QtalkNavicationService.getInstance().getInnerFiltHttpHost());
            map.putString("qcAdminHost", QtalkNavicationService.getInstance().getQcadminHost());
            if (QtalkNavicationService.getInstance().isShowOrganizational()) {
                map.putInt("showOrganizational", 1);
            } else {
                map.putInt("showOrganizational", 0);
            }
            map.putBoolean("showServiceState", CurrentPreference.getInstance().isMerchants());
            map.putBoolean("isQtalk", CommonConfig.isQtalk);
            map.putBoolean("isShowWorkWorld", GlobalConfigManager.isQtalkPlat() && IMDatabaseManager.getInstance().SelectWorkWorldPremissions());

            Object metaData = getApplicationMetaData("EASY_TRIP");
            boolean isEasyTrip = metaData == null ? true : (boolean) metaData;
            map.putBoolean("isEasyTrip", isEasyTrip);
            map.putBoolean("isShowRedPackage", !GlobalConfigManager.isStartalkPlat());
            map.putBoolean("isShowGroupQRCode",true);
            map.putBoolean("isShowLocalQuickSearch",true);

            map.putBoolean("notNeedShowLeaderInfo",TextUtils.isEmpty(QtalkNavicationService.getInstance().getLeaderurl()));
            map.putBoolean("notNeedShowMobileInfo",TextUtils.isEmpty(QtalkNavicationService.getInstance().getMobileurl()));
            map.putBoolean("notNeedShowEmailInfo",TextUtils.isEmpty(QtalkNavicationService.getInstance().getEmail()));

            map.putBoolean("isToCManager",DataUtils.getInstance(CommonConfig.globalContext).getPreferences(Constants.Preferences.isAdminFlag + "_" + QtalkNavicationService.getInstance().getXmppdomain(),false));

            if(GlobalConfigManager.isQtalkPlat()){
                map.putInt("nativeAppType", 2);
            }else if(GlobalConfigManager.isQchatPlat()){
                map.putInt("nativeAppType", 1);
            }else if(GlobalConfigManager.isStartalkPlat()){
                map.putInt("nativeAppType", 0);
            }
//            map.putDouble("timestamp", System.currentTimeMillis());
            callback.invoke(map);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    @ReactMethod
    public void getTOTP(final Callback callback) {
//
        if (TextUtils.isEmpty(CurrentPreference.getInstance().getVerifyKey())) {
            WritableNativeMap map = new WritableNativeMap();
            map.putString("totp", "000000");
            map.putInt("time", 0);
            callback.invoke(map);
            return;
        }
        String seret = String.format("u=%s&k=%s", CurrentPreference.getInstance().getPreferenceUserId(), CurrentPreference.getInstance().getVerifyKey());
        long timeStampSec = System.currentTimeMillis() - CurrentPreference.getInstance().getServerTimeDiff();
        long timestamp = Long.parseLong(String.format("%010d", timeStampSec));
        OtpProvider otp = new OtpProvider();
        String totp = "";
        try {
            totp = otp.computePin(seret, timestamp, null);
        } catch (Exception e) {
            totp = "000000";
            e.printStackTrace();
        }
        WritableNativeMap success = new WritableNativeMap();
        success.putString("totp", totp);
        success.putDouble("time", timestamp);
        callback.invoke(success);


    }

    //    RCT_EXPORT_METHOD(updateRemoteKey:(RCTResponseSenderBlock)success) {
//        success(@[@{@"ok":@(YES)}]);
//    }
    @ReactMethod
    public void updateRemoteKey(Callback callback) {
        WritableNativeMap map = new WritableNativeMap();

        String newKey = IMLogicManager.getInstance().getRemoteLoginKey(true);
        if (!TextUtils.isEmpty(newKey)) {
            map.putBoolean("ok", true);
        } else {
            map.putBoolean("ok", false);
        }
        callback.invoke(map);
    }


    public static String getCKey() {
        return Protocol.getCKEY();
    }

    @ReactMethod
    public void exitApp(String rnName) {

    }

    /**
     * 更新导航
     *
     * @param navTitle
     */
    @ReactMethod
    public void updateNavTitle(String navTitle) {


    }

    /**
     * 打开RN页面
     */
    @ReactMethod
    public void openRNPage(ReadableMap params, Callback success) {
        //mem.putBoolean("showNav",true);

        //mem.putString("navTitle","测试RN");
        try {
            String appType = params.hasKey("AppType") ? params.getString("AppType") : "";

            //如果不传apptype 默认当成内部应用

            if (TextUtils.isEmpty(appType)) {
                appType = "1";
            }
            AppEnum appEnum = AppEnum.fromTypeName(appType);
            switch (appEnum) {


                //外部应用需要先进行判断本地是否存在,
                //存在则打开,否则去下载!
                case ExternalApplication:
                    String bundleName = params.hasKey("Bundle") ? params.getString("Bundle") : "";
                    String moduleName = params.hasKey("Module") ? params.getString("Module") : "";
                    boolean showNav = params.hasKey("showNativeNav") ? params.getBoolean("showNativeNav") : false;
                    String navTitle = params.hasKey("navTitle") ? params.getString("navTitle") : "未知页面";
                    HashMap<String, Object> properties = params.hasKey("Properties") && !TextUtils.isEmpty(params.getString("Properties")) ? JsonUtils.getGson().fromJson(params.getString("Properties"), new HashMap<String, Object>().getClass()) : new HashMap<String, Object>();
                    String bundleVersion = params.hasKey("Version") ? params.getString("Version") : "";


                    if (TextUtils.isEmpty(bundleName)) {
                        return;
                    }
                    boolean is_ok = true;
                    String Entrance = params.getString("Entrance");
//                    String url = params.getString("BundleUrls");
//                    String bundleUrls = "";
                    String bundleUrls = params.getString("BundleUrls");
//                    try {
//                        JSONObject jb = new JSONObject(url);
//                        bundleUrls = jb.getString("android-link-url");
//                    } catch (JSONException e) {
//                        e.printStackTrace();
//                    }
                    bundleName = MD5.hex(bundleUrls) + ".android.jsbundle";
//                    if (!bundleName.contains(".android.jsbundle")) {
//                        bundleName = bundleName + ".android.jsbundle";
//                    }
                    String localBundleFile = QtalkServiceExternalRNViewInstanceManager.getLocalBundleFilePath(CommonConfig.globalContext.getApplicationContext(), bundleName);


                    String oldBundleVersion = IMUserDefaults.getStandardUserDefaults().getStringValue(CommonConfig.globalContext,
                            bundleName);
                    if (!oldBundleVersion.equals(bundleVersion)) {
                        IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.SHOW_PRO_DIALOG, "请稍后");
                        is_ok = QTalkServicePatchDownloadHelper.downloadPatchAndSave(bundleUrls, QtalkServiceExternalRNViewInstanceManager.getLocalBundlePath(CommonConfig.globalContext), bundleName);
                        if (is_ok) {
                            IMUserDefaults.getStandardUserDefaults().newEditor(CommonConfig.globalContext)
                                    .putObject(bundleName, bundleVersion)
                                    .synchronize();
                        }
                    }
                    IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.DIMISS_PRO_DIALOG);
                    if (is_ok) {
//                    NativeApi.openSingleChat();
//                    Intent intent = new Intent(CommonConfig.globalContext, QtalkServiceExternalRNActivity.class);
                        Map<String, Object> map = new HashMap<>();

                        map.put("module", moduleName);
                        map.put("Version", bundleVersion);
                        map.put("Bundle", bundleName);
                        map.put("Entrance", Entrance);
                        map.put("navTitle", navTitle);
                        map.put("showNativeNav", showNav);
                        for (Map.Entry<String, Object> entry : properties.entrySet()) {
//                        intent.putExtra(entry.getKey(), entry.getValue() + "");
                            map.put(entry.getKey(), entry.getValue());
                        }

                        NativeApi.openExternalRN(map);

//                    intent.putExtra("module", moduleName);
//                    intent.putExtra("Version", bundleVersion);
//                    intent.putExtra("Bundle", bundleName);
//                    intent.putExtra("Entrance", Entrance);
//                    intent.putExtra("navTitle",navTitle);
//                    intent.putExtra("showNav",showNav);
//                    for (Map.Entry<String, Object> entry : properties.entrySet()) {
//                        intent.putExtra(entry.getKey(), entry.getValue() + "");
//                    }
//                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
////        intent.putExtra("Screen",rnModule);
//                    CommonConfig.globalContext.startActivity(intent);
                    }

                    break;

                case WebApplication:

                    String weburl = params.hasKey("memberAction") ? params.getString("memberAction") : "";
                    boolean shownav = params.hasKey("showNativeNav") ? params.getBoolean("showNativeNav") : true;
                    NativeApi.openWebPage(weburl, shownav);

                    //打开浏览器
//                NativeApi.openWebPage();
                    break;

                //内部应用和web应用打开方式
                case InternalApplication:
                default:
                    String nmoduleName = params.hasKey("Module") ? params.getString("Module") : "";
                    HashMap<String, Object> nproperties = params.hasKey("Properties") ? params.getMap("Properties").toHashMap() : new HashMap<String, Object>();
                    String nbundleVersion = params.hasKey("Version") ? params.getString("Version") : "";


                    Intent intent = new Intent(CommonConfig.globalContext, QtalkServiceRNActivity.class);
                    intent.putExtra("module", nmoduleName);
                    intent.putExtra("Version", nbundleVersion);
                    for (Map.Entry<String, Object> entry : nproperties.entrySet()) {
                        intent.putExtra(entry.getKey(), entry.getValue() + "");
                    }
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//        intent.putExtra("Screen",rnModule);
                    CommonConfig.globalContext.startActivity(intent);
                    break;
            }

        } catch (Exception e) {

        }

//        new String();
    }


    private void openGroupChat(ReadableMap params, String groupId) {
        if (params.hasKey(Constants.BundleKey.IS_TRANS) && params.getBoolean(Constants.BundleKey.IS_TRANS)) {//转发
            Serializable transMsg = JsonUtils.getGson().fromJson(params.getString(Constants.BundleKey.TRANS_MSG), IMMessage.class);
            EventBus.getDefault().post(new EventBusEvent.SendTransMsg(transMsg, groupId));
        } else if (params.hasKey(Constants.BundleKey.IS_FROM_SHARE) && params.getBoolean(Constants.BundleKey.IS_FROM_SHARE)) {//分享
            String shareMsg = params.getString(Constants.BundleKey.SHARE_EXTRA_KEY);
            NativeApi.openGroupChatForShare(groupId, groupId, shareMsg);
        } else {
            NativeApi.openGroupChat(groupId, groupId);
        }
    }

    /**
     * 打开Native页面
     *
     * @param params
     */
    @ReactMethod
    public void openNativePage(ReadableMap params) {
        String nativeName = params.getString("NativeName");

        switch (nativeName) {
            case MyMedal:
                String userid = params.getString("userId");
                NativeApi.openUserMedal(QtalkStringUtils.addIdDomain(userid));
                break;
            case MyRedBag:
                NativeApi.openUserHongBao();
                break;
            case BalanceInquiry:
                NativeApi.openUserHongBaoBalance();
                break;

            case AccountInfo:
                NativeApi.openAccountInfo();
                break;
            case MyFile:
                NativeApi.openMyFile();
                break;

            case DeveloperChat:
                NativeApi.openDeveloperChat();
                break;

            case DressUpVc:
                NativeApi.openDressUpVc();
                break;

            case McConfig:
                NativeApi.openMcConfig();
                break;
            case About:
                NativeApi.openAbout();
                break;
            case searchChatHistory:
                NativeApi.openWebPage(Constants.SEARCH_HISTORY_PREFIX, true);
                break;
            case NotReadMsg:
                NativeApi.openUnReadListActivity();
                break;
            case publicNumber:
                NativeApi.openPublicNumber();
                break;
            case GroupChat:
                String groupId = params.getString("GroupId");
                openGroupChat(params, groupId);
                break;
            case SearchContact:
                NativeApi.openSearchActivty();
                break;
            case Organizational:
                NativeApi.openOrganizational();
                break;
            case SystemSetting:
                NativeApi.openSystemSetting();
                break;
            case AccountSwitch:
                NativeApi.openAccountSwitch();
                break;
            case DomainSearch:
                NativeApi.openDomainSearch();
                break;
            case OpenToCManager:
                String appweb = QtalkNavicationService.getInstance().getAppWeb();
                String domain = QtalkNavicationService.getInstance().getXmppdomain();
                NativeApi.openWebPage(appweb + "/manage#/audit_user?domain=" + domain, true);
                break;
            case NavAddress:
                String weburl = QtalkNavicationService.getInstance().getAppWeb();
                NativeApi.openWebPage(weburl + "/manage#/nav_code", true);
                break;
            case OpenNavigationConfig:
                NativeApi.openNavConfig();
                break;
            default:
                break;

        }


    }

//    /**
//     * 打开公众号
//     */
//    @ReactMethod
//    public void getPublicNumberList(){
//
//    }


    /**
     * 清空消息列表
     */
    @ReactMethod
    public void clearSessionList() {
        ConnectionUtil.getInstance().DeleteSessionList();
        IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.Show_List, "SUCCESS");
    }

    /**
     * 退出登录
     */
    @ReactMethod
    public void logout() {
        NativeApi.logout();

        saveRNActLog("log out", "退出登录", "设置页");
    }


    /**
     * 展示手机号
     *
     * @param params
     */
    @ReactMethod
    public void showUserPhoneNumber(ReadableMap params) {
        String userId = params.getString("UserId");
        NativeApi.openPhoneNumber(userId);


    }

    @ReactMethod
    public void setServiceState(final ReadableMap map, final Callback callback) {
        if (map == null) {
            return;
        }
        final String st = map.getString("state");
        final String sid = map.getString("sid");

        ThirdProviderAPI.setServiceStatus(CurrentPreference.getInstance().getUserid(), st, sid, new ProtocolCallback.UnitCallback<Boolean>() {
            @Override
            public void onCompleted(Boolean aBoolean) {
                WritableNativeMap writableNativeMap = new WritableNativeMap();
                writableNativeMap.putBoolean("result", aBoolean);
                callback.invoke(writableNativeMap);
            }

            @Override
            public void onFailure(String errMsg) {
            }
        });
    }

    @ReactMethod
    public void getServiceState(final Callback callback) {
        ThirdProviderAPI.getServiceStatus(CurrentPreference.getInstance().getUserid(), new ProtocolCallback.UnitCallback<List<SeatStatusResult.SeatStatus>>() {
            @Override
            public void onCompleted(List<SeatStatusResult.SeatStatus> seatStatuses) {
                if (seatStatuses != null && seatStatuses.size() > 0) {
                    WritableNativeMap writableNativeMap = new WritableNativeMap();
                    WritableNativeArray array = new WritableNativeArray();
                    StringBuilder sb = new StringBuilder();
                    for (SeatStatusResult.SeatStatus status : seatStatuses) {
                        WritableMap map = Arguments.createMap();
                        map.putInt("st", Integer.parseInt(status.st));
                        map.putString("sname", status.sname);
                        map.putString("sid", status.sid);
                        array.pushMap(map);
                        sb.append(status.sname + "->" + Code2ServiceState(status.st) + "\n");
                    }
                    if (sb.length() > 0) {
                        String s = sb.substring(0, sb.lastIndexOf("\n"));
                        writableNativeMap.putString("ServiceState", s);
                        writableNativeMap.putArray("JsonData", array);
                        callback.invoke(writableNativeMap);
                    }
                }

            }

            @Override
            public void onFailure(String errMsg) {
            }
        });
    }

    private String Code2ServiceState(String code) {
        String state = "标准模式";
        if (code != null && !TextUtils.isEmpty(code)) {
            if (StateWorkOff.equals(code)) {
                state = "勿扰模式";
            } else if (StateWorkOn.equals(code)) {
                state = "超人模式";
            }
        }
        return state;
    }


    /**
     * 获取用户签名
     *
     * @param userId
     * @param callback
     */
    @ReactMethod
    public void getUserMood(final String userId, final Callback callback) {
//        VCardAPI.getUserProfile(userId, new ProtocolCallback.UnitCallback<GetMoodResult>() {
//            @Override
//            public void onCompleted(GetMoodResult getMoodResult) {
//                if (getMoodResult.ret) {
//                    String mood = "这家伙很懒,什么都没留下";
//                    if (!ListUtil.isEmpty(getMoodResult.data)) {
//                        mood = getMoodResult.data.get(0).M;
//                    }
//                    WritableMap hm = new WritableNativeMap();
//                    hm.putString("Mood", mood);
//                    WritableNativeMap map = new WritableNativeMap();
//                    map.putMap("UserInfo", hm);
//                    callback.invoke(map);
//                }
//            }
//
//            @Override
//            public void onFailure(String errMsg) {
//                String mood = "这家伙很懒,什么都没留下";
//                WritableMap hm = new WritableNativeMap();
//                hm.putString("Mood", mood);
//                WritableNativeMap map = new WritableNativeMap();
//                map.putMap("UserInfo", hm);
//                callback.invoke(map);
//            }
//        });
//        callback.invoke(null);
    }

    /**
     * 获取用户领导及员工号
     *
     * @param userId
     * @param callback
     */
    @ReactMethod
    public void getUserLead(final String userId, final Callback callback) {
        HttpUtil.getUserLead(userId, new ProtocolCallback.UnitCallback<LeadInfo>() {
            @Override
            public void onCompleted(LeadInfo leadInfo) {
                WritableMap hm = new WritableNativeMap();

                hm.putString("Leader", leadInfo.getData().getLeader());
                hm.putString("Empno", leadInfo.getData().getSn());
                String leaderId = leadInfo.getData().getQtalk_id();
                if (!leaderId.contains("@")) {
                    leaderId += "@" + QtalkNavicationService.getInstance().getXmppdomain();
                }
                hm.putString("LeaderId", leaderId);
                WritableNativeMap map = new WritableNativeMap();
                map.putMap("UserInfo", hm);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {

            }
        });
    }

    /**
     * 获取用户信息
     *
     * @param userId
     * @param callback
     */
    @ReactMethod
    public void getUserInfo(final String userId, final Callback callback) {

        ConnectionUtil.getInstance().getUserCard(userId, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                WritableMap hm = new WritableNativeMap();

                hm.putString("Name", nick.getName());
                hm.putString("Remarks", nick.getMark());
                hm.putString("HeaderUri", nick.getHeaderSrc());
                hm.putString("Department", nick.getDescInfo());
                hm.putString("UserId", nick.getXmppId());
                WritableNativeMap map = new WritableNativeMap();
                map.putMap("UserInfo", hm);
                callback.invoke(map);
            }
        }, false, true);
    }

    @ReactMethod
    public void getUserInfoByUserCard(final String userId, final Callback callback) {


        Nick cache = ConnectionUtil.getInstance().getNickById(userId);
        WritableMap hm = new WritableNativeMap();

        hm.putString("Name", cache.getName());
        hm.putString("Remarks", cache.getMark());
        hm.putString("HeaderUri", cache.getHeaderSrc());
        hm.putString("Department", cache.getDescInfo());
        hm.putString("UserId", cache.getXmppId());
        hm.putString("Mood", cache.getMood());
        WritableNativeMap map = new WritableNativeMap();
        map.putMap("UserInfo", hm);
        List<UserHaveMedalStatus> list = IMDatabaseManager.getInstance().selectUserHaveMedalStatusByUserid(QtalkStringUtils.parseId(userId),QtalkStringUtils.parseDomain(userId));
        WritableArray medalList = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            medalList.pushString(list.get(i).getSmallIcon());
        }
        map.putArray("medalList",medalList);
        callback.invoke(map);

        ConnectionUtil.getInstance().getUserCard(userId, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                WritableMap hm = new WritableNativeMap();

                hm.putString("Name", nick.getName());
                hm.putString("Remarks", nick.getMark());
                hm.putString("HeaderUri", nick.getHeaderSrc());
                hm.putString("Department", nick.getDescInfo());
                hm.putString("UserId", nick.getXmppId());
                hm.putString("Mood", nick.getMood());
                WritableNativeMap map = new WritableNativeMap();
                map.putMap("UserInfo", hm);
                map.putString("UserId", nick.getXmppId());

                sendEvent("updateNick", map);
//                netCallback.invoke(map);
            }
        }, true, false);
    }


    /**
     * 设置备注名
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void saveRemark(ReadableMap params, final Callback callback) {
        final String userId = params.getString("UserId");
        final String Remark = params.getString("Remark");
        String Name = params.getString("Name");

        final WritableNativeMap re = new WritableNativeMap();
        final UserConfigData userConfigData = new UserConfigData();
        userConfigData.setKey(CacheDataType.kMarkupNames);
        userConfigData.setSubkey(userId);
        userConfigData.setValue(Remark);
        userConfigData.setIsdel(CacheDataType.Y);
        userConfigData.setType(CacheDataType.set);


        HttpUtil.setUserConfig(userConfigData, new ProtocolCallback.UnitCallback<NewRemoteConfig>() {
            @Override
            public void onCompleted(NewRemoteConfig newRemoteConfig) {
                Logger.i("新版个人配置接口 set");
                if (newRemoteConfig.isRet()) {
                    if (newRemoteConfig.getData().getClientConfigInfos().size() > 0) {
                        ConnectionUtil.refreshTheConfig(newRemoteConfig);
//                        IMDatabaseManager.getInstance().insertUserConfigVersion(newRemoteConfig.getData().getVersion());
//                        IMDatabaseManager.getInstance().bulkUserConfig(newRemoteConfig);
                        Nick nick = ConnectionUtil.getInstance().getNickById(userId);
                        nick.setMark(Remark);
                        ConnectionUtil.getInstance().setNickToCache(nick);
                        IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.REFRESH_NICK);
                        re.putBoolean("ok", true);
                        com.orhanobut.logger.Logger.i("设置备注漫游返回成功");
//                        com.orhanobut.logger.Logger.i("设置备注漫游返回为null失败");
                    } else {
//                                userConfigData.setVersion(newRemoteConfigs.getData().getVersion());
//                    IMDatabaseManager.getInstance().insertUserConfigVersion(newRemoteConfig.getData().getVersion());
//                    IMDatabaseManager.getInstance().insertUserConfigVersion(userConfigData);
//
//                        Nick nick = ConnectionUtil.getInstance().getNickById(userId);
//                        nick.setMark(Remark);
//                        ConnectionUtil.getInstance().setNickToCache(nick);
//                        IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.REFRESH_NICK);
//                        re.putBoolean("ok", true);
//                        com.orhanobut.logger.Logger.i("设置备注漫游返回成功");
                        //todo 这里应该做出一些什么通知
                    }
                } else {
                    re.putBoolean("ok", false);
                }

                callback.invoke(re);
            }

            @Override
            public void onFailure(String errMsg) {
                re.putBoolean("ok", false);
                com.orhanobut.logger.Logger.i("设置备注漫游返回为null失败");
                callback.invoke(re);
            }
        });


    }


    /**
     * 评论
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void comment(ReadableMap params, Callback callback) {

    }

    /**
     * 查看大头像
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void browseBigHeader(ReadableMap params, Callback callback) {
        String id = params.getString("UserId");
        ConnectionUtil.getInstance().getUserCard(id, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                if (nick != null) {
                    String url = nick.getHeaderSrc();
                    NativeApi.openBigImage(url, MyDiskCache.getSmallFile(url + "&w=96&h=96").getAbsolutePath());
                }

            }
        }, false, false);
    }

    /**
     * 打开单人会话
     *
     * @param params
     */
    @ReactMethod
    public void openUserChat(ReadableMap params) {
        String jid = params.getString("UserId");
        NativeApi.openSingleChat(jid, jid);
    }

    /**
     * 打开指定人朋友圈
     *
     * @param params
     */
    @ReactMethod
    public void openUserWorkWorld(ReadableMap params) {
        String jid = params.getString("UserId");
        NativeApi.openUserWorkWorld(jid, jid);
    }

    /**
     * 打开开发人员会话
     */
    @ReactMethod
    public void openDeveloperChat() {
//        new String();
        NativeApi.openDeveloperChat();

    }

    /**
     * 添加好友
     *
     * @param params
     */
    @ReactMethod
    public void addUserFriend(ReadableMap params) {
        String jid = params.getString("UserId");
        NativeApi.openAddFriend(jid);
        saveRNActLog("add friends", "添加好友", "好友名片页");
    }

    /**
     * 删除好友
     *
     * @param params
     */
    @ReactMethod
    public void deleteUserFriend(ReadableMap params) {
        String jid = params.getString("UserId");
        //这个好友可能是跨域的 所以domain不能取内存的 要从jid截取
        ConnectionUtil.getInstance().deleteFriend(QtalkStringUtils.parseId(jid), QtalkStringUtils.parseDomain(jid));
        saveRNActLog("delete friend", "删除好友", "好友名片页");
    }

    /**
     * 判断是否为好友
     *
     * @param userId
     * @param callback
     */
    @ReactMethod
    public void getFriend(String userId, Callback callback) {
        boolean isfriend = ConnectionUtil.getInstance().isMyFriend(userId);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("FriendBOOL", isfriend);
        callback.invoke(map);
    }

    /**
     * 评论
     *
     * @param params
     */
    @ReactMethod
    public void commentUser(ReadableMap params) {

    }

    /**
     * 发送邮件
     *
     * @param params
     */
    @ReactMethod
    public void sendEmail(ReadableMap params) {
        String userId = params.getString("UserId");
        //qtalk 暂时这么写 目前没有借口获取email后缀地址
        userId = userId.substring(0, userId.lastIndexOf("@") + 1) + "qunar.com";
        NativeApi.openEmail(userId);
    }

    private void startHelpChat(String logFilePath) {
//        Random random = new Random();
//        int r = random.nextInt(devs.length);
//        if (r < 0) {
//            r = 0;
//        } else if (r >= devs.length) {
//            r = devs.length - 1;
//        }
//        Intent intent = new Intent(, PbChatActivity.class);
//        String jid = devs[r];
//        intent.putExtra("jid", jid);
//        intent.putExtra("content", content);
//        intent.putExtra("isFromChatRoom", false);
//        intent.putExtra("sendLogFile", logFilePath);
//        BugreportActivity.this.startActivity(intent);
    }

    /**
     * 获取群二维码图片
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void getGroupQRCode(String groupId, Callback callback) {
        Logger.i("RNModule:获取用户二维码:" + groupId);
        String imageBase64 = QRUtil.generateQRBase64(Constants.Config.QR_SCHEMA + "://group?id=" + groupId);
        WritableNativeMap map = new WritableNativeMap();
        map.putString("qrCode", imageBase64);
        callback.invoke(map);
    }


    /**
     * 设置群名称
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void saveGroupName(ReadableMap params, final Callback callback) {
        String groupId = params.getString("GroupId");
        final String groupName = params.getString("GroupName");
        final WritableNativeMap map = new WritableNativeMap();
        ConnectionUtil.getInstance().getMucCard(groupId, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                if (nick == null)
                    return;
                // TODO: 2017/8/24 updataMucInfo
                SetMucVCardData setMucVCardData = new SetMucVCardData();
                setMucVCardData.nick = groupName;
                setMucVCardData.muc_name = nick.getGroupId();
                setMucVCardData.desc = nick.getIntroduce();
                setMucVCardData.title = nick.getTopic();
                setMucVCardData.pic = nick.getHeaderSrc();
                List<SetMucVCardData> groups = new ArrayList();
                groups.add(setMucVCardData);
                HttpUtil.setMucVCard(groups, new ProtocolCallback.UnitCallback<SetMucVCardResult>() {
                    @Override
                    public void onFailure(String errMsg) {
                        map.putBoolean("ok", false);
//                        chatRoomInfoView.setUpdateResult(false, "更改失败");
                        callback.invoke(map);
                    }

                    @Override
                    public void onCompleted(SetMucVCardResult s) {
                        if (s != null && s.data != null && s.data.size() > 0) {
//                            chatRoomInfoView.setUpdateResult(true, "更改成功");
                            map.putBoolean("ok", true);
//                        chatRoomInfoView.setUpdateResult(false, "更改失败");
                            callback.invoke(map);
                        } else {

//                            chatRoomInfoView.setUpdateResult(false, "更改失败");
                            map.putBoolean("ok", false);
//                        chatRoomInfoView.setUpdateResult(false, "更改失败");
                            callback.invoke(map);
                        }
                    }
                });

            }
        }, false, false);


    }

    /**
     * 设置群公告
     *
     * @param params
     * @param params
     * @param callback
     */
    @ReactMethod
    public void saveGroupTopic(ReadableMap params, final Callback callback) {
        String groupId = params.getString("GroupId");
        final String groupTopic = params.getString("GroupTopic");
        final WritableNativeMap map = new WritableNativeMap();
        ConnectionUtil.getInstance().getMucCard(groupId, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                if (nick == null)
                    return;
                // TODO: 2017/8/24 updataMucInfo
                SetMucVCardData setMucVCardData = new SetMucVCardData();
                setMucVCardData.nick = nick.getName();
                setMucVCardData.muc_name = nick.getGroupId();
                setMucVCardData.desc = nick.getIntroduce();
                setMucVCardData.title = groupTopic;
                setMucVCardData.pic = nick.getHeaderSrc();
                List<SetMucVCardData> groups = new ArrayList();
                groups.add(setMucVCardData);
                HttpUtil.setMucVCard(groups, new ProtocolCallback.UnitCallback<SetMucVCardResult>() {
                    @Override
                    public void onFailure(String errMsg) {
                        map.putBoolean("ok", false);
//                        chatRoomInfoView.setUpdateResult(false, "更改失败");
                        callback.invoke(map);
                    }

                    @Override
                    public void onCompleted(SetMucVCardResult s) {
                        if (s != null && s.data != null && s.data.size() > 0) {
//                            chatRoomInfoView.setUpdateResult(true, "更改成功");
                            map.putBoolean("ok", true);
//                        chatRoomInfoView.setUpdateResult(false, "更改失败");
                            callback.invoke(map);
                        } else {

//                            chatRoomInfoView.setUpdateResult(false, "更改失败");
                            map.putBoolean("ok", false);
//                        chatRoomInfoView.setUpdateResult(false, "更改失败");
                            callback.invoke(map);
                        }
                    }
                });

            }
        }, false, false);


    }

    /**
     * 添加群成员
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void addGroupMember(ReadableMap params, Callback callback) {
        boolean isGroup = params.getBoolean("isGroup");
        //如果是群组情况直接添加
        if (isGroup) {
            String groupId = params.getString("groupId");
            ReadableMap map = params.getMap("members");
            ReadableMapKeySetIterator keySet = map.keySetIterator();
            inviteUserList = new ArrayList<>();
            inviteName = new String();
            while (keySet.hasNextKey()) {
                ReadableMap item = map.getMap(keySet.nextKey());
                String userId = item.getString("xmppId");
                String name = item.getString("name");
                inviteUserList.add(userId);
                if (userId.equals(CurrentPreference.getInstance().getPreferenceUserId())) {
                    continue;
                }
                inviteName += " " + name;

            }


            ConnectionUtil.getInstance().inviteMessageV2(groupId, inviteUserList);
        } else {
            //如果是单人发起 创建群并添加好友
            String id = UUID.randomUUID().toString().replace("-", "");
            final String roomId = QtalkStringUtils.roomId2Jid(id);
            ConnectionUtil.getInstance().createGroup(roomId);
            if (params.hasKey(Constants.BundleKey.IS_FROM_SHARE) //转发或者是分享
                    || params.hasKey(Constants.BundleKey.IS_TRANS)
                    && createGroups != null) {
                createGroups.put(roomId, params);
            }

            //提前将一会要加入群的成员数据准备好
            ReadableMap map = params.getMap("members");
            ReadableMapKeySetIterator keySet = map.keySetIterator();
            inviteUserList = new ArrayList<>();
            inviteName = new String();
            while (keySet.hasNextKey()) {
                ReadableMap item = map.getMap(keySet.nextKey());
                String userId = item.getString("xmppId");
                String name = item.getString("name");

                inviteUserList.add(userId);
                if (userId.equals(CurrentPreference.getInstance().getPreferenceUserId())) {
                    continue;
                }
                inviteName += " " + name;
            }


        }

    }

    /**
     * 群角色管理
     * @param params
     * @param callback
     */
    @ReactMethod
    public void setGroupAdmin(ReadableMap params, Callback callback){
        Logger.i("setGroupAdmin:" + params.toString());
        String groupId = params.getString("groupId");
        String xmppid = params.getString("xmppid");
        String name = params.getString("name");
        boolean isAdmin = params.getBoolean("isAdmin");
        ConnectionUtil.getInstance().setGroupAdmin(groupId,xmppid,name,isAdmin);
    }


    public String getLocalImage(String image) {

        try {
            File imageFile = Glide.with(CommonConfig.globalContext)
                    .load(image)
                    .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                    .get();
            return imageFile.getAbsolutePath();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 根据xmppid清空会话
     *
     * @param params
     */
    @ReactMethod
    public void clearImessage(ReadableMap params) {
        String xmppid = params.getString("xmppId");
        ConnectionUtil.getInstance().deleteIMmessageByXmppId(xmppid);
    }


    /**
     * 获取自己的签名
     *
     * @param callback
     */
    @ReactMethod
    public void getMyMood(final Callback callback) {
//        String user = IMUserDefaults.getStandardUserDefaults().getStringValue(CommonConfig.globalContext, Constants.Preferences.lastuserid);
//        String domain = QtalkNavicationService.getInstance().getXmppdomain();
//        if (TextUtils.isEmpty(user) || TextUtils.isEmpty(domain)) {
//            return;
//        }
//        final String lastid = user + "@" + domain;
//        VCardAPI.getUserProfile(lastid, new ProtocolCallback.UnitCallback<GetMoodResult>() {
//            @Override
//            public void onCompleted(GetMoodResult getMoodResult) {
//                if (getMoodResult.ret) {
//                    String mood = "这家伙很懒,什么都没留下";
//                    if (!ListUtil.isEmpty(getMoodResult.data)) {
//                        mood = getMoodResult.data.get(0).M;
//                        WritableNativeMap map = new WritableNativeMap();
//                        map.putString("mood", mood);
//                        callback.invoke(map);
//                    }
////                    ListUtil.isEmpty(getMoodResult.data);
////                    final String finalMood = mood;
//
////                    Nick nick = ConnectionUtil.getInstance().getNickById(lastid);
//
//                }
//            }
//
//            @Override
//            public void onFailure(String errMsg) {
//
//            }
//        });
    }


    /**
     * 获取自己的信息
     *
     * @param callback
     */
    @ReactMethod
    public void getMyInfo(final Callback callback) {

        String user = IMUserDefaults.getStandardUserDefaults().getStringValue(CommonConfig.globalContext, Constants.Preferences.lastuserid);
        String domain = QtalkNavicationService.getInstance().getXmppdomain();
        if (TextUtils.isEmpty(user) || TextUtils.isEmpty(domain)) {
            return;
        }
        final String lastid = user + "@" + domain;
        ConnectionUtil.getInstance().getUserCard(lastid, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                WritableMap hm = new WritableNativeMap();

                hm.putString("Name", nick.getName());
                hm.putString("HeaderUri", nick.getHeaderSrc());
                String depar = "未知";
                if (!TextUtils.isEmpty(nick.getDescInfo())) {
                    try {
                        String strs[] = nick.getDescInfo().split("/");
                        if (strs.length > 1) {


                            if (TextUtils.isEmpty(strs[0])) {
                                if(TextUtils.isEmpty(strs[2])){
                                    if(TextUtils.isEmpty(strs[1])){
                                        if(TextUtils.isEmpty(strs[0])){
                                            depar ="未知";
                                        }else{
                                            depar = strs[0];
                                        }
                                    }else{
                                        depar = strs[1];
                                    }
                                }else{
                                    depar = strs[2];
                                }

                            } else {
                                if(TextUtils.isEmpty(strs[1])){
                                    if(TextUtils.isEmpty(strs[0])){
                                        depar = "未知";
                                    }else{
                                        depar = strs[0];
                                    }
                                }else{
                                    depar = strs[1];
                                }
                            }
                        }else{
                            depar = strs[0];
                        }
                    } catch (Exception e) {

                    }
                }

                hm.putString("Department", depar);
                hm.putString("UserId", nick.getXmppId());
                hm.putString("Mood", nick.getMood());
                WritableNativeMap map = new WritableNativeMap();
                map.putMap("MyInfo", hm);
                List<UserHaveMedalStatus> list = IMDatabaseManager.getInstance().selectUserWearMedalStatusByUserid(CurrentPreference.getInstance().getUserid(),QtalkNavicationService.getInstance().getXmppdomain());
                WritableArray medalList = new WritableNativeArray();
                for (int i = 0; i < list.size(); i++) {
                    medalList.pushString(list.get(i).getSmallIcon());
                }
                map.putArray("medalList",medalList);

                callback.invoke(map);
            }
        }, true, true);


//

//


    }

    /**
     * 设置个性签名
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void savePersonalSignature(ReadableMap params, final Callback callback) {
        Logger.i("RNModule:设置个性签名+++:" + params.toString());
        String userId = params.getString("UserId");
        final String mood = params.getString("PersonalSignature");
        final WritableNativeMap map = new WritableNativeMap();
        VCardAPI.setMyUserProfile(mood, new ProtocolCallback.UnitCallback<SetVCardResult>() {
            @Override
            public void onCompleted(SetVCardResult setMoodResult) {
                if (setMoodResult.ret) {
                    map.putBoolean("ok", true);
                } else {
                    map.putBoolean("ok", false);
                    map.putString("message", "无权访问");
                }
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                map.putString("message", "设置失败");
                callback.invoke(map);
            }
        });

    }


    /**
     * 获取用户二维码
     *
     * @param userId
     * @param callback
     */
    @ReactMethod
    public void getUserQRCode(String userId, Callback callback) {
        Logger.i("RNModule:获取用户二维码:" + userId);
        String imageBase64 = QRUtil.generateQRBase64(Constants.Config.QR_SCHEMA + "://user?id=" + userId);
        WritableNativeMap map = new WritableNativeMap();
        map.putString("qrCode", imageBase64);
        callback.invoke(map);
    }

    /**
     * 发送反馈意见
     *
     * @param params
     */
    @ReactMethod
    public void sendAdviceMessage(ReadableMap params, final Callback callback) {
        String adviceMsg = params.getString("adviceText");
        boolean isUploadDb = params.getBoolean("logSelected");
        Logger.i("RNModule:发送反馈意见+++:" + adviceMsg);
        try {
            IMDatabaseManager.getInstance().manualCheckPoint();//手动checkpoint数据库
        }catch (Exception e){
            Logger.e("manualCheckPoint exception:" + e.getLocalizedMessage());
        }
//        FeedBackServcie.runFeedBackServcieService(CommonConfig.globalContext, new String[]{adviceMsg});
        IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.FEED_BACK, new String[]{adviceMsg},true,isUploadDb);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("ok", true);
        callback.invoke(map);

        saveRNActLog("Suggestions", "建议反馈", "我的页");
    }

    private void toast(final String msg) {
        CommonConfig.mainhandler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(CommonConfig.globalContext, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * 获取联系人页展示的用户
     *
     * @param callback
     */
    @ReactMethod
    public void getContacts(Callback callback) {
        List<Nick> fList = ConnectionUtil.getInstance().SelectFriendListForRN();
        WritableNativeMap map = new WritableNativeMap();
        WritableArray array = new WritableNativeArray();
        if (fList != null && fList.size() > 0) {
//            WritableMap map = new WritableNativeMap();

            for (int i = 0; i < fList.size(); i++) {
                Nick nick = fList.get(i);
                WritableNativeMap item = new WritableNativeMap();
                String name = nick.getName();
                String pinyin = nick.getXmppId();
                if (!TextUtils.isEmpty(name)) {
                    pinyin = HanziToPinyin.zh2Abb(name);
                }

                item.putString("Name", TextUtils.isEmpty(name) ? nick.getXmppId() : name);
                item.putString("HeaderUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? "" : nick.getHeaderSrc());
                item.putString("SearchIndex", pinyin);
                item.putString("XmppId", nick.getXmppId());
                item.putString("Remark", nick.getMark());
                item.putString("Mood",nick.getMood());
                array.pushMap(item);
            }

        }
        map.putArray("contacts", array);
        callback.invoke(map);

//        WritableNativeMap map2= new WritableNativeMap();
//        map2.putString("aaa","aaaa");
//        sendEvent("EventName",map2);

    }

//    /**
//     *
//     * @param params
//     * @param callback
//     */
//    @ReactMethod
//    public void addGroupMember(ReadableMap params, Callback callback){
//
//    }

    /**
     * 获取指定联系人nick
     *
     * @param xmppId
     * @param callback
     */
    @ReactMethod
    public void getContactsNick(String xmppId, final Callback callback) {
        ConnectionUtil.getInstance().getUserCard(xmppId, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                WritableNativeMap item = new WritableNativeMap();
                String name = nick.getName();
                String pinyin = nick.getXmppId();
                if (!TextUtils.isEmpty(name)) {
                    pinyin = HanziToPinyin.zh2Abb(name);
                }

                item.putString("Name", TextUtils.isEmpty(name) ? nick.getXmppId() : name);
                item.putString("HeaderUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? "" : nick.getHeaderSrc());
                item.putString("SearchIndex", pinyin);
                item.putString("XmppId", nick.getXmppId());
                item.putString("Remark", nick.getMark());
                item.putString("Mood",nick.getMood());
                WritableMap map = new WritableNativeMap();
                map.putMap("nick", item);
                callback.invoke(map);
            }
        }, true, false);
    }


    /**
     * 获取群列表
     *
     * @param callback
     */
    @ReactMethod
    public void getGroupList(Callback callback) {
        List<Nick> nickList = ConnectionUtil.getInstance().SelectAllGroup();
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < nickList.size(); i++) {
            Nick n = nickList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("title", n.getName());
            map.putString("GroupId", n.getGroupId());
            String url = n.getHeaderSrc();
            if (TextUtils.isEmpty(url)) {
                url = defaultMucImage;
            }
            map.putString("HeaderUri", url);
            map.putString("Name", n.getName());
            array.pushMap(map);
        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("groupList", array);
        callback.invoke(re);
    }

    /**
     * 根据搜索字段获取群组
     *
     * @param searchText
     * @param callback
     */
    @ReactMethod
    public void searchGroupListWithKey(String searchText, Callback callback) {
        List<Nick> nickList = ConnectionUtil.getInstance().SelectGroupListBySearchText(searchText, 100);
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < nickList.size(); i++) {
            Nick n = nickList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("title", n.getName());
            map.putString("GroupId", n.getGroupId());
            String url = n.getHeaderSrc();
            if (TextUtils.isEmpty(url)) {
                url = defaultMucImage;
            }
            map.putString("HeaderUri", url);
            map.putString("Name", n.getName());
            array.pushMap(map);
        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("groupList", array);
        callback.invoke(re);
    }


    public void sendEvent(String eventName, WritableMap params) {
        getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }

    /**
     * 清空app缓存
     *
     * @param callback
     */
    @ReactMethod
    public void clearAndroidAppCache(Callback callback) {
        WritableMap map = new WritableNativeMap();
        try {
            final List<File> files = Arrays.asList(MyDiskCache.getAllCacheDir());
            for (File dir : files) {
                FileUtils.removeDir(dir);
            }
            map.putBoolean("ok", true);
        } catch (Exception e) {
            map.putBoolean("ok", false);
        }
        callback.invoke(map);
    }

    /**
     * 获取用户缓存数据大小
     *
     * @param callback
     */
    @ReactMethod
    public void getAppCache(final Callback callback) {
        BackgroundExecutor.execute(new Runnable() {
            @Override
            public void run() {
                final List<File> files = Arrays.asList(MyDiskCache.getAllCacheDir());
                long tmpCost = 0;
                for (File dir : files) {
                    tmpCost += FileUtils.getDirSize(dir);
                }
                final long totalBytes = FileUtils.calculateDiskSize(FileUtils.getExternalFilesDir(QunarIMApp.getContext()));
                final long costBytes = tmpCost;
                final long freeBytes = FileUtils.calculateDiskFree(FileUtils.getExternalFilesDir(QunarIMApp.getContext()));
                final long otherBytes = totalBytes - freeBytes - costBytes;
                final String costStr = FileUtils.formatByteSize(costBytes);
                final String freeStr = FileUtils.formatByteSize(freeBytes);
                final String otherStr = FileUtils.formatByteSize(otherBytes);
                final float costRate = 1.0f * costBytes / totalBytes;
                final float freeRate = 1.0f * freeBytes / totalBytes;
                final float otherRate = 1.0f * otherBytes / totalBytes;
                final float costedRate = 0f;
                final float freedRate = freeRate + costRate;
                WritableMap map = new WritableNativeMap();
                map.putString("AppCache", costStr);
                callback.invoke(map);
            }
        });
    }


    /**
     * 获取客户端版本号
     *
     * @param callback
     */
    @ReactMethod
    public void getAppVersion(Callback callback) {
        String version = "" + QunarIMApp.getQunarIMApp().getVersion();
        WritableMap map = new WritableNativeMap();
        map.putString("AppVersion", version);
        callback.invoke(map);
    }

    /**
     * 同步在线通知状态
     *
     * @param callback
     */
    @ReactMethod
    public void syncOnLineNotifyState(Callback callback) {
//        CurrentPreference.ProFile proFile = CurrentPreference.getInstance().getProFile();
//        WritableMap map = new WritableNativeMap();
////        WritableMap params = new WritableNativeMap();
////        params.putBoolean("syncOnLineNotifyState",proFile.isOfflinePush());
//        map.putBoolean("state", proFile.isOfflinePush());
//        callback.invoke(map);


        WritableMap map = new WritableNativeMap();
        boolean state = ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.PUSH_ONLINE);
        map.putBoolean("state", state);
        callback.invoke(map);

    }

    /**
     * 获取通知声音状态
     *
     * @param callback
     */
    @ReactMethod
    public void getNotifySoundState(Callback callback) {
//        CurrentPreference.ProFile proFile = CurrentPreference.getInstance().getProFile();
//        WritableMap map = new WritableNativeMap();
////        WritableMap params = new WritableNativeMap();
////        params.putBoolean("getNotifySoundState",proFile.isTurnOnMsgSound());
//        map.putBoolean("state", proFile.isTurnOnMsgSound());
//        callback.invoke(map);

        WritableMap map = new WritableNativeMap();
        boolean state = ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.SOUND_INAPP);
        map.putBoolean("state", state);
        callback.invoke(map);

    }

    /**
     * 获取用户展示心情短语状态
     *
     * @param callback
     */
    @ReactMethod
    public void getShowUserModState(Callback callback) {

    }

    /**
     * 获取用户通知是否显示详情
     *
     * @param callback
     */
    @ReactMethod
    public void getNotifyPushDetailsState(Callback callback) {

//        CurrentPreference.ProFile proFile = CurrentPreference.getInstance().getProFile();
//        WritableMap map = new WritableNativeMap();
////        WritableMap params = new WritableNativeMap();
////        params.putBoolean("getNotifySoundState",proFile.isTurnOnMsgSound());
//        map.putBoolean("state", proFile.isShowContentPush());
//        callback.invoke(map);

        WritableMap map = new WritableNativeMap();
        boolean state = ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.SHOW_CONTENT);
        map.putBoolean("state", state);
        callback.invoke(map);
    }

    /**
     * 获取用户是否开启推送
     *
     * @param callback
     */
    @ReactMethod
    public void getStartPushState(Callback callback) {
//        CurrentPreference.ProFile proFile = CurrentPreference.getInstance().getProFile();
//        WritableMap map = new WritableNativeMap();
////        WritableMap params = new WritableNativeMap();
////        params.putBoolean("getNotifySoundState",proFile.isTurnOnMsgSound());
//        map.putBoolean("state", proFile.isTurnOnPsuh());
//        callback.invoke(map);

        WritableMap map = new WritableNativeMap();
        boolean state = ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.PUSH_SWITCH);
        map.putBoolean("state", state);
        callback.invoke(map);
    }

    /**
     * 获取用户通知震动状态
     *
     * @param callback
     */
    @ReactMethod
    public void getNotifyVibrationState(Callback callback) {
//        CurrentPreference.ProFile proFile = CurrentPreference.getInstance().getProFile();
//        WritableMap map = new WritableNativeMap();
////        WritableMap params = new WritableNativeMap();
////        params.putBoolean("getNotifySoundState",proFile.isTurnOnMsgSound());
//        map.putBoolean("state", proFile.isTurnOnMsgShock());
//        callback.invoke(map);

        WritableMap map = new WritableNativeMap();
        boolean state = ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.VIBRATE_INAPP);
        map.putBoolean("state", state);
        callback.invoke(map);
    }

    /**
     * 更新在线收通知状态
     *
     * @param onlineState
     * @param callback
     */
    @ReactMethod
    public void updateOnLineNotifyState(boolean onlineState, final Callback callback) {

        final boolean state = onlineState;
        final WritableMap map = new WritableNativeMap();
        HttpUtil.setPushMsgSettings(PushSettinsStatus.PUSH_ONLINE, state ? 1 : 0, new ProtocolCallback.UnitCallback<Boolean>() {
            @Override
            public void onCompleted(Boolean aBoolean) {
                ConnectionUtil.getInstance().setPushState(PushSettinsStatus.PUSH_ONLINE, state ? 1 : 0);
                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });


//        CurrentPreference.ProFile proFile = CurrentPreference.getInstance().getProFile();
//
//
//
//        Protocol.setPushState(state, new ProtocolCallback.UnitCallback<String>() {
//            @Override
//            public void onCompleted(String s) {
//                Logger.i("changeOfflinePush  onCompleted  " + s);
//                CurrentPreference.getInstance().setOfflinePush(state);
//                IMDatabaseManager.getInstance().updateConfig();
//                map.putBoolean("ok", true);
//                callback.invoke(map);
//            }
//
//            @Override
//            public void onFailure() {
//                Logger.i("changeOfflinePush  onFailure  ");
//                map.putBoolean("ok", false);
//                callback.invoke(map);
//            }
//        });


    }

    /**
     * 更新通知声音状态
     *
     * @param notifySoundState
     * @param callback
     */
    @ReactMethod
    public void updateNotifySoundState(boolean notifySoundState, final Callback callback) {

//        boolean state = notifySoundState;
//        CurrentPreference.getInstance().setTurnOnMsgSound(state);
//        IMDatabaseManager.getInstance().updateConfig();
//        WritableMap map = new WritableNativeMap();
//        map.putBoolean("ok", true);
//        callback.invoke(map);

        final boolean state = notifySoundState;

        final WritableMap map = new WritableNativeMap();
        HttpUtil.setPushMsgSettings(PushSettinsStatus.SOUND_INAPP, state ? 1 : 0, new ProtocolCallback.UnitCallback<Boolean>() {
            @Override
            public void onCompleted(Boolean aBoolean) {
                ConnectionUtil.getInstance().setPushState(PushSettinsStatus.SOUND_INAPP, state ? 1 : 0);
                com.qunar.im.protobuf.common.CurrentPreference.getInstance().setTurnOnMsgSound(ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.SOUND_INAPP));
                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });
    }

    /**
     * 更新通知震动状态
     *
     * @param stateVibration
     * @param callback
     */
    @ReactMethod
    public void updateNotifyVibrationState(boolean stateVibration, final Callback callback) {
//        boolean state = stateVibration;
//        CurrentPreference.getInstance().setTurnOnMsgShock(state);
//        IMDatabaseManager.getInstance().updateConfig();
//        WritableMap map = new WritableNativeMap();
//        map.putBoolean("ok", true);
//        callback.invoke(map);

        final boolean state = stateVibration;

        final WritableMap map = new WritableNativeMap();
        HttpUtil.setPushMsgSettings(PushSettinsStatus.VIBRATE_INAPP, state ? 1 : 0, new ProtocolCallback.UnitCallback<Boolean>() {
            @Override
            public void onCompleted(Boolean aBoolean) {
                ConnectionUtil.getInstance().setPushState(PushSettinsStatus.VIBRATE_INAPP, state ? 1 : 0);
                com.qunar.im.protobuf.common.CurrentPreference.getInstance().setTurnOnMsgShock(ConnectionUtil.getInstance().getPushStateBy(PushSettinsStatus.VIBRATE_INAPP));
                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });
    }

    /**
     * 更新是否开启推送状态
     *
     * @param startState
     * @param callback
     */
    @ReactMethod
    public void updateStartNotifyState(boolean startState, final Callback callback) {


//        boolean state = startState;
//        if (state) {
//            QTPushConfiguration.registPush(mActivity);
////            PushServiceUtils.startAMDService(getActivity());
//        } else {
//            QTPushConfiguration.unRegistPush(mActivity);
////            PushServiceUtils.stopAMDService(getActivity());
//        }
//
//
//        CurrentPreference.getInstance().setTurnOnPsuh(state);
//        IMDatabaseManager.getInstance().updateConfig();
//        WritableMap map = new WritableNativeMap();
//        map.putBoolean("ok", true);
//        callback.invoke(map);


        final boolean state = startState;
//        if (state) {
//            QTPushConfiguration.registPush(CommonConfig.globalContext);
////            PushServiceUtils.startAMDService(getActivity());
//        } else {
//            QTPushConfiguration.unRegistPush(CommonConfig.globalContext);
////            PushServiceUtils.stopAMDService(getActivity());
//        }

        final WritableMap map = new WritableNativeMap();
        HttpUtil.setPushMsgSettings(PushSettinsStatus.PUSH_SWITCH, state ? 1 : 0, new ProtocolCallback.UnitCallback<Boolean>() {
            @Override
            public void onCompleted(Boolean aBoolean) {
                ConnectionUtil.getInstance().setPushState(PushSettinsStatus.PUSH_SWITCH, state ? 1 : 0);
                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });


    }

    /**
     * 更新消息推送是否显示详情
     *
     * @param state
     * @param callback
     */
    @ReactMethod
    public void updateNotifyPushDetailsState(final boolean state, final Callback callback) {

//        final WritableMap map = new WritableNativeMap();
//        Protocol.setPushShowcontent(state ? 1 : 0, new Protocol.PushListening() {
//            @Override
//            public void onSuccess() {
//                CurrentPreference.getInstance().setShowContent(state);
//                IMDatabaseManager.getInstance().updateConfig();
//
//                map.putBoolean("ok", true);
//                callback.invoke(map);
//            }
//
//            @Override
//            public void onFailure() {
//                map.putBoolean("ok", false);
//                callback.invoke(map);
//            }
//        });


        final WritableMap map = new WritableNativeMap();
        HttpUtil.setPushMsgSettings(PushSettinsStatus.SHOW_CONTENT, state ? 1 : 0, new ProtocolCallback.UnitCallback<Boolean>() {
            @Override
            public void onCompleted(Boolean aBoolean) {
                ConnectionUtil.getInstance().setPushState(PushSettinsStatus.SHOW_CONTENT, state ? 1 : 0);
                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });
    }

    /**
     * 更新用户是否显示签名状态
     *
     * @param userModState
     * @param callback
     */
    @ReactMethod
    public void updateShowUserModState(boolean userModState, Callback callback) {

    }

    public void openAbout() {

    }

    /**
     * 根据文字搜索联系人
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void selectUserListByText(ReadableMap params, Callback callback) {
        String groupId = params.getString("groupId");
        String searchText = params.getString("searchText");
        List<Nick> userList = ConnectionUtil.getInstance().SelectUserListBySearchText(groupId, searchText);
        WritableNativeArray array = new WritableNativeArray();

        for (int i = 0; i < userList.size(); i++) {
            Nick nick = userList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("xmppId", nick.getXmppId());
            map.putString("headerUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            map.putBoolean("hasInGroup", nick.isInGroup());
            map.putString("desc",nick.getDescInfo());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("UserList", array);
        re.putBoolean("ok", true);
        callback.invoke(re);
    }

    /**
     * 根据好友
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void selectFriendsForGroupAdd(ReadableMap params, Callback callback) {
        String groupId = params.getString("groupId");
        List<Nick> userList = ConnectionUtil.getInstance().selectFriendsForGroupAdd(groupId);
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < userList.size(); i++) {
            Nick nick = userList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("xmppId", nick.getXmppId());
            map.putString("headerUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            map.putString("desc",nick.getDescInfo());
            map.putBoolean("friend", true);
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("UserList", array);
        re.putBoolean("ok", true);
        callback.invoke(re);

    }

    @ReactMethod
    public void selectGroupMemberForKick(ReadableMap params, Callback callback) {
        String groupId = params.getString("groupId");
        List<Nick> userList = ConnectionUtil.getInstance().selectGroupMemberForKick(groupId);
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < userList.size(); i++) {
            Nick nick = userList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("xmppId", nick.getXmppId());
            map.putString("headerUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("UserList", array);
        re.putBoolean("ok", true);
        callback.invoke(re);
    }

    /**
     * 群踢人
     *
     * @param params
     */
    @ReactMethod
    public void kickGroupMember(ReadableMap params, Callback callback) {
        final String groupId = params.getString("groupId");
        ReadableMap map = params.getMap("members");
        ReadableMapKeySetIterator keySet = map.keySetIterator();
        Map<String, String> memberMap = new HashMap<>();
        while (keySet.hasNextKey()) {
            ReadableMap item = map.getMap(keySet.nextKey());
            String userId = item.getString("xmppId");
            String name = item.getString("name");
            memberMap.put(name, userId);
        }
        if (TextUtils.isEmpty(groupId) || memberMap.size() == 0) {
            return;
        }
        ConnectionUtil.getInstance().delGroupMember(groupId, memberMap);
        sendEvent("closeKickMembers", new WritableNativeMap());
        toast("成员已移除");
    }

    @ReactMethod
    public void selectMemberFromGroup(ReadableMap params, Callback callback) {
        String groupId = params.getString("groupId");
        String searchText = params.getString("searchText");
        List<Nick> userList = ConnectionUtil.getInstance().selectMemberFromGroup(groupId, searchText);
        WritableNativeArray array = new WritableNativeArray();

        for (int i = 0; i < userList.size(); i++) {
            Nick nick = userList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("xmppId", nick.getXmppId());
            map.putString("headerUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("UserList", array);
        re.putBoolean("ok", true);
        callback.invoke(re);
    }

    /**
     * 获取群成员
     */
    @ReactMethod
    public void getGroupMember(String groupId, Callback callback) {
        getGroupMemberFromDB(groupId, callback);
        ConnectionUtil.getInstance().getMembersAfterJoin(groupId);
    }

    public void getGroupMemberFromDB(String groupId, Callback callback) {
        List<GroupMember> groupMemberList = ConnectionUtil.getInstance().SelectGroupMemberByGroupId(groupId);
        if (ListUtil.isEmpty(groupMemberList)) {
            return;
        }
        WritableNativeArray array = new WritableNativeArray();
        int per = 2;
        for (int i = 0; i < groupMemberList.size(); i++) {
            GroupMember gm = groupMemberList.get(i);
            WritableNativeMap map = new WritableNativeMap();
            String affiliation = gm.getAffiliation();
            map.putString("affiliation", affiliation);
            map.putString("headerUri", TextUtils.isEmpty(gm.getHeaderSrc()) ? defaultUserImage : gm.getHeaderSrc());
            String xmppid = gm.getMemberId();
            if (CurrentPreference.getInstance().getPreferenceUserId().equals(xmppid)) {
                if (!TextUtils.isEmpty(affiliation)) {
                    per = Integer.parseInt(affiliation);
                }
            }
            map.putString("xmppjid", xmppid);
            map.putString("jid", gm.getGroupId());
            map.putString("name", gm.getName());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("GroupMembers", array);
        re.putBoolean("ok", true);
        re.putString("GroupId", groupId);
        re.putInt("permissions", per);
        if (callback != null) {
            callback.invoke(re);
        } else {
            sendEvent("updateGroupMember", re);
        }
    }

    /**
     * 获取群信息
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void getGroupInfo(final String groupId, final Callback callback) {
//        Nick mucNick =  ConnectionUtil.getInstance().getMucNickById(groupId);
        ConnectionUtil.getInstance().getMucCard(groupId, new IMLogicManager.NickCallBack() {
            @Override
            public void onNickCallBack(Nick nick) {
                WritableNativeMap map = new WritableNativeMap();
//                WritableNativeArray array = new WritableNativeArray();
                map.putString("GroupId", nick.getGroupId());
                map.putString("Name", nick.getName());
                map.putString("HeaderSrc", nick.getHeaderSrc());
                map.putString("Topic", nick.getTopic());
                map.putString("Introduce", nick.getIntroduce());

                WritableNativeMap re = new WritableNativeMap();
                re.putBoolean("ok", true);
                re.putMap("GroupInfo", map);
                callback.invoke(re);


            }
        }, true, true);
    }


    /**
     * 获取会话PushState
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void syncPushState(String groupId, Callback callback) {
//        RecentConversation rc = new RecentConversation();
//        rc.setId(groupId);
//        rc.setRealUser(groupId);
//        rc = ConnectionUtil.getInstance().SelectConversationByRC(rc);

        UserConfigData userConfigData = new UserConfigData();
        userConfigData.setSubkey(groupId);
        userConfigData.setKey(CacheDataType.kNoticeStickJidDic);
        UserConfigData ucd = ConnectionUtil.getInstance().selectUserConfigValueForKey(userConfigData);

//        recentConvDataModel.selectRecentConvById(rc);
//        panelView.setReMind(rc.getRemind()>0);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("state", ucd == null);
        callback.invoke(map);

    }

    /**
     * 更新检查配置
     */
    @ReactMethod
    public void updateCheckConfig() {

    }


    /**
     * 更新会话PushState
     *
     * @param groupId
     * @param state
     * @param callback
     */
    @ReactMethod
    public void updatePushState(String groupId, boolean state, final Callback callback) {


        UserConfigData userConfigData = new UserConfigData();
        userConfigData.setKey(CacheDataType.kNoticeStickJidDic);
        userConfigData.setSubkey(groupId);
//        UserConfigData.TopInfo topInfo = IMDatabaseManager.getInstance().selectSessionChatType(userConfigData);
//        userConfigData.setTopInfo(topInfo);
        final WritableNativeMap map = new WritableNativeMap();
        ConnectionUtil.getInstance().setConversationReMindOrCancel(userConfigData, new ConnectionUtil.CallBackByUserConfig() {
            @Override
            public void onCompleted() {
                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure() {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });


//        final RecentConversation rc = new RecentConversation();
//        rc.setId(groupId);
//        rc.setRealUser(groupId);
//
//        RecentConversation recentConversation = IMDatabaseManager.getInstance().SelectConversationByRC(rc);

//        HttpUtil.setGroupPushSettings(groupId, recentConversation.getRemind(), new ProtocolCallback.UnitCallback<Boolean>() {
//            @Override
//            public void onCompleted(Boolean aBoolean) {
//
//                if (aBoolean) {
//                    ConnectionUtil.getInstance().setConversationReMindOrCancel(rc);


//                } else {
//                    map.putBoolean("ok", false);
//                    callback.invoke(map);
//                }
//
//            }

////            @Override
////            public void onFailure() {
////                map.putBoolean("ok", false);
////                callback.invoke(map);
////            }
//        });


    }

    /**
     * 同步群置顶信息
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void syncGroupStickyState(String groupId, Callback callback) {
//        RecentConversation rc = new RecentConversation();
//        rc.setId(groupId);
//        rc.setRealUser(groupId);
//        rc = ConnectionUtil.getInstance().SelectConversationByRC(rc);
        UserConfigData userConfigData = new UserConfigData();
        userConfigData.setSubkey(groupId + "<>" + groupId);
        userConfigData.setKey(CacheDataType.kStickJidDic);
        UserConfigData ucd = ConnectionUtil.getInstance().selectUserConfigValueForKey(userConfigData);
//        recentConvDataModel.selectRecentConvById(rc);
//        panelView.setTop(rc.getTop()>0);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("state", ucd != null);
        callback.invoke(map);
    }


    /**
     * 更新群置顶
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void updateGroupStickyState(String groupId, final Callback callback) {
        try {
//            RecentConversation rc = new RecentConversation();
//            rc.setId(groupId);
//            rc.setRealUser(groupId);

            UserConfigData userConfigData = new UserConfigData();
            userConfigData.setKey(CacheDataType.kStickJidDic);
            userConfigData.setSubkey(groupId + "<>" + groupId);
            UserConfigData.TopInfo topInfo = new UserConfigData.TopInfo();
            topInfo.setChatType("1");
            userConfigData.setTopInfo(topInfo);
            final WritableNativeMap map = new WritableNativeMap();
            ConnectionUtil.getInstance().setConversationTopOrCancel(userConfigData, new ConnectionUtil.CallBackByUserConfig() {
                @Override
                public void onCompleted() {
                    map.putBoolean("ok", true);
                    callback.invoke(map);
                }

                @Override
                public void onFailure() {
                    map.putBoolean("ok", false);
                    callback.invoke(map);
                }
            });

//            ConnectionUtil.getInstance().setConversationTopSession(rc);


        } catch (Exception e) {
            WritableNativeMap map = new WritableNativeMap();
            map.putBoolean("ok", false);
            callback.invoke(map);
        }
    }


    /**
     * 同步单人聊天置顶信息
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void syncChatStickyState(ReadableMap params, Callback callback) {
        String xmppId = params.getString("xmppId");
        String realJid = params.getString("realJid");
        if (TextUtils.isEmpty(realJid)) {
            realJid = xmppId;
        }
//        RecentConversation rc = new RecentConversation();
//        rc.setId(xmppId);
//        rc.setRealUser(realJid);
//        rc = ConnectionUtil.getInstance().SelectConversationByRC(rc);

        UserConfigData userConfigData = new UserConfigData();
        userConfigData.setSubkey(xmppId + "<>" + realJid);
        userConfigData.setKey(CacheDataType.kStickJidDic);
        UserConfigData ucd = ConnectionUtil.getInstance().selectUserConfigValueForKey(userConfigData);
//        recentConvDataModel.selectRecentConvById(rc);
//        panelView.setTop(rc.getTop()>0);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("state", ucd != null);
        callback.invoke(map);
//
//        WritableNativeMap map = new WritableNativeMap();
//        map.putBoolean("state", rc.getTop() > 0);
//        callback.invoke(map);
    }

    /**
     * 更新单人置顶状态
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void updateUserChatStickyState(ReadableMap params, final Callback callback) {
        String xmppId = params.getString("xmppId");
        String realJid = params.getString("realJid");
//        RecentConversation rc = new RecentConversation();
//        rc.setId(xmppId);
//        rc.setRealUser(realJid);

        if (TextUtils.isEmpty(realJid)) {
            realJid = xmppId;
        }
        UserConfigData userConfigData = new UserConfigData();
        userConfigData.setKey(CacheDataType.kStickJidDic);
        userConfigData.setSubkey(xmppId + "<>" + realJid);
        UserConfigData.TopInfo topInfo = new UserConfigData.TopInfo();
        topInfo.setChatType("0");
        userConfigData.setTopInfo(topInfo);
        final WritableNativeMap map = new WritableNativeMap();
        ConnectionUtil.getInstance().setConversationTopOrCancel(userConfigData, new ConnectionUtil.CallBackByUserConfig() {
            @Override
            public void onCompleted() {

                map.putBoolean("ok", true);
                callback.invoke(map);
            }

            @Override
            public void onFailure() {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });

//        ConnectionUtil.getInstance().setConversationReMindOrCancel(rc);
//        ConnectionUtil.getInstance().setConversationTopSession(rc);

    }

    /**
     * 查询不在星标联系人的好友
     *
     * @param callback
     */
    @ReactMethod
    public void selectFriendsNotInStarContacts(Callback callback) {
        List<Nick> list = IMDatabaseManager.getInstance().selectFriendsNotInStarContacts();
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            Nick nick = list.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("Name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("XmppId", nick.getXmppId());
            map.putString("HeaderUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("contacts", array);
        callback.invoke(re);
    }

    @ReactMethod
    public void selectUserNotInStartContacts(String key, Callback callback) {
        List<Nick> list = IMDatabaseManager.getInstance().selectUserNotInStartContacts(key);
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            Nick nick = list.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("Name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("XmppId", nick.getXmppId());
            map.putString("HeaderUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("users", array);
        callback.invoke(re);
    }

    @ReactMethod
    public void selectStarOrBlackContacts(String pkey, Callback callback) {
        List<Nick> list = IMDatabaseManager.getInstance().selectStarOrBlackContactsAsNick(pkey);
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            Nick nick = list.get(i);
            WritableNativeMap map = new WritableNativeMap();
            map.putString("Name", TextUtils.isEmpty(nick.getName()) ? nick.getXmppId() : nick.getName());
            map.putString("XmppId", nick.getXmppId());
            map.putString("HeaderUri", TextUtils.isEmpty(nick.getHeaderSrc()) ? defaultUserImage : nick.getHeaderSrc());
            array.pushMap(map);

        }
        WritableNativeMap re = new WritableNativeMap();
        re.putArray("data", array);
        callback.invoke(re);
    }

    @ReactMethod
    public void setStarOrBlackContacts(ReadableMap map, String pkey, boolean isAdd, final Callback callback) {
        if (map.toHashMap().isEmpty()) {
            WritableNativeMap wnm = new WritableNativeMap();
            wnm.putBoolean("ok", true);
            callback.invoke(wnm);
            return;
        }
        UserConfigData data = new UserConfigData();
        data.setType(isAdd ? CacheDataType.set : CacheDataType.cancel);
        List<UserConfigData.Info> rl = new ArrayList<>();

        ReadableMapKeySetIterator keySet = map.keySetIterator();
        while (keySet.hasNextKey()) {
            ReadableMap item = map.getMap(keySet.nextKey());
            String xmppid = item.getString("XmppId");
            UserConfigData.Info info = new UserConfigData.Info();
            info.setKey(pkey);
            info.setSubkey(xmppid);
            info.setValue(isAdd ? String.valueOf(CacheDataType.Y) : String.valueOf(CacheDataType.N));
            rl.add(info);
        }
        data.setBatchProcess(rl);
        HttpUtil.setUserConfig(data, new ProtocolCallback.UnitCallback<NewRemoteConfig>() {
            @Override
            public void onCompleted(NewRemoteConfig newRemoteConfig) {
                ConnectionUtil.getInstance().refreshTheConfig(newRemoteConfig);
                WritableNativeMap map = new WritableNativeMap();
                map.putBoolean("ok", newRemoteConfig.isRet());
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                WritableNativeMap map = new WritableNativeMap();
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });
    }

    @ReactMethod
    public void setStarOrblackContact(String xmppid, String pkey, boolean isAdd, final Callback callback) {
        if (TextUtils.isEmpty(xmppid)) {
            return;
        }
        UserConfigData data = new UserConfigData();
        data.setType(isAdd ? CacheDataType.set : CacheDataType.cancel);
        data.setValue(isAdd ? String.valueOf(CacheDataType.Y) : String.valueOf(CacheDataType.N));
        data.setIsdel(isAdd ? CacheDataType.N : CacheDataType.Y);
        data.setKey(pkey);
        data.setSubkey(xmppid);
        HttpUtil.setUserConfig(data, new ProtocolCallback.UnitCallback<NewRemoteConfig>() {
            @Override
            public void onCompleted(NewRemoteConfig newRemoteConfig) {
                ConnectionUtil.getInstance().refreshTheConfig(newRemoteConfig);
                WritableNativeMap map = new WritableNativeMap();
                map.putBoolean("ok", newRemoteConfig.isRet());
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                WritableNativeMap map = new WritableNativeMap();
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });
    }

    @ReactMethod
    public void setWaterMark(boolean isOpen) {
        DataUtils.getInstance(CommonConfig.globalContext).putPreferences(CacheDataType.kWaterMark, isOpen);
    }

    @ReactMethod
    public void getWaterMark(Callback callback) {
        boolean isOpen = DataUtils.getInstance(CommonConfig.globalContext).getPreferences(CacheDataType.kWaterMark, true);
        callback.invoke(isOpen);
    }
    @ReactMethod
    public  void getworkWorldRemind(Callback callback){


//        UserConfigData userConfigData = new UserConfigData();
//        userConfigData.setSubkey(String.valueOf(CacheDataType.kCricleCamelNotify_Type));
//        userConfigData.setKey(CacheDataType.kCricleCamelNotify);
//        UserConfigData ucd = ConnectionUtil.getInstance().selectUserConfigValueForKey(userConfigData);
//
//        recentConvDataModel.selectRecentConvById(rc);
//        panelView.setReMind(rc.getRemind()>0);
        WritableNativeMap map = new WritableNativeMap();
        boolean isOpen = IMDatabaseManager.getInstance().SelectWorkWorldRemind();
//        if(ucd !=null){
//           isOpen = ucd.getValue().equals(CacheDataType.Y+"")? true:false;
//        }
        map.putBoolean("state", isOpen);
        callback.invoke(map);




    }
    @ReactMethod
    public void updateWorkWorldRemind(boolean isOpen, final Callback callback){





        String i = isOpen ? String.valueOf(CacheDataType.Y) : String.valueOf(CacheDataType.N);


//        UserConfigData data = new UserConfigData();
//        data.setType(CacheDataType.set );
//        data.setValue(isOpen ? String.valueOf(CacheDataType.Y) : String.valueOf(CacheDataType.N));
//        data.setIsdel( CacheDataType.N );
//        data.setKey(CacheDataType.kCricleCamelNotify);
//        data.setSubkey(String.valueOf(CacheDataType.kCricleCamelNotify_Type));
//        HttpUtil.setUserConfig(data, new ProtocolCallback.UnitCallback<NewRemoteConfig>() {
//            @Override
//            public void onCompleted(NewRemoteConfig newRemoteConfig) {
//                ConnectionUtil.getInstance().refreshTheConfig(newRemoteConfig);
//                WritableNativeMap map = new WritableNativeMap();
//                map.putBoolean("ok", newRemoteConfig.isRet());
//                callback.invoke(map);
//            }
//
//            @Override
//            public void onFailure(String errMsg) {
//                WritableNativeMap map = new WritableNativeMap();
//                map.putBoolean("ok", false);
//                callback.invoke(map);
//            }
//        });


        HttpUtil.setWorkWorldRemind(Integer.parseInt(i), new ProtocolCallback.UnitCallback<SetWorkWorldRemindResponse>() {
            @Override
            public void onCompleted(SetWorkWorldRemindResponse setWorkWorldRemindResponse) {
                WritableNativeMap map = new WritableNativeMap();
                map.putBoolean("ok", setWorkWorldRemindResponse.isRet());
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                WritableNativeMap map = new WritableNativeMap();
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });


    }

    /**
     * 是否是星标联系人 黑名单
     *
     * @param xmppid
     * @param pkey
     * @param callback
     */
    @ReactMethod
    public void isStarOrBlackContact(String xmppid, String pkey, Callback callback) {
        boolean flag = IMDatabaseManager.getInstance().isStarContact(xmppid, pkey);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("ok", flag);
        callback.invoke(map);
    }


    /**
     * 退出群组
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void quitGroup(String groupId, Callback callback) {
//        connectionUtil.leaveGroup(key);

        ConnectionUtil.getInstance().leaveGroup(groupId);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("ok", true);
        callback.invoke(map);
    }


    /**
     * 销毁群组
     *
     * @param groupId
     * @param callback
     */
    @ReactMethod
    public void destructionGroup(String groupId, Callback callback) {
        ConnectionUtil.getInstance().destroyGroup(groupId);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("ok", true);
        callback.invoke(map);
    }

    /**
     * 相册上传图像
     */
    @ReactMethod
    public void updateMyPhotoFromImagePicker() {
//        PermissionDispatcher.requestPermissionWithCheck(CommonConfig.globalContext, new int[]{PermissionDispatcher.REQUEST_WRITE_EXTERNAL_STORAGE,
//                        PermissionDispatcher.REQUEST_READ_EXTERNAL_STORAGE},
//                QimRNBModule.this, REQUEST_GRANT_LOCAL);
        NativeApi.openPictureSelector();
    }

    /**
     * 拍照上传
     */
    @ReactMethod
    public void takePhoto() {
        NativeApi.openCamerSelecter();
    }

    /************************** Search start************************/

    @ReactMethod
    public void searchLocalMessageByKeyword(String keyword, String xmppid, String realjid, Callback callback) {
        try {
            WritableNativeArray writableNativeArray = new WritableNativeArray();
            JSONArray list = IMDatabaseManager.getInstance().selectMessageByKeyWord(keyword, xmppid, realjid);
            Map<String, List<JSONObject>> map = new LinkedHashMap<>();
            for (int i = 0; i < list.length(); i++) {
                JSONObject imMessage = list.getJSONObject(i);
                String timeStr = getTimeStr(imMessage.getLong("timeLong"));
                List<JSONObject> oldList = map.get(timeStr);
                if (oldList != null) {
                    oldList.add(imMessage);
                } else {
                    List<JSONObject> newList = new ArrayList<>();
                    newList.add(imMessage);
                    map.put(timeStr, newList);

                }
            }

            WritableNativeMap cMap = new WritableNativeMap();
            WritableNativeArray array = new WritableNativeArray();
            for (Map.Entry<String, List<JSONObject>> entry : map.entrySet()) {
                WritableNativeArray itemArray = new WritableNativeArray();
                for (int i = 0; i < entry.getValue().size(); i++) {
                    JSONObject jsonObject = entry.getValue().get(i);
                    WritableNativeMap writableNativeMap = new WritableNativeMap();
                    writableNativeMap.putString("time", jsonObject.optString("time"));
                    writableNativeMap.putString("timeLong", jsonObject.optString("timeLong"));
                    writableNativeMap.putString("content", jsonObject.optString("content"));
                    writableNativeMap.putString("nickName", jsonObject.optString("nickName"));
                    writableNativeMap.putString("headerUrl", jsonObject.optString("headerUrl"));
                    writableNativeMap.putString("msgId", jsonObject.optString("msgId"));
                    writableNativeMap.putString("from", jsonObject.optString("from"));
                    itemArray.pushMap(writableNativeMap);
                }
                WritableNativeMap itemMap = new WritableNativeMap();
                itemMap.putArray("data", itemArray);
                itemMap.putString("key", entry.getKey());
                array.pushMap(itemMap);

            }
            cMap.putBoolean("ok", true);
            cMap.putArray("data", array);
            callback.invoke(cMap);


        } catch (Exception e) {
            Logger.i("会话内搜索:" + e.getMessage());
        }

    }

    /**
     * 搜索远程文本数据
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void searchRemoteMessageByKeyword(ReadableMap params, Callback callback) {
        String keyword = params.getString("search");
        //暂时测试数据 搜索我自己
        keyword = "我";
        String xmppid = params.getString("xmppid");
        String realjid = params.getString("realjid");
        String time = params.getString("time");
        String chatType = params.getString("chatType");
        try {
//            WritableNativeArray writableNativeArray = new WritableNativeArray();
            JSONArray list = IMDatabaseManager.getInstance().selectMessageByKeyWord(keyword, xmppid, realjid);
            Map<String, List<JSONObject>> map = new LinkedHashMap<>();
            for (int i = 0; i < list.length(); i++) {
                JSONObject imMessage = list.getJSONObject(i);
                String timeStr = getTimeStr(imMessage.getLong("timeLong"));
                List<JSONObject> oldList = map.get(timeStr);
                if (oldList != null) {
                    oldList.add(imMessage);
                } else {
                    List<JSONObject> newList = new ArrayList<>();
                    newList.add(imMessage);
                    map.put(timeStr, newList);

                }
            }

            WritableNativeMap cMap = new WritableNativeMap();
            WritableNativeArray array = new WritableNativeArray();
            for (Map.Entry<String, List<JSONObject>> entry : map.entrySet()) {
                WritableNativeArray itemArray = new WritableNativeArray();
                for (int i = 0; i < entry.getValue().size(); i++) {
                    JSONObject jsonObject = entry.getValue().get(i);
                    WritableNativeMap writableNativeMap = new WritableNativeMap();
                    writableNativeMap.putString("time", jsonObject.optString("time"));
                    writableNativeMap.putString("timeLong", jsonObject.optString("timeLong"));
                    writableNativeMap.putString("content", jsonObject.optString("content"));
                    writableNativeMap.putString("nickName", jsonObject.optString("nickName"));
                    writableNativeMap.putString("headerUrl", jsonObject.optString("headerUrl"));
                    writableNativeMap.putString("msgId", jsonObject.optString("msgId"));
                    writableNativeMap.putString("from", jsonObject.optString("from"));
                    itemArray.pushMap(writableNativeMap);
                }
                WritableNativeMap itemMap = new WritableNativeMap();
                itemMap.putArray("data", itemArray);
                itemMap.putString("key", entry.getKey());
                array.pushMap(itemMap);

            }
            cMap.putBoolean("ok", true);
            cMap.putArray("data", array);
            callback.invoke(cMap);


        } catch (Exception e) {
            Logger.i("会话内搜索:" + e.getMessage());
        }
    }

    @ReactMethod
    public void openChatForLocalSearch(String xmppid, String realjid, String chatType, String time) {
        NativeApi.openChatForLocalSearch(xmppid, realjid, chatType, time);
    }

    @ReactMethod
    public void openLocalSearchImage(String xmppid, String realjid) {
        NativeApi.openLocalSearchImage(xmppid, realjid);
    }

    @ReactMethod
    public void searchFilesByXmppId(String xmppid, Callback callback) {
        WritableNativeArray writableNativeArray = new WritableNativeArray();
        JSONArray jsonArray = ConnectionUtil.getInstance().searchFilesMsgByXmppid(xmppid);
        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                WritableNativeMap writableNativeMap = new WritableNativeMap();
                writableNativeMap.putString("from", jsonObject.optString("from"));
                writableNativeMap.putString("content", jsonObject.optString("content"));
                writableNativeMap.putString("time", jsonObject.optString("time"));
                writableNativeMap.putString("name", jsonObject.optString("name"));
                writableNativeMap.putString("headerSrc", jsonObject.optString("headerSrc"));
                writableNativeArray.pushMap(writableNativeMap);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
        if (callback != null) {
            WritableNativeMap map = new WritableNativeMap();
            map.putArray("files", writableNativeArray);
            callback.invoke(map);
        }
    }

    /************************** Search end************************/


    public void updateMyPersonalInfo(final String selGravatarPath) {
//        if (gravatarView == null || TextUtils.isEmpty(gravatarView.getGravatarPath())) {
//            personalInfoView.setUpdateResult(false);
//        }

        final WritableNativeMap failure = new WritableNativeMap();
        failure.putBoolean("ok", false);
        sendEvent("imageUpdateStart", failure);
        if (TextUtils.isEmpty(selGravatarPath)) {
            sendEvent("imageUpdateEnd", failure);
            return;
        }
        final UploadImageRequest request = new UploadImageRequest();
        request.FileType = UploadImageRequest.LOGO;
        request.id = QtalkStringUtils.parseLocalpart(CurrentPreference.getInstance().getPreferenceUserId()) + ".gravatar";
        request.filePath = selGravatarPath;
        request.requestComplete = new IUploadRequestComplete() {
            @Override
            public void onRequestComplete(String id, final UploadImageResult result) {

                if (result != null && !TextUtils.isEmpty(result.httpUrl) && !result.httpUrl.contains("error")) {
                    final List<SetVCardData> datas = generateSetData(result.httpUrl, CurrentPreference.getInstance().getPreferenceUserId());
                    VCardAPI.setVCardInfo(datas, new ProtocolCallback.UnitCallback<SetVCardResult>() {
                        @Override
                        public void onCompleted(SetVCardResult setVCardResult) {
                            if (setVCardResult != null && !ListUtil.isEmpty(setVCardResult.data)) {
                                SetVCardResult.SetVCardItem data = setVCardResult.data.get(0);
                                if (data == null || TextUtils.isEmpty(data.version) ||
                                        data.version.equals("-1")) {

                                    sendEvent("imageUpdateEnd", failure);
                                    //失败
//                                    personalInfoView.setUpdateResult(false);
//                                    Toast.makeText(CommonConfig.globalContext,"更新失败",Toast.LENGTH_SHORT);
                                } else {
//                                    ProfileUtils.updateGVer(result.httpUrl,
//                                            data.version, null, CurrentPreference.getInstance().getPreferenceUserId());
                                    //此数据为更新成功后的头像地址
                                    String cacheUrl = QtalkStringUtils.
                                            getGravatar(result.httpUrl, true);
                                    File targetFile = MyDiskCache.getSmallFile(cacheUrl);
                                    File file = new File(selGravatarPath);
                                    file.renameTo(targetFile);
                                    InternDatas.JidToUrl.put(CurrentPreference.getInstance().getPreferenceUserId(), cacheUrl);
                                    WritableNativeMap success = new WritableNativeMap();
                                    ConnectionUtil.getInstance().updateUserImage(CurrentPreference.getInstance().getPreferenceUserId(), cacheUrl);
                                    success.putBoolean("ok", true);
                                    success.putString("headerUrl", cacheUrl);
                                    sendEvent("imageUpdateEnd", success);
//                                    personalInfoView.setUpdateResult(true);
//                                    Toast.makeText(CommonConfig.globalContext,"更新成功",Toast.LENGTH_SHORT);
                                    //成功
                                }
                            }
                        }

                        @Override
                        public void onFailure(String errMsg) {
//                            Toast.makeText(CommonConfig.globalContext,"更新失败",Toast.LENGTH_SHORT);
                            //失败
                            sendEvent("imageUpdateEnd", failure);
//                            personalInfoView.setUpdateResult(false);
                        }
                    });
                } else {
//                    Toast.makeText(CommonConfig.globalContext,"更新失败",Toast.LENGTH_SHORT);
                    //失败
                    sendEvent("imageUpdateEnd", failure);
//                    personalInfoView.setUpdateResult(false);
                }
            }

            @Override
            public void onError(String msg) {
                sendEvent("imageUpdateEnd", failure);
            }
        };

        CommonUploader.getInstance().setUploadImageRequest(request);
    }

    private static List<SetVCardData> generateSetData(String url, String userId) {
        SetVCardData vCardData = new SetVCardData();
        vCardData.url = url;
        vCardData.user = QtalkStringUtils.parseLocalpart(userId);
        vCardData.domain = QtalkNavicationService.getInstance().getXmppdomain();
        List<SetVCardData> list = new ArrayList<SetVCardData>(1);
        list.add(vCardData);
        return list;
    }

    /**
     * 格式化行程对象为rn map对象
     *
     * @param bean
     * @return
     */

    public WritableNativeMap getRNDataByTrip(CalendarTrip.DataBean.TripsBean bean) {
        WritableNativeMap map = new WritableNativeMap();
        map.putString("beginTime", bean.getBeginTime());
        map.putString("endTime", bean.getEndTime());
        map.putString("scheduleTime", bean.getScheduleTime());
        map.putString("tripType", bean.getTripType());
        map.putString("appointment", bean.getAppointment());
        map.putString("tripDate", bean.getTripDate());
        map.putString("tripId", bean.getTripId());
        map.putString("tripIntr", bean.getTripIntr());
        map.putString("tripInviter", bean.getTripInviter());
        map.putString("tripLocale", bean.getTripLocale());
        map.putString("tripLocaleNumber", bean.getTripLocaleNumber());
        map.putString("tripName", bean.getTripName());
        map.putString("tripRemark", bean.getTripRemark());
        map.putString("tripRoomNumber", bean.getTripRoomNumber());
        map.putString("tripRoom", bean.getTripRoom());
        WritableNativeArray members = new WritableNativeArray();
        for (int i = 0; i < bean.getMemberList().size(); i++) {
            CalendarTrip.DataBean.TripsBean.MemberListBean mb = bean.getMemberList().get(i);

            WritableNativeMap member = new WritableNativeMap();
            member.putString("memberId", mb.getMemberId());
            member.putString("memberState", mb.getMemberState());
            member.putString("memberStateDescribe", mb.getMemberStateDescribe());
            Nick nick = ConnectionUtil.getInstance().getNickById(mb.getMemberId());
            member.putString("memberName", nick.getName());
            member.putString("headerUrl", nick.getHeaderSrc());
            members.pushMap(member);
        }
        map.putArray("memberList", members);


        return map;
    }

    /**
     * 创建新的议程
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void createTrip(ReadableMap params, final Callback callback) {
        CalendarTrip.DataBean.TripsBean bean = new CalendarTrip.DataBean.TripsBean();
        if (params.hasKey("tripId")) {
            bean.setTripId(params.getString("tripId"));
        }
        bean.setOperateType(params.getString("operateType"));
        bean.setTripRoom(params.hasKey("tripRoom") ? params.getString("tripRoom") : "");
        bean.setBeginTime(params.getString("beginTime"));
        bean.setTripIntr(params.getString("tripIntr"));
        bean.setScheduleTime(params.getString("scheduleTime"));
        bean.setTripRoomNumber(params.hasKey("tripRoomNumber") ? params.getInt("tripRoomNumber") + "" : "");
        bean.setTripType(params.getInt("tripType") + "");
        bean.setAppointment(params.getString("appointment"));
        bean.setEndTime(params.getString("endTime"));
        bean.setTripDate(params.getString("tripDate"));
        bean.setTripLocale(params.hasKey("tripLocale") ? params.getString("tripLocale") : "");
        bean.setTripLocaleNumber(params.hasKey("tripLocaleNumber") ? params.getInt("tripLocaleNumber") + "" : "");
        bean.setTripName(params.getString("tripName"));
        bean.setTripInviter(CurrentPreference.getInstance().getPreferenceUserId());
        List<CalendarTrip.DataBean.TripsBean.MemberListBean> memberListBeanList = new ArrayList<>();
        boolean checkMe = false;
        for (int i = 0; i < params.getArray("memberList").size(); i++) {
            CalendarTrip.DataBean.TripsBean.MemberListBean member = new CalendarTrip.DataBean.TripsBean.MemberListBean();
            String memberId = params.getArray("memberList").getMap(i).getString("memberId");
            member.setMemberId(memberId);
            memberListBeanList.add(member);
            if (memberId.equals(CurrentPreference.getInstance().getPreferenceUserId())) {
                checkMe = true;
            }

        }
        if (!checkMe) {
            CalendarTrip.DataBean.TripsBean.MemberListBean my = new CalendarTrip.DataBean.TripsBean.MemberListBean();
            my.setMemberId(CurrentPreference.getInstance().getPreferenceUserId());
            memberListBeanList.add(my);
        }

        bean.setMemberList(memberListBeanList);
        bean.setUpdateTime(IMDatabaseManager.getInstance().selectUserTripVersion() + "");
        final WritableNativeMap map = new WritableNativeMap();
        HttpUtil.createTrip(bean, new ProtocolCallback.UnitCallback<CalendarTrip>() {
            @Override
            public void onCompleted(CalendarTrip calendarTrip) {
                IMDatabaseManager.getInstance().InsertTrip(calendarTrip);
                IMDatabaseManager.getInstance().insertUserTripVersion(Long.parseLong(calendarTrip.getData().getUpdateTime()));
                CalendarSynchronousUtil.bulkTrip(calendarTrip);
                map.putBoolean("ok", true);
                if (!TextUtils.isEmpty(calendarTrip.getErrmsg())) {
                    map.putString("errMsg", calendarTrip.getErrmsg());
                }
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                map.putString("errMsg", errMsg);
                callback.invoke(map);
            }
        });
    }


    /**
     * 查询用户的行车根据 整月查询
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void selectUserTripByDate(ReadableMap params, Callback callback) {
        String date = params.getString("showDate");
        List<CalendarTrip.DataBean.TripsBean> list = IMDatabaseManager.getInstance().SelectTripByYearMonth(date);
        Collections.sort(list, new Comparator<CalendarTrip.DataBean.TripsBean>() {
            @Override
            public int compare(CalendarTrip.DataBean.TripsBean lhs, CalendarTrip.DataBean.TripsBean rhs) {
                try {
                    if (DateUtil.string2Time(lhs.getBeginTime()).getTime() > DateUtil.string2Time(rhs.getBeginTime()).getTime()) {
                        return 1;
                    }
                    if (DateUtil.string2Time(lhs.getBeginTime()).getTime() < DateUtil.string2Time(rhs.getBeginTime()).getTime()) {
                        return -1;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });
        WritableNativeMap map = new WritableNativeMap();
        WritableNativeMap dataMap = new WritableNativeMap();
        WritableNativeMap.setUseNativeAccessor(true);
        WritableNativeArray.setUseNativeAccessor(true);
        Map<String, List<WritableNativeMap>> localMap = new HashMap<>();

//        map.putBoolean("ok", true);

        for (int i = 0; i < list.size(); i++) {
            CalendarTrip.DataBean.TripsBean bean = list.get(i);
            if (!localMap.containsKey(bean.getTripDate())) {
//                WritableNativeArray newArray = new WritableNativeArray();
                List<WritableNativeMap> newArray = new ArrayList<>();
                newArray.add(getRNDataByTrip(bean));
                localMap.put(bean.getTripDate(), newArray);

            } else {
                List<WritableNativeMap> lastArray = localMap.get(bean.getTripDate());
                lastArray.add(getRNDataByTrip(bean));
                localMap.put(bean.getTripDate(), lastArray);
            }

        }

        for (Map.Entry<String, List<WritableNativeMap>> entry : localMap.entrySet()) {
            WritableNativeArray array = new WritableNativeArray();
            for (int i = 0; i < entry.getValue().size(); i++) {
                array.pushMap(entry.getValue().get(i));
            }
            dataMap.putArray(entry.getKey(), array);
        }


        map.putBoolean("ok", true);
        map.putMap("data", dataMap);
        callback.invoke(map);

    }

    /**
     * 根据时间区域查询可用会议室
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void getTripAreaAvailableRoom(ReadableMap params, final Callback callback) {
        final AvailableRoomRequest arr = new AvailableRoomRequest();
        arr.setDate(params.getString("date"));
        arr.setAreaId(params.getInt("areaId"));
        arr.setStartTime(params.getString("startTime"));
        arr.setEndTime(params.getString("endTime"));

        HttpUtil.getTripAreaAvailableRoom(arr, new ProtocolCallback.UnitCallback<AvailableRoomResponse>() {
            @Override
            public void onCompleted(AvailableRoomResponse availableRoomResponse) {
                WritableNativeMap map = new WritableNativeMap();
                WritableNativeArray array = new WritableNativeArray();
                for (int i = 0; i < availableRoomResponse.getData().size(); i++) {

                    WritableNativeMap item = new WritableNativeMap();
                    AvailableRoomResponse.DataBean data = availableRoomResponse.getData().get(i);
                    if (data.getCanUse() == 0) {
                        item.putInt("AddressNumber", arr.getAreaId());
                        item.putString("RoomName", data.getRoomName());
                        item.putInt("RoomNumber", data.getRoomId());
                        String str = data.getDescription();
                        if (str.length() > 15) {
                            str = str.substring(0, 15) + "...";
                        }
                        item.putString("RoomDetails", str);
                        item.putInt("RoomCapacity", data.getCapacity());
                        array.pushMap(item);
                    }

                }
                map.putBoolean("ok", true);
                map.putArray("roomList", array);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                WritableNativeMap noMap = new WritableNativeMap();
                noMap.putBoolean("ok", false);
                noMap.putString("errMsg", errMsg);
                callback.invoke(noMap);
            }
        });


    }


    /**
     * 获取日历功能城市列表
     *
     * @param callback
     */
    @ReactMethod
    public void getTripCity(Callback callback) {

        List<CityLocal.DataBean> list = IMDatabaseManager.getInstance().getCityList();
        WritableNativeMap map = new WritableNativeMap();
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            WritableNativeMap item = new WritableNativeMap();
            item.putString("CityName", list.get(i).getCityName());
            item.putInt("CityId", list.get(i).getId());
            array.pushMap(item);
        }
        map.putBoolean("ok", true);
        map.putArray("cityList", array);
        callback.invoke(map);

    }


    /**
     * 获取日历功能区域列表
     *
     * @param callback
     */
    @ReactMethod
    public void getTripArea(Callback callback) {
        List<AreaLocal.DataBean.ListBean> list = IMDatabaseManager.getInstance().getAreaList();
        WritableNativeMap map = new WritableNativeMap();
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            WritableNativeMap item = new WritableNativeMap();
            item.putString("AddressName", list.get(i).getAreaName());
            item.putInt("AddressNumber", list.get(i).getAreaID());
            item.putString("rStartTime", list.get(i).getMorningStarts());
            item.putString("rEndTime", list.get(i).getEveningEnds());
            array.pushMap(item);
        }
        map.putBoolean("ok", true);
        map.putArray("areaList", array);
        callback.invoke(map);


    }

    @ReactMethod
    public void getHotlineSeats(String customerName,String hotlineName,final Callback callback){
        HttpUtil.getHotlineSeats(customerName,hotlineName, new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                WritableNativeMap map = new WritableNativeMap();
                try{
                    String resultString = Protocol.parseStream(response);

                    if(!TextUtils.isEmpty(resultString)){
                        JSONObject jsonObject = new JSONObject(resultString);
                        map.putBoolean("ret",jsonObject.optBoolean("ret"));
                        map.putString("errmsg",jsonObject.optString("errmsg"));
                        JSONArray array = jsonObject.optJSONArray("data");
                        int size = array == null ? 0: array.length();
                        WritableNativeArray datas = new WritableNativeArray();
                        for(int i = 0;i<size;i++){
                            JSONObject item = array.getJSONObject(i);
                            WritableNativeMap data = new WritableNativeMap();
                            data.putString("userId",item.optString("userId"));
                            data.putString("userName",item.optString("userName"));
                            datas.pushMap(data);
                        }
                        map.putArray("data",datas);
                        callback.invoke(map);
                    }
                }catch (Exception e){

                }
            }

            @Override
            public void onFailure(Exception e) {
                Logger.e(e.getLocalizedMessage());
            }
        });
    }

    @ReactMethod
    public void transArtificial(String customerName,String hotlineName,String newCsrName,String reason,final Callback callback){
        HttpUtil.transArtificial(customerName,hotlineName,newCsrName,reason, new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                WritableNativeMap map = new WritableNativeMap();
                try{
                    String resultString = Protocol.parseStream(response);

                    if(!TextUtils.isEmpty(resultString)){
                        JSONObject jsonObject = new JSONObject(resultString);
                        map.putBoolean("ret",jsonObject.optBoolean("ret"));
                        map.putString("errmsg",jsonObject.optString("errmsg"));
                        callback.invoke(map);
                    }
                }catch (Exception e){

                }
            }

            @Override
            public void onFailure(Exception e) {
                Logger.e(e.getLocalizedMessage());
            }
        });
    }

    /**
     * 获取跨域列表
     * @param callback
     */
    @ReactMethod
    public void getDomainList(final Callback callback){
        HttpUtil.getDomainList(new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                WritableNativeMap map = new WritableNativeMap();
                try{
                    String resultString = Protocol.parseStream(response);

                    if(!TextUtils.isEmpty(resultString)){
                        JSONObject jsonObject = new JSONObject(resultString);
                        map.putBoolean("ret",jsonObject.optBoolean("ret"));
                        map.putString("errmsg",jsonObject.optString("errmsg"));
                        JSONArray array = jsonObject.optJSONObject("data").optJSONArray("domains");
                        int size = array == null ? 0: array.length();
                        WritableNativeArray domains = new WritableNativeArray();
                        for(int i = 0;i<size;i++){
                            JSONObject item = array.getJSONObject(i);
                            WritableNativeMap domain = new WritableNativeMap();
                            domain.putString("name",item.optString("name"));
                            domain.putString("description",item.optString("description"));
                            domain.putString("id",item.optString("id"));
                            domain.putString("url",item.optString("url"));
                            domains.pushMap(domain);
                        }
                        map.putArray("domains",domains);
                        callback.invoke(map);
                    }
                }catch (Exception e){

                }
            }

            @Override
            public void onFailure(Exception e) {

            }
        });
    }

    @ReactMethod
    public static void searchDomainUser(String url,String id,String key,int offset,int limit,final Callback callback){
        Map<String,String> params = new HashMap<>();
        params.put("id",id);
        params.put("key",key);
        params.put("offset",String.valueOf(offset));
        params.put("limit",String.valueOf(limit));
        HttpUtil.searchDomainUser(url, params, new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                try{
                    String resultString = Protocol.parseStream(response);
                    WritableNativeMap map = new WritableNativeMap();
                    if(!TextUtils.isEmpty(resultString)){
                        JSONObject jsonObject = new JSONObject(resultString);
                        map.putBoolean("ret",jsonObject.optBoolean("ret"));
                        map.putString("errmsg",jsonObject.optString("errmsg"));
                        JSONArray array = jsonObject.optJSONObject("data").optJSONArray("users");
                        int size = array == null ? 0: array.length();
                        WritableNativeArray users = new WritableNativeArray();
                        for(int i = 0;i<size;i++){
                            JSONObject item = array.getJSONObject(i);
                            WritableNativeMap user = new WritableNativeMap();
                            user.putString("icon",item.optString("icon"));
                            user.putString("label",item.optString("label"));
                            if(item.has("content"))
                                user.putString("content",item.optString("content"));
                            user.putString("uri",item.optString("uri"));
                            if(item.has("name"))
                                user.putString("name",item.optString("name"));
                            users.pushMap(user);
                        }
                        map.putArray("users",users);
                    }
                    callback.invoke(map);
                }catch (Exception e){

                }
            }

            @Override
            public void onFailure(Exception e) {
                Logger.i("searchDomainUser:" + e.getLocalizedMessage());
            }
        });
    }

    /**
     * 获取日历功能区域列表
     *
     * @param callback
     */
    @ReactMethod
    public void getNewTripArea(ReadableMap params, final Callback callback) {
        int cityId = params.getInt("cityId");

        HttpUtil.getNewArea(cityId, new ProtocolCallback.UnitCallback<AreaLocal>() {
            @Override
            public void onCompleted(AreaLocal areaLocal) {
                WritableNativeMap map = new WritableNativeMap();
                WritableNativeArray array = new WritableNativeArray();
                for (int i = 0; i < areaLocal.getData().getList().size(); i++) {
                    WritableNativeMap item = new WritableNativeMap();
                    item.putString("AddressName", areaLocal.getData().getList().get(i).getAreaName());
                    item.putInt("AddressNumber", areaLocal.getData().getList().get(i).getAreaID());
                    item.putString("rStartTime", areaLocal.getData().getList().get(i).getMorningStarts());
                    item.putString("rEndTime", areaLocal.getData().getList().get(i).getEveningEnds());
                    array.pushMap(item);
                }
                map.putBoolean("ok", true);
                map.putArray("areaList", array);
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {

            }
        });


//        List<AreaLocal.DataBean.ListBean> list = IMDatabaseManager.getInstance().getAreaList();
//        WritableNativeMap map = new WritableNativeMap();
//        WritableNativeArray array = new WritableNativeArray();
//        for (int i = 0; i < list.size(); i++) {
//            WritableNativeMap item = new WritableNativeMap();
//            item.putString("AddressName", list.get(i).getAreaName());
//            item.putInt("AddressNumber", list.get(i).getAreaID());
//            item.putString("rStartTime", list.get(i).getMorningStarts());
//            item.putString("rEndTime", list.get(i).getEveningEnds());
//            array.pushMap(item);
//        }
//        map.putBoolean("ok", true);
//        map.putArray("areaList", array);
//        callback.invoke(map);

    }

    /**
     * 查询本地会话内link
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void searchLocalLink(ReadableMap params, Callback callback) {
        try {
            String xmppId = params.getString("xmppid");
            String realjid = params.getString("realjid");
            String chatType = params.getString("chatType");
            String searchText = "";
            if (params.hasKey("searchText")) {
                searchText = params.getString("searchText");
            }

            Map<String, List<JSONObject>> map = new LinkedHashMap<>();
            JSONArray list = IMDatabaseManager.getInstance().searchLocalLinkMessageByXmppId(xmppId, realjid);
            for (int i = 0; i < list.length(); i++) {
                JSONObject imMessage = list.getJSONObject(i);
                JSONObject file = new JSONObject(imMessage.optString("ext"));
                String fileName = file.optString("title").toLowerCase();
                String nickName = imMessage.optString("nickName");
                if (!TextUtils.isEmpty(searchText)) {
                    if (!fileName.contains(searchText) && !nickName.contains(searchText)) {
                        continue;
                    }
                }
                String timeStr = getTimeStr(imMessage.getLong("timeLong"));
                List<JSONObject> oldList = map.get(timeStr);
                if (oldList != null) {
                    oldList.add(imMessage);
                } else {
                    List<JSONObject> newList = new ArrayList<>();
                    newList.add(imMessage);
                    map.put(timeStr, newList);

                }
            }

            WritableNativeMap cMap = new WritableNativeMap();
            WritableNativeArray array = new WritableNativeArray();
            for (Map.Entry<String, List<JSONObject>> entry : map.entrySet()) {
                WritableNativeArray itemArray = new WritableNativeArray();
                for (int i = 0; i < entry.getValue().size(); i++) {
                    JSONObject imMessage = entry.getValue().get(i);
                    WritableNativeMap item = new WritableNativeMap();
                    item.putString("linkDate", imMessage.optString("time"));
                    item.putString("timeLong", imMessage.optString("timeLong"));
                    JSONObject link = new JSONObject(imMessage.optString("ext"));
                    item.putString("linkTitle", link.optString("title"));
                    item.putString("linkUrl", link.optString("linkurl"));
                    String linkIcon = link.optString("img");
                    if (TextUtils.isEmpty(linkIcon)) {
                        linkIcon = defaultUserImage;
                    }
                    item.putString("linkIcon", linkIcon);

                    item.putString("content", imMessage.optString("ext"));
                    item.putString("nickName", imMessage.optString("nickName"));
                    item.putString("headerUrl", imMessage.optString("headerUrl"));
                    item.putString("msgId", imMessage.optString("msgId"));
                    item.putString("from", imMessage.optString("from"));
                    itemArray.pushMap(item);
                }
                WritableNativeMap itemMap = new WritableNativeMap();
                itemMap.putArray("data", itemArray);
                itemMap.putString("key", entry.getKey());
                array.pushMap(itemMap);

            }
            cMap.putBoolean("ok", true);
            cMap.putArray("data", array);
            callback.invoke(cMap);

        } catch (Exception e) {
            Logger.i("查询本地link出错:" + e.getMessage());
        }
    }

    /**
     * 查询本地会话内文件
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void searchLocalFile(ReadableMap params, Callback callback) {
        try {
            String xmppId = params.getString("xmppid");
            String realjid = params.getString("realjid");
            String chatType = params.getString("chatType");
            String searchText = "";
            if (params.hasKey("searchText")) {
                searchText = params.getString("searchText");
            }

            Map<String, List<JSONObject>> map = new LinkedHashMap<>();
            JSONArray list = IMDatabaseManager.getInstance().searchLocalFileMessageByXmppId(xmppId, realjid);
            for (int i = 0; i < list.length(); i++) {
                JSONObject imMessage = list.getJSONObject(i);
                JSONObject file = new JSONObject(imMessage.optString("ext"));
                String fileName = file.optString("FileName").toLowerCase();
                String nickName = imMessage.optString("nickName");
                if (!TextUtils.isEmpty(searchText)) {
                    if (!fileName.contains(searchText) && !nickName.contains(searchText)) {
                        continue;
                    }
                }
                String timeStr = getTimeStr(imMessage.getLong("timeLong"));
                List<JSONObject> oldList = map.get(timeStr);
                if (oldList != null) {
                    oldList.add(imMessage);
                } else {
                    List<JSONObject> newList = new ArrayList<>();
                    newList.add(imMessage);
                    map.put(timeStr, newList);

                }
            }

            WritableNativeMap cMap = new WritableNativeMap();
            WritableNativeArray array = new WritableNativeArray();
            for (Map.Entry<String, List<JSONObject>> entry : map.entrySet()) {
                WritableNativeArray itemArray = new WritableNativeArray();
                for (int i = 0; i < entry.getValue().size(); i++) {
                    JSONObject imMessage = entry.getValue().get(i);
                    WritableNativeMap item = new WritableNativeMap();
                    item.putString("time", imMessage.optString("time"));
                    item.putString("timeLong", imMessage.optString("timeLong"));
                    JSONObject file = new JSONObject(imMessage.optString("ext"));
                    item.putString("fileId", file.optString("FILEID"));
                    String fileName = file.optString("FileName").toLowerCase();

                    String fileType = "file";
                    if (fileName.endsWith("docx") || fileName.endsWith("doc")) {
                        fileType = "word";
                    } else if (fileName.endsWith("jpg") || fileName.endsWith("jpeg") || fileName.endsWith("gif") || fileName.endsWith("png")) {
                        fileType = "image";
                    } else if (fileName.endsWith("xlsx")) {
                        fileType = "excel";
                    } else if (fileName.endsWith("pptx") || fileName.endsWith("ppt")) {
                        fileType = "powerPoint";
                    } else if (fileName.endsWith("pdf")) {
                        fileType = "pdf";
                    } else if (fileName.endsWith("apk")) {
                        fileType = "apk";
                    } else if (fileName.endsWith("txt")) {
                        fileType = "txt";
                    } else if (fileName.endsWith("zip")) {
                        fileType = "zip";
                    }
                    item.putString("fileType", fileType);
                    item.putString("fileName", fileName);
                    item.putString("fileSize", file.optString("FileSize"));
                    String url = file.optString("HttpUrl");
                    if (url.startsWith("http")) {
                        item.putString("fileUrl", file.optString("HttpUrl"));
                    } else {
                        item.putString("fileUrl", QtalkNavicationService.getInstance().getInnerFiltHttpHost() + "/" + file.optString("HttpUrl"));
                    }

                    item.putString("content", imMessage.optString("ext"));
                    item.putString("nickName", imMessage.optString("nickName"));
                    item.putString("headerUrl", imMessage.optString("headerUrl"));
                    item.putString("msgId", imMessage.optString("msgId"));
                    item.putString("from", imMessage.optString("from"));
                    itemArray.pushMap(item);
                }
                WritableNativeMap itemMap = new WritableNativeMap();
                itemMap.putArray("data", itemArray);
                itemMap.putString("key", entry.getKey());
                array.pushMap(itemMap);

            }
            cMap.putBoolean("ok", true);
            cMap.putArray("data", array);
            callback.invoke(cMap);
        } catch (Exception e) {
            Logger.i("查找文件出错:" + e.getMessage());
        }
//        Logger.i("分组数据:" + JsonUtils.getGson().toJson(map));
//        new String();
    }

    /**
     * 获取时间文本
     *
     * @param time
     * @return
     */
    public String getTimeStr(long time) {
        //在这个方法里获取出来 如何获取今天,本周,本月的逻辑.
//        Long now = System.currentTimeMillis();
        if (com.qunar.im.utils.DateUtil.getToDayBeginTime() <= time && time <= com.qunar.im.utils.DateUtil.getToDayEndTime()) {
            return "今天";
        } else if (com.qunar.im.utils.DateUtil.getWeekStartTime() <= time && time <= com.qunar.im.utils.DateUtil.getWeekEndTime()) {
            Logger.i("是本周内的时间:" + time);
            return "本周";
        } else if (com.qunar.im.utils.DateUtil.getMonthBegin() <= time && time <= com.qunar.im.utils.DateUtil.getMonthEnd()) {
            Logger.i("是本月内的时间:" + time);
            return "本月";
        } else {

            SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月");

            String ymTime = df.format(new Date(time));

            return ymTime;
        }

    }


    /**
     * 打开日期选择器
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void openDatePicker(final ReadableMap params, final Callback callback) {
        TimePickerView tpv = new TimePickerBuilder(mActivity, new OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date, View v) {
//                Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();
            }
        }).build();

        tpv.show();
    }

    /**
     * 检查该用户此时间段内是否有冲突会议
     *
     * @param params
     * @param callback
     */
    @ReactMethod
    public void tripMemberCheck(final ReadableMap params, final Callback callback) {
        String checkId = params.getString("checkId");
        String beginTime = params.getString("beginTime");
        String endTime = params.getString("endTime");

        CalendarTrip.DataBean.TripsBean bean = new CalendarTrip.DataBean.TripsBean();
        bean.setCheckId(checkId);
        bean.setBeginTime(beginTime);
        bean.setEndTime(endTime);
        final WritableNativeMap map = new WritableNativeMap();
        HttpUtil.tripMemberCheck(bean, new ProtocolCallback.UnitCallback<TripMemberCheckResponse>() {
            @Override
            public void onCompleted(TripMemberCheckResponse tripMemberCheckResponse) {
                map.putBoolean("ok", true);
                map.putBoolean("isConform", tripMemberCheckResponse.getData().isIsConform());
                callback.invoke(map);
            }

            @Override
            public void onFailure(String errMsg) {
                map.putBoolean("ok", false);
                callback.invoke(map);
            }
        });

    }

    /**
     * 获取用户勋章
     *
     * @param xmppid
     * @param callback
     */
    @ReactMethod
    public void getUserMedal(String xmppid, Callback callback) {
//        xmppid = "dongzd.zhang@ejabhost1";
        final WritableNativeMap map = new WritableNativeMap();
        WritableNativeArray dataArray = parseUserMedalData(IMDatabaseManager.getInstance().getUserMedalsWithXmppId(xmppid));
        if (dataArray.size() > 0) {
            map.putArray("UserMedal", dataArray);
            callback.invoke(map);
        }

        if (!TextUtils.isEmpty(xmppid)) {
            final String finalXmppid = xmppid;
            HttpUtil.getRemoteUserMedalWithXmppJid(xmppid, new ProtocolCallback.UnitCallback<List<MedalsInfo>>() {
                @Override
                public void onCompleted(List<MedalsInfo> medalsInfos) {
                    if (medalsInfos.size() > 0) {


                        IMDatabaseManager.getInstance().bulkInsertUserMedalsWithData(medalsInfos);
                        WritableNativeArray array = parseUserMedalData(medalsInfos);
                        map.putString("UserId", finalXmppid);
                        map.putArray("UserMedals", array);
                        sendEvent("updateMedal", map);
                    }
                }

                @Override
                public void onFailure(String errMsg) {
                    Logger.i("获取勋章接口出现错误:" + errMsg);
                }
            });
        }
    }

    public WritableNativeArray parseUserMedalData(List<MedalsInfo> list) {
        WritableNativeArray array = new WritableNativeArray();
        for (int i = 0; i < list.size(); i++) {
            MedalsInfo medalsInfo = list.get(i);
            WritableNativeMap item = new WritableNativeMap();
            item.putString("UserId", medalsInfo.getXmppId());
            item.putString("type", medalsInfo.getType());
            item.putString("url", medalsInfo.getUrl());
            item.putString("desc", medalsInfo.getDesc());
            item.putString("LastUpdateTime", medalsInfo.getUpt());
            array.pushMap(item);
        }
        return array;
    }

    /**
     * 是否显示红点
     *
     * @param callback
     */
    @ReactMethod
    public void showRedView(Callback callback) {
        boolean show = DataUtils.getInstance(CommonConfig.globalContext).getPreferences("searchlocal", true);
        WritableNativeMap map = new WritableNativeMap();
        map.putBoolean("show", show);
//        map.putString("test","aaa");
        callback.invoke(map);
    }

    /**
     * 设置红点不在显示
     */
    @ReactMethod
    public void isShowRedView() {
        DataUtils.getInstance(CommonConfig.globalContext).putPreferences("searchlocal", false);
    }

    /**
     * RN点击埋点统计
     *
     * @param desc
     */
    @ReactMethod
    public void saveRNActLog(String eventId, String desc, String currentPage) {
        LogInfo logInfo = QLog.build(LogConstans.LogType.ACT, LogConstans.LogSubType.CLICK).eventId(eventId).describtion(desc).currentPage(currentPage);
        LogService.getInstance().saveLog(logInfo);
    }

    /**
     * 红包详情
     * @param rid
     * @param xmppid
     * @param isChatRoom
     * @param callback
     */
    @ReactMethod
    public void redEnvelopeGet(String rid,String xmppid,boolean isChatRoom,final Callback callback){
        final WritableNativeMap map = new WritableNativeMap();
        PayApi.red_envelope_get(xmppid, rid, isChatRoom, new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                try{
                    String resultString = Protocol.parseStream(response);
                    JSONObject result = new JSONObject(resultString);
                    if(result != null && result.optInt("ret") == 1){
                        JSONObject data = result.optJSONObject("data");
                        map.putBoolean("ok",true);
                        map.putString("credit",data.optString("credit"));
                        String user_id = data.optString("user_id");
                        ConnectionUtil.getInstance().getUserCard(QtalkStringUtils.userId2Jid(user_id), nick->{
                            map.putString("user_img",nick.getHeaderSrc());
                            map.putString("user_name",nick.getName());
                        });
                        map.putString("red_content",data.optString("red_content"));
                        map.putString("red_type",data.optString("red_type"));
                        map.putInt("over_time",data.optInt("grab_over_time"));
                        map.putInt("red_number",data.optInt("red_number"));
                        JSONArray array = data.optJSONArray("draw_record");
                        WritableNativeArray lists = new WritableNativeArray();
                        for(int i = 0; i<array.length(); i++){
                            JSONObject item = array.optJSONObject(i);
                            WritableNativeMap writableNativeMap = new WritableNativeMap();
                            writableNativeMap.putString("Credit",item.optString("credit"));
                            ConnectionUtil.getInstance().getUserCard(QtalkStringUtils.userId2Jid(item.optString("host_user_id")), nick->{
                                writableNativeMap.putString("Name",nick.getName());
                                writableNativeMap.putString("HeaderUri",nick.getHeaderSrc());
                            });
                            writableNativeMap.putString("Time",item.optString("draw_time"));
                            int rank = item.optInt("rank");
                            writableNativeMap.putString("Rank",rank == 1 ? "手气最佳" :"");
                            lists.pushMap(writableNativeMap);
                        }
                        map.putArray("redPackList",lists);
                        callback.invoke(map);
                    }else {
                        map.putBoolean("ok",false);
                        callback.invoke(map);
                    }
                }catch (Exception e){
                    map.putBoolean("ok",false);
                    callback.invoke(map);
                }
            }

            @Override
            public void onFailure(Exception e) {
                map.putBoolean("ok",false);
                callback.invoke(map);
            }
        });
    }

    /**
     * 我收到的红包
     * @param page
     * @param pagesie
     * @param year
     * @param callback
     */
    @ReactMethod
    public void redEnvelopeReceive(int page,int pagesie,int year,final Callback callback){
        final WritableNativeMap map = new WritableNativeMap();
        PayApi.red_envelope_receive(page, pagesie, year, new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                try{
                    String resultString = Protocol.parseStream(response);
                    JSONObject result = new JSONObject(resultString);
                    if(result != null && result.optInt("ret") == 1){
                        JSONObject data = result.optJSONObject("data");
                        JSONObject count = data.optJSONObject("count");
                        map.putBoolean("ok",true);
                        map.putString("total_credit",count.optString("total_credit"));
                        map.putString("count",count.optString("count"));
                        ConnectionUtil.getInstance().getUserCard(CurrentPreference.getInstance().getPreferenceUserId(), nick->{
                            map.putString("user_img",nick.getHeaderSrc());
                        });
                        JSONArray array = data.optJSONArray("list");
                        WritableNativeArray lists = new WritableNativeArray();
                        for(int i = 0; i<array.length(); i++){
                            JSONObject item = array.optJSONObject(i);
                            WritableNativeMap writableNativeMap = new WritableNativeMap();
                            writableNativeMap.putString("Credit",item.optString("credit"));
                            writableNativeMap.putString("Name",item.optString("realname"));
                            String host_user_id = item.optString("host_user_id");
                            ConnectionUtil.getInstance().getUserCard(host_user_id, nick-> {
                                writableNativeMap.putString("HeaderUri",nick.getHeaderSrc());
                            });
                            writableNativeMap.putString("Time",item.optString("draw_time"));
                            writableNativeMap.putString("Type",item.optString("red_type"));
                            lists.pushMap(writableNativeMap);
                        }
                        map.putArray("redPackList",lists);
                        callback.invoke(map);
                    }else {
                        map.putBoolean("ok",false);
                        callback.invoke(map);
                    }
                }catch (Exception e){
                    map.putBoolean("ok",false);
                    callback.invoke(map);
                }
            }

            @Override
            public void onFailure(Exception e) {
                map.putBoolean("ok",false);
                callback.invoke(map);
            }
        });
    }

    /**
     * 我发出去的红包
     * @param page
     * @param pagesie
     * @param year
     * @param callback
     */
    @ReactMethod
    public void redEnvelopeSend(int page,int pagesie,int year,final Callback callback){
        final WritableNativeMap map = new WritableNativeMap();
        PayApi.red_envelope_send(page, pagesie, year, new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                try{
                    String resultString = Protocol.parseStream(response);
                    JSONObject result = new JSONObject(resultString);
                    if(result != null && result.optInt("ret") == 1){
                        JSONObject data = result.optJSONObject("data");
                        JSONObject count = data.optJSONObject("count");
                        map.putBoolean("ok",true);
                        map.putString("total_credit",count.optString("total_credit"));
                        map.putString("count",count.optString("count"));
                        ConnectionUtil.getInstance().getUserCard(CurrentPreference.getInstance().getPreferenceUserId(), nick->{
                            map.putString("user_img",nick.getHeaderSrc());
                        });
                        JSONArray array = data.optJSONArray("list");
                        WritableNativeArray lists = new WritableNativeArray();
                        for(int i = 0; i<array.length(); i++){
                            JSONObject item = array.optJSONObject(i);
                            WritableNativeMap writableNativeMap = new WritableNativeMap();
                            writableNativeMap.putString("Credit",item.optString("credit"));
                            writableNativeMap.putString("Name",CurrentPreference.getInstance().getUserName());
                            writableNativeMap.putString("Time",item.optString("create_time"));
                            writableNativeMap.putString("Type",item.optString("red_type"));
                            writableNativeMap.putInt("Expire",item.optInt("is_expire"));
                            writableNativeMap.putInt("Number",item.optInt("red_number"));
                            writableNativeMap.putInt("Draw",item.optInt("draw_number"));
                            lists.pushMap(writableNativeMap);
                        }
                        map.putArray("redPackList",lists);
                        callback.invoke(map);
                    }else {
                        map.putBoolean("ok",false);
                        callback.invoke(map);
                    }
                }catch (Exception e){
                    map.putBoolean("ok",false);
                    callback.invoke(map);
                }
            }

            @Override
            public void onFailure(Exception e) {
                map.putBoolean("ok",false);
                callback.invoke(map);
            }
        });
    }

    private void sendPayFailNotification(){
        IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.PAY_FAIL,Constants.Alipay.PAY);
    }

    @ReactMethod
    public void createRedEnvelope(final ReadableMap params, final Callback callback){
        final WritableNativeMap map = new WritableNativeMap();
        PayApi.send_red_envelope(params.toHashMap(), new HttpRequestCallback() {
            @Override
            public void onComplete(InputStream response) {
                try{
                    String resultString = Protocol.parseStream(response);
                    JSONObject result = new JSONObject(resultString);
                    if(result != null && result.optInt("ret") == 1){
                        JSONObject data = result.optJSONObject("data");
                        String params = data.optString("pay_parmas");
                        if(!TextUtils.isEmpty(params)){//唤起支付宝授权登录
                            map.putBoolean("ok",true);
                            callback.invoke(map);
                            IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.PAY_ORDER,params);
                        }else {
                            callback.invoke(map);
                        }
                    }else {
                        callback.invoke(map);
                    }
                }catch (Exception e){
                    callback.invoke(map);
                }
            }

            @Override
            public void onFailure(Exception e) {
                callback.invoke(map);
            }
        });
    }


    @Override
    public void didReceivedNotification(String key, Object... args) {
        WritableNativeMap map = new WritableNativeMap();
        switch (key) {
            case QtalkEvent.UPDATE_MEDAL_SELF:

                List<UserHaveMedalStatus> userMedalList = IMDatabaseManager.getInstance().selectUserWearMedalStatusByUserid(CurrentPreference.getInstance().getUserid(),QtalkNavicationService.getInstance().getXmppdomain());
                WritableArray medalList = new WritableNativeArray();
                for (int i = 0; i < userMedalList.size(); i++) {
                    medalList.pushString(userMedalList.get(i).getSmallIcon());
                }
                map.putArray("medalList",medalList);
                map.putString("UserId",CurrentPreference.getInstance().getPreferenceUserId());
                sendEvent("updateMedalList",map);
//                map.putArray();
                break;

            case QtalkEvent.Remove_Session:
            case QtalkEvent.Destory_Muc:
                map.putString("groupId", (String) args[0]);
                sendEvent("Remove_Session", map);

                break;
            case QtalkEvent.Del_Muc_Register:
                map.putString("groupId", (String) args[0]);
                sendEvent("Del_Destory_Muc", map);
                break;
            case QtalkEvent.Update_Muc_Vcard:
                //更新群名片
                break;

            case QtalkEvent.IQ_CREATE_MUC:
                //收到创建群的返回,在sdk中判断了是否成功
                //成功才返回,这里直接返回创建群的id在根据id去设
                // 置一次群名片
                final String groupId = (String) args[0];
                SetMucVCardData setMucVCardData = new SetMucVCardData();
                setMucVCardData.muc_name = groupId;
                setMucVCardData.desc = "没有公告";

                inviteName = CurrentPreference.getInstance().getUserName() + "," + inviteName.trim().replaceAll(" ", ",");
                inviteName = inviteName.endsWith(",") ? inviteName.substring(0, inviteName.length() - 1) : inviteName;
                setMucVCardData.nick = inviteName;
                setMucVCardData.title = "欢迎加入";
//                //这张图片是各大群都默认的图,我也用!
                setMucVCardData.pic = QtalkNavicationService.getInstance().getInnerFiltHttpHost() + "/file/v2/download/perm/2227ff2e304cb44a1980e9c1a3d78164.png";
                List<SetMucVCardData> list = new ArrayList<>();
                list.add(setMucVCardData);

                HttpUtil.setMucVCard(list, new ProtocolCallback.UnitCallback<SetMucVCardResult>() {
                    @Override
                    public void onCompleted(SetMucVCardResult setMucVCardResult) {
                        if (setMucVCardResult != null && setMucVCardResult.data != null && setMucVCardResult.data.size() > 0) {
//                            chatroomCreatedView.setResult(true, groupId);
                            //邀请人员

                            //用之前准备好的数据进行加人入群操作
                            ConnectionUtil.getInstance().inviteMessageV2(groupId, inviteUserList);
                        }
                    }

                    @Override
                    public void onFailure(String errMsg) {
//                        chatroomCreatedView.setResult(true, groupId);
                    }
                });
                break;

            //当加人完成时,通知rn界面
            case QtalkEvent.Muc_Invite_User_V2:
                map.putBoolean("createMuc", true);
                sendEvent("closeAddMembers", map);
                String opg = (String) args[0];
                if (createGroups != null && createGroups.containsKey(opg)) {
                    ReadableMap params = createGroups.get(opg);
                    if (params != null) {
                        openGroupChat(params, opg);
                        createGroups.remove(opg);
                    }
                } else {
                    NativeApi.openGroupChat(opg, opg);
                }
                break;
            case QtalkEvent.GravanterSelected:
                File tempFile = (File) args[0];
                if (tempFile != null && tempFile.exists()) {
//                    progressDialog.show();
                    String selGravatarPath = tempFile.getPath();
                    updateMyPersonalInfo(selGravatarPath);
                }
                break;
            case QtalkEvent.FEED_BACK_RESULT:
                boolean result = (boolean) args[0];
                toast(result ? "反馈成功,谢谢您的反馈!" : "oops反馈失败,请重试!");
                break;

            case QtalkEvent.SELECT_DATE:
                String date = (String) args[0];
                map.putString("date", date);
                sendEvent("nativeSelectDate", map);
                break;
            case QtalkEvent.Group_Member_Update:
                String gid = (String) args[0];
                getGroupMemberFromDB(gid, null);
                break;

            case QtalkEvent.WORK_WORLD_PERMISSIONS:
                String workWorldPermissions = (String) args[0];
                //todo这里发通知  告知一下
                break;
            case QtalkEvent.PAY_SUCCESS:
                sendEvent("paySuccessNotify",map);
                break;

        }
    }
}