Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt +3 −1 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ class AvalancheControllerTest : SysuiTestCase() { // For creating TestableHeadsUpManager @Mock private val mAccessibilityMgr: AccessibilityManagerWrapper? = null private val mUiEventLoggerFake = UiEventLoggerFake() @Mock private lateinit var mHeadsUpManagerLogger: HeadsUpManagerLogger @Mock private lateinit var mBgHandler: Handler Loading @@ -82,7 +83,8 @@ class AvalancheControllerTest : SysuiTestCase() { // Initialize AvalancheController and TestableHeadsUpManager during setUp instead of // declaration, where mocks are null mAvalancheController = AvalancheController(dumpManager, mUiEventLoggerFake, mBgHandler) mAvalancheController = AvalancheController(dumpManager, mUiEventLoggerFake, mHeadsUpManagerLogger, mBgHandler) testableHeadsUpManager = TestableHeadsUpManager( Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { static final int TEST_A11Y_AUTO_DISMISS_TIME = 1_000; private UiEventLoggerFake mUiEventLoggerFake = new UiEventLoggerFake(); private final HeadsUpManagerLogger mLogger = spy(new HeadsUpManagerLogger(logcatLogBuffer())); @Mock private Handler mBgHandler; @Mock private DumpManager dumpManager; Loading Loading @@ -149,7 +150,8 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { @Override public void SysuiSetup() throws Exception { super.SysuiSetup(); mAvalancheController = new AvalancheController(dumpManager, mUiEventLoggerFake, mBgHandler); mAvalancheController = new AvalancheController(dumpManager, mUiEventLoggerFake, mLogger, mBgHandler); } @Test Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.kt +2 −1 Original line number Diff line number Diff line Loading @@ -179,7 +179,8 @@ class HeadsUpManagerPhoneTest(flags: FlagsParameterization) : BaseHeadsUpManager mContext .getOrCreateTestableResources() .addOverride(R.integer.ambient_notification_extension_time, 500) mAvalancheController = AvalancheController(dumpManager, mUiEventLogger, mBgHandler) mAvalancheController = AvalancheController(dumpManager, mUiEventLogger, mHeadsUpManagerLogger, mBgHandler) } @Test Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt +42 −42 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ class AvalancheController constructor( dumpManager: DumpManager, private val uiEventLogger: UiEventLogger, private val headsUpManagerLogger: HeadsUpManagerLogger, @Background private val bgHandler: Handler ) : Dumpable { Loading Loading @@ -109,32 +110,36 @@ constructor( } /** Run or delay Runnable for given HeadsUpEntry */ fun update(entry: HeadsUpEntry?, runnable: Runnable?, label: String) { fun update(entry: HeadsUpEntry?, runnable: Runnable?, caller: String) { val isEnabled = isEnabled() val key = getKey(entry) if (runnable == null) { log { "Runnable is NULL, stop update." } headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "Runnable NULL, stop") return } if (!isEnabled()) { if (!isEnabled) { headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "NOT ENABLED, run runnable") runnable.run() return } log { "\n " } val fn = "$label => AvalancheController.update ${getKey(entry)}" if (entry == null) { log { "Entry is NULL, stop update." } headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "Entry NULL, stop") return } if (debug) { debugRunnableLabelMap[runnable] = label debugRunnableLabelMap[runnable] = caller } var outcome = "" if (isShowing(entry)) { log { "\n$fn => update showing" } outcome = "update showing" runnable.run() } else if (entry in nextMap) { log { "\n$fn => update next" } outcome = "update next" nextMap[entry]?.add(runnable) } else if (headsUpEntryShowing == null) { log { "\n$fn => showNow" } outcome = "show now" showNow(entry, arrayListOf(runnable)) } else { // Clean up invalid state when entry is in list but not map and vice versa Loading @@ -156,7 +161,8 @@ constructor( ) } } logState("after $fn") outcome += getStateStr() headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, outcome) } @VisibleForTesting Loading @@ -169,32 +175,37 @@ constructor( * Run or ignore Runnable for given HeadsUpEntry. If entry was never shown, ignore and delete * all Runnables associated with that entry. */ fun delete(entry: HeadsUpEntry?, runnable: Runnable?, label: String) { fun delete(entry: HeadsUpEntry?, runnable: Runnable?, caller: String) { val isEnabled = isEnabled() val key = getKey(entry) if (runnable == null) { log { "Runnable is NULL, stop delete." } headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "Runnable NULL, stop") return } if (!isEnabled()) { if (!isEnabled) { headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "NOT ENABLED, run runnable") runnable.run() return } log { "\n " } val fn = "$label => AvalancheController.delete " + getKey(entry) if (entry == null) { log { "$fn => entry NULL, running runnable" } headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "Entry NULL, run runnable") runnable.run() return } var outcome = "" if (entry in nextMap) { log { "$fn => remove from next" } outcome = "remove from next" if (entry in nextMap) nextMap.remove(entry) if (entry in nextList) nextList.remove(entry) uiEventLogger.log(ThrottleEvent.AVALANCHE_THROTTLING_HUN_REMOVED) } else if (entry in debugDropSet) { log { "$fn => remove from dropset" } outcome = "remove from dropset" debugDropSet.remove(entry) } else if (isShowing(entry)) { log { "$fn => remove showing ${getKey(entry)}" } outcome = "remove showing" previousHunKey = getKey(headsUpEntryShowing) // Show the next HUN before removing this one, so that we don't tell listeners // onHeadsUpPinnedModeChanged, which causes Loading @@ -203,10 +214,10 @@ constructor( showNext() runnable.run() } else { log { "$fn => run runnable for untracked shown ${getKey(entry)}" } outcome = "run runnable for untracked shown" runnable.run() } logState("after $fn") headsUpManagerLogger.logAvalancheDelete(caller, isEnabled(), getKey(entry), outcome) } /** Loading Loading @@ -384,23 +395,12 @@ constructor( } private fun getStateStr(): String { return "SHOWING: [${getKey(headsUpEntryShowing)}]" + "\nPREVIOUS: [$previousHunKey]" + "\nNEXT LIST: $nextListStr" + "\nNEXT MAP: $nextMapStr" + "\nDROPPED: $dropSetStr" + "\nENABLED: $enableAtRuntime" } private fun logState(reason: String) { log { "\n=================================================================================" } log { "STATE $reason" } log { getStateStr() } log { "=================================================================================\n" } return "\navalanche state:" + "\n\tshowing: [${getKey(headsUpEntryShowing)}]" + "\n\tprevious: [$previousHunKey]" + "\n\tnext list: $nextListStr" + "\n\tnext map: $nextMapStr" + "\n\tdropped: $dropSetStr" } private val dropSetStr: String Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt +24 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,30 @@ class HeadsUpManagerLogger @Inject constructor( }) } fun logAvalancheUpdate(caller: String, isEnabled: Boolean, notifEntryKey: String, outcome: String) { buffer.log(TAG, INFO, { str1 = caller str2 = notifEntryKey str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] update: $str2\n\t=> $str3" }) } fun logAvalancheDelete(caller: String, isEnabled: Boolean, notifEntryKey: String, outcome: String) { buffer.log(TAG, INFO, { str1 = caller str2 = notifEntryKey str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] delete: $str2\n\t=> $str3" }) } fun logShowNotification(entry: NotificationEntry) { buffer.log(TAG, INFO, { str1 = entry.logKey Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt +3 −1 Original line number Diff line number Diff line Loading @@ -60,6 +60,7 @@ class AvalancheControllerTest : SysuiTestCase() { // For creating TestableHeadsUpManager @Mock private val mAccessibilityMgr: AccessibilityManagerWrapper? = null private val mUiEventLoggerFake = UiEventLoggerFake() @Mock private lateinit var mHeadsUpManagerLogger: HeadsUpManagerLogger @Mock private lateinit var mBgHandler: Handler Loading @@ -82,7 +83,8 @@ class AvalancheControllerTest : SysuiTestCase() { // Initialize AvalancheController and TestableHeadsUpManager during setUp instead of // declaration, where mocks are null mAvalancheController = AvalancheController(dumpManager, mUiEventLoggerFake, mBgHandler) mAvalancheController = AvalancheController(dumpManager, mUiEventLoggerFake, mHeadsUpManagerLogger, mBgHandler) testableHeadsUpManager = TestableHeadsUpManager( Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { static final int TEST_A11Y_AUTO_DISMISS_TIME = 1_000; private UiEventLoggerFake mUiEventLoggerFake = new UiEventLoggerFake(); private final HeadsUpManagerLogger mLogger = spy(new HeadsUpManagerLogger(logcatLogBuffer())); @Mock private Handler mBgHandler; @Mock private DumpManager dumpManager; Loading Loading @@ -149,7 +150,8 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { @Override public void SysuiSetup() throws Exception { super.SysuiSetup(); mAvalancheController = new AvalancheController(dumpManager, mUiEventLoggerFake, mBgHandler); mAvalancheController = new AvalancheController(dumpManager, mUiEventLoggerFake, mLogger, mBgHandler); } @Test Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerPhoneTest.kt +2 −1 Original line number Diff line number Diff line Loading @@ -179,7 +179,8 @@ class HeadsUpManagerPhoneTest(flags: FlagsParameterization) : BaseHeadsUpManager mContext .getOrCreateTestableResources() .addOverride(R.integer.ambient_notification_extension_time, 500) mAvalancheController = AvalancheController(dumpManager, mUiEventLogger, mBgHandler) mAvalancheController = AvalancheController(dumpManager, mUiEventLogger, mHeadsUpManagerLogger, mBgHandler) } @Test Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt +42 −42 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ class AvalancheController constructor( dumpManager: DumpManager, private val uiEventLogger: UiEventLogger, private val headsUpManagerLogger: HeadsUpManagerLogger, @Background private val bgHandler: Handler ) : Dumpable { Loading Loading @@ -109,32 +110,36 @@ constructor( } /** Run or delay Runnable for given HeadsUpEntry */ fun update(entry: HeadsUpEntry?, runnable: Runnable?, label: String) { fun update(entry: HeadsUpEntry?, runnable: Runnable?, caller: String) { val isEnabled = isEnabled() val key = getKey(entry) if (runnable == null) { log { "Runnable is NULL, stop update." } headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "Runnable NULL, stop") return } if (!isEnabled()) { if (!isEnabled) { headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "NOT ENABLED, run runnable") runnable.run() return } log { "\n " } val fn = "$label => AvalancheController.update ${getKey(entry)}" if (entry == null) { log { "Entry is NULL, stop update." } headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, "Entry NULL, stop") return } if (debug) { debugRunnableLabelMap[runnable] = label debugRunnableLabelMap[runnable] = caller } var outcome = "" if (isShowing(entry)) { log { "\n$fn => update showing" } outcome = "update showing" runnable.run() } else if (entry in nextMap) { log { "\n$fn => update next" } outcome = "update next" nextMap[entry]?.add(runnable) } else if (headsUpEntryShowing == null) { log { "\n$fn => showNow" } outcome = "show now" showNow(entry, arrayListOf(runnable)) } else { // Clean up invalid state when entry is in list but not map and vice versa Loading @@ -156,7 +161,8 @@ constructor( ) } } logState("after $fn") outcome += getStateStr() headsUpManagerLogger.logAvalancheUpdate(caller, isEnabled, key, outcome) } @VisibleForTesting Loading @@ -169,32 +175,37 @@ constructor( * Run or ignore Runnable for given HeadsUpEntry. If entry was never shown, ignore and delete * all Runnables associated with that entry. */ fun delete(entry: HeadsUpEntry?, runnable: Runnable?, label: String) { fun delete(entry: HeadsUpEntry?, runnable: Runnable?, caller: String) { val isEnabled = isEnabled() val key = getKey(entry) if (runnable == null) { log { "Runnable is NULL, stop delete." } headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "Runnable NULL, stop") return } if (!isEnabled()) { if (!isEnabled) { headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "NOT ENABLED, run runnable") runnable.run() return } log { "\n " } val fn = "$label => AvalancheController.delete " + getKey(entry) if (entry == null) { log { "$fn => entry NULL, running runnable" } headsUpManagerLogger.logAvalancheDelete(caller, isEnabled, key, "Entry NULL, run runnable") runnable.run() return } var outcome = "" if (entry in nextMap) { log { "$fn => remove from next" } outcome = "remove from next" if (entry in nextMap) nextMap.remove(entry) if (entry in nextList) nextList.remove(entry) uiEventLogger.log(ThrottleEvent.AVALANCHE_THROTTLING_HUN_REMOVED) } else if (entry in debugDropSet) { log { "$fn => remove from dropset" } outcome = "remove from dropset" debugDropSet.remove(entry) } else if (isShowing(entry)) { log { "$fn => remove showing ${getKey(entry)}" } outcome = "remove showing" previousHunKey = getKey(headsUpEntryShowing) // Show the next HUN before removing this one, so that we don't tell listeners // onHeadsUpPinnedModeChanged, which causes Loading @@ -203,10 +214,10 @@ constructor( showNext() runnable.run() } else { log { "$fn => run runnable for untracked shown ${getKey(entry)}" } outcome = "run runnable for untracked shown" runnable.run() } logState("after $fn") headsUpManagerLogger.logAvalancheDelete(caller, isEnabled(), getKey(entry), outcome) } /** Loading Loading @@ -384,23 +395,12 @@ constructor( } private fun getStateStr(): String { return "SHOWING: [${getKey(headsUpEntryShowing)}]" + "\nPREVIOUS: [$previousHunKey]" + "\nNEXT LIST: $nextListStr" + "\nNEXT MAP: $nextMapStr" + "\nDROPPED: $dropSetStr" + "\nENABLED: $enableAtRuntime" } private fun logState(reason: String) { log { "\n=================================================================================" } log { "STATE $reason" } log { getStateStr() } log { "=================================================================================\n" } return "\navalanche state:" + "\n\tshowing: [${getKey(headsUpEntryShowing)}]" + "\n\tprevious: [$previousHunKey]" + "\n\tnext list: $nextListStr" + "\n\tnext map: $nextMapStr" + "\n\tdropped: $dropSetStr" } private val dropSetStr: String Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManagerLogger.kt +24 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,30 @@ class HeadsUpManagerLogger @Inject constructor( }) } fun logAvalancheUpdate(caller: String, isEnabled: Boolean, notifEntryKey: String, outcome: String) { buffer.log(TAG, INFO, { str1 = caller str2 = notifEntryKey str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] update: $str2\n\t=> $str3" }) } fun logAvalancheDelete(caller: String, isEnabled: Boolean, notifEntryKey: String, outcome: String) { buffer.log(TAG, INFO, { str1 = caller str2 = notifEntryKey str3 = outcome bool1 = isEnabled }, { "$str1\n\t=> AC[isEnabled:$bool1] delete: $str2\n\t=> $str3" }) } fun logShowNotification(entry: NotificationEntry) { buffer.log(TAG, INFO, { str1 = entry.logKey Loading