From d45a8b5d6097f05d9ffcd1f5f26c9dbb4a041293 Mon Sep 17 00:00:00 2001 From: Mike Digman Date: Wed, 13 May 2020 12:32:19 -0700 Subject: [PATCH] Correct Sharesheet icon and badge sizing SimpleIconFactory previously used fixed resources to render icons and badges. Resolver and Chooser need different icon and badge dimensions. This cause scaling issues. Move those sizes to a styleable attr. New dimensions align with design red lines. Test: manual Fixes: 155813501 Change-Id: I765ba7aab1346eacf9e1cf7b6cdbfbbb14dbc3bb --- .../android/internal/app/ChooserActivity.java | 5 ++++ .../internal/app/ResolverActivity.java | 6 +++- .../internal/app/SimpleIconFactory.java | 29 ++++++++++++++++--- core/res/AndroidManifest.xml | 2 +- core/res/res/values/attrs.xml | 3 ++ core/res/res/values/dimens.xml | 3 +- core/res/res/values/symbols.xml | 8 ++++- .../res/res/values/themes_device_defaults.xml | 7 +++++ 8 files changed, 55 insertions(+), 8 deletions(-) diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 3fc3f3e65d375..cff669e6c5b9e 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -778,6 +778,11 @@ public class ChooserActivity extends ResolverActivity implements mDirectShareShortcutInfoCache = new HashMap<>(); } + @Override + protected int appliedThemeResId() { + return R.style.Theme_DeviceDefault_Chooser; + } + private AppPredictor setupAppPredictorForUser(UserHandle userHandle, AppPredictor.Callback appPredictorCallback) { AppPredictor appPredictor = getAppPredictorForDirectShareIfEnabled(userHandle); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 9c2df131d11a0..4700f42a46c7b 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -324,7 +324,7 @@ public class ResolverActivity extends Activity implements protected void onCreate(Bundle savedInstanceState, Intent intent, CharSequence title, int defaultTitleRes, Intent[] initialIntents, List rList, boolean supportsAlwaysUseOption) { - setTheme(R.style.Theme_DeviceDefault_Resolver); + setTheme(appliedThemeResId()); super.onCreate(savedInstanceState); // Determine whether we should show that intent is forwarded @@ -507,6 +507,10 @@ public class ResolverActivity extends Activity implements /* shouldShowNoCrossProfileIntentsEmptyState= */ getUser().equals(intentUser)); } + protected int appliedThemeResId() { + return R.style.Theme_DeviceDefault_Resolver; + } + /** * Returns the user id of the user that the starting intent originated from. *

This is not necessarily equal to {@link #getUserId()} or {@link UserHandle#myUserId()}, diff --git a/core/java/com/android/internal/app/SimpleIconFactory.java b/core/java/com/android/internal/app/SimpleIconFactory.java index d618cdf86865a..ffe2dbe4ccc06 100644 --- a/core/java/com/android/internal/app/SimpleIconFactory.java +++ b/core/java/com/android/internal/app/SimpleIconFactory.java @@ -20,6 +20,7 @@ import static android.content.Context.ACTIVITY_SERVICE; import static android.graphics.Paint.DITHER_FLAG; import static android.graphics.Paint.FILTER_BITMAP_FLAG; +import android.annotation.AttrRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -46,6 +47,7 @@ import android.graphics.drawable.DrawableWrapper; import android.os.UserHandle; import android.util.AttributeSet; import android.util.Pools.SynchronizedPool; +import android.util.TypedValue; import com.android.internal.R; @@ -92,10 +94,8 @@ public class SimpleIconFactory { final ActivityManager am = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE); final int iconDpi = (am == null) ? 0 : am.getLauncherLargeIconDensity(); - final Resources r = ctx.getResources(); - final int iconSize = r.getDimensionPixelSize(R.dimen.resolver_icon_size); - final int badgeSize = r.getDimensionPixelSize(R.dimen.resolver_badge_size); - + final int iconSize = getIconSizeFromContext(ctx); + final int badgeSize = getBadgeSizeFromContext(ctx); instance = new SimpleIconFactory(ctx, iconDpi, iconSize, badgeSize); instance.setWrapperBackgroundColor(Color.WHITE); } @@ -103,6 +103,27 @@ public class SimpleIconFactory { return instance; } + private static int getAttrDimFromContext(Context ctx, @AttrRes int attrId, String errorMsg) { + final Resources res = ctx.getResources(); + TypedValue outVal = new TypedValue(); + if (!ctx.getTheme().resolveAttribute(attrId, outVal, true)) { + throw new IllegalStateException(errorMsg); + } + return res.getDimensionPixelSize(outVal.resourceId); + } + + private static int getIconSizeFromContext(Context ctx) { + return getAttrDimFromContext(ctx, + com.android.internal.R.attr.iconfactoryIconSize, + "Expected theme to define iconfactoryIconSize."); + } + + private static int getBadgeSizeFromContext(Context ctx) { + return getAttrDimFromContext(ctx, + com.android.internal.R.attr.iconfactoryBadgeSize, + "Expected theme to define iconfactoryBadgeSize."); + } + /** * Recycles the SimpleIconFactory so others may use it. * diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 0bf504595714b..3cd0f03de7272 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -5053,7 +5053,7 @@ android:forceQueryable="true" android:directBootAware="true"> + + + diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 2ac61ecad2e57..c7ad5da7d1c7a 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -810,7 +810,8 @@ 4dp 288dp 72dp - 42dp + 56dp + 22dp 32dp 8dp 18dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 369a3e51df264..52aab77e32a4c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2534,6 +2534,7 @@ + @@ -3784,8 +3785,11 @@ - + + + + @@ -3794,6 +3798,7 @@ + @@ -4019,4 +4024,5 @@ + diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 81ec27841aa74..1afaf4f7f1842 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -1680,6 +1680,8 @@ easier. ?attr/dialogPreferredPadding @android:color/transparent @style/Widget.DeviceDefault.Resolver.TabWidget + @dimen/resolver_icon_size + @dimen/resolver_badge_size + +