Loading Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ android_library { "androidx.test.uiautomator_uiautomator", "androidx.preference_preference", "SystemUISharedLib", "SystemUIAnimationLib", ], srcs: [ "tests/tapl/**/*.java", Loading Loading @@ -196,6 +197,7 @@ android_library { "lottie", "SystemUISharedLib", "SystemUI-statsd", "SystemUIAnimationLib", ], manifest: "quickstep/AndroidManifest.xml", min_sdk_version: "current", Loading Loading @@ -304,6 +306,7 @@ android_library { "SystemUISharedLib", "Launcher3CommonDepsLib", "QuickstepResLib", "SystemUIAnimationLib", ], manifest: "quickstep/AndroidManifest.xml", platform_apis: true, Loading quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +35 −0 Original line number Diff line number Diff line Loading @@ -29,13 +29,16 @@ import androidx.annotation.NonNull; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherState; import com.android.launcher3.Utilities; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.AnimatedFloat; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationController; import com.android.quickstep.views.RecentsView; import com.android.systemui.animation.ViewRootSync; import com.android.systemui.shared.recents.model.ThumbnailData; import java.util.HashMap; Loading Loading @@ -76,6 +79,9 @@ import java.util.function.Supplier; private boolean mShouldDelayLauncherStateAnim; // We skip any view synchronizations during init/destroy. private boolean mCanSyncViews; private final StateManager.StateListener<LauncherState> mStateListener = new StateManager.StateListener<LauncherState>() { Loading @@ -102,6 +108,8 @@ import java.util.function.Supplier; }; public void init(TaskbarControllers controllers, BaseQuickstepLauncher launcher) { mCanSyncViews = false; mControllers = controllers; mLauncher = launcher; Loading @@ -121,9 +129,13 @@ import java.util.function.Supplier; updateStateForFlag(FLAG_RESUMED, launcher.hasBeenResumed()); mLauncherState = launcher.getStateManager().getState(); applyState(0); mCanSyncViews = true; } public void onDestroy() { mCanSyncViews = false; mIconAlignmentForResumedState.finishAnimation(); mIconAlignmentForGestureState.finishAnimation(); mIconAlignmentForLauncherState.finishAnimation(); Loading @@ -131,6 +143,8 @@ import java.util.function.Supplier; mIconAlphaForHome.setConsumer(null); mLauncher.getHotseat().setIconsAlpha(1f); mLauncher.getStateManager().removeStateListener(mStateListener); mCanSyncViews = true; } public Animator createAnimToLauncher(@NonNull LauncherState toState, Loading Loading @@ -380,6 +394,27 @@ import java.util.function.Supplier; return; } float alignment = alignmentSupplier.get(); float currentValue = mIconAlphaForHome.getValue(); boolean taskbarWillBeVisible = alignment < 1; boolean firstFrameVisChanged = (taskbarWillBeVisible && Float.compare(currentValue, 1) != 0) || (!taskbarWillBeVisible && Float.compare(currentValue, 0) != 0); // Sync the first frame where we swap taskbar and hotseat. if (firstFrameVisChanged && mCanSyncViews && !Utilities.IS_RUNNING_IN_TEST_HARNESS) { DeviceProfile dp = mLauncher.getDeviceProfile(); // Do all the heavy work before the sync. mControllers.taskbarViewController.createIconAlignmentControllerIfNotExists(dp); ViewRootSync.synchronizeNextDraw(mLauncher.getHotseat(), mControllers.taskbarActivityContext.getDragLayer(), () -> updateIconAlignment(alignment)); } else { updateIconAlignment(alignment); } } private void updateIconAlignment(float alignment) { mControllers.taskbarViewController.setLauncherIconAlignment( alignment, mLauncher.getDeviceProfile()); Loading quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +11 −3 Original line number Diff line number Diff line Loading @@ -199,6 +199,16 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar )); } /** * Creates the icon alignment controller if it does not already exist. * @param launcherDp Launcher device profile. */ public void createIconAlignmentControllerIfNotExists(DeviceProfile launcherDp) { if (mIconAlignControllerLazy == null) { mIconAlignControllerLazy = createIconAlignmentController(launcherDp); } } /** * Sets the taskbar icon alignment relative to Launcher hotseat icons * @param alignmentRatio [0, 1] Loading @@ -206,9 +216,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar * 1 => fully aligned */ public void setLauncherIconAlignment(float alignmentRatio, DeviceProfile launcherDp) { if (mIconAlignControllerLazy == null) { mIconAlignControllerLazy = createIconAlignmentController(launcherDp); } createIconAlignmentControllerIfNotExists(launcherDp); mIconAlignControllerLazy.setPlayFraction(alignmentRatio); if (alignmentRatio <= 0 || alignmentRatio >= 1) { // Cleanup lazy controller so that it is created again in next animation Loading Loading
Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ android_library { "androidx.test.uiautomator_uiautomator", "androidx.preference_preference", "SystemUISharedLib", "SystemUIAnimationLib", ], srcs: [ "tests/tapl/**/*.java", Loading Loading @@ -196,6 +197,7 @@ android_library { "lottie", "SystemUISharedLib", "SystemUI-statsd", "SystemUIAnimationLib", ], manifest: "quickstep/AndroidManifest.xml", min_sdk_version: "current", Loading Loading @@ -304,6 +306,7 @@ android_library { "SystemUISharedLib", "Launcher3CommonDepsLib", "QuickstepResLib", "SystemUIAnimationLib", ], manifest: "quickstep/AndroidManifest.xml", platform_apis: true, Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +35 −0 Original line number Diff line number Diff line Loading @@ -29,13 +29,16 @@ import androidx.annotation.NonNull; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherState; import com.android.launcher3.Utilities; import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.AnimatedFloat; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.RecentsAnimationController; import com.android.quickstep.views.RecentsView; import com.android.systemui.animation.ViewRootSync; import com.android.systemui.shared.recents.model.ThumbnailData; import java.util.HashMap; Loading Loading @@ -76,6 +79,9 @@ import java.util.function.Supplier; private boolean mShouldDelayLauncherStateAnim; // We skip any view synchronizations during init/destroy. private boolean mCanSyncViews; private final StateManager.StateListener<LauncherState> mStateListener = new StateManager.StateListener<LauncherState>() { Loading @@ -102,6 +108,8 @@ import java.util.function.Supplier; }; public void init(TaskbarControllers controllers, BaseQuickstepLauncher launcher) { mCanSyncViews = false; mControllers = controllers; mLauncher = launcher; Loading @@ -121,9 +129,13 @@ import java.util.function.Supplier; updateStateForFlag(FLAG_RESUMED, launcher.hasBeenResumed()); mLauncherState = launcher.getStateManager().getState(); applyState(0); mCanSyncViews = true; } public void onDestroy() { mCanSyncViews = false; mIconAlignmentForResumedState.finishAnimation(); mIconAlignmentForGestureState.finishAnimation(); mIconAlignmentForLauncherState.finishAnimation(); Loading @@ -131,6 +143,8 @@ import java.util.function.Supplier; mIconAlphaForHome.setConsumer(null); mLauncher.getHotseat().setIconsAlpha(1f); mLauncher.getStateManager().removeStateListener(mStateListener); mCanSyncViews = true; } public Animator createAnimToLauncher(@NonNull LauncherState toState, Loading Loading @@ -380,6 +394,27 @@ import java.util.function.Supplier; return; } float alignment = alignmentSupplier.get(); float currentValue = mIconAlphaForHome.getValue(); boolean taskbarWillBeVisible = alignment < 1; boolean firstFrameVisChanged = (taskbarWillBeVisible && Float.compare(currentValue, 1) != 0) || (!taskbarWillBeVisible && Float.compare(currentValue, 0) != 0); // Sync the first frame where we swap taskbar and hotseat. if (firstFrameVisChanged && mCanSyncViews && !Utilities.IS_RUNNING_IN_TEST_HARNESS) { DeviceProfile dp = mLauncher.getDeviceProfile(); // Do all the heavy work before the sync. mControllers.taskbarViewController.createIconAlignmentControllerIfNotExists(dp); ViewRootSync.synchronizeNextDraw(mLauncher.getHotseat(), mControllers.taskbarActivityContext.getDragLayer(), () -> updateIconAlignment(alignment)); } else { updateIconAlignment(alignment); } } private void updateIconAlignment(float alignment) { mControllers.taskbarViewController.setLauncherIconAlignment( alignment, mLauncher.getDeviceProfile()); Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +11 −3 Original line number Diff line number Diff line Loading @@ -199,6 +199,16 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar )); } /** * Creates the icon alignment controller if it does not already exist. * @param launcherDp Launcher device profile. */ public void createIconAlignmentControllerIfNotExists(DeviceProfile launcherDp) { if (mIconAlignControllerLazy == null) { mIconAlignControllerLazy = createIconAlignmentController(launcherDp); } } /** * Sets the taskbar icon alignment relative to Launcher hotseat icons * @param alignmentRatio [0, 1] Loading @@ -206,9 +216,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar * 1 => fully aligned */ public void setLauncherIconAlignment(float alignmentRatio, DeviceProfile launcherDp) { if (mIconAlignControllerLazy == null) { mIconAlignControllerLazy = createIconAlignmentController(launcherDp); } createIconAlignmentControllerIfNotExists(launcherDp); mIconAlignControllerLazy.setPlayFraction(alignmentRatio); if (alignmentRatio <= 0 || alignmentRatio >= 1) { // Cleanup lazy controller so that it is created again in next animation Loading