/* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package cn.wildfirechat.push; import android.app.ActivityManager; import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.text.TextUtils; import android.util.Log; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; import androidx.lifecycle.ProcessLifecycleOwner; import com.heytap.mcssdk.PushManager; import com.heytap.mcssdk.callback.PushCallback; import com.heytap.mcssdk.mode.SubscribeResult; import com.huawei.agconnect.config.AGConnectServicesConfig; import com.huawei.hms.aaid.HmsInstanceId; import com.huawei.hms.api.HuaweiApiClient; import com.huawei.hms.common.ApiException; import com.meizu.cloud.pushsdk.util.MzSystemUtils; import com.vivo.push.IPushActionListener; import com.vivo.push.PushClient; import com.xiaomi.mipush.sdk.MiPushClient; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Method; import java.util.List; import java.util.Properties; import cn.wildfirechat.PushType; import cn.wildfirechat.remote.ChatManager; /** * Created by heavyrain.lee on 2018/2/26. */ public class PushService { private HuaweiApiClient HMSClient; private boolean hasHMSToken; private PushServiceType pushServiceType; private static PushService INST = new PushService(); private static String applicationId; public enum PushServiceType { Unknown, Xiaomi, HMS, MeiZu, VIVO, OPPO } public static void init(Application gContext, String applicationId) { PushService.applicationId = applicationId; String sys = getSystem(); if (SYS_EMUI.equals(sys)) { INST.pushServiceType = PushServiceType.HMS; INST.initHMS(gContext); } else if (/*SYS_FLYME.equals(sys) && INST.isMZConfigured(gContext)*/MzSystemUtils.isBrandMeizu()) { INST.pushServiceType = PushServiceType.MeiZu; INST.initMZ(gContext); } else if (SYS_VIVO.equalsIgnoreCase(sys)) { INST.pushServiceType = PushServiceType.VIVO; INST.initVIVO(gContext); } else if (PushManager.isSupportPush(gContext)) { INST.pushServiceType = PushServiceType.OPPO; INST.initOPPO(gContext); } else /*if (SYS_MIUI.equals(sys) && INST.isXiaomiConfigured(gContext))*/ { //MIUI或其它使用小米推送 INST.pushServiceType = PushServiceType.Xiaomi; INST.initXiaomi(gContext); } ProcessLifecycleOwner.get().getLifecycle().addObserver(new LifecycleObserver() { @OnLifecycleEvent(Lifecycle.Event.ON_START) public void onForeground() { clearNotification(gContext); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void onBackground() { } }); } private static void clearNotification(Context context) { if (INST.pushServiceType == PushServiceType.Xiaomi) { MiPushClient.clearNotification(context); } else { // TODO } } public static void showMainActivity(Context context) { String action = applicationId + ".main"; Intent intent = new Intent(action); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } public static void didReceiveIMPushMessage(Context context, AndroidPushMessage pushMessage, PushServiceType pushServiceType) { PushMessageHandler.didReceiveIMPushMessage(context, pushMessage, pushServiceType); } public static void didReceivePushMessageData(Context context, String pushData) { PushMessageHandler.didReceivePushMessageData(context, pushData); } public static void destroy() { if (INST.HMSClient != null) { INST.HMSClient.disconnect(); INST.HMSClient = null; } } private boolean initXiaomi(Context context) { String packageName = context.getPackageName(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA); if (appInfo.metaData != null) { String appid = appInfo.metaData.getString("MIPUSH_APPID").substring(7); String appkey = appInfo.metaData.getString("MIPUSH_APPKEY").substring(7); if (!TextUtils.isEmpty(appid) && !TextUtils.isEmpty(appkey)) { if (shouldInitXiaomi(context)) { MiPushClient.registerPush(context, appid, appkey); return true; } } } } catch (Exception e) { e.printStackTrace(); } return false; } private boolean isXiaomiConfigured(Context context) { String packageName = context.getPackageName(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA); if (appInfo.metaData != null) { String appid = appInfo.metaData.getString("MIPUSH_APPID").substring(7); String appkey = appInfo.metaData.getString("MIPUSH_APPKEY").substring(7); return !TextUtils.isEmpty(appid) && !TextUtils.isEmpty(appkey); } } catch (Exception e) { e.printStackTrace(); } return false; } private boolean shouldInitXiaomi(Context context) { ActivityManager am = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)); List processInfos = am.getRunningAppProcesses(); String mainProcessName = context.getPackageName(); int myPid = android.os.Process.myPid(); for (ActivityManager.RunningAppProcessInfo info : processInfos) { if (info.pid == myPid && mainProcessName.equals(info.processName)) { return true; } } return false; } private void initHMS(final Context context) { String appId = AGConnectServicesConfig.fromContext(context).getString("client/app_id"); ChatManager.Instance().getWorkHandler().post(new Runnable() { @Override public void run() { try { String token = HmsInstanceId.getInstance(context).getToken(appId, "HCM"); if(!TextUtils.isEmpty(token)){ ChatManager.Instance().setDeviceToken(token, PushType.HMS); } } catch (ApiException e) { e.printStackTrace(); } } }); } private boolean isMZConfigured(Context context) { String packageName = context.getPackageName(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA); if (appInfo.metaData != null) { String appid = appInfo.metaData.getString("MEIZU_APP_ID"); String appkey = appInfo.metaData.getString("MEIZU_APP_KEY"); return !TextUtils.isEmpty(appid) && !TextUtils.isEmpty(appkey); } } catch (Exception e) { e.printStackTrace(); } return false; } private boolean initMZ(Context context) { String packageName = context.getPackageName(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA); if (appInfo.metaData != null) { String appId = "" + appInfo.metaData.get("MEIZU_PUSH_APP_ID"); String appKey = appInfo.metaData.getString("MEIZU_PUSH_APP_KEY"); if (!TextUtils.isEmpty(appId) && !TextUtils.isEmpty(appKey)) { String pushId = com.meizu.cloud.pushsdk.PushManager.getPushId(context); com.meizu.cloud.pushsdk.PushManager.register(context, String.valueOf(appId), appKey); com.meizu.cloud.pushsdk.PushManager.switchPush(context, String.valueOf(appId), appKey, pushId, 1, true); ChatManager.Instance().setDeviceToken(pushId, PushType.MEIZU); } } } catch (Exception e) { e.printStackTrace(); } return false; } private void initVIVO(Context context) { // 在当前工程入口函数,建议在Application的onCreate函数中,添加以下代码: PushClient.getInstance(context).initialize(); // 当需要打开推送服务时,调用以下代码: PushClient.getInstance(context).turnOnPush(new IPushActionListener() { @Override public void onStateChanged(int state) { Log.d("PushService", "vivo turnOnPush " + state); String regId = PushClient.getInstance(context).getRegId(); if (!TextUtils.isEmpty(regId)) { ChatManager.Instance().setDeviceToken(regId, PushType.VIVO); } } }); } private void initOPPO(Context context) { String packageName = context.getPackageName(); try { ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_META_DATA); if (appInfo.metaData != null) { String appsecret = appInfo.metaData.getString("OPPO_APP_PUSH_SECRET"); String appkey = appInfo.metaData.getString("OPPO_APP_PUSH_KEY"); PushManager.getInstance().register(context, appkey, appsecret, new PushCallback() { @Override public void onRegister(int i, String s) { ChatManager.Instance().setDeviceToken(s, PushType.OPPO); } @Override public void onUnRegister(int i) { } @Override public void onSetPushTime(int i, String s) { } @Override public void onGetPushStatus(int i, int i1) { } @Override public void onGetNotificationStatus(int i, int i1) { } @Override public void onGetAliases(int i, List list) { } @Override public void onSetAliases(int i, List list) { } @Override public void onUnsetAliases(int i, List list) { } @Override public void onSetUserAccounts(int i, List list) { } @Override public void onUnsetUserAccounts(int i, List list) { } @Override public void onGetUserAccounts(int i, List list) { } @Override public void onSetTags(int i, List list) { } @Override public void onUnsetTags(int i, List list) { } @Override public void onGetTags(int i, List list) { } }); } } catch (Exception e) { e.printStackTrace(); } } public static final String SYS_EMUI = "sys_emui"; public static final String SYS_MIUI = "sys_miui"; public static final String SYS_FLYME = "sys_flyme"; public static final String SYS_VIVO = "sys_vivo"; private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name"; private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage"; private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; private static final String KEY_EMUI_VERSION = "ro.build.version.emui"; private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion"; private static final String KEY_VERSION_VIVO = "ro.vivo.os.version"; public static String getSystem() { String SYS = null; try { Properties prop = new Properties(); prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"))); if (prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) { SYS = SYS_MIUI;//小米 } else if (prop.getProperty(KEY_EMUI_API_LEVEL, null) != null || prop.getProperty(KEY_EMUI_VERSION, null) != null || prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) { SYS = SYS_EMUI;//华为 } else if (getMeizuFlymeOSFlag().toLowerCase().contains("flyme")) { SYS = SYS_FLYME;//魅族 } else if (!TextUtils.isEmpty(getProp(KEY_VERSION_VIVO))) { SYS = SYS_VIVO; } } catch (Exception e) { e.printStackTrace(); if (Build.MANUFACTURER.equalsIgnoreCase("HUAWEI")) { SYS = SYS_EMUI; } else if (Build.MANUFACTURER.equalsIgnoreCase("xiaomi")) { SYS = SYS_MIUI; } else if (Build.MANUFACTURER.equalsIgnoreCase("meizu")) { SYS = SYS_FLYME; } else if (Build.MANUFACTURER.equalsIgnoreCase("vivo")) { SYS = SYS_VIVO; } return SYS; } return SYS; } public static String getMeizuFlymeOSFlag() { return getSystemProperty("ro.build.display.id", ""); } private static String getSystemProperty(String key, String defaultValue) { try { Class clz = Class.forName("android.os.SystemProperties"); Method get = clz.getMethod("get", String.class, String.class); return (String) get.invoke(clz, key, defaultValue); } catch (Exception e) { } return defaultValue; } public static String getProp(String name) { String line = null; BufferedReader input = null; try { Process p = Runtime.getRuntime().exec("getprop " + name); input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); line = input.readLine(); input.close(); } catch (IOException ex) { Log.e("getProp", "Unable to read prop " + name, ex); return null; } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } return line; } public static PushServiceType getPushServiceType() { return INST.pushServiceType; } }