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

Commit 233b5d21 authored by Matt Casey's avatar Matt Casey
Browse files

Don't dismiss the keyguard from the binder thread

It doesn't work when called from the binder thread (see bug).

Bug: 257974574
Test: Launch a screenshot action from the lockscreen, verify that
      bouncer appears before action is completed.
Change-Id: I2eb974fc82d8434e9f0df57aea123ae62f18260e
parent 793936a1
Loading
Loading
Loading
Loading
+26 −12
Original line number Diff line number Diff line
@@ -15,12 +15,17 @@
 */
package com.android.systemui.screenshot

import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log
import androidx.lifecycle.LifecycleService
import androidx.lifecycle.lifecycleScope
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.shade.ShadeExpansionStateManager
import com.android.systemui.statusbar.phone.CentralSurfaces
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.util.Optional
import javax.inject.Inject

@@ -30,7 +35,8 @@ import javax.inject.Inject
internal class ScreenshotProxyService @Inject constructor(
    private val mExpansionMgr: ShadeExpansionStateManager,
    private val mCentralSurfacesOptional: Optional<CentralSurfaces>,
) : Service() {
    @Main private val mMainDispatcher: CoroutineDispatcher,
) : LifecycleService() {

    private val mBinder: IBinder = object : IScreenshotProxy.Stub() {
        /**
@@ -43,18 +49,26 @@ internal class ScreenshotProxyService @Inject constructor(
        }

        override fun dismissKeyguard(callback: IOnDoneCallback) {
            if (mCentralSurfacesOptional.isPresent) {
                mCentralSurfacesOptional.get().executeRunnableDismissingKeyguard(
            lifecycleScope.launch {
                executeAfterDismissing(callback)
            }
        }
    }

    private suspend fun executeAfterDismissing(callback: IOnDoneCallback) =
        withContext(mMainDispatcher) {
            mCentralSurfacesOptional.ifPresentOrElse(
                    {
                        it.executeRunnableDismissingKeyguard(
                                Runnable {
                                    callback.onDone(true)
                                }, null,
                                true /* dismissShade */, true /* afterKeyguardGone */,
                                true /* deferred */
                        )
            } else {
                callback.onDone(false)
            }
        }
                    },
                    { callback.onDone(false) }
            )
        }

    override fun onBind(intent: Intent): IBinder? {