From 31b55249e8b2195f43179ca4b21f572bfe94537d Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Wed, 26 May 2021 16:27:18 -0400 Subject: [PATCH] Do not show the custom views of spoofing notitifactions. Fixes: 189189308 Fixes: 189189219 Fixes: 189189310 Fixes: 189078626 Test: lots of manual testing with custom views Change-Id: I069a83288f72803b6d0956899a44a527a7758c18 --- core/java/android/app/Notification.java | 36 ++++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 47ababf71e509..16b6f21cad481 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -450,10 +450,12 @@ public class Notification implements Parcelable STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_text); STANDARD_LAYOUTS.add(R.layout.notification_template_material_inbox); STANDARD_LAYOUTS.add(R.layout.notification_template_material_messaging); + STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_messaging); STANDARD_LAYOUTS.add(R.layout.notification_template_material_conversation); STANDARD_LAYOUTS.add(R.layout.notification_template_material_media); STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_media); STANDARD_LAYOUTS.add(R.layout.notification_template_material_call); + STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_call); STANDARD_LAYOUTS.add(R.layout.notification_template_header); } @@ -5804,7 +5806,7 @@ public class Notification implements Parcelable * @hide */ public RemoteViews createContentView(boolean increasedHeight) { - if (mN.contentView != null && useExistingRemoteView()) { + if (useExistingRemoteView(mN.contentView)) { return fullyCustomViewRequiresDecoration(false /* fromStyle */) ? minimallyDecoratedContentView(mN.contentView) : mN.contentView; } else if (mStyle != null) { @@ -5820,8 +5822,24 @@ public class Notification implements Parcelable return applyStandardTemplate(getBaseLayoutResource(), p, null /* result */); } - private boolean useExistingRemoteView() { - return mStyle == null || !mStyle.displayCustomViewInline(); + private boolean useExistingRemoteView(RemoteViews customContent) { + if (customContent == null) { + return false; + } + if (styleDisplaysCustomViewInline()) { + // the provided custom view is intended to be wrapped by the style. + return false; + } + if (fullyCustomViewRequiresDecoration(false) + && STANDARD_LAYOUTS.contains(customContent.getLayoutId())) { + // If the app's custom views are objects returned from Builder.create*ContentView() + // then the app is most likely attempting to spoof the user. Even if they are not, + // the result would be broken (b/189189308) so we will ignore it. + Log.w(TAG, "For apps targeting S, a custom content view that is a modified " + + "version of any standard layout is disallowed."); + return false; + } + return true; } /** @@ -5829,7 +5847,7 @@ public class Notification implements Parcelable */ public RemoteViews createBigContentView() { RemoteViews result = null; - if (mN.bigContentView != null && useExistingRemoteView()) { + if (useExistingRemoteView(mN.bigContentView)) { return fullyCustomViewRequiresDecoration(false /* fromStyle */) ? minimallyDecoratedBigContentView(mN.bigContentView) : mN.bigContentView; } @@ -5934,7 +5952,7 @@ public class Notification implements Parcelable * @hide */ public RemoteViews createHeadsUpContentView(boolean increasedHeight) { - if (mN.headsUpContentView != null && useExistingRemoteView()) { + if (useExistingRemoteView(mN.headsUpContentView)) { return fullyCustomViewRequiresDecoration(false /* fromStyle */) ? minimallyDecoratedHeadsUpContentView(mN.headsUpContentView) : mN.headsUpContentView; @@ -6383,7 +6401,7 @@ public class Notification implements Parcelable mN.reduceImageSizes(mContext); if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.N - && (useExistingRemoteView())) { + && !styleDisplaysCustomViewInline()) { if (mN.contentView == null) { mN.contentView = createContentView(); mN.extras.putInt(EXTRA_REBUILD_CONTENT_VIEW_ACTION_COUNT, @@ -6414,6 +6432,10 @@ public class Notification implements Parcelable return mN; } + private boolean styleDisplaysCustomViewInline() { + return mStyle != null && mStyle.displayCustomViewInline(); + } + /** * Apply this Builder to an existing {@link Notification} object. * @@ -6563,7 +6585,7 @@ public class Notification implements Parcelable public boolean usesTemplate() { return (mN.contentView == null && mN.headsUpContentView == null && mN.bigContentView == null) - || (mStyle != null && mStyle.displayCustomViewInline()); + || styleDisplaysCustomViewInline(); } }