Merge "Reset state after split launch animation finishes" into sc-v2-dev
diff --git a/protos/launcher_atom.proto b/protos/launcher_atom.proto
index ca9f063..d1bf152 100644
--- a/protos/launcher_atom.proto
+++ b/protos/launcher_atom.proto
@@ -152,6 +152,8 @@
ALL_APPS_SEARCH_RESULT_NAVVYSITE = 25;
ALL_APPS_SEARCH_RESULT_TIPS = 26;
ALL_APPS_SEARCH_RESULT_PEOPLE_TILE = 27;
+ ALL_APPS_SEARCH_RESULT_LEGACY_SHORTCUT = 30;
+ ALL_APPS_SEARCH_RESULT_ASSISTANT_MEMORY = 31;
WIDGETS_BOTTOM_TRAY = 28;
WIDGETS_TRAY_PREDICTION = 29;
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 11b9df0..3aeab7b 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -789,7 +789,7 @@
mRecentsAnimationStartCallbacks.clear();
}
- TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, false);
+ TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, false);
// Only add the callback to enable the input consumer after we actually have the controller
mStateCallback.runOnceAtState(STATE_APP_CONTROLLER_RECEIVED | STATE_GESTURE_STARTED,
@@ -806,7 +806,7 @@
mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED);
if (mRecentsAnimationTargets != null) {
- TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true);
+ TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, true);
}
// Defer clearing the controller and the targets until after we've updated the state
@@ -955,7 +955,8 @@
} else {
mStateCallback.setState(STATE_RESUME_LAST_TASK);
}
- TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true);
+ TaskViewUtils.setSplitAuxiliarySurfacesShown(
+ mRecentsAnimationTargets.nonApps, true);
break;
}
ActiveGestureLog.INSTANCE.addLog("onSettledOnEndTarget " + endTarget);
@@ -1598,7 +1599,7 @@
mActivityInterface.onTransitionCancelled(wasVisible, mGestureState.getEndTarget());
if (mRecentsAnimationTargets != null) {
- TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true);
+ TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, true);
}
// Leave the pending invisible flag, as it may be used by wallpaper open animation.
@@ -1841,7 +1842,7 @@
@Override
public void onRecentsAnimationFinished(RecentsAnimationController controller) {
if (!controller.getFinishTargetIsLauncher()) {
- TaskViewUtils.setDividerBarShown(mRecentsAnimationTargets.nonApps, true);
+ TaskViewUtils.setSplitAuxiliarySurfacesShown(mRecentsAnimationTargets.nonApps, true);
}
mRecentsAnimationController = null;
mRecentsAnimationTargets = null;
diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
index 12fba0d..6ccb152 100644
--- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
+++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
@@ -53,14 +53,14 @@
Bundle::putInt, PortraitStatesTouchController::getHotseatTop);
}
- case TestProtocol.REQUEST_GET_FOCUSED_TASK_WIDTH_FOR_TABLET: {
+ case TestProtocol.REQUEST_GET_FOCUSED_TASK_HEIGHT_FOR_TABLET: {
if (!mDeviceProfile.isTablet) {
return null;
}
Rect focusedTaskRect = new Rect();
LauncherActivityInterface.INSTANCE.calculateTaskSize(mContext, mDeviceProfile,
focusedTaskRect);
- response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, focusedTaskRect.width());
+ response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, focusedTaskRect.height());
return response;
}
}
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index 37d88ae..284bc03 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -35,7 +35,6 @@
import static com.android.launcher3.anim.Interpolators.clampToProgress;
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
import static com.android.launcher3.statehandlers.DepthController.DEPTH;
-import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
@@ -505,7 +504,7 @@
nonAppTargets, depthController, pa);
if (launcherClosing) {
// TODO(b/182592057): differentiate between "restore split" vs "launch fullscreen app"
- TaskViewUtils.setDividerBarShown(nonAppTargets, true);
+ TaskViewUtils.setSplitAuxiliarySurfacesShown(nonAppTargets, true);
}
Animator childStateAnimation = null;
@@ -560,18 +559,20 @@
anim.addListener(windowAnimEndListener);
}
- static void setDividerBarShown(RemoteAnimationTargetCompat[] nonApps, boolean shown) {
+ static void setSplitAuxiliarySurfacesShown(RemoteAnimationTargetCompat[] nonApps,
+ boolean shown) {
// TODO(b/182592057): make this part of the animations instead.
if (nonApps != null && nonApps.length > 0) {
+ SurfaceControl.Transaction t = new SurfaceControl.Transaction();
for (int i = 0; i < nonApps.length; ++i) {
final RemoteAnimationTargetCompat targ = nonApps[i];
- if (targ.windowType == TYPE_DOCK_DIVIDER) {
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
- t.setVisibility(targ.leash.getSurfaceControl(), shown);
- t.apply();
- t.close();
+ final SurfaceControl leash = targ.leash.getSurfaceControl();
+ if (targ.windowType == TYPE_DOCK_DIVIDER && leash != null) {
+ t.setVisibility(leash, shown);
}
}
+ t.apply();
+ t.close();
}
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index e9c669b..796caa0 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -409,7 +409,7 @@
private final float mFastFlingVelocity;
private final int mScrollHapticMinGapMillis;
private final RecentsModel mModel;
- private final int mGridSideMargin;
+ private final int mSplitPlaceholderSize;
private final ClearAllButton mClearAllButton;
private final Rect mClearAllButtonDeadZoneRect = new Rect();
private final Rect mTaskViewDeadZoneRect = new Rect();
@@ -660,7 +660,8 @@
mIsRtl = mOrientationHandler.getRecentsRtlSetting(getResources());
setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
- mGridSideMargin = getResources().getDimensionPixelSize(R.dimen.overview_grid_side_margin);
+ mSplitPlaceholderSize = getResources().getDimensionPixelSize(
+ R.dimen.split_placeholder_size);
mSquaredTouchSlop = squaredTouchSlop(context);
mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents);
@@ -4238,13 +4239,19 @@
return;
}
- if (mSyncTransactionApplier != null) {
- recentsAnimationTargets.addReleaseCheck(mSyncTransactionApplier);
- }
-
RemoteTargetGluer gluer = new RemoteTargetGluer(getContext(), getSizeStrategy());
mRemoteTargetHandles = gluer.assignTargetsForSplitScreen(recentsAnimationTargets);
mSplitBoundsConfig = gluer.getStagedSplitBounds();
+ if (mSyncTransactionApplier != null) {
+ // Add release check to the targets from the RemoteTargetGluer and not the targets
+ // passed in because in the event we're in split screen, we use the passed in targets
+ // to create new RemoteAnimationTargets in assignTargetsForSplitScreen(), and the
+ // mSyncTransactionApplier doesn't get transferred over
+ runActionOnRemoteHandles(remoteTargetHandle -> remoteTargetHandle
+ .getTransformParams().getTargetSet()
+ .addReleaseCheck(mSyncTransactionApplier));
+ }
+
TaskView runningTaskView = getRunningTaskView();
if (runningTaskView instanceof GroupedTaskView) {
// We initially create a GroupedTaskView in showCurrentTask() before launcher even
@@ -4351,16 +4358,24 @@
@Override
protected int computeMinScroll() {
if (getTaskViewCount() > 0) {
+ int minScroll;
if (mIsRtl) {
// If we aren't showing the clear all button, use the rightmost task as the min
// scroll.
- return getScrollForPage(mDisallowScrollToClearAll ? indexOfChild(
+ minScroll = getScrollForPage(mDisallowScrollToClearAll ? indexOfChild(
getTaskViewAt(getTaskViewCount() - 1)) : indexOfChild(mClearAllButton));
+ if (showAsGrid() && isSplitSelectionActive()
+ && mSplitSelectStateController.getActiveSplitStagePosition()
+ == SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT) {
+ minScroll -= mSplitPlaceholderSize;
+ }
} else {
TaskView focusedTaskView = mShowAsGridLastOnLayout ? getFocusedTaskView() : null;
- return getScrollForPage(focusedTaskView != null ? indexOfChild(focusedTaskView)
+ minScroll = getScrollForPage(focusedTaskView != null ? indexOfChild(focusedTaskView)
: 0);
+ // TODO(b/200537659): Adjust according to mSplitPlaceholderSize.
}
+ return minScroll;
}
return super.computeMinScroll();
}
@@ -4368,16 +4383,24 @@
@Override
protected int computeMaxScroll() {
if (getTaskViewCount() > 0) {
+ int maxScroll;
if (mIsRtl) {
TaskView focusedTaskView = mShowAsGridLastOnLayout ? getFocusedTaskView() : null;
- return getScrollForPage(focusedTaskView != null ? indexOfChild(focusedTaskView)
+ maxScroll = getScrollForPage(focusedTaskView != null ? indexOfChild(focusedTaskView)
: 0);
+ if (showAsGrid() && isSplitSelectionActive()
+ && mSplitSelectStateController.getActiveSplitStagePosition()
+ == SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT) {
+ maxScroll += mSplitPlaceholderSize;
+ }
} else {
// If we aren't showing the clear all button, use the leftmost task as the min
// scroll.
- return getScrollForPage(mDisallowScrollToClearAll ? indexOfChild(
+ maxScroll = getScrollForPage(mDisallowScrollToClearAll ? indexOfChild(
getTaskViewAt(getTaskViewCount() - 1)) : indexOfChild(mClearAllButton));
+ // TODO(b/200537659): Adjust according to mSplitPlaceholderSize.
}
+ return maxScroll;
}
return super.computeMaxScroll();
}
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index ca3ce78..319c87d 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -191,7 +191,32 @@
if not specified -->
<attr name="twoPanelLandscapeMinCellWidthDps" format="float" />
- <attr name="borderSpacingDps" format="float" />
+ <!-- These border spaces are only used if GridDisplayOption#isScalable is true -->
+ <!-- space to be used horizontally and vertically -->
+ <attr name="borderSpaceDps" format="float" />
+ <!-- space to the right of the cell, defaults to borderSpaceDps if not specified -->
+ <attr name="borderSpaceHorizontalDps" format="float" />
+ <!-- space below the cell, defaults to borderSpaceDps if not specified -->
+ <attr name="borderSpaceVerticalDps" format="float" />
+ <!-- space to be used horizontally and vertically in two panels,
+ defaults to borderSpaceDps if not specified -->
+ <attr name="twoPanelPortraitBorderSpaceDps" format="float" />
+ <!-- space to the right of the cell in two panels, defaults to
+ twoPanelPortraitBorderSpaceDps if not specified -->
+ <attr name="twoPanelPortraitBorderSpaceHorizontalDps" format="float" />
+ <!-- space below the cell in two panels, defaults to twoPanelPortraitBorderSpaceDps
+ if not specified -->
+ <attr name="twoPanelPortraitBorderSpaceVerticalDps" format="float" />
+ <!-- space to be used horizontally and vertically in two panels,
+ defaults to borderSpaceDps if not specified -->
+ <attr name="twoPanelLandscapeBorderSpaceDps" format="float" />
+ <!-- space to the right of the cell in two panels, defaults to
+ twoPanelLandscapeBorderSpaceDps if not specified -->
+ <attr name="twoPanelLandscapeBorderSpaceHorizontalDps" format="float" />
+ <!-- space below the cell in two panels, defaults to twoPanelLandscapeBorderSpaceDps
+ if not specified -->
+ <attr name="twoPanelLandscapeBorderSpaceVerticalDps" format="float" />
+
<attr name="allAppsCellSpacingDps" format="float" />
diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java
index fef3f8f..ebfd281 100644
--- a/src/com/android/launcher3/AppWidgetResizeFrame.java
+++ b/src/com/android/launcher3/AppWidgetResizeFrame.java
@@ -422,8 +422,8 @@
*/
private void resizeWidgetIfNeeded(boolean onDismiss) {
DeviceProfile dp = mLauncher.getDeviceProfile();
- float xThreshold = mCellLayout.getCellWidth() + dp.cellLayoutBorderSpacingPx;
- float yThreshold = mCellLayout.getCellHeight() + dp.cellLayoutBorderSpacingPx;
+ float xThreshold = mCellLayout.getCellWidth() + dp.cellLayoutBorderSpacePx.x;
+ float yThreshold = mCellLayout.getCellHeight() + dp.cellLayoutBorderSpacePx.y;
int hSpanInc = getSpanIncrement((mDeltaX + mDeltaXAddOn) / xThreshold - mRunningHInc);
int vSpanInc = getSpanIncrement((mDeltaY + mDeltaYAddOn) / yThreshold - mRunningVInc);
@@ -508,8 +508,8 @@
private void onTouchUp() {
DeviceProfile dp = mLauncher.getDeviceProfile();
- int xThreshold = mCellLayout.getCellWidth() + dp.cellLayoutBorderSpacingPx;
- int yThreshold = mCellLayout.getCellHeight() + dp.cellLayoutBorderSpacingPx;
+ int xThreshold = mCellLayout.getCellWidth() + dp.cellLayoutBorderSpacePx.x;
+ int yThreshold = mCellLayout.getCellHeight() + dp.cellLayoutBorderSpacePx.y;
mDeltaXAddOn = mRunningHInc * xThreshold;
mDeltaYAddOn = mRunningVInc * yThreshold;
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index f6c58c4..9da2b79 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -66,6 +66,7 @@
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.views.ActivityContext;
+import com.android.launcher3.views.BubbleTextHolder;
import com.android.launcher3.views.IconLabelDotView;
import java.text.NumberFormat;
@@ -297,7 +298,7 @@
@UiThread
public void applyFromWorkspaceItem(WorkspaceItemInfo info, boolean promiseStateChanged) {
applyIconAndLabel(info);
- setTag(info);
+ setItemInfo(info);
applyLoadingState(promiseStateChanged);
applyDotState(info, false /* animate */);
setDownloadStateContentDescription(info, info.getProgressLevel());
@@ -308,7 +309,8 @@
applyIconAndLabel(info);
// We don't need to check the info since it's not a WorkspaceItemInfo
- super.setTag(info);
+ setItemInfo(info);
+
// Verify high res immediately
verifyHighRes();
@@ -327,7 +329,7 @@
public void applyFromItemInfoWithIcon(ItemInfoWithIcon info) {
applyIconAndLabel(info);
// We don't need to check the info since it's not a WorkspaceItemInfo
- super.setTag(info);
+ setItemInfo(info);
// Verify high res immediately
verifyHighRes();
@@ -335,13 +337,11 @@
setDownloadStateContentDescription(info, info.getProgressLevel());
}
- /**
- * Apply label and tag using a {@link SearchActionItemInfo}
- */
- @UiThread
- public void applyFromSearchActionItemInfo(SearchActionItemInfo searchActionItemInfo) {
- applyIconAndLabel(searchActionItemInfo);
- setTag(searchActionItemInfo);
+ private void setItemInfo(ItemInfo itemInfo) {
+ setTag(itemInfo);
+ if (getParent() instanceof BubbleTextHolder) {
+ ((BubbleTextHolder) getParent()).onItemInfoChanged(itemInfo);
+ }
}
@UiThread
@@ -799,7 +799,7 @@
} else if (info instanceof PackageItemInfo) {
applyFromItemInfoWithIcon((PackageItemInfo) info);
} else if (info instanceof SearchActionItemInfo) {
- applyFromSearchActionItemInfo((SearchActionItemInfo) info);
+ applyFromItemInfoWithIcon((SearchActionItemInfo) info);
}
mDisableRelayout = false;
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 28e3b9d..02eb1de 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -91,7 +91,7 @@
private int mFixedCellWidth;
private int mFixedCellHeight;
@ViewDebug.ExportedProperty(category = "launcher")
- private final int mBorderSpacing;
+ private final Point mBorderSpace;
@ViewDebug.ExportedProperty(category = "launcher")
private int mCountX;
@@ -236,9 +236,9 @@
mActivity = ActivityContext.lookupContext(context);
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
- mBorderSpacing = mContainerType == FOLDER
- ? deviceProfile.folderCellLayoutBorderSpacingPx
- : deviceProfile.cellLayoutBorderSpacingPx;
+ mBorderSpace = mContainerType == FOLDER
+ ? new Point(deviceProfile.folderCellLayoutBorderSpacePx)
+ : new Point(deviceProfile.cellLayoutBorderSpacePx);
mCellWidth = mCellHeight = -1;
mFixedCellWidth = mFixedCellHeight = -1;
@@ -308,7 +308,7 @@
mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context, mContainerType);
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY,
- mBorderSpacing);
+ mBorderSpace);
addView(mShortcutsAndWidgets);
}
@@ -368,7 +368,7 @@
mFixedCellWidth = mCellWidth = width;
mFixedCellHeight = mCellHeight = height;
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY,
- mBorderSpacing);
+ mBorderSpace);
}
public void setGridSize(int x, int y) {
@@ -378,7 +378,7 @@
mTmpOccupied = new GridOccupancy(mCountX, mCountY);
mTempRectStack.clear();
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY,
- mBorderSpacing);
+ mBorderSpace);
requestLayout();
}
@@ -541,9 +541,9 @@
if (mVisualizeCells) {
for (int i = 0; i < mCountX; i++) {
for (int j = 0; j < mCountY; j++) {
- int transX = i * mCellWidth + (i * mBorderSpacing) + getPaddingLeft()
+ int transX = i * mCellWidth + (i * mBorderSpace.x) + getPaddingLeft()
+ paddingX;
- int transY = j * mCellHeight + (j * mBorderSpacing) + getPaddingTop()
+ int transY = j * mCellHeight + (j * mBorderSpace.y) + getPaddingTop()
+ paddingY;
mVisualizeGridRect.offsetTo(transX, transY);
@@ -567,12 +567,12 @@
// TODO b/194414754 clean this up, reconcile with cellToRect
mVisualizeGridRect.set(paddingX, paddingY,
- mCellWidth * spanX + mBorderSpacing * (spanX - 1) - paddingX,
- mCellHeight * spanY + mBorderSpacing * (spanY - 1) - paddingY);
+ mCellWidth * spanX + mBorderSpace.x * (spanX - 1) - paddingX,
+ mCellHeight * spanY + mBorderSpace.y * (spanY - 1) - paddingY);
- int transX = x * mCellWidth + (x * mBorderSpacing)
+ int transX = x * mCellWidth + (x * mBorderSpace.x)
+ getPaddingLeft() + paddingX;
- int transY = y * mCellHeight + (y * mBorderSpacing)
+ int transY = y * mCellHeight + (y * mBorderSpace.y)
+ getPaddingTop() + paddingY;
mVisualizeGridRect.offsetTo(transX, transY);
@@ -858,15 +858,15 @@
int childHeightSize = heightSize - (getPaddingTop() + getPaddingBottom());
if (mFixedCellWidth < 0 || mFixedCellHeight < 0) {
- int cw = DeviceProfile.calculateCellWidth(childWidthSize, mBorderSpacing,
+ int cw = DeviceProfile.calculateCellWidth(childWidthSize, mBorderSpace.x,
mCountX);
- int ch = DeviceProfile.calculateCellHeight(childHeightSize, mBorderSpacing,
+ int ch = DeviceProfile.calculateCellHeight(childHeightSize, mBorderSpace.y,
mCountY);
if (cw != mCellWidth || ch != mCellHeight) {
mCellWidth = cw;
mCellHeight = ch;
mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mCountX, mCountY,
- mBorderSpacing);
+ mBorderSpace);
}
}
@@ -920,7 +920,7 @@
*/
public int getUnusedHorizontalSpace() {
return getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - (mCountX * mCellWidth)
- - ((mCountX - 1) * mBorderSpacing);
+ - ((mCountX - 1) * mBorderSpace.x);
}
@Override
@@ -2592,11 +2592,11 @@
+ (int) Math.ceil(getUnusedHorizontalSpace() / 2f);
final int vStartPadding = getPaddingTop();
- int x = hStartPadding + (cellX * mBorderSpacing) + (cellX * cellWidth);
- int y = vStartPadding + (cellY * mBorderSpacing) + (cellY * cellHeight);
+ int x = hStartPadding + (cellX * mBorderSpace.x) + (cellX * cellWidth);
+ int y = vStartPadding + (cellY * mBorderSpace.y) + (cellY * cellHeight);
- int width = cellHSpan * cellWidth + ((cellHSpan - 1) * mBorderSpacing);
- int height = cellVSpan * cellHeight + ((cellVSpan - 1) * mBorderSpacing);
+ int width = cellHSpan * cellWidth + ((cellHSpan - 1) * mBorderSpace.x);
+ int height = cellVSpan * cellHeight + ((cellVSpan - 1) * mBorderSpace.y);
resultRect.set(x, y, x + width, y + height);
}
@@ -2615,12 +2615,12 @@
public int getDesiredWidth() {
return getPaddingLeft() + getPaddingRight() + (mCountX * mCellWidth)
- + ((mCountX - 1) * mBorderSpacing);
+ + ((mCountX - 1) * mBorderSpace.x);
}
public int getDesiredHeight() {
return getPaddingTop() + getPaddingBottom() + (mCountY * mCellHeight)
- + ((mCountY - 1) * mBorderSpacing);
+ + ((mCountY - 1) * mBorderSpace.y);
}
public boolean isOccupied(int x, int y) {
@@ -2736,20 +2736,20 @@
}
public void setup(int cellWidth, int cellHeight, boolean invertHorizontally, int colCount,
- int rowCount, int borderSpacing, @Nullable Rect inset) {
+ int rowCount, Point borderSpace, @Nullable Rect inset) {
setup(cellWidth, cellHeight, invertHorizontally, colCount, rowCount, 1.0f, 1.0f,
- borderSpacing, inset);
+ borderSpace, inset);
}
/**
- * Use this method, as opposed to {@link #setup(int, int, boolean, int, int, int, Rect)},
+ * Use this method, as opposed to {@link #setup(int, int, boolean, int, int, Point, Rect)},
* if the view needs to be scaled.
*
* ie. In multi-window mode, we setup widgets so that they are measured and laid out
* using their full/invariant device profile sizes.
*/
public void setup(int cellWidth, int cellHeight, boolean invertHorizontally, int colCount,
- int rowCount, float cellScaleX, float cellScaleY, int borderSpacing,
+ int rowCount, float cellScaleX, float cellScaleY, Point borderSpace,
@Nullable Rect inset) {
if (isLockedToGrid) {
final int myCellHSpan = cellHSpan;
@@ -2761,16 +2761,16 @@
myCellX = colCount - myCellX - cellHSpan;
}
- int hBorderSpacing = (myCellHSpan - 1) * borderSpacing;
- int vBorderSpacing = (myCellVSpan - 1) * borderSpacing;
+ int hBorderSpacing = (myCellHSpan - 1) * borderSpace.x;
+ int vBorderSpacing = (myCellVSpan - 1) * borderSpace.y;
float myCellWidth = ((myCellHSpan * cellWidth) + hBorderSpacing) / cellScaleX;
float myCellHeight = ((myCellVSpan * cellHeight) + vBorderSpacing) / cellScaleY;
width = Math.round(myCellWidth) - leftMargin - rightMargin;
height = Math.round(myCellHeight) - topMargin - bottomMargin;
- x = leftMargin + (myCellX * cellWidth) + (myCellX * borderSpacing);
- y = topMargin + (myCellY * cellHeight) + (myCellY * borderSpacing);
+ x = leftMargin + (myCellX * cellWidth) + (myCellX * borderSpace.x);
+ y = topMargin + (myCellY * cellHeight) + (myCellY * borderSpace.y);
if (inset != null) {
x -= inset.left;
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 07221fc..4e06ff9 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -99,8 +99,8 @@
// Workspace
public final int desiredWorkspaceHorizontalMarginOriginalPx;
public int desiredWorkspaceHorizontalMarginPx;
- public final int cellLayoutBorderSpacingOriginalPx;
- public int cellLayoutBorderSpacingPx;
+ public Point cellLayoutBorderSpaceOriginalPx;
+ public Point cellLayoutBorderSpacePx;
public final int cellLayoutPaddingLeftRightPx;
public final int cellLayoutBottomPaddingPx;
public final int edgeMarginPx;
@@ -137,7 +137,8 @@
public int folderIconOffsetYPx;
// Folder content
- public int folderCellLayoutBorderSpacingPx;
+ public Point folderCellLayoutBorderSpacePx;
+ public int folderCellLayoutBorderSpaceOriginalPx;
public int folderContentPaddingLeftRight;
public int folderContentPaddingTop;
@@ -281,10 +282,12 @@
res.getDimensionPixelSize(R.dimen.folder_content_padding_left_right);
folderContentPaddingTop = res.getDimensionPixelSize(R.dimen.folder_content_padding_top);
- setCellLayoutBorderSpacing(pxFromDp(inv.borderSpacing, mMetrics, 1f));
+ cellLayoutBorderSpacePx = getCellLayoutBorderSpace(inv);
allAppsCellSpacingPx = pxFromDp(inv.allAppsCellSpacing, mMetrics, 1f);
- cellLayoutBorderSpacingOriginalPx = cellLayoutBorderSpacingPx;
- folderCellLayoutBorderSpacingPx = cellLayoutBorderSpacingPx;
+ cellLayoutBorderSpaceOriginalPx = new Point(cellLayoutBorderSpacePx);
+ folderCellLayoutBorderSpaceOriginalPx = pxFromDp(inv.folderBorderSpace, mMetrics, 1f);
+ folderCellLayoutBorderSpacePx = new Point(folderCellLayoutBorderSpaceOriginalPx,
+ folderCellLayoutBorderSpaceOriginalPx);
int cellLayoutPaddingLeftRightMultiplier = !isVerticalBarLayout() && isTablet
? PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER : 1;
@@ -479,8 +482,33 @@
}
}
- private void setCellLayoutBorderSpacing(int borderSpacing) {
- cellLayoutBorderSpacingPx = isScalableGrid ? borderSpacing : 0;
+ private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp) {
+ if (!isScalableGrid) {
+ return new Point(0, 0);
+ }
+
+ int horizontalSpacePx;
+ int verticalSpacePx;
+
+ if (isTwoPanels) {
+ if (isLandscape) {
+ horizontalSpacePx = pxFromDp(idp.twoPanelLandscapeBorderSpace.x, mMetrics);
+ verticalSpacePx = pxFromDp(idp.twoPanelLandscapeBorderSpace.y, mMetrics);
+ } else {
+ horizontalSpacePx = pxFromDp(idp.twoPanelPortraitBorderSpace.x, mMetrics);
+ verticalSpacePx = pxFromDp(idp.twoPanelPortraitBorderSpace.y, mMetrics);
+ }
+ } else {
+ horizontalSpacePx = pxFromDp(idp.borderSpace.x, mMetrics);
+ verticalSpacePx = pxFromDp(idp.borderSpace.y, mMetrics);
+ }
+
+ return new Point(horizontalSpacePx, verticalSpacePx);
+ }
+
+ private Point getCellLayoutBorderSpaceScaled(InvariantDeviceProfile idp, float scale) {
+ Point original = getCellLayoutBorderSpace(idp);
+ return new Point((int) (original.x * scale), (int) (original.y * scale));
}
public Info getDisplayInfo() {
@@ -497,10 +525,10 @@
// Check all sides to ensure that the widget won't overlap into another cell, or into
// status bar.
return workspaceTopPadding > widgetPadding.top
- && cellLayoutBorderSpacingPx > widgetPadding.left
- && cellLayoutBorderSpacingPx > widgetPadding.top
- && cellLayoutBorderSpacingPx > widgetPadding.right
- && cellLayoutBorderSpacingPx > widgetPadding.bottom;
+ && cellLayoutBorderSpacePx.x > widgetPadding.left
+ && cellLayoutBorderSpacePx.y > widgetPadding.top
+ && cellLayoutBorderSpacePx.x > widgetPadding.right
+ && cellLayoutBorderSpacePx.y > widgetPadding.bottom;
}
public Builder toBuilder(Context context) {
@@ -600,7 +628,7 @@
// devices.
int numColumns = isTwoPanels ? inv.numColumns * 2 : inv.numColumns;
float usedWidth = (cellWidthPx * numColumns)
- + (cellLayoutBorderSpacingPx * (numColumns - 1))
+ + (cellLayoutBorderSpacePx.x * (numColumns - 1))
+ (desiredWorkspaceHorizontalMarginPx * 2);
// We do not subtract padding here, as we also scale the workspace padding if needed.
scaleX = availableWidthPx / usedWidth;
@@ -618,7 +646,7 @@
}
private int getCellLayoutHeight() {
- return (cellHeightPx * inv.numRows) + (cellLayoutBorderSpacingPx * (inv.numRows - 1));
+ return (cellHeightPx * inv.numRows) + (cellLayoutBorderSpacePx.y * (inv.numRows - 1));
}
/**
@@ -658,7 +686,7 @@
iconTextSizePx = (int) (pxFromSp(invIconTextSizeSp, mMetrics) * iconScale);
iconDrawablePaddingPx = (int) (iconDrawablePaddingOriginalPx * iconScale);
- setCellLayoutBorderSpacing((int) (cellLayoutBorderSpacingOriginalPx * scale));
+ cellLayoutBorderSpacePx = getCellLayoutBorderSpaceScaled(inv, scale);
if (isScalableGrid) {
PointF minCellHeightAndWidth = getMinCellHeightAndWidth();
@@ -757,14 +785,14 @@
// Check if the icons fit within the available height.
float contentUsedHeight = folderCellHeightPx * inv.numFolderRows
- + ((inv.numFolderRows - 1) * folderCellLayoutBorderSpacingPx);
+ + ((inv.numFolderRows - 1) * folderCellLayoutBorderSpacePx.y);
int contentMaxHeight = availableHeightPx - totalWorkspacePadding.y - folderBottomPanelSize
- folderMargin - folderContentPaddingTop;
float scaleY = contentMaxHeight / contentUsedHeight;
// Check if the icons fit within the available width.
float contentUsedWidth = folderCellWidthPx * inv.numFolderColumns
- + ((inv.numFolderColumns - 1) * folderCellLayoutBorderSpacingPx);
+ + ((inv.numFolderColumns - 1) * folderCellLayoutBorderSpacePx.x);
int contentMaxWidth = availableWidthPx - totalWorkspacePadding.x - folderMargin
- folderContentPaddingLeftRight * 2;
float scaleX = contentMaxWidth / contentUsedWidth;
@@ -790,10 +818,10 @@
folderCellWidthPx = (int) Math.max(minWidth, cellWidthPx * scale);
folderCellHeightPx = (int) Math.max(minHeight, cellHeightPx * scale);
- int borderSpacing = (int) (cellLayoutBorderSpacingOriginalPx * scale);
- folderCellLayoutBorderSpacingPx = borderSpacing;
- folderContentPaddingLeftRight = borderSpacing;
- folderContentPaddingTop = borderSpacing;
+ int scaledSpace = (int) (folderCellLayoutBorderSpaceOriginalPx * scale);
+ folderCellLayoutBorderSpacePx = new Point(scaledSpace, scaledSpace);
+ folderContentPaddingLeftRight = scaledSpace;
+ folderContentPaddingTop = scaledSpace;
} else {
int cellPaddingX = (int) (res.getDimensionPixelSize(R.dimen.folder_cell_x_padding)
* scale);
@@ -838,9 +866,9 @@
int cellLayoutTotalPadding =
isTwoPanels ? 4 * cellLayoutPaddingLeftRightPx : 2 * cellLayoutPaddingLeftRightPx;
int screenWidthPx = availableWidthPx - padding.x - cellLayoutTotalPadding;
- result.x = calculateCellWidth(screenWidthPx, cellLayoutBorderSpacingPx, numColumns);
+ result.x = calculateCellWidth(screenWidthPx, cellLayoutBorderSpacePx.x, numColumns);
result.y = calculateCellHeight(availableHeightPx - padding.y
- - cellLayoutBottomPaddingPx, cellLayoutBorderSpacingPx, inv.numRows);
+ - cellLayoutBottomPaddingPx, cellLayoutBorderSpacePx.y, inv.numRows);
return result;
}
@@ -1097,11 +1125,18 @@
writer.println(prefix + pxToDpStr("folderChildTextSizePx", folderChildTextSizePx));
writer.println(prefix + pxToDpStr("folderChildDrawablePaddingPx",
folderChildDrawablePaddingPx));
- writer.println(prefix + pxToDpStr("folderCellLayoutBorderSpacingPx",
- folderCellLayoutBorderSpacingPx));
+ writer.println(prefix + pxToDpStr("folderCellLayoutBorderSpaceOriginalPx",
+ folderCellLayoutBorderSpaceOriginalPx));
+ writer.println(prefix + pxToDpStr("folderCellLayoutBorderSpacePx Horizontal",
+ folderCellLayoutBorderSpacePx.x));
+ writer.println(prefix + pxToDpStr("folderCellLayoutBorderSpacePx Vertical",
+ folderCellLayoutBorderSpacePx.y));
- writer.println(prefix + pxToDpStr("cellLayoutBorderSpacingPx",
- cellLayoutBorderSpacingPx));
+ writer.println(prefix + pxToDpStr("cellLayoutBorderSpacePx Horizontal",
+ cellLayoutBorderSpacePx.x));
+ writer.println(prefix + pxToDpStr("cellLayoutBorderSpacePx Vertical",
+ cellLayoutBorderSpacePx.y));
+
writer.println(prefix + pxToDpStr("desiredWorkspaceHorizontalMarginPx",
desiredWorkspaceHorizontalMarginPx));
diff --git a/src/com/android/launcher3/ExtendedEditText.java b/src/com/android/launcher3/ExtendedEditText.java
index 92432a8..3b5b454 100644
--- a/src/com/android/launcher3/ExtendedEditText.java
+++ b/src/com/android/launcher3/ExtendedEditText.java
@@ -22,7 +22,6 @@
import android.util.AttributeSet;
import android.view.DragEvent;
import android.view.KeyEvent;
-import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
@@ -137,12 +136,5 @@
if (!TextUtils.isEmpty(getText())) {
setText("");
}
- if (isFocused()) {
- View nextFocus = focusSearch(View.FOCUS_DOWN);
- if (nextFocus != null) {
- nextFocus.requestFocus();
- }
- }
- hideKeyboard();
}
}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 92cc9e8..cfc14b6 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -31,6 +31,7 @@
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.graphics.Point;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -117,7 +118,12 @@
public float twoPanelPortraitMinCellWidthDps;
public float twoPanelLandscapeMinCellHeightDps;
public float twoPanelLandscapeMinCellWidthDps;
- public float borderSpacing;
+
+ public PointF borderSpace;
+ public PointF twoPanelPortraitBorderSpace;
+ public PointF twoPanelLandscapeBorderSpace;
+ public float folderBorderSpace;
+
public float horizontalMargin;
public float twoPanelLandscapeHorizontalMargin;
public float twoPanelPortraitHorizontalMargin;
@@ -217,15 +223,15 @@
.add(myDisplayOption);
result.iconSizes[DisplayOption.INDEX_DEFAULT] =
defaultDisplayOption.iconSizes[DisplayOption.INDEX_DEFAULT];
- for (int i = 1; i < DisplayOption.COUNT_TOTAL; i++) {
+ for (int i = 1; i < DisplayOption.COUNT_SIZES; i++) {
result.iconSizes[i] = Math.min(
defaultDisplayOption.iconSizes[i], myDisplayOption.iconSizes[i]);
}
result.minCellHeight = defaultDisplayOption.minCellHeight;
result.minCellWidth = defaultDisplayOption.minCellWidth;
- result.borderSpacing = defaultDisplayOption.borderSpacing;
- result.allAppsCellSpacing = defaultDisplayOption.allAppsCellSpacing;
+ result.borderSpaces[DisplayOption.INDEX_ALL_APPS] =
+ defaultDisplayOption.borderSpaces[DisplayOption.INDEX_ALL_APPS];
initGrid(context, myInfo, result, false);
}
@@ -289,8 +295,14 @@
twoPanelPortraitMinCellWidthDps = displayOption.twoPanelPortraitMinCellWidthDps;
twoPanelLandscapeMinCellHeightDps = displayOption.twoPanelLandscapeMinCellHeightDps;
twoPanelLandscapeMinCellWidthDps = displayOption.twoPanelLandscapeMinCellWidthDps;
- borderSpacing = displayOption.borderSpacing;
- allAppsCellSpacing = displayOption.allAppsCellSpacing;
+
+ borderSpace = displayOption.borderSpaces[DisplayOption.INDEX_DEFAULT];
+ twoPanelPortraitBorderSpace =
+ displayOption.borderSpaces[DisplayOption.INDEX_TWO_PANEL_PORTRAIT];
+ twoPanelLandscapeBorderSpace =
+ displayOption.borderSpaces[DisplayOption.INDEX_TWO_PANEL_LANDSCAPE];
+ allAppsCellSpacing = displayOption.borderSpaces[DisplayOption.INDEX_ALL_APPS].x;
+ folderBorderSpace = displayOption.folderBorderSpace;
horizontalMargin = displayOption.horizontalMargin;
twoPanelLandscapeHorizontalMargin = displayOption.twoPanelLandscapeHorizontalMargin;
@@ -556,7 +568,7 @@
// predefined size to avoid cache invalidation
out.iconSizes[DisplayOption.INDEX_DEFAULT] =
closestPoint.iconSizes[DisplayOption.INDEX_DEFAULT];
- for (int i = DisplayOption.INDEX_DEFAULT + 1; i < DisplayOption.COUNT_TOTAL; i++) {
+ for (int i = DisplayOption.INDEX_DEFAULT + 1; i < DisplayOption.COUNT_SIZES; i++) {
out.iconSizes[i] = Math.min(out.iconSizes[i],
out.iconSizes[DisplayOption.INDEX_DEFAULT]);
}
@@ -712,13 +724,12 @@
@VisibleForTesting
static final class DisplayOption {
+ static final int COUNT_SIZES = 5;
static final int INDEX_DEFAULT = 0;
static final int INDEX_LANDSCAPE = 1;
- static final int INDEX_ALL_APPS = 2;
- static final int INDEX_TWO_PANEL_PORTRAIT = 3;
- static final int INDEX_TWO_PANEL_LANDSCAPE = 4;
-
- static final int COUNT_TOTAL = 5;
+ static final int INDEX_TWO_PANEL_PORTRAIT = 2;
+ static final int INDEX_TWO_PANEL_LANDSCAPE = 3;
+ static final int INDEX_ALL_APPS = 4;
public final GridOption grid;
@@ -732,15 +743,16 @@
private float twoPanelPortraitMinCellWidthDps;
private float twoPanelLandscapeMinCellHeightDps;
private float twoPanelLandscapeMinCellWidthDps;
- private float allAppsCellSpacing;
- private float borderSpacing;
+
+ private float folderBorderSpace;
+ private final PointF[] borderSpaces = new PointF[COUNT_SIZES];
private float horizontalMargin;
private float twoPanelLandscapeHorizontalMargin;
private float twoPanelPortraitHorizontalMargin;
- private final float[] iconSizes = new float[COUNT_TOTAL];
- private final float[] textSizes = new float[COUNT_TOTAL];
+ private final float[] iconSizes = new float[COUNT_SIZES];
+ private final float[] textSizes = new float[COUNT_SIZES];
DisplayOption(GridOption grid, Context context, AttributeSet attrs, int defaultFlagValue) {
this.grid = grid;
@@ -767,9 +779,40 @@
twoPanelLandscapeMinCellWidthDps = a.getFloat(
R.styleable.ProfileDisplayOption_twoPanelLandscapeMinCellWidthDps,
twoPanelPortraitMinCellWidthDps);
- borderSpacing = a.getFloat(R.styleable.ProfileDisplayOption_borderSpacingDps, 0);
- allAppsCellSpacing = a.getFloat(R.styleable.ProfileDisplayOption_allAppsCellSpacingDps,
- borderSpacing);
+
+ float borderSpace = a.getFloat(R.styleable.ProfileDisplayOption_borderSpaceDps, 0);
+ float twoPanelPortraitBorderSpaceDps = a.getFloat(
+ R.styleable.ProfileDisplayOption_twoPanelPortraitBorderSpaceDps, borderSpace);
+ float twoPanelLandscapeBorderSpaceDps = a.getFloat(
+ R.styleable.ProfileDisplayOption_twoPanelLandscapeBorderSpaceDps, borderSpace);
+ float x;
+ float y;
+
+ x = a.getFloat(R.styleable.ProfileDisplayOption_borderSpaceHorizontalDps, borderSpace);
+ y = a.getFloat(R.styleable.ProfileDisplayOption_borderSpaceVerticalDps, borderSpace);
+ borderSpaces[INDEX_DEFAULT] = new PointF(x, y);
+ borderSpaces[INDEX_LANDSCAPE] = new PointF(x, y);
+
+ x = a.getFloat(
+ R.styleable.ProfileDisplayOption_twoPanelPortraitBorderSpaceHorizontalDps,
+ twoPanelPortraitBorderSpaceDps);
+ y = a.getFloat(
+ R.styleable.ProfileDisplayOption_twoPanelPortraitBorderSpaceVerticalDps,
+ twoPanelPortraitBorderSpaceDps);
+ borderSpaces[INDEX_TWO_PANEL_PORTRAIT] = new PointF(x, y);
+
+ x = a.getFloat(
+ R.styleable.ProfileDisplayOption_twoPanelLandscapeBorderSpaceHorizontalDps,
+ twoPanelLandscapeBorderSpaceDps);
+ y = a.getFloat(
+ R.styleable.ProfileDisplayOption_twoPanelLandscapeBorderSpaceVerticalDps,
+ twoPanelLandscapeBorderSpaceDps);
+ borderSpaces[INDEX_TWO_PANEL_LANDSCAPE] = new PointF(x, y);
+
+ x = y = a.getFloat(R.styleable.ProfileDisplayOption_allAppsCellSpacingDps,
+ borderSpace);
+ borderSpaces[INDEX_ALL_APPS] = new PointF(x, y);
+ folderBorderSpace = borderSpace;
iconSizes[INDEX_DEFAULT] =
a.getFloat(R.styleable.ProfileDisplayOption_iconImageSize, 0);
@@ -823,13 +866,19 @@
canBeDefault = false;
minCellHeight = 0;
minCellWidth = 0;
- borderSpacing = 0;
+ for (int i = 0; i < COUNT_SIZES; i++) {
+ iconSizes[i] = 0;
+ textSizes[i] = 0;
+ borderSpaces[i] = new PointF();
+ }
}
private DisplayOption multiply(float w) {
- for (int i = 0; i < COUNT_TOTAL; i++) {
+ for (int i = 0; i < COUNT_SIZES; i++) {
iconSizes[i] *= w;
textSizes[i] *= w;
+ borderSpaces[i].x *= w;
+ borderSpaces[i].y *= w;
}
minCellHeight *= w;
minCellWidth *= w;
@@ -837,8 +886,9 @@
twoPanelPortraitMinCellWidthDps *= w;
twoPanelLandscapeMinCellHeightDps *= w;
twoPanelLandscapeMinCellWidthDps *= w;
- borderSpacing *= w;
- allAppsCellSpacing *= w;
+
+ folderBorderSpace *= w;
+
horizontalMargin *= w;
twoPanelLandscapeHorizontalMargin *= w;
twoPanelPortraitHorizontalMargin *= w;
@@ -846,9 +896,11 @@
}
private DisplayOption add(DisplayOption p) {
- for (int i = 0; i < COUNT_TOTAL; i++) {
+ for (int i = 0; i < COUNT_SIZES; i++) {
iconSizes[i] += p.iconSizes[i];
textSizes[i] += p.textSizes[i];
+ borderSpaces[i].x += p.borderSpaces[i].x;
+ borderSpaces[i].y += p.borderSpaces[i].y;
}
minCellHeight += p.minCellHeight;
minCellWidth += p.minCellWidth;
@@ -856,8 +908,9 @@
twoPanelPortraitMinCellWidthDps += p.twoPanelPortraitMinCellWidthDps;
twoPanelLandscapeMinCellHeightDps += p.twoPanelLandscapeMinCellHeightDps;
twoPanelLandscapeMinCellWidthDps += p.twoPanelLandscapeMinCellWidthDps;
- borderSpacing += p.borderSpacing;
- allAppsCellSpacing += p.allAppsCellSpacing;
+
+ folderBorderSpace += p.folderBorderSpace;
+
horizontalMargin += p.horizontalMargin;
twoPanelLandscapeHorizontalMargin += p.twoPanelLandscapeHorizontalMargin;
twoPanelPortraitHorizontalMargin += p.twoPanelPortraitHorizontalMargin;
diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java
index 03e4ee7..048aaaa 100644
--- a/src/com/android/launcher3/LauncherSettings.java
+++ b/src/com/android/launcher3/LauncherSettings.java
@@ -95,6 +95,12 @@
public static final int ITEM_TYPE_DEEP_SHORTCUT = 6;
/**
+ * The favroite is a search action
+ */
+ public static final int ITEM_TYPE_SEARCH_ACTION = 7;
+
+
+ /**
* Type of the item is recents task.
* TODO(hyunyoungs): move constants not related to Favorites DB to a better location.
*/
diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java
index bebbf4f..fec1d68 100644
--- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java
+++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java
@@ -23,6 +23,7 @@
import android.app.WallpaperManager;
import android.content.Context;
+import android.graphics.Point;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
@@ -48,7 +49,7 @@
private int mCellWidth;
private int mCellHeight;
- private int mBorderSpacing;
+ private Point mBorderSpace;
private int mCountX;
private int mCountY;
@@ -64,12 +65,12 @@
}
public void setCellDimensions(int cellWidth, int cellHeight, int countX, int countY,
- int borderSpacing) {
+ Point borderSpace) {
mCellWidth = cellWidth;
mCellHeight = cellHeight;
mCountX = countX;
mCountY = countY;
- mBorderSpacing = borderSpacing;
+ mBorderSpace = borderSpace;
}
public View getChildAt(int cellX, int cellY) {
@@ -108,10 +109,10 @@
DeviceProfile profile = mActivity.getDeviceProfile();
((NavigableAppWidgetHostView) child).getWidgetInset(profile, mTempRect);
lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY,
- profile.appWidgetScale.x, profile.appWidgetScale.y, mBorderSpacing, mTempRect);
+ profile.appWidgetScale.x, profile.appWidgetScale.y, mBorderSpace, mTempRect);
} else {
lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY,
- mBorderSpacing, null);
+ mBorderSpace, null);
}
}
@@ -132,10 +133,10 @@
if (child instanceof NavigableAppWidgetHostView) {
((NavigableAppWidgetHostView) child).getWidgetInset(dp, mTempRect);
lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY,
- dp.appWidgetScale.x, dp.appWidgetScale.y, mBorderSpacing, mTempRect);
+ dp.appWidgetScale.x, dp.appWidgetScale.y, mBorderSpace, mTempRect);
} else {
lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY,
- mBorderSpacing, null);
+ mBorderSpace, null);
// Center the icon/folder
int cHeight = getCellContentHeight();
int cellPaddingY = dp.isScalableGrid && mContainerType == WORKSPACE
@@ -143,8 +144,9 @@
: (int) Math.max(0, ((lp.height - cHeight) / 2f));
// No need to add padding when cell layout border spacing is present.
- boolean noPaddingX = (dp.cellLayoutBorderSpacingPx > 0 && mContainerType == WORKSPACE)
- || (dp.folderCellLayoutBorderSpacingPx > 0 && mContainerType == FOLDER);
+ boolean noPaddingX =
+ (dp.cellLayoutBorderSpacePx.x > 0 && mContainerType == WORKSPACE)
+ || (dp.folderCellLayoutBorderSpacePx.x > 0 && mContainerType == FOLDER);
int cellPaddingX = noPaddingX
? 0
: mContainerType == WORKSPACE
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 6ce2930..8e76d82 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -91,6 +91,7 @@
import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
+import com.android.launcher3.model.data.SearchActionItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.pageindicators.WorkspacePageIndicator;
import com.android.launcher3.popup.PopupContainerWithArrow;
@@ -345,12 +346,12 @@
// Add missing cellLayout border in-between panels.
if (panelCount > 1) {
if (i % panelCount == leftPanelModulus) {
- paddingRight += grid.cellLayoutBorderSpacingPx / 2;
+ paddingRight += grid.cellLayoutBorderSpacePx.x / 2;
} else if (i % panelCount == rightPanelModulus) { // right side panel
- paddingLeft += grid.cellLayoutBorderSpacingPx / 2;
+ paddingLeft += grid.cellLayoutBorderSpacePx.x / 2;
} else { // middle panel
- paddingLeft += grid.cellLayoutBorderSpacingPx / 2;
- paddingRight += grid.cellLayoutBorderSpacingPx / 2;
+ paddingLeft += grid.cellLayoutBorderSpacePx.x / 2;
+ paddingRight += grid.cellLayoutBorderSpacePx.x / 2;
}
}
// SparseArrayMap doesn't keep the order
@@ -2735,11 +2736,17 @@
case ITEM_TYPE_APPLICATION:
case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
case LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT:
+ case LauncherSettings.Favorites.ITEM_TYPE_SEARCH_ACTION:
if (info instanceof AppInfo) {
// Came from all apps -- make a copy
info = ((AppInfo) info).makeWorkspaceItem();
d.dragInfo = info;
}
+ if (info instanceof SearchActionItemInfo) {
+ info = ((SearchActionItemInfo) info).createWorkspaceItem(
+ mLauncher.getModel());
+ d.dragInfo = info;
+ }
view = mLauncher.createShortcut(cellLayout, (WorkspaceItemInfo) info);
break;
case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
index 2491217..4c5a9e6 100644
--- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
+++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
@@ -105,8 +105,8 @@
int rowWidth = myRequestedWidth - mAppsView.getActiveRecyclerView().getPaddingLeft()
- mAppsView.getActiveRecyclerView().getPaddingRight();
- int cellWidth = DeviceProfile.calculateCellWidth(rowWidth, dp.cellLayoutBorderSpacingPx,
- dp.numShownHotseatIcons);
+ int cellWidth = DeviceProfile.calculateCellWidth(rowWidth,
+ dp.cellLayoutBorderSpacePx.x, dp.numShownHotseatIcons);
int iconVisibleSize = Math.round(ICON_VISIBLE_AREA_FACTOR * dp.iconSizePx);
int iconPadding = cellWidth - iconVisibleSize;
diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java
index cb3884d..399d142 100644
--- a/src/com/android/launcher3/folder/FolderAnimationManager.java
+++ b/src/com/android/launcher3/folder/FolderAnimationManager.java
@@ -239,9 +239,9 @@
mFolder, startRect, endRect, finalRadius, !mIsOpening));
// Create reveal animator for the folder content (capture the top 4 icons 2x2)
- int width = mDeviceProfile.folderCellLayoutBorderSpacingPx
+ int width = mDeviceProfile.folderCellLayoutBorderSpacePx.x
+ mDeviceProfile.folderCellWidthPx * 2;
- int height = mDeviceProfile.folderCellLayoutBorderSpacingPx
+ int height = mDeviceProfile.folderCellLayoutBorderSpacePx.y
+ mDeviceProfile.folderCellHeightPx * 2;
int page = mIsOpening ? mContent.getCurrentPage() : mContent.getDestinationPage();
int left = mContent.getPaddingLeft() + page * lp.width;
diff --git a/src/com/android/launcher3/folder/FolderNameEditText.java b/src/com/android/launcher3/folder/FolderNameEditText.java
index 6038a05..7c657f0 100644
--- a/src/com/android/launcher3/folder/FolderNameEditText.java
+++ b/src/com/android/launcher3/folder/FolderNameEditText.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
+import android.view.View;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
@@ -117,4 +118,16 @@
return super.setComposingText(cs, newCursorPos);
}
}
+
+ @Override
+ public void reset() {
+ super.reset();
+ if (isFocused()) {
+ View nextFocus = focusSearch(View.FOCUS_DOWN);
+ if (nextFocus != null) {
+ nextFocus.requestFocus();
+ }
+ }
+ hideKeyboard();
+ }
}
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index 468cb55..73e18f4 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -230,15 +230,16 @@
CellLayout firstScreen = mRootView.findViewById(R.id.workspace);
firstScreen.setPadding(mDp.workspacePadding.left + mDp.cellLayoutPaddingLeftRightPx,
mDp.workspacePadding.top,
- (mDp.isTwoPanels ? mDp.cellLayoutBorderSpacingPx / 2 : mDp.workspacePadding.right)
- + mDp.cellLayoutPaddingLeftRightPx,
- mDp.workspacePadding.bottom);
+ (mDp.isTwoPanels ? mDp.cellLayoutBorderSpacePx.x / 2
+ : mDp.workspacePadding.right) + mDp.cellLayoutPaddingLeftRightPx,
+ mDp.workspacePadding.bottom
+ );
mWorkspaceScreens.put(FIRST_SCREEN_ID, firstScreen);
if (mDp.isTwoPanels) {
CellLayout rightPanel = mRootView.findViewById(R.id.workspace_right);
rightPanel.setPadding(
- mDp.cellLayoutBorderSpacingPx / 2 + mDp.cellLayoutPaddingLeftRightPx,
+ mDp.cellLayoutBorderSpacePx.x / 2 + mDp.cellLayoutPaddingLeftRightPx,
mDp.workspacePadding.top,
mDp.workspacePadding.right + mDp.cellLayoutPaddingLeftRightPx,
mDp.workspacePadding.bottom
diff --git a/src/com/android/launcher3/model/BaseLoaderResults.java b/src/com/android/launcher3/model/BaseLoaderResults.java
index e9feb1c..3cae1e1 100644
--- a/src/com/android/launcher3/model/BaseLoaderResults.java
+++ b/src/com/android/launcher3/model/BaseLoaderResults.java
@@ -178,7 +178,7 @@
Log.d(TestProtocol.NULL_INT_SET, "bind (1) currentScreenIds: "
+ currentScreenIds
+ ", mCallBacks: "
- + mCallbacks.getClass().getSimpleName());
+ + mCallbacks.getClass().getName());
}
filterCurrentWorkspaceItems(currentScreenIds, mWorkspaceItems, currentWorkspaceItems,
otherWorkspaceItems);
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 8a494ba..a4f6f7a 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -584,6 +584,7 @@
&& pmHelper.isAppSuspended(targetPkg, c.user)) {
disabledState |= FLAG_DISABLED_SUSPENDED;
}
+ info.options = c.getInt(optionsIndex);
// App shortcuts that used to be automatically added to Launcher
// didn't always have the correct intent flags set, so do that
@@ -1050,7 +1051,10 @@
deviceProfile.getCellSize(cellSize);
FileLog.d(TAG, "DeviceProfile available width: " + deviceProfile.availableWidthPx
+ ", available height: " + deviceProfile.availableHeightPx
- + ", cellLayoutBorderSpacingPx: " + deviceProfile.cellLayoutBorderSpacingPx
+ + ", cellLayoutBorderSpacePx Horizontal: "
+ + deviceProfile.cellLayoutBorderSpacePx.x
+ + ", cellLayoutBorderSpacePx Vertical: "
+ + deviceProfile.cellLayoutBorderSpacePx.y
+ ", cellSize: " + cellSize);
}
diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java
index 4fdc412..97398de 100644
--- a/src/com/android/launcher3/model/data/ItemInfo.java
+++ b/src/com/android/launcher3/model/data/ItemInfo.java
@@ -164,6 +164,7 @@
public void copyFrom(ItemInfo info) {
id = info.id;
+ title = info.title;
cellX = info.cellX;
cellY = info.cellY;
spanX = info.spanX;
diff --git a/src/com/android/launcher3/model/data/SearchActionItemInfo.java b/src/com/android/launcher3/model/data/SearchActionItemInfo.java
index b3057d5..293c095 100644
--- a/src/com/android/launcher3/model/data/SearchActionItemInfo.java
+++ b/src/com/android/launcher3/model/data/SearchActionItemInfo.java
@@ -25,8 +25,15 @@
import androidx.annotation.Nullable;
+import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.LauncherModel;
+import com.android.launcher3.LauncherSettings;
+import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.logger.LauncherAtom.ItemInfo;
import com.android.launcher3.logger.LauncherAtom.SearchActionItem;
+import com.android.launcher3.model.AllAppsList;
+import com.android.launcher3.model.BaseModelUpdateTask;
+import com.android.launcher3.model.BgDataModel;
/**
* Represents a SearchAction with in launcher
@@ -38,13 +45,14 @@
public static final int FLAG_BADGE_WITH_PACKAGE = 1 << 3;
public static final int FLAG_PRIMARY_ICON_FROM_TITLE = 1 << 4;
public static final int FLAG_BADGE_WITH_COMPONENT_NAME = 1 << 5;
+ public static final int FLAG_ALLOW_PINNING = 1 << 6;
- private final String mFallbackPackageName;
+ private String mFallbackPackageName;
private int mFlags = 0;
- private final Icon mIcon;
+ private Icon mIcon;
// If true title does not contain any personal info and eligible for logging.
- private final boolean mIsPersonalTitle;
+ private boolean mIsPersonalTitle;
private Intent mIntent;
private PendingIntent mPendingIntent;
@@ -52,6 +60,7 @@
public SearchActionItemInfo(Icon icon, String packageName, UserHandle user,
CharSequence title, boolean isPersonalTitle) {
mIsPersonalTitle = isPersonalTitle;
+ this.itemType = LauncherSettings.Favorites.ITEM_TYPE_SEARCH_ACTION;
this.user = user == null ? Process.myUserHandle() : user;
this.title = title;
this.container = EXTENDED_CONTAINERS;
@@ -59,14 +68,18 @@
mIcon = icon;
}
- public SearchActionItemInfo(SearchActionItemInfo info) {
+ private SearchActionItemInfo(SearchActionItemInfo info) {
super(info);
- mIcon = info.mIcon;
- mFallbackPackageName = info.mFallbackPackageName;
- mFlags = info.mFlags;
- title = info.title;
- this.container = EXTENDED_CONTAINERS;
- this.mIsPersonalTitle = info.mIsPersonalTitle;
+ }
+
+ @Override
+ public void copyFrom(com.android.launcher3.model.data.ItemInfo info) {
+ super.copyFrom(info);
+ SearchActionItemInfo itemInfo = (SearchActionItemInfo) info;
+ this.mFallbackPackageName = itemInfo.mFallbackPackageName;
+ this.mIcon = itemInfo.mIcon;
+ this.mFlags = itemInfo.mFlags;
+ this.mIsPersonalTitle = itemInfo.mIsPersonalTitle;
}
/**
@@ -77,7 +90,7 @@
}
public void setFlags(int flags) {
- mFlags |= flags ;
+ mFlags |= flags;
}
@Override
@@ -134,4 +147,50 @@
.setContainerInfo(getContainerInfo())
.build();
}
+
+ /**
+ * Returns true if result supports drag/drop to home screen
+ */
+ public boolean supportsPinning() {
+ return hasFlags(FLAG_ALLOW_PINNING) && getIntentPackageName() != null;
+ }
+
+ /**
+ * Creates a {@link WorkspaceItemInfo} coorsponding to search action to be stored in launcher db
+ */
+ public WorkspaceItemInfo createWorkspaceItem(LauncherModel model) {
+ WorkspaceItemInfo info = new WorkspaceItemInfo();
+ info.title = title;
+ info.bitmap = bitmap;
+ info.intent = mIntent;
+
+ if (hasFlags(FLAG_SHOULD_START_FOR_RESULT)) {
+ info.options |= WorkspaceItemInfo.FLAG_START_FOR_RESULT;
+ }
+
+ model.enqueueModelUpdateTask(new BaseModelUpdateTask() {
+ @Override
+ public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
+
+ model.updateAndBindWorkspaceItem(() -> {
+ PackageItemInfo pkgInfo = new PackageItemInfo(getIntentPackageName(), user);
+ app.getIconCache().getTitleAndIconForApp(pkgInfo, false);
+ try (LauncherIcons li = LauncherIcons.obtain(app.getContext())) {
+ info.bitmap = li.badgeBitmap(info.bitmap.icon, pkgInfo.bitmap);
+ }
+ return info;
+ });
+ }
+ });
+ return info;
+ }
+
+ @Nullable
+ private String getIntentPackageName() {
+ if (mIntent != null) {
+ if (mIntent.getPackage() != null) return mIntent.getPackage();
+ return mFallbackPackageName;
+ }
+ return null;
+ }
}
diff --git a/src/com/android/launcher3/model/data/WorkspaceItemInfo.java b/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
index a395709..a195979 100644
--- a/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
+++ b/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
@@ -68,6 +68,11 @@
public static final int FLAG_SUPPORTS_WEB_UI = 1 << 3;
/**
+ *
+ */
+ public static final int FLAG_START_FOR_RESULT = 1 << 4;
+
+ /**
* The intent used to start the application.
*/
public Intent intent;
@@ -92,6 +97,8 @@
*/
@NonNull private String[] personKeys = Utilities.EMPTY_STRING_ARRAY;
+ public int options;
+
public WorkspaceItemInfo() {
itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
@@ -127,6 +134,7 @@
super.onAddToDatabase(writer);
writer.put(Favorites.TITLE, title)
.put(Favorites.INTENT, getIntent())
+ .put(Favorites.OPTIONS, options)
.put(Favorites.RESTORED, status);
if (!usingLowResIcon()) {
diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/TestProtocol.java
index ce01d4e..f67bac6 100644
--- a/src/com/android/launcher3/testing/TestProtocol.java
+++ b/src/com/android/launcher3/testing/TestProtocol.java
@@ -102,8 +102,8 @@
public static final String REQUEST_GET_ACTIVITIES_CREATED_COUNT =
"get-activities-created-count";
public static final String REQUEST_GET_ACTIVITIES = "get-activities";
- public static final String REQUEST_GET_FOCUSED_TASK_WIDTH_FOR_TABLET =
- "get-focused-task-width-for-tablet";
+ public static final String REQUEST_GET_FOCUSED_TASK_HEIGHT_FOR_TABLET =
+ "get-focused-task-height-for-tablet";
public static Long sForcePauseTimeout;
public static final String REQUEST_SET_FORCE_PAUSE_TIMEOUT = "set-force-pause-timeout";
diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java
index b53f96e..5e907a4 100644
--- a/src/com/android/launcher3/touch/ItemClickHandler.java
+++ b/src/com/android/launcher3/touch/ItemClickHandler.java
@@ -46,6 +46,8 @@
import com.android.launcher3.Utilities;
import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderIcon;
+import com.android.launcher3.logging.InstanceId;
+import com.android.launcher3.logging.InstanceIdSequence;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.FolderInfo;
@@ -314,6 +316,12 @@
intent = new Intent(intent);
intent.setPackage(null);
}
+ if ((si.options & WorkspaceItemInfo.FLAG_START_FOR_RESULT) != 0) {
+ launcher.startActivityForResult(item.getIntent(), 0);
+ InstanceId instanceId = new InstanceIdSequence().newInstanceId();
+ launcher.logAppLaunch(launcher.getStatsLogManager(), item, instanceId);
+ return;
+ }
}
if (v != null && launcher.supportsAdaptiveIconAnimation(v)) {
// Preload the icon to reduce latency b/w swapping the floating view with the original.
diff --git a/src/com/android/launcher3/views/BubbleTextHolder.java b/src/com/android/launcher3/views/BubbleTextHolder.java
index 47d3563..78aac06 100644
--- a/src/com/android/launcher3/views/BubbleTextHolder.java
+++ b/src/com/android/launcher3/views/BubbleTextHolder.java
@@ -16,10 +16,19 @@
package com.android.launcher3.views;
import com.android.launcher3.BubbleTextView;
+import com.android.launcher3.model.data.ItemInfo;
/**
* Views that contain {@link BubbleTextView} should implement this interface.
*/
public interface BubbleTextHolder {
BubbleTextView getBubbleText();
+
+ /**
+ * Called when new {@link ItemInfo} is set to {@link BubbleTextView}
+ *
+ * @param itemInfo the new itemInfo
+ */
+ default void onItemInfoChanged(ItemInfo itemInfo) {
+ }
}
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java
index d77d99d..bba1016 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java
@@ -121,29 +121,29 @@
localPadding.set(widgetPadding);
}
minSpanX = Math.max(minSpanX,
- getSpanX(localPadding, minResizeWidth, dp.cellLayoutBorderSpacingPx,
+ getSpanX(localPadding, minResizeWidth, dp.cellLayoutBorderSpacePx.x,
cellSize.x));
minSpanY = Math.max(minSpanY,
- getSpanY(localPadding, minResizeHeight, dp.cellLayoutBorderSpacingPx,
+ getSpanY(localPadding, minResizeHeight, dp.cellLayoutBorderSpacePx.y,
cellSize.y));
if (ATLEAST_S) {
if (maxResizeWidth > 0) {
- maxSpanX = Math.min(maxSpanX,
- getSpanX(localPadding, maxResizeWidth, dp.cellLayoutBorderSpacingPx,
- cellSize.x));
+ maxSpanX = Math.min(maxSpanX, getSpanX(localPadding, maxResizeWidth,
+ dp.cellLayoutBorderSpacePx.x, cellSize.x));
}
if (maxResizeHeight > 0) {
- maxSpanY = Math.min(maxSpanY,
- getSpanY(localPadding, maxResizeHeight, dp.cellLayoutBorderSpacingPx,
- cellSize.y));
+ maxSpanY = Math.min(maxSpanY, getSpanY(localPadding, maxResizeHeight,
+ dp.cellLayoutBorderSpacePx.y, cellSize.y));
}
}
spanX = Math.max(spanX,
- getSpanX(localPadding, minWidth, dp.cellLayoutBorderSpacingPx, cellSize.x));
+ getSpanX(localPadding, minWidth, dp.cellLayoutBorderSpacePx.x,
+ cellSize.x));
spanY = Math.max(spanY,
- getSpanY(localPadding, minHeight, dp.cellLayoutBorderSpacingPx, cellSize.y));
+ getSpanY(localPadding, minHeight, dp.cellLayoutBorderSpacePx.y,
+ cellSize.y));
}
if (ATLEAST_S) {
diff --git a/src/com/android/launcher3/widget/util/WidgetSizes.java b/src/com/android/launcher3/widget/util/WidgetSizes.java
index b211f4c..fb2d63b 100644
--- a/src/com/android/launcher3/widget/util/WidgetSizes.java
+++ b/src/com/android/launcher3/widget/util/WidgetSizes.java
@@ -114,8 +114,8 @@
private static Size getWidgetSizePx(DeviceProfile profile, int spanX, int spanY,
@Nullable Point recycledCellSize) {
- final int hBorderSpacing = (spanX - 1) * profile.cellLayoutBorderSpacingPx;
- final int vBorderSpacing = (spanY - 1) * profile.cellLayoutBorderSpacingPx;
+ final int hBorderSpacing = (spanX - 1) * profile.cellLayoutBorderSpacePx.x;
+ final int vBorderSpacing = (spanY - 1) * profile.cellLayoutBorderSpacePx.y;
if (recycledCellSize == null) {
recycledCellSize = new Point();
}
diff --git a/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java b/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
index 24ae583..b534a41 100644
--- a/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
+++ b/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
@@ -46,6 +46,7 @@
@RunWith(AndroidJUnit4.class)
public final class LauncherAppWidgetProviderInfoTest {
+ private static final int SPACE_SIZE = 10;
private static final int CELL_SIZE = 50;
private static final int NUM_OF_COLS = 4;
private static final int NUM_OF_ROWS = 5;
@@ -159,7 +160,7 @@
AppWidgetHostView.getDefaultPaddingForWidget(mContext, null, padding);
int maxPadding = Math.max(Math.max(padding.left, padding.right),
Math.max(padding.top, padding.bottom));
- dp.cellLayoutBorderSpacingPx = maxPadding + 1;
+ dp.cellLayoutBorderSpacePx.x = dp.cellLayoutBorderSpacePx.y = maxPadding + 1;
Mockito.when(dp.shouldInsetWidgets()).thenReturn(true);
LauncherAppWidgetProviderInfo info = new LauncherAppWidgetProviderInfo();
@@ -182,7 +183,7 @@
AppWidgetHostView.getDefaultPaddingForWidget(mContext, null, padding);
int maxPadding = Math.max(Math.max(padding.left, padding.right),
Math.max(padding.top, padding.bottom));
- dp.cellLayoutBorderSpacingPx = maxPadding - 1;
+ dp.cellLayoutBorderSpacePx.x = dp.cellLayoutBorderSpacePx.y = maxPadding - 1;
Mockito.when(dp.shouldInsetWidgets()).thenReturn(false);
LauncherAppWidgetProviderInfo info = new LauncherAppWidgetProviderInfo();
info.minWidth = CELL_SIZE * 3;
@@ -262,6 +263,7 @@
return null;
}).when(profile).getCellSize(any(Point.class));
Mockito.when(profile.getCellSize()).thenReturn(new Point(CELL_SIZE, CELL_SIZE));
+ profile.cellLayoutBorderSpacePx = new Point(SPACE_SIZE, SPACE_SIZE);
Mockito.when(profile.shouldInsetWidgets()).thenReturn(true);
InvariantDeviceProfile idp = new InvariantDeviceProfile();
diff --git a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java
index 7137c00..20366aa 100644
--- a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java
+++ b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java
@@ -138,6 +138,10 @@
}
}
+ int getTaskCount() {
+ return getTasks().size();
+ }
+
/**
* Returns whether Overview has tasks.
*/
@@ -169,7 +173,7 @@
}
try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
"want to assert overview actions view visibility")) {
- if (mLauncher.isTablet() && !isOverviewSnappedToFocusedTask()) {
+ if (mLauncher.isTablet() && !isOverviewSnappedToFocusedTaskForTablet()) {
mLauncher.waitUntilLauncherObjectGone("action_buttons");
} else {
mLauncher.waitForLauncherObject("action_buttons");
@@ -178,14 +182,10 @@
}
/**
- * Returns if focused task is currently snapped task in overview.
+ * Returns if focused task is currently snapped task in tablet grid overview.
*/
- private boolean isOverviewSnappedToFocusedTask() {
- if (!mLauncher.isTablet()) {
- // Focused task only exists in tablet's grid-overview
- return false;
- }
- UiObject2 focusedTask = getFocusedTask();
+ private boolean isOverviewSnappedToFocusedTaskForTablet() {
+ UiObject2 focusedTask = getFocusedTaskForTablet();
if (focusedTask == null) {
return false;
}
@@ -197,14 +197,14 @@
/**
* Returns Overview focused task if it exists.
*/
- private UiObject2 getFocusedTask() {
+ UiObject2 getFocusedTaskForTablet() {
final List<UiObject2> taskViews = getTasks();
if (taskViews.size() == 0) {
return null;
}
- int focusedTaskWidth = mLauncher.getFocusedTaskWidth();
+ int focusedTaskHeight = mLauncher.getFocusedTaskHeightForTablet();
for (UiObject2 task : taskViews) {
- if (task.getVisibleBounds().width() == focusedTaskWidth) {
+ if (task.getVisibleBounds().height() == focusedTaskHeight) {
return task;
}
}
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index f83c031..55fb2c1 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -321,8 +321,8 @@
.getBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD);
}
- int getFocusedTaskWidth() {
- return getTestInfo(TestProtocol.REQUEST_GET_FOCUSED_TASK_WIDTH_FOR_TABLET).getInt(
+ int getFocusedTaskHeightForTablet() {
+ return getTestInfo(TestProtocol.REQUEST_GET_FOCUSED_TASK_HEIGHT_FOR_TABLET).getInt(
TestProtocol.TEST_INFO_RESPONSE_FIELD);
}
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index 71c0abb..9419839 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -47,29 +47,53 @@
mOverview.verifyActiveContainer();
}
+ private int getVisibleHeight() {
+ return mTask.getVisibleBounds().height();
+ }
+
/**
- * Swipes the task up.
+ * Dismisses the task by swiping up.
*/
public void dismiss() {
try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck();
LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
- "want to dismiss a task")) {
+ "want to dismiss an overview task")) {
verifyActiveContainer();
- // Dismiss the task via flinging it up.
- final Rect taskBounds = mLauncher.getVisibleBounds(mTask);
- final int centerX = taskBounds.centerX();
- final int centerY = taskBounds.centerY();
- mLauncher.executeAndWaitForLauncherEvent(
- () -> mLauncher.linearGesture(centerX, centerY, centerX, 0, 10, false,
- LauncherInstrumentation.GestureScope.INSIDE),
- event -> TestProtocol.DISMISS_ANIMATION_ENDS_MESSAGE.equals(
- event.getClassName()),
- () -> "Didn't receive a dismiss animation ends message: " + centerX + ", "
- + centerY,
- "swiping to dismiss");
+ int taskCountBeforeDismiss = mOverview.getTaskCount();
+ mLauncher.assertNotEquals("Unable to find a task", 0, taskCountBeforeDismiss);
+ if (taskCountBeforeDismiss == 1) {
+ dismissBySwipingUp();
+ return;
+ }
+
+ boolean taskWasFocused = mLauncher.isTablet() && getVisibleHeight() == mLauncher
+ .getFocusedTaskHeightForTablet();
+
+ dismissBySwipingUp();
+
+ try (LauncherInstrumentation.Closable c2 = mLauncher.addContextLayer("dismissed")) {
+ if (taskWasFocused) {
+ mLauncher.assertNotNull("No task became focused",
+ mOverview.getFocusedTaskForTablet());
+ }
+ }
}
}
+ private void dismissBySwipingUp() {
+ verifyActiveContainer();
+ // Dismiss the task via flinging it up.
+ final Rect taskBounds = mLauncher.getVisibleBounds(mTask);
+ final int centerX = taskBounds.centerX();
+ final int centerY = taskBounds.centerY();
+ mLauncher.executeAndWaitForLauncherEvent(
+ () -> mLauncher.linearGesture(centerX, centerY, centerX, 0, 10, false,
+ LauncherInstrumentation.GestureScope.INSIDE),
+ event -> TestProtocol.DISMISS_ANIMATION_ENDS_MESSAGE.equals(event.getClassName()),
+ () -> "Didn't receive a dismiss animation ends message: " + centerX + ", "
+ + centerY, "swiping to dismiss");
+ }
+
/**
* Clicks at the task.
*/