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
+    }
+}
