[TP] Make injectors kt

Convert all injectors in wallpaper picker app to Kotlin files

Test: Make sure build and manually run the CUJs
Bug: 263826701
Change-Id: Ieae0ace6f0590421410ccb38b41db5a44d68dabf
diff --git a/src/com/android/customization/model/color/ColorProvider.kt b/src/com/android/customization/model/color/ColorProvider.kt
index 159d08f..3d2cc7e 100644
--- a/src/com/android/customization/model/color/ColorProvider.kt
+++ b/src/com/android/customization/model/color/ColorProvider.kt
@@ -288,7 +288,7 @@
 
                     if (
                         style == Style.MONOCHROMATIC &&
-                            !InjectorProvider.getInjector().flags.isMonochromaticFlagEnabled()
+                            !InjectorProvider.getInjector().getFlags().isMonochromaticFlagEnabled()
                     ) {
                         continue
                     }
diff --git a/src/com/android/customization/module/CustomizationInjector.java b/src/com/android/customization/module/CustomizationInjector.java
deleted file mode 100644
index 2cc1245..0000000
--- a/src/com/android/customization/module/CustomizationInjector.java
+++ /dev/null
@@ -1,41 +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.customization.module;
-
-import android.content.Context;
-
-import androidx.fragment.app.FragmentActivity;
-
-import com.android.customization.model.theme.OverlayManagerCompat;
-import com.android.customization.model.theme.ThemeBundleProvider;
-import com.android.customization.model.theme.ThemeManager;
-import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
-import com.android.wallpaper.module.Injector;
-
-public interface CustomizationInjector extends Injector {
-
-    CustomizationPreferences getCustomizationPreferences(Context context);
-
-    ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
-            OverlayManagerCompat overlayManagerCompat, ThemesUserEventLogger logger);
-
-
-    /**
-     * Get {@link KeyguardQuickAffordancePickerInteractor}
-     */
-    KeyguardQuickAffordancePickerInteractor getKeyguardQuickAffordancePickerInteractor(
-            Context context);
-}
diff --git a/src/com/android/customization/module/CustomizationInjector.kt b/src/com/android/customization/module/CustomizationInjector.kt
new file mode 100644
index 0000000..3cf8393
--- /dev/null
+++ b/src/com/android/customization/module/CustomizationInjector.kt
@@ -0,0 +1,39 @@
+/*
+ * 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.customization.module
+
+import android.content.Context
+import androidx.fragment.app.FragmentActivity
+import com.android.customization.model.theme.OverlayManagerCompat
+import com.android.customization.model.theme.ThemeBundleProvider
+import com.android.customization.model.theme.ThemeManager
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.wallpaper.module.Injector
+
+interface CustomizationInjector : Injector {
+    fun getCustomizationPreferences(context: Context): CustomizationPreferences
+
+    fun getThemeManager(
+        provider: ThemeBundleProvider,
+        activity: FragmentActivity,
+        overlayManagerCompat: OverlayManagerCompat,
+        logger: ThemesUserEventLogger
+    ): ThemeManager
+
+    fun getKeyguardQuickAffordancePickerInteractor(
+        context: Context
+    ): KeyguardQuickAffordancePickerInteractor
+}
diff --git a/src/com/android/customization/module/ThemePickerInjector.java b/src/com/android/customization/module/ThemePickerInjector.java
deleted file mode 100644
index fb778f1..0000000
--- a/src/com/android/customization/module/ThemePickerInjector.java
+++ /dev/null
@@ -1,236 +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.customization.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 androidx.fragment.app.FragmentActivity;
-
-import com.android.customization.model.theme.OverlayManagerCompat;
-import com.android.customization.model.theme.ThemeBundleProvider;
-import com.android.customization.model.theme.ThemeManager;
-import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository;
-import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor;
-import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer;
-import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel;
-import com.android.systemui.shared.customization.data.content.CustomizationProviderClient;
-import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl;
-import com.android.wallpaper.config.BaseFlags;
-import com.android.wallpaper.model.LiveWallpaperInfo;
-import com.android.wallpaper.model.WallpaperInfo;
-import com.android.wallpaper.module.CustomizationSections;
-import com.android.wallpaper.module.FragmentFactory;
-import com.android.wallpaper.module.WallpaperPicker2Injector;
-import com.android.wallpaper.module.WallpaperPreferences;
-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.undo.domain.interactor.SnapshotRestorer;
-
-import java.util.Map;
-
-import kotlinx.coroutines.Dispatchers;
-
-/**
- * A concrete, real implementation of the dependency provider.
- */
-public class ThemePickerInjector extends WallpaperPicker2Injector
-        implements CustomizationInjector {
-    private CustomizationSections mCustomizationSections;
-    private ThemesUserEventLogger mUserEventLogger;
-    private WallpaperPreferences mPrefs;
-    private KeyguardQuickAffordancePickerInteractor mKeyguardQuickAffordancePickerInteractor;
-    private KeyguardQuickAffordancePickerViewModel.Factory
-            mKeyguardQuickAffordancePickerViewModelFactory;
-    private CustomizationProviderClient mCustomizationProviderClient;
-    private FragmentFactory mFragmentFactory;
-    private BaseFlags mFlags;
-    private KeyguardQuickAffordanceSnapshotRestorer mKeyguardQuickAffordanceSnapshotRestorer;
-
-    @Override
-    public CustomizationSections getCustomizationSections(Activity activity) {
-        if (mCustomizationSections == null) {
-            mCustomizationSections = new DefaultCustomizationSections(
-                    mKeyguardQuickAffordancePickerInteractor,
-                    mKeyguardQuickAffordancePickerViewModelFactory);
-        }
-        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 String getDownloadableIntentAction() {
-        return null;
-    }
-
-    @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 ThemesUserEventLogger getUserEventLogger(Context context) {
-        if (mUserEventLogger == null) {
-            mUserEventLogger = new StatsLogUserEventLogger(context);
-        }
-        return mUserEventLogger;
-    }
-
-    @Override
-    public synchronized WallpaperPreferences getPreferences(Context context) {
-        if (mPrefs == null) {
-            mPrefs = new DefaultCustomizationPreferences(context.getApplicationContext());
-        }
-        return mPrefs;
-    }
-
-    //
-    // Functions from {@link CustomizationInjector}
-    //
-    @Override
-    public CustomizationPreferences getCustomizationPreferences(Context context) {
-        return (CustomizationPreferences) getPreferences(context);
-    }
-
-    @Override
-    public ThemeManager getThemeManager(ThemeBundleProvider provider, FragmentActivity activity,
-            OverlayManagerCompat overlayManagerCompat, ThemesUserEventLogger logger) {
-        return new ThemeManager(provider, activity, overlayManagerCompat, logger);
-    }
-
-    @Override
-    public KeyguardQuickAffordancePickerInteractor getKeyguardQuickAffordancePickerInteractor(
-            Context context) {
-        if (mKeyguardQuickAffordancePickerInteractor == null) {
-            final CustomizationProviderClient client =
-                    getKeyguardQuickAffordancePickerProviderClient(context);
-            mKeyguardQuickAffordancePickerInteractor = new KeyguardQuickAffordancePickerInteractor(
-                    new KeyguardQuickAffordancePickerRepository(client, Dispatchers.getIO()),
-                    client,
-                    () -> getKeyguardQuickAffordanceSnapshotRestorer(context));
-        }
-        return mKeyguardQuickAffordancePickerInteractor;
-    }
-
-    /**
-     * Returns a {@link KeyguardQuickAffordancePickerViewModel.Factory}.
-     */
-    public KeyguardQuickAffordancePickerViewModel.Factory
-            getKeyguardQuickAffordancePickerViewModelFactory(Context context) {
-        if (mKeyguardQuickAffordancePickerViewModelFactory == null) {
-            mKeyguardQuickAffordancePickerViewModelFactory =
-                    new KeyguardQuickAffordancePickerViewModel.Factory(
-                            context,
-                            getKeyguardQuickAffordancePickerInteractor(context),
-                            getUndoInteractor(context),
-                            getCurrentWallpaperInfoFactory(context));
-        }
-        return mKeyguardQuickAffordancePickerViewModelFactory;
-    }
-
-    @Override
-    public FragmentFactory getFragmentFactory() {
-        if (mFragmentFactory == null) {
-            mFragmentFactory = new ThemePickerFragmentFactory();
-        }
-        return mFragmentFactory;
-    }
-
-    @Override
-    public BaseFlags getFlags() {
-        if (mFlags == null) {
-            mFlags = new BaseFlags() {};
-        }
-
-        return mFlags;
-    }
-
-    @Override
-    public Map<Integer, SnapshotRestorer> getSnapshotRestorers(Context context) {
-        final Map<Integer, SnapshotRestorer> restorers = super.getSnapshotRestorers(context);
-        restorers.put(
-                KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER,
-                getKeyguardQuickAffordanceSnapshotRestorer(context));
-        return restorers;
-    }
-
-    /** Returns the {@link CustomizationProviderClient}. */
-    protected CustomizationProviderClient getKeyguardQuickAffordancePickerProviderClient(
-            Context context) {
-        if (mCustomizationProviderClient == null) {
-            mCustomizationProviderClient =
-                    new CustomizationProviderClientImpl(context, Dispatchers.getIO());
-        }
-
-        return mCustomizationProviderClient;
-    }
-
-    protected KeyguardQuickAffordanceSnapshotRestorer getKeyguardQuickAffordanceSnapshotRestorer(
-            Context context) {
-        if (mKeyguardQuickAffordanceSnapshotRestorer == null) {
-            mKeyguardQuickAffordanceSnapshotRestorer = new KeyguardQuickAffordanceSnapshotRestorer(
-                    getKeyguardQuickAffordancePickerInteractor(context),
-                    getKeyguardQuickAffordancePickerProviderClient(context));
-        }
-
-        return mKeyguardQuickAffordanceSnapshotRestorer;
-    }
-
-    private static final int KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER =
-            WallpaperPicker2Injector.MIN_SNAPSHOT_RESTORER_KEY;
-
-    /**
-     * 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 =
-            KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER + 1;
-}
diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt
new file mode 100644
index 0000000..b3f95d5
--- /dev/null
+++ b/src/com/android/customization/module/ThemePickerInjector.kt
@@ -0,0 +1,205 @@
+/*
+ * 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.customization.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 androidx.fragment.app.FragmentActivity
+import com.android.customization.model.theme.OverlayManagerCompat
+import com.android.customization.model.theme.ThemeBundleProvider
+import com.android.customization.model.theme.ThemeManager
+import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer
+import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
+import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl
+import com.android.wallpaper.model.LiveWallpaperInfo
+import com.android.wallpaper.model.WallpaperInfo
+import com.android.wallpaper.module.CustomizationSections
+import com.android.wallpaper.module.FragmentFactory
+import com.android.wallpaper.module.UserEventLogger
+import com.android.wallpaper.module.WallpaperPicker2Injector
+import com.android.wallpaper.module.WallpaperPreferences
+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.undo.domain.interactor.SnapshotRestorer
+import kotlinx.coroutines.Dispatchers.IO
+
+open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInjector {
+    private var customizationSections: CustomizationSections? = null
+    private var userEventLogger: UserEventLogger? = null
+    private var prefs: WallpaperPreferences? = null
+    private var keyguardQuickAffordancePickerInteractor: KeyguardQuickAffordancePickerInteractor? =
+        null
+    private var keyguardQuickAffordancePickerViewModelFactory:
+        KeyguardQuickAffordancePickerViewModel.Factory? =
+        null
+    private var customizationProviderClient: CustomizationProviderClient? = null
+    private var fragmentFactory: FragmentFactory? = null
+    private var keyguardQuickAffordanceSnapshotRestorer: KeyguardQuickAffordanceSnapshotRestorer? =
+        null
+
+    override fun getCustomizationSections(activity: Activity): CustomizationSections {
+        return customizationSections
+            ?: DefaultCustomizationSections(
+                    getKeyguardQuickAffordancePickerInteractor(activity),
+                    getKeyguardQuickAffordancePickerViewModelFactory(activity)
+                )
+                .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 getDownloadableIntentAction(): String? {
+        return null
+    }
+
+    override fun getPreviewFragment(
+        context: Context,
+        wallpaperInfo: WallpaperInfo,
+        mode: Int,
+        viewAsHome: Boolean,
+        viewFullScreen: Boolean,
+        testingModeEnabled: Boolean
+    ): Fragment {
+        return if (wallpaperInfo is LiveWallpaperInfo) LivePreviewFragment()
+        else
+            ImagePreviewFragment().apply {
+                arguments =
+                    Bundle().apply {
+                        putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
+                        putInt(PreviewFragment.ARG_PREVIEW_MODE, mode)
+                        putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
+                        putBoolean(PreviewFragment.ARG_FULL_SCREEN, viewFullScreen)
+                        putBoolean(PreviewFragment.ARG_TESTING_MODE_ENABLED, testingModeEnabled)
+                    }
+            }
+    }
+
+    @Synchronized
+    override fun getUserEventLogger(context: Context): ThemesUserEventLogger {
+        return if (userEventLogger != null) userEventLogger as ThemesUserEventLogger
+        else StatsLogUserEventLogger(context).also { userEventLogger = it }
+    }
+
+    @Synchronized
+    override fun getPreferences(context: Context): WallpaperPreferences {
+        return prefs
+            ?: DefaultCustomizationPreferences(context.applicationContext).also { prefs = it }
+    }
+
+    override fun getFragmentFactory(): FragmentFactory? {
+        return fragmentFactory ?: ThemePickerFragmentFactory().also { fragmentFactory }
+    }
+
+    override fun getSnapshotRestorers(context: Context): Map<Int, SnapshotRestorer> {
+        return super<WallpaperPicker2Injector>.getSnapshotRestorers(context).toMutableMap().apply {
+            this[KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER] =
+                getKeyguardQuickAffordanceSnapshotRestorer(context)
+        }
+    }
+
+    override fun getCustomizationPreferences(context: Context): CustomizationPreferences {
+        return getPreferences(context) as CustomizationPreferences
+    }
+
+    override fun getThemeManager(
+        provider: ThemeBundleProvider,
+        activity: FragmentActivity,
+        overlayManagerCompat: OverlayManagerCompat,
+        logger: ThemesUserEventLogger
+    ): ThemeManager {
+        return ThemeManager(provider, activity, overlayManagerCompat, logger)
+    }
+
+    override fun getKeyguardQuickAffordancePickerInteractor(
+        context: Context
+    ): KeyguardQuickAffordancePickerInteractor {
+        return keyguardQuickAffordancePickerInteractor
+            ?: getKeyguardQuickAffordancePickerInteractorImpl(context).also {
+                keyguardQuickAffordancePickerInteractor = it
+            }
+    }
+
+    fun getKeyguardQuickAffordancePickerViewModelFactory(
+        context: Context
+    ): KeyguardQuickAffordancePickerViewModel.Factory {
+        return keyguardQuickAffordancePickerViewModelFactory
+            ?: KeyguardQuickAffordancePickerViewModel.Factory(
+                    context,
+                    getKeyguardQuickAffordancePickerInteractor(context),
+                    getUndoInteractor(context),
+                    getCurrentWallpaperInfoFactory(context),
+                )
+                .also { keyguardQuickAffordancePickerViewModelFactory = it }
+    }
+
+    private fun getKeyguardQuickAffordancePickerInteractorImpl(
+        context: Context
+    ): KeyguardQuickAffordancePickerInteractor {
+        val client = getKeyguardQuickAffordancePickerProviderClient(context)
+        return KeyguardQuickAffordancePickerInteractor(
+            KeyguardQuickAffordancePickerRepository(client, IO),
+            client
+        ) { getKeyguardQuickAffordanceSnapshotRestorer(context) }
+    }
+
+    protected fun getKeyguardQuickAffordancePickerProviderClient(
+        context: Context
+    ): CustomizationProviderClient {
+        return customizationProviderClient
+            ?: CustomizationProviderClientImpl(context, IO).also {
+                customizationProviderClient = it
+            }
+    }
+
+    protected fun getKeyguardQuickAffordanceSnapshotRestorer(
+        context: Context
+    ): KeyguardQuickAffordanceSnapshotRestorer {
+        return keyguardQuickAffordanceSnapshotRestorer
+            ?: KeyguardQuickAffordanceSnapshotRestorer(
+                    getKeyguardQuickAffordancePickerInteractor(context),
+                    getKeyguardQuickAffordancePickerProviderClient(context)
+                )
+                .also { keyguardQuickAffordanceSnapshotRestorer = it }
+    }
+
+    companion object {
+        @JvmStatic
+        private val KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER =
+            WallpaperPicker2Injector.MIN_SNAPSHOT_RESTORER_KEY
+
+        /**
+         * 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 = KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER + 1
+    }
+}