package com.lody.virtual.server.notification; import android.app.NotificationManager; import android.content.Context; import android.text.TextUtils; import com.lody.virtual.helper.utils.VLog; import com.lody.virtual.server.INotificationManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.atomic.AtomicReference; public class VNotificationManagerService extends INotificationManager.Stub { private static final AtomicReference<VNotificationManagerService> gService = new AtomicReference<>(); private NotificationManager mNotificationManager; static final String TAG = NotificationCompat.class.getSimpleName(); private final List<String> mDisables = new ArrayList<>(); //VApp's Notifications private final HashMap<String, List<NotificationInfo>> mNotifications = new HashMap<>(); private Context mContext; private VNotificationManagerService(Context context) { mContext = context; mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); } public static void systemReady(Context context) { VNotificationManagerService instance = new VNotificationManagerService(context); gService.set(instance); } public static VNotificationManagerService get() { return gService.get(); } /*** * fake notification's id * * @param id notification's id * @param packageName notification's package * @param userId user * @return */ @Override public int dealNotificationId(int id, String packageName, String tag, int userId) { return id; } /*** * fake notification's tag * * @param id notification's id * @param packageName notification's package * @param tag notification's tag * @param userId user * @return */ @Override public String dealNotificationTag(int id, String packageName, String tag, int userId) { if (TextUtils.equals(mContext.getPackageName(), packageName)) { return tag; } if (tag == null) { return packageName + "@" + userId; } return packageName + ":" + tag + "@" + userId; } @Override public boolean areNotificationsEnabledForPackage(String packageName, int userId) { return !mDisables.contains(packageName + ":" + userId); } @Override public void setNotificationsEnabledForPackage(String packageName, boolean enable, int userId) { String key = packageName + ":" + userId; if (enable) { if (mDisables.contains(key)) { mDisables.remove(key); } } else { if (!mDisables.contains(key)) { mDisables.add(key); } } //TODO: save mDisables ? } @Override public void addNotification(int id, String tag, String packageName, int userId) { NotificationInfo notificationInfo = new NotificationInfo(id, tag, packageName, userId); synchronized (mNotifications) { List<NotificationInfo> list = mNotifications.get(packageName); if (list == null) { list = new ArrayList<>(); mNotifications.put(packageName, list); } if (!list.contains(notificationInfo)) { VLog.d(TAG, "add " + tag + " " + id); list.add(notificationInfo); } } } @Override public void cancelAllNotification(String packageName, int userId) { List<NotificationInfo> infos = new ArrayList<>(); synchronized (mNotifications) { List<NotificationInfo> list = mNotifications.get(packageName); if (list != null) { int count = list.size(); for (int i = count - 1; i >= 0; i--) { NotificationInfo info = list.get(i); if (info.userId == userId) { infos.add(info); list.remove(i); } } } } for (NotificationInfo info : infos) { VLog.d(TAG, "cancel " + info.tag + " " + info.id); mNotificationManager.cancel(info.tag, info.id); } } private static class NotificationInfo { int id; String tag; String packageName; int userId; NotificationInfo(int id, String tag, String packageName, int userId) { this.id = id; this.tag = tag; this.packageName = packageName; this.userId = userId; } @Override public boolean equals(Object obj) { if (obj instanceof NotificationInfo) { NotificationInfo that = (NotificationInfo) obj; return that.id == id && TextUtils.equals(that.tag, tag) && TextUtils.equals(packageName, that.packageName) && that.userId == userId; } return super.equals(obj); } } }