Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 204e749f authored by Alex Chau's avatar Alex Chau Committed by Android (Google) Code Review
Browse files

Merge "Revert "Migrating all model tests to Instrumentation tests"" into sc-v2-dev

parents 96ffcbcd 7a4a30d8
Loading
Loading
Loading
Loading
+64 −64
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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()
@@ -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",
@@ -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