diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2019-05-03 16:50:43 -0700 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2019-05-03 21:31:46 -0700 |
commit | 905262c1a73deeafdec9f12016a218b52bbabbaf (patch) | |
tree | 4189ef95b8c51b917baeede96d760f5e8aa53db3 /src/com/android/launcher3 | |
parent | 1bdb0f4046155ffb56a995aef942fc1e3367d0eb (diff) | |
download | packages_apps_Trebuchet-905262c1a73deeafdec9f12016a218b52bbabbaf.tar.gz packages_apps_Trebuchet-905262c1a73deeafdec9f12016a218b52bbabbaf.tar.bz2 packages_apps_Trebuchet-905262c1a73deeafdec9f12016a218b52bbabbaf.zip |
Adding utility method to get adaptive icon scale
Change-Id: I5ff190c3b794bb13309375782ccd420e85b59091
Diffstat (limited to 'src/com/android/launcher3')
-rw-r--r-- | src/com/android/launcher3/InvariantDeviceProfile.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/MainProcessInitializer.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/folder/FolderAnimationManager.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/folder/PreviewBackground.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/graphics/DrawableFactory.java | 45 | ||||
-rw-r--r-- | src/com/android/launcher3/graphics/IconShape.java (renamed from src/com/android/launcher3/folder/FolderShape.java) | 77 | ||||
-rw-r--r-- | src/com/android/launcher3/graphics/PreloadIconDrawable.java | 10 | ||||
-rw-r--r-- | src/com/android/launcher3/views/FloatingIconView.java | 4 |
8 files changed, 69 insertions, 81 deletions
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 3e7f67bc6..819a55147 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -42,7 +42,7 @@ import android.util.Xml; import android.view.Display; import android.view.WindowManager; -import com.android.launcher3.folder.FolderShape; +import com.android.launcher3.graphics.IconShape; import com.android.launcher3.util.ConfigMonitor; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.MainThreadInitializedObject; @@ -304,7 +304,7 @@ public class InvariantDeviceProfile { changeFlags |= CHANGE_FLAG_ICON_PARAMS; } if (!iconShapePath.equals(oldProfile.iconShapePath)) { - FolderShape.init(context); + IconShape.init(context); } apply(context, changeFlags); diff --git a/src/com/android/launcher3/MainProcessInitializer.java b/src/com/android/launcher3/MainProcessInitializer.java index 93df02576..95ee68731 100644 --- a/src/com/android/launcher3/MainProcessInitializer.java +++ b/src/com/android/launcher3/MainProcessInitializer.java @@ -19,7 +19,7 @@ package com.android.launcher3; import android.content.Context; import com.android.launcher3.config.FeatureFlags; -import com.android.launcher3.folder.FolderShape; +import com.android.launcher3.graphics.IconShape; import com.android.launcher3.logging.FileLog; import com.android.launcher3.util.ResourceBasedOverride; @@ -38,6 +38,6 @@ public class MainProcessInitializer implements ResourceBasedOverride { FileLog.setDir(context.getApplicationContext().getFilesDir()); FeatureFlags.initialize(context); SessionCommitReceiver.applyDefaultUserPrefs(context); - FolderShape.init(context); + IconShape.init(context); } } diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java index 2461e284d..245003989 100644 --- a/src/com/android/launcher3/folder/FolderAnimationManager.java +++ b/src/com/android/launcher3/folder/FolderAnimationManager.java @@ -19,7 +19,7 @@ package com.android.launcher3.folder; import static com.android.launcher3.BubbleTextView.TEXT_ALPHA_PROPERTY; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; -import static com.android.launcher3.folder.FolderShape.getShape; +import static com.android.launcher3.graphics.IconShape.getShape; import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java index 46df77a42..09e827649 100644 --- a/src/com/android/launcher3/folder/PreviewBackground.java +++ b/src/com/android/launcher3/folder/PreviewBackground.java @@ -16,7 +16,7 @@ package com.android.launcher3.folder; -import static com.android.launcher3.folder.FolderShape.getShape; +import static com.android.launcher3.graphics.IconShape.getShape; import static com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound; import android.animation.Animator; @@ -311,7 +311,7 @@ public class PreviewBackground { public Path getClipPath() { mPath.reset(); - getShape().addShape(mPath, getOffsetX(), getOffsetY(), getScaledRadius()); + getShape().addToPath(mPath, getOffsetX(), getOffsetY(), getScaledRadius()); return mPath; } diff --git a/src/com/android/launcher3/graphics/DrawableFactory.java b/src/com/android/launcher3/graphics/DrawableFactory.java index ce83a177a..c9566cb14 100644 --- a/src/com/android/launcher3/graphics/DrawableFactory.java +++ b/src/com/android/launcher3/graphics/DrawableFactory.java @@ -16,15 +16,15 @@ package com.android.launcher3.graphics; +import static com.android.launcher3.graphics.IconShape.getShapePath; + import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Path; import android.graphics.Rect; -import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Process; @@ -34,7 +34,6 @@ import android.util.ArrayMap; import com.android.launcher3.FastBitmapDrawable; import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.icons.BitmapInfo; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.ResourceBasedOverride; @@ -47,16 +46,8 @@ import androidx.annotation.UiThread; public class DrawableFactory implements ResourceBasedOverride { public static final MainThreadInitializedObject<DrawableFactory> INSTANCE = - new MainThreadInitializedObject<>(c -> { - DrawableFactory factory = Overrides.getObject(DrawableFactory.class, - c.getApplicationContext(), R.string.drawable_factory_class); - factory.mContext = c; - return factory; - }); - - - private Context mContext; - private Path mPreloadProgressPath; + new MainThreadInitializedObject<>(c -> Overrides.getObject(DrawableFactory.class, + c.getApplicationContext(), R.string.drawable_factory_class)); protected final UserHandle mMyUser = Process.myUserHandle(); protected final ArrayMap<UserHandle, Bitmap> mUserBadges = new ArrayMap<>(); @@ -66,7 +57,7 @@ public class DrawableFactory implements ResourceBasedOverride { */ public FastBitmapDrawable newIcon(Context context, ItemInfoWithIcon info) { FastBitmapDrawable drawable = info.usingLowResIcon() - ? new PlaceHolderIconDrawable(info, getPreloadProgressPath(), context) + ? new PlaceHolderIconDrawable(info, getShapePath(), context) : new FastBitmapDrawable(info); drawable.setIsDisabled(info.isDisabled()); return drawable; @@ -74,7 +65,7 @@ public class DrawableFactory implements ResourceBasedOverride { public FastBitmapDrawable newIcon(Context context, BitmapInfo info, ActivityInfo target) { return info.isLowRes() - ? new PlaceHolderIconDrawable(info, getPreloadProgressPath(), context) + ? new PlaceHolderIconDrawable(info, getShapePath(), context) : new FastBitmapDrawable(info); } @@ -82,29 +73,7 @@ public class DrawableFactory implements ResourceBasedOverride { * Returns a FastBitmapDrawable with the icon. */ public PreloadIconDrawable newPendingIcon(Context context, ItemInfoWithIcon info) { - return new PreloadIconDrawable(info, getPreloadProgressPath(), context); - } - - protected Path getPreloadProgressPath() { - if (mPreloadProgressPath != null) { - return mPreloadProgressPath; - } - if (Utilities.ATLEAST_OREO) { - // Load the path from Mask Icon - AdaptiveIconDrawable icon = (AdaptiveIconDrawable) - mContext.getDrawable(R.drawable.adaptive_icon_drawable_wrapper); - icon.setBounds(0, 0, - PreloadIconDrawable.PATH_SIZE, PreloadIconDrawable.PATH_SIZE); - mPreloadProgressPath = icon.getIconMask(); - } else { - - // Create a circle static from top center and going clockwise. - Path p = new Path(); - p.moveTo(PreloadIconDrawable.PATH_SIZE / 2, 0); - p.addArc(0, 0, PreloadIconDrawable.PATH_SIZE, PreloadIconDrawable.PATH_SIZE, -90, 360); - mPreloadProgressPath = p; - } - return mPreloadProgressPath; + return new PreloadIconDrawable(info, getShapePath(), context); } /** diff --git a/src/com/android/launcher3/folder/FolderShape.java b/src/com/android/launcher3/graphics/IconShape.java index ec6078e83..88e4452e1 100644 --- a/src/com/android/launcher3/folder/FolderShape.java +++ b/src/com/android/launcher3/graphics/IconShape.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.launcher3.folder; +package com.android.launcher3.graphics; + +import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -31,7 +33,6 @@ import android.graphics.Path; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region.Op; -import android.graphics.RegionIterator; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.ColorDrawable; import android.os.Build; @@ -45,6 +46,8 @@ import android.view.ViewOutlineProvider; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; +import com.android.launcher3.icons.GraphicsUtils; +import com.android.launcher3.icons.IconNormalizer; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ClipPathView; @@ -59,22 +62,39 @@ import java.util.List; import androidx.annotation.Nullable; /** - * Abstract representation of the shape of a folder icon + * Abstract representation of the shape of an icon shape */ -public abstract class FolderShape { +public abstract class IconShape { + + private static IconShape sInstance = new Circle(); + private static Path sShapePath; + private static float sNormalizationScale = ICON_VISIBLE_AREA_FACTOR; - private static FolderShape sInstance = new Circle(); + public static final int DEFAULT_PATH_SIZE = 100; - public static FolderShape getShape() { + public static IconShape getShape() { return sInstance; } + public static Path getShapePath() { + if (sShapePath == null) { + Path p = new Path(); + getShape().addToPath(p, 0, 0, DEFAULT_PATH_SIZE * 0.5f); + sShapePath = p; + } + return sShapePath; + } + + public static float getNormalizationScale() { + return sNormalizationScale; + } + private SparseArray<TypedValue> mAttrs; public abstract void drawShape(Canvas canvas, float offsetX, float offsetY, float radius, Paint paint); - public abstract void addShape(Path path, float offsetX, float offsetY, float radius); + public abstract void addToPath(Path path, float offsetX, float offsetY, float radius); public abstract <T extends View & ClipPathView> Animator createRevealAnimator(T target, Rect startRect, Rect endRect, float endRadius, boolean isReversed); @@ -87,7 +107,7 @@ public abstract class FolderShape { /** * Abstract shape where the reveal animation is a derivative of a round rect animation */ - private static abstract class SimpleRectShape extends FolderShape { + private static abstract class SimpleRectShape extends IconShape { @Override public final <T extends View & ClipPathView> Animator createRevealAnimator(T target, @@ -107,7 +127,7 @@ public abstract class FolderShape { /** * Abstract shape which draws using {@link Path} */ - private static abstract class PathShape extends FolderShape { + private static abstract class PathShape extends IconShape { private final Path mTmpPath = new Path(); @@ -115,7 +135,7 @@ public abstract class FolderShape { public final void drawShape(Canvas canvas, float offsetX, float offsetY, float radius, Paint paint) { mTmpPath.reset(); - addShape(mTmpPath, offsetX, offsetY, radius); + addToPath(mTmpPath, offsetX, offsetY, radius); canvas.drawPath(mTmpPath, paint); } @@ -166,7 +186,7 @@ public abstract class FolderShape { } @Override - public void addShape(Path path, float offsetX, float offsetY, float radius) { + public void addToPath(Path path, float offsetX, float offsetY, float radius) { path.addCircle(radius + offsetX, radius + offsetY, radius, Path.Direction.CW); } @@ -196,7 +216,7 @@ public abstract class FolderShape { } @Override - public void addShape(Path path, float offsetX, float offsetY, float radius) { + public void addToPath(Path path, float offsetX, float offsetY, float radius) { float cx = radius + offsetX; float cy = radius + offsetY; float cr = radius * mRadiusRatio; @@ -223,7 +243,7 @@ public abstract class FolderShape { } @Override - public void addShape(Path p, float offsetX, float offsetY, float r1) { + public void addToPath(Path p, float offsetX, float offsetY, float r1) { float r2 = r1 * mRadiusRatio; float cx = r1 + offsetX; float cy = r1 + offsetY; @@ -274,7 +294,7 @@ public abstract class FolderShape { } @Override - public void addShape(Path p, float offsetX, float offsetY, float r) { + public void addToPath(Path p, float offsetX, float offsetY, float r) { float cx = r + offsetX; float cy = r + offsetY; float control = r - r * mRadiusRatio; @@ -358,7 +378,7 @@ public abstract class FolderShape { pickBestShape(context); } - private static FolderShape getShapeDefinition(String type, float radius) { + private static IconShape getShapeDefinition(String type, float radius) { switch (type) { case "Circle": return new Circle(); @@ -373,8 +393,8 @@ public abstract class FolderShape { } } - private static List<FolderShape> getAllShapes(Context context) { - ArrayList<FolderShape> result = new ArrayList<>(); + private static List<IconShape> getAllShapes(Context context) { + ArrayList<IconShape> result = new ArrayList<>(); try (XmlResourceParser parser = context.getResources().getXml(R.xml.folder_shapes)) { // Find the root tag @@ -393,7 +413,7 @@ public abstract class FolderShape { if (type == XmlPullParser.START_TAG) { AttributeSet attrs = Xml.asAttributeSet(parser); TypedArray a = context.obtainStyledAttributes(attrs, radiusAttr); - FolderShape shape = getShapeDefinition(parser.getName(), a.getFloat(0, 1)); + IconShape shape = getShapeDefinition(parser.getName(), a.getFloat(0, 1)); a.recycle(); shape.mAttrs = Themes.createValueMap(context, attrs, keysToIgnore); @@ -409,7 +429,7 @@ public abstract class FolderShape { @TargetApi(Build.VERSION_CODES.O) protected static void pickBestShape(Context context) { // Pick any large size - int size = 200; + final int size = 200; Region full = new Region(0, 0, size, size); Region iconR = new Region(); @@ -420,23 +440,17 @@ public abstract class FolderShape { Path shapePath = new Path(); Region shapeR = new Region(); - Rect tempRect = new Rect(); // Find the shape with minimum area of divergent region. int minArea = Integer.MAX_VALUE; - FolderShape closestShape = null; - for (FolderShape shape : getAllShapes(context)) { + IconShape closestShape = null; + for (IconShape shape : getAllShapes(context)) { shapePath.reset(); - shape.addShape(shapePath, 0, 0, size / 2f); + shape.addToPath(shapePath, 0, 0, size / 2f); shapeR.setPath(shapePath, full); shapeR.op(iconR, Op.XOR); - RegionIterator itr = new RegionIterator(shapeR); - int area = 0; - - while (itr.next(tempRect)) { - area += tempRect.width() * tempRect.height(); - } + int area = GraphicsUtils.getArea(shapeR); if (area < minArea) { minArea = area; closestShape = shape; @@ -446,5 +460,10 @@ public abstract class FolderShape { if (closestShape != null) { sInstance = closestShape; } + + // Initialize shape properties + drawable.setBounds(0, 0, DEFAULT_PATH_SIZE, DEFAULT_PATH_SIZE); + sShapePath = new Path(drawable.getIconMask()); + sNormalizationScale = IconNormalizer.normalizeAdaptiveIcon(drawable, size, null); } } diff --git a/src/com/android/launcher3/graphics/PreloadIconDrawable.java b/src/com/android/launcher3/graphics/PreloadIconDrawable.java index d3a7955b2..cc4c2efaf 100644 --- a/src/com/android/launcher3/graphics/PreloadIconDrawable.java +++ b/src/com/android/launcher3/graphics/PreloadIconDrawable.java @@ -17,6 +17,8 @@ package com.android.launcher3.graphics; +import static com.android.launcher3.graphics.IconShape.DEFAULT_PATH_SIZE; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -55,8 +57,6 @@ public class PreloadIconDrawable extends FastBitmapDrawable { } }; - public static final int PATH_SIZE = 100; - private static final float PROGRESS_WIDTH = 7; private static final float PROGRESS_GAP = 2; private static final int MAX_PAINT_ALPHA = 255; @@ -123,14 +123,14 @@ public class PreloadIconDrawable extends FastBitmapDrawable { protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); mTmpMatrix.setScale( - (bounds.width() - 2 * PROGRESS_WIDTH - 2 * PROGRESS_GAP) / PATH_SIZE, - (bounds.height() - 2 * PROGRESS_WIDTH - 2 * PROGRESS_GAP) / PATH_SIZE); + (bounds.width() - 2 * PROGRESS_WIDTH - 2 * PROGRESS_GAP) / DEFAULT_PATH_SIZE, + (bounds.height() - 2 * PROGRESS_WIDTH - 2 * PROGRESS_GAP) / DEFAULT_PATH_SIZE); mTmpMatrix.postTranslate( bounds.left + PROGRESS_WIDTH + PROGRESS_GAP, bounds.top + PROGRESS_WIDTH + PROGRESS_GAP); mProgressPath.transform(mTmpMatrix, mScaledTrackPath); - float scale = bounds.width() / PATH_SIZE; + float scale = bounds.width() / DEFAULT_PATH_SIZE; mProgressPaint.setStrokeWidth(PROGRESS_WIDTH * scale); mShadowBitmap = getShadowBitmap(bounds.width(), bounds.height(), diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java index 020e3809e..e2c8c149c 100644 --- a/src/com/android/launcher3/views/FloatingIconView.java +++ b/src/com/android/launcher3/views/FloatingIconView.java @@ -54,7 +54,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.FolderAdaptiveIcon; import com.android.launcher3.folder.FolderIcon; -import com.android.launcher3.folder.FolderShape; +import com.android.launcher3.graphics.IconShape; import com.android.launcher3.graphics.ShiftedBitmapDrawable; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.popup.SystemShortcut; @@ -144,7 +144,7 @@ public class FloatingIconView extends View implements Animator.AnimatorListener, mTaskCornerRadius = cornerRadius; if (mIsAdaptiveIcon && shapeRevealProgress >= 0) { if (mRevealAnimator == null) { - mRevealAnimator = (ValueAnimator) FolderShape.getShape().createRevealAnimator(this, + mRevealAnimator = (ValueAnimator) IconShape.getShape().createRevealAnimator(this, mStartRevealRect, mEndRevealRect, mTaskCornerRadius / scale, !isOpening); mRevealAnimator.addListener(new AnimatorListenerAdapter() { @Override |