Merge "Add hotseat icons to TestWorkspaceBuilder and submit everything in a batch" into tm-qpr-dev am: 5587ef3262

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/19759371

Change-Id: Ib2dcd7701e75c6c5d4ad3736859f67e473f7d843
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Sebastián Franco
2022-09-13 17:23:46 +00:00
committed by Automerger Merge Worker
4 changed files with 188 additions and 52 deletions
@@ -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.launcher3.celllayout;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.util.ContentWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class FavoriteItemsTransaction {
private ArrayList<ItemInfo> mItemsToSubmit;
private Context mContext;
private ContentResolver mResolver;
public AbstractLauncherUiTest mTest;
public FavoriteItemsTransaction(Context context, AbstractLauncherUiTest test) {
mItemsToSubmit = new ArrayList<>();
mContext = context;
mResolver = mContext.getContentResolver();
mTest = test;
}
public FavoriteItemsTransaction addItem(ItemInfo itemInfo) {
this.mItemsToSubmit.add(itemInfo);
return this;
}
public FavoriteItemsTransaction removeLast() {
this.mItemsToSubmit.remove(this.mItemsToSubmit.size() - 1);
return this;
}
/**
* Commits all the ItemInfo into the database of Favorites
**/
public void commit() throws ExecutionException, InterruptedException {
List<ContentValues> values = new ArrayList<>();
for (ItemInfo item : this.mItemsToSubmit) {
ContentWriter writer = new ContentWriter(mContext);
item.onAddToDatabase(writer);
writer.put(LauncherSettings.Favorites._ID, item.id);
values.add(writer.getValues(mContext));
}
// Submit the icons to the database in the model thread to prevent race conditions
MODEL_EXECUTOR.submit(() -> mResolver.bulkInsert(LauncherSettings.Favorites.CONTENT_URI,
values.toArray(new ContentValues[0]))).get();
// Reload the state of the Launcher
MAIN_EXECUTOR.submit(() -> LauncherAppState.getInstance(
mContext).getModel().forceReload()).get();
}
}
@@ -47,6 +47,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@SmallTest
@@ -58,7 +59,7 @@ public class ReorderWidgets extends AbstractLauncherUiTest {
private static final String TAG = ReorderWidgets.class.getSimpleName();
TestWorkspaceBuilder mBoardBuilder;
TestWorkspaceBuilder mWorkspaceBuilder;
private View getViewAt(int cellX, int cellY) {
return getFromLauncher(l -> l.getWorkspace().getScreenWithId(
@@ -76,7 +77,7 @@ public class ReorderWidgets extends AbstractLauncherUiTest {
@Before
public void setup() throws Throwable {
mBoardBuilder = new TestWorkspaceBuilder(this);
mWorkspaceBuilder = new TestWorkspaceBuilder(this, mTargetContext);
TaplTestsLauncher3.initialize(this);
clearHomescreen();
}
@@ -87,7 +88,7 @@ public class ReorderWidgets extends AbstractLauncherUiTest {
private boolean validateBoard(CellLayoutBoard board) {
boolean match = true;
Point cellDimensions = getCellDimensions();
for (CellLayoutBoard.WidgetRect widgetRect: board.getWidgets()) {
for (CellLayoutBoard.WidgetRect widgetRect : board.getWidgets()) {
if (widgetRect.shouldIgnore()) {
continue;
}
@@ -108,10 +109,13 @@ public class ReorderWidgets extends AbstractLauncherUiTest {
return match;
}
private void runTestCase(ReorderTestCase testCase) {
private void runTestCase(ReorderTestCase testCase)
throws ExecutionException, InterruptedException {
Point mainWidgetCellPos = testCase.mStart.getMain();
mBoardBuilder.buildBoard(testCase.mStart);
FavoriteItemsTransaction transaction =
new FavoriteItemsTransaction(mTargetContext, this);
mWorkspaceBuilder.buildFromBoard(testCase.mStart, transaction).commit();
Widget widget = mLauncher.getWorkspace().getWidgetAtCell(mainWidgetCellPos.x,
mainWidgetCellPos.y);
@@ -132,7 +136,8 @@ public class ReorderWidgets extends AbstractLauncherUiTest {
*
* @param testCaseMap map containing all the tests per grid size (Point)
*/
private void runTestCaseMap(Map<Point, ReorderTestCase> testCaseMap, String testName) {
private void runTestCaseMap(Map<Point, ReorderTestCase> testCaseMap, String testName)
throws ExecutionException, InterruptedException {
Point iconGridDimensions = mLauncher.getWorkspace().getIconGridDimensions();
Log.d(TAG, "Running test " + testName + " for grid " + iconGridDimensions);
Assume.assumeTrue(
@@ -143,26 +148,26 @@ public class ReorderWidgets extends AbstractLauncherUiTest {
@ScreenRecord // b/242323136
@Test
public void simpleReorder() {
public void simpleReorder() throws ExecutionException, InterruptedException {
runTestCaseMap(SimpleReorderCase.TEST_BY_GRID_SIZE,
SimpleReorderCase.class.getSimpleName());
}
@ScreenRecord // b/242323136
@Test
public void pushTest() {
public void pushTest() throws ExecutionException, InterruptedException {
runTestCaseMap(PushReorderCase.TEST_BY_GRID_SIZE, PushReorderCase.class.getSimpleName());
}
@ScreenRecord // b/242323136
@Test
public void fullReorder() {
public void fullReorder() throws ExecutionException, InterruptedException {
runTestCaseMap(FullReorderCase.TEST_BY_GRID_SIZE, FullReorderCase.class.getSimpleName());
}
@ScreenRecord // b/242323136
@Test
public void moveOutReorder() {
public void moveOutReorder() throws ExecutionException, InterruptedException {
runTestCaseMap(MoveOutReorderCase.TEST_BY_GRID_SIZE,
MoveOutReorderCase.class.getSimpleName());
}
@@ -15,9 +15,12 @@
*/
package com.android.launcher3.celllayout;
import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID;
import static com.android.launcher3.util.WidgetUtils.createWidgetInfo;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.graphics.Rect;
import android.os.Process;
import android.os.UserHandle;
@@ -25,8 +28,10 @@ import android.util.Log;
import androidx.test.core.app.ApplicationProvider;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.ui.AbstractLauncherUiTest;
@@ -35,6 +40,7 @@ import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
public class TestWorkspaceBuilder {
private static final String TAG = "CellLayoutBoardBuilder";
private static final ComponentName APP_COMPONENT_NAME = new ComponentName(
"com.google.android.calculator", "com.android.calculator2.Calculator");
@@ -42,69 +48,118 @@ public class TestWorkspaceBuilder {
private UserHandle mMyUser;
public TestWorkspaceBuilder(AbstractLauncherUiTest test) {
private Context mContext;
private ContentResolver mResolver;
public TestWorkspaceBuilder(AbstractLauncherUiTest test, Context context) {
mTest = test;
mMyUser = Process.myUserHandle();
mContext = context;
mResolver = mContext.getContentResolver();
}
private static final String TAG = "CellLayoutBoardBuilder";
/**
* Fills the given rect in WidgetRect with 1x1 widgets. This is useful to equalize cases.
*/
private void fillWithWidgets(CellLayoutBoard.WidgetRect widgetRect) {
private FavoriteItemsTransaction fillWithWidgets(CellLayoutBoard.WidgetRect widgetRect,
FavoriteItemsTransaction transaction) {
int initX = widgetRect.getCellX();
int initY = widgetRect.getCellY();
for (int x = initX; x < initX + widgetRect.getSpanX(); x++) {
for (int y = initY; y < initY + widgetRect.getSpanY(); y++) {
try {
// this widgets are filling, we don't care if we can't place them
addWidgetInCell(
ItemInfo item = createWidgetInCell(
new CellLayoutBoard.WidgetRect(CellLayoutBoard.CellType.IGNORE,
new Rect(x, y, x, y))
);
transaction.addItem(item);
} catch (Exception e) {
Log.d(TAG, "Unable to place filling widget at " + x + "," + y);
}
}
}
return transaction;
}
private void addWidgetInCell(CellLayoutBoard.WidgetRect widgetRect) {
private int getID() {
return LauncherSettings.Settings.call(
mResolver, LauncherSettings.Settings.METHOD_NEW_ITEM_ID)
.getInt(LauncherSettings.Settings.EXTRA_VALUE);
}
private AppInfo getApp() {
return new AppInfo(APP_COMPONENT_NAME, "test icon", mMyUser,
AppInfo.makeLaunchIntent(APP_COMPONENT_NAME));
}
private void addCorrespondingWidgetRect(CellLayoutBoard.WidgetRect widgetRect,
FavoriteItemsTransaction transaction) {
if (widgetRect.mType == 'x') {
fillWithWidgets(widgetRect, transaction);
} else {
transaction.addItem(createWidgetInCell(widgetRect));
}
}
/**
* Builds the given board into the transaction
*/
public FavoriteItemsTransaction buildFromBoard(CellLayoutBoard board,
FavoriteItemsTransaction transaction) {
board.getWidgets().forEach(
(widgetRect) -> addCorrespondingWidgetRect(widgetRect, transaction));
board.getIcons().forEach((iconPoint) ->
transaction.addItem(createIconInCell(iconPoint))
);
return transaction;
}
/**
* Fills the hotseat row with apps instead of suggestions, for this to work the workspace should
* be clean otherwise this doesn't overrides the existing icons.
*/
public FavoriteItemsTransaction fillHotseatIcons(FavoriteItemsTransaction transaction) {
int hotseatCount = InvariantDeviceProfile.INSTANCE.get(mContext).numShownHotseatIcons;
for (int i = 0; i < hotseatCount; i++) {
transaction.addItem(getHotseatValues(i));
}
return transaction;
}
private ItemInfo createWidgetInCell(CellLayoutBoard.WidgetRect widgetRect) {
LauncherAppWidgetProviderInfo info = TestViewHelpers.findWidgetProvider(mTest, false);
LauncherAppWidgetInfo item = createWidgetInfo(info,
ApplicationProvider.getApplicationContext(), true);
item.id = getID();
item.cellX = widgetRect.getCellX();
item.cellY = widgetRect.getCellY();
item.spanX = widgetRect.getSpanX();
item.spanY = widgetRect.getSpanY();
mTest.addItemToScreen(item);
item.screenId = FIRST_SCREEN_ID;
return item;
}
private void addIconInCell(CellLayoutBoard.IconPoint iconPoint) {
AppInfo appInfo = new AppInfo(APP_COMPONENT_NAME, "test icon", mMyUser,
AppInfo.makeLaunchIntent(APP_COMPONENT_NAME));
appInfo.cellX = iconPoint.getCoord().x;
appInfo.cellY = iconPoint.getCoord().y;
appInfo.minSpanY = appInfo.minSpanX = appInfo.spanX = appInfo.spanY = 1;
appInfo.container = LauncherSettings.Favorites.CONTAINER_DESKTOP;
appInfo.componentName = APP_COMPONENT_NAME;
mTest.addItemToScreen(new WorkspaceItemInfo(appInfo));
private ItemInfo createIconInCell(CellLayoutBoard.IconPoint iconPoint) {
WorkspaceItemInfo item = new WorkspaceItemInfo(getApp());
item.id = getID();
item.screenId = FIRST_SCREEN_ID;
item.cellX = iconPoint.getCoord().x;
item.cellY = iconPoint.getCoord().y;
item.minSpanY = item.minSpanX = item.spanX = item.spanY = 1;
item.container = LauncherSettings.Favorites.CONTAINER_DESKTOP;
return item;
}
private void addCorrespondingWidgetRect(CellLayoutBoard.WidgetRect widgetRect) {
if (widgetRect.mType == 'x') {
fillWithWidgets(widgetRect);
} else {
addWidgetInCell(widgetRect);
}
}
public void buildBoard(CellLayoutBoard board) {
board.getWidgets().forEach(this::addCorrespondingWidgetRect);
board.getIcons().forEach(this::addIconInCell);
private ItemInfo getHotseatValues(int x) {
WorkspaceItemInfo item = new WorkspaceItemInfo(getApp());
item.id = getID();
item.cellX = x;
item.cellY = 0;
item.minSpanY = item.minSpanX = item.spanX = item.spanY = 1;
item.rank = x;
item.screenId = x;
item.container = LauncherSettings.Favorites.CONTAINER_HOTSEAT;
return item;
}
}
@@ -31,13 +31,13 @@ public class FullReorderCase {
+ "xxxxx\n"
+ "222mm\n"
+ "222mm\n"
+ "ad111\n"
+ "bc111";
+ "ii111\n"
+ "ii111";
private static final Point MOVE_TO_5x5 = new Point(0, 4);
private static final String END_BOARD_STR_5x5 = ""
+ "xxxxx\n"
+ "222ad\n"
+ "222bc\n"
+ "222ii\n"
+ "222ii\n"
+ "mm111\n"
+ "mm111";
private static final ReorderTestCase TEST_CASE_5x5 = new ReorderTestCase(START_BOARD_STR_5x5,
@@ -50,13 +50,13 @@ public class FullReorderCase {
+ "xxxxxx\n"
+ "2222mm\n"
+ "2222mm\n"
+ "ad1111\n"
+ "bc1111";
+ "ii1111\n"
+ "ii1111";
private static final Point MOVE_TO_6x5 = new Point(0, 4);
private static final String END_BOARD_STR_6x5 = ""
+ "xxxxxx\n"
+ "2222ad\n"
+ "2222bc\n"
+ "2222ii\n"
+ "2222ii\n"
+ "mm1111\n"
+ "mm1111";
private static final ReorderTestCase TEST_CASE_6x5 = new ReorderTestCase(START_BOARD_STR_6x5,
@@ -68,13 +68,13 @@ public class FullReorderCase {
private static final String START_BOARD_STR_4x4 = ""
+ "xxxx\n"
+ "22mm\n"
+ "admm\n"
+ "bc11";
+ "iimm\n"
+ "ii11";
private static final Point MOVE_TO_4x4 = new Point(0, 3);
private static final String END_BOARD_STR_4x4 = ""
+ "xxxx\n"
+ "22ad\n"
+ "mmbc\n"
+ "22ii\n"
+ "mmii\n"
+ "mm11";
private static final ReorderTestCase TEST_CASE_4x4 = new ReorderTestCase(START_BOARD_STR_4x4,