Loading quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java→quickstep/robolectric_tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java +64 −64 Original line number Diff line number Diff line Loading @@ -15,31 +15,24 @@ */ package com.android.launcher3.model; import static android.os.Process.myUserHandle; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import static com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.robolectric.Shadows.shadowOf; import android.app.prediction.AppTarget; import android.app.prediction.AppTargetId; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.launcher3.LauncherAppState; import com.android.launcher3.config.FeatureFlags; Loading @@ -47,34 +40,38 @@ import com.android.launcher3.icons.ComponentWithLabel; import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.BgDataModel.FixedContainerItems; import com.android.launcher3.model.QuickstepModelDelegate.PredictorState; import com.android.launcher3.shadows.ShadowDeviceFlag; import com.android.launcher3.util.LauncherModelHelper; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowAppWidgetManager; import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.util.ReflectionHelpers; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @SmallTest @RunWith(AndroidJUnit4.class) @RunWith(RobolectricTestRunner.class) public final class WidgetsPredicationUpdateTaskTest { private AppWidgetProviderInfo mApp1Provider1; private AppWidgetProviderInfo mApp1Provider2; private AppWidgetProviderInfo mApp2Provider1; private AppWidgetProviderInfo mApp4Provider1; private AppWidgetProviderInfo mApp4Provider2; private AppWidgetProviderInfo mApp5Provider1; private List<AppWidgetProviderInfo> allWidgets; private AppWidgetProviderInfo mApp1Provider1 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp1Provider2 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp2Provider1 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp4Provider1 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp4Provider2 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp5Provider1 = new AppWidgetProviderInfo(); private FakeBgDataModelCallback mCallback = new FakeBgDataModelCallback(); private Context mContext; private LauncherModelHelper mModelHelper; private UserHandle mUserHandle; Loading @@ -83,56 +80,54 @@ public final class WidgetsPredicationUpdateTaskTest { @Before public void setup() throws Exception { mModelHelper = new LauncherModelHelper(); MockitoAnnotations.initMocks(this); doAnswer(invocation -> { ComponentWithLabel componentWithLabel = invocation.getArgument(0); return componentWithLabel.getComponent().getShortClassName(); }).when(mIconCache).getTitleNoCache(any()); mUserHandle = myUserHandle(); mApp1Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app1", "provider1")); mApp1Provider2 = createAppWidgetProviderInfo( ComponentName.createRelative("app1", "provider2")); mApp2Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app2", "provider1")); mApp4Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app4", "provider1")); mApp4Provider2 = createAppWidgetProviderInfo( ComponentName.createRelative("app4", ".provider2")); mApp5Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app5", "provider1")); allWidgets = Arrays.asList(mApp1Provider1, mApp1Provider2, mApp2Provider1, mApp4Provider1, mApp4Provider2, mApp5Provider1); AppWidgetManager manager = mModelHelper.sandboxContext.spyService(AppWidgetManager.class); doReturn(allWidgets).when(manager).getInstalledProviders(); doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle())); doAnswer(i -> { String pkg = i.getArgument(0); Log.e("Hello", "Getting v " + pkg); return TextUtils.isEmpty(pkg) ? allWidgets : allWidgets.stream() .filter(a -> pkg.equals(a.provider.getPackageName())) .collect(Collectors.toList()); }).when(manager).getInstalledProvidersForPackage(any(), eq(myUserHandle())); mContext = RuntimeEnvironment.application; mModelHelper = new LauncherModelHelper(); mUserHandle = Process.myUserHandle(); // 2 widgets, app4/provider1 & app5/provider1, have already been added to the workspace. mModelHelper.initializeData("widgets_predication_update_task_data"); mModelHelper.initializeData("/widgets_predication_update_task_data.txt"); ShadowPackageManager packageManager = shadowOf(mContext.getPackageManager()); mApp1Provider1.provider = ComponentName.createRelative("app1", "provider1"); ReflectionHelpers.setField(mApp1Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp1Provider1.provider)); mApp1Provider2.provider = ComponentName.createRelative("app1", "provider2"); ReflectionHelpers.setField(mApp1Provider2, "providerInfo", packageManager.addReceiverIfNotPresent(mApp1Provider2.provider)); mApp2Provider1.provider = ComponentName.createRelative("app2", "provider1"); ReflectionHelpers.setField(mApp2Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp2Provider1.provider)); mApp4Provider1.provider = ComponentName.createRelative("app4", "provider1"); ReflectionHelpers.setField(mApp4Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp4Provider1.provider)); mApp4Provider2.provider = ComponentName.createRelative("app4", ".provider2"); ReflectionHelpers.setField(mApp4Provider2, "providerInfo", packageManager.addReceiverIfNotPresent(mApp4Provider2.provider)); mApp5Provider1.provider = ComponentName.createRelative("app5", "provider1"); ReflectionHelpers.setField(mApp5Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp5Provider1.provider)); ShadowAppWidgetManager shadowAppWidgetManager = shadowOf(mContext.getSystemService(AppWidgetManager.class)); shadowAppWidgetManager.addInstalledProvider(mApp1Provider1); shadowAppWidgetManager.addInstalledProvider(mApp1Provider2); shadowAppWidgetManager.addInstalledProvider(mApp2Provider1); shadowAppWidgetManager.addInstalledProvider(mApp4Provider1); shadowAppWidgetManager.addInstalledProvider(mApp4Provider2); shadowAppWidgetManager.addInstalledProvider(mApp5Provider1); mModelHelper.getModel().addCallbacks(mCallback); MAIN_EXECUTOR.submit(() -> mModelHelper.getModel().addCallbacks(mCallback)).get(); MODEL_EXECUTOR.post(() -> mModelHelper.getBgDataModel().widgetsModel.update( LauncherAppState.getInstance(mModelHelper.sandboxContext), /* packageUser= */ null)); MODEL_EXECUTOR.submit(() -> { }).get(); MAIN_EXECUTOR.submit(() -> { }).get(); LauncherAppState.getInstance(mContext), /* packageUser= */ null)); waitUntilIdle(); } @After public void tearDown() { mModelHelper.destroy(); } @Test public void widgetsRecommendationRan_shouldOnlyReturnNotAddedWidgetsInAppPredictionOrder() Loading Loading @@ -170,9 +165,9 @@ public final class WidgetsPredicationUpdateTaskTest { @Test public void widgetsRecommendationRan_localFilterDisabled_shouldReturnWidgetsInPredicationOrder() throws Exception { if (FeatureFlags.ENABLE_LOCAL_RECOMMENDED_WIDGETS_FILTER.get()) { return; } ShadowDeviceFlag shadowDeviceFlag = Shadow.extract( FeatureFlags.ENABLE_LOCAL_RECOMMENDED_WIDGETS_FILTER); shadowDeviceFlag.setValue(false); // WHEN newPredicationTask is executed with 5 predicated widgets. AppTarget widget1 = new AppTarget(new AppTargetId("app1"), "app1", "provider1", Loading Loading @@ -208,6 +203,11 @@ public final class WidgetsPredicationUpdateTaskTest { assertThat(actual.getUser()).isEqualTo(expected.getProfile()); } private void waitUntilIdle() { shadowOf(MODEL_EXECUTOR.getLooper()).idle(); shadowOf(MAIN_EXECUTOR.getLooper()).idle(); } private WidgetsPredictionUpdateTask newWidgetsPredicationTask(List<AppTarget> appTargets) { return new WidgetsPredictionUpdateTask( new PredictorState(CONTAINER_WIDGETS_PREDICTION, "test_widgets_prediction"), Loading tests/res/raw/cache_data_updated_task_data.txt→robolectric_tests/resources/cache_data_updated_task_data.txt +0 −0 File moved. View file tests/res/raw/db_schema_v10.json→robolectric_tests/resources/db_schema_v10.json +0 −0 File moved. View file tests/res/raw/package_install_state_change_task_data.txt→robolectric_tests/resources/package_install_state_change_task_data.txt +0 −0 File moved. View file tests/res/raw/widgets_predication_update_task_data.txt→robolectric_tests/resources/widgets_predication_update_task_data.txt +0 −0 File moved. View file Loading
quickstep/tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java→quickstep/robolectric_tests/src/com/android/launcher3/model/WidgetsPredicationUpdateTaskTest.java +64 −64 Original line number Diff line number Diff line Loading @@ -15,31 +15,24 @@ */ package com.android.launcher3.model; import static android.os.Process.myUserHandle; import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_PREDICTION; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import static com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.robolectric.Shadows.shadowOf; import android.app.prediction.AppTarget; import android.app.prediction.AppTargetId; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; import android.os.Process; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.launcher3.LauncherAppState; import com.android.launcher3.config.FeatureFlags; Loading @@ -47,34 +40,38 @@ import com.android.launcher3.icons.ComponentWithLabel; import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.BgDataModel.FixedContainerItems; import com.android.launcher3.model.QuickstepModelDelegate.PredictorState; import com.android.launcher3.shadows.ShadowDeviceFlag; import com.android.launcher3.util.LauncherModelHelper; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; import com.android.launcher3.widget.PendingAddWidgetInfo; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowAppWidgetManager; import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.util.ReflectionHelpers; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @SmallTest @RunWith(AndroidJUnit4.class) @RunWith(RobolectricTestRunner.class) public final class WidgetsPredicationUpdateTaskTest { private AppWidgetProviderInfo mApp1Provider1; private AppWidgetProviderInfo mApp1Provider2; private AppWidgetProviderInfo mApp2Provider1; private AppWidgetProviderInfo mApp4Provider1; private AppWidgetProviderInfo mApp4Provider2; private AppWidgetProviderInfo mApp5Provider1; private List<AppWidgetProviderInfo> allWidgets; private AppWidgetProviderInfo mApp1Provider1 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp1Provider2 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp2Provider1 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp4Provider1 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp4Provider2 = new AppWidgetProviderInfo(); private AppWidgetProviderInfo mApp5Provider1 = new AppWidgetProviderInfo(); private FakeBgDataModelCallback mCallback = new FakeBgDataModelCallback(); private Context mContext; private LauncherModelHelper mModelHelper; private UserHandle mUserHandle; Loading @@ -83,56 +80,54 @@ public final class WidgetsPredicationUpdateTaskTest { @Before public void setup() throws Exception { mModelHelper = new LauncherModelHelper(); MockitoAnnotations.initMocks(this); doAnswer(invocation -> { ComponentWithLabel componentWithLabel = invocation.getArgument(0); return componentWithLabel.getComponent().getShortClassName(); }).when(mIconCache).getTitleNoCache(any()); mUserHandle = myUserHandle(); mApp1Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app1", "provider1")); mApp1Provider2 = createAppWidgetProviderInfo( ComponentName.createRelative("app1", "provider2")); mApp2Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app2", "provider1")); mApp4Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app4", "provider1")); mApp4Provider2 = createAppWidgetProviderInfo( ComponentName.createRelative("app4", ".provider2")); mApp5Provider1 = createAppWidgetProviderInfo( ComponentName.createRelative("app5", "provider1")); allWidgets = Arrays.asList(mApp1Provider1, mApp1Provider2, mApp2Provider1, mApp4Provider1, mApp4Provider2, mApp5Provider1); AppWidgetManager manager = mModelHelper.sandboxContext.spyService(AppWidgetManager.class); doReturn(allWidgets).when(manager).getInstalledProviders(); doReturn(allWidgets).when(manager).getInstalledProvidersForProfile(eq(myUserHandle())); doAnswer(i -> { String pkg = i.getArgument(0); Log.e("Hello", "Getting v " + pkg); return TextUtils.isEmpty(pkg) ? allWidgets : allWidgets.stream() .filter(a -> pkg.equals(a.provider.getPackageName())) .collect(Collectors.toList()); }).when(manager).getInstalledProvidersForPackage(any(), eq(myUserHandle())); mContext = RuntimeEnvironment.application; mModelHelper = new LauncherModelHelper(); mUserHandle = Process.myUserHandle(); // 2 widgets, app4/provider1 & app5/provider1, have already been added to the workspace. mModelHelper.initializeData("widgets_predication_update_task_data"); mModelHelper.initializeData("/widgets_predication_update_task_data.txt"); ShadowPackageManager packageManager = shadowOf(mContext.getPackageManager()); mApp1Provider1.provider = ComponentName.createRelative("app1", "provider1"); ReflectionHelpers.setField(mApp1Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp1Provider1.provider)); mApp1Provider2.provider = ComponentName.createRelative("app1", "provider2"); ReflectionHelpers.setField(mApp1Provider2, "providerInfo", packageManager.addReceiverIfNotPresent(mApp1Provider2.provider)); mApp2Provider1.provider = ComponentName.createRelative("app2", "provider1"); ReflectionHelpers.setField(mApp2Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp2Provider1.provider)); mApp4Provider1.provider = ComponentName.createRelative("app4", "provider1"); ReflectionHelpers.setField(mApp4Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp4Provider1.provider)); mApp4Provider2.provider = ComponentName.createRelative("app4", ".provider2"); ReflectionHelpers.setField(mApp4Provider2, "providerInfo", packageManager.addReceiverIfNotPresent(mApp4Provider2.provider)); mApp5Provider1.provider = ComponentName.createRelative("app5", "provider1"); ReflectionHelpers.setField(mApp5Provider1, "providerInfo", packageManager.addReceiverIfNotPresent(mApp5Provider1.provider)); ShadowAppWidgetManager shadowAppWidgetManager = shadowOf(mContext.getSystemService(AppWidgetManager.class)); shadowAppWidgetManager.addInstalledProvider(mApp1Provider1); shadowAppWidgetManager.addInstalledProvider(mApp1Provider2); shadowAppWidgetManager.addInstalledProvider(mApp2Provider1); shadowAppWidgetManager.addInstalledProvider(mApp4Provider1); shadowAppWidgetManager.addInstalledProvider(mApp4Provider2); shadowAppWidgetManager.addInstalledProvider(mApp5Provider1); mModelHelper.getModel().addCallbacks(mCallback); MAIN_EXECUTOR.submit(() -> mModelHelper.getModel().addCallbacks(mCallback)).get(); MODEL_EXECUTOR.post(() -> mModelHelper.getBgDataModel().widgetsModel.update( LauncherAppState.getInstance(mModelHelper.sandboxContext), /* packageUser= */ null)); MODEL_EXECUTOR.submit(() -> { }).get(); MAIN_EXECUTOR.submit(() -> { }).get(); LauncherAppState.getInstance(mContext), /* packageUser= */ null)); waitUntilIdle(); } @After public void tearDown() { mModelHelper.destroy(); } @Test public void widgetsRecommendationRan_shouldOnlyReturnNotAddedWidgetsInAppPredictionOrder() Loading Loading @@ -170,9 +165,9 @@ public final class WidgetsPredicationUpdateTaskTest { @Test public void widgetsRecommendationRan_localFilterDisabled_shouldReturnWidgetsInPredicationOrder() throws Exception { if (FeatureFlags.ENABLE_LOCAL_RECOMMENDED_WIDGETS_FILTER.get()) { return; } ShadowDeviceFlag shadowDeviceFlag = Shadow.extract( FeatureFlags.ENABLE_LOCAL_RECOMMENDED_WIDGETS_FILTER); shadowDeviceFlag.setValue(false); // WHEN newPredicationTask is executed with 5 predicated widgets. AppTarget widget1 = new AppTarget(new AppTargetId("app1"), "app1", "provider1", Loading Loading @@ -208,6 +203,11 @@ public final class WidgetsPredicationUpdateTaskTest { assertThat(actual.getUser()).isEqualTo(expected.getProfile()); } private void waitUntilIdle() { shadowOf(MODEL_EXECUTOR.getLooper()).idle(); shadowOf(MAIN_EXECUTOR.getLooper()).idle(); } private WidgetsPredictionUpdateTask newWidgetsPredicationTask(List<AppTarget> appTargets) { return new WidgetsPredictionUpdateTask( new PredictorState(CONTAINER_WIDGETS_PREDICTION, "test_widgets_prediction"), Loading
tests/res/raw/cache_data_updated_task_data.txt→robolectric_tests/resources/cache_data_updated_task_data.txt +0 −0 File moved. View file
tests/res/raw/db_schema_v10.json→robolectric_tests/resources/db_schema_v10.json +0 −0 File moved. View file
tests/res/raw/package_install_state_change_task_data.txt→robolectric_tests/resources/package_install_state_change_task_data.txt +0 −0 File moved. View file
tests/res/raw/widgets_predication_update_task_data.txt→robolectric_tests/resources/widgets_predication_update_task_data.txt +0 −0 File moved. View file