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

Commit 1d0e7f5d authored by Ajinkya Chalke's avatar Ajinkya Chalke
Browse files

Use the bgCoroutineContext to update note shortcut

- Application scope is using Dispatchers.Main.immediate causing ANRs
  when updating note-taking shortcuts. So using bgCoroutineContext when
  when updating note-tasks.
- Internally bgCoroutineContext uses Dispatchers.IO which should help
  avoid the ANR in SysUI.
- Using the new CoroutineScope.launch function that supports tracing to
  help debug future potential ANRs.

Bug: 311325103
Test: atest NoteTaskControllerTest
Flag: NA
Change-Id: I179d49285c7184200e11754fc0c735c55d1ed0d0
parent 7ed4970d
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -37,9 +37,10 @@ import android.os.UserManager
import android.provider.Settings
import android.widget.Toast
import androidx.annotation.VisibleForTesting
import com.android.systemui.res.R
import com.android.app.tracing.TraceUtils.Companion.launch
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.devicepolicy.areKeyguardShortcutsDisabled
import com.android.systemui.log.DebugLogger.debugLog
import com.android.systemui.notetask.NoteTaskEntryPoint.QUICK_AFFORDANCE
@@ -47,6 +48,7 @@ import com.android.systemui.notetask.NoteTaskEntryPoint.TAIL_BUTTON
import com.android.systemui.notetask.NoteTaskRoleManagerExt.createNoteShortcutInfoAsUser
import com.android.systemui.notetask.NoteTaskRoleManagerExt.getDefaultRoleHolderAsUser
import com.android.systemui.notetask.shortcut.CreateNoteTaskShortcutActivity
import com.android.systemui.res.R
import com.android.systemui.settings.UserTracker
import com.android.systemui.shared.system.ActivityManagerKt.isInForeground
import com.android.systemui.util.settings.SecureSettings
@@ -54,8 +56,8 @@ import com.android.wm.shell.bubbles.Bubble
import com.android.wm.shell.bubbles.Bubbles.BubbleExpandListener
import java.util.concurrent.atomic.AtomicReference
import javax.inject.Inject
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

/**
 * Entry point for creating and managing note.
@@ -81,7 +83,8 @@ constructor(
    private val devicePolicyManager: DevicePolicyManager,
    private val userTracker: UserTracker,
    private val secureSettings: SecureSettings,
    @Application private val applicationScope: CoroutineScope
    @Application private val applicationScope: CoroutineScope,
    @Background private val bgCoroutineContext: CoroutineContext
) {

    @VisibleForTesting val infoReference = AtomicReference<NoteTaskInfo?>()
@@ -172,7 +175,9 @@ constructor(
    ) {
        if (!isEnabled) return

        applicationScope.launch { awaitShowNoteTaskAsUser(entryPoint, user) }
        applicationScope.launch("$TAG#showNoteTaskAsUser") {
            awaitShowNoteTaskAsUser(entryPoint, user)
        }
    }

    private suspend fun awaitShowNoteTaskAsUser(
@@ -337,7 +342,7 @@ constructor(

    @InternalNoteTaskApi
    fun launchUpdateNoteTaskAsUser(user: UserHandle) {
        applicationScope.launch {
        applicationScope.launch("$TAG#launchUpdateNoteTaskAsUser", bgCoroutineContext) {
            if (!userManager.isUserUnlocked(user)) {
                debugLog { "updateNoteTaskAsUserInternal call but user locked: user=$user" }
                return@launch
+2 −1
Original line number Diff line number Diff line
@@ -45,7 +45,6 @@ import android.provider.Settings
import androidx.test.ext.truth.content.IntentSubject.assertThat
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.notetask.NoteTaskController.Companion.EXTRA_SHORTCUT_BADGE_OVERRIDE_PACKAGE
import com.android.systemui.notetask.NoteTaskController.Companion.SHORTCUT_ID
@@ -56,6 +55,7 @@ import com.android.systemui.notetask.NoteTaskEntryPoint.TAIL_BUTTON
import com.android.systemui.notetask.NoteTaskEntryPoint.WIDGET_PICKER_SHORTCUT
import com.android.systemui.notetask.shortcut.CreateNoteTaskShortcutActivity
import com.android.systemui.notetask.shortcut.LaunchNoteTaskActivity
import com.android.systemui.res.R
import com.android.systemui.settings.FakeUserTracker
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
@@ -162,6 +162,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() {
            noteTaskBubblesController =
                FakeNoteTaskBubbleController(context, testDispatcher, Optional.ofNullable(bubbles)),
            applicationScope = testScope,
            bgCoroutineContext = testScope.backgroundScope.coroutineContext
        )

    // region onBubbleExpandChanged