summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2019-05-03 16:50:43 -0700
committerSunny Goyal <sunnygoyal@google.com>2019-05-03 21:31:46 -0700
commit905262c1a73deeafdec9f12016a218b52bbabbaf (patch)
tree4189ef95b8c51b917baeede96d760f5e8aa53db3 /src
parent1bdb0f4046155ffb56a995aef942fc1e3367d0eb (diff)
downloadandroid_packages_apps_Trebuchet-905262c1a73deeafdec9f12016a218b52bbabbaf.tar.gz
android_packages_apps_Trebuchet-905262c1a73deeafdec9f12016a218b52bbabbaf.tar.bz2
android_packages_apps_Trebuchet-905262c1a73deeafdec9f12016a218b52bbabbaf.zip
Adding utility method to get adaptive icon scale
Change-Id: I5ff190c3b794bb13309375782ccd420e85b59091
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher3/InvariantDeviceProfile.java4
-rw-r--r--src/com/android/launcher3/MainProcessInitializer.java4
-rw-r--r--src/com/android/launcher3/folder/FolderAnimationManager.java2
-rw-r--r--src/com/android/launcher3/folder/PreviewBackground.java4
-rw-r--r--src/com/android/launcher3/graphics/DrawableFactory.java45
-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.java10
-rw-r--r--src/com/android/launcher3/views/FloatingIconView.java4
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