Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/res/layout/customization_option_entry_clock.xml b/res/layout/customization_option_entry_clock.xml
index c302965..f677a1e 100644
--- a/res/layout/customization_option_entry_clock.xml
+++ b/res/layout/customization_option_entry_clock.xml
@@ -30,18 +30,24 @@
android:text="@string/clock_title"
android:layout_marginEnd="@dimen/customization_option_entry_text_margin_end"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintEnd_toStartOf="@+id/option_entry_clock_icon"
+ app:layout_constraintEnd_toStartOf="@+id/option_entry_clock_icon_container"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed" />
<FrameLayout
- android:id="@+id/option_entry_clock_icon"
+ android:id="@+id/option_entry_clock_icon_container"
android:layout_width="@dimen/customization_option_entry_icon_size"
android:layout_height="@dimen/customization_option_entry_icon_size"
- android:orientation="horizontal"
android:background="@drawable/customization_option_entry_icon_background"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent" />
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <ImageView
+ android:id="@+id/option_entry_clock_icon"
+ android:layout_width="@dimen/customization_option_entry_clock_icon_size"
+ android:layout_height="@dimen/customization_option_entry_clock_icon_size"
+ android:layout_gravity="center"/>
+ </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/values-w800dp/dimens.xml b/res/values-w800dp/dimens.xml
index d5032b6..5673be4 100644
--- a/res/values-w800dp/dimens.xml
+++ b/res/values-w800dp/dimens.xml
@@ -23,4 +23,5 @@
<dimen name="clock_carousel_item_card_width">114dp</dimen>
<dimen name="clock_carousel_item_card_height">124dp</dimen>
<dimen name="clock_carousel_guideline_margin">320dp</dimen>
+ <item name="clock_carousel_scale" format="float" type="dimen">0.35</item>
</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ce27004..0c36753 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -166,6 +166,7 @@
<dimen name="clock_carousel_item_card_width">100dp</dimen>
<dimen name="clock_carousel_item_card_height">108dp</dimen>
<dimen name="clock_carousel_guideline_margin_for_2_pane_small_width">122dp</dimen>
+ <item name="clock_carousel_scale" format="float" type="dimen">0.5</item>
<!-- Clock color and size button -->
<dimen name="clock_color_size_button_min_height">32dp</dimen>
@@ -202,6 +203,7 @@
<dimen name="floating_sheet_color_option_size">54dp</dimen>
<dimen name="floating_sheet_color_option_stroke_width">3dp</dimen>
<dimen name="customization_option_entry_shortcut_icon_size">20dp</dimen>
+ <dimen name="customization_option_entry_clock_icon_size">44dp</dimen>
<!-- Clock font control dimensions -->
<dimen name="clock_font_axis_name_width">64dp</dimen>
diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt
index a022d00..ae412ed 100644
--- a/src/com/android/customization/module/ThemePickerInjector.kt
+++ b/src/com/android/customization/module/ThemePickerInjector.kt
@@ -66,6 +66,7 @@
import com.android.wallpaper.module.CustomizationSections
import com.android.wallpaper.module.FragmentFactory
import com.android.wallpaper.module.NetworkStatusNotifier
+import com.android.wallpaper.module.PackageStatusNotifier
import com.android.wallpaper.module.PartnerProvider
import com.android.wallpaper.module.WallpaperPicker2Injector
import com.android.wallpaper.module.WallpaperPreferences
@@ -118,6 +119,7 @@
prefs: Lazy<WallpaperPreferences>,
wallpaperColorsRepository: Lazy<WallpaperColorsRepository>,
defaultWallpaperCategoryWrapper: Lazy<WallpaperCategoryWrapper>,
+ packageNotifier: Lazy<PackageStatusNotifier>,
) :
WallpaperPicker2Injector(
mainScope,
@@ -132,6 +134,7 @@
prefs,
wallpaperColorsRepository,
defaultWallpaperCategoryWrapper,
+ packageNotifier,
),
CustomizationInjector {
private var customizationSections: CustomizationSections? = null
diff --git a/src/com/android/customization/picker/clock/ui/view/ClockCarouselView.kt b/src/com/android/customization/picker/clock/ui/view/ClockCarouselView.kt
index 1fbdede..0ed0362 100644
--- a/src/com/android/customization/picker/clock/ui/view/ClockCarouselView.kt
+++ b/src/com/android/customization/picker/clock/ui/view/ClockCarouselView.kt
@@ -19,6 +19,7 @@
import android.content.res.ColorStateList
import android.content.res.Resources
import android.util.AttributeSet
+import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -40,6 +41,7 @@
val carousel: Carousel
private val motionLayout: MotionLayout
+ private val clockViewScale: Float
private lateinit var adapter: ClockCarouselAdapter
private lateinit var clockViewFactory: ClockViewFactory
private var toCenterClockController: ClockController? = null
@@ -56,6 +58,11 @@
carousel = clockCarousel.requireViewById(R.id.carousel)
motionLayout = clockCarousel.requireViewById(R.id.motion_container)
motionLayout.contentDescription = context.getString(R.string.custom_clocks_label)
+ clockViewScale =
+ TypedValue().let {
+ resources.getValue(R.dimen.clock_carousel_scale, it, true)
+ it.float
+ }
}
/**
@@ -130,7 +137,14 @@
overrideScreenPreviewWidth()
}
- adapter = ClockCarouselAdapter(clockSize, clocks, clockViewFactory, onClockSelected)
+ adapter =
+ ClockCarouselAdapter(
+ clockViewScale,
+ clockSize,
+ clocks,
+ clockViewFactory,
+ onClockSelected,
+ )
carousel.isInfinite = clocks.size >= MIN_CLOCKS_TO_ENABLE_INFINITE_CAROUSEL
carousel.setAdapter(adapter)
val indexOfSelectedClock =
@@ -222,8 +236,8 @@
?.largeClock
?.animations
?.onPickerCarouselSwiping(progress)
- val scalingDownScale = getScalingDownScale(progress)
- val scalingUpScale = getScalingUpScale(progress)
+ val scalingDownScale = getScalingDownScale(progress, clockViewScale)
+ val scalingUpScale = getScalingUpScale(progress, clockViewScale)
offCenterClockScaleView?.scaleX = scalingDownScale
offCenterClockScaleView?.scaleY = scalingDownScale
toCenterClockScaleView?.scaleX = scalingUpScale
@@ -369,6 +383,7 @@
}
private class ClockCarouselAdapter(
+ val clockViewScale: Float,
val clockSize: ClockSize,
val clocks: List<ClockCarouselItemViewModel>,
private val clockViewFactory: ClockViewFactory,
@@ -450,8 +465,8 @@
clockScaleView.scaleY = 1f
controller.largeClock.animations.onPickerCarouselSwiping(1F)
} else {
- clockScaleView.scaleX = CLOCK_CAROUSEL_VIEW_SCALE
- clockScaleView.scaleY = CLOCK_CAROUSEL_VIEW_SCALE
+ clockScaleView.scaleX = clockViewScale
+ clockScaleView.scaleY = clockViewScale
controller.largeClock.animations.onPickerCarouselSwiping(0F)
}
}
@@ -501,7 +516,6 @@
companion object {
// The carousel needs to have at least 5 different clock faces to be infinite
const val MIN_CLOCKS_TO_ENABLE_INFINITE_CAROUSEL = 5
- const val CLOCK_CAROUSEL_VIEW_SCALE = 0.5f
const val TRANSITION_DURATION = 250
val itemViewIds =
@@ -513,10 +527,11 @@
R.id.item_view_4,
)
- fun getScalingUpScale(progress: Float) =
- CLOCK_CAROUSEL_VIEW_SCALE + progress * (1f - CLOCK_CAROUSEL_VIEW_SCALE)
+ fun getScalingUpScale(progress: Float, clockViewScale: Float) =
+ clockViewScale + progress * (1f - clockViewScale)
- fun getScalingDownScale(progress: Float) = 1f - progress * (1f - CLOCK_CAROUSEL_VIEW_SCALE)
+ fun getScalingDownScale(progress: Float, clockViewScale: Float) =
+ 1f - progress * (1f - clockViewScale)
// This makes the card only starts to reveal in the last quarter of the trip so
// the card won't overlap the preview.
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
index c3d1b83..2936b1c 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
@@ -85,6 +85,7 @@
lockScreenCustomizationOptionEntries
.find { it.first == ThemePickerLockCustomizationOption.CLOCK }
?.second
+ val optionClockIcon = optionClock?.findViewById<ImageView>(R.id.option_entry_clock_icon)
val optionShortcut =
lockScreenCustomizationOptionEntries
@@ -128,6 +129,12 @@
}
launch {
+ optionsViewModel.clockPickerViewModel.selectedClock.collect {
+ optionClockIcon?.setImageDrawable(it.thumbnail)
+ }
+ }
+
+ launch {
optionsViewModel.onCustomizeShortcutClicked.collect {
optionShortcut?.setOnClickListener { _ -> it?.invoke() }
}
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerToolbarBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerToolbarBinder.kt
index 357f131..5ea757e 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerToolbarBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerToolbarBinder.kt
@@ -21,11 +21,13 @@
import android.widget.Button
import android.widget.FrameLayout
import android.widget.Toolbar
+import androidx.core.graphics.ColorUtils
import androidx.core.view.isInvisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
+import com.android.wallpaper.R
import com.android.wallpaper.customization.ui.viewmodel.ThemePickerCustomizationOptionsViewModel
import com.android.wallpaper.customization.ui.viewmodel.ToolbarHeightsViewModel
import com.android.wallpaper.picker.customization.ui.binder.DefaultToolbarBinder
@@ -109,6 +111,14 @@
}
)
+ val applyButtonTextColorEnabled =
+ applyButton.resources.getColor(R.color.system_on_primary, null)
+ val applyButtonTextColorDisabled =
+ ColorUtils.setAlphaComponent(
+ applyButton.resources.getColor(R.color.system_on_surface, null),
+ 97,
+ ) // 97 for 38% transparent
+
lifecycleOwner.lifecycleScope.launch {
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
@@ -117,9 +127,18 @@
}
}
- launch { viewModel.isOnApplyVisible.collect { applyButton.isInvisible = !it } }
+ launch { viewModel.isApplyButtonVisible.collect { applyButton.isInvisible = !it } }
- launch { viewModel.isOnApplyEnabled.collect { applyButton.isEnabled = it } }
+ launch {
+ viewModel.isApplyButtonEnabled.collect {
+ applyButton.isEnabled = it
+ applyButton.background.alpha =
+ if (it) 255 else 31 // 255 for 100%, 31 for 12% transparent,
+ applyButton.setTextColor(
+ if (it) applyButtonTextColorEnabled else applyButtonTextColorDisabled
+ )
+ }
+ }
launch {
combine(toolbarHeights, viewModel.isToolbarCollapsed, ::Pair).collect {
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
index 760cd51..6ca773b 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ClockPickerViewModel.kt
@@ -117,10 +117,9 @@
selectedClock ->
overridingClock != null && overridingClock.clockId != selectedClock.clockId
}
+ val selectedClock = clockPickerInteractor.selectedClock
val previewingClock =
- combine(overridingClock, clockPickerInteractor.selectedClock) {
- overridingClock,
- selectedClock ->
+ combine(overridingClock, selectedClock) { overridingClock, selectedClock ->
overridingClock ?: selectedClock
}
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt
index 0937315..62a96fe 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt
@@ -178,9 +178,9 @@
}
.stateIn(viewModelScope, SharingStarted.Eagerly, null)
- val isOnApplyEnabled: Flow<Boolean> = onApplyButtonClicked.map { it != null }
+ val isApplyButtonEnabled: Flow<Boolean> = onApplyButtonClicked.map { it != null }
- val isOnApplyVisible: Flow<Boolean> = selectedOption.map { it != null }
+ val isApplyButtonVisible: Flow<Boolean> = selectedOption.map { it != null }
val isToolbarCollapsed: Flow<Boolean> =
combine(selectedOption, clockPickerViewModel.selectedTab) { selectedOption, selectedTab ->
diff --git a/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt b/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt
index a550119..a474212 100644
--- a/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt
+++ b/tests/common/src/com/android/customization/testing/TestCustomizationInjector.kt
@@ -24,6 +24,7 @@
import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor
import com.android.wallpaper.testing.FakeWallpaperClient
import com.android.wallpaper.testing.TestInjector
+import com.android.wallpaper.testing.TestPackageStatusNotifier
import com.android.wallpaper.util.DisplayUtils
import javax.inject.Inject
import javax.inject.Singleton
@@ -42,6 +43,7 @@
injectedWallpaperInteractor: WallpaperInteractor,
prefs: WallpaperPreferences,
private val fakeWallpaperCategoryWrapper: WallpaperCategoryWrapper,
+ private val testStatusNotifier: TestPackageStatusNotifier,
) :
TestInjector(
themesUserEventLogger,
@@ -53,6 +55,7 @@
injectedWallpaperInteractor,
prefs,
fakeWallpaperCategoryWrapper,
+ testStatusNotifier,
),
CustomizationInjector {
/////////////////
diff --git a/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt b/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt
index 94af717..bc03f12 100644
--- a/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt
+++ b/tests/module/src/com/android/wallpaper/ThemePickerTestModule.kt
@@ -45,7 +45,10 @@
import com.android.wallpaper.module.logging.UserEventLogger
import com.android.wallpaper.modules.ThemePickerAppModule
import com.android.wallpaper.network.Requester
+import com.android.wallpaper.picker.category.domain.interactor.CategoryInteractor
import com.android.wallpaper.picker.category.domain.interactor.ThirdPartyCategoryInteractor
+import com.android.wallpaper.picker.category.ui.view.providers.IndividualPickerFactory
+import com.android.wallpaper.picker.category.ui.view.providers.implementation.DefaultIndividualPickerFactory
import com.android.wallpaper.picker.category.wrapper.WallpaperCategoryWrapper
import com.android.wallpaper.picker.common.preview.ui.binder.ThemePickerWorkspaceCallbackBinder
import com.android.wallpaper.picker.common.preview.ui.binder.WorkspaceCallbackBinder
@@ -56,6 +59,7 @@
import com.android.wallpaper.picker.di.modules.MainDispatcher
import com.android.wallpaper.picker.preview.ui.util.DefaultImageEffectDialogUtil
import com.android.wallpaper.picker.preview.ui.util.ImageEffectDialogUtil
+import com.android.wallpaper.testing.FakeCategoryInteractor
import com.android.wallpaper.testing.FakeDefaultRequester
import com.android.wallpaper.testing.FakeThirdPartyCategoryInteractor
import com.android.wallpaper.testing.FakeWallpaperCategoryWrapper
@@ -116,6 +120,16 @@
impl: DefaultImageEffectDialogUtil
): ImageEffectDialogUtil
+ @Binds
+ @Singleton
+ abstract fun bindIndividualPickerFactoryFragment(
+ impl: DefaultIndividualPickerFactory
+ ): IndividualPickerFactory
+
+ @Binds
+ @Singleton
+ abstract fun bindCategoryInteractor(impl: FakeCategoryInteractor): CategoryInteractor
+
@Binds @Singleton abstract fun bindInjector(impl: TestCustomizationInjector): Injector
@Binds
diff --git a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt
index 63c27ed..36a723c 100644
--- a/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt
+++ b/tests/robotests/src/com/android/customization/model/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModelTest.kt
@@ -46,6 +46,7 @@
import com.android.wallpaper.testing.FakeWallpaperClient
import com.android.wallpaper.testing.TestCurrentWallpaperInfoFactory
import com.android.wallpaper.testing.TestInjector
+import com.android.wallpaper.testing.TestPackageStatusNotifier
import com.android.wallpaper.testing.TestWallpaperPreferences
import com.android.wallpaper.testing.collectLastValue
import com.android.wallpaper.util.DisplayUtils
@@ -80,6 +81,7 @@
private lateinit var client: FakeCustomizationProviderClient
private lateinit var quickAffordanceInteractor: KeyguardQuickAffordancePickerInteractor
private lateinit var wallpaperInteractor: WallpaperInteractor
+ private lateinit var testPackageStatusNotifier: TestPackageStatusNotifier
@Before
fun setUp() {
@@ -109,6 +111,7 @@
backgroundDispatcher = testDispatcher,
)
)
+ testPackageStatusNotifier = TestPackageStatusNotifier()
InjectorProvider.setInjector(
TestInjector(
logger,
@@ -120,6 +123,7 @@
wallpaperInteractor,
mock(WallpaperPreferences::class.java),
mock(WallpaperCategoryWrapper::class.java),
+ testPackageStatusNotifier,
)
)
underTest =