diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 2622700871..5e8db69f2b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -20,7 +20,6 @@ import static com.android.systemui.shared.system.WindowManagerWrapper.ITYPE_EXTR import android.animation.Animator; import android.annotation.ColorInt; -import android.graphics.Rect; import android.os.RemoteException; import android.util.Log; import android.view.MotionEvent; @@ -114,13 +113,6 @@ public class LauncherTaskbarUIController extends TaskbarUIController { return !mTaskbarLauncherStateController.isAnimatingToLauncher(); } - @Override - protected void updateContentInsets(Rect outContentInsets) { - int contentHeight = mControllers.taskbarStashController.getContentHeight(); - TaskbarDragLayer dragLayer = mControllers.taskbarActivityContext.getDragLayer(); - outContentInsets.top = dragLayer.getHeight() - contentHeight; - } - /** * Should be called from onResume() and onPause(), and animates the Taskbar accordingly. */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index 806b39093f..a918016cc6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -181,10 +181,13 @@ public class TaskbarDragLayerController { } /** - * Called to update the {@link InsetsInfo#contentInsets}. + * Called to update the {@link InsetsInfo#contentInsets}. This is reported to apps but our + * internal launcher will ignore these insets. */ public void updateContentInsets(Rect outContentInsets) { - mControllers.uiController.updateContentInsets(outContentInsets); + int contentHeight = mControllers.taskbarStashController + .getContentHeightToReportToApps(); + outContentInsets.top = mTaskbarDragLayer.getHeight() - contentHeight; } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index a3ad83504c..5c31e05996 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -53,10 +53,17 @@ public class TaskbarStashController { public static final int FLAG_IN_STASHED_LAUNCHER_STATE = 1 << 6; // If we're in an app and any of these flags are enabled, taskbar should be stashed. - public static final int FLAGS_STASHED_IN_APP = FLAG_STASHED_IN_APP_MANUAL + private static final int FLAGS_STASHED_IN_APP = FLAG_STASHED_IN_APP_MANUAL | FLAG_STASHED_IN_APP_PINNED | FLAG_STASHED_IN_APP_EMPTY | FLAG_STASHED_IN_APP_SETUP | FLAG_STASHED_IN_APP_IME; + // If any of these flags are enabled, inset apps by our stashed height instead of our unstashed + // height. This way the reported insets are consistent even during transitions out of the app. + // Currently any flag that causes us to stash in an app is included, except for IME since that + // covers the underlying app anyway and thus the app shouldn't change insets. + private static final int FLAGS_REPORT_STASHED_INSETS_TO_APP = FLAGS_STASHED_IN_APP + & ~FLAG_STASHED_IN_APP_IME; + /** * How long to stash/unstash when manually invoked via long press. */ @@ -239,8 +246,11 @@ public class TaskbarStashController { return !mIsStashed && (mState & FLAG_IN_APP) != 0; } - public int getContentHeight() { - if (isStashed()) { + /** + * Returns the height that taskbar will inset when inside apps. + */ + public int getContentHeightToReportToApps() { + if (hasAnyFlag(FLAGS_REPORT_STASHED_INSETS_TO_APP)) { boolean isAnimating = mAnimator != null && mAnimator.isStarted(); return mControllers.stashedHandleViewController.isStashedHandleVisible() || isAnimating ? mStashedHeight : 0; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index f6bc785a14..abad9060ab 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -15,7 +15,6 @@ */ package com.android.launcher3.taskbar; -import android.graphics.Rect; import android.view.View; import androidx.annotation.CallSuper; @@ -49,8 +48,6 @@ public class TaskbarUIController { return true; } - protected void updateContentInsets(Rect outContentInsets) { } - protected void onStashedInAppChanged() { } public Stream getAppIconsForEdu() { diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java index 7c503be4a1..237e426fb6 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java @@ -37,6 +37,7 @@ import com.android.launcher3.tapl.LauncherInstrumentation.NavigationModel; import com.android.launcher3.tapl.Overview; import com.android.launcher3.tapl.OverviewActions; import com.android.launcher3.tapl.OverviewTask; +import com.android.launcher3.tapl.TestHelpers; import com.android.launcher3.ui.TaplTestsLauncher3; import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord; import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch; @@ -321,7 +322,8 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest { @Test @PortraitLandscape public void testOverviewForTablet() throws Exception { - if (!mLauncher.isTablet()) { + // TODO(b/210158657): Re-enable for OOP + if (!mLauncher.isTablet() || !TestHelpers.isInLauncherProcess()) { return; } for (int i = 2; i <= 14; i++) { diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml index b4bb43e9a9..08698e7d9d 100644 --- a/res/xml/device_profiles.xml +++ b/res/xml/device_profiles.xml @@ -25,7 +25,8 @@ launcher:numFolderColumns="3" launcher:numHotseatIcons="3" launcher:dbFile="launcher_3_by_3.db" - launcher:defaultLayoutId="@xml/default_workspace_3x3" > + launcher:defaultLayoutId="@xml/default_workspace_3x3" + launcher:deviceCategory="phone|multi_display" > + launcher:defaultLayoutId="@xml/default_workspace_4x4" + launcher:deviceCategory="phone|multi_display" > + launcher:defaultLayoutId="@xml/default_workspace_5x5" + launcher:deviceCategory="phone|multi_display" > + launcher:deviceCategory="tablet" > GRID_DB_FILES = Collections.unmodifiableList(Arrays.asList( LAUNCHER_DB, + LAUNCHER_6_BY_5_DB, LAUNCHER_4_BY_5_DB, LAUNCHER_4_BY_4_DB, LAUNCHER_3_BY_3_DB, diff --git a/src/com/android/launcher3/model/DeviceGridState.java b/src/com/android/launcher3/model/DeviceGridState.java index 01ebc5347b..fa11d4e395 100644 --- a/src/com/android/launcher3/model/DeviceGridState.java +++ b/src/com/android/launcher3/model/DeviceGridState.java @@ -17,7 +17,6 @@ package com.android.launcher3.model; import static com.android.launcher3.InvariantDeviceProfile.DeviceType; -import static com.android.launcher3.InvariantDeviceProfile.TYPE_MULTI_DISPLAY; import static com.android.launcher3.InvariantDeviceProfile.TYPE_PHONE; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_2; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_3; @@ -31,7 +30,6 @@ import android.text.TextUtils; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.Utilities; import com.android.launcher3.logging.StatsLogManager.LauncherEvent; -import com.android.launcher3.util.IntSet; import java.util.Locale; import java.util.Objects; @@ -45,13 +43,6 @@ public class DeviceGridState { public static final String KEY_HOTSEAT_COUNT = "migration_src_hotseat_count"; public static final String KEY_DEVICE_TYPE = "migration_src_device_type"; - private static final IntSet COMPATIBLE_TYPES = IntSet.wrap(TYPE_PHONE, TYPE_MULTI_DISPLAY); - - public static boolean deviceTypeCompatible(@DeviceType int typeA, @DeviceType int typeB) { - return typeA == typeB - || (COMPATIBLE_TYPES.contains(typeA) && COMPATIBLE_TYPES.contains(typeB)); - } - private final String mGridSizeString; private final int mNumHotseat; private final @DeviceType int mDeviceType; @@ -123,7 +114,6 @@ public class DeviceGridState { if (this == other) return true; if (other == null) return false; return mNumHotseat == other.mNumHotseat - && deviceTypeCompatible(mDeviceType, other.mDeviceType) && Objects.equals(mGridSizeString, other.mGridSizeString); } } diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index 4c0930bb32..d994dbec77 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -87,12 +87,6 @@ public class RestoreDbTask { } private static boolean performRestore(Context context, DatabaseHelper helper) { - if (!DeviceGridState.deviceTypeCompatible( - new DeviceGridState(LauncherAppState.getIDP(context)).getDeviceType(), - Utilities.getPrefs(context).getInt(RESTORED_DEVICE_TYPE, TYPE_PHONE))) { - // DO NOT restore if the device types are incompatible. - return false; - } SQLiteDatabase db = helper.getWritableDatabase(); try (SQLiteTransaction t = new SQLiteTransaction(db)) { RestoreDbTask task = new RestoreDbTask(); diff --git a/src/com/android/launcher3/views/FloatingIconView.java b/src/com/android/launcher3/views/FloatingIconView.java index c0ec9d8a17..06313e76b7 100644 --- a/src/com/android/launcher3/views/FloatingIconView.java +++ b/src/com/android/launcher3/views/FloatingIconView.java @@ -88,7 +88,6 @@ public class FloatingIconView extends FrameLayout implements private IconLoadResult mIconLoadResult; - // Draw the drawable of the BubbleTextView behind ClipIconView to reveal the built in shadow. private View mBtvDrawable; private ClipIconView mClipIconView; @@ -347,10 +346,23 @@ public class FloatingIconView extends FrameLayout implements mClipIconView.setLayoutParams(clipViewLp); } - if (!mIsOpening && btvIcon != null) { + setOriginalDrawableBackground(btvIcon); + invalidate(); + } + + /** + * Draws the drawable of the BubbleTextView behind ClipIconView + * + * This is used to: + * - Have icon displayed while Adaptive Icon is loading + * - Displays the built in shadow to ensure a clean handoff + * + * Allows nullable as this may be cleared when drawing is deferred to ClipIconView. + */ + private void setOriginalDrawableBackground(@Nullable Drawable btvIcon) { + if (!mIsOpening) { mBtvDrawable.setBackground(btvIcon); } - invalidate(); } /** @@ -455,7 +467,9 @@ public class FloatingIconView extends FrameLayout implements @Override public void onAnimationStart(Animator animator) { - if (mIconLoadResult != null && mIconLoadResult.isIconLoaded) { + if ((mIconLoadResult != null && mIconLoadResult.isIconLoaded) + || (!mIsOpening && mBtvDrawable.getBackground() != null)) { + // No need to wait for icon load since we can display the BubbleTextView drawable. setVisibility(View.VISIBLE); } if (!mIsOpening && mOriginalIcon != null) { @@ -518,6 +532,7 @@ public class FloatingIconView extends FrameLayout implements IconLoadResult result = new IconLoadResult(info, btvIcon == null ? false : btvIcon.isThemed()); + result.btvDrawable = btvIcon; final long fetchIconId = sFetchIconId++; MODEL_EXECUTOR.getHandler().postAtFrontOfQueue(() -> { @@ -556,6 +571,7 @@ public class FloatingIconView extends FrameLayout implements view.mIconLoadResult = fetchIcon(launcher, originalView, (ItemInfo) originalView.getTag(), isOpening); } + view.setOriginalDrawableBackground(view.mIconLoadResult.btvDrawable); } sIconLoadResult = null;