From 61766a732cb7f1e2b6f7a818b1bbb86cb8d7f0f1 Mon Sep 17 00:00:00 2001 From: Bill Lin Date: Sat, 12 Jun 2021 00:22:17 +0800 Subject: [PATCH] Settings Switch animation jank while enabled One-handed mode Switch is CompoundButton(View) and animating position when user tap on it. Unfortunatly when set overlay pakcage enabled, Switch componet will invoke onLayout() and cancelPositionAnimator(), that result the UX feel jank. We add a delay(250ms) before execute runtime resouce overlay to ensure the widget animation finished first. Test: Manual Settings > Gesture > One Handed Mode > Tap Switch Bug: 190584055 Change-Id: Ia42fdf3ed699afd51c154cb0a53581ef67959c71 --- .../android/wm/shell/onehanded/OneHandedController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 49266ce1bb624..c275d50a5d56e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -71,6 +71,7 @@ public class OneHandedController implements RemoteCallable "persist.debug.one_handed_offset_percentage"; private static final String ONE_HANDED_MODE_GESTURAL_OVERLAY = "com.android.internal.systemui.onehanded.gestural"; + private static final int OVERLAY_ENABLED_DELAY_MS = 250; static final String SUPPORT_ONE_HANDED_MODE = "ro.support_one_handed_mode"; @@ -493,9 +494,11 @@ public class OneHandedController implements RemoteCallable setOneHandedEnabled(enabled); // Also checks swipe to notification settings since they all need gesture overlay. - setEnabledGesturalOverlay( + // Enabled overlay package may affect the current animation(e.g:Settings switch), + // so we delay 250ms to enabled overlay after switch animation finish + mMainExecutor.executeDelayed(() -> setEnabledGesturalOverlay( enabled || mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( - mContext.getContentResolver(), mUserId)); + mContext.getContentResolver(), mUserId)), OVERLAY_ENABLED_DELAY_MS); } @VisibleForTesting