diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index 867d2e5a51..01c4255569 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -125,8 +125,8 @@ public class AddWorkspaceItemsTask implements ModelUpdateTask { ModelWriter writer = taskController.getModelWriter(); for (ItemInfo item : filteredItems) { // Find appropriate space for the item. - int[] coords = mItemSpaceFinder.findSpaceForItem( - workspaceScreens, addedWorkspaceScreensFinal, item.spanX, item.spanY); + int[] coords = mItemSpaceFinder.findSpaceForItem(workspaceScreens, + addedWorkspaceScreensFinal, addedItemsFinal, item.spanX, item.spanY); int screenId = coords[0]; ItemInfo itemInfo; diff --git a/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java b/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java index ae481736fd..b6b953e8d5 100644 --- a/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java +++ b/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java @@ -54,8 +54,8 @@ public class WorkspaceItemSpaceFinder { * * @return screenId and the coordinates for the item in an int array of size 3. */ - public int[] findSpaceForItem( - IntArray workspaceScreens, IntArray addedWorkspaceScreensFinal, int spanX, int spanY) { + public int[] findSpaceForItem(IntArray workspaceScreens, IntArray addedWorkspaceScreensFinal, + ArrayList addItemsFinal, int spanX, int spanY) { LongSparseArray> screenItems = new LongSparseArray<>(); // Use sBgItemsIdMap as all the items are already loaded. @@ -72,6 +72,18 @@ public class WorkspaceItemSpaceFinder { } } + // Add items that are due to be added to the database from AddWorkspaceItemsTask#execute. + for (ItemInfo info : addItemsFinal) { + if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { + ArrayList items = screenItems.get(info.screenId); + if (items == null) { + items = new ArrayList<>(); + screenItems.put(info.screenId, items); + } + items.add(info); + } + } + // Find appropriate space for the item. int screenId = 0; int[] coordinates = new int[2]; diff --git a/src/com/android/launcher3/pm/InstallSessionHelper.java b/src/com/android/launcher3/pm/InstallSessionHelper.java index d7b8af15f5..b5ed5610b2 100644 --- a/src/com/android/launcher3/pm/InstallSessionHelper.java +++ b/src/com/android/launcher3/pm/InstallSessionHelper.java @@ -225,8 +225,11 @@ public class InstallSessionHelper { // not already present. For general app installations however, we do support it. if (!Flags.enableSupportForArchiving() || !sessionInfo.isUnarchival()) { FileLog.d(LOG, "Adding package name to install queue: " - + sessionInfo.getAppPackageName()); - + + sessionInfo.getAppPackageName() + + "Package installer: " + + sessionInfo.getInstallerPackageName() + + "Session id: " + + sessionInfo.getSessionId()); ItemInstallQueue.INSTANCE.get(mAppContext) .queueItem(sessionInfo.getAppPackageName(), getUserHandle(sessionInfo)); } diff --git a/tests/multivalentTests/src/com/android/launcher3/model/AbstractWorkspaceModelTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/AbstractWorkspaceModelTest.kt index 22648a4241..81fe019cd2 100644 --- a/tests/multivalentTests/src/com/android/launcher3/model/AbstractWorkspaceModelTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/model/AbstractWorkspaceModelTest.kt @@ -21,6 +21,7 @@ import com.android.launcher3.InvariantDeviceProfile import com.android.launcher3.LauncherAppState import com.android.launcher3.LauncherModel import com.android.launcher3.model.data.AppInfo +import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.model.data.WorkspaceItemInfo import com.android.launcher3.util.GridOccupancy import com.android.launcher3.util.IntArray @@ -50,6 +51,7 @@ abstract class AbstractWorkspaceModelTest { protected lateinit var mAppState: LauncherAppState protected lateinit var mExistingScreens: IntArray protected lateinit var mNewScreens: IntArray + protected lateinit var mAddedWorkspaceItems: ArrayList protected lateinit var mScreenOccupancy: IntSparseArrayMap val model: LauncherModel @@ -64,6 +66,7 @@ abstract class AbstractWorkspaceModelTest { mExistingScreens = IntArray() mScreenOccupancy = IntSparseArrayMap() mNewScreens = IntArray() + mAddedWorkspaceItems = ArrayList() } /** Sets up workspaces with the given screen IDs with some items and a 2x2 space. */ diff --git a/tests/multivalentTests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.kt index d19048d87e..356b04a3d6 100644 --- a/tests/multivalentTests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/model/AddWorkspaceItemsTaskTest.kt @@ -25,6 +25,7 @@ import com.android.launcher3.util.Executors import com.android.launcher3.util.IntArray import com.android.launcher3.util.TestUtil.runOnExecutorSync import com.google.common.truth.Truth.assertThat +import java.util.ArrayList import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -62,7 +63,7 @@ class AddWorkspaceItemsTaskTest : AbstractWorkspaceModelTest() { assertThat(addedItems.size).isEqualTo(1) assertThat(addedItems.first().screenId).isEqualTo(1) - verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 1) + verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 1, addedItems) } @Test @@ -75,7 +76,7 @@ class AddWorkspaceItemsTaskTest : AbstractWorkspaceModelTest() { assertThat(addedItems.size).isEqualTo(1) assertThat(addedItems.first().screenId).isEqualTo(1) - verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 1) + verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 1, addedItems) } @Test @@ -101,7 +102,7 @@ class AddWorkspaceItemsTaskTest : AbstractWorkspaceModelTest() { assertThat(addedItems.size).isEqualTo(1) assertThat(addedItems.first().screenId).isEqualTo(2) - verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 1) + verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 1, addedItems) } @Test @@ -123,26 +124,30 @@ class AddWorkspaceItemsTaskTest : AbstractWorkspaceModelTest() { // Items that are added to the second screen should be animated val itemsAddedToSecondScreen = addedItems.filter { it.screenId == 2 } assertThat(itemsAddedToSecondScreen.size).isEqualTo(2) - verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 3) + verifyItemSpaceFinderCall(nonEmptyScreenIds, numberOfExpectedCall = 3, addedItems) } /** Sets up the item space data that will be returned from WorkspaceItemSpaceFinder. */ private fun givenNewItemSpaces(vararg newItemSpaces: NewItemSpace) { val spaceStack = newItemSpaces.toMutableList() - whenever(mWorkspaceItemSpaceFinder.findSpaceForItem(any(), any(), any(), any())).then { - spaceStack.removeFirst().toIntArray() - } + whenever(mWorkspaceItemSpaceFinder.findSpaceForItem(any(), any(), any(), any(), any())) + .then { spaceStack.removeFirst().toIntArray() } } /** * Verifies if WorkspaceItemSpaceFinder was called with proper arguments and how many times was * it called. */ - private fun verifyItemSpaceFinderCall(nonEmptyScreenIds: List, numberOfExpectedCall: Int) { + private fun verifyItemSpaceFinderCall( + nonEmptyScreenIds: List, + numberOfExpectedCall: Int, + items: List, + ) { verify(mWorkspaceItemSpaceFinder, times(numberOfExpectedCall)) .findSpaceForItem( eq(IntArray.wrap(*nonEmptyScreenIds.toIntArray())), eq(IntArray()), + eq(ArrayList(items)), eq(1), eq(1), ) diff --git a/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemSpaceFinderTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemSpaceFinderTest.kt index 624db5b19f..1170469b15 100644 --- a/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemSpaceFinderTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemSpaceFinderTest.kt @@ -18,6 +18,8 @@ package com.android.launcher3.model import android.graphics.Rect import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP +import com.android.launcher3.model.data.ItemInfo import com.android.launcher3.util.ModelTestExtensions.bgDataModel import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -36,7 +38,7 @@ class WorkspaceItemSpaceFinderTest : AbstractWorkspaceModelTest() { private fun findSpace(spanX: Int, spanY: Int): NewItemSpace = WorkspaceItemSpaceFinder(model.bgDataModel, mAppState.invariantDeviceProfile, model) - .findSpaceForItem(mExistingScreens, mNewScreens, spanX, spanY) + .findSpaceForItem(mExistingScreens, mNewScreens, mAddedWorkspaceItems, spanX, spanY) .let { NewItemSpace.fromIntArray(it) } private fun assertRegionVacant(newItemSpace: NewItemSpace, spanX: Int, spanY: Int) { @@ -67,6 +69,37 @@ class WorkspaceItemSpaceFinderTest : AbstractWorkspaceModelTest() { assertRegionVacant(spaceFound, 1, 1) } + @Test + fun workspaceItemsAddedButNotYetCommittedToDbShouldBeTakenIntoAccountInFindSpaceForItem() { + setupWorkspacesWithSpaces( + // 3x2 space on screen 0, but it should be skipped + screen0 = listOf(Rect(2, 0, 5, 2)), + screen1 = listOf(Rect(2, 2, 4, 4)), // 2x2 space + ) + val itemInfo = ItemInfo() + itemInfo.cellX = 2 + itemInfo.cellY = 2 + itemInfo.screenId = 1 + itemInfo.container = CONTAINER_DESKTOP + mAddedWorkspaceItems.add(itemInfo) + + val itemInfo2 = ItemInfo() + itemInfo2.cellX = 3 + itemInfo2.cellY = 2 + itemInfo2.screenId = 1 + itemInfo2.container = CONTAINER_DESKTOP + mAddedWorkspaceItems.add(itemInfo2) + + val spaceFound = findSpace(1, 1) + + assertThat(spaceFound.screenId).isEqualTo(1) + assertThat(spaceFound.cellX).isEqualTo(2) + assertThat(spaceFound.cellY).isEqualTo(3) + assertRegionVacant(spaceFound, 1, 1) + + mAddedWorkspaceItems.clear() + } + @Test fun notEnoughSpaceOnFirstScreen_whenFindSpaceForItem_thenReturnSecondScreenId() { setupWorkspacesWithSpaces(