From 7539d7649c2578212830b55c495fb764e79f29f1 Mon Sep 17 00:00:00 2001 From: Federico Baron Date: Thu, 29 Sep 2022 09:47:04 -0700 Subject: [PATCH 1/2] Change delightful pagination flag and use it for workspace Before the flag name would only fit 'delightful pagination' for folders, but now we're adding that feature to workspace also, hence the flag rename. The flag is now also used in launcher to show the new XML file that uses PageIndicatorDots rather than WorkspacePageIndicator Bug: 249773534 Test: manual Change-Id: I6cf6d52e76ad1ec60ecb54c5cca204e9ac35cc39 --- res/layout/page_indicator_dots.xml | 22 +++++++++++++++++++ src/com/android/launcher3/Launcher.java | 13 +++++++++++ .../launcher3/config/FeatureFlags.java | 20 ++++++++--------- .../pageindicators/PageIndicatorDots.java | 16 +++++++------- 4 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 res/layout/page_indicator_dots.xml diff --git a/res/layout/page_indicator_dots.xml b/res/layout/page_indicator_dots.xml new file mode 100644 index 0000000000..d5fe51e734 --- /dev/null +++ b/res/layout/page_indicator_dots.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index a6831aafa9..6b10e5fc54 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -43,6 +43,7 @@ import static com.android.launcher3.LauncherState.SPRING_LOADED; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.getSupportedActions; import static com.android.launcher3.anim.Interpolators.EMPHASIZED; +import static com.android.launcher3.config.FeatureFlags.SHOW_DELIGHTFUL_PAGINATION; import static com.android.launcher3.logging.StatsLogManager.EventEnum; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKGROUND; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; @@ -97,6 +98,7 @@ import android.os.Trace; import android.os.UserHandle; import android.text.TextUtils; import android.text.method.TextKeyListener; +import android.util.AttributeSet; import android.util.FloatProperty; import android.util.Log; import android.util.SparseArray; @@ -163,6 +165,7 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.LauncherAppWidgetInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.notification.NotificationListener; +import com.android.launcher3.pageindicators.WorkspacePageIndicator; import com.android.launcher3.pm.PinRequestHelper; import com.android.launcher3.pm.UserCache; import com.android.launcher3.popup.ArrowPopup; @@ -1291,6 +1294,16 @@ public class Launcher extends StatefulActivity mAllAppsController.setupViews(mScrimView, mAppsView); } + @Override + public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { + if (SHOW_DELIGHTFUL_PAGINATION.get() + && WorkspacePageIndicator.class.getName().equals(name)) { + return LayoutInflater.from(context).inflate(R.layout.page_indicator_dots, + (ViewGroup) parent, false); + } + return super.onCreateView(parent, name, context, attrs); + } + /** * Creates a view representing a shortcut. * diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 6eeabc5ecd..d4593e5e37 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -37,7 +37,8 @@ public final class FeatureFlags { public static final String FLAGS_PREF_NAME = "featureFlags"; - private FeatureFlags() { } + private FeatureFlags() { + } public static boolean showFlagTogglerUi(Context context) { return Utilities.IS_DEBUG_DEVICE && Utilities.isDevelopersOptionsEnabled(context); @@ -61,7 +62,7 @@ public final class FeatureFlags { * To add a new flag that can be toggled through the flags UI: * * Declare a new ToggleableFlag below. Give it a unique key (e.g. "QSB_ON_FIRST_SCREEN"), - * and set a default value for the flag. This will be the default value on Debug builds. + * and set a default value for the flag. This will be the default value on Debug builds. */ public static final BooleanFlag ENABLE_INPUT_CONSUMER_REASON_LOGGING = getDebugFlag( "ENABLE_INPUT_CONSUMER_REASON_LOGGING", @@ -154,14 +155,14 @@ public final class FeatureFlags { /** * Enables region sampling for text color: Needs system health assessment before turning on */ - public static final BooleanFlag ENABLE_REGION_SAMPLING = getDebugFlag( + public static final BooleanFlag ENABLE_REGION_SAMPLING = getDebugFlag( "ENABLE_REGION_SAMPLING", false, "Enable region sampling to determine color of text on screen."); public static final BooleanFlag ALWAYS_USE_HARDWARE_OPTIMIZATION_FOR_FOLDER_ANIMATIONS = getDebugFlag( - "ALWAYS_USE_HARDWARE_OPTIMIZATION_FOR_FOLDER_ANIMATIONS", false, - "Always use hardware optimization for folder animations."); + "ALWAYS_USE_HARDWARE_OPTIMIZATION_FOR_FOLDER_ANIMATIONS", false, + "Always use hardware optimization for folder animations."); public static final BooleanFlag SEPARATE_RECENTS_ACTIVITY = getDebugFlag( "SEPARATE_RECENTS_ACTIVITY", false, @@ -281,11 +282,10 @@ public final class FeatureFlags { public static final BooleanFlag ENABLE_WIDGET_PICKER_DEPTH = new DeviceFlag( "ENABLE_WIDGET_PICKER_DEPTH", false, "Enable changing depth in widget picker."); - public static final BooleanFlag SHOW_DELIGHTFUL_PAGINATION_FOLDER = new DeviceFlag( - "SHOW_DELIGHTFUL_PAGINATION_FOLDER", false, - "Enable showing the new 'delightful pagination'" - + " which is a brand new animation for folder pagination"); - + public static final BooleanFlag SHOW_DELIGHTFUL_PAGINATION = new DeviceFlag( + "SHOW_DELIGHTFUL_PAGINATION", false, + "Enable showing the new 'delightful pagination' which is a brand" + + " new animation for folder pagination and workspace pagination"); public static final BooleanFlag POPUP_MATERIAL_U = new DeviceFlag( "POPUP_MATERIAL_U", false, "Switch popup UX to use material U"); diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index b4cb0eef6e..5f9fbca1d4 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -16,7 +16,7 @@ package com.android.launcher3.pageindicators; -import static com.android.launcher3.config.FeatureFlags.SHOW_DELIGHTFUL_PAGINATION_FOLDER; +import static com.android.launcher3.config.FeatureFlags.SHOW_DELIGHTFUL_PAGINATION; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -129,7 +129,7 @@ public class PageIndicatorDots extends View implements PageIndicator { mDotRadius = getResources().getDimension(R.dimen.page_indicator_dot_size) / 2; - if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (SHOW_DELIGHTFUL_PAGINATION.get()) { mPageIndicatorSize = getResources().getDimension( R.dimen.page_indicator_size); mPageIndicatorRadius = mPageIndicatorSize / 2; @@ -144,7 +144,7 @@ public class PageIndicatorDots extends View implements PageIndicator { mPageIndicatorDrawable = null; mCircleGap = DOT_GAP_FACTOR * mDotRadius; } - if (!SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (!SHOW_DELIGHTFUL_PAGINATION.get()) { setOutlineProvider(new MyOutlineProver()); } mIsRtl = Utilities.isRtl(getResources()); @@ -161,7 +161,7 @@ public class PageIndicatorDots extends View implements PageIndicator { currentScroll = totalScroll - currentScroll; } - if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (SHOW_DELIGHTFUL_PAGINATION.get()) { mCurrentScroll = currentScroll; mTotalScroll = totalScroll; invalidate(); @@ -296,7 +296,7 @@ public class PageIndicatorDots extends View implements PageIndicator { } for (int i = 0; i < mEntryAnimationRadiusFactors.length; i++) { mPaginationPaint.setAlpha(i == mActivePage ? PAGE_INDICATOR_ALPHA : DOT_ALPHA); - if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (SHOW_DELIGHTFUL_PAGINATION.get()) { if (i != mActivePage) { canvas.drawCircle(x, y, mDotRadius * mEntryAnimationRadiusFactors[i], mPaginationPaint); @@ -313,7 +313,7 @@ public class PageIndicatorDots extends View implements PageIndicator { // Here we draw the dots mPaginationPaint.setAlpha(DOT_ALPHA); for (int i = 0; i < mNumPages; i++) { - if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (SHOW_DELIGHTFUL_PAGINATION.get()) { canvas.drawCircle(x, y, getRadius(x), mPaginationPaint); } else { canvas.drawCircle(x, y, mDotRadius, mPaginationPaint); @@ -323,7 +323,7 @@ public class PageIndicatorDots extends View implements PageIndicator { // Here we draw the current page indicator mPaginationPaint.setAlpha(PAGE_INDICATOR_ALPHA); - if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (SHOW_DELIGHTFUL_PAGINATION.get()) { drawPageIndicator(canvas, 1); } else { canvas.drawRoundRect(getActiveRect(), mDotRadius, mDotRadius, mPaginationPaint); @@ -389,7 +389,7 @@ public class PageIndicatorDots extends View implements PageIndicator { float diameter = 2 * mDotRadius; float startX; - if (SHOW_DELIGHTFUL_PAGINATION_FOLDER.get()) { + if (SHOW_DELIGHTFUL_PAGINATION.get()) { startX = ((getWidth() - (mNumPages * mCircleGap) + mDotRadius) / 2) - getOffset(); sTempRect.top = (getHeight() - mPageIndicatorSize) * 0.5f; sTempRect.bottom = (getHeight() + mPageIndicatorSize) * 0.5f; From 471e2178f8702143f8dac18d9a15178ada6c7a82 Mon Sep 17 00:00:00 2001 From: Federico Baron Date: Mon, 3 Oct 2022 12:24:20 -0700 Subject: [PATCH 2/2] Fix page indicator dots height in workspace In workspace, the page indicator dots end up in the bottom because we were missing a setInsets method (WorkspacePageInidcator.java uses this method to set the page indicator to the right height). Bug: 249773534 Test: manual Change-Id: I03636e28244f329b249453a6d22eb0ec7d85c45f --- src/com/android/launcher3/Workspace.java | 22 +++++++++++++++++++ .../pageindicators/PageIndicatorDots.java | 13 +++++++++-- .../WorkspacePageIndicator.java | 21 ++++-------------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index b49d64625b..1092af056c 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -53,12 +53,14 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.FrameLayout; import android.widget.Toast; import androidx.annotation.Nullable; @@ -322,6 +324,26 @@ public class Workspace extends PagedView updateCellLayoutPadding(); updateWorkspaceWidgetsSizes(); + setPageIndicatorInset(); + } + + private void setPageIndicatorInset() { + DeviceProfile grid = mLauncher.getDeviceProfile(); + + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mPageIndicator.getLayoutParams(); + + // Set insets for page indicator + Rect padding = grid.workspacePadding; + if (grid.isVerticalBarLayout()) { + lp.leftMargin = padding.left + grid.workspaceCellPaddingXPx; + lp.rightMargin = padding.right + grid.workspaceCellPaddingXPx; + lp.bottomMargin = padding.bottom; + } else { + lp.leftMargin = lp.rightMargin = 0; + lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; + lp.bottomMargin = grid.hotseatBarSizePx; + } + mPageIndicator.setLayoutParams(lp); } private void updateCellLayoutPadding() { diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java index 5f9fbca1d4..98ce9511a2 100644 --- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java +++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java @@ -29,6 +29,7 @@ import android.graphics.Canvas; import android.graphics.Outline; import android.graphics.Paint; import android.graphics.Paint.Style; +import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -38,6 +39,7 @@ import android.view.ViewOutlineProvider; import android.view.animation.Interpolator; import android.view.animation.OvershootInterpolator; +import com.android.launcher3.Insettable; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.anim.Interpolators; @@ -47,7 +49,7 @@ import com.android.launcher3.util.Themes; * {@link PageIndicator} which shows dots per page. The active page is shown with the current * accent color. */ -public class PageIndicatorDots extends View implements PageIndicator { +public class PageIndicatorDots extends View implements Insettable, PageIndicator { private static final float SHIFT_PER_ANIMATION = 0.5f; private static final float SHIFT_THRESHOLD = 0.1f; @@ -128,7 +130,6 @@ public class PageIndicatorDots extends View implements PageIndicator { mPaginationPaint.setColor(Themes.getAttrColor(context, R.attr.folderPaginationColor)); mDotRadius = getResources().getDimension(R.dimen.page_indicator_dot_size) / 2; - if (SHOW_DELIGHTFUL_PAGINATION.get()) { mPageIndicatorSize = getResources().getDimension( R.dimen.page_indicator_size); @@ -483,4 +484,12 @@ public class PageIndicatorDots extends View implements PageIndicator { } } } + + /** + * We need to override setInsets to prevent InsettableFrameLayout from applying different + * margins on the pagination. + */ + @Override + public void setInsets(Rect insets) { + } } diff --git a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java index 87ae890894..bde4e525a1 100644 --- a/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java +++ b/src/com/android/launcher3/pageindicators/WorkspacePageIndicator.java @@ -14,12 +14,9 @@ import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; import android.util.Property; -import android.view.Gravity; import android.view.View; import android.view.ViewConfiguration; -import android.widget.FrameLayout; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.Insettable; import com.android.launcher3.Launcher; import com.android.launcher3.R; @@ -258,21 +255,11 @@ public class WorkspacePageIndicator extends View implements Insettable, PageIndi } } + /** + * We need to override setInsets to prevent InsettableFrameLayout from applying different + * margins on the page indicator. + */ @Override public void setInsets(Rect insets) { - DeviceProfile grid = mLauncher.getDeviceProfile(); - FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); - - if (grid.isVerticalBarLayout()) { - Rect padding = grid.workspacePadding; - lp.leftMargin = padding.left + grid.workspaceCellPaddingXPx; - lp.rightMargin = padding.right + grid.workspaceCellPaddingXPx; - lp.bottomMargin = padding.bottom; - } else { - lp.leftMargin = lp.rightMargin = 0; - lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - lp.bottomMargin = grid.hotseatBarSizePx; - } - setLayoutParams(lp); } }