[WPP2] Make injectors kt am: feed6b147b

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/WallpaperPicker2/+/20833313

Change-Id: Ia9d42862a3adeb0423b3d6bc9a63298f50d10c47
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/wallpaper/module/Injector.java b/src/com/android/wallpaper/module/Injector.java
deleted file mode 100755
index 2faf3b6..0000000
--- a/src/com/android/wallpaper/module/Injector.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wallpaper.module;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-
-import com.android.wallpaper.compat.WallpaperManagerCompat;
-import com.android.wallpaper.config.BaseFlags;
-import com.android.wallpaper.effects.EffectsController;
-import com.android.wallpaper.effects.EffectsController.EffectsServiceListener;
-import com.android.wallpaper.model.CategoryProvider;
-import com.android.wallpaper.model.WallpaperInfo;
-import com.android.wallpaper.monitor.PerformanceMonitor;
-import com.android.wallpaper.network.Requester;
-import com.android.wallpaper.picker.PreviewFragment.PreviewMode;
-import com.android.wallpaper.picker.individual.IndividualPickerFragment;
-import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer;
-import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor;
-import com.android.wallpaper.util.DisplayUtils;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Interface for a provider of "injected dependencies." (NOTE: The term "injector" is somewhat of a
- * misnomer; this is more aptly a service registry as part of a service locator design pattern.)
- */
-public interface Injector {
-    /**
-     * Get {@link AlarmManagerWrapper}
-     */
-    AlarmManagerWrapper getAlarmManagerWrapper(Context context);
-
-    /**
-     * Get {@link BitmapCropper}
-     */
-    BitmapCropper getBitmapCropper();
-
-    /**
-     * Get {@link CategoryProvider}
-     */
-    CategoryProvider getCategoryProvider(Context context);
-
-    /**
-     * Get {@link CurrentWallpaperInfoFactory}
-     */
-    CurrentWallpaperInfoFactory getCurrentWallpaperInfoFactory(Context context);
-
-    /**
-     * Get {@link CustomizationSections}
-     */
-    CustomizationSections getCustomizationSections(Activity activity);
-
-    /**
-     * Get {@link Intent} for a deep link
-     */
-    Intent getDeepLinkRedirectIntent(Context context, Uri uri);
-
-    /**
-     * Get {@link DisplayUtils}
-     */
-    DisplayUtils getDisplayUtils(Context context);
-
-    /**
-     * Get {@link DisplayUtils}
-     */
-    String getDownloadableIntentAction();
-
-    /**
-     * Get {@link DrawableLayerResolver}
-     */
-    DrawableLayerResolver getDrawableLayerResolver();
-
-    /**
-     * Get {@link EffectsController}
-     */
-    @Nullable
-    EffectsController getEffectsController(Context context, EffectsServiceListener listener);
-
-    /**
-     * Get {@link ExploreIntentChecker}
-     */
-    ExploreIntentChecker getExploreIntentChecker(Context context);
-
-    /**
-     * Get {@link IndividualPickerFragment}
-     */
-    Fragment getIndividualPickerFragment(String collectionId);
-
-    /**
-     * Get {@link LiveWallpaperInfoFactory}
-     */
-    LiveWallpaperInfoFactory getLiveWallpaperInfoFactory(Context context);
-
-    /**
-     * Get {@link NetworkStatusNotifier}
-     */
-    NetworkStatusNotifier getNetworkStatusNotifier(Context context);
-
-    /**
-     * Get {@link PackageStatusNotifier}
-     */
-    PackageStatusNotifier getPackageStatusNotifier(Context context);
-
-    /**
-     * Get {@link PartnerProvider}
-     */
-    PartnerProvider getPartnerProvider(Context context);
-
-    /**
-     * Get {@link PerformanceMonitor}
-     */
-    PerformanceMonitor getPerformanceMonitor();
-
-    /**
-     * Get {@link Fragment} for previewing the wallpaper
-     * TODO b/242908637 Remove this method when migrating to the new wallpaper preview screen
-     */
-    Fragment getPreviewFragment(
-            Context context,
-            WallpaperInfo wallpaperInfo,
-            @PreviewMode int mode,
-            boolean viewAsHome,
-            boolean viewFullScreen,
-            boolean testingModeEnabled);
-
-    /**
-     * Get {@link Requester}
-     */
-    Requester getRequester(Context context);
-
-    /**
-     * Get {@link SystemFeatureChecker}
-     */
-    SystemFeatureChecker getSystemFeatureChecker();
-
-    /**
-     * Get {@link UserEventLogger}
-     */
-    UserEventLogger getUserEventLogger(Context context);
-
-    /**
-     * Get {@link WallpaperManagerCompat}
-     */
-    WallpaperManagerCompat getWallpaperManagerCompat(Context context);
-
-    /**
-     * Get {@link WallpaperPersister}
-     */
-    WallpaperPersister getWallpaperPersister(Context context);
-
-    /**
-     * Get {@link WallpaperPreferences}
-     */
-    WallpaperPreferences getPreferences(Context context);
-
-    /**
-     * Get {@link WallpaperPreviewFragmentManager}
-     */
-    WallpaperPreviewFragmentManager getWallpaperPreviewFragmentManager();
-
-    /**
-     * Get {@link WallpaperRefresher}
-     */
-    WallpaperRefresher getWallpaperRefresher(Context context);
-
-    /**
-     * Get {@link WallpaperRotationRefresher}
-     */
-    WallpaperRotationRefresher getWallpaperRotationRefresher();
-
-    /**
-     * Get {@link WallpaperStatusChecker}
-     */
-    WallpaperStatusChecker getWallpaperStatusChecker();
-
-    /**
-     * Returns a {@link FragmentFactory}.
-     */
-    default FragmentFactory getFragmentFactory() {
-        return null;
-    };
-
-    /** Returns the {@link BaseFlags} */
-    BaseFlags getFlags();
-
-    /** Provides the {@link UndoInteractor}. */
-    UndoInteractor getUndoInteractor(Context context);
-
-    /** Provides a map of supported {@link SnapshotRestorer} instances. */
-    default Map<Integer, SnapshotRestorer> getSnapshotRestorers(Context context) {
-        // Empty because we don't support undoing in WallpaperPicker2.
-        return new HashMap<>();
-    }
-}
diff --git a/src/com/android/wallpaper/module/Injector.kt b/src/com/android/wallpaper/module/Injector.kt
new file mode 100755
index 0000000..bcbf0e5
--- /dev/null
+++ b/src/com/android/wallpaper/module/Injector.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.wallpaper.module
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import androidx.fragment.app.Fragment
+import com.android.wallpaper.compat.WallpaperManagerCompat
+import com.android.wallpaper.config.BaseFlags
+import com.android.wallpaper.effects.EffectsController
+import com.android.wallpaper.effects.EffectsController.EffectsServiceListener
+import com.android.wallpaper.model.CategoryProvider
+import com.android.wallpaper.model.WallpaperInfo
+import com.android.wallpaper.monitor.PerformanceMonitor
+import com.android.wallpaper.network.Requester
+import com.android.wallpaper.picker.PreviewFragment
+import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer
+import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
+import com.android.wallpaper.util.DisplayUtils
+
+/**
+ * Interface for a provider of "injected dependencies." (NOTE: The term "injector" is somewhat of a
+ * misnomer; this is more aptly a service registry as part of a service locator design pattern.)
+ */
+interface Injector {
+    fun getAlarmManagerWrapper(context: Context): AlarmManagerWrapper
+
+    fun getBitmapCropper(): BitmapCropper
+
+    fun getCategoryProvider(context: Context): CategoryProvider
+
+    fun getCurrentWallpaperInfoFactory(context: Context): CurrentWallpaperInfoFactory
+
+    fun getCustomizationSections(activity: Activity): CustomizationSections
+
+    fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent
+
+    fun getDisplayUtils(context: Context): DisplayUtils
+
+    fun getDownloadableIntentAction(): String?
+
+    fun getDrawableLayerResolver(): DrawableLayerResolver
+
+    fun getEffectsController(context: Context, listener: EffectsServiceListener): EffectsController?
+
+    fun getExploreIntentChecker(context: Context): ExploreIntentChecker
+
+    fun getIndividualPickerFragment(collectionId: String): Fragment
+
+    fun getLiveWallpaperInfoFactory(context: Context): LiveWallpaperInfoFactory
+
+    fun getNetworkStatusNotifier(context: Context): NetworkStatusNotifier
+
+    fun getPackageStatusNotifier(context: Context): PackageStatusNotifier
+
+    fun getPartnerProvider(context: Context): PartnerProvider
+
+    fun getPerformanceMonitor(): PerformanceMonitor?
+
+    // TODO b/242908637 Remove this method when migrating to the new wallpaper preview screen
+    fun getPreviewFragment(
+        context: Context,
+        wallpaperInfo: WallpaperInfo,
+        @PreviewFragment.PreviewMode mode: Int,
+        viewAsHome: Boolean,
+        viewFullScreen: Boolean,
+        testingModeEnabled: Boolean
+    ): Fragment
+
+    fun getRequester(context: Context): Requester
+
+    fun getSystemFeatureChecker(): SystemFeatureChecker
+
+    fun getUserEventLogger(context: Context): UserEventLogger
+
+    fun getWallpaperManagerCompat(context: Context): WallpaperManagerCompat
+
+    fun getWallpaperPersister(context: Context): WallpaperPersister
+
+    fun getPreferences(context: Context): WallpaperPreferences
+
+    fun getWallpaperPreviewFragmentManager(): WallpaperPreviewFragmentManager
+
+    fun getWallpaperRefresher(context: Context): WallpaperRefresher
+
+    fun getWallpaperRotationRefresher(): WallpaperRotationRefresher
+
+    fun getWallpaperStatusChecker(): WallpaperStatusChecker
+
+    fun getFragmentFactory(): FragmentFactory? {
+        return null
+    }
+
+    fun getFlags(): BaseFlags
+
+    fun getUndoInteractor(context: Context): UndoInteractor
+
+    fun getSnapshotRestorers(context: Context): Map<Int, SnapshotRestorer> {
+        // Empty because we don't support undoing in WallpaperPicker2.
+        return HashMap()
+    }
+}
diff --git a/src/com/android/wallpaper/module/WallpaperPicker2Injector.java b/src/com/android/wallpaper/module/WallpaperPicker2Injector.java
deleted file mode 100755
index c8b695b..0000000
--- a/src/com/android/wallpaper/module/WallpaperPicker2Injector.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wallpaper.module;
-
-import static com.android.wallpaper.picker.PreviewFragment.ARG_FULL_SCREEN;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_PREVIEW_MODE;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_TESTING_MODE_ENABLED;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_VIEW_AS_HOME;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_WALLPAPER;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-import androidx.fragment.app.Fragment;
-
-import com.android.wallpaper.compat.WallpaperManagerCompat;
-import com.android.wallpaper.config.BaseFlags;
-import com.android.wallpaper.effects.EffectsController;
-import com.android.wallpaper.model.CategoryProvider;
-import com.android.wallpaper.model.LiveWallpaperInfo;
-import com.android.wallpaper.model.WallpaperInfo;
-import com.android.wallpaper.monitor.PerformanceMonitor;
-import com.android.wallpaper.network.Requester;
-import com.android.wallpaper.network.WallpaperRequester;
-import com.android.wallpaper.picker.CustomizationPickerActivity;
-import com.android.wallpaper.picker.ImagePreviewFragment;
-import com.android.wallpaper.picker.LivePreviewFragment;
-import com.android.wallpaper.picker.PreviewFragment;
-import com.android.wallpaper.picker.individual.IndividualPickerFragment;
-import com.android.wallpaper.picker.undo.data.repository.UndoRepository;
-import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor;
-import com.android.wallpaper.util.DisplayUtils;
-
-import kotlinx.coroutines.GlobalScope;
-
-/**
- * A concrete, real implementation of the dependency provider.
- */
-public class WallpaperPicker2Injector implements Injector {
-    private AlarmManagerWrapper mAlarmManagerWrapper;
-    private BitmapCropper mBitmapCropper;
-    private CategoryProvider mCategoryProvider;
-    private CurrentWallpaperInfoFactory mCurrentWallpaperFactory;
-    private CustomizationSections mCustomizationSections;
-    private DisplayUtils mDisplayUtils;
-    private DrawableLayerResolver mDrawableLayerResolver;
-    private ExploreIntentChecker mExploreIntentChecker;
-    private LiveWallpaperInfoFactory mLiveWallpaperInfoFactory;
-    private NetworkStatusNotifier mNetworkStatusNotifier;
-    private PackageStatusNotifier mPackageStatusNotifier;
-    private PartnerProvider mPartnerProvider;
-    private PerformanceMonitor mPerformanceMonitor;
-    private Requester mRequester;
-    private SystemFeatureChecker mSystemFeatureChecker;
-    private UserEventLogger mUserEventLogger;
-    private WallpaperManagerCompat mWallpaperManagerCompat;
-    private WallpaperPersister mWallpaperPersister;
-    private WallpaperPreferences mPrefs;
-    private WallpaperPreviewFragmentManager mWallpaperPreviewFragmentManager;
-    private WallpaperRefresher mWallpaperRefresher;
-    private WallpaperRotationRefresher mWallpaperRotationRefresher;
-    private WallpaperStatusChecker mWallpaperStatusChecker;
-    private BaseFlags mFlags;
-    private UndoInteractor mUndoInteractor;
-
-    @Override
-    public synchronized AlarmManagerWrapper getAlarmManagerWrapper(Context context) {
-        if (mAlarmManagerWrapper == null) {
-            mAlarmManagerWrapper = new DefaultAlarmManagerWrapper(context.getApplicationContext());
-        }
-        return mAlarmManagerWrapper;
-    }
-
-    @Override
-    public synchronized BitmapCropper getBitmapCropper() {
-        if (mBitmapCropper == null) {
-            mBitmapCropper = new DefaultBitmapCropper();
-        }
-        return mBitmapCropper;
-    }
-
-    @Override
-    public CategoryProvider getCategoryProvider(Context context) {
-        if (mCategoryProvider == null) {
-            mCategoryProvider = new DefaultCategoryProvider(context.getApplicationContext());
-        }
-        return mCategoryProvider;
-    }
-
-    @Override
-    public synchronized CurrentWallpaperInfoFactory getCurrentWallpaperInfoFactory(
-            Context context) {
-        if (mCurrentWallpaperFactory == null) {
-            mCurrentWallpaperFactory =
-                    new DefaultCurrentWallpaperInfoFactory(context.getApplicationContext());
-        }
-        return mCurrentWallpaperFactory;
-    }
-
-    @Override
-    public CustomizationSections getCustomizationSections(Activity activity) {
-        if (mCustomizationSections == null) {
-            mCustomizationSections = new WallpaperPickerSections();
-        }
-        return mCustomizationSections;
-    }
-
-    @Override
-    public Intent getDeepLinkRedirectIntent(Context context, Uri uri) {
-        Intent intent = new Intent();
-        intent.setClass(context, CustomizationPickerActivity.class);
-        intent.setData(uri);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-        return intent;
-    }
-
-    @Override
-    public DisplayUtils getDisplayUtils(Context context) {
-        if (mDisplayUtils == null) {
-            mDisplayUtils = new DisplayUtils(context.getApplicationContext());
-        }
-        return mDisplayUtils;
-    }
-
-    @Override
-    public String getDownloadableIntentAction() {
-        return null;
-    }
-
-    @Override
-    public DrawableLayerResolver getDrawableLayerResolver() {
-        if (mDrawableLayerResolver == null) {
-            mDrawableLayerResolver = new DefaultDrawableLayerResolver();
-        }
-        return mDrawableLayerResolver;
-    }
-
-    @Override
-    public EffectsController getEffectsController(Context context,
-            EffectsController.EffectsServiceListener listener) {
-        return null;
-    }
-
-    @Override
-    public synchronized ExploreIntentChecker getExploreIntentChecker(Context context) {
-        if (mExploreIntentChecker == null) {
-            mExploreIntentChecker = new DefaultExploreIntentChecker(
-                    context.getApplicationContext());
-        }
-        return mExploreIntentChecker;
-    }
-
-    @Override
-    public synchronized Fragment getIndividualPickerFragment(String collectionId) {
-        return IndividualPickerFragment.newInstance(collectionId);
-    }
-
-    @Override
-    public LiveWallpaperInfoFactory getLiveWallpaperInfoFactory(Context context) {
-        if (mLiveWallpaperInfoFactory == null) {
-            mLiveWallpaperInfoFactory = new DefaultLiveWallpaperInfoFactory();
-        }
-        return mLiveWallpaperInfoFactory;
-    }
-
-    @Override
-    public synchronized NetworkStatusNotifier getNetworkStatusNotifier(Context context) {
-        if (mNetworkStatusNotifier == null) {
-            mNetworkStatusNotifier = new DefaultNetworkStatusNotifier(
-                    context.getApplicationContext());
-        }
-        return mNetworkStatusNotifier;
-    }
-
-    @Override
-    public synchronized PackageStatusNotifier getPackageStatusNotifier(Context context) {
-        if (mPackageStatusNotifier == null) {
-            mPackageStatusNotifier = new DefaultPackageStatusNotifier(
-                    context.getApplicationContext());
-        }
-        return mPackageStatusNotifier;
-    }
-
-    @Override
-    public synchronized PartnerProvider getPartnerProvider(Context context) {
-        if (mPartnerProvider == null) {
-            mPartnerProvider = new DefaultPartnerProvider(context.getApplicationContext());
-        }
-        return mPartnerProvider;
-    }
-
-    @Override
-    public synchronized PerformanceMonitor getPerformanceMonitor() {
-        if (mPerformanceMonitor == null) {
-            mPerformanceMonitor = new PerformanceMonitor() {
-                @Override
-                public void recordFullResPreviewLoadedMemorySnapshot() {
-                    // No Op
-                }
-            };
-        }
-        return mPerformanceMonitor;
-    }
-
-    @Override
-    public Fragment getPreviewFragment(Context context, WallpaperInfo wallpaperInfo, int mode,
-            boolean viewAsHome, boolean viewFullScreen, boolean testingModeEnabled) {
-        Bundle args = new Bundle();
-        args.putParcelable(ARG_WALLPAPER, wallpaperInfo);
-        args.putInt(ARG_PREVIEW_MODE, mode);
-        args.putBoolean(ARG_VIEW_AS_HOME, viewAsHome);
-        args.putBoolean(ARG_FULL_SCREEN, viewFullScreen);
-        args.putBoolean(ARG_TESTING_MODE_ENABLED, testingModeEnabled);
-        PreviewFragment fragment = wallpaperInfo instanceof LiveWallpaperInfo
-                ? new LivePreviewFragment() : new ImagePreviewFragment();
-        fragment.setArguments(args);
-        return fragment;
-    }
-
-    @Override
-    public synchronized Requester getRequester(Context context) {
-        if (mRequester == null) {
-            mRequester = new WallpaperRequester(context.getApplicationContext());
-        }
-        return mRequester;
-    }
-
-    @Override
-    public synchronized SystemFeatureChecker getSystemFeatureChecker() {
-        if (mSystemFeatureChecker == null) {
-            mSystemFeatureChecker = new DefaultSystemFeatureChecker();
-        }
-        return mSystemFeatureChecker;
-    }
-
-    @Override
-    public UserEventLogger getUserEventLogger(Context context) {
-        if (mUserEventLogger == null) {
-            mUserEventLogger = new NoOpUserEventLogger();
-        }
-        return mUserEventLogger;
-    }
-
-    @Override
-    public synchronized WallpaperManagerCompat getWallpaperManagerCompat(Context context) {
-        if (mWallpaperManagerCompat == null) {
-            mWallpaperManagerCompat = WallpaperManagerCompat.getInstance(context);
-        }
-        return mWallpaperManagerCompat;
-    }
-
-    @Override
-    public synchronized WallpaperPersister getWallpaperPersister(Context context) {
-        if (mWallpaperPersister == null) {
-            mWallpaperPersister = new DefaultWallpaperPersister(context.getApplicationContext());
-        }
-        return mWallpaperPersister;
-    }
-
-    @Override
-    public synchronized WallpaperPreferences getPreferences(Context context) {
-        if (mPrefs == null) {
-            mPrefs = new DefaultWallpaperPreferences(context.getApplicationContext());
-        }
-        return mPrefs;
-    }
-
-    @Override
-    public synchronized WallpaperPreviewFragmentManager getWallpaperPreviewFragmentManager() {
-        if (mWallpaperPreviewFragmentManager == null) {
-            mWallpaperPreviewFragmentManager = new DefaultWallpaperPreviewFragmentManager();
-        }
-        return mWallpaperPreviewFragmentManager;
-    }
-
-    @Override
-    public synchronized WallpaperRefresher getWallpaperRefresher(Context context) {
-        if (mWallpaperRefresher == null) {
-            mWallpaperRefresher = new DefaultWallpaperRefresher(context.getApplicationContext());
-        }
-        return mWallpaperRefresher;
-    }
-
-    @Override
-    public synchronized WallpaperRotationRefresher getWallpaperRotationRefresher() {
-        if (mWallpaperRotationRefresher == null) {
-            mWallpaperRotationRefresher = new WallpaperRotationRefresher() {
-                @Override
-                public void refreshWallpaper(Context context, Listener listener) {
-                    // Not implemented
-                    listener.onError();
-                }
-            };
-        }
-        return mWallpaperRotationRefresher;
-    }
-
-    @Override
-    public WallpaperStatusChecker getWallpaperStatusChecker() {
-        if (mWallpaperStatusChecker == null) {
-            mWallpaperStatusChecker = new DefaultWallpaperStatusChecker();
-        }
-        return mWallpaperStatusChecker;
-    }
-
-    @Override
-    public BaseFlags getFlags() {
-        if (mFlags == null) {
-            mFlags = new BaseFlags() {};
-        }
-
-        return mFlags;
-    }
-
-    @Override
-    public final UndoInteractor getUndoInteractor(Context context) {
-        if (mUndoInteractor == null) {
-            mUndoInteractor = new UndoInteractor(
-                    GlobalScope.INSTANCE,
-                    new UndoRepository(),
-                    getSnapshotRestorers(context));
-        }
-
-        return mUndoInteractor;
-    }
-
-    /**
-     * When this injector is overridden, this is the minimal value that should be used by restorers
-     * returns in {@link #getSnapshotRestorers(Context)}.
-     */
-    protected static final int MIN_SNAPSHOT_RESTORER_KEY = 0;
-}
diff --git a/src/com/android/wallpaper/module/WallpaperPicker2Injector.kt b/src/com/android/wallpaper/module/WallpaperPicker2Injector.kt
new file mode 100755
index 0000000..d97e4be
--- /dev/null
+++ b/src/com/android/wallpaper/module/WallpaperPicker2Injector.kt
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.wallpaper.module
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.android.wallpaper.compat.WallpaperManagerCompat
+import com.android.wallpaper.config.BaseFlags
+import com.android.wallpaper.effects.EffectsController
+import com.android.wallpaper.effects.EffectsController.EffectsServiceListener
+import com.android.wallpaper.model.CategoryProvider
+import com.android.wallpaper.model.LiveWallpaperInfo
+import com.android.wallpaper.model.WallpaperInfo
+import com.android.wallpaper.monitor.PerformanceMonitor
+import com.android.wallpaper.network.Requester
+import com.android.wallpaper.network.WallpaperRequester
+import com.android.wallpaper.picker.CustomizationPickerActivity
+import com.android.wallpaper.picker.ImagePreviewFragment
+import com.android.wallpaper.picker.LivePreviewFragment
+import com.android.wallpaper.picker.PreviewFragment
+import com.android.wallpaper.picker.individual.IndividualPickerFragment
+import com.android.wallpaper.picker.undo.data.repository.UndoRepository
+import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
+import com.android.wallpaper.util.DisplayUtils
+import kotlinx.coroutines.GlobalScope
+
+open class WallpaperPicker2Injector : Injector {
+    private var alarmManagerWrapper: AlarmManagerWrapper? = null
+    private var bitmapCropper: BitmapCropper? = null
+    private var categoryProvider: CategoryProvider? = null
+    private var currentWallpaperFactory: CurrentWallpaperInfoFactory? = null
+    private var customizationSections: CustomizationSections? = null
+    private var displayUtils: DisplayUtils? = null
+    private var drawableLayerResolver: DrawableLayerResolver? = null
+    private var exploreIntentChecker: ExploreIntentChecker? = null
+    private var liveWallpaperInfoFactory: LiveWallpaperInfoFactory? = null
+    private var networkStatusNotifier: NetworkStatusNotifier? = null
+    private var packageStatusNotifier: PackageStatusNotifier? = null
+    private var partnerProvider: PartnerProvider? = null
+    private var performanceMonitor: PerformanceMonitor? = null
+    private var requester: Requester? = null
+    private var systemFeatureChecker: SystemFeatureChecker? = null
+    private var userEventLogger: UserEventLogger? = null
+    private var wallpaperManagerCompat: WallpaperManagerCompat? = null
+    private var wallpaperPersister: WallpaperPersister? = null
+    private var prefs: WallpaperPreferences? = null
+    private var wallpaperPreviewFragmentManager: WallpaperPreviewFragmentManager? = null
+    private var wallpaperRefresher: WallpaperRefresher? = null
+    private var wallpaperRotationRefresher: WallpaperRotationRefresher? = null
+    private var wallpaperStatusChecker: WallpaperStatusChecker? = null
+    private var flags: BaseFlags? = null
+    private var undoInteractor: UndoInteractor? = null
+
+    @Synchronized
+    override fun getAlarmManagerWrapper(context: Context): AlarmManagerWrapper {
+        return alarmManagerWrapper
+            ?: DefaultAlarmManagerWrapper(context.applicationContext).also {
+                alarmManagerWrapper = it
+            }
+    }
+
+    @Synchronized
+    override fun getBitmapCropper(): BitmapCropper {
+        return bitmapCropper ?: DefaultBitmapCropper().also { bitmapCropper = it }
+    }
+
+    override fun getCategoryProvider(context: Context): CategoryProvider {
+        return categoryProvider
+            ?: DefaultCategoryProvider(context.applicationContext).also { categoryProvider = it }
+    }
+
+    @Synchronized
+    override fun getCurrentWallpaperInfoFactory(context: Context): CurrentWallpaperInfoFactory {
+        return currentWallpaperFactory
+            ?: DefaultCurrentWallpaperInfoFactory(context.applicationContext).also {
+                currentWallpaperFactory = it
+            }
+    }
+
+    override fun getCustomizationSections(activity: Activity): CustomizationSections {
+
+        return customizationSections
+            ?: WallpaperPickerSections().also { customizationSections = it }
+    }
+
+    override fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent {
+        val intent = Intent()
+        intent.setClass(context, CustomizationPickerActivity::class.java)
+        intent.data = uri
+        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+        return intent
+    }
+
+    override fun getDisplayUtils(context: Context): DisplayUtils {
+        return displayUtils ?: DisplayUtils(context.applicationContext).also { displayUtils = it }
+    }
+
+    override fun getDownloadableIntentAction(): String? {
+        return null
+    }
+
+    override fun getDrawableLayerResolver(): DrawableLayerResolver {
+        return drawableLayerResolver
+            ?: DefaultDrawableLayerResolver().also { drawableLayerResolver = it }
+    }
+
+    override fun getEffectsController(
+        context: Context,
+        listener: EffectsServiceListener
+    ): EffectsController? {
+        return null
+    }
+
+    @Synchronized
+    override fun getExploreIntentChecker(context: Context): ExploreIntentChecker {
+        return exploreIntentChecker
+            ?: DefaultExploreIntentChecker(context.applicationContext).also {
+                exploreIntentChecker = it
+            }
+    }
+
+    @Synchronized
+    override fun getIndividualPickerFragment(collectionId: String): Fragment {
+        return IndividualPickerFragment.newInstance(collectionId)
+    }
+
+    override fun getLiveWallpaperInfoFactory(context: Context): LiveWallpaperInfoFactory {
+        return liveWallpaperInfoFactory
+            ?: DefaultLiveWallpaperInfoFactory().also { liveWallpaperInfoFactory = it }
+    }
+
+    @Synchronized
+    override fun getNetworkStatusNotifier(context: Context): NetworkStatusNotifier {
+        return networkStatusNotifier
+            ?: DefaultNetworkStatusNotifier(context.applicationContext).also {
+                networkStatusNotifier = it
+            }
+    }
+
+    @Synchronized
+    override fun getPackageStatusNotifier(context: Context): PackageStatusNotifier {
+        return packageStatusNotifier
+            ?: DefaultPackageStatusNotifier(context.applicationContext).also {
+                packageStatusNotifier = it
+            }
+    }
+
+    @Synchronized
+    override fun getPartnerProvider(context: Context): PartnerProvider {
+        return partnerProvider
+            ?: DefaultPartnerProvider(context.applicationContext).also { partnerProvider = it }
+    }
+
+    @Synchronized
+    override fun getPerformanceMonitor(): PerformanceMonitor? {
+
+        return performanceMonitor
+            ?: PerformanceMonitor {
+                    /** No Op */
+                }
+                .also { performanceMonitor = it }
+    }
+
+    override fun getPreviewFragment(
+        context: Context,
+        wallpaperInfo: WallpaperInfo,
+        mode: Int,
+        viewAsHome: Boolean,
+        viewFullScreen: Boolean,
+        testingModeEnabled: Boolean
+    ): Fragment {
+        val args = Bundle()
+        args.putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
+        args.putInt(PreviewFragment.ARG_PREVIEW_MODE, mode)
+        args.putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
+        args.putBoolean(PreviewFragment.ARG_FULL_SCREEN, viewFullScreen)
+        args.putBoolean(PreviewFragment.ARG_TESTING_MODE_ENABLED, testingModeEnabled)
+        val fragment =
+            if (wallpaperInfo is LiveWallpaperInfo) LivePreviewFragment()
+            else ImagePreviewFragment()
+        fragment.arguments = args
+        return fragment
+    }
+
+    @Synchronized
+    override fun getRequester(context: Context): Requester {
+        return requester ?: WallpaperRequester(context.applicationContext).also { requester = it }
+    }
+
+    @Synchronized
+    override fun getSystemFeatureChecker(): SystemFeatureChecker {
+        return systemFeatureChecker
+            ?: DefaultSystemFeatureChecker().also { systemFeatureChecker = it }
+    }
+
+    override fun getUserEventLogger(context: Context): UserEventLogger {
+        return userEventLogger ?: NoOpUserEventLogger().also { userEventLogger = it }
+    }
+
+    @Synchronized
+    override fun getWallpaperManagerCompat(context: Context): WallpaperManagerCompat {
+        return wallpaperManagerCompat
+            ?: WallpaperManagerCompat.getInstance(context).also { wallpaperManagerCompat = it }
+    }
+
+    @Synchronized
+    override fun getWallpaperPersister(context: Context): WallpaperPersister {
+        return wallpaperPersister
+            ?: DefaultWallpaperPersister(context.applicationContext).also {
+                wallpaperPersister = it
+            }
+    }
+
+    @Synchronized
+    override fun getPreferences(context: Context): WallpaperPreferences {
+        return prefs ?: DefaultWallpaperPreferences(context.applicationContext).also { prefs = it }
+    }
+
+    @Synchronized
+    override fun getWallpaperPreviewFragmentManager(): WallpaperPreviewFragmentManager {
+        return wallpaperPreviewFragmentManager
+            ?: DefaultWallpaperPreviewFragmentManager().also {
+                wallpaperPreviewFragmentManager = it
+            }
+    }
+
+    @Synchronized
+    override fun getWallpaperRefresher(context: Context): WallpaperRefresher {
+        return wallpaperRefresher
+            ?: DefaultWallpaperRefresher(context.applicationContext).also {
+                wallpaperRefresher = it
+            }
+    }
+
+    @Synchronized
+    override fun getWallpaperRotationRefresher(): WallpaperRotationRefresher {
+        return wallpaperRotationRefresher
+            ?: WallpaperRotationRefresher { _, listener ->
+                    // Not implemented
+                    listener.onError()
+                }
+                .also { wallpaperRotationRefresher = it }
+    }
+
+    override fun getWallpaperStatusChecker(): WallpaperStatusChecker {
+        return wallpaperStatusChecker
+            ?: DefaultWallpaperStatusChecker().also { wallpaperStatusChecker = it }
+    }
+
+    override fun getFlags(): BaseFlags {
+        return flags ?: object : BaseFlags() {}.also { flags = it }
+    }
+
+    override fun getUndoInteractor(context: Context): UndoInteractor {
+        return undoInteractor
+            ?: UndoInteractor(GlobalScope, UndoRepository(), getSnapshotRestorers(context)).also {
+                undoInteractor = it
+            }
+    }
+
+    companion object {
+        /**
+         * When this injector is overridden, this is the minimal value that should be used by
+         * restorers returns in [getSnapshotRestorers].
+         */
+        @JvmStatic protected val MIN_SNAPSHOT_RESTORER_KEY = 0
+    }
+}
diff --git a/src/com/android/wallpaper/picker/CategorySelectorFragment.java b/src/com/android/wallpaper/picker/CategorySelectorFragment.java
index f0ca422..2b6c71d 100644
--- a/src/com/android/wallpaper/picker/CategorySelectorFragment.java
+++ b/src/com/android/wallpaper/picker/CategorySelectorFragment.java
@@ -20,7 +20,6 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.content.Context;
 import android.content.Intent;
 import android.content.res.TypedArray;
 import android.graphics.Color;
@@ -119,23 +118,19 @@
         void cleanUp();
     }
 
-    private final CategoryProvider mCategoryProvider;
-
     private RecyclerView mImageGrid;
     private CategoryAdapter mAdapter;
+    private CategoryProvider mCategoryProvider;
     private ArrayList<Category> mCategories = new ArrayList<>();
     private Point mTileSizePx;
     private boolean mAwaitingCategories;
     private boolean mIsFeaturedCollectionAvailable;
 
-    public CategorySelectorFragment() {
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
         mAdapter = new CategoryAdapter(mCategories);
-        mCategoryProvider = InjectorProvider.getInjector().getCategoryProvider(getContext());
-    }
-
-    public CategorySelectorFragment(Context context) {
-        mAdapter = new CategoryAdapter(mCategories);
-        mCategoryProvider = InjectorProvider.getInjector().getCategoryProvider(context);
+        mCategoryProvider = InjectorProvider.getInjector().getCategoryProvider(requireContext());
     }
 
     @Nullable
diff --git a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment2.kt b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment2.kt
index 02edaa3..4a21dbc 100644
--- a/src/com/android/wallpaper/picker/individual/IndividualPickerFragment2.kt
+++ b/src/com/android/wallpaper/picker/individual/IndividualPickerFragment2.kt
@@ -437,7 +437,7 @@
 
     override fun onResume() {
         super.onResume()
-        val preferences = InjectorProvider.getInjector().getPreferences(activity)
+        val preferences = InjectorProvider.getInjector().getPreferences(requireActivity())
         preferences.lastAppActiveTimestamp = Date().time
 
         // Reset Glide memory settings to a "normal" level of usage since it may have been lowered
@@ -607,7 +607,7 @@
     }
 
     private fun getAppliedWallpaperIds(): Set<String> {
-        val prefs = InjectorProvider.getInjector().getPreferences(context)
+        val prefs = InjectorProvider.getInjector().getPreferences(requireContext())
         val wallpaperInfo = wallpaperManager?.wallpaperInfo
         val appliedWallpaperIds: MutableSet<String> = ArraySet()
         val homeWallpaperId =
diff --git a/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt b/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt
new file mode 100644
index 0000000..bd716b2
--- /dev/null
+++ b/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt
@@ -0,0 +1,45 @@
+package com.android.wallpaper.testing
+
+import android.os.Bundle
+import androidx.fragment.app.FragmentActivity
+import androidx.lifecycle.LifecycleOwner
+import com.android.wallpaper.model.CustomizationSectionController
+import com.android.wallpaper.model.PermissionRequester
+import com.android.wallpaper.model.WallpaperColorsViewModel
+import com.android.wallpaper.model.WallpaperPreviewNavigator
+import com.android.wallpaper.model.WorkspaceViewModel
+import com.android.wallpaper.module.CurrentWallpaperInfoFactory
+import com.android.wallpaper.module.CustomizationSections
+
+/** Test implementation of [CustomizationSections] */
+class TestCustomizationSections : CustomizationSections {
+    override fun getSectionControllersForScreen(
+        screen: CustomizationSections.Screen?,
+        activity: FragmentActivity?,
+        lifecycleOwner: LifecycleOwner?,
+        wallpaperColorsViewModel: WallpaperColorsViewModel?,
+        workspaceViewModel: WorkspaceViewModel?,
+        permissionRequester: PermissionRequester?,
+        wallpaperPreviewNavigator: WallpaperPreviewNavigator?,
+        sectionNavigationController:
+            CustomizationSectionController.CustomizationSectionNavigationController?,
+        savedInstanceState: Bundle?,
+        wallpaperInfoFactory: CurrentWallpaperInfoFactory?
+    ): MutableList<CustomizationSectionController<*>> {
+        return arrayListOf()
+    }
+
+    override fun getAllSectionControllers(
+        activity: FragmentActivity?,
+        lifecycleOwner: LifecycleOwner?,
+        wallpaperColorsViewModel: WallpaperColorsViewModel?,
+        workspaceViewModel: WorkspaceViewModel?,
+        permissionRequester: PermissionRequester?,
+        wallpaperPreviewNavigator: WallpaperPreviewNavigator?,
+        sectionNavigationController:
+            CustomizationSectionController.CustomizationSectionNavigationController?,
+        savedInstanceState: Bundle?
+    ): MutableList<CustomizationSectionController<*>> {
+        return arrayListOf()
+    }
+}
diff --git a/tests/src/com/android/wallpaper/testing/TestDrawableLayerResolver.kt b/tests/src/com/android/wallpaper/testing/TestDrawableLayerResolver.kt
new file mode 100644
index 0000000..43b3ad4
--- /dev/null
+++ b/tests/src/com/android/wallpaper/testing/TestDrawableLayerResolver.kt
@@ -0,0 +1,12 @@
+package com.android.wallpaper.testing
+
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.LayerDrawable
+import com.android.wallpaper.module.DrawableLayerResolver
+
+/** Test implementation of [DrawableLayerResolver] */
+class TestDrawableLayerResolver : DrawableLayerResolver {
+    override fun resolveLayer(layerDrawable: LayerDrawable?): Drawable {
+        return layerDrawable!!.getDrawable(0)
+    }
+}
diff --git a/tests/src/com/android/wallpaper/testing/TestInjector.java b/tests/src/com/android/wallpaper/testing/TestInjector.java
deleted file mode 100644
index 925cc2f..0000000
--- a/tests/src/com/android/wallpaper/testing/TestInjector.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.wallpaper.testing;
-
-import static com.android.wallpaper.picker.PreviewFragment.ARG_FULL_SCREEN;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_PREVIEW_MODE;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_TESTING_MODE_ENABLED;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_VIEW_AS_HOME;
-import static com.android.wallpaper.picker.PreviewFragment.ARG_WALLPAPER;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-
-import com.android.wallpaper.compat.WallpaperManagerCompat;
-import com.android.wallpaper.config.BaseFlags;
-import com.android.wallpaper.effects.EffectsController;
-import com.android.wallpaper.model.CategoryProvider;
-import com.android.wallpaper.model.WallpaperInfo;
-import com.android.wallpaper.module.AlarmManagerWrapper;
-import com.android.wallpaper.module.BitmapCropper;
-import com.android.wallpaper.module.CurrentWallpaperInfoFactory;
-import com.android.wallpaper.module.CustomizationSections;
-import com.android.wallpaper.module.DefaultLiveWallpaperInfoFactory;
-import com.android.wallpaper.module.DrawableLayerResolver;
-import com.android.wallpaper.module.ExploreIntentChecker;
-import com.android.wallpaper.module.Injector;
-import com.android.wallpaper.module.LiveWallpaperInfoFactory;
-import com.android.wallpaper.module.NetworkStatusNotifier;
-import com.android.wallpaper.module.PackageStatusNotifier;
-import com.android.wallpaper.module.PartnerProvider;
-import com.android.wallpaper.module.SystemFeatureChecker;
-import com.android.wallpaper.module.UserEventLogger;
-import com.android.wallpaper.module.WallpaperPersister;
-import com.android.wallpaper.module.WallpaperPreferences;
-import com.android.wallpaper.module.WallpaperPreviewFragmentManager;
-import com.android.wallpaper.module.WallpaperRefresher;
-import com.android.wallpaper.module.WallpaperRotationRefresher;
-import com.android.wallpaper.module.WallpaperStatusChecker;
-import com.android.wallpaper.monitor.PerformanceMonitor;
-import com.android.wallpaper.network.Requester;
-import com.android.wallpaper.picker.ImagePreviewFragment;
-import com.android.wallpaper.picker.individual.IndividualPickerFragment;
-import com.android.wallpaper.picker.undo.data.repository.UndoRepository;
-import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor;
-import com.android.wallpaper.util.DisplayUtils;
-
-import java.util.HashMap;
-
-import kotlinx.coroutines.GlobalScope;
-
-/**
- * Test implementation of the dependency injector.
- */
-public class TestInjector implements Injector {
-
-    private AlarmManagerWrapper mAlarmManagerWrapper;
-    private BitmapCropper mBitmapCropper;
-    private CategoryProvider mCategoryProvider;
-    private CurrentWallpaperInfoFactory mCurrentWallpaperInfoFactory;
-    private ExploreIntentChecker mExploreIntentChecker;
-    private NetworkStatusNotifier mNetworkStatusNotifier;
-    private PartnerProvider mPartnerProvider;
-    private PerformanceMonitor mPerformanceMonitor;
-    private SystemFeatureChecker mSystemFeatureChecker;
-    private UserEventLogger mUserEventLogger;
-    private WallpaperManagerCompat mWallpaperManagerCompat;
-    private WallpaperPersister mWallpaperPersister;
-    private WallpaperPreferences mPrefs;
-    private WallpaperPreviewFragmentManager mWallpaperPreviewFragmentManager;
-    private WallpaperRefresher mWallpaperRefresher;
-    private WallpaperRotationRefresher mWallpaperRotationRefresher;
-    private BaseFlags mFlags;
-    private UndoInteractor mUndoInteractor;
-
-    @Override
-    public AlarmManagerWrapper getAlarmManagerWrapper(Context unused) {
-        if (mAlarmManagerWrapper == null) {
-            mAlarmManagerWrapper = new TestAlarmManagerWrapper();
-        }
-        return mAlarmManagerWrapper;
-    }
-
-    @Override
-    public BitmapCropper getBitmapCropper() {
-        if (mBitmapCropper == null) {
-            mBitmapCropper = new com.android.wallpaper.testing.TestBitmapCropper();
-        }
-        return mBitmapCropper;
-    }
-
-    @Override
-    public CategoryProvider getCategoryProvider(Context context) {
-        if (mCategoryProvider == null) {
-            mCategoryProvider = new TestCategoryProvider();
-        }
-        return mCategoryProvider;
-    }
-
-    @Override
-    public CurrentWallpaperInfoFactory getCurrentWallpaperInfoFactory(Context context) {
-        if (mCurrentWallpaperInfoFactory == null) {
-            mCurrentWallpaperInfoFactory =
-                    new TestCurrentWallpaperInfoFactory(context.getApplicationContext());
-        }
-        return mCurrentWallpaperInfoFactory;
-    }
-
-    @Override
-    public CustomizationSections getCustomizationSections(Activity activity) {
-        return null;
-    }
-
-    @Override
-    public Intent getDeepLinkRedirectIntent(Context context, Uri uri) {
-        return null;
-    }
-
-    @Override
-    public DisplayUtils getDisplayUtils(Context context) {
-        return new DisplayUtils(context);
-    }
-
-    @Override
-    public String getDownloadableIntentAction() {
-        return null;
-    }
-
-    @Override
-    public DrawableLayerResolver getDrawableLayerResolver() {
-        return null;
-    }
-
-    @Nullable
-    @Override
-    public EffectsController getEffectsController(Context context,
-            EffectsController.EffectsServiceListener listener) {
-        return null;
-    }
-
-    @Override
-    public ExploreIntentChecker getExploreIntentChecker(Context unused) {
-        if (mExploreIntentChecker == null) {
-            mExploreIntentChecker = new TestExploreIntentChecker();
-        }
-        return mExploreIntentChecker;
-    }
-
-    @Override
-    public IndividualPickerFragment getIndividualPickerFragment(String collectionId) {
-        return IndividualPickerFragment.newInstance(collectionId);
-    }
-
-    @Override
-    public LiveWallpaperInfoFactory getLiveWallpaperInfoFactory(Context context) {
-        return new DefaultLiveWallpaperInfoFactory();
-    }
-
-    @Override
-    public NetworkStatusNotifier getNetworkStatusNotifier(Context context) {
-        if (mNetworkStatusNotifier == null) {
-            mNetworkStatusNotifier = new TestNetworkStatusNotifier();
-        }
-        return mNetworkStatusNotifier;
-    }
-
-    @Override
-    public PackageStatusNotifier getPackageStatusNotifier(Context context) {
-        return null;
-    }
-
-    @Override
-    public PartnerProvider getPartnerProvider(Context context) {
-        if (mPartnerProvider == null) {
-            mPartnerProvider = new TestPartnerProvider();
-        }
-        return mPartnerProvider;
-    }
-
-    @Override
-    public PerformanceMonitor getPerformanceMonitor() {
-        if (mPerformanceMonitor == null) {
-            mPerformanceMonitor = new TestPerformanceMonitor();
-        }
-        return mPerformanceMonitor;
-    }
-
-    @Override
-    public Fragment getPreviewFragment(Context context, WallpaperInfo wallpaperInfo, int mode,
-            boolean viewAsHome, boolean viewFullScreen, boolean testingModeEnabled) {
-        Bundle args = new Bundle();
-        args.putParcelable(ARG_WALLPAPER, wallpaperInfo);
-        args.putInt(ARG_PREVIEW_MODE, mode);
-        args.putBoolean(ARG_VIEW_AS_HOME, viewAsHome);
-        args.putBoolean(ARG_FULL_SCREEN, viewFullScreen);
-        args.putBoolean(ARG_TESTING_MODE_ENABLED, testingModeEnabled);
-        ImagePreviewFragment fragment = new ImagePreviewFragment();
-        fragment.setArguments(args);
-        return fragment;
-    }
-
-    @Override
-    public Requester getRequester(Context unused) {
-        return null;
-    }
-
-    @Override
-    public SystemFeatureChecker getSystemFeatureChecker() {
-        if (mSystemFeatureChecker == null) {
-            mSystemFeatureChecker = new com.android.wallpaper.testing.TestSystemFeatureChecker();
-        }
-        return mSystemFeatureChecker;
-    }
-
-    @Override
-    public UserEventLogger getUserEventLogger(Context unused) {
-        if (mUserEventLogger == null) {
-            mUserEventLogger = new com.android.wallpaper.testing.TestUserEventLogger();
-        }
-        return mUserEventLogger;
-    }
-
-    @Override
-    public WallpaperManagerCompat getWallpaperManagerCompat(Context context) {
-        if (mWallpaperManagerCompat == null) {
-            mWallpaperManagerCompat = new com.android.wallpaper.testing.TestWallpaperManagerCompat(
-                    context.getApplicationContext());
-        }
-        return mWallpaperManagerCompat;
-    }
-
-    @Override
-    public WallpaperPersister getWallpaperPersister(Context context) {
-        if (mWallpaperPersister == null) {
-            mWallpaperPersister = new TestWallpaperPersister(context.getApplicationContext());
-        }
-        return mWallpaperPersister;
-    }
-
-    @Override
-    public WallpaperPreferences getPreferences(Context context) {
-        if (mPrefs == null) {
-            mPrefs = new TestWallpaperPreferences();
-        }
-        return mPrefs;
-    }
-
-    @Override
-    public WallpaperPreviewFragmentManager getWallpaperPreviewFragmentManager() {
-        if (mWallpaperPreviewFragmentManager == null) {
-            mWallpaperPreviewFragmentManager = new TestWallpaperPreviewFragmentManager();
-        }
-        return mWallpaperPreviewFragmentManager;
-    }
-
-    @Override
-    public WallpaperRefresher getWallpaperRefresher(Context context) {
-        if (mWallpaperRefresher == null) {
-            mWallpaperRefresher = new TestWallpaperRefresher(context.getApplicationContext());
-        }
-        return mWallpaperRefresher;
-    }
-
-    @Override
-    public WallpaperRotationRefresher getWallpaperRotationRefresher() {
-        if (mWallpaperRotationRefresher == null) {
-            mWallpaperRotationRefresher = (context, listener) -> {
-                // Not implemented
-                listener.onError();
-            };
-        }
-        return mWallpaperRotationRefresher;
-    }
-
-    @Override
-    public WallpaperStatusChecker getWallpaperStatusChecker() {
-        return new WallpaperStatusChecker() {
-            @Override
-            public boolean isHomeStaticWallpaperSet(Context context) {
-                return true;
-            }
-
-            @Override
-            public boolean isLockWallpaperSet(Context context) {
-                return true;
-            }
-        };
-    }
-
-    @Override
-    public BaseFlags getFlags() {
-        if (mFlags == null) {
-            mFlags = new BaseFlags() {};
-        }
-
-        return mFlags;
-    }
-
-    @Override
-    public final UndoInteractor getUndoInteractor(Context context) {
-        if (mUndoInteractor == null) {
-            mUndoInteractor = new UndoInteractor(
-                    GlobalScope.INSTANCE,
-                    new UndoRepository(),
-                    new HashMap<>()); // Empty because we don't support undoing in WallpaperPicker2.
-        }
-
-        return mUndoInteractor;
-    }
-}
diff --git a/tests/src/com/android/wallpaper/testing/TestInjector.kt b/tests/src/com/android/wallpaper/testing/TestInjector.kt
new file mode 100644
index 0000000..7c15540
--- /dev/null
+++ b/tests/src/com/android/wallpaper/testing/TestInjector.kt
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.wallpaper.testing
+
+import android.app.Activity
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import com.android.wallpaper.compat.WallpaperManagerCompat
+import com.android.wallpaper.config.BaseFlags
+import com.android.wallpaper.effects.EffectsController
+import com.android.wallpaper.effects.EffectsController.EffectsServiceListener
+import com.android.wallpaper.model.CategoryProvider
+import com.android.wallpaper.model.WallpaperInfo
+import com.android.wallpaper.module.AlarmManagerWrapper
+import com.android.wallpaper.module.BitmapCropper
+import com.android.wallpaper.module.CurrentWallpaperInfoFactory
+import com.android.wallpaper.module.CustomizationSections
+import com.android.wallpaper.module.DefaultLiveWallpaperInfoFactory
+import com.android.wallpaper.module.DrawableLayerResolver
+import com.android.wallpaper.module.ExploreIntentChecker
+import com.android.wallpaper.module.Injector
+import com.android.wallpaper.module.LiveWallpaperInfoFactory
+import com.android.wallpaper.module.NetworkStatusNotifier
+import com.android.wallpaper.module.PackageStatusNotifier
+import com.android.wallpaper.module.PartnerProvider
+import com.android.wallpaper.module.SystemFeatureChecker
+import com.android.wallpaper.module.UserEventLogger
+import com.android.wallpaper.module.WallpaperPersister
+import com.android.wallpaper.module.WallpaperPreferences
+import com.android.wallpaper.module.WallpaperPreviewFragmentManager
+import com.android.wallpaper.module.WallpaperRefresher
+import com.android.wallpaper.module.WallpaperRotationRefresher
+import com.android.wallpaper.module.WallpaperStatusChecker
+import com.android.wallpaper.monitor.PerformanceMonitor
+import com.android.wallpaper.network.Requester
+import com.android.wallpaper.picker.ImagePreviewFragment
+import com.android.wallpaper.picker.PreviewFragment
+import com.android.wallpaper.picker.individual.IndividualPickerFragment
+import com.android.wallpaper.picker.undo.data.repository.UndoRepository
+import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
+import com.android.wallpaper.util.DisplayUtils
+import kotlinx.coroutines.GlobalScope
+
+/** Test implementation of [Injector] */
+open class TestInjector : Injector {
+    private var alarmManagerWrapper: AlarmManagerWrapper? = null
+    private var bitmapCropper: BitmapCropper? = null
+    private var categoryProvider: CategoryProvider? = null
+    private var currentWallpaperInfoFactory: CurrentWallpaperInfoFactory? = null
+    private var customizationSections: CustomizationSections? = null
+    private var drawableLayerResolver: DrawableLayerResolver? = null
+    private var exploreIntentChecker: ExploreIntentChecker? = null
+    private var networkStatusNotifier: NetworkStatusNotifier? = null
+    private var packageStatusNotifier: PackageStatusNotifier? = null
+    private var partnerProvider: PartnerProvider? = null
+    private var performanceMonitor: PerformanceMonitor? = null
+    private var requester: Requester? = null
+    private var systemFeatureChecker: SystemFeatureChecker? = null
+    private var userEventLogger: UserEventLogger? = null
+    private var wallpaperManagerCompat: WallpaperManagerCompat? = null
+    private var wallpaperPersister: WallpaperPersister? = null
+    private var prefs: WallpaperPreferences? = null
+    private var wallpaperPreviewFragmentManager: WallpaperPreviewFragmentManager? = null
+    private var wallpaperRefresher: WallpaperRefresher? = null
+    private var wallpaperRotationRefresher: WallpaperRotationRefresher? = null
+    private var flags: BaseFlags? = null
+    private var undoInteractor: UndoInteractor? = null
+
+    override fun getAlarmManagerWrapper(context: Context): AlarmManagerWrapper {
+        return alarmManagerWrapper ?: TestAlarmManagerWrapper().also { alarmManagerWrapper = it }
+    }
+
+    override fun getBitmapCropper(): BitmapCropper {
+        return bitmapCropper ?: TestBitmapCropper().also { bitmapCropper = it }
+    }
+
+    override fun getCategoryProvider(context: Context): CategoryProvider {
+        return categoryProvider ?: TestCategoryProvider().also { categoryProvider = it }
+    }
+
+    override fun getCurrentWallpaperInfoFactory(context: Context): CurrentWallpaperInfoFactory {
+        return currentWallpaperInfoFactory
+            ?: TestCurrentWallpaperInfoFactory(context.applicationContext).also {
+                currentWallpaperInfoFactory = it
+            }
+    }
+
+    override fun getCustomizationSections(activity: Activity): CustomizationSections {
+        return customizationSections
+            ?: TestCustomizationSections().also { customizationSections = it }
+    }
+
+    override fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent {
+        return Intent()
+    }
+
+    override fun getDisplayUtils(context: Context): DisplayUtils {
+        return DisplayUtils(context)
+    }
+
+    override fun getDownloadableIntentAction(): String? {
+        return null
+    }
+
+    override fun getDrawableLayerResolver(): DrawableLayerResolver {
+        return drawableLayerResolver
+            ?: TestDrawableLayerResolver().also { drawableLayerResolver = it }
+    }
+
+    override fun getEffectsController(
+        context: Context,
+        listener: EffectsServiceListener
+    ): EffectsController? {
+        return null
+    }
+
+    override fun getExploreIntentChecker(context: Context): ExploreIntentChecker {
+        return exploreIntentChecker ?: TestExploreIntentChecker().also { exploreIntentChecker = it }
+    }
+
+    override fun getIndividualPickerFragment(collectionId: String): IndividualPickerFragment {
+        return IndividualPickerFragment.newInstance(collectionId)
+    }
+
+    override fun getLiveWallpaperInfoFactory(context: Context): LiveWallpaperInfoFactory {
+        return DefaultLiveWallpaperInfoFactory()
+    }
+
+    override fun getNetworkStatusNotifier(context: Context): NetworkStatusNotifier {
+        return networkStatusNotifier
+            ?: TestNetworkStatusNotifier().also { networkStatusNotifier = it }
+    }
+
+    override fun getPackageStatusNotifier(context: Context): PackageStatusNotifier {
+        return packageStatusNotifier
+            ?: TestPackageStatusNotifier().also { packageStatusNotifier = it }
+    }
+
+    override fun getPartnerProvider(context: Context): PartnerProvider {
+        return partnerProvider ?: TestPartnerProvider().also { partnerProvider = it }
+    }
+
+    override fun getPerformanceMonitor(): PerformanceMonitor? {
+        return performanceMonitor ?: TestPerformanceMonitor().also { performanceMonitor = it }
+    }
+
+    override fun getPreviewFragment(
+        context: Context,
+        wallpaperInfo: WallpaperInfo,
+        mode: Int,
+        viewAsHome: Boolean,
+        viewFullScreen: Boolean,
+        testingModeEnabled: Boolean
+    ): Fragment {
+        val args = Bundle()
+        args.putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
+        args.putInt(PreviewFragment.ARG_PREVIEW_MODE, mode)
+        args.putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
+        args.putBoolean(PreviewFragment.ARG_FULL_SCREEN, viewFullScreen)
+        args.putBoolean(PreviewFragment.ARG_TESTING_MODE_ENABLED, testingModeEnabled)
+        val fragment = ImagePreviewFragment()
+        fragment.arguments = args
+        return fragment
+    }
+
+    override fun getRequester(unused: Context): Requester {
+        return requester ?: TestRequester().also { requester = it }
+    }
+
+    override fun getSystemFeatureChecker(): SystemFeatureChecker {
+        return systemFeatureChecker ?: TestSystemFeatureChecker().also { systemFeatureChecker = it }
+    }
+
+    override fun getUserEventLogger(context: Context): UserEventLogger {
+        return userEventLogger ?: TestUserEventLogger().also { userEventLogger = it }
+    }
+
+    override fun getWallpaperManagerCompat(context: Context): WallpaperManagerCompat {
+        return wallpaperManagerCompat
+            ?: TestWallpaperManagerCompat(context.applicationContext).also {
+                wallpaperManagerCompat = it
+            }
+    }
+
+    override fun getWallpaperPersister(context: Context): WallpaperPersister {
+        return wallpaperPersister
+            ?: TestWallpaperPersister(context.applicationContext).also { wallpaperPersister = it }
+    }
+
+    override fun getPreferences(context: Context): WallpaperPreferences {
+        return prefs ?: TestWallpaperPreferences().also { prefs = it }
+    }
+
+    override fun getWallpaperPreviewFragmentManager(): WallpaperPreviewFragmentManager {
+        return wallpaperPreviewFragmentManager
+            ?: TestWallpaperPreviewFragmentManager().also { wallpaperPreviewFragmentManager = it }
+    }
+
+    override fun getWallpaperRefresher(context: Context): WallpaperRefresher {
+        return wallpaperRefresher
+            ?: TestWallpaperRefresher(context.applicationContext).also { wallpaperRefresher = it }
+    }
+
+    override fun getWallpaperRotationRefresher(): WallpaperRotationRefresher {
+        return wallpaperRotationRefresher
+            ?: WallpaperRotationRefresher {
+                    context: Context?,
+                    listener: WallpaperRotationRefresher.Listener ->
+                    // Not implemented
+                    listener.onError()
+                }
+                .also { wallpaperRotationRefresher = it }
+    }
+
+    override fun getWallpaperStatusChecker(): WallpaperStatusChecker {
+        return object : WallpaperStatusChecker {
+            override fun isHomeStaticWallpaperSet(context: Context): Boolean {
+                return true
+            }
+
+            override fun isLockWallpaperSet(context: Context): Boolean {
+                return true
+            }
+        }
+    }
+
+    override fun getFlags(): BaseFlags {
+        return flags ?: object : BaseFlags() {}.also { flags = it }
+    }
+
+    override fun getUndoInteractor(context: Context): UndoInteractor {
+        return undoInteractor
+            ?: UndoInteractor(
+                GlobalScope,
+                UndoRepository(),
+                HashMap()
+            ) // Empty because we don't support undoing in WallpaperPicker2..also{}
+    }
+}
diff --git a/tests/src/com/android/wallpaper/testing/TestPackageStatusNotifier.kt b/tests/src/com/android/wallpaper/testing/TestPackageStatusNotifier.kt
new file mode 100644
index 0000000..fad8652
--- /dev/null
+++ b/tests/src/com/android/wallpaper/testing/TestPackageStatusNotifier.kt
@@ -0,0 +1,14 @@
+package com.android.wallpaper.testing
+
+import com.android.wallpaper.module.PackageStatusNotifier
+
+/** Test implementation of [PackageStatusNotifier] */
+class TestPackageStatusNotifier : PackageStatusNotifier {
+    override fun addListener(listener: PackageStatusNotifier.Listener?, action: String?) {
+        // Do nothing intended
+    }
+
+    override fun removeListener(listener: PackageStatusNotifier.Listener?) {
+        // Do nothing intended
+    }
+}
diff --git a/tests/src/com/android/wallpaper/testing/TestRequester.kt b/tests/src/com/android/wallpaper/testing/TestRequester.kt
new file mode 100644
index 0000000..7f2f007
--- /dev/null
+++ b/tests/src/com/android/wallpaper/testing/TestRequester.kt
@@ -0,0 +1,32 @@
+package com.android.wallpaper.testing
+
+import android.app.Activity
+import android.graphics.Bitmap
+import android.net.Uri
+import com.android.volley.Request
+import com.android.wallpaper.network.Requester
+import com.bumptech.glide.request.target.Target
+import java.io.File
+
+/** Test implementation of [Requester] */
+class TestRequester : Requester {
+    override fun <T : Any?> addToRequestQueue(request: Request<T>?) {
+        // Do nothing intended
+    }
+
+    override fun loadImageFile(imageUrl: Uri?): File {
+        return File("test_file.txt")
+    }
+
+    override fun loadImageFileWithActivity(
+        activity: Activity?,
+        imageUrl: Uri?,
+        target: Target<File>?
+    ) {
+        // Do nothing intended
+    }
+
+    override fun loadImageBitmap(imageUrl: Uri?, target: Target<Bitmap>?) {
+        // Do nothing intended
+    }
+}