discord-jadx/app/src/main/java/androidx/core/app/NotificationManagerCompat.java

676 lines
29 KiB
Java

package androidx.core.app;
import android.app.AppOpsManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.provider.Settings;
import android.util.Log;
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import x.a.b.a.a;
public final class NotificationManagerCompat {
public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
public static final int IMPORTANCE_DEFAULT = 3;
public static final int IMPORTANCE_HIGH = 4;
public static final int IMPORTANCE_LOW = 2;
public static final int IMPORTANCE_MAX = 5;
public static final int IMPORTANCE_MIN = 1;
public static final int IMPORTANCE_NONE = 0;
public static final int IMPORTANCE_UNSPECIFIED = -1000;
public static final int MAX_SIDE_CHANNEL_SDK_VERSION = 19;
private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
private static final String SETTING_ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners";
private static final int SIDE_CHANNEL_RETRY_BASE_INTERVAL_MS = 1000;
private static final int SIDE_CHANNEL_RETRY_MAX_COUNT = 6;
private static final String TAG = "NotifManCompat";
@GuardedBy("sEnabledNotificationListenersLock")
private static Set<String> sEnabledNotificationListenerPackages = new HashSet();
@GuardedBy("sEnabledNotificationListenersLock")
private static String sEnabledNotificationListeners;
private static final Object sEnabledNotificationListenersLock = new Object();
private static final Object sLock = new Object();
@GuardedBy("sLock")
private static SideChannelManager sSideChannelManager;
private final Context mContext;
private final NotificationManager mNotificationManager;
public static class CancelTask implements Task {
public final boolean all;
/* renamed from: id reason: collision with root package name */
public final int f27id;
public final String packageName;
public final String tag;
public CancelTask(String str) {
this.packageName = str;
this.f27id = 0;
this.tag = null;
this.all = true;
}
public CancelTask(String str, int i, String str2) {
this.packageName = str;
this.f27id = i;
this.tag = str2;
this.all = false;
}
@Override // androidx.core.app.NotificationManagerCompat.Task
public void send(a aVar) throws RemoteException {
if (this.all) {
aVar.cancelAll(this.packageName);
} else {
aVar.cancel(this.packageName, this.f27id, this.tag);
}
}
@NonNull
public String toString() {
StringBuilder sb = new StringBuilder("CancelTask[");
sb.append("packageName:");
sb.append(this.packageName);
sb.append(", id:");
sb.append(this.f27id);
sb.append(", tag:");
sb.append(this.tag);
sb.append(", all:");
return c.d.b.a.a.L(sb, this.all, "]");
}
}
public static class NotifyTask implements Task {
/* renamed from: id reason: collision with root package name */
public final int f28id;
public final Notification notif;
public final String packageName;
public final String tag;
public NotifyTask(String str, int i, String str2, Notification notification) {
this.packageName = str;
this.f28id = i;
this.tag = str2;
this.notif = notification;
}
@Override // androidx.core.app.NotificationManagerCompat.Task
public void send(a aVar) throws RemoteException {
aVar.notify(this.packageName, this.f28id, this.tag, this.notif);
}
@NonNull
public String toString() {
StringBuilder sb = new StringBuilder("NotifyTask[");
sb.append("packageName:");
sb.append(this.packageName);
sb.append(", id:");
sb.append(this.f28id);
sb.append(", tag:");
return c.d.b.a.a.H(sb, this.tag, "]");
}
}
public static class ServiceConnectedEvent {
public final ComponentName componentName;
public final IBinder iBinder;
public ServiceConnectedEvent(ComponentName componentName, IBinder iBinder) {
this.componentName = componentName;
this.iBinder = iBinder;
}
}
public static class SideChannelManager implements Handler.Callback, ServiceConnection {
private static final int MSG_QUEUE_TASK = 0;
private static final int MSG_RETRY_LISTENER_QUEUE = 3;
private static final int MSG_SERVICE_CONNECTED = 1;
private static final int MSG_SERVICE_DISCONNECTED = 2;
private Set<String> mCachedEnabledPackages = new HashSet();
private final Context mContext;
private final Handler mHandler;
private final HandlerThread mHandlerThread;
private final Map<ComponentName, ListenerRecord> mRecordMap = new HashMap();
public static class ListenerRecord {
public boolean bound = false;
public final ComponentName componentName;
public int retryCount = 0;
public a service;
public ArrayDeque<Task> taskQueue = new ArrayDeque<>();
public ListenerRecord(ComponentName componentName) {
this.componentName = componentName;
}
}
public SideChannelManager(Context context) {
this.mContext = context;
HandlerThread handlerThread = new HandlerThread("NotificationManagerCompat");
this.mHandlerThread = handlerThread;
handlerThread.start();
this.mHandler = new Handler(handlerThread.getLooper(), this);
}
private boolean ensureServiceBound(ListenerRecord listenerRecord) {
if (listenerRecord.bound) {
return true;
}
boolean bindService = this.mContext.bindService(new Intent(NotificationManagerCompat.ACTION_BIND_SIDE_CHANNEL).setComponent(listenerRecord.componentName), this, 33);
listenerRecord.bound = bindService;
if (bindService) {
listenerRecord.retryCount = 0;
} else {
StringBuilder P = c.d.b.a.a.P("Unable to bind to listener ");
P.append(listenerRecord.componentName);
Log.w(NotificationManagerCompat.TAG, P.toString());
this.mContext.unbindService(this);
}
return listenerRecord.bound;
}
private void ensureServiceUnbound(ListenerRecord listenerRecord) {
if (listenerRecord.bound) {
this.mContext.unbindService(this);
listenerRecord.bound = false;
}
listenerRecord.service = null;
}
private void handleQueueTask(Task task) {
updateListenerMap();
for (ListenerRecord listenerRecord : this.mRecordMap.values()) {
listenerRecord.taskQueue.add(task);
processListenerQueue(listenerRecord);
}
}
private void handleRetryListenerQueue(ComponentName componentName) {
ListenerRecord listenerRecord = this.mRecordMap.get(componentName);
if (listenerRecord != null) {
processListenerQueue(listenerRecord);
}
}
private void handleServiceConnected(ComponentName componentName, IBinder iBinder) {
ListenerRecord listenerRecord = this.mRecordMap.get(componentName);
if (listenerRecord != null) {
listenerRecord.service = a.AbstractBinderC0357a.asInterface(iBinder);
listenerRecord.retryCount = 0;
processListenerQueue(listenerRecord);
}
}
private void handleServiceDisconnected(ComponentName componentName) {
ListenerRecord listenerRecord = this.mRecordMap.get(componentName);
if (listenerRecord != null) {
ensureServiceUnbound(listenerRecord);
}
}
private void processListenerQueue(ListenerRecord listenerRecord) {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
StringBuilder P = c.d.b.a.a.P("Processing component ");
P.append(listenerRecord.componentName);
P.append(", ");
P.append(listenerRecord.taskQueue.size());
P.append(" queued tasks");
Log.d(NotificationManagerCompat.TAG, P.toString());
}
if (!listenerRecord.taskQueue.isEmpty()) {
if (!ensureServiceBound(listenerRecord) || listenerRecord.service == null) {
scheduleListenerRetry(listenerRecord);
return;
}
while (true) {
Task peek = listenerRecord.taskQueue.peek();
if (peek == null) {
break;
}
try {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
Log.d(NotificationManagerCompat.TAG, "Sending task " + peek);
}
peek.send(listenerRecord.service);
listenerRecord.taskQueue.remove();
} catch (DeadObjectException unused) {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
StringBuilder P2 = c.d.b.a.a.P("Remote service has died: ");
P2.append(listenerRecord.componentName);
Log.d(NotificationManagerCompat.TAG, P2.toString());
}
} catch (RemoteException e) {
StringBuilder P3 = c.d.b.a.a.P("RemoteException communicating with ");
P3.append(listenerRecord.componentName);
Log.w(NotificationManagerCompat.TAG, P3.toString(), e);
}
}
if (!listenerRecord.taskQueue.isEmpty()) {
scheduleListenerRetry(listenerRecord);
}
}
}
private void scheduleListenerRetry(ListenerRecord listenerRecord) {
if (!this.mHandler.hasMessages(3, listenerRecord.componentName)) {
int i = listenerRecord.retryCount + 1;
listenerRecord.retryCount = i;
if (i > 6) {
StringBuilder P = c.d.b.a.a.P("Giving up on delivering ");
P.append(listenerRecord.taskQueue.size());
P.append(" tasks to ");
P.append(listenerRecord.componentName);
P.append(" after ");
P.append(listenerRecord.retryCount);
P.append(" retries");
Log.w(NotificationManagerCompat.TAG, P.toString());
listenerRecord.taskQueue.clear();
return;
}
int i2 = (1 << (i - 1)) * 1000;
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
Log.d(NotificationManagerCompat.TAG, "Scheduling retry for " + i2 + " ms");
}
this.mHandler.sendMessageDelayed(this.mHandler.obtainMessage(3, listenerRecord.componentName), (long) i2);
}
}
private void updateListenerMap() {
Set<String> enabledListenerPackages = NotificationManagerCompat.getEnabledListenerPackages(this.mContext);
if (!enabledListenerPackages.equals(this.mCachedEnabledPackages)) {
this.mCachedEnabledPackages = enabledListenerPackages;
List<ResolveInfo> queryIntentServices = this.mContext.getPackageManager().queryIntentServices(new Intent().setAction(NotificationManagerCompat.ACTION_BIND_SIDE_CHANNEL), 0);
HashSet hashSet = new HashSet();
for (ResolveInfo resolveInfo : queryIntentServices) {
if (enabledListenerPackages.contains(resolveInfo.serviceInfo.packageName)) {
ServiceInfo serviceInfo = resolveInfo.serviceInfo;
ComponentName componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);
if (resolveInfo.serviceInfo.permission != null) {
Log.w(NotificationManagerCompat.TAG, "Permission present on component " + componentName + ", not adding listener record.");
} else {
hashSet.add(componentName);
}
}
}
Iterator it = hashSet.iterator();
while (it.hasNext()) {
ComponentName componentName2 = (ComponentName) it.next();
if (!this.mRecordMap.containsKey(componentName2)) {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
Log.d(NotificationManagerCompat.TAG, "Adding listener record for " + componentName2);
}
this.mRecordMap.put(componentName2, new ListenerRecord(componentName2));
}
}
Iterator<Map.Entry<ComponentName, ListenerRecord>> it2 = this.mRecordMap.entrySet().iterator();
while (it2.hasNext()) {
Map.Entry<ComponentName, ListenerRecord> next = it2.next();
if (!hashSet.contains(next.getKey())) {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
StringBuilder P = c.d.b.a.a.P("Removing listener record for ");
P.append(next.getKey());
Log.d(NotificationManagerCompat.TAG, P.toString());
}
ensureServiceUnbound(next.getValue());
it2.remove();
}
}
}
}
@Override // android.os.Handler.Callback
public boolean handleMessage(Message message) {
int i = message.what;
if (i == 0) {
handleQueueTask((Task) message.obj);
return true;
} else if (i == 1) {
ServiceConnectedEvent serviceConnectedEvent = (ServiceConnectedEvent) message.obj;
handleServiceConnected(serviceConnectedEvent.componentName, serviceConnectedEvent.iBinder);
return true;
} else if (i == 2) {
handleServiceDisconnected((ComponentName) message.obj);
return true;
} else if (i != 3) {
return false;
} else {
handleRetryListenerQueue((ComponentName) message.obj);
return true;
}
}
@Override // android.content.ServiceConnection
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
Log.d(NotificationManagerCompat.TAG, "Connected to service " + componentName);
}
this.mHandler.obtainMessage(1, new ServiceConnectedEvent(componentName, iBinder)).sendToTarget();
}
@Override // android.content.ServiceConnection
public void onServiceDisconnected(ComponentName componentName) {
if (Log.isLoggable(NotificationManagerCompat.TAG, 3)) {
Log.d(NotificationManagerCompat.TAG, "Disconnected from service " + componentName);
}
this.mHandler.obtainMessage(2, componentName).sendToTarget();
}
public void queueTask(Task task) {
this.mHandler.obtainMessage(0, task).sendToTarget();
}
}
public interface Task {
void send(a aVar) throws RemoteException;
}
private NotificationManagerCompat(Context context) {
this.mContext = context;
this.mNotificationManager = (NotificationManager) context.getSystemService("notification");
}
@NonNull
public static NotificationManagerCompat from(@NonNull Context context) {
return new NotificationManagerCompat(context);
}
@NonNull
public static Set<String> getEnabledListenerPackages(@NonNull Context context) {
Set<String> set;
String string = Settings.Secure.getString(context.getContentResolver(), SETTING_ENABLED_NOTIFICATION_LISTENERS);
synchronized (sEnabledNotificationListenersLock) {
if (string != null) {
if (!string.equals(sEnabledNotificationListeners)) {
String[] split = string.split(":", -1);
HashSet hashSet = new HashSet(split.length);
for (String str : split) {
ComponentName unflattenFromString = ComponentName.unflattenFromString(str);
if (unflattenFromString != null) {
hashSet.add(unflattenFromString.getPackageName());
}
}
sEnabledNotificationListenerPackages = hashSet;
sEnabledNotificationListeners = string;
}
}
set = sEnabledNotificationListenerPackages;
}
return set;
}
private void pushSideChannelQueue(Task task) {
synchronized (sLock) {
if (sSideChannelManager == null) {
sSideChannelManager = new SideChannelManager(this.mContext.getApplicationContext());
}
sSideChannelManager.queueTask(task);
}
}
private static boolean useSideChannelForNotification(Notification notification) {
Bundle extras = NotificationCompat.getExtras(notification);
return extras != null && extras.getBoolean(EXTRA_USE_SIDE_CHANNEL);
}
public boolean areNotificationsEnabled() {
if (Build.VERSION.SDK_INT >= 24) {
return this.mNotificationManager.areNotificationsEnabled();
}
AppOpsManager appOpsManager = (AppOpsManager) this.mContext.getSystemService("appops");
ApplicationInfo applicationInfo = this.mContext.getApplicationInfo();
String packageName = this.mContext.getApplicationContext().getPackageName();
int i = applicationInfo.uid;
try {
Class<?> cls = Class.forName(AppOpsManager.class.getName());
Class<?> cls2 = Integer.TYPE;
return ((Integer) cls.getMethod(CHECK_OP_NO_THROW, new Class[]{cls2, cls2, String.class}).invoke(appOpsManager, new Object[]{Integer.valueOf(((Integer) cls.getDeclaredField(OP_POST_NOTIFICATION).get(Integer.class)).intValue()), Integer.valueOf(i), packageName})).intValue() == 0;
} catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException | NoSuchMethodException | RuntimeException | InvocationTargetException unused) {
return true;
}
}
public void cancel(int i) {
cancel(null, i);
}
public void cancel(@Nullable String str, int i) {
this.mNotificationManager.cancel(str, i);
}
public void cancelAll() {
this.mNotificationManager.cancelAll();
}
public void createNotificationChannel(@NonNull NotificationChannel notificationChannel) {
if (Build.VERSION.SDK_INT >= 26) {
this.mNotificationManager.createNotificationChannel(notificationChannel);
}
}
public void createNotificationChannel(@NonNull NotificationChannelCompat notificationChannelCompat) {
createNotificationChannel(notificationChannelCompat.getNotificationChannel());
}
public void createNotificationChannelGroup(@NonNull NotificationChannelGroup notificationChannelGroup) {
if (Build.VERSION.SDK_INT >= 26) {
this.mNotificationManager.createNotificationChannelGroup(notificationChannelGroup);
}
}
public void createNotificationChannelGroup(@NonNull NotificationChannelGroupCompat notificationChannelGroupCompat) {
createNotificationChannelGroup(notificationChannelGroupCompat.getNotificationChannelGroup());
}
public void createNotificationChannelGroups(@NonNull List<NotificationChannelGroup> list) {
if (Build.VERSION.SDK_INT >= 26) {
this.mNotificationManager.createNotificationChannelGroups(list);
}
}
public void createNotificationChannelGroupsCompat(@NonNull List<NotificationChannelGroupCompat> list) {
if (Build.VERSION.SDK_INT >= 26 && !list.isEmpty()) {
ArrayList arrayList = new ArrayList(list.size());
for (NotificationChannelGroupCompat notificationChannelGroupCompat : list) {
arrayList.add(notificationChannelGroupCompat.getNotificationChannelGroup());
}
this.mNotificationManager.createNotificationChannelGroups(arrayList);
}
}
public void createNotificationChannels(@NonNull List<NotificationChannel> list) {
if (Build.VERSION.SDK_INT >= 26) {
this.mNotificationManager.createNotificationChannels(list);
}
}
public void createNotificationChannelsCompat(@NonNull List<NotificationChannelCompat> list) {
if (Build.VERSION.SDK_INT >= 26 && !list.isEmpty()) {
ArrayList arrayList = new ArrayList(list.size());
for (NotificationChannelCompat notificationChannelCompat : list) {
arrayList.add(notificationChannelCompat.getNotificationChannel());
}
this.mNotificationManager.createNotificationChannels(arrayList);
}
}
public void deleteNotificationChannel(@NonNull String str) {
if (Build.VERSION.SDK_INT >= 26) {
this.mNotificationManager.deleteNotificationChannel(str);
}
}
public void deleteNotificationChannelGroup(@NonNull String str) {
if (Build.VERSION.SDK_INT >= 26) {
this.mNotificationManager.deleteNotificationChannelGroup(str);
}
}
public void deleteUnlistedNotificationChannels(@NonNull Collection<String> collection) {
if (Build.VERSION.SDK_INT >= 26) {
for (NotificationChannel notificationChannel : this.mNotificationManager.getNotificationChannels()) {
if (!collection.contains(notificationChannel.getId()) && (Build.VERSION.SDK_INT < 30 || !collection.contains(notificationChannel.getParentChannelId()))) {
this.mNotificationManager.deleteNotificationChannel(notificationChannel.getId());
}
}
}
}
public int getImportance() {
return Build.VERSION.SDK_INT >= 24 ? this.mNotificationManager.getImportance() : IMPORTANCE_UNSPECIFIED;
}
@Nullable
public NotificationChannel getNotificationChannel(@NonNull String str) {
if (Build.VERSION.SDK_INT >= 26) {
return this.mNotificationManager.getNotificationChannel(str);
}
return null;
}
@Nullable
public NotificationChannel getNotificationChannel(@NonNull String str, @NonNull String str2) {
return Build.VERSION.SDK_INT >= 30 ? this.mNotificationManager.getNotificationChannel(str, str2) : getNotificationChannel(str);
}
@Nullable
public NotificationChannelCompat getNotificationChannelCompat(@NonNull String str) {
NotificationChannel notificationChannel;
if (Build.VERSION.SDK_INT < 26 || (notificationChannel = getNotificationChannel(str)) == null) {
return null;
}
return new NotificationChannelCompat(notificationChannel);
}
@Nullable
public NotificationChannelCompat getNotificationChannelCompat(@NonNull String str, @NonNull String str2) {
NotificationChannel notificationChannel;
if (Build.VERSION.SDK_INT < 26 || (notificationChannel = getNotificationChannel(str, str2)) == null) {
return null;
}
return new NotificationChannelCompat(notificationChannel);
}
@Nullable
public NotificationChannelGroup getNotificationChannelGroup(@NonNull String str) {
int i = Build.VERSION.SDK_INT;
if (i >= 28) {
return this.mNotificationManager.getNotificationChannelGroup(str);
}
if (i >= 26) {
for (NotificationChannelGroup notificationChannelGroup : getNotificationChannelGroups()) {
if (notificationChannelGroup.getId().equals(str)) {
return notificationChannelGroup;
}
}
}
return null;
}
@Nullable
public NotificationChannelGroupCompat getNotificationChannelGroupCompat(@NonNull String str) {
NotificationChannelGroup notificationChannelGroup;
int i = Build.VERSION.SDK_INT;
if (i >= 28) {
NotificationChannelGroup notificationChannelGroup2 = getNotificationChannelGroup(str);
if (notificationChannelGroup2 != null) {
return new NotificationChannelGroupCompat(notificationChannelGroup2);
}
return null;
} else if (i < 26 || (notificationChannelGroup = getNotificationChannelGroup(str)) == null) {
return null;
} else {
return new NotificationChannelGroupCompat(notificationChannelGroup, getNotificationChannels());
}
}
@NonNull
public List<NotificationChannelGroup> getNotificationChannelGroups() {
return Build.VERSION.SDK_INT >= 26 ? this.mNotificationManager.getNotificationChannelGroups() : Collections.emptyList();
}
@NonNull
public List<NotificationChannelGroupCompat> getNotificationChannelGroupsCompat() {
int i = Build.VERSION.SDK_INT;
if (i >= 26) {
List<NotificationChannelGroup> notificationChannelGroups = getNotificationChannelGroups();
if (!notificationChannelGroups.isEmpty()) {
List<NotificationChannel> emptyList = i >= 28 ? Collections.emptyList() : getNotificationChannels();
ArrayList arrayList = new ArrayList(notificationChannelGroups.size());
for (NotificationChannelGroup notificationChannelGroup : notificationChannelGroups) {
if (Build.VERSION.SDK_INT >= 28) {
arrayList.add(new NotificationChannelGroupCompat(notificationChannelGroup));
} else {
arrayList.add(new NotificationChannelGroupCompat(notificationChannelGroup, emptyList));
}
}
return arrayList;
}
}
return Collections.emptyList();
}
@NonNull
public List<NotificationChannel> getNotificationChannels() {
return Build.VERSION.SDK_INT >= 26 ? this.mNotificationManager.getNotificationChannels() : Collections.emptyList();
}
@NonNull
public List<NotificationChannelCompat> getNotificationChannelsCompat() {
if (Build.VERSION.SDK_INT >= 26) {
List<NotificationChannel> notificationChannels = getNotificationChannels();
if (!notificationChannels.isEmpty()) {
ArrayList arrayList = new ArrayList(notificationChannels.size());
for (NotificationChannel notificationChannel : notificationChannels) {
arrayList.add(new NotificationChannelCompat(notificationChannel));
}
return arrayList;
}
}
return Collections.emptyList();
}
public void notify(int i, @NonNull Notification notification) {
notify(null, i, notification);
}
public void notify(@Nullable String str, int i, @NonNull Notification notification) {
if (useSideChannelForNotification(notification)) {
pushSideChannelQueue(new NotifyTask(this.mContext.getPackageName(), i, str, notification));
this.mNotificationManager.cancel(str, i);
return;
}
this.mNotificationManager.notify(str, i, notification);
}
}