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

Commit b6eb4417 authored by Kshitij Gupta's avatar Kshitij Gupta
Browse files

ModesTile: Drop usages of runBlocking

- This CL refactors ModesTile to drop use of runBlocking.
  Previously, runBlocking was used to call userActionInteractor's
  handleClick() and handleToggleClick() method which could take up
  time and block the main thread.
- We now do this asynchronously via lifecycleScope. While
  lifecycleScope also uses the main thread internally, we do not block
  the main thread anymore. Additionally, the life of these coroutines is
  managed by the lifecycle of the Tile.

Bug: 423462317
Flag: com.android.systemui.do_not_use_run_blocking
Test: atest ModesTileTest
Change-Id: Ie1885a93660e7728f17dcd60161b12c691f6531f
parent f19de905
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -24244,7 +24244,7 @@
        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
        <location
            file="frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt"
            line="30"
            line="31"
            column="1"/>
    </issue>
+19 −3
Original line number Diff line number Diff line
@@ -20,13 +20,15 @@ import android.graphics.drawable.TestStubDrawable
import android.os.Handler
import android.os.UserManager
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import android.platform.test.flag.junit.FlagsParameterization.allCombinationsOf
import android.service.quicksettings.Tile
import android.testing.TestableLooper
import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.logging.MetricsLogger
import com.android.settingslib.notification.modes.TestModeBuilder
import com.android.systemui.Flags.FLAG_DO_NOT_USE_RUN_BLOCKING
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.common.shared.model.asIcon
@@ -73,12 +75,14 @@ import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@EnableFlags(android.app.Flags.FLAG_MODES_UI_TILE_REACTIVATES_LAST)
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(ParameterizedAndroidJunit4::class)
@RunWithLooper(setAsMainLooper = true)
class ModesTileTest : SysuiTestCase() {
class ModesTileTest(flags: FlagsParameterization) : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val testDispatcher = kosmos.testDispatcher
@@ -99,6 +103,18 @@ class ModesTileTest : SysuiTestCase() {

    @Mock private lateinit var dialogDelegate: ModesDialogDelegate

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return allCombinationsOf(FLAG_DO_NOT_USE_RUN_BLOCKING)
        }
    }

    private val inputHandler = FakeQSTileIntentUserInputHandler()
    private val zenModeRepository = kosmos.zenModeRepository
    private val tileDataInteractor =
+24 −5
Original line number Diff line number Diff line
@@ -25,10 +25,12 @@ import androidx.annotation.DrawableRes
import androidx.annotation.VisibleForTesting
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.app.tracing.coroutines.runBlockingTraced as runBlocking
import com.android.internal.logging.MetricsLogger
import com.android.systemui.Flags
import com.android.systemui.animation.Expandable
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
@@ -112,14 +114,31 @@ constructor(
        }
    }

    override fun handleClick(expandable: Expandable?) = runBlocking {
    override fun handleClick(expandable: Expandable?) {
        if (Flags.doNotUseRunBlocking()) {
            lifecycleScope.launch {
                userActionInteractor.handleClick(expandable)
            }
        } else {
            runBlocking {
                userActionInteractor.handleClick(expandable)
            }
        }
    }

    override fun handleSecondaryClick(expandable: Expandable?) = runBlocking {
    override fun handleSecondaryClick(expandable: Expandable?) {
        if (Flags.doNotUseRunBlocking()) {
            lifecycleScope.launch {
                val model = dataInteractor.getCurrentTileModel()
                userActionInteractor.handleToggleClick(model)
            }
        } else {
            runBlocking {
                val model = dataInteractor.getCurrentTileModel()
                userActionInteractor.handleToggleClick(model)
            }
        }
    }

    override fun getDetailsViewModel(): TileDetailsViewModel {
        return ModesDetailsViewModel(