Add ShellCmd NLS
A listener is required for user checks. Test: NotificationAssistantServiceTest Bug: 195031703 Bug: 195111725 Fixes: 198093510 Change-Id: Ib98a02ad1f1894042a7ebd30f30547f012a4fcc4
This commit is contained in:
@@ -22,6 +22,7 @@ import static android.app.NotificationManager.INTERRUPTION_FILTER_NONE;
|
|||||||
import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
|
import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY;
|
||||||
import static android.app.NotificationManager.INTERRUPTION_FILTER_UNKNOWN;
|
import static android.app.NotificationManager.INTERRUPTION_FILTER_UNKNOWN;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.INotificationManager;
|
import android.app.INotificationManager;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
@@ -44,6 +45,8 @@ import android.os.Process;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.ShellCommand;
|
import android.os.ShellCommand;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
import android.service.notification.NotificationListenerService;
|
||||||
|
import android.service.notification.StatusBarNotification;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
@@ -392,19 +395,28 @@ public class NotificationShellCmd extends ShellCommand {
|
|||||||
+ "--context <snooze-criterion-id>) <key>");
|
+ "--context <snooze-criterion-id>) <key>");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (null == mDirectService.getNotificationRecord(key)) {
|
|
||||||
pw.println("error: no notification matching key: " + key);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (duration > 0 || criterion != null) {
|
if (duration > 0 || criterion != null) {
|
||||||
|
ShellNls nls = new ShellNls();
|
||||||
|
nls.registerAsSystemService(mDirectService.getContext(),
|
||||||
|
new ComponentName(nls.getClass().getPackageName(),
|
||||||
|
nls.getClass().getName()),
|
||||||
|
ActivityManager.getCurrentUser());
|
||||||
|
if (!waitForBind(nls)) {
|
||||||
|
pw.println("error: could not bind a listener in time");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if (duration > 0) {
|
if (duration > 0) {
|
||||||
pw.println(String.format("snoozing <%s> until time: %s", key,
|
pw.println(String.format("snoozing <%s> until time: %s", key,
|
||||||
new Date(System.currentTimeMillis() + duration)));
|
new Date(System.currentTimeMillis() + duration)));
|
||||||
|
nls.snoozeNotification(key, duration);
|
||||||
} else {
|
} else {
|
||||||
pw.println(String.format("snoozing <%s> until criterion: %s", key,
|
pw.println(String.format("snoozing <%s> until criterion: %s", key,
|
||||||
criterion));
|
criterion));
|
||||||
|
nls.snoozeNotification(key, criterion);
|
||||||
}
|
}
|
||||||
mDirectService.snoozeNotificationInt(key, duration, criterion, null);
|
waitForSnooze(nls, key);
|
||||||
|
nls.unregisterAsSystemService();
|
||||||
|
waitForUnbind(nls);
|
||||||
} else {
|
} else {
|
||||||
pw.println("error: invalid value for --" + subflag + ": " + flagarg);
|
pw.println("error: invalid value for --" + subflag + ": " + flagarg);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -527,14 +539,17 @@ public class NotificationShellCmd extends ShellCommand {
|
|||||||
final PendingIntent pi;
|
final PendingIntent pi;
|
||||||
if ("broadcast".equals(intentKind)) {
|
if ("broadcast".equals(intentKind)) {
|
||||||
pi = PendingIntent.getBroadcastAsUser(
|
pi = PendingIntent.getBroadcastAsUser(
|
||||||
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE_UNAUDITED,
|
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
| PendingIntent.FLAG_MUTABLE_UNAUDITED,
|
||||||
UserHandle.CURRENT);
|
UserHandle.CURRENT);
|
||||||
} else if ("service".equals(intentKind)) {
|
} else if ("service".equals(intentKind)) {
|
||||||
pi = PendingIntent.getService(
|
pi = PendingIntent.getService(
|
||||||
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE_UNAUDITED);
|
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
| PendingIntent.FLAG_MUTABLE_UNAUDITED);
|
||||||
} else {
|
} else {
|
||||||
pi = PendingIntent.getActivityAsUser(
|
pi = PendingIntent.getActivityAsUser(
|
||||||
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE_UNAUDITED, null,
|
context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
| PendingIntent.FLAG_MUTABLE_UNAUDITED, null,
|
||||||
UserHandle.CURRENT);
|
UserHandle.CURRENT);
|
||||||
}
|
}
|
||||||
builder.setContentIntent(pi);
|
builder.setContentIntent(pi);
|
||||||
@@ -685,9 +700,79 @@ public class NotificationShellCmd extends ShellCommand {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void waitForSnooze(ShellNls nls, String key) {
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
StatusBarNotification[] sbns = nls.getSnoozedNotifications();
|
||||||
|
for (StatusBarNotification sbn : sbns) {
|
||||||
|
if (sbn.getKey().equals(key)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean waitForBind(ShellNls nls) {
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
if (nls.isConnected) {
|
||||||
|
Slog.i(TAG, "Bound Shell NLS");
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void waitForUnbind(ShellNls nls) {
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
if (!nls.isConnected) {
|
||||||
|
Slog.i(TAG, "Unbound Shell NLS");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onHelp() {
|
public void onHelp() {
|
||||||
getOutPrintWriter().println(USAGE);
|
getOutPrintWriter().println(USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("OverrideAbstract")
|
||||||
|
private static class ShellNls extends NotificationListenerService {
|
||||||
|
private static ShellNls
|
||||||
|
sNotificationListenerInstance = null;
|
||||||
|
boolean isConnected;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onListenerConnected() {
|
||||||
|
super.onListenerConnected();
|
||||||
|
sNotificationListenerInstance = this;
|
||||||
|
isConnected = true;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onListenerDisconnected() {
|
||||||
|
isConnected = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ShellNls getInstance() {
|
||||||
|
return sNotificationListenerInstance;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user