Discard changes dailog (1/2)

The dialog pops up when users make changes to the preivew but yet apply
the changes and try to leave the screen.

Test: Manually tested
Fixes: 376092973
Flag: com.android.systemui.shared.new_customization_picker_ui
Change-Id: I3d93183edda086a301a912acee17c9a19467cae3
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
index efa922b..1faf971 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
@@ -16,6 +16,7 @@
 
 package com.android.wallpaper.customization.ui.binder
 
+import android.app.Activity
 import android.content.Context
 import android.view.View
 import android.view.ViewGroup
@@ -52,6 +53,7 @@
 import com.android.wallpaper.picker.customization.ui.binder.DefaultCustomizationOptionsBinder
 import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionUtil.CustomizationOption
 import com.android.wallpaper.picker.customization.ui.viewmodel.ColorUpdateViewModel
+import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsViewModel
 import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationPickerViewModel2
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -417,5 +419,17 @@
         }
     }
 
+    override fun bindDiscardChangesDialog(
+        customizationOptionsViewModel: CustomizationOptionsViewModel,
+        lifecycleOwner: LifecycleOwner,
+        activity: Activity,
+    ) {
+        defaultCustomizationOptionsBinder.bindDiscardChangesDialog(
+            customizationOptionsViewModel,
+            lifecycleOwner,
+            activity,
+        )
+    }
+
     data class Quadruple<A, B, C, D>(val first: A, val second: B, val third: C, val fourth: D)
 }
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt
index 6b7fa83..99746e0 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ThemePickerCustomizationOptionsViewModel.kt
@@ -30,6 +30,7 @@
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flatMapLatest
@@ -69,6 +70,9 @@
 
     override val selectedOption = defaultCustomizationOptionsViewModel.selectedOption
 
+    override val discardChangesDialogViewModel =
+        defaultCustomizationOptionsViewModel.discardChangesDialogViewModel
+
     override fun handleBackPressed(): Boolean {
 
         if (
@@ -80,6 +84,11 @@
             return true
         }
 
+        if (isApplyButtonEnabled.value) {
+            defaultCustomizationOptionsViewModel.showDiscardChangesDialogViewModel()
+            return true
+        }
+
         return defaultCustomizationOptionsViewModel.handleBackPressed()
     }
 
@@ -193,7 +202,10 @@
             }
             .stateIn(viewModelScope, SharingStarted.Eagerly, null)
 
-    val isApplyButtonEnabled: Flow<Boolean> = onApplyButtonClicked.map { it != null }
+    val isApplyButtonEnabled: StateFlow<Boolean> =
+        onApplyButtonClicked
+            .map { it != null }
+            .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), false)
 
     val isApplyButtonVisible: Flow<Boolean> = selectedOption.map { it != null }