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

Commit fa267aea authored by Lyn's avatar Lyn
Browse files

Write AvalancheController state to dumpsys

Fixes: 330612349
Test: adb shell dumpsys activity service SystemUI | grep AvalancheController
Test: atest SystemUiRoboTests:AvalancheControllerTest
Test: atest SystemUiRoboTests:BaseHeadsUpManagerTest
Test: atest SystemUiRoboTests:HeadsUpManagerPhoneTest

Flag: ACONFIG notification_throttle_hun DEVELOPMENT

Change-Id: Ica6f8c2c5bade1558323ea5fe9633b5373f88e5b
parent 47068c2b
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.logging.testing.UiEventLoggerFake
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun
@@ -47,12 +48,14 @@ import org.mockito.junit.MockitoRule
@EnableFlags(NotificationThrottleHun.FLAG_NAME)
class AvalancheControllerTest : SysuiTestCase() {

    private val mAvalancheController = AvalancheController()

    // For creating mocks
    @get:Rule var rule: MockitoRule = MockitoJUnit.rule()
    @Mock private val runnableMock: Runnable? = null

    // For creating AvalancheController
    @Mock private lateinit var dumpManager: DumpManager
    private lateinit var mAvalancheController: AvalancheController

    // For creating TestableHeadsUpManager
    @Mock private val mAccessibilityMgr: AccessibilityManagerWrapper? = null
    private val mUiEventLoggerFake = UiEventLoggerFake()
@@ -60,7 +63,7 @@ class AvalancheControllerTest : SysuiTestCase() {
    private val mGlobalSettings = FakeGlobalSettings()
    private val mSystemClock = FakeSystemClock()
    private val mExecutor = FakeExecutor(mSystemClock)
    private var testableHeadsUpManager: BaseHeadsUpManager? = null
    private lateinit var testableHeadsUpManager: BaseHeadsUpManager

    @Before
    fun setUp() {
@@ -73,7 +76,10 @@ class AvalancheControllerTest : SysuiTestCase() {
            )
            .then { i: InvocationOnMock -> i.getArgument(0) }

        // Initialize TestableHeadsUpManager here instead of at declaration, when mocks will be null
        // Initialize AvalancheController and TestableHeadsUpManager during setUp instead of
        // declaration, where mocks are null
        mAvalancheController = AvalancheController(dumpManager)

        testableHeadsUpManager =
            TestableHeadsUpManager(
                mContext,
+5 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import androidx.test.filters.SmallTest;

import com.android.internal.logging.testing.UiEventLoggerFake;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
@@ -74,7 +75,9 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase {

    private UiEventLoggerFake mUiEventLoggerFake = new UiEventLoggerFake();
    private final HeadsUpManagerLogger mLogger = spy(new HeadsUpManagerLogger(logcatLogBuffer()));
    private AvalancheController mAvalancheController = new AvalancheController();

    @Mock private DumpManager dumpManager;
    private AvalancheController mAvalancheController;

    @Mock private AccessibilityManagerWrapper mAccessibilityMgr;

@@ -131,6 +134,7 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase {
    public void SysuiSetup() throws Exception {
        super.SysuiSetup();
        mSetFlagsRule.disableFlags(NotificationThrottleHun.FLAG_NAME);
        mAvalancheController = new AvalancheController(dumpManager);
    }

    @Test
+5 −1
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import com.android.internal.logging.UiEventLogger;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.res.R;
import com.android.systemui.shade.domain.interactor.ShadeInteractor;
@@ -76,7 +77,8 @@ public class HeadsUpManagerPhoneTest extends BaseHeadsUpManagerTest {
    @Mock private UiEventLogger mUiEventLogger;
    @Mock private JavaAdapter mJavaAdapter;
    @Mock private ShadeInteractor mShadeInteractor;
    private AvalancheController mAvalancheController = new AvalancheController();
    @Mock private DumpManager dumpManager;
    private AvalancheController mAvalancheController;

    private static final class TestableHeadsUpManagerPhone extends HeadsUpManagerPhone {
        TestableHeadsUpManagerPhone(
@@ -154,6 +156,8 @@ public class HeadsUpManagerPhoneTest extends BaseHeadsUpManagerTest {
        mDependency.injectMockDependency(NotificationShadeWindowController.class);
        mContext.getOrCreateTestableResources().addOverride(
                R.integer.ambient_notification_extension_time, 500);

        mAvalancheController = new AvalancheController(dumpManager);
    }

    @Test
+26 −17
Original line number Diff line number Diff line
@@ -17,9 +17,12 @@ package com.android.systemui.statusbar.policy

import android.util.Log
import androidx.annotation.VisibleForTesting
import com.android.systemui.Dumpable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun
import com.android.systemui.statusbar.policy.BaseHeadsUpManager.HeadsUpEntry
import java.io.PrintWriter
import javax.inject.Inject

/*
@@ -27,7 +30,9 @@ import javax.inject.Inject
 * succession, by delaying visual listener side effects and removal handling from BaseHeadsUpManager
 */
@SysUISingleton
class AvalancheController @Inject constructor() {
class AvalancheController @Inject constructor(
    dumpManager: DumpManager,
) : Dumpable {

    private val tag = "AvalancheController"
    private val debug = false
@@ -54,9 +59,11 @@ class AvalancheController @Inject constructor() {
    // For debugging only
    @VisibleForTesting var debugDropSet: MutableSet<HeadsUpEntry> = HashSet()

    /**
     * Run or delay Runnable for given HeadsUpEntry
     */
    init {
        dumpManager.registerNormalDumpable(tag, /* module */ this)
    }

    /** Run or delay Runnable for given HeadsUpEntry */
    fun update(entry: HeadsUpEntry, runnable: Runnable, label: String) {
        if (!NotificationThrottleHun.isEnabled) {
            runnable.run()
@@ -67,7 +74,6 @@ class AvalancheController @Inject constructor() {
        if (debug) {
            debugRunnableLabelMap[runnable] = label
        }

        if (isShowing(entry)) {
            log { "$fn => [update showing]" }
            runnable.run()
@@ -164,9 +170,7 @@ class AvalancheController @Inject constructor() {
        }
    }

    /**
     * Return true if entry is waiting to show.
     */
    /** Return true if entry is waiting to show. */
    fun isWaiting(key: String): Boolean {
        if (!NotificationThrottleHun.isEnabled) {
            return false
@@ -179,9 +183,7 @@ class AvalancheController @Inject constructor() {
        return false
    }

    /**
     * Return list of keys for huns waiting
     */
    /** Return list of keys for huns waiting */
    fun getWaitingKeys(): MutableList<String> {
        if (!NotificationThrottleHun.isEnabled) {
            return mutableListOf()
@@ -254,12 +256,15 @@ class AvalancheController @Inject constructor() {
        }
    }

    // TODO(b/315362456) expose as dumpable for bugreports
    private fun getStateStr(): String {
        return "SHOWING: ${getKey(headsUpEntryShowing)}" +
            "\tNEXT LIST: $nextListStr\tMAP: $nextMapStr" +
            "\tDROP: $dropSetStr"
    }

    private fun logState(reason: String) {
        log { "state $reason" }
        log { "showing: " + getKey(headsUpEntryShowing) }
        log { "next list: $nextListStr map: $nextMapStr" }
        log { "drop: $dropSetStr" }
        log { "REASON $reason" }
        log { getStateStr() }
    }

    private val dropSetStr: String
@@ -298,4 +303,8 @@ class AvalancheController @Inject constructor() {
        }
        return entry.mEntry!!.key
    }

    override fun dump(pw: PrintWriter, args: Array<out String>) {
        pw.println("AvalancheController: ${getStateStr()}")
    }
}