Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b169b2c1 authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

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
parent c27b1d38
Loading
Loading
Loading
Loading
+10 −140
Original line number Diff line number Diff line
@@ -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 @@ object KeyguardQuickAffordancePreviewBinder {
        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 @@ object KeyguardQuickAffordancePreviewBinder {
                }
        }
    }

    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)
            )
        }
    }
}
+19 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.SuppressLint
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 androidx.lifecycle.viewModelScope
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 @@ private constructor(

    @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,