// Copyright (c) 2022 NetEase, Inc. All rights reserved. // Use of this source code is governed by a MIT license that can be // found in the LICENSE file. package com.dskj.rbchat; import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_FUN_TEAM_SETTING_PAGE; import android.app.Activity; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.os.Bundle; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import com.dskj.rbchat.imkit.team.TeamAnnouncementActivity; import com.dskj.rbchat.map.LocationPageActivity1; import com.dskj.rbchat.utils.GsonUtils; import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; import com.netease.yunxin.kit.chatkit.repo.ChatObserverRepo; import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; import com.netease.yunxin.kit.chatkit.ui.page.LocationPageActivity; import com.netease.yunxin.kit.conversationkit.ui.fun.viewholder.EmojiManager; import com.netease.yunxin.kit.corekit.im.model.EventObserver; import com.scwang.smart.refresh.footer.ClassicsFooter; import androidx.annotation.Nullable; import androidx.multidex.MultiDexApplication; import com.blankj.utilcode.util.LanguageUtils; import com.dskj.rbchat.contact.ContactGroupSettingActivity; import com.dskj.rbchat.contact.FunBlackListActivity; import com.dskj.rbchat.imkit.person.PersonSettingActivity; import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; import com.dskj.rbchat.imkit.team.TeamSettingActivity; import com.dskj.rbchat.main.MainActivity; import com.dskj.rbchat.main.mine.MineInfoActivity; import com.dskj.rbchat.contact.UserInfoActivity; import com.dskj.rbchat.model.AlbumBean; import com.dskj.rbchat.network.Api; import com.dskj.rbchat.network.BaseObserver; import com.dskj.rbchat.network.Result; import com.dskj.rbchat.push.PushMessageHandler; import com.dskj.rbchat.utils.Constant; import com.dskj.rbchat.utils.DataUtils; import com.dskj.rbchat.utils.LogUtils; import com.dskj.rbchat.voom.TiktoInfokActivity; import com.dskj.rbchat.welcome.WelcomeActivity; import com.heytap.msp.push.HeytapPushManager; import com.huawei.hms.support.common.ActivityMgr; import com.iflytek.sparkchain.core.LLM; import com.iflytek.sparkchain.core.LLMConfig; import com.iflytek.sparkchain.core.Memory; import com.iflytek.sparkchain.core.SparkChain; import com.iflytek.sparkchain.core.SparkChainConfig; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.SDKOptions; import com.netease.nimlib.sdk.auth.LoginInfo; import com.netease.yunxin.kit.alog.ALog; import com.netease.yunxin.kit.chatkit.ui.common.RxBus; import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; import com.netease.yunxin.kit.chatkit.ui.fun.page.FunChatSettingActivity; import com.netease.yunxin.kit.chatkit.ui.model.RxBusToVoom; import com.netease.yunxin.kit.common.ui.utils.ToastX; import com.netease.yunxin.kit.contactkit.ui.ContactConstant; import com.netease.yunxin.kit.corekit.im.IMKitClient; import com.netease.yunxin.kit.corekit.im.repo.SettingRepo; import com.netease.yunxin.kit.corekit.im.utils.IMKitUtils; import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; import com.netease.yunxin.kit.corekit.route.XKitRouter; import com.netease.yunxin.kit.locationkit.LocationKitClient; import com.tencent.bugly.crashreport.CrashReport; import com.vivo.push.PushClient; import com.vivo.push.util.VivoPushException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import cn.jiguang.api.JCoreInterface; import cn.jiguang.api.utils.JCollectionAuth; import cn.jpush.android.api.JPushInterface; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; public class IMApplication extends MultiDexApplication { private static final String TAG = "IMApplication"; private static boolean coldStart = false; private static int foregroundActCount = 0; public static final int LOGIN_PARENT_SCOPE = 2; public static final int LOGIN_SCOPE = 7; public static IMApplication AppContext; public LLM llm; public static String schemeUserId = null; public static String schemeTeamId = null; public static String schemeSilverQrCode = null; public static IMApplication getInstance() { return AppContext; } @Override public void onCreate() { super.onCreate(); ALog.d(Constant.PROJECT_TAG, TAG, "onCreate"); //app init registerActivityLifeCycle(); // AppCrashHandler.getInstance().initCrashHandler(this); // Thread.setDefaultUncaughtExceptionHandler(AppCrashHandler.getInstance()); AppContext = this; initUIKit(); // temp register for mine registerRouter(); CrashReport.initCrashReport(getApplicationContext(), "29ecb7c2d2", true); initLang(); initAiSDK(); JPushInterface.setDebugMode(BuildConfig.DEBUG); JPushInterface.init(this); // JCoreInterface.testCountryCode(this, "us"); // String id = JPushInterface.getRegistrationID(this); // LogUtils.d("id===" + id); JCollectionAuth.setAuth(this, true); //如初始化被拦截过,将重试初始化过程 RxBus.getInstance().toObservable(RxBusToVoom.class) .subscribeOn(rx.schedulers.Schedulers.io()) .unsubscribeOn(rx.schedulers.Schedulers.io()) .subscribe(changeImageViewBean -> {//回顶部 getPostInfo(changeImageViewBean); }); initFooter(); EmojiManager.init(this); } public void initFooter() { ClassicsFooter.REFRESH_FOOTER_PULLING = getResources().getString(R.string.srl_footer_pulling);//"上拉加载更多"; ClassicsFooter.REFRESH_FOOTER_RELEASE = getResources().getString(R.string.srl_footer_release);//"释放立即加载"; ClassicsFooter.REFRESH_FOOTER_LOADING = getResources().getString(R.string.srl_footer_loading);//"正在刷新..."; ClassicsFooter.REFRESH_FOOTER_REFRESHING = getResources().getString(R.string.srl_footer_refreshing);//"正在加载..."; ClassicsFooter.REFRESH_FOOTER_FINISH = getResources().getString(R.string.srl_footer_finish);//"加载完成"; ClassicsFooter.REFRESH_FOOTER_FAILED = getResources().getString(R.string.srl_footer_failed);//"加载失败"; ClassicsFooter.REFRESH_FOOTER_NOTHING = getResources().getString(R.string.srl_footer_nothing);//"全部加载完成"; } private void getPostInfo(RxBusToVoom attachment) { Api.getInstance().postsInfo(attachment.getPostId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BaseObserver>() { @Override public void onSuccess(Result feedbackResp) { AlbumBean albumBean = feedbackResp.data; Intent intent = new Intent(getAppContext(), TiktoInfokActivity.class); intent.putExtra("bean", albumBean); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getAppContext().startActivity(intent); } @Override public void onError(int code, String msg) { ToastX.showShortToast(msg); } }); } public void registerRouter() { XKitRouter.registerRouter(RouterConstant.PATH_MINE_INFO_PAGE, MineInfoActivity.class); XKitRouter.registerRouter( RouterConstant.PATH_CONTACT_SELECTOR_PAGE, FunContactSelectorActivity.class); XKitRouter.registerRouter( RouterConstant.PATH_FUN_CONTACT_SELECTOR_PAGE, FunContactSelectorActivity.class); // XKitRouter.registerRouter(RouterConstant.PATH_ADD_FRIEND_PAGE, FunAddFriendActivity.class); // XKitRouter.registerRouter(RouterConstant.PATH_FUN_ADD_FRIEND_PAGE, FunAddFriendActivity.class); XKitRouter.registerRouter(RouterConstant.PATH_FUN_USER_INFO_PAGE, UserInfoActivity.class); XKitRouter.registerRouter(RouterConstant.PATH_USER_INFO_PAGE, UserInfoActivity.class); XKitRouter.registerRouter(ContactConstant.PATH_FUN_CREATE_GROUP_PAGE, ContactGroupSettingActivity.class); // XKitRouter.registerRouter(PATH_FUN_TEAM_SETTING_PAGE, FunTeamSettingActivity.class); XKitRouter.registerRouter(RouterConstant.PATH_FUN_TEAM_SETTING_PAGE, TeamSettingActivity.class); XKitRouter.registerRouter(ChatKitUIConstant.PATH_FUN_TEAM_ANNOUNCEMENT_PAGE, TeamAnnouncementActivity.class); XKitRouter.registerRouter(RouterConstant.PATH_FUN_CHAT_SETTING_PAGE, PersonSettingActivity.class); // XKitRouter.registerRouter(RouterConstant.PATH_CHAT_SETTING_PAGE, FunChatSettingActivity.class); XKitRouter.registerRouter(RouterConstant.PATH_FUN_MY_BLACK_PAGE, FunBlackListActivity.class); XKitRouter.registerRouter(RouterConstant.PATH_CHAT_LOCATION_PAGE, LocationPageActivity1.class); XKitRouter.registerRouter("locationPage", LocationPageActivity.class); } public void initAiSDK() { // 初始化SDK,Appid等信息在清单中配置 SparkChainConfig sparkChainConfig = SparkChainConfig.builder(); sparkChainConfig.appID(IMUIKitConfig.AI_APPID) .apiKey(IMUIKitConfig.AI_APIKEY) .apiSecret(IMUIKitConfig.AI_APISECRET)//应用申请的appid三元组 .logLevel(0); int ret = SparkChain.getInst().init(getApplicationContext(), sparkChainConfig); if (ret == 0) { Log.d(TAG, "SDK初始化成功:" + ret); LLMConfig llmConfig = LLMConfig.builder(); llmConfig.domain("generalv3"); // llmConfig.url("ws(s)://spark-api.xf-yun.com/v3.1/chat"); //memory有两种,windows_memory和tokens_memory,二选一即可 Memory window_memory = Memory.windowMemory(5); llm = new LLM(llmConfig, window_memory); // Memory tokens_memory = Memory.tokenMemory(8192); // llm = new LLM(llmConfig,tokens_memory); } } private void initLang() { if (DataUtils.get(getAppContext(), "locale", -1) == -1) {//如果一次都没有设置,则需要默认设置一次,以便Activity中生效 // PreferencesToolkits.getNew(getAppContext(),"locale",0); if (Locale.getDefault().getCountry().equals(Locale.TAIWAN.getCountry())) { DataUtils.set(getAppContext(), "locale", 0); } else if (Locale.getDefault().equals(Locale.ENGLISH)) { DataUtils.set(getAppContext(), "locale", 2); } else if (Locale.getDefault().equals(Locale.JAPANESE)) { DataUtils.set(getAppContext(), "locale", 3); } else { DataUtils.set(getAppContext(), "locale", 1); } } int loc = DataUtils.get(getAppContext(), "locale", -1); ChatDataUtils.set(getAppContext(), "locale", loc); LogUtils.i("下标:" + loc); switch (loc) { case 0: LanguageUtils.updateAppContextLanguage(Locale.TRADITIONAL_CHINESE, null); applyLanguage(Resources.getSystem(), Locale.TRADITIONAL_CHINESE); //修复StringUtils获取string的语言 applyLanguage(this.getResources(), Locale.TRADITIONAL_CHINESE); break; case 1: LanguageUtils.updateAppContextLanguage(Locale.CHINESE, null); applyLanguage(Resources.getSystem(), Locale.CHINESE); //修复StringUtils获取string的语言 applyLanguage(this.getResources(), Locale.CHINESE); break; case 2: LanguageUtils.updateAppContextLanguage(Locale.ENGLISH, null); applyLanguage(Resources.getSystem(), Locale.ENGLISH); //修复StringUtils获取string的语言 applyLanguage(this.getResources(), Locale.ENGLISH); break; case 3: LanguageUtils.updateAppContextLanguage(Locale.JAPANESE, null); applyLanguage(Resources.getSystem(), Locale.JAPANESE); //修复StringUtils获取string的语言 applyLanguage(this.getResources(), Locale.JAPANESE); //修复StringUtils获取string的语言 break; } } //设置当前语言 public static void applyLanguage(Resources resources, Locale locale) { Locale.setDefault(locale); Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); config.locale = locale; resources.updateConfiguration(config, dm); } private void initUIKit() { SDKOptions options = NimSDKOptionConfig.getSDKOptions(this, DataUtils.readAppKey(this)); IMKitClient.init(this, null, options); ALog.d(Constant.PROJECT_TAG, TAG, "initUIKit"); if (IMKitUtils.isMainProcess(this)) { ALog.d(Constant.PROJECT_TAG, TAG, "initUIKit:isMainProcess"); LocationKitClient.init(this); //huawei push ActivityMgr.INST.init(this); //oppo push HeytapPushManager.init(this, true); try { //vivo push PushClient.getInstance(this).initialize(); } catch (VivoPushException e) { e.printStackTrace(); } IMKitClient.toggleNotification(SettingRepo.isPushNotify()); IMKitClient.registerMixPushMessageHandler(new PushMessageHandler()); SettingRepo.setShowReadStatus(false); IMKitClient.getStatus(); } } // 如果返回值为 null,则全部使用默认参数。 private SDKOptions options() { SDKOptions options = new SDKOptions(); //此处仅设置appkey,其他设置请自行参看信令文档设置 :https://dev.yunxin.163.com/docs/product/信令/SDK开发集成/Android开发集成/初始化 options.appKey = "4cb6b0998f9e7af9d7673963e429959a"; return options; } public static Context getAppContext() { return AppContext; } public final List activities = new ArrayList<>(); //用于系统杀死应用之后,系统恢复应用,可能存在没有登录的异常 //此处如果在没有登录的情况下,其他页面打开的时候进行finish();除了MainActivity //MainActivity启动进行登录检测,如果没有登录进行登录操作 private void registerActivityLifeCycle() { registerActivityLifecycleCallbacks( new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { if (TextUtils.isEmpty(IMKitClient.account()) && !(activity instanceof MainActivity || activity instanceof WelcomeActivity) && !coldStart) { activity.finish(); } else { activities.add(activity); } } @Override public void onActivityStarted(Activity activity) { foregroundActCount++; closeNotify(); } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { foregroundActCount--; } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { if (activities.isEmpty()) { return; } activities.remove(activity); } }); } public void removeAllActivity() { while (activities.size() > 0) { try { activities.get(activities.size() - 1).finish(); activities.remove(activities.size() - 1); } catch (Exception e) { e.printStackTrace(); } } } private void closeNotify() { NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.cancelAll(); } public void clearActivity(Activity exclude) { for (int i = 0; i < activities.size(); i++) { if (activities.get(i) != null && activities.get(i) != exclude) { activities.get(i).finish(); } } } public static void setColdStart(boolean value) { coldStart = value; } @Override public void onTerminate() { super.onTerminate(); SparkChain.getInst().unInit(); foregroundActCount = 0; } public static int getForegroundActCount() { return foregroundActCount; } }