diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 6bc3d38c8b..c85e71cebc 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -277,6 +277,7 @@ 24dp + 40dp 26dp 75dp 47dp 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/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 55c3c20a94..f1f18c1756 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; @@ -683,12 +701,22 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT if (!mContext.isThreeButtonNav() || mContext.isNavBarKidsModeActive()) { 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 @@ -706,6 +734,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) { @@ -725,6 +786,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 929dc200c8..992aa4bd7d 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; @@ -390,7 +391,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/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/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); diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index f27eb7995b..418df37c29 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -399,7 +399,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 + 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/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); 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"); 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) {} }