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

Commit 5eccd03e authored by Chihhang Chuang's avatar Chihhang Chuang
Browse files

[1/2] Add Espresso test for CustomizationPickerActivity

Change-Id: I437eacd0abb7f153c94a826b35aa6c62837f0e29
parent ae50661c
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.view.MenuItem;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -86,9 +87,10 @@ public class CustomizationPickerActivity extends FragmentActivity implements Wal
        CategoryFragmentHost, ThemeFragmentHost, GridFragmentHost, ClockFragmentHost {

    private static final String TAG = "CustomizationPickerActivity";
    private static final String WALLPAPER_FLAVOR_EXTRA = "com.android.launcher3.WALLPAPER_FLAVOR";
    private static final String WALLPAPER_FOCUS = "focus_wallpaper";
    private static final String WALLPAPER_ONLY = "wallpaper_only";
    @VisibleForTesting static final String WALLPAPER_FLAVOR_EXTRA =
            "com.android.launcher3.WALLPAPER_FLAVOR";
    @VisibleForTesting static final String WALLPAPER_FOCUS = "focus_wallpaper";
    @VisibleForTesting static final String WALLPAPER_ONLY = "wallpaper_only";

    private WallpaperPickerDelegate mDelegate;
    private UserEventLogger mUserEventLogger;
+160 −0
Original line number Diff line number Diff line
package com.android.customization.picker;

import static android.content.Intent.ACTION_SET_WALLPAPER;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.intent.matcher.IntentMatchers.filterEquals;
import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isSelected;
import static androidx.test.espresso.matcher.ViewMatchers.withId;

import static com.android.customization.picker.CustomizationPickerActivity.WALLPAPER_FLAVOR_EXTRA;
import static com.android.customization.picker.CustomizationPickerActivity.WALLPAPER_FOCUS;
import static com.android.customization.picker.CustomizationPickerActivity.WALLPAPER_ONLY;

import static org.junit.Assert.assertTrue;

import android.content.Intent;
import android.text.TextUtils;

import androidx.fragment.app.Fragment;
import androidx.test.espresso.intent.Intents;
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.rule.ActivityTestRule;

import com.android.customization.picker.theme.ThemeFragment;
import com.android.customization.testing.TestCustomizationInjector;
import com.android.customization.testing.TestThemeManager;
import com.android.wallpaper.R;
import com.android.wallpaper.module.InjectorProvider;
import com.android.wallpaper.picker.CategoryFragment;
import com.android.wallpaper.picker.TopLevelPickerActivity;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * Tests for {@link CustomizationPickerActivity}.
 */
@RunWith(AndroidJUnit4ClassRunner.class)
public class CustomizationPickerActivityTest {

    @Rule
    public ActivityTestRule<CustomizationPickerActivity> mActivityRule =
            new ActivityTestRule<>(CustomizationPickerActivity.class, false, false);

    @Before
    public void setUp() {
        Intents.init();
    }

    @After
    public void tearDown() {
        mActivityRule.finishActivity();
        Intents.release();
    }

    @Test
    public void launchActivity_doesNotSupportCustomization_launchesTopLevelPickerActivity() {
        TestThemeManager.setAvailable(false);

        launchActivity();

        Intents.intended(filterEquals(new Intent(mActivityRule.getActivity(),
                TopLevelPickerActivity.class)));
    }

    // ----------------------------------------------------------------------
    // Tests for customization supports.
    // ----------------------------------------------------------------------

    @Test
    public void launchActivity_themeManagerIsAvailable_NavBarShowsStyleAndWallpaperItem() {
        TestThemeManager.setAvailable(true);

        launchActivity();

        onView(withId(R.id.nav_theme)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.nav_wallpaper)).check(matches(isCompletelyDisplayed()));
        onView(withId(R.id.nav_clock)).check(doesNotExist());
        onView(withId(R.id.nav_grid)).check(doesNotExist());
    }

    @Test
    public void launchActivity_navigateToTheStyleTabByDefault() {
        TestThemeManager.setAvailable(true);

        launchActivity();

        onView(withId(R.id.nav_theme)).check(matches(isSelected()));
        assertTrue(getCurrentShowingFragment() instanceof ThemeFragment);
    }

    @Test
    public void launchActivity_withExtraWallpaperOnly_launchesTopLevelPickerActivity() {
        TestThemeManager.setAvailable(true);

        launchActivityWithFlavorExtra(WALLPAPER_ONLY);

        // While receiving WALLPAPER_ONLY extra, it should launch TopLevelPickerActivity whatever it
        // supports customization.
        Intents.intended(filterEquals(new Intent(mActivityRule.getActivity(),
                TopLevelPickerActivity.class)));
    }

    @Test
    public void clickStyleButton_showsThemeFragment() {
        TestThemeManager.setAvailable(true);
        launchActivity();

        onView(withId(R.id.nav_theme)).perform(click());

        onView(withId(R.id.nav_theme)).check(matches(isSelected()));
        assertTrue(getCurrentShowingFragment() instanceof ThemeFragment);
    }

    @Test
    public void clickWallpaperButton_showsCategoryFragment() {
        TestThemeManager.setAvailable(true);
        launchActivity();

        onView(withId(R.id.nav_wallpaper)).perform(click());

        onView(withId(R.id.nav_wallpaper)).check(matches(isSelected()));
        assertTrue(getCurrentShowingFragment() instanceof CategoryFragment);
    }

    @Test
    public void launchActivity_withExtraWallpaperFocus_navigateToTheWallpaperTab() {
        TestThemeManager.setAvailable(true);

        launchActivityWithFlavorExtra(WALLPAPER_FOCUS);

        onView(withId(R.id.nav_wallpaper)).check(matches(isSelected()));
        assertTrue(getCurrentShowingFragment() instanceof CategoryFragment);
    }

    private void launchActivity() {
        launchActivityWithFlavorExtra("");
    }

    private void launchActivityWithFlavorExtra(String extra) {
        InjectorProvider.setInjector(new TestCustomizationInjector());
        Intent intent = new Intent(ACTION_SET_WALLPAPER);
        if (!TextUtils.isEmpty(extra)) {
            intent.putExtra(WALLPAPER_FLAVOR_EXTRA, extra);
        }
        mActivityRule.launchActivity(intent);
    }

    private Fragment getCurrentShowingFragment() {
        return mActivityRule.getActivity().getSupportFragmentManager()
                .findFragmentById(R.id.fragment_container);
    }
}
+74 −0
Original line number Diff line number Diff line
package com.android.customization.testing;

import android.content.Context;

import androidx.fragment.app.FragmentActivity;

import com.android.customization.model.theme.OverlayManagerCompat;
import com.android.customization.model.theme.ThemeBundleProvider;
import com.android.customization.model.theme.ThemeManager;
import com.android.customization.module.CustomizationInjector;
import com.android.customization.module.CustomizationPreferences;
import com.android.customization.module.ThemesUserEventLogger;
import com.android.wallpaper.module.DrawableLayerResolver;
import com.android.wallpaper.module.PackageStatusNotifier;
import com.android.wallpaper.module.UserEventLogger;
import com.android.wallpaper.module.WallpaperSetter;
import com.android.wallpaper.testing.TestInjector;

/**
 * Test implementation of the dependency injector.
 */
public class TestCustomizationInjector extends TestInjector implements CustomizationInjector {
    private CustomizationPreferences mCustomizationPreferences;
    private ThemeManager mThemeManager;
    private PackageStatusNotifier mPackageStatusNotifier;
    private DrawableLayerResolver mDrawableLayerResolver;
    private UserEventLogger mUserEventLogger;

    @Override
    public CustomizationPreferences getCustomizationPreferences(Context context) {
        if (mCustomizationPreferences == null) {
            mCustomizationPreferences = new TestDefaultCustomizationPreferences(context);
        }
        return mCustomizationPreferences;
    }

    @Override
    public ThemeManager getThemeManager(
            ThemeBundleProvider provider,
            FragmentActivity activity,
            WallpaperSetter wallpaperSetter,
            OverlayManagerCompat overlayManagerCompat,
            ThemesUserEventLogger logger) {
        if (mThemeManager == null) {
            mThemeManager = new TestThemeManager(provider, activity, wallpaperSetter,
                    overlayManagerCompat, logger);
        }
        return mThemeManager;
    }

    @Override
    public PackageStatusNotifier getPackageStatusNotifier(Context context) {
        if (mPackageStatusNotifier == null) {
            mPackageStatusNotifier =  new TestPackageStatusNotifier();
        }
        return mPackageStatusNotifier;
    }

    @Override
    public DrawableLayerResolver getDrawableLayerResolver() {
        if (mDrawableLayerResolver == null) {
            mDrawableLayerResolver = new TestDrawableLayerResolver();
        }
        return mDrawableLayerResolver;
    }

    @Override
    public UserEventLogger getUserEventLogger(Context unused) {
        if (mUserEventLogger == null) {
            mUserEventLogger = new TestThemesUserEventLogger();
        }
        return mUserEventLogger;
    }
}
+41 −0
Original line number Diff line number Diff line
package com.android.customization.testing;

import android.content.Context;

import com.android.customization.module.DefaultCustomizationPreferences;

import java.util.HashSet;
import java.util.Set;

/**
 * Test implementation of {@link DefaultCustomizationPreferences}.
 */
public class TestDefaultCustomizationPreferences extends DefaultCustomizationPreferences {

    private String mCustomThemes;
    private final Set<String> mTabVisited = new HashSet<>();

    public TestDefaultCustomizationPreferences(Context context) {
        super(context);
    }

    @Override
    public String getSerializedCustomThemes() {
        return mCustomThemes;
    }

    @Override
    public void storeCustomThemes(String serializedCustomThemes) {
        mCustomThemes = serializedCustomThemes;
    }

    @Override
    public boolean getTabVisited(String id) {
        return mTabVisited.contains(id);
    }

    @Override
    public void setTabVisited(String id) {
        mTabVisited.add(id);
    }
}
+16 −0
Original line number Diff line number Diff line
package com.android.customization.testing;

import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;

import com.android.wallpaper.module.DrawableLayerResolver;

/**
 * Test implementation of {@link DrawableLayerResolver}.
 */
public class TestDrawableLayerResolver implements DrawableLayerResolver {
    @Override
    public Drawable resolveLayer(LayerDrawable layerDrawable) {
        return layerDrawable.getDrawable(0);
    }
}
Loading