diff options
Diffstat (limited to 'tests')
5 files changed, 259 insertions, 11 deletions
diff --git a/tests/Android.mk b/tests/Android.mk index 466146e3b..5103ced7c 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -17,9 +17,9 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests -#LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test ub-uiautomator mockito-target-minus-junit4 -#LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SDK_VERSION := current LOCAL_MIN_SDK_VERSION := 21 diff --git a/tests/res/raw/cache_data_updated_task_data.txt b/tests/res/raw/cache_data_updated_task_data.txt index 9095476f6..819968709 100644 --- a/tests/res/raw/cache_data_updated_task_data.txt +++ b/tests/res/raw/cache_data_updated_task_data.txt @@ -22,7 +22,7 @@ bgItem s itemType=1 title=app4-shrt intent=component=app4/class1 id=8 bgItem s itemType=1 status=1 title=app3-shrt intent=component=app3/class3 id=9 bgItem s itemType=1 status=1 title=app5-shrt intent=component=app5/class1 id=10 -allApps componentName=app1/class1 -allApps componentName=app1/class2 -allApps componentName=app2/class1 -allApps componentName=app2/class2
\ No newline at end of file +allApps componentName=app1/class1 intent=component=app1/class1 +allApps componentName=app1/class2 intent=component=app1/class2 +allApps componentName=app2/class1 intent=component=app2/class1 +allApps componentName=app2/class2 intent=component=app2/class2
\ No newline at end of file diff --git a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java index f23a574e9..3a27d0dbf 100644 --- a/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java +++ b/tests/src/com/android/launcher3/model/BaseModelUpdateTaskTestCase.java @@ -8,10 +8,12 @@ import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Process; import android.os.UserHandle; +import android.support.annotation.NonNull; import android.support.test.InstrumentationRegistry; import android.test.ProviderTestCase2; import com.android.launcher3.AllAppsList; +import com.android.launcher3.AppFilter; import com.android.launcher3.AppInfo; import com.android.launcher3.DeferredHandler; import com.android.launcher3.IconCache; @@ -24,6 +26,7 @@ import com.android.launcher3.LauncherModel.Callbacks; import com.android.launcher3.compat.LauncherActivityInfoCompat; import com.android.launcher3.config.ProviderConfig; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.Provider; import com.android.launcher3.util.TestLauncherProvider; import org.mockito.ArgumentCaptor; @@ -74,7 +77,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2<TestLauncherP idp = new InvariantDeviceProfile(); iconCache = new MyIconCache(targetContext, idp); - allAppsList = new AllAppsList(iconCache, null); + allAppsList = new AllAppsList(iconCache, new AppFilter()); when(appState.getIconCache()).thenReturn(iconCache); when(appState.getInvariantDeviceProfile()).thenReturn(idp); @@ -129,7 +132,7 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2<TestLauncherP (ItemInfo) initItem(classMap.get(commands[1]), commands, 2), false); break; case "allApps": - allAppsList.add((AppInfo) initItem(AppInfo.class, commands, 1)); + allAppsList.add((AppInfo) initItem(AppInfo.class, commands, 1), null); break; } } @@ -184,9 +187,10 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2<TestLauncherP } @Override - protected CacheEntry cacheLocked(ComponentName componentName, - LauncherActivityInfoCompat info, UserHandle user, - boolean usePackageIcon, boolean useLowResIcon) { + protected CacheEntry cacheLocked( + @NonNull ComponentName componentName, + @NonNull Provider<LauncherActivityInfoCompat> infoProvider, + UserHandle user, boolean usePackageIcon, boolean useLowResIcon) { CacheEntry entry = mCache.get(new ComponentKey(componentName, user)); if (entry == null) { entry = new CacheEntry(); @@ -205,5 +209,10 @@ public class BaseModelUpdateTaskTestCase extends ProviderTestCase2<TestLauncherP public Bitmap newIcon() { return Bitmap.createBitmap(1, 1, Config.ARGB_8888); } + + @Override + protected Bitmap makeDefaultIcon(UserHandle user) { + return newIcon(); + } } } diff --git a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java index 646ef2794..d595e6cf1 100644 --- a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java +++ b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java @@ -30,6 +30,11 @@ public class CacheDataUpdatedTaskTest extends BaseModelUpdateTaskTestCase { } public void testCacheUpdate_update_apps() throws Exception { + // Clear all icons from apps list so that its easy to check what was updated + for (AppInfo info : allAppsList.data) { + info.iconBitmap = null; + } + executeTaskForTest(newTask(CacheDataUpdatedTask.OP_CACHE_UPDATE, "app1")); // Verify that only the app icons of app1 (id 1 & 2) are updated. Custom shortcut (id 7) diff --git a/tests/src/com/android/launcher3/model/LoaderCursorTest.java b/tests/src/com/android/launcher3/model/LoaderCursorTest.java new file mode 100644 index 000000000..d40e6c2fc --- /dev/null +++ b/tests/src/com/android/launcher3/model/LoaderCursorTest.java @@ -0,0 +1,234 @@ +package com.android.launcher3.model; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.database.MatrixCursor; +import android.graphics.Bitmap; +import android.os.Process; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import com.android.launcher3.IconCache; +import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.ItemInfo; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.ShortcutInfo; +import com.android.launcher3.Utilities; +import com.android.launcher3.compat.LauncherAppsCompat; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.Arrays; + +import static com.android.launcher3.LauncherSettings.Favorites.CELLX; +import static com.android.launcher3.LauncherSettings.Favorites.CELLY; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; +import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT; +import static com.android.launcher3.LauncherSettings.Favorites.ICON; +import static com.android.launcher3.LauncherSettings.Favorites.ICON_PACKAGE; +import static com.android.launcher3.LauncherSettings.Favorites.ICON_RESOURCE; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; +import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; +import static com.android.launcher3.LauncherSettings.Favorites.PROFILE_ID; +import static com.android.launcher3.LauncherSettings.Favorites.SCREEN; +import static com.android.launcher3.LauncherSettings.Favorites.TITLE; +import static com.android.launcher3.LauncherSettings.Favorites._ID; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Tests for {@link LoaderCursor} + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class LoaderCursorTest { + + private LauncherAppState mMockApp; + private IconCache mMockIconCache; + + private MatrixCursor mCursor; + private InvariantDeviceProfile mIDP; + private Context mContext; + private LauncherAppsCompat mLauncherApps; + + private LoaderCursor mLoaderCursor; + + @Before + public void setup() { + mIDP = new InvariantDeviceProfile(); + mCursor = new MatrixCursor(new String[] { + ICON, ICON_PACKAGE, ICON_RESOURCE, TITLE, + _ID, CONTAINER, ITEM_TYPE, PROFILE_ID, + SCREEN, CELLX, CELLY, + }); + mContext = InstrumentationRegistry.getTargetContext(); + + mMockApp = mock(LauncherAppState.class); + mMockIconCache = mock(IconCache.class); + when(mMockApp.getIconCache()).thenReturn(mMockIconCache); + when(mMockApp.getInvariantDeviceProfile()).thenReturn(mIDP); + when(mMockApp.getContext()).thenReturn(mContext); + mLauncherApps = LauncherAppsCompat.getInstance(mContext); + + mLoaderCursor = new LoaderCursor(mCursor, mMockApp); + mLoaderCursor.allUsers.put(0, Process.myUserHandle()); + } + + private void initCursor(int itemType, String title) { + mCursor.newRow() + .add(_ID, 1) + .add(PROFILE_ID, 0) + .add(ITEM_TYPE, itemType) + .add(TITLE, title) + .add(CONTAINER, CONTAINER_DESKTOP); + } + + @Test + public void getAppShortcutInfo_dontAllowMissing_invalidComponent() { + initCursor(ITEM_TYPE_APPLICATION, ""); + assertTrue(mLoaderCursor.moveToNext()); + ComponentName cn = new ComponentName(mContext.getPackageName(), "dummy-do"); + assertNull(mLoaderCursor.getAppShortcutInfo( + new Intent().setComponent(cn), false /* allowMissingTarget */, true)); + } + + @Test + public void getAppShortcutInfo_dontAllowMissing_validComponent() { + initCursor(ITEM_TYPE_APPLICATION, ""); + assertTrue(mLoaderCursor.moveToNext()); + + ComponentName cn = mLauncherApps.getActivityList(null, mLoaderCursor.user) + .get(0).getComponentName(); + ShortcutInfo info = mLoaderCursor.getAppShortcutInfo( + new Intent().setComponent(cn), false /* allowMissingTarget */, true); + assertNotNull(info); + assertTrue(Utilities.isLauncherAppTarget(info.intent)); + } + + @Test + public void getAppShortcutInfo_allowMissing_invalidComponent() { + initCursor(ITEM_TYPE_APPLICATION, ""); + assertTrue(mLoaderCursor.moveToNext()); + + ComponentName cn = new ComponentName(mContext.getPackageName(), "dummy-do"); + ShortcutInfo info = mLoaderCursor.getAppShortcutInfo( + new Intent().setComponent(cn), true /* allowMissingTarget */, true); + assertNotNull(info); + assertTrue(Utilities.isLauncherAppTarget(info.intent)); + } + + @Test + public void loadSimpleShortcut() { + initCursor(ITEM_TYPE_SHORTCUT, "my-shortcut"); + assertTrue(mLoaderCursor.moveToNext()); + + Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); + when(mMockIconCache.getDefaultIcon(eq(mLoaderCursor.user))).thenReturn(icon); + ShortcutInfo info = mLoaderCursor.loadSimpleShortcut(); + assertEquals(icon, info.iconBitmap); + assertEquals("my-shortcut", info.title); + assertEquals(ITEM_TYPE_SHORTCUT, info.itemType); + } + + @Test + public void checkItemPlacement_wrongWorkspaceScreen() { + ArrayList<Long> workspaceScreens = new ArrayList<>(Arrays.asList(1L, 3L)); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Item on unknown screen are not placed + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 4L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 5L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 2L), workspaceScreens)); + + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 3L), workspaceScreens)); + + } + @Test + public void checkItemPlacement_outsideBounds() { + ArrayList<Long> workspaceScreens = new ArrayList<>(Arrays.asList(1L, 2L)); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Item outside screen bounds are not placed + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(4, 4, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + } + + @Test + public void checkItemPlacement_overlappingItems() { + ArrayList<Long> workspaceScreens = new ArrayList<>(Arrays.asList(1L, 2L)); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Overlapping items are not placed + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 2L), workspaceScreens)); + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(0, 0, 1, 1, CONTAINER_DESKTOP, 2L), workspaceScreens)); + + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(1, 1, 1, 1, CONTAINER_DESKTOP, 1L), workspaceScreens)); + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(2, 2, 2, 2, CONTAINER_DESKTOP, 1L), workspaceScreens)); + + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 2, 1, 2, CONTAINER_DESKTOP, 1L), workspaceScreens)); + } + + @Test + public void checkItemPlacement_hotseat() { + ArrayList<Long> workspaceScreens = new ArrayList<>(); + mIDP.numRows = 4; + mIDP.numColumns = 4; + mIDP.numHotseatIcons = 3; + + // Hotseat items are only placed based on screenId + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 3, 1, 1, CONTAINER_HOTSEAT, 1L), workspaceScreens)); + assertTrue(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 3, 1, 1, CONTAINER_HOTSEAT, 2L), workspaceScreens)); + + assertFalse(mLoaderCursor.checkItemPlacement( + newItemInfo(3, 3, 1, 1, CONTAINER_HOTSEAT, 3L), workspaceScreens)); + } + + private ItemInfo newItemInfo(int cellX, int cellY, int spanX, int spanY, + long container, long screenId) { + ItemInfo info = new ItemInfo(); + info.cellX = cellX; + info.cellY = cellY; + info.spanX = spanX; + info.spanY = spanY; + info.container = container; + info.screenId = screenId; + return info; + } +} |