package com.qunar.rn_service.rnplugins; import android.text.TextUtils; import android.util.Base64; 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.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.LogInfo; import com.qunar.im.base.module.FoundConfiguration; import com.qunar.im.base.module.Nick; import com.qunar.im.base.module.ReleaseContentData; import com.qunar.im.base.module.SearchKeyData; import com.qunar.im.base.module.WorkWorldItem; import com.qunar.im.base.module.WorkWorldNoticeItem; import com.qunar.im.base.module.WorkWorldResponse; import com.qunar.im.base.protocol.Protocol; import com.qunar.im.base.protocol.ProtocolCallback; import com.qunar.im.base.structs.TransitFileJSON; import com.qunar.im.base.util.DataUtils; import com.qunar.im.base.util.HanziToPinyin; import com.qunar.im.base.util.IMUserDefaults; import com.qunar.im.base.util.JsonUtils; 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.log.LogConstans; import com.qunar.im.log.LogService; import com.qunar.im.log.QLog; import com.qunar.im.permission.PermissionCallback; import com.qunar.im.protobuf.Event.QtalkEvent; import com.qunar.im.protobuf.common.CurrentPreference; import com.qunar.im.utils.ConnectionUtil; import com.qunar.im.utils.HttpUtil; import com.qunar.im.utils.MD5; import com.qunar.im.utils.QtalkStringUtils; import com.qunar.im.base.protocol.NativeApi; import java.util.HashMap; import java.util.List; import java.util.Map; public class QtalkPlugin extends ReactContextBaseJavaModule implements IMNotificaitonCenter.NotificationCenterDelegate, PermissionCallback { public QtalkPlugin(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "QtalkPlugin"; } @Override public void didReceivedNotification(String key, Object... args) { } @Override public void responsePermission(int requestCode, boolean granted) { } /** * 浏览大图 图片 * * @param params imageUrl为图片地址 * @param callback */ @ReactMethod public void browseBigImage(ReadableMap params, Callback callback) { if (params.hasKey("imageUrl")) { String imageUrl = params.getString("imageUrl"); if (TextUtils.isEmpty(imageUrl)) { } else { NativeApi.openBigImage(imageUrl, MyDiskCache.getSmallFile(imageUrl + "&w=96&h=96").getAbsolutePath()); } } } /** * 打开文件下载 * * @param params fileUrl为文件下载地址 * @param callback */ @ReactMethod public void openDownLoad(ReadableMap params, Callback callback) { if (params.hasKey("httpUrl") && params.hasKey("fileName") && params.hasKey("fileSize")) { String httpUrl = params.getString("httpUrl"); String baseHttpUrl = Base64.encodeToString(httpUrl.replace(" ", "").getBytes(), Base64.NO_PADDING); String aaa = new String(Base64.decode(baseHttpUrl, Base64.NO_PADDING)); String bbb = new String(Base64.decode(baseHttpUrl.getBytes(), Base64.NO_PADDING)); String fileName = params.getString("fileName"); String md5 = ""; boolean nogetMd5 = true; if (params.hasKey("fileMD5")) { md5 = params.getString("fileMD5"); } if (params.hasKey("isQtalkNative")) { nogetMd5 = !params.getBoolean("isQtalkNative"); } String fileSize = ""; try { fileSize = params.getString("fileSize"); } catch (Exception e) { fileSize = params.getInt("fileSize") + ""; } if (!TextUtils.isEmpty(httpUrl) && !TextUtils.isEmpty(fileName) && !TextUtils.isEmpty(fileSize)) { // String fileID = params.getString("fileId"); // String fileMD5 = params.getString("fileMD5"); TransitFileJSON transitFileJSON = new TransitFileJSON(); transitFileJSON.HttpUrl = baseHttpUrl; transitFileJSON.FileName = fileName; transitFileJSON.FileSize = fileSize; transitFileJSON.FILEMD5 = md5; transitFileJSON.noMD5 = nogetMd5; NativeApi.openFileDownLoad(transitFileJSON); } } } /** * 打开链接 */ @ReactMethod public void openNativeWebView(ReadableMap params) { String linkurl = params.getString("linkurl"); if (!TextUtils.isEmpty(linkurl)) { NativeApi.openWebPage(linkurl, true); } } /** * 获取用户信息回传 * * @param callback */ @ReactMethod public void getUserInfo(Callback callback) { 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 (!("ejabhost1".equals(QtalkNavicationService.getInstance().getXmppdomain()))) { // map.putInt("showOrganizational", 1); // } else { // map.putInt("showOrganizational", 0); // } map.putBoolean("showServiceState", CurrentPreference.getInstance().isMerchants()); map.putBoolean("isQtalk", CommonConfig.isQtalk); // map.putDouble("timestamp", System.currentTimeMillis()); callback.invoke(map); } public static String getCKey() { return Protocol.getCKEY(); } /** * 打开单人会话 */ @ReactMethod public void openSignleChat(ReadableMap params) { String jid = params.getString("UserId"); NativeApi.openSingleChat(jid, jid); } /** * 打开单人会话 */ @ReactMethod public void openGroupChat(ReadableMap params) { String jid = params.getString("GroupId"); NativeApi.openGroupChat(jid, jid); } /** * 获取指定联系人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()); WritableMap map = new WritableNativeMap(); map.putMap("nick", item); callback.invoke(map); } }, true, false); } /** * 展示手机号 * * @param params */ @ReactMethod public void showUserPhoneNumber(ReadableMap params) { String userId = params.getString("UserId"); NativeApi.openPhoneNumber(userId); } @ReactMethod public void gotoWiki(ReadableMap params) { NativeApi.openWebPage(QtalkNavicationService.getInstance().getWikiurl(), false); } @ReactMethod public void gotoNote(ReadableMap params) { NativeApi.openNoteBook(); } /** * 发送邮件 * * @param params */ @ReactMethod public void sendEmail(ReadableMap params) { String userId = params.getString("UserId"); //qtalk 暂时这么写 目前没有借口获取email后缀地址 userId = userId.substring(0, userId.lastIndexOf("@") + 1) + QtalkNavicationService.getInstance().getEmail(); NativeApi.openEmail(userId); } @ReactMethod public void getWorkWorldNotRead(ReadableMap params, final Callback callback) { if (!IMDatabaseManager.getInstance().SelectWorkWorldPremissions()) { return; } // boolean workWorldUnReadState = IMDatabaseManager.getInstance().SelectWorkWorldUnRead(); boolean workWorldUnReadState = false; int workWorldNoticeUnRead = IMDatabaseManager.getInstance().selectWorkWorldNotice(); final WritableMap map = new WritableNativeMap(); map.putString("notReadMsgCount", workWorldNoticeUnRead + ""); map.putString("showNewPost", workWorldUnReadState + ""); callback.invoke(map); } @ReactMethod public void getWorkWorldItem(ReadableMap params, final Callback callback) { if (!IMDatabaseManager.getInstance().SelectWorkWorldPremissions()) { return; } List<WorkWorldItem> list = ConnectionUtil.getInstance().selectHistoryWorkWorldItem(1, 0); if (list != null && list.size() > 0) { WorkWorldItem data = list.get(0); final WritableMap map = new WritableNativeMap(); final String owner = data.getOwner(); final String ownerHost = data.getOwnerHost(); map.putString("createTime", data.getCreateTime()); ReleaseContentData contentData = JsonUtils.getGson().fromJson(data.getContent(), ReleaseContentData.class); if (TextUtils.isEmpty(contentData.getContent())) { map.putString("content", "分享图片"); } else { map.putString("content", contentData.getContent()); } map.putString("postUUID", data.getUuid()); if (data.getIsAnonymous().equals("1")) { map.putString("name", data.getAnonymousName()); map.putString("photo", data.getAnonymousPhoto()); // sendEvent(cammReactInstanceManager.getCurrentReactContext(), "updateMomentsInfo", map); callback.invoke(map); } else { ConnectionUtil.getInstance().getUserCard(owner + "@" + ownerHost, new IMLogicManager.NickCallBack() { @Override public void onNickCallBack(Nick nick) { if (nick != null) { map.putString("name", nick.getName()); map.putString("photo", nick.getHeaderSrc()); map.putString("architecture", QtalkStringUtils.architectureParsing(nick.getDescInfo())); } else { map.putString("name", owner + "@" + ownerHost); map.putString("photo", ConnectionUtil.defaultUserImage); } // sendEvent(cammReactInstanceManager.getCurrentReactContext(), "updateMomentsInfo", map); callback.invoke(map); } }, false, false); } } HttpUtil.refreshWorkWorldV2(1, 0, 1, "", "", 0, true, new ProtocolCallback.UnitCallback<WorkWorldResponse>() { @Override public void onCompleted(WorkWorldResponse workWorldResponse) { try { WorkWorldItem data = workWorldResponse.getData().getNewPost().get(0); final WorkWorldNoticeItem item = new WorkWorldNoticeItem(); item.setOwner(data.getOwner()); item.setOwnerHost(data.getOwnerHost()); item.setCreateTime(data.getCreateTime()); ReleaseContentData contentData = JsonUtils.getGson().fromJson(data.getContent(), ReleaseContentData.class); if (TextUtils.isEmpty(contentData.getContent())) { item.setContent("分享图片"); } else { item.setContent(contentData.getContent()); } item.setPostUUID(data.getUuid()); item.setIsAnyonous(data.getIsAnonymous()); if (data.getIsAnonymous().equals("1")) { item.setAnyonousName(data.getAnonymousName()); item.setAnyonousPhoto(data.getAnonymousPhoto()); } IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.WORK_WORLD_FIND_NOTICE, item); final String navurl = DataUtils.getInstance(CommonConfig.globalContext).getPreferences(QtalkNavicationService.NAV_CONFIG_CURRENT_URL, ""); boolean show = IMUserDefaults.getStandardUserDefaults().getBooleanValue(CommonConfig.globalContext, com.qunar.im.protobuf.common.CurrentPreference.getInstance().getUserid() + QtalkNavicationService.getInstance().getXmppdomain() + CommonConfig.isDebug + MD5.hex(navurl) + "WORKWORLDSHOWUNREAD", false); if (show) { IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.WORK_WORLD_NOTICE); } else { boolean isHave = IMDatabaseManager.getInstance().selectHistoryWorkWorldItemIsHave(data); if (!isHave) { IMUserDefaults.getStandardUserDefaults().newEditor(CommonConfig.globalContext) .putObject(com.qunar.im.protobuf.common.CurrentPreference.getInstance().getUserid() + QtalkNavicationService.getInstance().getXmppdomain() + CommonConfig.isDebug + MD5.hex(navurl) + "WORKWORLDSHOWUNREAD", true) .synchronize(); IMNotificaitonCenter.getInstance().postMainThreadNotificationName(QtalkEvent.WORK_WORLD_NOTICE); // } } } catch (Exception e) { Logger.i("拿取最新一条朋友圈"); } } @Override public void onFailure(String errMsg) { } }); } /** * 弃用 * * @param params */ @ReactMethod public void openWorkWorld(ReadableMap params) { //弃用 NativeApi.openUserWorkWorld("", ""); //埋点统计 LogInfo logInfo = QLog.build(LogConstans.LogType.ACT, LogConstans.LogSubType.CLICK).eventId("tuocircle").describtion("打开驼圈").currentPage("发现页"); LogService.getInstance().saveLog(logInfo); } /** * 打开扫一扫 * * @param params */ @ReactMethod public void openScan(ReadableMap params) { NativeApi.openScan(); } /** * 打开笔记本 * * @param params */ @ReactMethod public void openNoteBook(ReadableMap params) { NativeApi.openNoteBook(); } /** * 打开文件传输 * * @param params */ @ReactMethod public void openFileTransfer(ReadableMap params) { String jid = "file-transfer" + "@" + QtalkNavicationService.getInstance().getXmppdomain(); NativeApi.openSingleChat(jid, jid); } /** * 打开行程 * * @param params */ @ReactMethod public void openTravelCalendar(ReadableMap params) { // NativeApi.openSingleChat("file-transfer@ejabhost1","file-transfer@ejabhost1"); NativeApi.openTravelCalendar(); } /** * 获取发现页数据 */ @ReactMethod public void getFoundInfo(Callback callback) { FoundConfiguration foundConfiguration = IMDatabaseManager.getInstance().SelectFoundConfiguration(); callback.invoke(parseFound(foundConfiguration)); HttpUtil.getFoundConfiguration(new ProtocolCallback.UnitCallback<FoundConfiguration>() { @Override public void onCompleted(FoundConfiguration foundConfiguration) { sendEvent("updateFound", parseFound(foundConfiguration)); } @Override public void onFailure(String errMsg) { } }); } /** * 进行网络请求 */ @ReactMethod public void getSearchInfo(String url, ReadableMap params, ReadableMap cookie, Callback callback1, final Callback callback2) { final WritableNativeMap map = new WritableNativeMap(); HttpUtil.PostUrl(url, params.toHashMap(), cookie.toHashMap(), new ProtocolCallback.UnitCallback<String>() { @Override public void onCompleted(String s) { map.putBoolean("isOk", true); map.putString("responseJson", s); callback2.invoke(map); } @Override public void onFailure(String errMsg) { map.putBoolean("isOk", false); map.putString("message", errMsg); callback2.invoke(map); } }); // } private WritableNativeMap parseFound(FoundConfiguration foundConfiguration) { WritableNativeMap map = new WritableNativeMap(); WritableNativeArray groupList = new WritableNativeArray(); for (int i = 0; i < foundConfiguration.getData().size(); i++) { FoundConfiguration.DataBean data = foundConfiguration.getData().get(i); WritableNativeMap item = new WritableNativeMap(); item.putString("groupIcon", data.getGroupIcon()); item.putInt("groupId", data.getGroupId()); item.putString("groupName", data.getGroupName()); WritableNativeArray array = new WritableNativeArray(); for (int j = 0; j < data.getMembers().size(); j++) { FoundConfiguration.DataBean.MembersBean membersBean = data.getMembers().get(j); WritableNativeMap mem = new WritableNativeMap(); mem.putString("memberAction", membersBean.getMemberAction()); mem.putString("memberIcon", membersBean.getMemberIcon()); mem.putString("memberName", membersBean.getMemberName()); mem.putInt("memberId", membersBean.getMemberId()); mem.putString("Entrance", membersBean.getEntrance()); mem.putString("Bundle", membersBean.getBundle()); mem.putString("Version", membersBean.getVersion() + ""); mem.putString("BundleUrls", membersBean.getBundleUrls()); mem.putString("Module", membersBean.getModule()); mem.putString("AppType", membersBean.getAppType() + ""); mem.putBoolean("showNativeNav", membersBean.isShowNativeNav()); mem.putString("navTitle", membersBean.getNavTitle()); mem.putString("appParams", membersBean.getProperties()); array.pushMap(mem); } item.putArray("members", array); groupList.pushMap(item); } map.putBoolean("isOk", true); map.putArray("data", groupList); return map; } /** * 展示搜索返回结果 * @param params */ @ReactMethod public void showSearchHistoryResult(ReadableMap params) { String body =params.getString("body"); String date=params.getString("date"); String extendinfo=params.getString("extendinfo"); String from=params.getString("from"); String icon=params.getString("icon"); String label=params.getString("label"); String msgid=params.getString("msgid"); String mtype=params.getString("mtype"); String realfrom=params.getString("realfrom"); String realto=params.getString("realto"); String time=params.getString("time"); String to=params.getString("to"); String todoType=params.getString("todoType"); String chatType = "0"; String jid = to; String realJid=realto; if(Integer.parseInt(todoType)==16){ jid = to; realJid = realto; chatType="1"; }else{ if(CurrentPreference.getInstance().getPreferenceUserId().equals(from)){ jid = to; realJid = realto; }else{ jid = from; realJid = realfrom; } chatType="0"; } NativeApi.showSearchHistoryResult(jid,realJid,chatType,time); } @ReactMethod public void getLocalSearchKeyHistory(ReadableMap params,Callback callback){ int limit = 5; int type = 0 ; List<SearchKeyData> list =IMDatabaseManager.getInstance().getLocalSearchKeyHistory(type ,limit); WritableNativeMap map = new WritableNativeMap(); map.putBoolean("isOk",true); WritableNativeArray array = new WritableNativeArray(); for (int i = 0; i < list.size(); i++) { array.pushString(list.get(i).getSearchKey()); } map.putArray("searchKeys",array); callback.invoke(map); } @ReactMethod public void updateLocalSearchKeyHistory(ReadableMap params){ // String searchKey = ''; // int searchType = 0; // long searchTime = 0l; Map<String,String> paramsData = new HashMap<>(); paramsData.put("searchKey",params.getString("searchKey")); paramsData.put("searchType",params.getInt("searchType")+""); paramsData.put("searchTime",System.currentTimeMillis()+""); IMDatabaseManager.getInstance().updateLocalSearchKeyHistory(paramsData); } @ReactMethod public void clearLocalSearchKeyHistory(int searchType){ IMDatabaseManager.getInstance().clearLocalSearchKeyHistory(searchType); } public void sendEvent(String eventName, WritableMap params) { getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName, params); } }