Merge "Fixing Launcher crash if activity restarts while resixing widget" into tm-qpr-dev
diff --git a/protos/view_capture.proto b/protos/view_capture.proto
new file mode 100644
index 0000000..98574dd
--- /dev/null
+++ b/protos/view_capture.proto
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package com.android.launcher3.view;
+
+option java_outer_classname = "ViewCaptureData";
+
+message ExportedData {
+
+ repeated FrameData frameData = 1;
+}
+
+message FrameData {
+ optional int64 timestamp = 1;
+ optional ViewNode node = 2;
+}
+
+message ViewNode {
+ optional string classname = 1;
+ optional string id = 2;
+ optional int32 left = 3;
+ optional int32 top = 4;
+ optional int32 width = 5;
+ optional int32 height = 6;
+ optional int32 scrollX = 7;
+ optional int32 scrollY = 8;
+
+ optional float translationX = 9;
+ optional float translationY = 10;
+ optional float scaleX = 11 [default = 1];
+ optional float scaleY = 12 [default = 1];
+ optional float alpha = 13 [default = 1];
+
+ optional bool willNotDraw = 14;
+ optional bool clipChildren = 15;
+ optional int32 visibility = 16;
+
+ repeated ViewNode children = 17;
+}
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 0fd3c4a..fa4eaed 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -36,6 +36,7 @@
<dimen name="task_thumbnail_icon_drawable_size">44dp</dimen>
<dimen name="overview_task_margin">16dp</dimen>
<dimen name="overview_page_spacing">16dp</dimen>
+ <dimen name="task_icon_cache_default_icon_size">72dp</dimen>
<item name="overview_max_scale" format="float" type="dimen">0.7</item>
<item name="overview_modal_max_scale" format="float" type="dimen">1.1</item>
@@ -66,7 +67,6 @@
<dimen name="quickstep_fling_threshold_speed">0.5dp</dimen>
<!-- Launcher app transition -->
- <item name="content_scale" format="float" type="dimen">0.97</item>
<dimen name="closing_window_trans_y">115dp</dimen>
<dimen name="quick_switch_scaling_scroll_threshold">100dp</dimen>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index b20752d..bb79c1b 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -200,7 +200,6 @@
final Handler mHandler;
- private final float mContentScale;
private final float mClosingWindowTransY;
private final float mMaxShadowRadius;
@@ -245,7 +244,6 @@
mBackAnimationController = new LauncherBackAnimationController(mLauncher, this);
Resources res = mLauncher.getResources();
- mContentScale = res.getFloat(R.dimen.content_scale);
mClosingWindowTransY = res.getDimensionPixelSize(R.dimen.closing_window_trans_y);
mMaxShadowRadius = res.getDimensionPixelSize(R.dimen.max_shadow_radius);
@@ -483,8 +481,8 @@
: new float[]{0, 1};
float[] scales = isAppOpening
- ? new float[]{1, mContentScale}
- : new float[]{mContentScale, 1};
+ ? new float[]{1, mDeviceProfile.workspaceContentScale}
+ : new float[]{mDeviceProfile.workspaceContentScale, 1};
// Pause expensive view updates as they can lead to layer thrashing and skipped frames.
mLauncher.pauseExpensiveViewUpdates();
diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java
index 119ae90..7b48332 100644
--- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java
+++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java
@@ -41,7 +41,6 @@
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.model.data.WorkspaceItemInfo;
-import com.android.launcher3.uioverrides.ApiWrapper;
import com.android.launcher3.uioverrides.PredictedAppIcon;
import com.android.launcher3.views.AbstractSlideInView;
@@ -107,8 +106,7 @@
mDismissBtn.setOnClickListener(this::onDismiss);
LinearLayout buttonContainer = findViewById(R.id.button_container);
- int adjustedMarginEnd = ApiWrapper.getHotseatEndOffset(context)
- - buttonContainer.getPaddingEnd();
+ int adjustedMarginEnd = grid.hotseatBarEndOffset - buttonContainer.getPaddingEnd();
if (InvariantDeviceProfile.INSTANCE.get(context)
.getDeviceProfile(context).isTaskbarPresent && adjustedMarginEnd > 0) {
((LinearLayout.LayoutParams) buttonContainer.getLayoutParams()).setMarginEnd(
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
index e4f82d2..dc5c22d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
@@ -17,9 +17,11 @@
import android.graphics.Insets
import android.graphics.Region
+import android.view.InsetsFrameProvider
import android.view.InsetsState.ITYPE_BOTTOM_MANDATORY_GESTURES
import android.view.InsetsState
import android.view.WindowManager
+import android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD
import com.android.launcher3.AbstractFloatingView
import com.android.launcher3.AbstractFloatingView.TYPE_TASKBAR_ALL_APPS
import com.android.launcher3.DeviceProfile
@@ -87,8 +89,14 @@
}
var imeInsetsSize = Insets.of(0, 0, 0, taskbarHeightForIme)
+ var insetsSizeOverride = arrayOf(
+ InsetsFrameProvider.InsetsSizeOverride(
+ TYPE_INPUT_METHOD,
+ imeInsetsSize
+ )
+ )
for (provider in windowLayoutParams.providedInsets) {
- provider.imeInsetsSize = imeInsetsSize
+ provider.insetsSizeOverrides = insetsSizeOverride
}
}
@@ -141,9 +149,16 @@
pw.println(prefix + "TaskbarInsetsController:")
pw.println("$prefix\twindowHeight=${windowLayoutParams.height}")
for (provider in windowLayoutParams.providedInsets) {
- pw.println("$prefix\tprovidedInsets: (type=" + InsetsState.typeToString(provider.type)
- + " insetsSize=" + provider.insetsSize
- + " imeInsetsSize=" + provider.imeInsetsSize + ")")
+ pw.print("$prefix\tprovidedInsets: (type=" + InsetsState.typeToString(provider.type)
+ + " insetsSize=" + provider.insetsSize)
+ if (provider.insetsSizeOverrides != null) {
+ pw.print(" insetsSizeOverrides={")
+ for (overrideSize in provider.insetsSizeOverrides) {
+ pw.print(overrideSize)
+ }
+ pw.print("})")
+ }
+ pw.println()
}
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
index 6a43cc5..ea15acb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
@@ -42,7 +42,6 @@
import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
-import com.android.launcher3.uioverrides.ApiWrapper;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.AllAppsButton;
@@ -292,7 +291,7 @@
countExcludingQsb--;
}
int spaceNeeded = countExcludingQsb * (mItemMarginLeftRight * 2 + mIconTouchSize);
- int navSpaceNeeded = ApiWrapper.getHotseatEndOffset(getContext());
+ int navSpaceNeeded = deviceProfile.hotseatBarEndOffset;
boolean layoutRtl = isLayoutRtl();
int iconEnd = right - (right - left - spaceNeeded) / 2;
boolean needMoreSpaceForNav = layoutRtl ?
diff --git a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java
index 2f8e4d9..f450496 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/ApiWrapper.java
@@ -17,14 +17,9 @@
package com.android.launcher3.uioverrides;
import android.app.Person;
-import android.content.Context;
import android.content.pm.ShortcutInfo;
-import android.content.res.Resources;
-import com.android.launcher3.R;
import com.android.launcher3.Utilities;
-import com.android.launcher3.util.DisplayController;
-import com.android.launcher3.util.DisplayController.NavigationMode;
public class ApiWrapper {
@@ -34,24 +29,4 @@
Person[] persons = si.getPersons();
return persons == null ? Utilities.EMPTY_PERSON_ARRAY : persons;
}
-
- /**
- * Returns the minimum space that should be left empty at the end of hotseat
- */
- public static int getHotseatEndOffset(Context context) {
- if (DisplayController.getNavigationMode(context) == NavigationMode.THREE_BUTTONS) {
- Resources res = context.getResources();
- /*
- * 3 nav buttons +
- * Little space at the end for contextual buttons +
- * Little space between icons and nav buttons
- */
- return 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
- + res.getDimensionPixelSize(R.dimen.taskbar_contextual_button_margin)
- + res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing);
- } else {
- return 0;
- }
-
- }
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
index 84b3839..871ddc6 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
@@ -28,6 +28,7 @@
import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW;
import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
+import static com.android.quickstep.views.RecentsView.OVERVIEW_PROGRESS;
import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS;
import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION;
@@ -74,6 +75,7 @@
getTaskModalnessProperty().set(mRecentsView, state.getOverviewModalness());
RECENTS_GRID_PROGRESS.set(mRecentsView,
state.displayOverviewTasksAsGrid(mLauncher.getDeviceProfile()) ? 1f : 0f);
+ OVERVIEW_PROGRESS.set(mRecentsView, state == LauncherState.OVERVIEW ? 1f : 0f);
}
@Override
@@ -117,6 +119,9 @@
boolean showAsGrid = toState.displayOverviewTasksAsGrid(mLauncher.getDeviceProfile());
setter.setFloat(mRecentsView, RECENTS_GRID_PROGRESS, showAsGrid ? 1f : 0f,
showAsGrid ? INSTANT : FINAL_FRAME);
+
+ setter.setFloat(mRecentsView, OVERVIEW_PROGRESS,
+ toState == LauncherState.OVERVIEW ? 1f : 0f, INSTANT);
}
abstract FloatProperty getTaskModalnessProperty();
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java
index a74774c..9f2efc4 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/AllAppsState.java
@@ -31,8 +31,6 @@
*/
public class AllAppsState extends LauncherState {
- private static final float WORKSPACE_SCALE_FACTOR = 0.97f;
-
private static final int STATE_FLAGS =
FLAG_WORKSPACE_INACCESSIBLE | FLAG_CLOSE_POPUPS | FLAG_HOTSEAT_INACCESSIBLE;
@@ -60,7 +58,8 @@
@Override
public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) {
- return new ScaleAndTranslation(WORKSPACE_SCALE_FACTOR, NO_OFFSET, NO_OFFSET);
+ return new ScaleAndTranslation(launcher.getDeviceProfile().workspaceContentScale, NO_OFFSET,
+ NO_OFFSET);
}
@Override
@@ -71,7 +70,7 @@
ScaleAndTranslation overviewScaleAndTranslation = LauncherState.OVERVIEW
.getWorkspaceScaleAndTranslation(launcher);
return new ScaleAndTranslation(
- WORKSPACE_SCALE_FACTOR,
+ launcher.getDeviceProfile().workspaceContentScale,
overviewScaleAndTranslation.translationX,
overviewScaleAndTranslation.translationY);
}
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 9eb4d62..d7fea37 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -141,7 +141,7 @@
RecentsAnimationCallbacks.RecentsAnimationListener {
private static final String TAG = "AbsSwipeUpHandler";
- private static final String[] STATE_NAMES = DEBUG_STATES ? new String[17] : null;
+ private static final ArrayList<String> STATE_NAMES = new ArrayList<>();
protected final BaseActivityInterface<S, T> mActivityInterface;
protected final InputConsumerProxy mInputConsumerProxy;
@@ -172,59 +172,62 @@
}
};
- private static int getFlagForIndex(int index, String name) {
+ private static int FLAG_COUNT = 0;
+ private static int getNextStateFlag(String name) {
if (DEBUG_STATES) {
- STATE_NAMES[index] = name;
+ STATE_NAMES.add(name);
}
- return 1 << index;
+ int index = 1 << FLAG_COUNT;
+ FLAG_COUNT++;
+ return index;
}
// Launcher UI related states
protected static final int STATE_LAUNCHER_PRESENT =
- getFlagForIndex(0, "STATE_LAUNCHER_PRESENT");
+ getNextStateFlag("STATE_LAUNCHER_PRESENT");
protected static final int STATE_LAUNCHER_STARTED =
- getFlagForIndex(1, "STATE_LAUNCHER_STARTED");
+ getNextStateFlag("STATE_LAUNCHER_STARTED");
protected static final int STATE_LAUNCHER_DRAWN =
- getFlagForIndex(2, "STATE_LAUNCHER_DRAWN");
+ getNextStateFlag("STATE_LAUNCHER_DRAWN");
// Called when the Launcher has connected to the touch interaction service (and the taskbar
// ui controller is initialized)
protected static final int STATE_LAUNCHER_BIND_TO_SERVICE =
- getFlagForIndex(3, "STATE_LAUNCHER_BIND_TO_SERVICE");
+ getNextStateFlag("STATE_LAUNCHER_BIND_TO_SERVICE");
// Internal initialization states
private static final int STATE_APP_CONTROLLER_RECEIVED =
- getFlagForIndex(4, "STATE_APP_CONTROLLER_RECEIVED");
+ getNextStateFlag("STATE_APP_CONTROLLER_RECEIVED");
// Interaction finish states
private static final int STATE_SCALED_CONTROLLER_HOME =
- getFlagForIndex(5, "STATE_SCALED_CONTROLLER_HOME");
+ getNextStateFlag("STATE_SCALED_CONTROLLER_HOME");
private static final int STATE_SCALED_CONTROLLER_RECENTS =
- getFlagForIndex(6, "STATE_SCALED_CONTROLLER_RECENTS");
+ getNextStateFlag("STATE_SCALED_CONTROLLER_RECENTS");
protected static final int STATE_HANDLER_INVALIDATED =
- getFlagForIndex(7, "STATE_HANDLER_INVALIDATED");
+ getNextStateFlag("STATE_HANDLER_INVALIDATED");
private static final int STATE_GESTURE_STARTED =
- getFlagForIndex(8, "STATE_GESTURE_STARTED");
+ getNextStateFlag("STATE_GESTURE_STARTED");
private static final int STATE_GESTURE_CANCELLED =
- getFlagForIndex(9, "STATE_GESTURE_CANCELLED");
+ getNextStateFlag("STATE_GESTURE_CANCELLED");
private static final int STATE_GESTURE_COMPLETED =
- getFlagForIndex(10, "STATE_GESTURE_COMPLETED");
+ getNextStateFlag("STATE_GESTURE_COMPLETED");
private static final int STATE_CAPTURE_SCREENSHOT =
- getFlagForIndex(11, "STATE_CAPTURE_SCREENSHOT");
+ getNextStateFlag("STATE_CAPTURE_SCREENSHOT");
protected static final int STATE_SCREENSHOT_CAPTURED =
- getFlagForIndex(12, "STATE_SCREENSHOT_CAPTURED");
+ getNextStateFlag("STATE_SCREENSHOT_CAPTURED");
private static final int STATE_SCREENSHOT_VIEW_SHOWN =
- getFlagForIndex(13, "STATE_SCREENSHOT_VIEW_SHOWN");
+ getNextStateFlag("STATE_SCREENSHOT_VIEW_SHOWN");
private static final int STATE_RESUME_LAST_TASK =
- getFlagForIndex(14, "STATE_RESUME_LAST_TASK");
+ getNextStateFlag("STATE_RESUME_LAST_TASK");
private static final int STATE_START_NEW_TASK =
- getFlagForIndex(15, "STATE_START_NEW_TASK");
+ getNextStateFlag("STATE_START_NEW_TASK");
private static final int STATE_CURRENT_TASK_FINISHED =
- getFlagForIndex(16, "STATE_CURRENT_TASK_FINISHED");
+ getNextStateFlag("STATE_CURRENT_TASK_FINISHED");
private static final int STATE_FINISH_WITH_NO_END =
- getFlagForIndex(17, "STATE_FINISH_WITH_NO_END");
+ getNextStateFlag("STATE_FINISH_WITH_NO_END");
private static final int LAUNCHER_UI_STATES =
STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED |
@@ -318,7 +321,7 @@
}
private void initStateCallbacks() {
- mStateCallback = new MultiStateCallback(STATE_NAMES);
+ mStateCallback = new MultiStateCallback(STATE_NAMES.toArray(new String[0]));
mStateCallback.runOnceAtState(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED,
this::onLauncherPresentAndGestureStarted);
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index 52abb92..6354282 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -60,7 +60,6 @@
import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.views.RecentsView;
-import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@@ -280,17 +279,8 @@
public static void getTaskDimension(DeviceProfile dp, PointF out) {
out.x = dp.widthPx;
out.y = dp.heightPx;
- if (TaskView.clipLeft(dp)) {
- out.x -= dp.getInsets().left;
- }
- if (TaskView.clipRight(dp)) {
- out.x -= dp.getInsets().right;
- }
- if (TaskView.clipTop(dp)) {
- out.y -= dp.getInsets().top;
- }
- if (TaskView.clipBottom(dp)) {
- out.y -= Math.max(dp.getInsets().bottom, dp.taskbarSize);
+ if (dp.isTablet) {
+ out.y -= dp.taskbarSize;
}
}
diff --git a/quickstep/src/com/android/quickstep/GestureState.java b/quickstep/src/com/android/quickstep/GestureState.java
index 3b52e91..acdbbbd 100644
--- a/quickstep/src/com/android/quickstep/GestureState.java
+++ b/quickstep/src/com/android/quickstep/GestureState.java
@@ -38,6 +38,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
/**
@@ -82,11 +83,11 @@
private static final String TAG = "GestureState";
- private static final ArrayList<String> STATE_NAMES = new ArrayList<>();
+ private static final List<String> STATE_NAMES = new ArrayList<>();
public static final GestureState DEFAULT_STATE = new GestureState();
private static int FLAG_COUNT = 0;
- private static int getFlagForIndex(String name) {
+ private static int getNextStateFlag(String name) {
if (DEBUG_STATES) {
STATE_NAMES.add(name);
}
@@ -97,36 +98,36 @@
// Called when the end target as been set
public static final int STATE_END_TARGET_SET =
- getFlagForIndex("STATE_END_TARGET_SET");
+ getNextStateFlag("STATE_END_TARGET_SET");
// Called when the end target animation has finished
public static final int STATE_END_TARGET_ANIMATION_FINISHED =
- getFlagForIndex("STATE_END_TARGET_ANIMATION_FINISHED");
+ getNextStateFlag("STATE_END_TARGET_ANIMATION_FINISHED");
// Called when the recents animation has been requested to start
public static final int STATE_RECENTS_ANIMATION_INITIALIZED =
- getFlagForIndex("STATE_RECENTS_ANIMATION_INITIALIZED");
+ getNextStateFlag("STATE_RECENTS_ANIMATION_INITIALIZED");
// Called when the recents animation is started and the TaskAnimationManager has been updated
// with the controller and targets
public static final int STATE_RECENTS_ANIMATION_STARTED =
- getFlagForIndex("STATE_RECENTS_ANIMATION_STARTED");
+ getNextStateFlag("STATE_RECENTS_ANIMATION_STARTED");
// Called when the recents animation is canceled
public static final int STATE_RECENTS_ANIMATION_CANCELED =
- getFlagForIndex("STATE_RECENTS_ANIMATION_CANCELED");
+ getNextStateFlag("STATE_RECENTS_ANIMATION_CANCELED");
// Called when the recents animation finishes
public static final int STATE_RECENTS_ANIMATION_FINISHED =
- getFlagForIndex("STATE_RECENTS_ANIMATION_FINISHED");
+ getNextStateFlag("STATE_RECENTS_ANIMATION_FINISHED");
// Always called when the recents animation ends (regardless of cancel or finish)
public static final int STATE_RECENTS_ANIMATION_ENDED =
- getFlagForIndex("STATE_RECENTS_ANIMATION_ENDED");
+ getNextStateFlag("STATE_RECENTS_ANIMATION_ENDED");
// Called when RecentsView stops scrolling and settles on a TaskView.
public static final int STATE_RECENTS_SCROLLING_FINISHED =
- getFlagForIndex("STATE_RECENTS_SCROLLING_FINISHED");
+ getNextStateFlag("STATE_RECENTS_SCROLLING_FINISHED");
// Needed to interact with the current activity
private final Intent mHomeIntent;
diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java
index 9ca5fc5..dc60875 100644
--- a/quickstep/src/com/android/quickstep/TaskIconCache.java
+++ b/quickstep/src/com/android/quickstep/TaskIconCache.java
@@ -263,7 +263,8 @@
if (mIconFactory == null) {
mIconFactory = new BaseIconFactory(mContext,
DisplayController.INSTANCE.get(mContext).getInfo().getDensityDpi(),
- mContext.getResources().getDimensionPixelSize(R.dimen.taskbar_icon_size));
+ mContext.getResources().getDimensionPixelSize(
+ R.dimen.task_icon_cache_default_icon_size));
}
return mIconFactory;
}
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
index f68bbbc..c7c3441 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
@@ -27,6 +27,7 @@
import static com.android.quickstep.fallback.RecentsState.OVERVIEW_SPLIT_SELECT;
import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS;
+import static com.android.quickstep.views.RecentsView.OVERVIEW_PROGRESS;
import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS;
import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
import static com.android.quickstep.views.RecentsView.TASK_MODALNESS;
@@ -105,6 +106,8 @@
boolean showAsGrid = state.displayOverviewTasksAsGrid(mActivity.getDeviceProfile());
setter.setFloat(mRecentsView, RECENTS_GRID_PROGRESS, showAsGrid ? 1f : 0f,
showAsGrid ? INSTANT : FINAL_FRAME);
+ setter.setFloat(mRecentsView, OVERVIEW_PROGRESS, state == RecentsState.DEFAULT ? 1f : 0f,
+ INSTANT);
setter.setViewBackgroundColor(mActivity.getScrimView(), state.getScrimColor(mActivity),
config.getInterpolator(ANIM_SCRIM_FADE, LINEAR));
diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
index aa52789..8ad17cb 100644
--- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
@@ -83,6 +83,8 @@
private static final int MAX_SWIPE_DURATION = 350;
+ private static final float ANIMATION_PAUSE_ALPHA_THRESHOLD = 0.1f;
+
private TISBindHelper mTISBindHelper;
private TISBinder mBinder;
@@ -145,6 +147,10 @@
}
private void runOnUiHelperThread(Runnable runnable) {
+ if (!isResumed()
+ || getContentViewAlphaForSwipeProgress() <= ANIMATION_PAUSE_ALPHA_THRESHOLD) {
+ return;
+ }
Executors.UI_HELPER_EXECUTOR.execute(runnable);
}
@@ -198,6 +204,7 @@
@Override
protected void onResume() {
super.onResume();
+ maybeResumeOrPauseBackgroundAnimation();
if (mBinder != null) {
mBinder.getTaskbarManager().setSetupUIVisible(true);
mBinder.setSwipeUpProxy(this::createSwipeUpProxy);
@@ -216,6 +223,7 @@
protected void onPause() {
super.onPause();
clearBinderOverride();
+ maybeResumeOrPauseBackgroundAnimation();
if (mSwipeProgress.value >= 1) {
finishAndRemoveTask();
}
@@ -250,10 +258,25 @@
return mSwipeProgress;
}
+ private float getContentViewAlphaForSwipeProgress() {
+ return Utilities.mapBoundToRange(
+ mSwipeProgress.value, 0, HINT_BOTTOM_FACTOR, 1, 0, LINEAR);
+ }
+
+ private void maybeResumeOrPauseBackgroundAnimation() {
+ boolean shouldPlayAnimation =
+ getContentViewAlphaForSwipeProgress() > ANIMATION_PAUSE_ALPHA_THRESHOLD
+ && isResumed();
+ if (mAnimatedBackground.isAnimating() && !shouldPlayAnimation) {
+ mAnimatedBackground.pauseAnimation();
+ } else if (!mAnimatedBackground.isAnimating() && shouldPlayAnimation) {
+ mAnimatedBackground.resumeAnimation();
+ }
+ }
+
private void onSwipeProgressUpdate() {
mBackground.setProgress(mSwipeProgress.value);
- float alpha = Utilities.mapBoundToRange(
- mSwipeProgress.value, 0, HINT_BOTTOM_FACTOR, 1, 0, LINEAR);
+ float alpha = getContentViewAlphaForSwipeProgress();
mContentView.setAlpha(alpha);
mContentView.setTranslationY((alpha - 1) * mSwipeUpShift);
@@ -265,12 +288,7 @@
mLauncherStartAnim.setPlayFraction(Utilities.mapBoundToRange(
mSwipeProgress.value, 0, 1, 0, 1, FAST_OUT_SLOW_IN));
}
-
- if (alpha == 0f) {
- mAnimatedBackground.pauseAnimation();
- } else if (!mAnimatedBackground.isAnimating()) {
- mAnimatedBackground.resumeAnimation();
- }
+ maybeResumeOrPauseBackgroundAnimation();
}
/**
diff --git a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
index f2fcd06..dec934a 100644
--- a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
+++ b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
@@ -53,7 +53,6 @@
import com.android.quickstep.BaseActivityInterface;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TaskAnimationManager;
-import com.android.quickstep.views.TaskView;
import java.lang.annotation.Retention;
import java.util.function.IntConsumer;
@@ -399,31 +398,10 @@
* Returns the scale and pivot so that the provided taskRect can fit the provided full size
*/
public float getFullScreenScaleAndPivot(Rect taskView, DeviceProfile dp, PointF outPivot) {
- Rect insets = dp.getInsets();
- float fullWidth = dp.widthPx;
- float fullHeight = dp.heightPx;
- if (TaskView.clipLeft(dp)) {
- fullWidth -= insets.left;
- }
- if (TaskView.clipRight(dp)) {
- fullWidth -= insets.right;
- }
- if (TaskView.clipTop(dp)) {
- fullHeight -= insets.top;
- }
- if (TaskView.clipBottom(dp)) {
- fullHeight -= insets.bottom;
- }
-
getTaskDimension(dp, outPivot);
float scale = Math.min(outPivot.x / taskView.width(), outPivot.y / taskView.height());
- // We also scale the preview as part of fullScreenParams, so account for that as well.
- if (fullWidth > 0) {
- scale = scale * dp.widthPx / fullWidth;
- }
-
if (scale == 1) {
- outPivot.set(fullWidth / 2, fullHeight / 2);
+ outPivot.set(taskView.centerX(), taskView.centerY());
} else {
float factor = scale / (scale - 1);
outPivot.set(taskView.left * factor, taskView.top * factor);
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
index cb88068..2dff18e 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
@@ -1,5 +1,6 @@
package com.android.quickstep.views;
+import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.util.SplitConfigurationOptions.DEFAULT_SPLIT_RATIO;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
@@ -313,4 +314,11 @@
mSnapshotView2.setDimAlpha(amount);
mDigitalWellBeingToast2.setBannerColorTint(tintColor, amount);
}
+
+ @Override
+ protected void applyThumbnailSplashAlpha() {
+ super.applyThumbnailSplashAlpha();
+ mSnapshotView2.setSplashAlpha(
+ Utilities.mapToRange(mOverviewProgress, 0f, 1f, 1f, 0f, LINEAR));
+ }
}
diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
index bfb43c1..9b585fc 100644
--- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
+++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
@@ -31,7 +31,6 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.R;
-import com.android.launcher3.uioverrides.ApiWrapper;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.NavigationMode;
import com.android.launcher3.util.MultiValueAlpha;
@@ -206,10 +205,9 @@
if (mDp == null) {
return;
}
- boolean alignFor3ButtonTaskbar = mDp.isTaskbarPresent && !mDp.isGestureMode;
- if (alignFor3ButtonTaskbar) {
+ if (mDp.areNavButtonsInline) {
// Add extra horizontal spacing
- int additionalPadding = ApiWrapper.getHotseatEndOffset(getContext());
+ int additionalPadding = mDp.hotseatBarEndOffset;
if (isLayoutRtl()) {
setPadding(mInsets.left + additionalPadding, 0, mInsets.right, 0);
} else {
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 274a691..583d097 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -363,6 +363,10 @@
}
};
+ /**
+ * Progress of Recents view from carousel layout to grid layout. If Recents is not shown as a
+ * grid, then the value remains 0.
+ */
public static final FloatProperty<RecentsView> RECENTS_GRID_PROGRESS =
new FloatProperty<RecentsView>("recentsGrid") {
@Override
@@ -376,6 +380,23 @@
}
};
+ /**
+ * Progress to and from the OVERVIEW state, where being in OverviewState has a value of 1, and
+ * being in any other LauncherState has a value of 0.
+ */
+ public static final FloatProperty<RecentsView> OVERVIEW_PROGRESS =
+ new FloatProperty<RecentsView>("overviewProgress") {
+ @Override
+ public void setValue(RecentsView view, float overviewProgress) {
+ view.setOverviewProgress(overviewProgress);
+ }
+
+ @Override
+ public Float get(RecentsView view) {
+ return view.mOverviewProgress;
+ }
+ };
+
// OverScroll constants
private static final int OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION = 270;
@@ -466,6 +487,7 @@
protected float mTaskViewsSecondarySplitTranslation = 0;
// Progress from 0 to 1 where 0 is a carousel and 1 is a 2 row grid.
private float mGridProgress = 0;
+ private float mOverviewProgress = 0;
private boolean mShowAsGridLastOnLayout = false;
private final IntSet mTopRowIdSet = new IntSet();
@@ -2661,6 +2683,18 @@
mClearAllButton.setGridProgress(gridProgress);
}
+ private void setOverviewProgress(float overviewProgress) {
+ int taskCount = getTaskViewCount();
+ if (taskCount == 0) {
+ return;
+ }
+
+ mOverviewProgress = overviewProgress;
+ for (int i = 0; i < taskCount; i++) {
+ requireTaskViewAt(i).setOverviewProgress(overviewProgress);
+ }
+ }
+
private void enableLayoutTransitions() {
if (mLayoutTransition == null) {
mLayoutTransition = new LayoutTransition();
@@ -4301,6 +4335,7 @@
properties));
}
}
+ anim.play(ObjectAnimator.ofFloat(recentsView, OVERVIEW_PROGRESS, 1, 0));
return anim;
}
@@ -4360,6 +4395,8 @@
BACKGROUND_APP.getDepth(mActivity));
anim.play(depthAnimator);
}
+ anim.play(ObjectAnimator.ofFloat(this, OVERVIEW_PROGRESS, 1f, 0f));
+
anim.play(progressAnim);
anim.setInterpolator(interpolator);
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
index 32dc4d8..727504a 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailView.java
@@ -36,12 +36,14 @@
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
+import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.Property;
import android.view.Surface;
import android.view.View;
+import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
@@ -50,6 +52,7 @@
import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Utilities;
+import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.SystemUiController.SystemUiControllerFlags;
@@ -64,6 +67,7 @@
public class TaskThumbnailView extends View {
private static final MainThreadInitializedObject<FullscreenDrawParams> TEMP_PARAMS =
new MainThreadInitializedObject<>(FullscreenDrawParams::new);
+ private static final float MAX_PCT_BEFORE_ASPECT_RATIOS_CONSIDERED_DIFFERENT = 0.1f;
public static final Property<TaskThumbnailView, Float> DIM_ALPHA =
new FloatProperty<TaskThumbnailView>("dimAlpha") {
@@ -83,6 +87,7 @@
private TaskOverlay mOverlay;
private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private final Paint mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Paint mSplashBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private final Paint mClearPaint = new Paint();
private final Paint mDimmingPaintAfterClearing = new Paint();
private final int mDimColor;
@@ -91,6 +96,8 @@
private final Rect mPreviewRect = new Rect();
private final PreviewPositionHelper mPreviewPositionHelper = new PreviewPositionHelper();
private TaskView.FullscreenDrawParams mFullscreenParams;
+ private ImageView mSplashView;
+ private Drawable mSplashViewDrawable;
@Nullable
private Task mTask;
@@ -101,6 +108,8 @@
/** How much this thumbnail is dimmed, 0 not dimmed at all, 1 totally dimmed. */
private float mDimAlpha = 0f;
+ /** Controls visibility of the splash view, 0 is transparent, 255 fully opaque. */
+ private int mSplashAlpha = 0;
private boolean mOverlayEnabled;
@@ -116,6 +125,7 @@
super(context, attrs, defStyleAttr);
mPaint.setFilterBitmap(true);
mBackgroundPaint.setColor(Color.WHITE);
+ mSplashBackgroundPaint.setColor(Color.WHITE);
mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mActivity = BaseActivity.fromContext(context);
// Initialize with placeholder value. It is overridden later by TaskView
@@ -135,6 +145,8 @@
int color = task == null ? Color.BLACK : task.colorBackground | 0xFF000000;
mPaint.setColor(color);
mBackgroundPaint.setColor(color);
+ mSplashBackgroundPaint.setColor(color);
+ updateSplashView(mTask.icon);
}
/**
@@ -152,6 +164,9 @@
boolean thumbnailWasNull = mThumbnailData == null;
mThumbnailData =
(thumbnailData != null && thumbnailData.thumbnail != null) ? thumbnailData : null;
+ if (mTask != null) {
+ updateSplashView(mTask.icon);
+ }
if (refreshNow) {
refresh(thumbnailWasNull && mThumbnailData != null);
}
@@ -202,6 +217,18 @@
updateThumbnailPaintFilter();
}
+ /**
+ * Sets the alpha of the splash view.
+ */
+ public void setSplashAlpha(float splashAlpha) {
+ mSplashAlpha = (int) (splashAlpha * 255);
+ if (mSplashViewDrawable != null) {
+ mSplashViewDrawable.setAlpha(mSplashAlpha);
+ }
+ mSplashBackgroundPaint.setAlpha(mSplashAlpha);
+ invalidate();
+ }
+
public TaskOverlay getTaskOverlay() {
if (mOverlay == null) {
mOverlay = getTaskView().getRecentsView().getTaskOverlayFactory().createOverlay(this);
@@ -238,13 +265,9 @@
boundsToBitmapSpace.mapRect(boundsInBitmapSpace, viewRect);
DeviceProfile dp = mActivity.getDeviceProfile();
- int leftInset = TaskView.clipLeft(dp) ? Math.round(boundsInBitmapSpace.left) : 0;
- int topInset = TaskView.clipTop(dp) ? Math.round(boundsInBitmapSpace.top) : 0;
- int rightInset = TaskView.clipRight(dp) ? Math.round(
- bitmapRect.right - boundsInBitmapSpace.right) : 0;
- int bottomInset = TaskView.clipBottom(dp)
+ int bottomInset = dp.isTablet
? Math.round(bitmapRect.bottom - boundsInBitmapSpace.bottom) : 0;
- return Insets.of(leftInset, topInset, rightInset, bottomInset);
+ return Insets.of(0, 0, 0, bottomInset);
}
@@ -264,6 +287,12 @@
}
@Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ updateSplashView(mSplashViewDrawable);
+ }
+
+ @Override
protected void onDraw(Canvas canvas) {
RectF currentDrawnInsets = mFullscreenParams.mCurrentDrawnInsets;
canvas.save();
@@ -313,6 +342,17 @@
}
canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint);
+
+ // Draw splash above thumbnail to hide inconsistencies in rotation and aspect ratios.
+ if (shouldShowSplashView()) {
+ if (mSplashView != null) {
+ canvas.drawRoundRect(x, y, width + 1, height + 1, cornerRadius,
+ cornerRadius, mSplashBackgroundPaint);
+
+ mSplashView.layout((int) x, (int) (y + 1), (int) width, (int) height - 1);
+ mSplashView.draw(canvas);
+ }
+ }
}
public TaskView getTaskView() {
@@ -328,6 +368,78 @@
}
/**
+ * Determine if the splash should be shown over top of the thumbnail.
+ *
+ * <p>We want to show the splash if the aspect ratio or rotation of the thumbnail would be
+ * different from the task.
+ */
+ boolean shouldShowSplashView() {
+ return isThumbnailAspectRatioDifferentFromThumbnailData()
+ || isThumbnailRotationDifferentFromTask();
+ }
+
+ private void updateSplashView(Drawable icon) {
+ if (icon == null || icon.getConstantState() == null) {
+ return;
+ }
+ mSplashViewDrawable = icon.getConstantState().newDrawable().mutate();
+ mSplashViewDrawable.setAlpha(mSplashAlpha);
+ ImageView imageView = mSplashView == null ? new ImageView(getContext()) : mSplashView;
+ imageView.setImageDrawable(mSplashViewDrawable);
+
+ imageView.setScaleType(ImageView.ScaleType.MATRIX);
+ Matrix matrix = new Matrix();
+
+ float drawableWidth = mSplashViewDrawable.getIntrinsicWidth();
+ float drawableHeight = mSplashViewDrawable.getIntrinsicHeight();
+ float viewWidth = getMeasuredWidth();
+ float viewCenterX = viewWidth / 2f;
+ float viewHeight = getMeasuredHeight();
+ float viewCenterY = viewHeight / 2f;
+ float centeredDrawableLeft = (viewWidth - drawableWidth) / 2f;
+ float centeredDrawableTop = (viewHeight - drawableHeight) / 2f;
+ float nonGridScale = getTaskView() == null ? 1 : 1 / getTaskView().getNonGridScale();
+ float recentsMaxScale = getTaskView() == null || getTaskView().getRecentsView() == null
+ ? 1 : 1 / getTaskView().getRecentsView().getMaxScaleForFullScreen();
+ float scale = nonGridScale * recentsMaxScale;
+
+ // Center the image in the view.
+ matrix.setTranslate(centeredDrawableLeft, centeredDrawableTop);
+ // Apply scale transformation after translation, pivoting around center of view.
+ matrix.postScale(scale, scale, viewCenterX, viewCenterY);
+
+ imageView.setImageMatrix(matrix);
+ mSplashView = imageView;
+ }
+
+ private boolean isThumbnailAspectRatioDifferentFromThumbnailData() {
+ if (mThumbnailData == null || mThumbnailData.thumbnail == null) {
+ return false;
+ }
+
+ float thumbnailViewAspect = getWidth() / (float) getHeight();
+ float thumbnailDataAspect =
+ mThumbnailData.thumbnail.getWidth() / (float) mThumbnailData.thumbnail.getHeight();
+
+ return Utilities.isRelativePercentDifferenceGreaterThan(thumbnailViewAspect,
+ thumbnailDataAspect, MAX_PCT_BEFORE_ASPECT_RATIOS_CONSIDERED_DIFFERENT);
+ }
+
+ private boolean isThumbnailRotationDifferentFromTask() {
+ RecentsView recents = getTaskView().getRecentsView();
+ if (recents == null || mThumbnailData == null) {
+ return false;
+ }
+
+ if (recents.getPagedOrientationHandler() == PagedOrientationHandler.PORTRAIT) {
+ int currentRotation = recents.getPagedViewOrientedState().getRecentsActivityRotation();
+ return (currentRotation - mThumbnailData.rotation) % 2 != 0;
+ } else {
+ return recents.getPagedOrientationHandler().getRotation() != mThumbnailData.rotation;
+ }
+ }
+
+ /**
* Potentially re-init the task overlay. Be cautious when calling this as the overlay may
* do processing on initialization.
*/
@@ -435,18 +547,9 @@
int thumbnailRotation = thumbnailData.rotation;
int deltaRotate = getRotationDelta(currentRotation, thumbnailRotation);
RectF thumbnailClipHint = new RectF();
- if (TaskView.clipLeft(dp)) {
- thumbnailClipHint.left = thumbnailData.insets.left;
- }
- if (TaskView.clipRight(dp)) {
- thumbnailClipHint.right = thumbnailData.insets.right;
- }
- if (TaskView.clipTop(dp)) {
- thumbnailClipHint.top = thumbnailData.insets.top;
- }
- if (TaskView.clipBottom(dp)) {
- thumbnailClipHint.bottom = thumbnailData.insets.bottom;
- }
+ float canvasScreenRatio = canvasWidth / (float) dp.widthPx;
+ float scaledTaskbarSize = dp.taskbarSize * canvasScreenRatio;
+ thumbnailClipHint.bottom = dp.isTablet ? scaledTaskbarSize : 0;
float scale = thumbnailData.scale;
final float thumbnailScale;
@@ -476,8 +579,9 @@
float availableAspect = isRotated
? availableHeight / availableWidth
: availableWidth / availableHeight;
- boolean isAspectLargelyDifferent = Utilities.isRelativePercentDifferenceGreaterThan(
- canvasAspect, availableAspect, 0.1f);
+ boolean isAspectLargelyDifferent =
+ Utilities.isRelativePercentDifferenceGreaterThan(canvasAspect,
+ availableAspect, MAX_PCT_BEFORE_ASPECT_RATIOS_CONSIDERED_DIFFERENT);
if (isRotated && isAspectLargelyDifferent) {
// Do not rotate thumbnail if it would not improve fit
isRotated = false;
@@ -486,18 +590,10 @@
if (isAspectLargelyDifferent) {
// Crop letterbox insets if insets isn't already clipped
- if (!TaskView.clipLeft(dp)) {
- thumbnailClipHint.left = thumbnailData.letterboxInsets.left;
- }
- if (!TaskView.clipRight(dp)) {
- thumbnailClipHint.right = thumbnailData.letterboxInsets.right;
- }
- if (!TaskView.clipTop(dp)) {
- thumbnailClipHint.top = thumbnailData.letterboxInsets.top;
- }
- if (!TaskView.clipBottom(dp)) {
- thumbnailClipHint.bottom = thumbnailData.letterboxInsets.bottom;
- }
+ thumbnailClipHint.left = thumbnailData.letterboxInsets.left;
+ thumbnailClipHint.right = thumbnailData.letterboxInsets.right;
+ thumbnailClipHint.top = thumbnailData.letterboxInsets.top;
+ thumbnailClipHint.bottom = thumbnailData.letterboxInsets.bottom;
availableWidth = surfaceWidth
- (thumbnailClipHint.left + thumbnailClipHint.right);
availableHeight = surfaceHeight
@@ -568,8 +664,7 @@
setThumbnailRotation(deltaRotate, thumbnailBounds);
}
- float canvasScreenRatio = canvasWidth / (float) dp.widthPx;
- mClippedInsets.set(0, 0, 0, dp.taskbarSize * canvasScreenRatio);
+ mClippedInsets.set(0, 0, 0, scaledTaskbarSize);
mMatrix.postScale(thumbnailScale, thumbnailScale);
mIsOrientationChanged = isOrientationDifferent;
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index 68e9f5a..ded0ea6 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -18,6 +18,7 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static android.widget.Toast.LENGTH_SHORT;
+import static android.window.SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR;
import static com.android.launcher3.Utilities.comp;
import static com.android.launcher3.Utilities.getDescendantCoordRelativeToAncestor;
@@ -136,34 +137,6 @@
/** The maximum amount that a task view can be scrimmed, dimmed or tinted. */
public static final float MAX_PAGE_SCRIM_ALPHA = 0.4f;
- /**
- * Should the TaskView display clip off the left inset in RecentsView.
- */
- public static boolean clipLeft(DeviceProfile deviceProfile) {
- return false;
- }
-
- /**
- * Should the TaskView display clip off the top inset in RecentsView.
- */
- public static boolean clipTop(DeviceProfile deviceProfile) {
- return false;
- }
-
- /**
- * Should the TaskView display clip off the right inset in RecentsView.
- */
- public static boolean clipRight(DeviceProfile deviceProfile) {
- return false;
- }
-
- /**
- * Should the TaskView display clip off the bottom inset in RecentsView.
- */
- public static boolean clipBottom(DeviceProfile deviceProfile) {
- return deviceProfile.isTablet;
- }
-
private static final float EDGE_SCALE_DOWN_FACTOR_CAROUSEL = 0.03f;
private static final float EDGE_SCALE_DOWN_FACTOR_GRID = 0.00f;
@@ -361,6 +334,7 @@
protected final DigitalWellBeingToast mDigitalWellBeingToast;
private float mFullscreenProgress;
private float mGridProgress;
+ protected float mOverviewProgress;
private float mNonGridScale = 1;
private float mDismissScale = 1;
protected final FullscreenDrawParams mCurrentFullscreenParams;
@@ -420,7 +394,6 @@
private boolean mIsClickableAsLiveTile = true;
-
public TaskView(Context context) {
this(context, null);
}
@@ -688,6 +661,9 @@
if (freezeTaskList) {
ActivityOptionsCompat.setFreezeRecentTasksList(opts);
}
+ // TODO(b/202826469): Replace setSplashScreenStyle with setDisableStartingWindow.
+ opts.setSplashScreenStyle(mSnapshotView.shouldShowSplashView()
+ ? SPLASH_SCREEN_STYLE_SOLID_COLOR : opts.getSplashScreenStyle());
Task.TaskKey key = mTask.key;
UI_HELPER_EXECUTOR.execute(() -> {
if (!ActivityManagerWrapper.getInstance().startActivityFromRecents(key, opts)) {
@@ -1088,6 +1064,21 @@
return scale;
}
+ /**
+ * Updates progress of task view for entering/exiting overview on swipe up/down.
+ *
+ * <p>Updates the alpha of any splash screen over the thumbnail if it exists.
+ */
+ public void setOverviewProgress(float overviewProgress) {
+ mOverviewProgress = overviewProgress;
+ applyThumbnailSplashAlpha();
+ }
+
+ protected void applyThumbnailSplashAlpha() {
+ mSnapshotView.setSplashAlpha(
+ Utilities.mapToRange(mOverviewProgress, 0f, 1f, 1f, 0f, LINEAR));
+ }
+
private void setSplitSelectTranslationX(float x) {
mSplitSelectTranslationX = x;
applyTranslationX();
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
new file mode 100644
index 0000000..3daf81d
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for phone with 3-Button navigation.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfilePhone3ButtonTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForPhone(isGestureMode = false)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(265)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(343)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.getCellSize().x).isEqualTo(265)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.getCellSize().y).isEqualTo(552)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(66)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(66)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(38)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(25)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(265)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(343)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(27)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(38)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1050)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(232)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(58)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(25)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(409)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(265)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(66)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(66)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(91)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(669)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
+ }
+
+ @Test
+ fun hotseatBarBottomPaddingPx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(221)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(266)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(135)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1189)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(false)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(0)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(91)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(53)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(53)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(573)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.182266f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(84)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(-112)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(112)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(56)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.74417657f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(2447)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(1334)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(364)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2185)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(147)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(558)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(125)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(125)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(448)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
new file mode 100644
index 0000000..e588c71
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for phone.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfilePhoneTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForPhone()
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(265)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(343)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.getCellSize().x).isEqualTo(265)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.getCellSize().y).isEqualTo(552)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(66)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(66)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(38)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(25)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(265)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(343)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(27)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(38)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1050)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(232)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(58)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(25)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(409)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(265)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(66)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(66)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(91)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(669)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
+ }
+
+ @Test
+ fun hotseatBarBottomPaddingPx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(221)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(266)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(135)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1189)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(false)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(0)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(91)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(53)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(53)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(573)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.182266f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(84)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(-112)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(112)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(56)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.74417657f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(2447)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(1334)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(364)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2185)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(147)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(558)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(125)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(125)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(448)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt
deleted file mode 100644
index 20b5a64..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileQuickstepTest.kt
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfileBaseTest
-import com.android.launcher3.InvariantDeviceProfile
-import com.android.launcher3.util.WindowBounds
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers
-import org.mockito.Mockito.`when` as whenever
-
-/**
- * Test for [DeviceProfile] quickstep.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileQuickstepTest : DeviceProfileBaseTest() {
-
- @Test
- fun getCellLayoutWidthAndHeight_twoPanelLandscapeScalable4By4GridTablet() {
- val tabletWidth = 2560
- val tabletHeight = 1600
- val availableWidth = 2560
- val availableHeight = 1500
- windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
- useTwoPanels = true
- whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
- whenever(info.densityDpi).thenReturn(320)
- whenever(info.smallestSizeDp(ArgumentMatchers.any())).thenReturn(800f)
- inv = newScalableInvariantDeviceProfile()
-
- val dp = newDP()
-
- assertThat(dp.cellLayoutWidth).isEqualTo(1237)
- assertThat(dp.cellLayoutHeight).isEqualTo(1215)
- }
-
- @Test
- fun getCellSize_twoPanelLandscapeScalable4By4GridTablet() {
- val tabletWidth = 2560
- val tabletHeight = 1600
- val availableWidth = 2560
- val availableHeight = 1500
- windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
- useTwoPanels = true
- whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
- whenever(info.densityDpi).thenReturn(320)
- whenever(info.smallestSizeDp(ArgumentMatchers.any())).thenReturn(800f)
- inv = newScalableInvariantDeviceProfile()
-
- val dp = newDP()
-
- assertThat(dp.getCellSize().y).isEqualTo(260)
- assertThat(dp.getCellSize().x).isEqualTo(259)
- }
-
- @Test
- fun getPanelCount_twoPanelLandscapeScalable4By4GridTablet() {
- val tabletWidth = 2560
- val tabletHeight = 1600
- val availableWidth = 2560
- val availableHeight = 1500
- windowBounds = WindowBounds(tabletWidth, tabletHeight, availableWidth, availableHeight, 0)
- useTwoPanels = true
- whenever(info.isTablet(ArgumentMatchers.any())).thenReturn(true)
- whenever(info.densityDpi).thenReturn(320)
- whenever(info.smallestSizeDp(ArgumentMatchers.any())).thenReturn(800f)
- inv = newScalableInvariantDeviceProfile()
-
- val dp = newDP()
-
- assertThat(dp.panelCount).isEqualTo(2)
- }
-
- @Test
- fun getWorkspaceSpringLoadShrunkTopBottom_landscapePhoneVerticalBar() {
- inv = newScalableInvariantDeviceProfile()
- initializeVarsForPhone(true)
- inv = newScalableInvariantDeviceProfile().apply {
- deviceType = InvariantDeviceProfile.TYPE_PHONE
- transposeLayoutWithOrientation = true
- }
-
- val dp = newDP()
-
- assertThat(dp.isVerticalBarLayout).isEqualTo(true)
- assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(168)
- assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1358)
- }
-
- @Test
- fun getWorkspaceSpringLoadShrunkTopBottom_portraitPhone() {
- inv = newScalableInvariantDeviceProfile()
- initializeVarsForPhone()
- inv = newScalableInvariantDeviceProfile().apply {
- deviceType = InvariantDeviceProfile.TYPE_PHONE
- }
-
- val dp = newDP()
-
- assertThat(dp.isVerticalBarLayout).isEqualTo(false)
- assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(364)
- assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2185)
- }
-}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
new file mode 100644
index 0000000..3f8d2fb
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for tablet in landscape with 3-Button navigation.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTabletLandscape3ButtonTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isLandscape = true, isGestureMode = false)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(227)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(294)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(558)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(294)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(57)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(57)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(59)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(59)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(59)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(227)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(294)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(48)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1600)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(199)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(50)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(351)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(227)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(57)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(57)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(1244)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(228)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(5)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(32)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(true)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1237)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(78)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(19)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(19)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(93)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.7736843f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7363184f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(1407)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(2522)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1244)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(109)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(1443)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(-7)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(428)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
new file mode 100644
index 0000000..456ed2c
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for tablet in landscape.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTabletLandscapeTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isLandscape = true)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(227)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(294)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(558)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(294)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(57)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(57)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(59)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(59)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(59)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(227)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(294)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(48)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1600)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(199)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(50)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(351)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(227)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(57)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(57)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(1244)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(228)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(503)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(true)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(-503)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(78)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(19)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(19)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(93)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.7736843f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7363184f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(1407)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(2522)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1244)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(109)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(301)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(-7)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(301)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
new file mode 100644
index 0000000..b53b36a
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for tablet in portrait with 3-Button navigation.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTabletPortrait3ButtonTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isGestureMode = false)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(294)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(382)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(294)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(482)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(74)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(74)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(72)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(72)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(72)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(294)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(382)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(77)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1960)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(257)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(64)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(456)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(294)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(74)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(74)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(781)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(386)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(32)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1216)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(101)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(29)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(29)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(238)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(2.2988505f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.6741674f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(2222)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(1542)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(272)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(528)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(528)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
new file mode 100644
index 0000000..4be3e45
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for tablet in portrait.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTabletPortraitTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet()
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(294)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(382)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(294)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(482)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(74)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(74)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(72)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(72)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(72)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(294)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(382)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(77)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1960)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(257)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(64)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(456)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(294)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(74)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(74)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(781)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(386)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(256)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1216)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(101)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(29)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(29)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(238)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(2.2988505f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.6741674f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(2222)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(1542)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(272)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(192)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(192)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
new file mode 100644
index 0000000..274ca95
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for two panel in landscape with 3-Button navigation.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTwoPanelLandscape3ButtonTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isLandscape = true, isTwoPanel = true, isGestureMode = false)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(200)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(260)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(259)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(260)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(50)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(50)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(25)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(25)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(25)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(200)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(260)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(36)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1600)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(175)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(44)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(310)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(200)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(50)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(50)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(1241)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(386)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(32)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1039)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(68)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(43)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(43)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(285)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.5657895f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7226337f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(1215)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(1237)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(2)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1086)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(272)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(864)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(864)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
new file mode 100644
index 0000000..ba3ef55
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for two panel in landscape.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTwoPanelLandscapeTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isLandscape = true, isTwoPanel = true)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(200)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(260)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(259)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(260)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(50)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(50)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(25)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(25)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(25)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(200)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(260)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(36)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1600)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(175)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(44)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(310)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(200)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(50)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(50)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(1241)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(386)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(73)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(1039)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(68)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(43)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(43)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(285)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.5657895f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7226337f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(1215)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(1237)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(2)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1086)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(272)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(761)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(761)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
new file mode 100644
index 0000000..7dd95f9
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for two panel in portrait with 3-Button navigation.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTwoPanelPortrait3ButtonTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isTwoPanel = true, isGestureMode = false)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(153)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(199)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(153)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(509)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(19)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(19)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(19)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(153)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(199)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(16)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1960)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(134)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(34)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(237)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(153)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(38)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(38)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(763)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(386)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(32)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(685)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(52)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(33)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(33)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(291)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.1976048f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.69064087f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(2169)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(767)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(2)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(272)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(340)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(428)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
new file mode 100644
index 0000000..0c5968e
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for two panel in portrait.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTwoPanelPortraitTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForTablet(isTwoPanel = true)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isTrue()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(153)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(199)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(153)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(509)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(38)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(19)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(19)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(19)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(153)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(199)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(112)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(28)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(16)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1960)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(600)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(134)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(34)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(237)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(153)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(38)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(38)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(763)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(386)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(126)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(2)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(685)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(true)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(120)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(52)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(33)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(33)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(291)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.1976048f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(96)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(88)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(40)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(128)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.69064087f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(2169)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(767)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(2)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(false)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(272)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(112)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(459)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(459)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
new file mode 100644
index 0000000..2bad6bb
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for landscape phone with vertical bar and 3-Button navigation.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileVerticalBar3ButtonTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForPhone(isVerticalBar = true, isGestureMode = false)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isFalse()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(210)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(221)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(675)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(321)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(70)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(70)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(53)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(0)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(260)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(304)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(53)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1050)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(28)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(422)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(252)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(56)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(56)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(336)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(84)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(221)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(158)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(0)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(2221)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(false)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(0)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(14)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(266)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(0)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.0f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(42)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(-112)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(21)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(126)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(21)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.8880597f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(1340)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(2840)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(true)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(168)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1358)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(147)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(225)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(56)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(84)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(165)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
new file mode 100644
index 0000000..6256a43
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile for landscape phone with vertical bar.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileVerticalBarTest : DeviceProfileBaseTest() {
+
+ lateinit var dp: DeviceProfile
+
+ @Before
+ fun before() {
+ initializeVarsForPhone(isVerticalBar = true)
+ dp = newDP()
+ }
+
+ @Test
+ fun isScalableGrid() {
+ assertThat(dp.isScalableGrid).isFalse()
+ }
+
+ @Test
+ fun cellWidthPx() {
+ assertThat(dp.cellWidthPx).isEqualTo(210)
+ }
+
+ @Test
+ fun cellHeightPx() {
+ assertThat(dp.cellHeightPx).isEqualTo(221)
+ }
+
+ @Test
+ fun getCellSizeX() {
+ assertThat(dp.cellSize.x).isEqualTo(675)
+ }
+
+ @Test
+ fun getCellSizeY() {
+ assertThat(dp.cellSize.y).isEqualTo(321)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxX() {
+ assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutBorderSpacePxY() {
+ assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxLeft() {
+ assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(70)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxTop() {
+ assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxRight() {
+ assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(70)
+ }
+
+ @Test
+ fun cellLayoutPaddingPxBottom() {
+ assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(53)
+ }
+
+ @Test
+ fun iconSizePx() {
+ assertThat(dp.iconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun iconTextSizePx() {
+ assertThat(dp.iconTextSizePx).isEqualTo(0)
+ }
+
+ @Test
+ fun iconDrawablePaddingPx() {
+ assertThat(dp.iconDrawablePaddingPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellWidthPx() {
+ assertThat(dp.folderCellWidthPx).isEqualTo(260)
+ }
+
+ @Test
+ fun folderCellHeightPx() {
+ assertThat(dp.folderCellHeightPx).isEqualTo(304)
+ }
+
+ @Test
+ fun folderChildIconSizePx() {
+ assertThat(dp.folderChildIconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun folderChildTextSizePx() {
+ assertThat(dp.folderChildTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun folderChildDrawablePaddingPx() {
+ assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(14)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpaceOriginalPx() {
+ assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxX() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
+ }
+
+ @Test
+ fun folderCellLayoutBorderSpacePxY() {
+ assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
+ }
+
+ @Test
+ fun bottomSheetTopPadding() {
+ assertThat(dp.bottomSheetTopPadding).isEqualTo(53)
+ }
+
+ @Test
+ fun allAppsShiftRange() {
+ assertThat(dp.allAppsShiftRange).isEqualTo(1050)
+ }
+
+ @Test
+ fun allAppsTopPadding() {
+ assertThat(dp.allAppsTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsIconSizePx() {
+ assertThat(dp.allAppsIconSizePx).isEqualTo(196)
+ }
+
+ @Test
+ fun allAppsIconTextSizePx() {
+ assertThat(dp.allAppsIconTextSizePx).isEqualTo(49)
+ }
+
+ @Test
+ fun allAppsIconDrawablePaddingPx() {
+ assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(28)
+ }
+
+ @Test
+ fun allAppsCellHeightPx() {
+ assertThat(dp.allAppsCellHeightPx).isEqualTo(422)
+ }
+
+ @Test
+ fun allAppsCellWidthPx() {
+ assertThat(dp.allAppsCellWidthPx).isEqualTo(252)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxX() {
+ assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(56)
+ }
+
+ @Test
+ fun allAppsBorderSpacePxY() {
+ assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(56)
+ }
+
+ @Test
+ fun numShownAllAppsColumns() {
+ assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightPadding() {
+ assertThat(dp.allAppsLeftRightPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun allAppsLeftRightMargin() {
+ assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun hotseatBarSizePx() {
+ assertThat(dp.hotseatBarSizePx).isEqualTo(336)
+ }
+
+ @Test
+ fun hotseatCellHeightPx() {
+ assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
+ }
+
+ @Test
+ fun hotseatBarBottomSpacePx() {
+ assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingStartPx() {
+ assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(84)
+ }
+
+ @Test
+ fun hotseatBarSidePaddingEndPx() {
+ assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(56)
+ }
+
+ @Test
+ fun hotseatQsbSpace() {
+ assertThat(dp.hotseatQsbSpace).isEqualTo(126)
+ }
+
+ @Test
+ fun hotseatQsbHeight() {
+ assertThat(dp.hotseatQsbHeight).isEqualTo(221)
+ }
+
+ @Test
+ fun springLoadedHotseatBarTopMarginPx() {
+ assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(158)
+ }
+
+ @Test
+ fun numShownHotseatIcons() {
+ assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+ }
+
+ @Test
+ fun hotseatBorderSpace() {
+ assertThat(dp.hotseatBorderSpace).isEqualTo(0)
+ }
+
+ @Test
+ fun isQsbInline() {
+ assertThat(dp.isQsbInline).isEqualTo(false)
+ }
+
+ @Test
+ fun qsbWidth() {
+ assertThat(dp.qsbWidth).isEqualTo(2221)
+ }
+
+ @Test
+ fun isTaskbarPresent() {
+ assertThat(dp.isTaskbarPresent).isEqualTo(false)
+ }
+
+ @Test
+ fun isTaskbarPresentInApps() {
+ assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
+ }
+
+ @Test
+ fun taskbarSize() {
+ assertThat(dp.taskbarSize).isEqualTo(0)
+ }
+
+ @Test
+ fun desiredWorkspaceHorizontalMarginPx() {
+ assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingLeft() {
+ assertThat(dp.workspacePadding.left).isEqualTo(14)
+ }
+
+ @Test
+ fun workspacePaddingTop() {
+ assertThat(dp.workspacePadding.top).isEqualTo(0)
+ }
+
+ @Test
+ fun workspacePaddingRight() {
+ assertThat(dp.workspacePadding.right).isEqualTo(266)
+ }
+
+ @Test
+ fun workspacePaddingBottom() {
+ assertThat(dp.workspacePadding.bottom).isEqualTo(0)
+ }
+
+ @Test
+ fun iconScale() {
+ assertThat(dp.iconScale).isEqualTo(1)
+ }
+
+ @Test
+ fun cellScaleToFit() {
+ assertThat(dp.cellScaleToFit).isEqualTo(1.0f)
+ }
+
+ @Test
+ fun workspaceTopPadding() {
+ assertThat(dp.workspaceTopPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun workspaceBottomPadding() {
+ assertThat(dp.workspaceBottomPadding).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskMarginPx() {
+ assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewTaskMarginGridPx() {
+ assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskIconSizePx() {
+ assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizePx() {
+ assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
+ }
+
+ @Test
+ fun overviewTaskIconDrawableSizeGridPx() {
+ assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
+ }
+
+ @Test
+ fun overviewTaskThumbnailTopMarginPx() {
+ assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
+ }
+
+ @Test
+ fun overviewActionsTopMarginPx() {
+ assertThat(dp.overviewActionsTopMarginPx).isEqualTo(42)
+ }
+
+ @Test
+ fun overviewActionsHeight() {
+ assertThat(dp.overviewActionsHeight).isEqualTo(168)
+ }
+
+ @Test
+ fun overviewActionsButtonSpacing() {
+ assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
+ }
+
+ @Test
+ fun overviewPageSpacing() {
+ assertThat(dp.overviewPageSpacing).isEqualTo(56)
+ }
+
+ @Test
+ fun overviewRowSpacing() {
+ assertThat(dp.overviewRowSpacing).isEqualTo(-112)
+ }
+
+ @Test
+ fun overviewGridSideMargin() {
+ assertThat(dp.overviewGridSideMargin).isEqualTo(0)
+ }
+
+ @Test
+ fun dropTargetBarTopMarginPx() {
+ assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(21)
+ }
+
+ @Test
+ fun dropTargetBarSizePx() {
+ assertThat(dp.dropTargetBarSizePx).isEqualTo(126)
+ }
+
+ @Test
+ fun dropTargetBarBottomMarginPx() {
+ assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(21)
+ }
+
+ @Test
+ fun workspaceSpringLoadedMinNextPageVisiblePx() {
+ assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
+ }
+
+ @Test
+ fun getWorkspaceSpringLoadScale() {
+ assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.8880597f)
+ }
+
+ @Test
+ fun getCellLayoutHeight() {
+ assertThat(dp.cellLayoutHeight).isEqualTo(1340)
+ }
+
+ @Test
+ fun getCellLayoutWidth() {
+ assertThat(dp.cellLayoutWidth).isEqualTo(2840)
+ }
+
+ @Test
+ fun getPanelCount() {
+ assertThat(dp.panelCount).isEqualTo(1)
+ }
+
+ @Test
+ fun isVerticalBarLayout() {
+ assertThat(dp.isVerticalBarLayout).isEqualTo(true)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkTop() {
+ assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(168)
+ }
+
+ @Test
+ fun getCellLayoutSpringLoadShrunkBottom() {
+ assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1358)
+ }
+
+ @Test
+ fun getQsbOffsetY() {
+ assertThat(dp.qsbOffsetY).isEqualTo(147)
+ }
+
+ @Test
+ fun getTaskbarOffsetY() {
+ assertThat(dp.taskbarOffsetY).isEqualTo(225)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingLeft() {
+ assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(56)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingTop() {
+ assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingRight() {
+ assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(84)
+ }
+
+ @Test
+ fun getHotseatLayoutPaddingBottom() {
+ assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(165)
+ }
+
+ @Test
+ fun hotseatBarEndOffset() {
+ assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+ }
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/TaskThumbnailViewTest.kt b/quickstep/tests/src/com/android/quickstep/TaskThumbnailViewTest.kt
new file mode 100644
index 0000000..cf3c8c9
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/TaskThumbnailViewTest.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import android.graphics.Rect
+import android.graphics.RectF
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfileBaseTest
+import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper
+import com.android.systemui.shared.recents.model.ThumbnailData
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+
+/**
+ * Test for TaskThumbnailView class.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class TaskThumbnailViewTest : DeviceProfileBaseTest() {
+
+ private var mThumbnailData: ThumbnailData = mock(ThumbnailData::class.java)
+
+ private val mPreviewPositionHelper = PreviewPositionHelper()
+
+ @Test
+ fun getInsetsToDrawInFullscreen_clipTaskbarSizeFromBottomForTablets() {
+ initializeVarsForTablet()
+ val dp = newDP()
+ val previewRect = Rect(0, 0, 100, 100)
+ val canvasWidth = dp.widthPx / 2
+ val canvasHeight = dp.heightPx / 2
+ val currentRotation = 0
+ val isRtl = false
+
+ mPreviewPositionHelper.updateThumbnailMatrix(previewRect, mThumbnailData, canvasWidth,
+ canvasHeight, dp, currentRotation, isRtl)
+
+ val expectedClippedInsets = RectF(0f, 0f, 0f, dp.taskbarSize / 2f)
+ assertThat(mPreviewPositionHelper.getInsetsToDrawInFullscreen(dp))
+ .isEqualTo(expectedClippedInsets)
+ }
+
+ @Test
+ fun getInsetsToDrawInFullscreen_doNotClipTaskbarSizeFromBottomForPhones() {
+ initializeVarsForPhone()
+ val dp = newDP()
+ val previewRect = Rect(0, 0, 100, 100)
+ val canvasWidth = dp.widthPx / 2
+ val canvasHeight = dp.heightPx / 2
+ val currentRotation = 0
+ val isRtl = false
+
+ mPreviewPositionHelper.updateThumbnailMatrix(previewRect, mThumbnailData, canvasWidth,
+ canvasHeight, dp, currentRotation, isRtl)
+
+ val expectedClippedInsets = RectF(0f, 0f, 0f, 0f)
+ assertThat(mPreviewPositionHelper.getInsetsToDrawInFullscreen(dp))
+ .isEqualTo(expectedClippedInsets)
+ }
+}
\ No newline at end of file
diff --git a/res/layout/widgets_full_sheet_paged_view.xml b/res/layout/widgets_full_sheet_paged_view.xml
index 24028fa..098c9b0 100644
--- a/res/layout/widgets_full_sheet_paged_view.xml
+++ b/res/layout/widgets_full_sheet_paged_view.xml
@@ -41,7 +41,7 @@
</com.android.launcher3.widget.picker.WidgetPagedView>
<!-- SearchAndRecommendationsView contains the tab layout as well -->
- <com.android.launcher3.widget.picker.SearchAndRecommendationsView
+ <com.android.launcher3.views.StickyHeaderLayout
android:id="@+id/search_and_recommendations_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -68,7 +68,7 @@
android:background="?android:attr/colorBackground"
android:paddingBottom="8dp"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
- android:clipToPadding="false">
+ launcher:layout_sticky="true">
<include layout="@layout/widgets_search_bar" />
</FrameLayout>
@@ -92,7 +92,8 @@
android:paddingLeft="@dimen/widget_tabs_horizontal_padding"
android:paddingRight="@dimen/widget_tabs_horizontal_padding"
android:background="?android:attr/colorBackground"
- style="@style/TextHeadline">
+ style="@style/TextHeadline"
+ launcher:layout_sticky="true">
<Button
android:id="@+id/tab_personal"
@@ -121,5 +122,5 @@
style="?android:attr/borderlessButtonStyle" />
</com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip>
- </com.android.launcher3.widget.picker.SearchAndRecommendationsView>
+ </com.android.launcher3.views.StickyHeaderLayout>
</merge>
\ No newline at end of file
diff --git a/res/layout/widgets_full_sheet_recyclerview.xml b/res/layout/widgets_full_sheet_recyclerview.xml
index f4b5a0a..9da3e87 100644
--- a/res/layout/widgets_full_sheet_recyclerview.xml
+++ b/res/layout/widgets_full_sheet_recyclerview.xml
@@ -13,7 +13,8 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<merge xmlns:android="http://schemas.android.com/apk/res/android">
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:launcher="http://schemas.android.com/apk/res-auto" >
<com.android.launcher3.widget.picker.WidgetsRecyclerView
android:id="@+id/primary_widgets_list_view"
android:layout_below="@id/collapse_handle"
@@ -23,7 +24,7 @@
android:clipToPadding="false" />
<!-- SearchAndRecommendationsView without the tab layout as well -->
- <com.android.launcher3.widget.picker.SearchAndRecommendationsView
+ <com.android.launcher3.views.StickyHeaderLayout
android:id="@+id/search_and_recommendations_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -50,7 +51,8 @@
android:background="?android:attr/colorBackground"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
android:paddingBottom="8dp"
- android:clipToPadding="false">
+ android:clipToPadding="false"
+ launcher:layout_sticky="true" >
<include layout="@layout/widgets_search_bar" />
</FrameLayout>
@@ -63,6 +65,6 @@
android:paddingVertical="@dimen/recommended_widgets_table_vertical_padding"
android:paddingHorizontal="@dimen/widget_list_horizontal_margin"
android:visibility="gone" />
- </com.android.launcher3.widget.picker.SearchAndRecommendationsView>
+ </com.android.launcher3.views.StickyHeaderLayout>
</merge>
\ No newline at end of file
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index af8d8eb..e5b588c 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -136,6 +136,10 @@
<attr name="layout_ignoreInsets" format="boolean" />
</declare-styleable>
+ <declare-styleable name="StickyScroller_Layout">
+ <attr name="layout_sticky" format="boolean" />
+ </declare-styleable>
+
<declare-styleable name="GridDisplayOption">
<attr name="name" format="string" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 5e33de8..d095ae3 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -22,8 +22,6 @@
<dimen name="dynamic_grid_edge_margin">10.77dp</dimen>
<dimen name="dynamic_grid_left_right_margin">8dp</dimen>
<dimen name="dynamic_grid_icon_drawable_padding">7dp</dimen>
- <!-- Minimum space between workspace and hotseat in spring loaded mode -->
- <dimen name="dynamic_grid_min_spring_loaded_space">8dp</dimen>
<!-- Minimum amount of next page visible in spring loaded mode -->
<dimen name="dynamic_grid_spring_loaded_min_next_space_visible">24dp</dimen>
@@ -362,6 +360,9 @@
<dimen name="taskbar_icon_size">44dp</dimen>
<!-- Note that this applies to both sides of all icons, so visible space is double this. -->
<dimen name="taskbar_icon_spacing">8dp</dimen>
+ <dimen name="taskbar_nav_buttons_size">0dp</dimen>
+ <dimen name="taskbar_contextual_button_margin">0dp</dimen>
+ <dimen name="taskbar_hotseat_nav_spacing">0dp</dimen>
<!-- Size of the maximum radius for the enforced rounded rectangles. -->
<dimen name="enforced_rounded_corner_max_radius">16dp</dimen>
@@ -413,4 +414,7 @@
<dimen name="bottom_sheet_handle_height">4dp</dimen>
<dimen name="bottom_sheet_handle_margin">16dp</dimen>
<dimen name="bottom_sheet_handle_corner_radius">2dp</dimen>
+
+ <!-- State transition -->
+ <item name="workspace_content_scale" format="float" type="dimen">0.97</item>
</resources>
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 1bc269d..adf6216 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -107,9 +107,9 @@
public Rect cellLayoutPaddingPx = new Rect();
public final int edgeMarginPx;
- public float workspaceSpringLoadShrunkTop;
- public float workspaceSpringLoadShrunkBottom;
- public final int workspaceSpringLoadedBottomSpace;
+ public final float workspaceContentScale;
+ private float mWorkspaceSpringLoadShrunkTop;
+ private float mWorkspaceSpringLoadShrunkBottom;
public final int workspaceSpringLoadedMinNextPageVisiblePx;
private final int extraSpace;
@@ -158,10 +158,11 @@
// Hotseat
public final int numShownHotseatIcons;
public int hotseatCellHeightPx;
- private final boolean areNavButtonsInline;
+ public final boolean areNavButtonsInline;
// In portrait: size = height, in landscape: size = width
public int hotseatBarSizePx;
public int hotseatBarBottomSpacePx;
+ public int hotseatBarEndOffset;
public int hotseatQsbSpace;
public int springLoadedHotseatBarTopMarginPx;
// Start is the side next to the nav bar, end is the side next to the workspace
@@ -298,6 +299,7 @@
}
edgeMarginPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
+ workspaceContentScale = res.getFloat(R.dimen.workspace_content_scale);
desiredWorkspaceHorizontalMarginPx = getHorizontalMarginPx(inv, res);
desiredWorkspaceHorizontalMarginOriginalPx = desiredWorkspaceHorizontalMarginPx;
@@ -349,8 +351,6 @@
dropTargetButtonWorkspaceEdgeGapPx = res.getDimensionPixelSize(
R.dimen.drop_target_button_workspace_edge_gap);
- workspaceSpringLoadedBottomSpace =
- res.getDimensionPixelSize(R.dimen.dynamic_grid_min_spring_loaded_space);
workspaceSpringLoadedMinNextPageVisiblePx = res.getDimensionPixelSize(
R.dimen.dynamic_grid_spring_loaded_min_next_space_visible);
@@ -410,6 +410,18 @@
// 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) {
+ /*
+ * 3 nav buttons +
+ * Little space at the end for contextual buttons +
+ * Little space between icons and nav buttons
+ */
+ hotseatBarEndOffset = 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
+ + res.getDimensionPixelSize(R.dimen.taskbar_contextual_button_margin)
+ + res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing);
+ } else {
+ hotseatBarEndOffset = 0;
+ }
overviewTaskMarginPx = res.getDimensionPixelSize(R.dimen.overview_task_margin);
overviewTaskMarginGridPx = res.getDimensionPixelSize(R.dimen.overview_task_margin_grid);
@@ -916,9 +928,9 @@
* Gets the scaled top of the workspace in px for the spring-loaded edit state.
*/
public float getCellLayoutSpringLoadShrunkTop() {
- workspaceSpringLoadShrunkTop = mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx
+ mWorkspaceSpringLoadShrunkTop = mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx
+ dropTargetBarBottomMarginPx;
- return workspaceSpringLoadShrunkTop;
+ return mWorkspaceSpringLoadShrunkTop;
}
/**
@@ -926,10 +938,10 @@
*/
public float getCellLayoutSpringLoadShrunkBottom() {
int topOfHotseat = hotseatBarSizePx + springLoadedHotseatBarTopMarginPx;
- workspaceSpringLoadShrunkBottom =
+ mWorkspaceSpringLoadShrunkBottom =
heightPx - (isVerticalBarLayout() ? getVerticalHotseatLastItemBottomOffset()
: topOfHotseat);
- return workspaceSpringLoadShrunkBottom;
+ return mWorkspaceSpringLoadShrunkBottom;
}
/**
@@ -1052,8 +1064,7 @@
int requiredWidth = iconSizePx * numShownHotseatIcons
+ hotseatBorderSpace * (numShownHotseatIcons - 1)
+ additionalQsbSpace;
- int endOffset = ApiWrapper.getHotseatEndOffset(context);
- int hotseatWidth = Math.min(requiredWidth, availableWidthPx - endOffset);
+ int hotseatWidth = Math.min(requiredWidth, availableWidthPx - hotseatBarEndOffset);
int sideSpacing = (availableWidthPx - hotseatWidth) / 2;
mHotseatBarPadding.set(sideSpacing, hotseatBarTopPadding, sideSpacing,
@@ -1066,10 +1077,10 @@
mHotseatBarPadding.left += additionalQsbSpace;
}
- if (endOffset > sideSpacing) {
+ if (hotseatBarEndOffset > sideSpacing) {
int diff = isRtl
- ? sideSpacing - endOffset
- : endOffset - sideSpacing;
+ ? sideSpacing - hotseatBarEndOffset
+ : hotseatBarEndOffset - sideSpacing;
mHotseatBarPadding.left -= diff;
mHotseatBarPadding.right += diff;
}
@@ -1233,6 +1244,7 @@
return "\t" + name + ": " + value + "px (" + dpiFromPx(value, mMetrics.densityDpi) + "dp)";
}
+ // LINT.IfChange
public void dump(String prefix, PrintWriter writer) {
writer.println(prefix + "DeviceProfile:");
writer.println(prefix + "\t1 dp = " + mMetrics.density + " px");
@@ -1312,7 +1324,8 @@
allAppsIconDrawablePaddingPx));
writer.println(prefix + pxToDpStr("allAppsCellHeightPx", allAppsCellHeightPx));
writer.println(prefix + pxToDpStr("allAppsCellWidthPx", allAppsCellWidthPx));
- writer.println(prefix + pxToDpStr("allAppsBorderSpacePx", allAppsBorderSpacePx.x));
+ writer.println(prefix + pxToDpStr("allAppsBorderSpacePxX", allAppsBorderSpacePx.x));
+ writer.println(prefix + pxToDpStr("allAppsBorderSpacePxY", allAppsBorderSpacePx.y));
writer.println(prefix + "\tnumShownAllAppsColumns: " + numShownAllAppsColumns);
writer.println(prefix + pxToDpStr("allAppsLeftRightPadding", allAppsLeftRightPadding));
writer.println(prefix + pxToDpStr("allAppsLeftRightMargin", allAppsLeftRightMargin));
@@ -1320,11 +1333,12 @@
writer.println(prefix + pxToDpStr("hotseatBarSizePx", hotseatBarSizePx));
writer.println(prefix + "\tinv.hotseatColumnSpan: " + inv.hotseatColumnSpan[mTypeIndex]);
writer.println(prefix + pxToDpStr("hotseatCellHeightPx", hotseatCellHeightPx));
- writer.println(prefix + pxToDpStr("hotseatBarBottomPaddingPx", hotseatBarBottomSpacePx));
+ writer.println(prefix + pxToDpStr("hotseatBarBottomSpacePx", hotseatBarBottomSpacePx));
writer.println(prefix + pxToDpStr("hotseatBarSidePaddingStartPx",
hotseatBarSidePaddingStartPx));
writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx",
hotseatBarSidePaddingEndPx));
+ writer.println(prefix + pxToDpStr("hotseatBarEndOffset", hotseatBarEndOffset));
writer.println(prefix + pxToDpStr("hotseatQsbSpace", hotseatQsbSpace));
writer.println(prefix + pxToDpStr("hotseatQsbHeight", hotseatQsbHeight));
writer.println(prefix + pxToDpStr("springLoadedHotseatBarTopMarginPx",
@@ -1387,11 +1401,9 @@
prefix + pxToDpStr("dropTargetBarBottomMarginPx", dropTargetBarBottomMarginPx));
writer.println(
- prefix + pxToDpStr("workspaceSpringLoadShrunkTop", workspaceSpringLoadShrunkTop));
+ prefix + pxToDpStr("workspaceSpringLoadShrunkTop", mWorkspaceSpringLoadShrunkTop));
writer.println(prefix + pxToDpStr("workspaceSpringLoadShrunkBottom",
- workspaceSpringLoadShrunkBottom));
- writer.println(prefix + pxToDpStr("workspaceSpringLoadedBottomSpace",
- workspaceSpringLoadedBottomSpace));
+ mWorkspaceSpringLoadShrunkBottom));
writer.println(prefix + pxToDpStr("workspaceSpringLoadedMinNextPageVisiblePx",
workspaceSpringLoadedMinNextPageVisiblePx));
writer.println(
@@ -1399,6 +1411,19 @@
writer.println(prefix + pxToDpStr("getCellLayoutHeight()", getCellLayoutHeight()));
writer.println(prefix + pxToDpStr("getCellLayoutWidth()", getCellLayoutWidth()));
}
+ // LINT.ThenChange(
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt,
+ // packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt)
private static Context getContext(Context c, Info info, int orientation, WindowBounds bounds) {
Configuration config = new Configuration(c.getResources().getConfiguration());
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 5081f4f..9c62251 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -30,7 +30,10 @@
import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
import static com.android.launcher3.AbstractFloatingView.TYPE_SNACKBAR;
import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType;
+import static com.android.launcher3.LauncherAnimUtils.HOTSEAT_SCALE_PROPERTY_FACTORY;
+import static com.android.launcher3.LauncherAnimUtils.SCALE_INDEX_WIDGET_TRANSITION;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
+import static com.android.launcher3.LauncherAnimUtils.WORKSPACE_SCALE_PROPERTY_FACTORY;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.FLAG_MULTI_PAGE;
@@ -96,6 +99,7 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.method.TextKeyListener;
+import android.util.FloatProperty;
import android.util.Log;
import android.util.SparseArray;
import android.view.KeyEvent;
@@ -194,6 +198,7 @@
import com.android.launcher3.util.TouchController;
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.util.UiThreadHelper;
+import com.android.launcher3.util.ViewCapture;
import com.android.launcher3.util.ViewOnDrawExecutor;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.FloatingIconView;
@@ -301,6 +306,11 @@
public static final int DISPLAY_WORKSPACE_TRACE_COOKIE = 0;
public static final int DISPLAY_ALL_APPS_TRACE_COOKIE = 1;
+ private static final FloatProperty<Workspace<?>> WORKSPACE_WIDGET_SCALE =
+ WORKSPACE_SCALE_PROPERTY_FACTORY.get(SCALE_INDEX_WIDGET_TRANSITION);
+ private static final FloatProperty<Hotseat> HOTSEAT_WIDGET_SCALE =
+ HOTSEAT_SCALE_PROPERTY_FACTORY.get(SCALE_INDEX_WIDGET_TRANSITION);
+
private Configuration mOldConfig;
@Thunk
@@ -388,6 +398,7 @@
private LauncherState mPrevLauncherState;
private StringCache mStringCache;
+ private ViewCapture mViewCapture;
@Override
@TargetApi(Build.VERSION_CODES.S)
@@ -1478,6 +1489,14 @@
public void onAttachedToWindow() {
super.onAttachedToWindow();
mOverlayManager.onAttachedToWindow();
+ if (FeatureFlags.CONTINUOUS_VIEW_TREE_CAPTURE.get()) {
+ View root = getDragLayer().getRootView();
+ if (mViewCapture != null) {
+ root.getViewTreeObserver().removeOnDrawListener(mViewCapture);
+ }
+ mViewCapture = new ViewCapture(root);
+ root.getViewTreeObserver().addOnDrawListener(mViewCapture);
+ }
}
@Override
@@ -2997,6 +3016,10 @@
writer.println(prefix + "\tmRotationHelper: " + mRotationHelper);
writer.println(prefix + "\tmAppWidgetHost.isListening: " + mAppWidgetHost.isListening());
+ if (mViewCapture != null) {
+ writer.println(prefix + "\tmViewCapture: " + mViewCapture.dumpToString());
+ }
+
// Extra logging for general debugging
mDragLayer.dump(prefix, writer);
mStateManager.dump(prefix, writer);
@@ -3225,7 +3248,12 @@
* @param progress Transition progress from 0 to 1; where 0 => home and 1 => widgets.
*/
public void onWidgetsTransition(float progress) {
- // No-Op
+ if (mDeviceProfile.isTablet) {
+ float scale =
+ Utilities.comp(Utilities.comp(mDeviceProfile.workspaceContentScale) * progress);
+ WORKSPACE_WIDGET_SCALE.set(getWorkspace(), scale);
+ HOTSEAT_WIDGET_SCALE.set(getHotseat(), scale);
+ }
}
private static class NonConfigInstance {
diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java
index 0c7c311..b858d1a 100644
--- a/src/com/android/launcher3/LauncherAnimUtils.java
+++ b/src/com/android/launcher3/LauncherAnimUtils.java
@@ -81,9 +81,9 @@
new MultiScalePropertyFactory<Hotseat>("hotseat_scale_property");
public static final int SCALE_INDEX_UNFOLD_ANIMATION = 1;
- public static final int SCALE_INDEX_UNLOCK_ANIMATION = 2;
- public static final int SCALE_INDEX_WORKSPACE_STATE = 3;
- public static final int SCALE_INDEX_REVEAL_ANIM = 4;
+ public static final int SCALE_INDEX_WORKSPACE_STATE = 2;
+ public static final int SCALE_INDEX_REVEAL_ANIM = 3;
+ public static final int SCALE_INDEX_WIDGET_TRANSITION = 4;
/** Increase the duration if we prevented the fling, as we are going against a high velocity. */
public static int blockedFlingDurationFactor(float velocity) {
diff --git a/src/com/android/launcher3/allapps/WorkEduCard.java b/src/com/android/launcher3/allapps/WorkEduCard.java
index 4feeabb..539cff1 100644
--- a/src/com/android/launcher3/allapps/WorkEduCard.java
+++ b/src/com/android/launcher3/allapps/WorkEduCard.java
@@ -15,6 +15,8 @@
*/
package com.android.launcher3.allapps;
+import static com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.getTabWidth;
+
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
@@ -85,14 +87,10 @@
}
@Override
- public void onAnimationRepeat(Animation animation) {
-
- }
+ public void onAnimationRepeat(Animation animation) { }
@Override
- public void onAnimationStart(Animation animation) {
-
- }
+ public void onAnimationStart(Animation animation) { }
private void removeCard() {
if (mPosition == -1) {
@@ -105,8 +103,14 @@
}
}
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int size = MeasureSpec.getSize(widthMeasureSpec);
+ findViewById(R.id.wrapper).getLayoutParams().width = getTabWidth(getContext(), size);
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
public void setPosition(int position) {
mPosition = position;
}
-
}
diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java
index bd24b77..aee7c4c 100644
--- a/src/com/android/launcher3/allapps/WorkModeSwitch.java
+++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java
@@ -16,6 +16,7 @@
package com.android.launcher3.allapps;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TURN_OFF_WORK_APPS_TAP;
+import static com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.getTabWidth;
import android.content.Context;
import android.graphics.Insets;
@@ -96,7 +97,6 @@
}
DeviceProfile dp = ActivityContext.lookupContext(getContext()).getDeviceProfile();
- lp.rightMargin = lp.leftMargin = dp.allAppsLeftRightPadding;
if (!dp.isGestureMode) {
if (dp.isTaskbarPresent) {
bottomMargin += dp.taskbarSize;
@@ -110,6 +110,18 @@
}
@Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ DeviceProfile dp = ActivityContext.lookupContext(getContext()).getDeviceProfile();
+ View parent = (View) getParent();
+ int size = parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight()
+ - 2 * dp.allAppsLeftRightPadding;
+ int tabWidth = getTabWidth(getContext(), size);
+ int shift = (size - tabWidth) / 2 + dp.allAppsLeftRightPadding;
+ setTranslationX(Utilities.isRtl(getResources()) ? shift : -shift);
+ }
+
+ @Override
public void onActivePageChanged(int page) {
mOnWorkTab = page == ActivityAllAppsContainerView.AdapterHolder.WORK;
updateVisibility();
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index b7f3dad..4fd13b2 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -285,6 +285,9 @@
"USE_SEARCH_REQUEST_TIMEOUT_OVERRIDES", false,
"Use local overrides for search request timeout");
+ public static final BooleanFlag CONTINUOUS_VIEW_TREE_CAPTURE = getDebugFlag(
+ "CONTINUOUS_VIEW_TREE_CAPTURE", false, "Capture View tree every frame");
+
public static void initialize(Context context) {
synchronized (sDebugFlags) {
for (DebugFlag flag : sDebugFlags) {
diff --git a/src/com/android/launcher3/testing/TestInformationHandler.java b/src/com/android/launcher3/testing/TestInformationHandler.java
index 7f444d6..0334b96 100644
--- a/src/com/android/launcher3/testing/TestInformationHandler.java
+++ b/src/com/android/launcher3/testing/TestInformationHandler.java
@@ -206,7 +206,7 @@
/* spanX= */ 1, /* spanY= */ 1);
// TODO(b/234322284): return the real center point.
return new Point(cellRect.left + (cellRect.right - cellRect.left) / 3,
- cellRect.centerY());
+ cellRect.top + (cellRect.bottom - cellRect.top) / 3);
});
}
diff --git a/src/com/android/launcher3/util/ViewCapture.java b/src/com/android/launcher3/util/ViewCapture.java
new file mode 100644
index 0000000..140971b
--- /dev/null
+++ b/src/com/android/launcher3/util/ViewCapture.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.util;
+
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.os.Trace;
+import android.util.Base64;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver.OnDrawListener;
+
+import androidx.annotation.UiThread;
+
+import com.android.launcher3.view.ViewCaptureData.ExportedData;
+import com.android.launcher3.view.ViewCaptureData.FrameData;
+import com.android.launcher3.view.ViewCaptureData.ViewNode;
+
+import java.util.concurrent.FutureTask;
+
+/**
+ * Utility class for capturing view data every frame
+ */
+public class ViewCapture implements OnDrawListener {
+
+ private static final String TAG = "ViewCapture";
+
+ private static final int MEMORY_SIZE = 2000;
+
+ private final View mRoot;
+ private final long[] mFrameTimes = new long[MEMORY_SIZE];
+ private final Node[] mNodes = new Node[MEMORY_SIZE];
+
+ private int mFrameIndex = -1;
+
+ /**
+ * @param root the root view for the capture data
+ */
+ public ViewCapture(View root) {
+ mRoot = root;
+ }
+
+ @Override
+ public void onDraw() {
+ Trace.beginSection("view_capture");
+ long now = SystemClock.elapsedRealtimeNanos();
+
+ mFrameIndex++;
+ if (mFrameIndex >= MEMORY_SIZE) {
+ mFrameIndex = 0;
+ }
+ mFrameTimes[mFrameIndex] = now;
+ mNodes[mFrameIndex] = captureView(mRoot, mNodes[mFrameIndex]);
+ Trace.endSection();
+ }
+
+ /**
+ * Creates a proto of all the data captured so far.
+ */
+ public String dumpToString() {
+ Handler handler = mRoot.getHandler();
+ if (handler == null) {
+ handler = Executors.MAIN_EXECUTOR.getHandler();
+ }
+ FutureTask<ExportedData> task = new FutureTask<>(this::dumpToProtoUI);
+ if (Looper.myLooper() == handler.getLooper()) {
+ task.run();
+ } else {
+ handler.post(task);
+ }
+ try {
+ return Base64.encodeToString(task.get().toByteArray(),
+ Base64.NO_CLOSE | Base64.NO_PADDING | Base64.NO_WRAP);
+ } catch (Exception e) {
+ Log.e(TAG, "Error capturing proto", e);
+ return "--error--";
+ }
+ }
+
+ @UiThread
+ private ExportedData dumpToProtoUI() {
+ ExportedData.Builder dataBuilder = ExportedData.newBuilder();
+ Resources res = mRoot.getResources();
+
+ int size = (mNodes[MEMORY_SIZE - 1] == null) ? mFrameIndex + 1 : MEMORY_SIZE;
+ for (int i = size - 1; i >= 0; i--) {
+ int index = (MEMORY_SIZE + mFrameIndex - i) % MEMORY_SIZE;
+ dataBuilder.addFrameData(FrameData.newBuilder()
+ .setNode(mNodes[index].toProto(res))
+ .setTimestamp(mFrameTimes[index]));
+ }
+ return dataBuilder.build();
+ }
+
+ private Node captureView(View view, Node recycle) {
+ Node result = recycle == null ? new Node() : recycle;
+
+ result.clazz = view.getClass();
+ result.hashCode = view.hashCode();
+ result.id = view.getId();
+ result.left = view.getLeft();
+ result.top = view.getTop();
+ result.right = view.getRight();
+ result.bottom = view.getBottom();
+ result.scrollX = view.getScrollX();
+ result.scrollY = view.getScrollY();
+
+ result.translateX = view.getTranslationX();
+ result.translateY = view.getTranslationY();
+ result.scaleX = view.getScaleX();
+ result.scaleY = view.getScaleY();
+ result.alpha = view.getAlpha();
+
+ result.visibility = view.getVisibility();
+ result.willNotDraw = view.willNotDraw();
+
+ if (view instanceof ViewGroup) {
+ ViewGroup parent = (ViewGroup) view;
+ result.clipChildren = parent.getClipChildren();
+ int childCount = parent.getChildCount();
+ if (childCount == 0) {
+ result.children = null;
+ } else {
+ result.children = captureView(parent.getChildAt(0), result.children);
+ Node lastChild = result.children;
+ for (int i = 1; i < childCount; i++) {
+ lastChild.sibling = captureView(parent.getChildAt(i), lastChild.sibling);
+ lastChild = lastChild.sibling;
+ }
+ lastChild.sibling = null;
+ }
+ } else {
+ result.clipChildren = false;
+ result.children = null;
+ }
+ return result;
+ }
+
+ private static class Node {
+
+ // We store reference in memory to avoid generating and storing too many strings
+ public Class clazz;
+ public int hashCode;
+
+ public int id;
+ public int left, top, right, bottom;
+ public int scrollX, scrollY;
+
+ public float translateX, translateY;
+ public float scaleX, scaleY;
+ public float alpha;
+
+ public int visibility;
+ public boolean willNotDraw;
+ public boolean clipChildren;
+
+ public Node sibling;
+ public Node children;
+
+ public ViewNode toProto(Resources res) {
+ String resolvedId;
+ if (id >= 0) {
+ try {
+ resolvedId = res.getResourceTypeName(id) + '/' + res.getResourceEntryName(id);
+ } catch (Resources.NotFoundException e) {
+ resolvedId = "id/" + "0x" + Integer.toHexString(id).toUpperCase();
+ }
+ } else {
+ resolvedId = "NO_ID";
+ }
+
+ ViewNode.Builder result = ViewNode.newBuilder()
+ .setClassname(clazz.getName() + "@" + hashCode)
+ .setId(resolvedId)
+ .setLeft(left)
+ .setTop(top)
+ .setWidth(right - left)
+ .setHeight(bottom - top)
+ .setTranslationX(translateX)
+ .setTranslationY(translateY)
+ .setScaleX(scaleX)
+ .setScaleY(scaleY)
+ .setAlpha(alpha)
+ .setVisibility(visibility)
+ .setWillNotDraw(willNotDraw)
+ .setClipChildren(clipChildren);
+ Node child = children;
+ while (child != null) {
+ result.addChildren(child.toProto(res));
+ child = child.sibling;
+ }
+ return result.build();
+ }
+
+ }
+}
diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java
index f553fb4..800b1f6 100644
--- a/src/com/android/launcher3/views/BaseDragLayer.java
+++ b/src/com/android/launcher3/views/BaseDragLayer.java
@@ -22,13 +22,11 @@
import static com.android.launcher3.util.window.RefreshRateTracker.getSingleFrameMs;
-import android.annotation.TargetApi;
import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.Insets;
import android.graphics.Rect;
import android.graphics.RectF;
-import android.os.Build;
import android.util.AttributeSet;
import android.util.Property;
import android.view.MotionEvent;
@@ -550,18 +548,24 @@
}
@Override
- @TargetApi(Build.VERSION_CODES.Q)
public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) {
if (Utilities.ATLEAST_Q) {
Insets gestureInsets = insets.getMandatorySystemGestureInsets();
int gestureInsetBottom = gestureInsets.bottom;
+ Insets imeInset = Utilities.ATLEAST_R
+ ? insets.getInsets(WindowInsets.Type.ime())
+ : Insets.NONE;
DeviceProfile dp = mActivity.getDeviceProfile();
if (dp.isTaskbarPresent) {
// Ignore taskbar gesture insets to avoid interfering with TouchControllers.
gestureInsetBottom = Math.max(0, gestureInsetBottom - dp.taskbarSize);
}
- mSystemGestureRegion.set(gestureInsets.left, gestureInsets.top,
- gestureInsets.right, gestureInsetBottom);
+ mSystemGestureRegion.set(
+ Math.max(gestureInsets.left, imeInset.left),
+ Math.max(gestureInsets.top, imeInset.top),
+ Math.max(gestureInsets.right, imeInset.right),
+ Math.max(gestureInsetBottom, imeInset.bottom)
+ );
}
return super.dispatchApplyWindowInsets(insets);
}
diff --git a/src/com/android/launcher3/views/StickyHeaderLayout.java b/src/com/android/launcher3/views/StickyHeaderLayout.java
new file mode 100644
index 0000000..d6481a9
--- /dev/null
+++ b/src/com/android/launcher3/views/StickyHeaderLayout.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.views;
+
+import static android.view.View.MeasureSpec.EXACTLY;
+import static android.view.View.MeasureSpec.makeMeasureSpec;
+
+import static com.android.launcher3.anim.AnimatorListeners.forEndCallback;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.util.FloatProperty;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.launcher3.R;
+
+/**
+ * A {@link LinearLayout} container which allows scrolling parts of its content based on the
+ * scroll of a different view. Views which are marked as sticky are not scrolled, giving the
+ * illusion of a sticky header.
+ */
+public class StickyHeaderLayout extends LinearLayout implements
+ RecyclerView.OnChildAttachStateChangeListener {
+
+ private static final FloatProperty<StickyHeaderLayout> SCROLL_OFFSET =
+ new FloatProperty<StickyHeaderLayout>("scrollAnimOffset") {
+ @Override
+ public void setValue(StickyHeaderLayout view, float offset) {
+ view.mScrollOffset = offset;
+ view.updateHeaderScroll();
+ }
+
+ @Override
+ public Float get(StickyHeaderLayout view) {
+ return view.mScrollOffset;
+ }
+ };
+
+ private static final MotionEventProxyMethod INTERCEPT_PROXY = ViewGroup::onInterceptTouchEvent;
+ private static final MotionEventProxyMethod TOUCH_PROXY = ViewGroup::onTouchEvent;
+
+ private RecyclerView mCurrentRecyclerView;
+ private EmptySpaceView mCurrentEmptySpaceView;
+
+ private float mLastScroll = 0;
+ private float mScrollOffset = 0;
+ private Animator mOffsetAnimator;
+
+ private boolean mShouldForwardToRecyclerView = false;
+ private int mHeaderHeight;
+
+ public StickyHeaderLayout(Context context) {
+ this(context, /* attrs= */ null);
+ }
+
+ public StickyHeaderLayout(Context context, AttributeSet attrs) {
+ this(context, attrs, /* defStyleAttr= */ 0);
+ }
+
+ public StickyHeaderLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, /* defStyleRes= */ 0);
+ }
+
+ public StickyHeaderLayout(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ /**
+ * Sets the recycler view, this sticky header should track
+ */
+ public void setCurrentRecyclerView(RecyclerView currentRecyclerView) {
+ boolean animateReset = mCurrentRecyclerView != null;
+ if (mCurrentRecyclerView != null) {
+ mCurrentRecyclerView.removeOnChildAttachStateChangeListener(this);
+ }
+ mCurrentRecyclerView = currentRecyclerView;
+ mCurrentRecyclerView.addOnChildAttachStateChangeListener(this);
+ findCurrentEmptyView();
+ reset(animateReset);
+ }
+
+ public int getHeaderHeight() {
+ return mHeaderHeight;
+ }
+
+ private void updateHeaderScroll() {
+ mLastScroll = getCurrentScroll();
+ int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ View child = getChildAt(i);
+ MyLayoutParams lp = (MyLayoutParams) child.getLayoutParams();
+ child.setTranslationY(Math.max(mLastScroll, lp.scrollLimit));
+ }
+ }
+
+ private float getCurrentScroll() {
+ return mScrollOffset + (mCurrentEmptySpaceView == null ? 0 : mCurrentEmptySpaceView.getY());
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ mHeaderHeight = getMeasuredHeight();
+ if (mCurrentEmptySpaceView != null) {
+ mCurrentEmptySpaceView.setFixedHeight(mHeaderHeight);
+ }
+ }
+
+ /** Resets any previous view translation. */
+ public void reset(boolean animate) {
+ if (mOffsetAnimator != null) {
+ mOffsetAnimator.cancel();
+ mOffsetAnimator = null;
+ }
+
+ mScrollOffset = 0;
+ if (!animate) {
+ updateHeaderScroll();
+ } else {
+ float startValue = mLastScroll - getCurrentScroll();
+ mOffsetAnimator = ObjectAnimator.ofFloat(this, SCROLL_OFFSET, startValue, 0);
+ mOffsetAnimator.addListener(forEndCallback(() -> mOffsetAnimator = null));
+ mOffsetAnimator.start();
+ }
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent event) {
+ return (mShouldForwardToRecyclerView = proxyMotionEvent(event, INTERCEPT_PROXY))
+ || super.onInterceptTouchEvent(event);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ return mShouldForwardToRecyclerView && proxyMotionEvent(event, TOUCH_PROXY)
+ || super.onTouchEvent(event);
+ }
+
+ private boolean proxyMotionEvent(MotionEvent event, MotionEventProxyMethod method) {
+ float dx = mCurrentRecyclerView.getLeft() - getLeft();
+ float dy = mCurrentRecyclerView.getTop() - getTop();
+ event.offsetLocation(dx, dy);
+ try {
+ return method.proxyEvent(mCurrentRecyclerView, event);
+ } finally {
+ event.offsetLocation(-dx, -dy);
+ }
+ }
+
+ @Override
+ public void onChildViewAttachedToWindow(@NonNull View view) {
+ if (view instanceof EmptySpaceView) {
+ findCurrentEmptyView();
+ }
+ }
+
+ @Override
+ public void onChildViewDetachedFromWindow(@NonNull View view) {
+ if (view == mCurrentEmptySpaceView) {
+ findCurrentEmptyView();
+ }
+ }
+
+ private void findCurrentEmptyView() {
+ if (mCurrentEmptySpaceView != null) {
+ mCurrentEmptySpaceView.setOnYChangeCallback(null);
+ mCurrentEmptySpaceView = null;
+ }
+ int childCount = mCurrentRecyclerView.getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View view = mCurrentRecyclerView.getChildAt(i);
+ if (view instanceof EmptySpaceView) {
+ mCurrentEmptySpaceView = (EmptySpaceView) view;
+ mCurrentEmptySpaceView.setFixedHeight(getHeaderHeight());
+ mCurrentEmptySpaceView.setOnYChangeCallback(this::updateHeaderScroll);
+ return;
+ }
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ super.onLayout(changed, l, t, r, b);
+
+ // Update various stick parameters
+ int count = getChildCount();
+ int stickyHeaderHeight = 0;
+ for (int i = 0; i < count; i++) {
+ View v = getChildAt(i);
+ MyLayoutParams lp = (MyLayoutParams) v.getLayoutParams();
+ if (lp.sticky) {
+ lp.scrollLimit = -v.getTop() + stickyHeaderHeight;
+ stickyHeaderHeight += v.getHeight();
+ } else {
+ lp.scrollLimit = Integer.MIN_VALUE;
+ }
+ }
+ updateHeaderScroll();
+ }
+
+ @Override
+ protected LayoutParams generateDefaultLayoutParams() {
+ return new MyLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+ }
+
+ @Override
+ protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
+ return new MyLayoutParams(lp.width, lp.height);
+ }
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new MyLayoutParams(getContext(), attrs);
+ }
+
+ @Override
+ protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+ return p instanceof MyLayoutParams;
+ }
+
+ private static class MyLayoutParams extends LayoutParams {
+
+ public final boolean sticky;
+ public int scrollLimit;
+
+ MyLayoutParams(int width, int height) {
+ super(width, height);
+ sticky = false;
+ }
+
+ MyLayoutParams(Context c, AttributeSet attrs) {
+ super(c, attrs);
+ TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.StickyScroller_Layout);
+ sticky = a.getBoolean(R.styleable.StickyScroller_Layout_layout_sticky, false);
+ a.recycle();
+ }
+ }
+
+ private interface MotionEventProxyMethod {
+
+ boolean proxyEvent(ViewGroup view, MotionEvent event);
+ }
+
+ /**
+ * Empty view which allows listening for 'Y' changes
+ */
+ public static class EmptySpaceView extends View {
+
+ private Runnable mOnYChangeCallback;
+ private int mHeight = 0;
+
+ public EmptySpaceView(Context context) {
+ super(context);
+ animate().setUpdateListener(v -> notifyYChanged());
+ }
+
+ /**
+ * Sets the height for the empty view
+ * @return true if the height changed, false otherwise
+ */
+ public boolean setFixedHeight(int height) {
+ if (mHeight != height) {
+ mHeight = height;
+ requestLayout();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, makeMeasureSpec(mHeight, EXACTLY));
+ }
+
+ public void setOnYChangeCallback(Runnable callback) {
+ mOnYChangeCallback = callback;
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ notifyYChanged();
+ }
+
+ @Override
+ public void offsetTopAndBottom(int offset) {
+ super.offsetTopAndBottom(offset);
+ notifyYChanged();
+ }
+
+ @Override
+ public void setTranslationY(float translationY) {
+ super.setTranslationY(translationY);
+ notifyYChanged();
+ }
+
+ private void notifyYChanged() {
+ if (mOnYChangeCallback != null) {
+ mOnYChangeCallback.run();
+ }
+ }
+ }
+}
diff --git a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java b/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
deleted file mode 100644
index 716dcf3..0000000
--- a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.widget.picker;
-
-import static com.android.launcher3.anim.AnimatorListeners.forEndCallback;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.util.FloatProperty;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.android.launcher3.R;
-import com.android.launcher3.widget.picker.WidgetsSpaceViewHolderBinder.EmptySpaceView;
-import com.android.launcher3.widget.picker.search.WidgetsSearchBar;
-
-/**
- * A controller which measures & updates {@link WidgetsFullSheet}'s views padding, margin and
- * vertical displacement upon scrolling.
- */
-final class SearchAndRecommendationsScrollController implements
- RecyclerView.OnChildAttachStateChangeListener {
-
- private static final FloatProperty<SearchAndRecommendationsScrollController> SCROLL_OFFSET =
- new FloatProperty<SearchAndRecommendationsScrollController>("scrollAnimOffset") {
- @Override
- public void setValue(SearchAndRecommendationsScrollController controller, float offset) {
- controller.mScrollOffset = offset;
- controller.updateHeaderScroll();
- }
-
- @Override
- public Float get(SearchAndRecommendationsScrollController controller) {
- return controller.mScrollOffset;
- }
- };
-
- private static final MotionEventProxyMethod INTERCEPT_PROXY = ViewGroup::onInterceptTouchEvent;
- private static final MotionEventProxyMethod TOUCH_PROXY = ViewGroup::onTouchEvent;
-
- final SearchAndRecommendationsView mContainer;
- final View mSearchBarContainer;
- final WidgetsSearchBar mSearchBar;
- final TextView mHeaderTitle;
- final WidgetsRecommendationTableLayout mRecommendedWidgetsTable;
- @Nullable final View mTabBar;
-
- private WidgetsRecyclerView mCurrentRecyclerView;
- private EmptySpaceView mCurrentEmptySpaceView;
-
- private float mLastScroll = 0;
- private float mScrollOffset = 0;
- private Animator mOffsetAnimator;
-
- private boolean mShouldForwardToRecyclerView = false;
-
- private int mHeaderHeight;
-
- SearchAndRecommendationsScrollController(
- SearchAndRecommendationsView searchAndRecommendationContainer) {
- mContainer = searchAndRecommendationContainer;
- mSearchBarContainer = mContainer.findViewById(R.id.search_bar_container);
- mSearchBar = mContainer.findViewById(R.id.widgets_search_bar);
- mHeaderTitle = mContainer.findViewById(R.id.title);
- mRecommendedWidgetsTable = mContainer.findViewById(R.id.recommended_widget_table);
- mTabBar = mContainer.findViewById(R.id.tabs);
-
- mContainer.setSearchAndRecommendationScrollController(this);
- }
-
- public void setCurrentRecyclerView(WidgetsRecyclerView currentRecyclerView) {
- boolean animateReset = mCurrentRecyclerView != null;
- if (mCurrentRecyclerView != null) {
- mCurrentRecyclerView.removeOnChildAttachStateChangeListener(this);
- }
- mCurrentRecyclerView = currentRecyclerView;
- mCurrentRecyclerView.addOnChildAttachStateChangeListener(this);
- findCurrentEmptyView();
- reset(animateReset);
- }
-
- public int getHeaderHeight() {
- return mHeaderHeight;
- }
-
- private void updateHeaderScroll() {
- mLastScroll = getCurrentScroll();
- mHeaderTitle.setTranslationY(mLastScroll);
- mRecommendedWidgetsTable.setTranslationY(mLastScroll);
-
- float searchYDisplacement = Math.max(mLastScroll, -mSearchBarContainer.getTop());
- mSearchBarContainer.setTranslationY(searchYDisplacement);
-
- if (mTabBar != null) {
- float tabsDisplacement = Math.max(mLastScroll, -mTabBar.getTop()
- + mSearchBarContainer.getHeight());
- mTabBar.setTranslationY(tabsDisplacement);
- }
- }
-
- private float getCurrentScroll() {
- return mScrollOffset + (mCurrentEmptySpaceView == null ? 0 : mCurrentEmptySpaceView.getY());
- }
-
- /**
- * Updates the scrollable header height
- *
- * @return {@code true} if the header height or dependent property changed.
- */
- public boolean updateHeaderHeight() {
- boolean hasSizeUpdated = false;
-
- int headerHeight = mContainer.getMeasuredHeight();
- if (headerHeight != mHeaderHeight) {
- mHeaderHeight = headerHeight;
- hasSizeUpdated = true;
- }
-
- if (mCurrentEmptySpaceView != null
- && mCurrentEmptySpaceView.setFixedHeight(mHeaderHeight)) {
- hasSizeUpdated = true;
- }
- return hasSizeUpdated;
- }
-
- /** Resets any previous view translation. */
- public void reset(boolean animate) {
- if (mOffsetAnimator != null) {
- mOffsetAnimator.cancel();
- mOffsetAnimator = null;
- }
-
- mScrollOffset = 0;
- if (!animate) {
- updateHeaderScroll();
- } else {
- float startValue = mLastScroll - getCurrentScroll();
- mOffsetAnimator = ObjectAnimator.ofFloat(this, SCROLL_OFFSET, startValue, 0);
- mOffsetAnimator.addListener(forEndCallback(() -> mOffsetAnimator = null));
- mOffsetAnimator.start();
- }
- }
-
- /**
- * Returns {@code true} if a touch event should be intercepted by this controller.
- */
- public boolean onInterceptTouchEvent(MotionEvent event) {
- return (mShouldForwardToRecyclerView = proxyMotionEvent(event, INTERCEPT_PROXY));
- }
-
- /**
- * Returns {@code true} if this controller has intercepted and consumed a touch event.
- */
- public boolean onTouchEvent(MotionEvent event) {
- return mShouldForwardToRecyclerView && proxyMotionEvent(event, TOUCH_PROXY);
- }
-
- private boolean proxyMotionEvent(MotionEvent event, MotionEventProxyMethod method) {
- float dx = mCurrentRecyclerView.getLeft() - mContainer.getLeft();
- float dy = mCurrentRecyclerView.getTop() - mContainer.getTop();
- event.offsetLocation(dx, dy);
- try {
- return method.proxyEvent(mCurrentRecyclerView, event);
- } finally {
- event.offsetLocation(-dx, -dy);
- }
- }
-
- @Override
- public void onChildViewAttachedToWindow(@NonNull View view) {
- if (view instanceof EmptySpaceView) {
- findCurrentEmptyView();
- }
- }
-
- @Override
- public void onChildViewDetachedFromWindow(@NonNull View view) {
- if (view == mCurrentEmptySpaceView) {
- findCurrentEmptyView();
- }
- }
-
- private void findCurrentEmptyView() {
- if (mCurrentEmptySpaceView != null) {
- mCurrentEmptySpaceView.setOnYChangeCallback(null);
- mCurrentEmptySpaceView = null;
- }
- int childCount = mCurrentRecyclerView.getChildCount();
- for (int i = 0; i < childCount; i++) {
- View view = mCurrentRecyclerView.getChildAt(i);
- if (view instanceof EmptySpaceView) {
- mCurrentEmptySpaceView = (EmptySpaceView) view;
- mCurrentEmptySpaceView.setFixedHeight(getHeaderHeight());
- mCurrentEmptySpaceView.setOnYChangeCallback(this::updateHeaderScroll);
- return;
- }
- }
- }
-
- private interface MotionEventProxyMethod {
-
- boolean proxyEvent(ViewGroup view, MotionEvent event);
- }
-}
diff --git a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsView.java b/src/com/android/launcher3/widget/picker/SearchAndRecommendationsView.java
deleted file mode 100644
index 0d7d2b5..0000000
--- a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsView.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.widget.picker;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.widget.LinearLayout;
-
-/**
- * A {@link LinearLayout} container for holding search and widgets recommendation.
- *
- * <p>This class intercepts touch events and dispatch them to the right view.
- */
-public class SearchAndRecommendationsView extends LinearLayout {
- private SearchAndRecommendationsScrollController mController;
-
- public SearchAndRecommendationsView(Context context) {
- this(context, /* attrs= */ null);
- }
-
- public SearchAndRecommendationsView(Context context, AttributeSet attrs) {
- this(context, attrs, /* defStyleAttr= */ 0);
- }
-
- public SearchAndRecommendationsView(Context context, AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, /* defStyleRes= */ 0);
- }
-
- public SearchAndRecommendationsView(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- public void setSearchAndRecommendationScrollController(
- SearchAndRecommendationsScrollController controller) {
- mController = controller;
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- return mController.onInterceptTouchEvent(event) || super.onInterceptTouchEvent(event);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- return mController.onTouchEvent(event) || super.onTouchEvent(event);
- }
-}
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index a49cdc0..88d9723 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -62,11 +62,13 @@
import com.android.launcher3.views.ArrowTipView;
import com.android.launcher3.views.RecyclerViewFastScroller;
import com.android.launcher3.views.SpringRelativeLayout;
+import com.android.launcher3.views.StickyHeaderLayout;
import com.android.launcher3.views.WidgetsEduView;
import com.android.launcher3.widget.BaseWidgetSheet;
import com.android.launcher3.widget.LauncherAppWidgetHost.ProviderChangedListener;
import com.android.launcher3.widget.model.WidgetsListBaseEntry;
import com.android.launcher3.widget.picker.search.SearchModeListener;
+import com.android.launcher3.widget.picker.search.WidgetsSearchBar;
import com.android.launcher3.widget.util.WidgetsTableUtils;
import com.android.launcher3.workprofile.PersonalWorkPagedView;
import com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.OnActivePageChangedListener;
@@ -161,7 +163,13 @@
private boolean mIsNoWidgetsViewNeeded;
private int mMaxSpansPerRow = DEFAULT_MAX_HORIZONTAL_SPANS;
private TextView mNoWidgetsView;
- private SearchAndRecommendationsScrollController mSearchScrollController;
+
+ private StickyHeaderLayout mSearchScrollView;
+ private WidgetsRecommendationTableLayout mRecommendedWidgetsTable;
+ private View mTabBar;
+ private View mSearchBarContainer;
+ private WidgetsSearchBar mSearchBar;
+ private TextView mHeaderTitle;
public WidgetsFullSheet(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
@@ -214,17 +222,23 @@
}
mNoWidgetsView = findViewById(R.id.no_widgets_text);
- mSearchScrollController = new SearchAndRecommendationsScrollController(
- findViewById(R.id.search_and_recommendations_container));
- mSearchScrollController.setCurrentRecyclerView(
- findViewById(R.id.primary_widgets_list_view));
- mSearchScrollController.mRecommendedWidgetsTable.setWidgetCellLongClickListener(this);
- mSearchScrollController.mRecommendedWidgetsTable.setWidgetCellOnClickListener(this);
+
+ mSearchScrollView = findViewById(R.id.search_and_recommendations_container);
+ mSearchScrollView.setCurrentRecyclerView(findViewById(R.id.primary_widgets_list_view));
+
+ mRecommendedWidgetsTable = mSearchScrollView.findViewById(R.id.recommended_widget_table);
+ mRecommendedWidgetsTable.setWidgetCellLongClickListener(this);
+ mRecommendedWidgetsTable.setWidgetCellOnClickListener(this);
+
+ mTabBar = mSearchScrollView.findViewById(R.id.tabs);
+ mSearchBarContainer = mSearchScrollView.findViewById(R.id.search_bar_container);
+ mSearchBar = mSearchScrollView.findViewById(R.id.widgets_search_bar);
+ mHeaderTitle = mSearchScrollView.findViewById(R.id.title);
onRecommendedWidgetsBound();
onWidgetsBound();
- mSearchScrollController.mSearchBar.initialize(
+ mSearchBar.initialize(
mActivityContext.getPopupDataProvider(), /* searchModeListener= */ this);
setUpEducationViewsIfNeeded();
@@ -258,7 +272,7 @@
reset();
resetExpandedHeaders();
mCurrentWidgetsRecyclerView = recyclerView;
- mSearchScrollController.setCurrentRecyclerView(recyclerView);
+ mSearchScrollView.setCurrentRecyclerView(recyclerView);
}
}
@@ -285,7 +299,7 @@
mAdapters.get(AdapterHolder.WORK).mWidgetsRecyclerView.scrollToTop();
}
mAdapters.get(AdapterHolder.SEARCH).mWidgetsRecyclerView.scrollToTop();
- mSearchScrollController.reset(/* animate= */ true);
+ mSearchScrollView.reset(/* animate= */ true);
}
@VisibleForTesting
@@ -355,8 +369,7 @@
@Override
protected void onContentHorizontalMarginChanged(int contentHorizontalMarginInPx) {
- setContentViewChildHorizontalMargin(mSearchScrollController.mContainer,
- contentHorizontalMarginInPx);
+ setContentViewChildHorizontalMargin(mSearchScrollView, contentHorizontalMarginInPx);
if (mViewPager == null) {
setContentViewChildHorizontalPadding(
mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView,
@@ -390,16 +403,8 @@
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
doMeasure(widthMeasureSpec, heightMeasureSpec);
- if (mSearchScrollController.updateHeaderHeight()) {
- doMeasure(widthMeasureSpec, heightMeasureSpec);
- }
-
if (updateMaxSpansPerRow()) {
doMeasure(widthMeasureSpec, heightMeasureSpec);
-
- if (mSearchScrollController.updateHeaderHeight()) {
- doMeasure(widthMeasureSpec, heightMeasureSpec);
- }
}
}
@@ -460,7 +465,7 @@
if (mHasWorkProfile) {
mViewPager.setVisibility(VISIBLE);
- mSearchScrollController.mTabBar.setVisibility(VISIBLE);
+ mTabBar.setVisibility(VISIBLE);
AdapterHolder workUserAdapterHolder = mAdapters.get(AdapterHolder.WORK);
workUserAdapterHolder.mWidgetsListAdapter.setWidgets(allWidgets);
onActivePageChanged(mViewPager.getCurrentPage());
@@ -508,10 +513,10 @@
private void setViewVisibilityBasedOnSearch(boolean isInSearchMode) {
mIsInSearchMode = isInSearchMode;
if (isInSearchMode) {
- mSearchScrollController.mRecommendedWidgetsTable.setVisibility(GONE);
+ mRecommendedWidgetsTable.setVisibility(GONE);
if (mHasWorkProfile) {
mViewPager.setVisibility(GONE);
- mSearchScrollController.mTabBar.setVisibility(GONE);
+ mTabBar.setVisibility(GONE);
} else {
mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView.setVisibility(GONE);
}
@@ -539,7 +544,6 @@
}
List<WidgetItem> recommendedWidgets =
mActivityContext.getPopupDataProvider().getRecommendedWidgets();
- WidgetsRecommendationTableLayout table = mSearchScrollController.mRecommendedWidgetsTable;
if (recommendedWidgets.size() > 0) {
float noWidgetsViewHeight = 0;
if (mIsNoWidgetsViewNeeded) {
@@ -562,9 +566,10 @@
List<ArrayList<WidgetItem>> recommendedWidgetsInTable =
WidgetsTableUtils.groupWidgetItemsIntoTableWithoutReordering(
recommendedWidgets, mMaxSpansPerRow);
- table.setRecommendedWidgets(recommendedWidgetsInTable, maxTableHeight);
+ mRecommendedWidgetsTable.setRecommendedWidgets(
+ recommendedWidgetsInTable, maxTableHeight);
} else {
- table.setVisibility(GONE);
+ mRecommendedWidgetsTable.setVisibility(GONE);
}
}
@@ -619,10 +624,9 @@
mNoIntercept = !getRecyclerView().shouldContainerScroll(ev, getPopupContainer());
}
- if (mSearchScrollController.mSearchBar.isSearchBarFocused()
- && !getPopupContainer().isEventOverView(
- mSearchScrollController.mSearchBarContainer, ev)) {
- mSearchScrollController.mSearchBar.clearSearchBarFocus();
+ if (mSearchBar.isSearchBarFocused()
+ && !getPopupContainer().isEventOverView(mSearchBarContainer, ev)) {
+ mSearchBar.clearSearchBarFocus();
}
}
return super.onControllerInterceptTouchEvent(ev);
@@ -663,8 +667,8 @@
@Override
public int getHeaderViewHeight() {
- return measureHeightWithVerticalMargins(mSearchScrollController.mHeaderTitle)
- + measureHeightWithVerticalMargins(mSearchScrollController.mSearchBarContainer);
+ return measureHeightWithVerticalMargins(mHeaderTitle)
+ + measureHeightWithVerticalMargins(mSearchBarContainer);
}
/** private the height, in pixel, + the vertical margins of a given view. */
@@ -681,14 +685,14 @@
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (mIsInSearchMode) {
- mSearchScrollController.mSearchBar.reset();
+ mSearchBar.reset();
}
}
@Override
public boolean onBackPressed() {
if (mIsInSearchMode) {
- mSearchScrollController.mSearchBar.reset();
+ mSearchBar.reset();
return true;
}
return super.onBackPressed();
@@ -701,10 +705,9 @@
}
@Nullable private View getViewToShowEducationTip() {
- if (mSearchScrollController.mRecommendedWidgetsTable.getVisibility() == VISIBLE
- && mSearchScrollController.mRecommendedWidgetsTable.getChildCount() > 0) {
- return ((ViewGroup) mSearchScrollController.mRecommendedWidgetsTable.getChildAt(0))
- .getChildAt(0);
+ if (mRecommendedWidgetsTable.getVisibility() == VISIBLE
+ && mRecommendedWidgetsTable.getChildCount() > 0) {
+ return ((ViewGroup) mRecommendedWidgetsTable.getChildAt(0)).getChildAt(0);
}
AdapterHolder adapterHolder = mAdapters.get(mIsInSearchMode
@@ -801,7 +804,7 @@
}
private int getEmptySpaceHeight() {
- return mSearchScrollController.getHeaderHeight();
+ return mSearchScrollView.getHeaderHeight();
}
void setup(WidgetsRecyclerView recyclerView) {
diff --git a/src/com/android/launcher3/widget/picker/WidgetsSpaceViewHolderBinder.java b/src/com/android/launcher3/widget/picker/WidgetsSpaceViewHolderBinder.java
index 1aa5753..0c4f7aa 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsSpaceViewHolderBinder.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsSpaceViewHolderBinder.java
@@ -15,16 +15,12 @@
*/
package com.android.launcher3.widget.picker;
-import static android.view.View.MeasureSpec.EXACTLY;
-import static android.view.View.MeasureSpec.makeMeasureSpec;
-
-import android.content.Context;
-import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.android.launcher3.recyclerview.ViewHolderBinder;
+import com.android.launcher3.views.StickyHeaderLayout.EmptySpaceView;
import com.android.launcher3.widget.model.WidgetListSpaceEntry;
import java.util.List;
@@ -52,64 +48,4 @@
@ListPosition int position, List<Object> payloads) {
((EmptySpaceView) holder.itemView).setFixedHeight(mEmptySpaceHeightProvider.getAsInt());
}
-
- /**
- * Empty view which allows listening for 'Y' changes
- */
- public static class EmptySpaceView extends View {
-
- private Runnable mOnYChangeCallback;
- private int mHeight = 0;
-
- private EmptySpaceView(Context context) {
- super(context);
- animate().setUpdateListener(v -> notifyYChanged());
- }
-
- /**
- * Sets the height for the empty view
- * @return true if the height changed, false otherwise
- */
- public boolean setFixedHeight(int height) {
- if (mHeight != height) {
- mHeight = height;
- requestLayout();
- return true;
- }
- return false;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, makeMeasureSpec(mHeight, EXACTLY));
- }
-
- public void setOnYChangeCallback(Runnable callback) {
- mOnYChangeCallback = callback;
- }
-
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- notifyYChanged();
- }
-
- @Override
- public void offsetTopAndBottom(int offset) {
- super.offsetTopAndBottom(offset);
- notifyYChanged();
- }
-
- @Override
- public void setTranslationY(float translationY) {
- super.setTranslationY(translationY);
- notifyYChanged();
- }
-
- private void notifyYChanged() {
- if (mOnYChangeCallback != null) {
- mOnYChangeCallback.run();
- }
- }
- }
}
diff --git a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
index 11185fb..49db2a0 100644
--- a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
+++ b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
@@ -23,7 +23,9 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.launcher3.DeviceProfile;
import com.android.launcher3.pageindicators.PageIndicator;
+import com.android.launcher3.views.ActivityContext;
/**
* Supports two indicator colors, dedicated for personal and work tabs.
@@ -72,6 +74,26 @@
return false;
}
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (getPaddingLeft() == 0 && getPaddingRight() == 0) {
+ // If any padding is not specified, restrict the width to emulate padding
+ int size = MeasureSpec.getSize(widthMeasureSpec);
+ size = getTabWidth(getContext(), size);
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
+ }
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ /**
+ * Returns distance between left and right app icons
+ */
+ public static int getTabWidth(Context context, int totalWidth) {
+ DeviceProfile grid = ActivityContext.lookupContext(context).getDeviceProfile();
+ int iconPadding = totalWidth / grid.numShownAllAppsColumns - grid.allAppsIconSizePx;
+ return totalWidth - iconPadding;
+ }
+
/**
* Interface definition for a callback to be invoked when an active page has been changed.
*/
diff --git a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
index 0635d84..9a76336 100644
--- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
+++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
@@ -23,6 +23,8 @@
import org.junit.Before
import org.mockito.ArgumentMatchers.any
import org.mockito.Mockito.mock
+import java.io.PrintWriter
+import java.io.StringWriter
import org.mockito.Mockito.`when` as whenever
abstract class DeviceProfileBaseTest {
@@ -55,8 +57,9 @@
isGestureMode
)
- protected fun initializeVarsForPhone(isLandscape: Boolean = false) {
- val (x, y) = if (isLandscape)
+ protected fun initializeVarsForPhone(isGestureMode: Boolean = true,
+ isVerticalBar: Boolean = false) {
+ val (x, y) = if (isVerticalBar)
Pair(3120, 1440)
else
Pair(1440, 3120)
@@ -67,10 +70,17 @@
whenever(info.getDensityDpi()).thenReturn(560)
whenever(info.smallestSizeDp(any())).thenReturn(411f)
- inv = newScalableInvariantDeviceProfile()
+ this.isGestureMode = isGestureMode
+
+ inv = newScalableInvariantDeviceProfile().apply {
+ deviceType = InvariantDeviceProfile.TYPE_PHONE
+ transposeLayoutWithOrientation = isVerticalBar
+ }
}
- protected fun initializeVarsForTablet(isLandscape: Boolean = false) {
+ protected fun initializeVarsForTablet(isLandscape: Boolean = false,
+ isTwoPanel: Boolean = false,
+ isGestureMode: Boolean = true) {
val (x, y) = if (isLandscape)
Pair(2560, 1600)
else
@@ -82,7 +92,19 @@
whenever(info.getDensityDpi()).thenReturn(320)
whenever(info.smallestSizeDp(any())).thenReturn(800f)
- inv = newScalableInvariantDeviceProfile()
+ this.isGestureMode = isGestureMode
+ useTwoPanels = isTwoPanel
+
+ inv = newScalableInvariantDeviceProfile().apply {
+ deviceType = if (isTwoPanel)
+ InvariantDeviceProfile.TYPE_MULTI_DISPLAY else InvariantDeviceProfile.TYPE_TABLET
+ inlineQsb = booleanArrayOf(
+ false,
+ isLandscape,
+ false,
+ false
+ )
+ }
}
/**
@@ -137,4 +159,12 @@
false
)
}
+
+ fun dump(dp: DeviceProfile): StringWriter {
+ val stringWriter = StringWriter()
+ val printWriter = PrintWriter(stringWriter)
+ dp.dump("", printWriter)
+ printWriter.flush()
+ return stringWriter
+ }
}
\ No newline at end of file
diff --git a/tests/src/com/android/launcher3/HotseatShownIconsTest.kt b/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
index 593239d..5dabb33 100644
--- a/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
+++ b/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
@@ -32,33 +32,6 @@
class HotseatShownIconsTest : DeviceProfileBaseTest() {
@Test
- fun hotseat_size_is_normal_for_handhelds() {
- initializeVarsForPhone()
- inv = newScalableInvariantDeviceProfile().apply {
- deviceType = TYPE_PHONE
- }
-
- val dp = newDP()
-
- assertThat(dp.isQsbInline).isFalse()
- assertThat(dp.numShownHotseatIcons).isEqualTo(4)
- }
-
- @Test
- fun hotseat_size_is_max_when_large_screen() {
- initializeVarsForTablet(isLandscape = true)
- inv = newScalableInvariantDeviceProfile().apply {
- deviceType = TYPE_MULTI_DISPLAY
- }
- useTwoPanels = true
-
- val dp = newDP()
-
- assertThat(dp.isQsbInline).isFalse()
- assertThat(dp.numShownHotseatIcons).isEqualTo(6)
- }
-
- @Test
fun hotseat_size_is_shrunk_if_needed_when_large_screen() {
initializeVarsForTablet(isLandscape = true)
inv = newScalableInvariantDeviceProfile().apply {
diff --git a/tests/src/com/android/launcher3/InlineQsbTest.kt b/tests/src/com/android/launcher3/InlineQsbTest.kt
deleted file mode 100644
index 905c1e1..0000000
--- a/tests/src/com/android/launcher3/InlineQsbTest.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Test for [DeviceProfile]
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class InlineQsbTest : DeviceProfileBaseTest() {
-
- @Test
- fun qsb_is_not_inline_for_phones() {
- initializeVarsForPhone()
-
- val dp = newDP()
-
- assertThat(dp.isQsbInline).isFalse()
- }
-
- @Test
- fun qsb_is_inline_for_tablet_portrait() {
- initializeVarsForTablet()
- inv = newScalableInvariantDeviceProfile().apply {
- inlineQsb = booleanArrayOf(
- false,
- true, // landscape
- false,
- false
- )
- }
-
- val dp = DeviceProfile(
- context,
- inv,
- info,
- windowBounds,
- isMultiWindowMode,
- transposeLayoutWithOrientation,
- useTwoPanels,
- isGestureMode
- )
-
- assertThat(dp.isQsbInline).isFalse()
- }
-
- @Test
- fun qsb_is_inline_for_tablet_landscape() {
- initializeVarsForTablet(isLandscape = true)
- inv = newScalableInvariantDeviceProfile().apply {
- inlineQsb = booleanArrayOf(
- false,
- true, // landscape
- false,
- false
- )
- numColumns = 6
- numRows = 5
- numShownHotseatIcons = 6
- }
-
- val dp = newDP()
-
- if (dp.hotseatQsbHeight > 0) {
- assertThat(dp.isQsbInline).isTrue()
- } else { // Launcher3 doesn't have QSB height
- assertThat(dp.isQsbInline).isFalse()
- }
- }
-
- /**
- * This test is to make sure that a tablet doesn't inline the QSB if the layout doesn't support
- */
- @Test
- fun qsb_is_not_inline_for_tablet_landscape_without_inline() {
- initializeVarsForTablet(isLandscape = true)
- useTwoPanels = true
-
- val dp = newDP()
-
- assertThat(dp.isQsbInline).isFalse()
- }
-
-}
\ No newline at end of file
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index a5f8cf2..fa6141a 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -373,6 +373,17 @@
sActiveContainer = new WeakReference<>(container);
}
+ /**
+ * Sets the accesibility interactive timeout to be effectively indefinite (UI using this
+ * accesibility timeout will not automatically dismiss if true).
+ */
+ void setIndefiniteAccessibilityInteractiveUiTimeout(boolean indefiniteTimeout) {
+ final String cmd = indefiniteTimeout
+ ? "settings put secure accessibility_interactive_ui_timeout_ms 10000"
+ : "settings delete secure accessibility_interactive_ui_timeout_ms";
+ logShellCommand(cmd);
+ }
+
public NavigationModel getNavigationModel() {
final Context baseContext = mInstrumentation.getTargetContext();
try {
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewActions.java b/tests/tapl/com/android/launcher3/tapl/OverviewActions.java
index 2f44bb6..d1b1a84 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewActions.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewActions.java
@@ -41,6 +41,8 @@
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"want to click screenshot button and exit screenshot ui")) {
+ mLauncher.setIndefiniteAccessibilityInteractiveUiTimeout(true);
+
UiObject2 screenshot = mLauncher.waitForObjectInContainer(mOverviewActions,
"action_screenshot");
@@ -62,6 +64,8 @@
return new Overview(mLauncher);
}
}
+ } finally {
+ mLauncher.setIndefiniteAccessibilityInteractiveUiTimeout(false);
}
}