summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorJoshua Duong <joshuaduong@google.com>2020-04-17 16:08:57 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-04-17 16:08:57 +0000
commit9a419cda53f415465431ac9e48e4950191c19c6c (patch)
treee6fcfb5cdb7c3576bd8f3532e7a06a4a62a7a90c /core/java/android
parent2bac15965943c6815799c85f4367717e421fd8f7 (diff)
parentec1980f86b686497c373e6bd30812526808387a9 (diff)
Merge "Fix PendingIntent hijacking for adb notifications." into rvc-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/debug/AdbNotifications.java90
1 files changed, 90 insertions, 0 deletions
diff --git a/core/java/android/debug/AdbNotifications.java b/core/java/android/debug/AdbNotifications.java
new file mode 100644
index 000000000000..fed5f5f9a0bf
--- /dev/null
+++ b/core/java/android/debug/AdbNotifications.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+import android.annotation.NonNull;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.UserHandle;
+import android.provider.Settings;
+
+import com.android.internal.notification.SystemNotificationChannels;
+
+/**
+ * Utility class for building adb notifications.
+ * @hide
+ */
+public final class AdbNotifications {
+ /**
+ * Notification channel for tv types.
+ */
+ private static final String ADB_NOTIFICATION_CHANNEL_ID_TV = "usbdevicemanager.adb.tv";
+
+ /**
+ * Builds a notification to show connected state for adb over a transport type.
+ * @param context the context
+ * @param transportType the adb transport type.
+ * @return a newly created Notification for the transport type.
+ */
+ public static Notification createNotification(@NonNull Context context,
+ byte transportType) {
+ Resources resources = context.getResources();
+ int titleId;
+ int messageId;
+
+ if (transportType == AdbTransportType.USB) {
+ titleId = com.android.internal.R.string.adb_active_notification_title;
+ messageId = com.android.internal.R.string.adb_active_notification_message;
+ } else if (transportType == AdbTransportType.WIFI) {
+ titleId = com.android.internal.R.string.adbwifi_active_notification_title;
+ messageId = com.android.internal.R.string.adbwifi_active_notification_message;
+ } else {
+ throw new IllegalArgumentException(
+ "createNotification called with unknown transport type=" + transportType);
+ }
+
+ CharSequence title = resources.getText(titleId);
+ CharSequence message = resources.getText(messageId);
+
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ intent.setPackage(context.getPackageManager().resolveActivity(intent,
+ PackageManager.MATCH_SYSTEM_ONLY).activityInfo.packageName);
+ PendingIntent pIntent = PendingIntent.getActivityAsUser(context, 0, intent,
+ PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT);
+
+ return new Notification.Builder(context, SystemNotificationChannels.DEVELOPER_IMPORTANT)
+ .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+ .setWhen(0)
+ .setOngoing(true)
+ .setTicker(title)
+ .setDefaults(0) // please be quiet
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(title)
+ .setContentText(message)
+ .setContentIntent(pIntent)
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .extend(new Notification.TvExtender()
+ .setChannelId(ADB_NOTIFICATION_CHANNEL_ID_TV))
+ .build();
+ }
+}