diff options
| -rw-r--r-- | core/java/android/app/Notification.java | 66 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationContentDescription.kt | 25 |
2 files changed, 40 insertions, 51 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index aa9de814b4c5..d6e8ae3e5dff 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3020,6 +3020,43 @@ public class Notification implements Parcelable } /** + * @hide + */ + public String loadHeaderAppName(Context context) { + CharSequence name = null; + // Check if there is a non-empty substitute app name and return that. + if (extras.containsKey(EXTRA_SUBSTITUTE_APP_NAME)) { + name = extras.getString(EXTRA_SUBSTITUTE_APP_NAME); + if (!TextUtils.isEmpty(name)) { + return name.toString(); + } + } + // If not, try getting the app info from extras. + if (context == null) { + return null; + } + final PackageManager pm = context.getPackageManager(); + if (TextUtils.isEmpty(name)) { + if (extras.containsKey(EXTRA_BUILDER_APPLICATION_INFO)) { + final ApplicationInfo info = extras.getParcelable(EXTRA_BUILDER_APPLICATION_INFO, + ApplicationInfo.class); + if (info != null) { + name = pm.getApplicationLabel(info); + } + } + } + // If that's still empty, use the one from the context directly. + if (TextUtils.isEmpty(name)) { + name = pm.getApplicationLabel(context.getApplicationInfo()); + } + // If there's still nothing, ¯\_(ツ)_/¯ + if (TextUtils.isEmpty(name)) { + return null; + } + return name.toString(); + } + + /** * Removes heavyweight parts of the Notification object for archival or for sending to * listeners when the full contents are not necessary. * @hide @@ -5769,34 +5806,7 @@ public class Notification implements Parcelable */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public String loadHeaderAppName() { - CharSequence name = null; - final PackageManager pm = mContext.getPackageManager(); - if (mN.extras.containsKey(EXTRA_SUBSTITUTE_APP_NAME)) { - // only system packages which lump together a bunch of unrelated stuff - // may substitute a different name to make the purpose of the - // notification more clear. the correct package label should always - // be accessible via SystemUI. - final String pkg = mContext.getPackageName(); - final String subName = mN.extras.getString(EXTRA_SUBSTITUTE_APP_NAME); - if (PackageManager.PERMISSION_GRANTED == pm.checkPermission( - android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME, pkg)) { - name = subName; - } else { - Log.w(TAG, "warning: pkg " - + pkg + " attempting to substitute app name '" + subName - + "' without holding perm " - + android.Manifest.permission.SUBSTITUTE_NOTIFICATION_APP_NAME); - } - } - if (TextUtils.isEmpty(name)) { - name = pm.getApplicationLabel(mContext.getApplicationInfo()); - } - if (TextUtils.isEmpty(name)) { - // still nothing? - return null; - } - - return String.valueOf(name); + return mN.loadHeaderAppName(mContext); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationContentDescription.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationContentDescription.kt index e7012ea51caf..17fc5c60f74f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationContentDescription.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationContentDescription.kt @@ -20,35 +20,14 @@ package com.android.systemui.statusbar.notification import android.app.Notification import android.content.Context -import android.content.pm.ApplicationInfo import android.text.TextUtils -import android.util.Log import androidx.annotation.MainThread import com.android.systemui.res.R -/** - * Returns accessibility content description for a given notification. - * - * NOTE: This is a relatively slow call. - */ +/** Returns accessibility content description for a given notification. */ @MainThread fun contentDescForNotification(c: Context, n: Notification?): CharSequence { - var appName = "" - try { - val builder = Notification.Builder.recoverBuilder(c, n) - appName = builder.loadHeaderAppName() - } catch (e: RuntimeException) { - Log.e("ContentDescription", "Unable to recover builder", e) - // Trying to get the app name from the app info instead. - val appInfo = - n?.extras?.getParcelable( - Notification.EXTRA_BUILDER_APPLICATION_INFO, - ApplicationInfo::class.java - ) - if (appInfo != null) { - appName = appInfo.loadLabel(c.packageManager).toString() - } - } + val appName = n?.loadHeaderAppName(c) ?: "" val title = n?.extras?.getCharSequence(Notification.EXTRA_TITLE) val text = n?.extras?.getCharSequence(Notification.EXTRA_TEXT) val ticker = n?.tickerText |