323 lines
15 KiB
Java
323 lines
15 KiB
Java
package com.gh.base;
|
||
|
||
import android.app.Notification;
|
||
import android.app.NotificationManager;
|
||
import android.app.PendingIntent;
|
||
import android.content.Context;
|
||
import android.content.Intent;
|
||
import android.content.pm.ApplicationInfo;
|
||
import android.content.pm.PackageInfo;
|
||
import android.graphics.BitmapFactory;
|
||
import android.os.Build;
|
||
import android.os.Bundle;
|
||
import android.support.v4.app.NotificationCompat;
|
||
import android.support.v4.util.ArrayMap;
|
||
import android.text.TextUtils;
|
||
import android.widget.RemoteViews;
|
||
|
||
import com.gh.common.util.AppDebugConfig;
|
||
import com.gh.common.util.EntranceUtils;
|
||
import com.gh.common.util.PackageUtils;
|
||
import com.gh.common.util.TokenUtils;
|
||
import com.gh.gamecenter.BuildConfig;
|
||
import com.gh.gamecenter.R;
|
||
import com.halo.assistant.HaloApp;
|
||
import com.lightgame.download.FileUtils;
|
||
import com.lightgame.utils.Utils;
|
||
import com.xiaomi.mipush.sdk.ErrorCode;
|
||
import com.xiaomi.mipush.sdk.MiPushClient;
|
||
import com.xiaomi.mipush.sdk.MiPushCommandMessage;
|
||
import com.xiaomi.mipush.sdk.MiPushMessage;
|
||
import com.xiaomi.mipush.sdk.PushMessageReceiver;
|
||
|
||
import org.json.JSONArray;
|
||
import org.json.JSONException;
|
||
import org.json.JSONObject;
|
||
|
||
import java.io.File;
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.ArrayList;
|
||
import java.util.Date;
|
||
import java.util.List;
|
||
import java.util.Locale;
|
||
|
||
import static com.gh.common.util.EntranceUtils.ENTRANCE_MIPUSH;
|
||
import static com.gh.common.util.EntranceUtils.HOST_ARTICLE;
|
||
import static com.gh.common.util.EntranceUtils.HOST_GAME;
|
||
import static com.gh.common.util.EntranceUtils.HOST_WEB;
|
||
import static com.gh.common.util.EntranceUtils.HOST_COLUMN;
|
||
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
|
||
import static com.gh.common.util.EntranceUtils.KEY_GAMEID;
|
||
import static com.gh.common.util.EntranceUtils.KEY_ID;
|
||
import static com.gh.common.util.EntranceUtils.KEY_NEWSID;
|
||
import static com.gh.common.util.EntranceUtils.KEY_TARGET;
|
||
import static com.gh.common.util.EntranceUtils.KEY_TO;
|
||
import static com.gh.common.util.EntranceUtils.KEY_TYPE;
|
||
import static com.gh.common.util.EntranceUtils.KEY_URL;
|
||
|
||
/**
|
||
* 1、PushMessageReceiver是个抽象类,该类继承了BroadcastReceiver。
|
||
* 2、需要将自定义的DemoMessageReceiver注册在AndroidManifest.xml文件中 <receiver
|
||
* android:exported="true"
|
||
* android:name="com.xiaomi.mipushdemo.DemoMessageReceiver"> <intent-filter>
|
||
* <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" /> </intent-filter>
|
||
* <intent-filter> <action android:name="com.xiaomi.mipush.ERROR" />
|
||
* </intent-filter> <intent-filter> <action
|
||
* android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" /></intent-filter>
|
||
* </receiver>
|
||
* 3、DemoMessageReceiver的onReceivePassThroughMessage方法用来接收服务器向客户端发送的透传消息
|
||
* 4、DemoMessageReceiver的onNotificationMessageClicked方法用来接收服务器向客户端发送的通知消息,
|
||
* 这个回调方法会在用户手动点击通知后触发
|
||
* 5、DemoMessageReceiver的onNotificationMessageArrived方法用来接收服务器向客户端发送的通知消息,
|
||
* 这个回调方法是在通知消息到达客户端时触发。另外应用在前台时不弹出通知的通知消息到达客户端也会触发这个回调函数
|
||
* 6、DemoMessageReceiver的onCommandResult方法用来接收客户端向服务器发送命令后的响应结果
|
||
* 7、DemoMessageReceiver的onReceiveRegisterResult方法用来接收客户端向服务器发送注册命令后的响应结果
|
||
* 8、以上这些方法运行在非UI线程中
|
||
*
|
||
* @author mayixiang
|
||
* //TODO 请勿更改此类路径,若需更改时请注意更改./libraries/MiPush/proguard-library.txt混淆对应配置
|
||
*/
|
||
public class GHPushMessageReceiver extends PushMessageReceiver {
|
||
|
||
private String mAlias;
|
||
|
||
@Override
|
||
public void onReceivePassThroughMessage(Context context, MiPushMessage message) {
|
||
if (BuildConfig.DEBUG) {
|
||
AppDebugConfig.logMethodWithParams(this, message);
|
||
}
|
||
// 1判断notifyid是否为4
|
||
try {
|
||
//TODO what is magic number 4?
|
||
if (message.getNotifyId() == 4) {
|
||
JSONObject jsonObject = new JSONObject(message.getContent());
|
||
Utils.log(jsonObject.toString());
|
||
String channel = jsonObject.getString("channel");
|
||
Utils.log("channel = " + channel);
|
||
|
||
// 1判断渠道号是否一致或是否为ALL
|
||
String packageChannel = HaloApp.getInstance().getChannel();
|
||
if ("ALL".equals(channel) || channel.equalsIgnoreCase(packageChannel)) {
|
||
String type = jsonObject.getString(KEY_TYPE);
|
||
Utils.log("type = " + type);
|
||
JSONArray jsonArray;
|
||
ArrayMap<String, Boolean> map;
|
||
switch (type) {
|
||
case "NEWS":
|
||
// 新闻推送
|
||
jsonArray = jsonObject.getJSONArray("package");
|
||
map = getInstalledMapFromLocal(context);
|
||
for (int i = 0; i < jsonArray.length(); i++) {
|
||
Boolean b = map.get(jsonArray.getString(i));
|
||
if (b != null) {
|
||
// 显示推送的消息
|
||
showNotification(context, jsonObject, 0);
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
case "PLUGIN_UPDATE":
|
||
// 插件更新推送
|
||
jsonArray = jsonObject.getJSONArray("apk");
|
||
map = getInstalledMapFromLocal(context);
|
||
for (int i = 0; i < jsonArray.length(); i++) {
|
||
JSONObject apk = jsonArray.getJSONObject(i);
|
||
String packageName = apk.getString("package");
|
||
Boolean b = map.get(packageName);
|
||
if (b != null) {
|
||
// 判断是否gh_version是否相同
|
||
String gh_version = (String) PackageUtils
|
||
.getMetaData(context, packageName, "gh_version");
|
||
if (gh_version != null) {
|
||
gh_version = gh_version.substring(2);
|
||
// 判断gh_version是否相同
|
||
if (gh_version.equals(apk.getString("gh_version"))) {
|
||
// 判断version是否相同
|
||
String version = PackageUtils.getVersionByPackage(context, packageName);
|
||
if (apk.getString("version").equals(version)) {
|
||
// 版本相同,无需显示插件更新,继续查看是否有可更新的游戏包
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
// 显示推送的消息
|
||
showNotification(context, jsonObject, 1);
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
case "NEW_GAME":
|
||
// 新游推送
|
||
showNotification(context, jsonObject, 2);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} catch (JSONException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
private ArrayMap<String, Boolean> getInstalledMapFromLocal(Context context) {
|
||
ArrayMap<String, Boolean> map = new ArrayMap<>();
|
||
ArrayList<String> list = getAllPackageName(context);
|
||
for (String str : list) {
|
||
map.put(str, true);
|
||
}
|
||
return map;
|
||
}
|
||
|
||
private void showNotification(Context context, JSONObject jsonObject, int id) throws JSONException {
|
||
Intent intent = new Intent();
|
||
intent.setAction("com.gh.gamecenter.NOTIFICATION");
|
||
intent.putExtra("notifyId", id);
|
||
intent.putExtra("notifyData", jsonObject.toString());
|
||
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_ONE_SHOT);
|
||
|
||
NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||
|
||
RemoteViews remoteViews = null;
|
||
|
||
if (Build.MANUFACTURER.equals("Meizu") &&
|
||
(Build.MODEL.startsWith("m") || Build.MODEL.startsWith("MX"))) {
|
||
remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_meizu);
|
||
SimpleDateFormat format = new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||
remoteViews.setTextViewText(R.id.time, format.format(new Date()));
|
||
} else if (Build.MANUFACTURER.equals("Xiaomi") &&
|
||
(Build.MODEL.startsWith("MI") || Build.MODEL.startsWith("HM") || Build.MODEL.startsWith("Redmi"))) {
|
||
// 小米系统
|
||
remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_xiaomi);
|
||
SimpleDateFormat format = new SimpleDateFormat("ah:mm", Locale.getDefault());
|
||
remoteViews.setTextViewText(R.id.time, format.format(new Date()));
|
||
} else if (Build.MANUFACTURER.equals("HUAWEI")) {
|
||
// 华为系统
|
||
remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification_huawei);
|
||
}
|
||
|
||
String url = jsonObject.getString("icon");
|
||
String path = context.getCacheDir() + File.separator + url.substring(url.lastIndexOf("/") + 1);
|
||
int result = FileUtils.downloadFile(url, path);
|
||
if (result != 200) {
|
||
// 下载出错,使用光环logo
|
||
path = null;
|
||
}
|
||
|
||
final NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
|
||
.setTicker(jsonObject.getString("pushTitle"))
|
||
.setContentTitle(jsonObject.getString("pushTitle"))
|
||
.setContentText(jsonObject.getString("pushDesc"))
|
||
.setContentIntent(pendingIntent)
|
||
.setDefaults(Notification.DEFAULT_SOUND) // 添加系统默认声音
|
||
.setAutoCancel(true); // FLAG_AUTO_CANCEL表明当通知被用户点击时,通知将被清除。
|
||
|
||
if (remoteViews != null) {
|
||
if (path == null) {
|
||
remoteViews.setImageViewBitmap(R.id.icon, BitmapFactory.decodeResource(context.getResources(), R.drawable.logo));
|
||
} else {
|
||
remoteViews.setImageViewBitmap(R.id.icon, BitmapFactory.decodeFile(path));
|
||
}
|
||
remoteViews.setTextViewText(R.id.title, jsonObject.getString("pushTitle"));
|
||
remoteViews.setTextViewText(R.id.intro, jsonObject.getString("pushDesc"));
|
||
|
||
builder.setSmallIcon(R.drawable.logo);
|
||
builder.setCustomContentView(remoteViews);
|
||
|
||
} else {
|
||
builder.setSmallIcon(R.drawable.logo_black);
|
||
if (path == null) {
|
||
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.logo));
|
||
} else {
|
||
builder.setLargeIcon(BitmapFactory.decodeFile(path));
|
||
}
|
||
}
|
||
|
||
nManager.notify(((int) System.currentTimeMillis() / 1000), builder.build());// 通过通知管理器来发起通知。如果id不同,则每click,在status哪里增加一个提示
|
||
}
|
||
|
||
private ArrayList<String> getAllPackageName(Context context) {
|
||
ArrayList<String> list = new ArrayList<>();
|
||
List<PackageInfo> packageInfos = context.getPackageManager().getInstalledPackages(0);
|
||
for (PackageInfo packageInfo : packageInfos) {
|
||
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||
list.add(packageInfo.packageName);
|
||
}
|
||
}
|
||
return list;
|
||
}
|
||
|
||
@Override
|
||
public void onNotificationMessageClicked(Context context, MiPushMessage message) {
|
||
if (BuildConfig.DEBUG) {
|
||
AppDebugConfig.logMethodWithParams(this, message);
|
||
}
|
||
try {
|
||
String content = message.getContent();
|
||
JSONObject response = new JSONObject(content);
|
||
Bundle bundle = new Bundle();
|
||
bundle.putString(KEY_ENTRANCE, ENTRANCE_MIPUSH);
|
||
String type = response.getString(KEY_TYPE);
|
||
String target = response.getString(KEY_TARGET);
|
||
|
||
switch (type) {
|
||
case HOST_ARTICLE:
|
||
bundle.putString(KEY_TO, "NewsDetailActivity");
|
||
bundle.putString(KEY_NEWSID, target);
|
||
break;
|
||
case HOST_GAME:
|
||
bundle.putString(KEY_TO, "GameDetailActivity");
|
||
bundle.putString(KEY_GAMEID, target);
|
||
break;
|
||
case HOST_COLUMN:
|
||
bundle.putString(KEY_TO, "SubjectActivity");
|
||
bundle.putString(KEY_ID, target);
|
||
break;
|
||
case HOST_WEB:
|
||
bundle.putString(KEY_TO, "WebActivity");
|
||
bundle.putString(KEY_URL, target);
|
||
break;
|
||
}
|
||
EntranceUtils.jumpActivity(context, bundle);
|
||
} catch (JSONException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onNotificationMessageArrived(Context context, MiPushMessage message) {
|
||
if (BuildConfig.DEBUG) {
|
||
AppDebugConfig.logMethodWithParams(this, message);
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onReceiveRegisterResult(Context context, MiPushCommandMessage message) {
|
||
if (BuildConfig.DEBUG) {
|
||
AppDebugConfig.logMethodWithParams(this, message);
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onCommandResult(Context context, MiPushCommandMessage message) {
|
||
if (BuildConfig.DEBUG) {
|
||
AppDebugConfig.logMethodWithParams(this, message);
|
||
}
|
||
|
||
String command = message.getCommand();
|
||
List<String> arguments = message.getCommandArguments();
|
||
|
||
if (MiPushClient.COMMAND_SET_ALIAS.equals(command)) {
|
||
if (message.getResultCode() == ErrorCode.SUCCESS) {
|
||
mAlias = arguments.get(0);
|
||
}
|
||
}
|
||
|
||
if (TextUtils.isEmpty(mAlias)) {
|
||
//添加别名
|
||
MiPushClient.setAlias(context, TokenUtils.getDeviceId(context), null);
|
||
}
|
||
}
|
||
|
||
}
|