Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt +20 −6 Original line number Diff line number Diff line Loading @@ -26,18 +26,21 @@ import android.util.ArrayMap import android.util.Log import androidx.annotation.VisibleForTesting import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.shared.quickaffordance.shared.model.KeyguardQuickAffordancePreviewConstants import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @SysUISingleton class KeyguardRemotePreviewManager @Inject constructor( private val previewRendererFactory: KeyguardPreviewRendererFactory, @Application private val applicationScope: CoroutineScope, @Main private val mainDispatcher: CoroutineDispatcher, @Background private val backgroundHandler: Handler, ) { Loading @@ -55,7 +58,13 @@ constructor( // Destroy any previous renderer associated with this token. activePreviews[renderer.hostToken]?.let { destroyObserver(it) } observer = PreviewLifecycleObserver(renderer, mainDispatcher, ::destroyObserver) observer = PreviewLifecycleObserver( renderer, applicationScope, mainDispatcher, ::destroyObserver, ) activePreviews[renderer.hostToken] = observer renderer.render() renderer.hostToken?.linkToDeath(observer, 0) Loading Loading @@ -92,13 +101,18 @@ constructor( private class PreviewLifecycleObserver( private val renderer: KeyguardPreviewRenderer, private val scope: CoroutineScope, private val mainDispatcher: CoroutineDispatcher, private val requestDestruction: (PreviewLifecycleObserver) -> Unit, ) : Handler.Callback, IBinder.DeathRecipient { private var isDestroyed = false private var isDestroyedOrDestroying = false override fun handleMessage(message: Message): Boolean { if (isDestroyedOrDestroying) { return true } when (message.what) { KeyguardQuickAffordancePreviewConstants.MESSAGE_ID_SLOT_SELECTED -> { message.data Loading @@ -118,14 +132,14 @@ constructor( } fun onDestroy(): IBinder? { if (isDestroyed) { if (isDestroyedOrDestroying) { return null } isDestroyed = true isDestroyedOrDestroying = true val hostToken = renderer.hostToken hostToken?.unlinkToDeath(this, 0) runBlocking(mainDispatcher) { renderer.destroy() } scope.launch(mainDispatcher) { renderer.destroy() } return hostToken } } Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/CustomizationProviderTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ class CustomizationProviderTest : SysuiTestCase() { ) underTest.previewManager = KeyguardRemotePreviewManager( applicationScope = testScope.backgroundScope, previewRendererFactory = previewRendererFactory, mainDispatcher = testDispatcher, backgroundHandler = backgroundHandler, Loading Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardRemotePreviewManager.kt +20 −6 Original line number Diff line number Diff line Loading @@ -26,18 +26,21 @@ import android.util.ArrayMap import android.util.Log import androidx.annotation.VisibleForTesting import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.shared.quickaffordance.shared.model.KeyguardQuickAffordancePreviewConstants import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.runBlocking import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @SysUISingleton class KeyguardRemotePreviewManager @Inject constructor( private val previewRendererFactory: KeyguardPreviewRendererFactory, @Application private val applicationScope: CoroutineScope, @Main private val mainDispatcher: CoroutineDispatcher, @Background private val backgroundHandler: Handler, ) { Loading @@ -55,7 +58,13 @@ constructor( // Destroy any previous renderer associated with this token. activePreviews[renderer.hostToken]?.let { destroyObserver(it) } observer = PreviewLifecycleObserver(renderer, mainDispatcher, ::destroyObserver) observer = PreviewLifecycleObserver( renderer, applicationScope, mainDispatcher, ::destroyObserver, ) activePreviews[renderer.hostToken] = observer renderer.render() renderer.hostToken?.linkToDeath(observer, 0) Loading Loading @@ -92,13 +101,18 @@ constructor( private class PreviewLifecycleObserver( private val renderer: KeyguardPreviewRenderer, private val scope: CoroutineScope, private val mainDispatcher: CoroutineDispatcher, private val requestDestruction: (PreviewLifecycleObserver) -> Unit, ) : Handler.Callback, IBinder.DeathRecipient { private var isDestroyed = false private var isDestroyedOrDestroying = false override fun handleMessage(message: Message): Boolean { if (isDestroyedOrDestroying) { return true } when (message.what) { KeyguardQuickAffordancePreviewConstants.MESSAGE_ID_SLOT_SELECTED -> { message.data Loading @@ -118,14 +132,14 @@ constructor( } fun onDestroy(): IBinder? { if (isDestroyed) { if (isDestroyedOrDestroying) { return null } isDestroyed = true isDestroyedOrDestroying = true val hostToken = renderer.hostToken hostToken?.unlinkToDeath(this, 0) runBlocking(mainDispatcher) { renderer.destroy() } scope.launch(mainDispatcher) { renderer.destroy() } return hostToken } } Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/CustomizationProviderTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ class CustomizationProviderTest : SysuiTestCase() { ) underTest.previewManager = KeyguardRemotePreviewManager( applicationScope = testScope.backgroundScope, previewRendererFactory = previewRendererFactory, mainDispatcher = testDispatcher, backgroundHandler = backgroundHandler, Loading