Moves common screen preview logic to WPP2 (2/2).

To enable reuse of the newer preview logic to render both the home
screen and the lock screen previews, we're extracting the shared logic
from KeyguardQuickAffordancePreviewBinder in ThemePicker and moving it
down into WallpaperPicker2.

Bug: 263507648
Test: Ran wallpaper picker quick affordances, they still work.
Change-Id: I281072b76669a05245915b0550a418af7ef3cd05
diff --git a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt
index 0af6bf4..c6cdcaa 100644
--- a/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt
+++ b/src/com/android/customization/picker/quickaffordance/ui/binder/KeyguardQuickAffordancePreviewBinder.kt
@@ -18,29 +18,17 @@
 package com.android.customization.picker.quickaffordance.ui.binder
 
 import android.app.Activity
-import android.content.Intent
 import android.os.Bundle
-import android.service.wallpaper.WallpaperService
-import android.view.SurfaceView
 import androidx.cardview.widget.CardView
 import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.flowWithLifecycle
 import androidx.lifecycle.lifecycleScope
 import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel
 import com.android.systemui.shared.quickaffordance.shared.model.KeyguardQuickAffordancePreviewConstants
 import com.android.wallpaper.R
-import com.android.wallpaper.asset.Asset
-import com.android.wallpaper.asset.BitmapCachingAsset
-import com.android.wallpaper.model.LiveWallpaperInfo
 import com.android.wallpaper.model.WallpaperInfo
-import com.android.wallpaper.picker.WorkspaceSurfaceHolderCallback
-import com.android.wallpaper.util.PreviewUtils
-import com.android.wallpaper.util.ResourceUtils
-import com.android.wallpaper.util.WallpaperConnection
-import com.android.wallpaper.util.WallpaperSurfaceCallback
-import java.util.concurrent.CompletableFuture
+import com.android.wallpaper.picker.customization.ui.binder.ScreenPreviewBinder
 import kotlinx.coroutines.launch
 
 object KeyguardQuickAffordancePreviewBinder {
@@ -54,123 +42,25 @@
         lifecycleOwner: LifecycleOwner,
         wallpaperInfoProvider: suspend () -> WallpaperInfo?,
     ) {
-        val workspaceSurface: SurfaceView = previewView.requireViewById(R.id.workspace_surface)
-        val wallpaperSurface: SurfaceView = previewView.requireViewById(R.id.wallpaper_surface)
+        val binding =
+            ScreenPreviewBinder.bind(
+                activity = activity,
+                previewView = previewView,
+                viewModel = viewModel.preview,
+                lifecycleOwner = lifecycleOwner,
+                wallpaperInfoProvider = wallpaperInfoProvider,
+            )
 
-        previewView.radius =
-            previewView.resources.getDimension(R.dimen.wallpaper_picker_entry_card_corner_radius)
         previewView.contentDescription =
             previewView.context.getString(
                 R.string.lockscreen_wallpaper_preview_card_content_description
             )
 
-        var previewSurfaceCallback: WorkspaceSurfaceHolderCallback? = null
-        var wallpaperSurfaceCallback: WallpaperSurfaceCallback? = null
-        var wallpaperConnection: WallpaperConnection? = null
-        var wallpaperInfo: WallpaperInfo? = null
-
-        lifecycleOwner.lifecycle.addObserver(
-            LifecycleEventObserver { _, event ->
-                when (event) {
-                    Lifecycle.Event.ON_CREATE -> {
-                        previewSurfaceCallback =
-                            WorkspaceSurfaceHolderCallback(
-                                workspaceSurface,
-                                PreviewUtils(
-                                    context = previewView.context,
-                                    authority =
-                                        previewView.context.getString(
-                                            R.string.lock_screen_preview_provider_authority
-                                        ),
-                                ),
-                                Bundle().apply {
-                                    putString(
-                                        KeyguardQuickAffordancePreviewConstants
-                                            .KEY_INITIALLY_SELECTED_SLOT_ID,
-                                        viewModel.selectedSlotId.value,
-                                    )
-                                },
-                            )
-                        workspaceSurface.holder.addCallback(previewSurfaceCallback)
-                        workspaceSurface.setZOrderMediaOverlay(true)
-
-                        wallpaperSurfaceCallback =
-                            WallpaperSurfaceCallback(
-                                previewView.context,
-                                previewView,
-                                wallpaperSurface,
-                                CompletableFuture.completedFuture(
-                                    WallpaperInfo.ColorInfo(
-                                        /* wallpaperColors= */ null,
-                                        ResourceUtils.getColorAttr(
-                                            previewView.context,
-                                            android.R.attr.colorSecondary,
-                                        )
-                                    )
-                                ),
-                            ) {
-                                maybeLoadThumbnail(
-                                    activity = activity,
-                                    wallpaperInfo = wallpaperInfo,
-                                    surfaceCallback = wallpaperSurfaceCallback,
-                                )
-                            }
-                        wallpaperSurface.holder.addCallback(wallpaperSurfaceCallback)
-                        wallpaperSurface.setZOrderMediaOverlay(true)
-                    }
-                    Lifecycle.Event.ON_DESTROY -> {
-                        workspaceSurface.holder.removeCallback(previewSurfaceCallback)
-                        previewSurfaceCallback?.cleanUp()
-                        wallpaperSurface.holder.removeCallback(wallpaperSurfaceCallback)
-                        wallpaperSurfaceCallback?.cleanUp()
-                    }
-                    Lifecycle.Event.ON_RESUME -> {
-                        lifecycleOwner.lifecycleScope.launch {
-                            wallpaperInfo = wallpaperInfoProvider()
-                            (wallpaperInfo as? LiveWallpaperInfo)?.let { liveWallpaperInfo ->
-                                if (WallpaperConnection.isPreviewAvailable()) {
-                                    wallpaperConnection =
-                                        WallpaperConnection(
-                                            Intent(WallpaperService.SERVICE_INTERFACE).apply {
-                                                setClassName(
-                                                    liveWallpaperInfo.wallpaperComponent
-                                                        .packageName,
-                                                    liveWallpaperInfo.wallpaperComponent.serviceName
-                                                )
-                                            },
-                                            previewView.context,
-                                            null,
-                                            wallpaperSurface,
-                                            null,
-                                        )
-
-                                    wallpaperConnection?.connect()
-                                    wallpaperConnection?.setVisibility(true)
-                                }
-                            }
-                            maybeLoadThumbnail(
-                                activity = activity,
-                                wallpaperInfo = wallpaperInfo,
-                                surfaceCallback = wallpaperSurfaceCallback,
-                            )
-                        }
-                    }
-                    Lifecycle.Event.ON_PAUSE -> {
-                        wallpaperConnection?.setVisibility(false)
-                    }
-                    Lifecycle.Event.ON_STOP -> {
-                        wallpaperConnection?.disconnect()
-                    }
-                    else -> Unit
-                }
-            }
-        )
-
         lifecycleOwner.lifecycleScope.launch {
             viewModel.selectedSlotId
                 .flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.STARTED)
                 .collect { slotId ->
-                    previewSurfaceCallback?.send(
+                    binding.sendMessage(
                         KeyguardQuickAffordancePreviewConstants.MESSAGE_ID_SLOT_SELECTED,
                         Bundle().apply {
                             putString(KeyguardQuickAffordancePreviewConstants.KEY_SLOT_ID, slotId)
@@ -179,24 +69,4 @@
                 }
         }
     }
-
-    private fun maybeLoadThumbnail(
-        activity: Activity,
-        wallpaperInfo: WallpaperInfo?,
-        surfaceCallback: WallpaperSurfaceCallback?,
-    ) {
-        if (wallpaperInfo == null || surfaceCallback == null) {
-            return
-        }
-
-        val imageView = surfaceCallback.homeImageWallpaper
-        val thumbAsset: Asset = BitmapCachingAsset(activity, wallpaperInfo.getThumbAsset(activity))
-        if (imageView != null && imageView.drawable == null) {
-            thumbAsset.loadPreviewImage(
-                activity,
-                imageView,
-                ResourceUtils.getColorAttr(activity, android.R.attr.colorSecondary)
-            )
-        }
-    }
 }
diff --git a/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt b/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt
index fa43edd..aa64d9b 100644
--- a/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt
+++ b/src/com/android/customization/picker/quickaffordance/ui/viewmodel/KeyguardQuickAffordancePickerViewModel.kt
@@ -21,6 +21,7 @@
 import android.content.Context
 import android.content.Intent
 import android.graphics.drawable.Drawable
+import android.os.Bundle
 import androidx.annotation.DrawableRes
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
@@ -28,7 +29,9 @@
 import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor
 import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots
 import com.android.systemui.shared.quickaffordance.data.content.KeyguardQuickAffordanceProviderContract as Contract
+import com.android.systemui.shared.quickaffordance.shared.model.KeyguardQuickAffordancePreviewConstants
 import com.android.wallpaper.R
+import com.android.wallpaper.picker.customization.ui.viewmodel.ScreenPreviewViewModel
 import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
 import com.android.wallpaper.picker.undo.ui.viewmodel.UndoViewModel
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -51,6 +54,22 @@
 
     @SuppressLint("StaticFieldLeak") private val applicationContext = context.applicationContext
 
+    val preview: ScreenPreviewViewModel
+        get() =
+            ScreenPreviewViewModel(
+                contentProviderAuthorityProvider = {
+                    applicationContext.getString(R.string.lock_screen_preview_provider_authority)
+                },
+                initialExtrasProvider = {
+                    Bundle().apply {
+                        putString(
+                            KeyguardQuickAffordancePreviewConstants.KEY_INITIALLY_SELECTED_SLOT_ID,
+                            selectedSlotId.value,
+                        )
+                    }
+                },
+            )
+
     val undo: UndoViewModel =
         UndoViewModel(
             interactor = undoInteractor,