Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/res/layout/clock_size_radio_button_group.xml b/res/layout/clock_size_radio_button_group.xml
index 56d0ab7..5e8fcf5 100644
--- a/res/layout/clock_size_radio_button_group.xml
+++ b/res/layout/clock_size_radio_button_group.xml
@@ -43,12 +43,17 @@
                 style="@style/SectionTitleTextStyle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:singleLine="true"
                 android:text="@string/clock_size_dynamic" />
 
             <TextView
                 style="@style/SectionSubtitleTextStyle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:maxLines="2"
+                android:ellipsize="end"
+                android:singleLine="false"
                 android:text="@string/clock_size_dynamic_description" />
         </LinearLayout>
     </LinearLayout>
@@ -76,12 +81,17 @@
                 style="@style/SectionTitleTextStyle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:ellipsize="end"
+                android:singleLine="true"
                 android:text="@string/clock_size_small" />
 
             <TextView
                 style="@style/SectionSubtitleTextStyle"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:maxLines="2"
+                android:ellipsize="end"
+                android:singleLine="false"
                 android:text="@string/clock_size_small_description" />
         </LinearLayout>
     </LinearLayout>
diff --git a/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt b/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt
new file mode 100644
index 0000000..0f52024
--- /dev/null
+++ b/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt
@@ -0,0 +1,118 @@
+package com.android.customization.testing
+
+import android.content.Context
+import android.content.res.Resources
+import androidx.activity.ComponentActivity
+import androidx.fragment.app.FragmentActivity
+import com.android.customization.model.theme.OverlayManagerCompat
+import com.android.customization.model.theme.ThemeBundleProvider
+import com.android.customization.model.theme.ThemeManager
+import com.android.customization.module.CustomizationInjector
+import com.android.customization.module.CustomizationPreferences
+import com.android.customization.module.ThemesUserEventLogger
+import com.android.customization.picker.clock.domain.interactor.ClockPickerInteractor
+import com.android.customization.picker.clock.ui.view.ClockViewFactory
+import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel
+import com.android.customization.picker.clock.ui.viewmodel.ClockSectionViewModel
+import com.android.customization.picker.clock.ui.viewmodel.ClockSettingsViewModel
+import com.android.customization.picker.clock.utils.ClockDescriptionUtils
+import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor
+import com.android.customization.picker.color.ui.viewmodel.ColorPickerViewModel
+import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
+import com.android.systemui.shared.clocks.ClockRegistry
+import com.android.wallpaper.model.WallpaperColorsRepository
+import com.android.wallpaper.module.UserEventLogger
+import com.android.wallpaper.testing.TestInjector
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class TestCustomizationInjector @Inject constructor() : TestInjector(), CustomizationInjector {
+    private var customizationPrefs: CustomizationPreferences? = null
+    private var themeManager: ThemeManager? = null
+    private var themesUserEventLogger: ThemesUserEventLogger? = null
+
+    /////////////////
+    // CustomizationInjector implementations
+    /////////////////
+
+    override fun getCustomizationPreferences(context: Context): CustomizationPreferences {
+        return customizationPrefs
+            ?: TestDefaultCustomizationPreferences(context).also { customizationPrefs = it }
+    }
+
+    override fun getThemeManager(
+        provider: ThemeBundleProvider,
+        activity: FragmentActivity,
+        overlayManagerCompat: OverlayManagerCompat,
+        logger: ThemesUserEventLogger,
+    ): ThemeManager {
+        return themeManager
+            ?: TestThemeManager(provider, activity, overlayManagerCompat, logger).also {
+                themeManager = it
+            }
+    }
+
+    override fun getKeyguardQuickAffordancePickerInteractor(
+        context: Context
+    ): KeyguardQuickAffordancePickerInteractor {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockRegistry(context: Context): ClockRegistry? {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockPickerInteractor(context: Context): ClockPickerInteractor {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockSectionViewModel(context: Context): ClockSectionViewModel {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getColorPickerInteractor(
+        context: Context,
+        wallpaperColorsRepository: WallpaperColorsRepository,
+    ): ColorPickerInteractor {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getColorPickerViewModelFactory(
+        context: Context,
+        wallpaperColorsRepository: WallpaperColorsRepository,
+    ): ColorPickerViewModel.Factory {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockCarouselViewModelFactory(
+        interactor: ClockPickerInteractor
+    ): ClockCarouselViewModel.Factory {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockViewFactory(activity: ComponentActivity): ClockViewFactory {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockSettingsViewModelFactory(
+        context: Context,
+        wallpaperColorsRepository: WallpaperColorsRepository,
+        clockViewFactory: ClockViewFactory,
+    ): ClockSettingsViewModel.Factory {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    override fun getClockDescriptionUtils(resources: Resources): ClockDescriptionUtils {
+        throw UnsupportedOperationException("not implemented")
+    }
+
+    /////////////////
+    // TestInjector overrides
+    /////////////////
+
+    override fun getUserEventLogger(context: Context): UserEventLogger {
+        return themesUserEventLogger
+            ?: TestThemesUserEventLogger().also { themesUserEventLogger = it }
+    }
+}
diff --git a/tests/common/src/com/android/customization/testing/TestDrawableLayerResolver.java b/tests/common/src/com/android/customization/testing/TestDrawableLayerResolver.java
deleted file mode 100644
index 8b16299..0000000
--- a/tests/common/src/com/android/customization/testing/TestDrawableLayerResolver.java
+++ /dev/null
@@ -1,31 +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.testing;
-
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-
-import com.android.wallpaper.module.DrawableLayerResolver;
-
-/**
- * Test implementation of {@link DrawableLayerResolver}.
- */
-public class TestDrawableLayerResolver implements DrawableLayerResolver {
-    @Override
-    public Drawable resolveLayer(LayerDrawable layerDrawable) {
-        return layerDrawable.getDrawable(0);
-    }
-}
diff --git a/tests/common/src/com/android/customization/testing/TestPackageStatusNotifier.java b/tests/common/src/com/android/customization/testing/TestPackageStatusNotifier.java
deleted file mode 100644
index 2aadae8..0000000
--- a/tests/common/src/com/android/customization/testing/TestPackageStatusNotifier.java
+++ /dev/null
@@ -1,33 +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.testing;
-
-import com.android.wallpaper.module.PackageStatusNotifier;
-
-/**
- * Test implementation of {@link PackageStatusNotifier}.
- */
-public class TestPackageStatusNotifier implements PackageStatusNotifier {
-    @Override
-    public void addListener(Listener listener, String action) {
-        // Do nothing
-    }
-
-    @Override
-    public void removeListener(Listener listener) {
-        // Do nothing
-    }
-}