From bd819cdf0f09bf56e639fc6cb1e7fca0928cd32f Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Fri, 5 Aug 2022 09:19:59 +0000 Subject: [PATCH 1/5] Disable hinge sensor while the screen is off This allows to save some power while the device is unfolded but with screen off. + Avoiding registering more listeners if HingeSensorAngleProvider.start() is called multiple times sequentially without a `stop` in the middle. It seems that otherwise we would get duplicated callbacks. + Adding onScreenTurningOn and onScreenTurningOff callbacks to forward to Launcher (as only sysui is receiving them) Bug: 240661156 Bug: 240374404 Test: DeviceFoldStateProviderTest && LauncherFoldAnimationTest (e2e) Change-Id: I769643321c4819c145aac1b0a32a80d5738951c2 --- .../android/quickstep/TouchInteractionService.java | 12 ++++++++++++ .../quickstep/util/ProxyScreenStatusProvider.java | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 52a37c5708..c46926ec00 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -270,6 +270,18 @@ public class TouchInteractionService extends Service MAIN_EXECUTOR.execute(ProxyScreenStatusProvider.INSTANCE::onScreenTurnedOn); } + @BinderThread + @Override + public void onScreenTurningOn() { + MAIN_EXECUTOR.execute(ProxyScreenStatusProvider.INSTANCE::onScreenTurningOn); + } + + @BinderThread + @Override + public void onScreenTurningOff() { + MAIN_EXECUTOR.execute(ProxyScreenStatusProvider.INSTANCE::onScreenTurningOff); + } + /** * Preloads the Overview activity. * diff --git a/quickstep/src/com/android/quickstep/util/ProxyScreenStatusProvider.java b/quickstep/src/com/android/quickstep/util/ProxyScreenStatusProvider.java index 3777c659e3..8f79ccf450 100644 --- a/quickstep/src/com/android/quickstep/util/ProxyScreenStatusProvider.java +++ b/quickstep/src/com/android/quickstep/util/ProxyScreenStatusProvider.java @@ -39,6 +39,16 @@ public class ProxyScreenStatusProvider implements ScreenStatusProvider { mListeners.forEach(ScreenListener::onScreenTurnedOn); } + /** Called when the screen is starting to turn on. */ + public void onScreenTurningOn() { + mListeners.forEach(ScreenListener::onScreenTurningOn); + } + + /** Called when the screen is starting to turn off. */ + public void onScreenTurningOff() { + mListeners.forEach(ScreenListener::onScreenTurningOff); + } + @Override public void addCallback(@NonNull ScreenListener listener) { mListeners.add(listener); From 7e02d6845ed442714d0c880bd258c4940645399b Mon Sep 17 00:00:00 2001 From: Luca Zuccarini Date: Wed, 29 Jun 2022 12:14:35 +0000 Subject: [PATCH 2/5] Introduce a new flag to guard keyboard synchronization. Bug: 234812580 Test: manual Change-Id: I1c8714fa68cde06b95f6a7822075188c7dc2f71f --- src/com/android/launcher3/config/FeatureFlags.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 4fd13b2b39..f5683d1209 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -265,6 +265,11 @@ public final class FeatureFlags { public static final BooleanFlag ENABLE_ONE_SEARCH_MOTION = new DeviceFlag( "ENABLE_ONE_SEARCH_MOTION", true, "Enables animations in OneSearch."); + public static final BooleanFlag ENABLE_KEYBOARD_TRANSITION_SYNC = new DeviceFlag( + "ENABLE_KEYBOARD_TRANSITION_SYNC", false, + "Enable option to synchronize the keyboard open and close animations when transitioning" + + " between home and all apps"); + public static final BooleanFlag ENABLE_SHOW_KEYBOARD_OPTION_IN_ALL_APPS = new DeviceFlag( "ENABLE_SHOW_KEYBOARD_OPTION_IN_ALL_APPS", true, "Enable option to show keyboard when going to all-apps"); From eb6a154230be51f039f1894818b97091a3d73639 Mon Sep 17 00:00:00 2001 From: Andras Kloczl Date: Tue, 9 Aug 2022 10:53:33 +0200 Subject: [PATCH 3/5] Fix widget jump bug when moved to invalid place When dropTargetLayout is null we don't need to animate the widget to the closest location but move it back to its original position. Test: manual Bug: 236135424 Change-Id: I50a793732cd9656605fdc9908f71ff0efa7e69e9 --- src/com/android/launcher3/Workspace.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 2bc5e646a0..4c9542d5c9 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2122,7 +2122,8 @@ public class Workspace extends PagedView final ItemInfo info = (ItemInfo) cell.getTag(); boolean isWidget = info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET || info.itemType == LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET; - if (isWidget) { + if (isWidget && dropTargetLayout != null) { + // animate widget to a valid place int animationType = resizeOnDrop ? ANIMATE_INTO_POSITION_AND_RESIZE : ANIMATE_INTO_POSITION_AND_DISAPPEAR; animateWidgetDrop(info, parent, d.dragView, null, animationType, cell, false); From ccc430e2c131784c7a17c66415dd2bd792c02a4b Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Tue, 9 Aug 2022 11:59:45 +0100 Subject: [PATCH 4/5] Detect potential WindowConfiguration change at onApplyWindowInsets - Invoke onConfiguration when receiving inset changes - In Laucnher/RecentsActivity onConfiguration, additionally detect for windowConfiguration's rotation change; if Configuration stays the same, it'll be ignored. Bug: 240730723 Test: manual on 90/180 degree rotation in Launcher and RecentsActivity Change-Id: I7087878af847d62e1c715a4f52a18818d1a6c258 --- .../launcher3/BaseQuickstepLauncher.java | 18 +++++++++++++++++ .../android/quickstep/RecentsActivity.java | 20 +++++++++++++++---- src/com/android/launcher3/Launcher.java | 12 +++++++---- .../android/launcher3/LauncherRootView.java | 2 ++ .../statemanager/StatefulActivity.java | 13 ++++++++++++ 5 files changed, 57 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index c2e8658401..1ffa8891fd 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -15,6 +15,9 @@ */ package com.android.launcher3; +import static android.app.WindowConfiguration.WINDOW_CONFIG_ROTATION; +import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION; + import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.AbstractFloatingView.TYPE_HIDE_BACK_BUTTON; import static com.android.launcher3.LauncherState.FLAG_HIDE_BACK_BUTTON; @@ -43,6 +46,7 @@ import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.content.res.Configuration; import android.hardware.SensorManager; import android.hardware.devicestate.DeviceStateManager; import android.os.Bundle; @@ -649,6 +653,20 @@ public abstract class BaseQuickstepLauncher extends Launcher { } } + @Override + protected boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) { + int diff = newConfig.diff(oldConfig); + if ((diff & CONFIG_WINDOW_CONFIGURATION) != 0) { + long windowDiff = + newConfig.windowConfiguration.diff(oldConfig.windowConfiguration, false); + if ((windowDiff & WINDOW_CONFIG_ROTATION) != 0) { + return true; + } + } + + return super.compareConfiguration(oldConfig, newConfig); + } + @Override public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) { super.dump(prefix, fd, writer, args); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 4435eda184..1a966e2516 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -15,8 +15,10 @@ */ package com.android.quickstep; +import static android.app.WindowConfiguration.WINDOW_CONFIG_ROTATION; import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; +import static android.content.pm.ActivityInfo.CONFIG_WINDOW_CONFIGURATION; import static com.android.launcher3.QuickstepTransitionManager.RECENTS_LAUNCH_DURATION; import static com.android.launcher3.QuickstepTransitionManager.STATUS_BAR_TRANSITION_DURATION; @@ -348,13 +350,23 @@ public final class RecentsActivity extends StatefulActivity { } @Override - public void onConfigurationChanged(Configuration newConfig) { - int diff = newConfig.diff(mOldConfig); - if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { + public void handleConfigurationChanged(Configuration newConfig) { + if (compareConfiguration(mOldConfig, newConfig)) { onHandleConfigChanged(); } mOldConfig.setTo(newConfig); - super.onConfigurationChanged(newConfig); + super.handleConfigurationChanged(newConfig); + } + + private boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) { + int diff = newConfig.diff(oldConfig); + if ((diff & CONFIG_WINDOW_CONFIGURATION) != 0) { + long windowDiff = + newConfig.windowConfiguration.diff(oldConfig.windowConfiguration, false); + return (windowDiff & WINDOW_CONFIG_ROTATION) != 0; + } + + return (diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0; } @Override diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 5ee9aa8668..03ff146edf 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -615,14 +615,18 @@ public class Launcher extends StatefulActivity } @Override - public void onConfigurationChanged(Configuration newConfig) { - int diff = newConfig.diff(mOldConfig); - if ((diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0) { + public void handleConfigurationChanged(Configuration newConfig) { + if (compareConfiguration(mOldConfig, newConfig)) { onIdpChanged(false); } mOldConfig.setTo(newConfig); - super.onConfigurationChanged(newConfig); + super.handleConfigurationChanged(newConfig); + } + + protected boolean compareConfiguration(Configuration oldConfig, Configuration newConfig) { + int diff = newConfig.diff(oldConfig); + return (diff & (CONFIG_ORIENTATION | CONFIG_SCREEN_SIZE)) != 0; } /** diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index a5c5c02735..1592154c3a 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -55,6 +55,8 @@ public class LauncherRootView extends InsettableFrameLayout { @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { + mActivity.handleConfigurationChanged(mActivity.getResources().getConfiguration()); + insets = WindowManagerProxy.INSTANCE.get(getContext()) .normalizeWindowInsets(getContext(), insets, mTempRect); handleSystemWindowInsets(mTempRect); diff --git a/src/com/android/launcher3/statemanager/StatefulActivity.java b/src/com/android/launcher3/statemanager/StatefulActivity.java index 2158dea3fe..eea90919ba 100644 --- a/src/com/android/launcher3/statemanager/StatefulActivity.java +++ b/src/com/android/launcher3/statemanager/StatefulActivity.java @@ -18,6 +18,7 @@ package com.android.launcher3.statemanager; import static com.android.launcher3.LauncherState.FLAG_CLOSE_POPUPS; import static com.android.launcher3.LauncherState.FLAG_NON_INTERACTIVE; +import android.content.res.Configuration; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; @@ -186,4 +187,16 @@ public abstract class StatefulActivity> public void runOnBindToTouchInteractionService(Runnable r) { r.run(); } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + handleConfigurationChanged(newConfig); + super.onConfigurationChanged(newConfig); + } + + /** + * Handles configuration change when system calls {@link #onConfigurationChanged}, or on other + * situations that configuration might change. + */ + public void handleConfigurationChanged(Configuration newConfig) {} } From 8a3d05587e557d56948a43d38409dfdd8a788742 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Fri, 5 Aug 2022 10:43:29 -0700 Subject: [PATCH 5/5] Show 3 button nav on phone in Taskbar (1/2) * TODO: Landscape/seascape support, Separate nav spacing out into separate class/add tests Bug: 219035565 Change-Id: I8f5c007f04ea4d6df15962772806356181d764ff --- quickstep/res/values/dimens.xml | 1 + .../taskbar/NavbarButtonsViewController.java | 87 ++++++++++++++++--- .../taskbar/StashedHandleViewController.java | 12 +-- .../taskbar/TaskbarActivityContext.java | 10 ++- .../taskbar/TaskbarDragLayerController.java | 11 ++- .../launcher3/taskbar/TaskbarManager.java | 19 +++- .../taskbar/TaskbarStashController.java | 21 +++-- .../taskbar/TaskbarViewController.java | 6 +- src/com/android/launcher3/DeviceProfile.java | 2 +- 9 files changed, 135 insertions(+), 34 deletions(-) diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index cfe602eb28..51e095717f 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -277,6 +277,7 @@ 24dp + 40dp 26dp 26dp 47dp diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index b01168d9af..e92337c6c1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -15,15 +15,20 @@ */ package com.android.launcher3.taskbar; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; import static com.android.launcher3.Utilities.getDescendantCoordRelativeToAncestor; import static com.android.launcher3.taskbar.LauncherTaskbarUIController.SYSUI_SURFACE_PROGRESS_INDEX; +import static com.android.launcher3.taskbar.TaskbarManager.isPhoneButtonNavMode; +import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IME_SWITCH; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS; import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_KEYGUARD; +import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_SMALL_SCREEN; import static com.android.launcher3.taskbar.Utilities.appendFlag; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE; @@ -109,6 +114,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT private static final int FLAG_NOTIFICATION_SHADE_EXPANDED = 1 << 10; private static final int FLAG_SCREEN_PINNING_ACTIVE = 1 << 11; private static final int FLAG_VOICE_INTERACTION_WINDOW_SHOWING = 1 << 12; + private static final int FLAG_SMALL_SCREEN = 1 << 13; private static final String NAV_BUTTONS_SEPARATE_WINDOW_TITLE = "Taskbar Nav Buttons"; @@ -122,7 +128,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT private final TaskbarActivityContext mContext; private final FrameLayout mNavButtonsView; - private final ViewGroup mNavButtonContainer; + private final LinearLayout mNavButtonContainer; // Used for IME+A11Y buttons private final ViewGroup mEndContextualContainer; private final ViewGroup mStartContextualContainer; @@ -180,9 +186,13 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT */ public void init(TaskbarControllers controllers) { mControllers = controllers; - mNavButtonsView.getLayoutParams().height = mContext.getDeviceProfile().taskbarSize; - boolean isThreeButtonNav = mContext.isThreeButtonNav(); + DeviceProfile deviceProfile = mContext.getDeviceProfile(); + Resources resources = mContext.getResources(); + mNavButtonsView.getLayoutParams().height = !isPhoneMode(deviceProfile) ? + deviceProfile.taskbarSize : + resources.getDimensionPixelSize(R.dimen.taskbar_size); + mIsImeRenderingNavButtons = InputMethodService.canImeRenderGesturalNavButtons() && mContext.imeDrawsImeNavBar(); if (!mIsImeRenderingNavButtons) { @@ -201,6 +211,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0 && (flags & FLAG_SCREEN_PINNING_ACTIVE) == 0)); + mPropertyHolders.add(new StatePropertyHolder( + mControllers.taskbarViewController.getTaskbarIconAlpha() + .getProperty(ALPHA_INDEX_SMALL_SCREEN), + flags -> (flags & FLAG_SMALL_SCREEN) == 0)); + mPropertyHolders.add(new StatePropertyHolder(mControllers.taskbarDragLayerController .getKeyguardBgTaskbar(), flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0)); @@ -231,7 +246,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT initButtons(mNavButtonContainer, mEndContextualContainer, mControllers.navButtonController); updateButtonLayoutSpacing(); - + updateStateForFlag(FLAG_SMALL_SCREEN, isPhoneButtonNavMode(mContext)); if (isInSetup) { // Since setup wizard only has back button enabled, it looks strange to be // end-aligned, so start-align instead. @@ -244,18 +259,18 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT // TODO(b/210906568) Dark intensity is currently not propagated during setup, so set // it based on dark theme for now. - int mode = mContext.getResources().getConfiguration().uiMode + int mode = resources.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; boolean isDarkTheme = mode == Configuration.UI_MODE_NIGHT_YES; mTaskbarNavButtonDarkIntensity.updateValue(isDarkTheme ? 0 : 1); } else if (isInKidsMode) { - int iconSize = mContext.getResources().getDimensionPixelSize( + int iconSize = resources.getDimensionPixelSize( R.dimen.taskbar_icon_size_kids); - int buttonWidth = mContext.getResources().getDimensionPixelSize( + int buttonWidth = resources.getDimensionPixelSize( R.dimen.taskbar_nav_buttons_width_kids); - int buttonHeight = mContext.getResources().getDimensionPixelSize( + int buttonHeight = resources.getDimensionPixelSize( R.dimen.taskbar_nav_buttons_height_kids); - int buttonRadius = mContext.getResources().getDimensionPixelSize( + int buttonRadius = resources.getDimensionPixelSize( R.dimen.taskbar_nav_buttons_corner_radius_kids); int paddingleft = (buttonWidth - iconSize) / 2; int paddingRight = paddingleft; @@ -277,7 +292,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT buttonWidth, buttonHeight ); - int homeButtonLeftMargin = mContext.getResources().getDimensionPixelSize( + int homeButtonLeftMargin = resources.getDimensionPixelSize( R.dimen.taskbar_home_button_left_margin_kids); homeLayoutparams.setMargins(homeButtonLeftMargin, 0, 0, 0); mHomeButton.setLayoutParams(homeLayoutparams); @@ -287,7 +302,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT buttonWidth, buttonHeight ); - int backButtonLeftMargin = mContext.getResources().getDimensionPixelSize( + int backButtonLeftMargin = resources.getDimensionPixelSize( R.dimen.taskbar_back_button_left_margin_kids); backLayoutParams.setMargins(backButtonLeftMargin, 0, 0, 0); mBackButton.setLayoutParams(backLayoutParams); @@ -342,7 +357,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (!mIsImeRenderingNavButtons) { View imeDownButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK, mStartContextualContainer, mControllers.navButtonController, R.id.back); - imeDownButton.setRotation(Utilities.isRtl(mContext.getResources()) ? 90 : -90); + imeDownButton.setRotation(Utilities.isRtl(resources) ? 90 : -90); // Only show when IME is visible. mPropertyHolders.add(new StatePropertyHolder(imeDownButton, flags -> (flags & FLAG_IME_VISIBLE) != 0)); @@ -614,6 +629,9 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT } private void updateNavButtonTranslationY() { + if (isPhoneButtonNavMode(mContext)) { + return; + } final float normalTranslationY = mTaskbarNavButtonTranslationY.value; final float imeAdjustmentTranslationY = mTaskbarNavButtonTranslationYForIme.value; TaskbarUIController uiController = mControllers.uiController; @@ -681,12 +699,22 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (!mContext.isThreeButtonNav()) { return; } + + if (isPhoneButtonNavMode(mContext)) { + updatePhoneButtonSpacing(); + return; + } + DeviceProfile dp = mContext.getDeviceProfile(); Resources res = mContext.getResources(); // Add spacing after the end of the last nav button FrameLayout.LayoutParams navButtonParams = (FrameLayout.LayoutParams) mNavButtonContainer.getLayoutParams(); + navButtonParams.gravity = Gravity.END; + navButtonParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + navButtonParams.height = MATCH_PARENT; + int navMarginEnd = (int) res.getDimension(dp.inv.inlineNavButtonsEndSpacing); int contextualWidth = mEndContextualContainer.getWidth(); // If contextual buttons are showing, we check if the end margin is enough for the @@ -704,6 +732,39 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT View navButton = mNavButtonContainer.getChildAt(i); LinearLayout.LayoutParams buttonLayoutParams = (LinearLayout.LayoutParams) navButton.getLayoutParams(); + buttonLayoutParams.weight = 0; + if (i == 0) { + buttonLayoutParams.setMarginEnd(spaceInBetween / 2); + } else if (i == mNavButtonContainer.getChildCount() - 1) { + buttonLayoutParams.setMarginStart(spaceInBetween / 2); + } else { + buttonLayoutParams.setMarginStart(spaceInBetween / 2); + buttonLayoutParams.setMarginEnd(spaceInBetween / 2); + } + } + } + + /** Uniformly spaces out the 3 button nav for smaller phone screens */ + private void updatePhoneButtonSpacing() { + DeviceProfile dp = mContext.getDeviceProfile(); + Resources res = mContext.getResources(); + + // TODO: Polish pending, this is just to make it usable + FrameLayout.LayoutParams navContainerParams = + (FrameLayout.LayoutParams) mNavButtonContainer.getLayoutParams(); + int endStartMargins = res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size); + navContainerParams.gravity = Gravity.CENTER; + navContainerParams.setMarginEnd(endStartMargins); + navContainerParams.setMarginStart(endStartMargins); + mNavButtonContainer.setLayoutParams(navContainerParams); + + // Add the spaces in between the nav buttons + int spaceInBetween = res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween_phone); + for (int i = 0; i < mNavButtonContainer.getChildCount(); i++) { + View navButton = mNavButtonContainer.getChildAt(i); + LinearLayout.LayoutParams buttonLayoutParams = + (LinearLayout.LayoutParams) navButton.getLayoutParams(); + buttonLayoutParams.weight = 1; if (i == 0) { buttonLayoutParams.setMarginEnd(spaceInBetween / 2); } else if (i == mNavButtonContainer.getChildCount() - 1) { @@ -723,6 +784,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT } moveNavButtonsBackToTaskbarWindow(); + mNavButtonContainer.removeAllViews(); + mAllButtons.clear(); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java index 06524636c6..6b67b50fd8 100644 --- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java @@ -15,8 +15,6 @@ */ package com.android.launcher3.taskbar; -import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; @@ -96,7 +94,7 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT mControllers = controllers; DeviceProfile deviceProfile = mActivity.getDeviceProfile(); Resources resources = mActivity.getResources(); - if (isPhoneMode(mActivity.getDeviceProfile())) { + if (isPhoneGestureNavMode(mActivity.getDeviceProfile())) { mStashedHandleView.getLayoutParams().height = resources.getDimensionPixelSize(R.dimen.taskbar_size); mStashedHandleWidth = @@ -108,7 +106,7 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT } mTaskbarStashedHandleAlpha.getProperty(ALPHA_INDEX_STASHED).setValue( - isPhoneMode(deviceProfile) ? 1 : 0); + isPhoneGestureNavMode(deviceProfile) ? 1 : 0); mTaskbarStashedHandleHintScale.updateValue(1f); final int stashedTaskbarHeight = mControllers.taskbarStashController.getStashedHeight(); @@ -136,7 +134,7 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT view.setPivotY(stashedCenterY); }); initRegionSampler(); - if (isPhoneMode(deviceProfile)) { + if (isPhoneGestureNavMode(deviceProfile)) { onIsStashedChanged(true); } } @@ -164,6 +162,10 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT mRegionSamplingHelper = null; } + private boolean isPhoneGestureNavMode(DeviceProfile deviceProfile) { + return TaskbarManager.isPhoneMode(deviceProfile) && !mActivity.isThreeButtonNav(); + } + public MultiValueAlpha getStashedHandleAlpha() { return mTaskbarStashedHandleAlpha; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index f5fe77a22b..e1bcbe23bf 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -119,7 +119,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { // The size we should return to when we call setTaskbarWindowFullscreen(false) private int mLastRequestedNonFullscreenHeight; - private final NavigationMode mNavMode; + private NavigationMode mNavMode; private final boolean mImeDrawsImeNavBar; private final ViewCache mViewCache = new ViewCache(); @@ -235,7 +235,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } /** Updates {@link DeviceProfile} instances for any Taskbar windows. */ - public void updateDeviceProfile(DeviceProfile dp) { + public void updateDeviceProfile(DeviceProfile dp, NavigationMode navMode) { + mNavMode = navMode; mControllers.taskbarAllAppsController.updateDeviceProfile(dp); mDeviceProfile = dp.copy(this); updateIconSize(getResources()); @@ -608,7 +609,10 @@ public class TaskbarActivityContext extends BaseTaskbarContext { */ public int getDefaultTaskbarWindowHeight() { if (FLAG_HIDE_NAVBAR_WINDOW && mDeviceProfile.isPhone) { - return getResources().getDimensionPixelSize(R.dimen.taskbar_stashed_size); + Resources resources = getResources(); + return isThreeButtonNav() ? + resources.getDimensionPixelSize(R.dimen.taskbar_size) : + resources.getDimensionPixelSize(R.dimen.taskbar_stashed_size); } return mDeviceProfile.taskbarSize + Math.max(getLeftCornerRadius(), getRightCornerRadius()); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index 77ef83cbe4..ec9760c61f 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -18,6 +18,7 @@ package com.android.launcher3.taskbar; import android.content.res.Resources; import android.graphics.Rect; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.util.TouchController; import com.android.quickstep.AnimatedFloat; @@ -173,7 +174,15 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa * Returns how tall the background should be drawn at the bottom of the screen. */ public int getTaskbarBackgroundHeight() { - return mActivity.getDeviceProfile().taskbarSize; + DeviceProfile deviceProfile = mActivity.getDeviceProfile(); + if (TaskbarManager.isPhoneMode(deviceProfile)) { + Resources resources = mActivity.getResources(); + return mActivity.isThreeButtonNav() ? + resources.getDimensionPixelSize(R.dimen.taskbar_size) : + resources.getDimensionPixelSize(R.dimen.taskbar_stashed_size); + } else { + return deviceProfile.taskbarSize; + } } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index 353bf89998..1212c6161c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -82,6 +82,7 @@ public class TaskbarManager { // It's destruction/creation will be managed by the activity. private final ScopedUnfoldTransitionProgressProvider mUnfoldProgressProvider = new NonDestroyableScopedUnfoldTransitionProgressProvider(); + private DisplayController.NavigationMode mNavMode; private TaskbarActivityContext mTaskbarActivityContext; private StatefulActivity mActivity; @@ -132,9 +133,11 @@ public class TaskbarManager { | ActivityInfo.CONFIG_SCREEN_SIZE; boolean requiresRecreate = (configDiff & configsRequiringRecreate) != 0; if ((configDiff & ActivityInfo.CONFIG_SCREEN_SIZE) != 0 - && mTaskbarActivityContext != null && dp != null) { + && mTaskbarActivityContext != null && dp != null + && !isPhoneMode(dp)) { // Additional check since this callback gets fired multiple times w/o // screen size changing, or when simply rotating the device. + // In the case of phone device rotation, we do want to call recreateTaskbar() DeviceProfile oldDp = mTaskbarActivityContext.getDeviceProfile(); boolean isOrientationChange = (configDiff & ActivityInfo.CONFIG_ORIENTATION) != 0; @@ -152,7 +155,7 @@ public class TaskbarManager { // Config change might be handled without re-creating the taskbar if (mTaskbarActivityContext != null) { if (dp != null && isTaskbarPresent(dp)) { - mTaskbarActivityContext.updateDeviceProfile(dp); + mTaskbarActivityContext.updateDeviceProfile(dp, mNavMode); } mTaskbarActivityContext.onConfigurationChanged(configDiff); } @@ -167,9 +170,11 @@ public class TaskbarManager { destroyExistingTaskbar()); mDispInfoChangeListener = (context, info, flags) -> { if ((flags & CHANGE_FLAGS) != 0) { + mNavMode = info.navigationMode; recreateTaskbar(); } }; + mNavMode = mDisplayController.getInfo().navigationMode; mDisplayController.addChangeListener(mDispInfoChangeListener); SettingsCache.INSTANCE.get(mContext).register(USER_SETUP_COMPLETE_URI, mUserSetupCompleteListener); @@ -289,7 +294,7 @@ public class TaskbarManager { mTaskbarActivityContext = new TaskbarActivityContext(mContext, dp, mNavButtonController, mUnfoldProgressProvider); } else { - mTaskbarActivityContext.updateDeviceProfile(dp); + mTaskbarActivityContext.updateDeviceProfile(dp, mNavMode); } mTaskbarActivityContext.init(mSharedState); @@ -324,6 +329,14 @@ public class TaskbarManager { return TaskbarManager.FLAG_HIDE_NAVBAR_WINDOW && deviceProfile.isPhone; } + /** + * @return {@code true} if {@link #isPhoneMode(DeviceProfile)} is true and we're using + * 3 button-nav + */ + public static boolean isPhoneButtonNavMode(TaskbarActivityContext context) { + return isPhoneMode(context.getDeviceProfile()) && context.isThreeButtonNav(); + } + private boolean isTaskbarPresent(DeviceProfile deviceProfile) { return FLAG_HIDE_NAVBAR_WINDOW || deviceProfile.isTaskbarPresent; } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 114ab4e976..3ea917334c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -20,7 +20,6 @@ import static android.view.HapticFeedbackConstants.LONG_PRESS; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_LONGPRESS_HIDE; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_LONGPRESS_SHOW; -import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode; import static com.android.launcher3.taskbar.Utilities.appendFlag; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; @@ -180,7 +179,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba mActivity = activity; mPrefs = Utilities.getPrefs(mActivity); mSystemUiProxy = SystemUiProxy.INSTANCE.get(activity); - if (isPhoneMode(mActivity.getDeviceProfile())) { + if (isPhoneMode()) { // DeviceProfile's taskbar vars aren't initialized w/ the flag off Resources resources = mActivity.getResources(); mUnstashedHeight = resources.getDimensionPixelSize(R.dimen.taskbar_size); @@ -217,7 +216,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba updateStateForFlag(FLAG_STASHED_IN_APP_MANUAL, isManuallyStashedInApp); updateStateForFlag(FLAG_STASHED_IN_APP_SETUP, isInSetup); updateStateForFlag(FLAG_IN_SETUP, isInSetup); - updateStateForFlag(FLAG_STASHED_SMALL_SCREEN, isPhoneMode(mActivity.getDeviceProfile())); + updateStateForFlag(FLAG_STASHED_SMALL_SCREEN, isPhoneMode() + && !mActivity.isThreeButtonNav()); applyState(); notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp()); @@ -229,7 +229,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba */ public boolean supportsVisualStashing() { return mControllers.uiController.supportsVisualStashing() || - isPhoneMode(mActivity.getDeviceProfile()); + (isPhoneMode() && !mActivity.isThreeButtonNav()); } /** @@ -286,6 +286,13 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba return (hasAnyFlag(FLAG_IN_STASHED_LAUNCHER_STATE) && supportsVisualStashing()); } + /** + * @return {@code true} if we're not on a large screen AND using gesture nav + */ + private boolean isPhoneMode() { + return TaskbarManager.isPhoneMode(mActivity.getDeviceProfile()); + } + private boolean hasAnyFlag(int flagMask) { return hasAnyFlag(mState, flagMask); } @@ -312,7 +319,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba * @see WindowInsets.Type#systemBars() */ public int getContentHeightToReportToApps() { - if (isPhoneMode(mActivity.getDeviceProfile())) { + if (isPhoneMode() && !mActivity.isThreeButtonNav()) { return getStashedHeight(); } @@ -431,7 +438,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba } mAnimator = new AnimatorSet(); addJankMonitorListener(mAnimator, /* appearing= */ !mIsStashed); - final float stashTranslation = isPhoneMode(mActivity.getDeviceProfile()) ? 0 : + final float stashTranslation = isPhoneMode() ? 0 : (mUnstashedHeight - mStashedHeight) / 2f; if (!supportsVisualStashing()) { @@ -477,7 +484,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba firstHalfAnimatorSet.playTogether( mIconAlphaForStash.animateToValue(0), - mIconScaleForStash.animateToValue(isPhoneMode(mActivity.getDeviceProfile()) ? + mIconScaleForStash.animateToValue(isPhoneMode() ? 0 : STASHED_TASKBAR_SCALE) ); secondHalfAnimatorSet.playTogether( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 0f6de73c7d..1639b76540 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -71,7 +71,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar public static final int ALPHA_INDEX_NOTIFICATION_EXPANDED = 4; public static final int ALPHA_INDEX_ASSISTANT_INVOKED = 5; public static final int ALPHA_INDEX_IME_BUTTON_NAV = 6; - private static final int NUM_ALPHA_CHANNELS = 7; + public static final int ALPHA_INDEX_SMALL_SCREEN = 7; + private static final int NUM_ALPHA_CHANNELS = 8; private final TaskbarActivityContext mActivity; private final TaskbarView mTaskbarView; @@ -389,7 +390,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar "ALPHA_INDEX_RECENTS_DISABLED", "ALPHA_INDEX_NOTIFICATION_EXPANDED", "ALPHA_INDEX_ASSISTANT_INVOKED", - "ALPHA_INDEX_IME_BUTTON_NAV"); + "ALPHA_INDEX_IME_BUTTON_NAV", + "ALPHA_INDEX_SMALL_SCREEN"); mModelCallbacks.dumpLogs(prefix + "\t", pw); } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 366d372a03..8b94c09496 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -407,7 +407,7 @@ public class DeviceProfile { // Add a bit of space between nav bar and hotseat in vertical bar layout. hotseatBarSidePaddingStartPx = isVerticalBarLayout() ? workspacePageIndicatorHeight : 0; updateHotseatSizes(pxFromDp(inv.iconSize[INDEX_DEFAULT], mMetrics)); - if (areNavButtonsInline) { + if (areNavButtonsInline && !isPhone) { /* * 3 nav buttons + * Spacing between nav buttons +