diff options
5 files changed, 61 insertions, 19 deletions
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt index ed6e6198f139..ab36d5899739 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt @@ -51,9 +51,12 @@ open class ClockRegistry( defaultClockProvider: ClockProvider, val fallbackClockId: ClockId = DEFAULT_CLOCK_ID, ) { - // Usually this would be a typealias, but a SAM provides better java interop - fun interface ClockChangeListener { - fun onClockChanged() + interface ClockChangeListener { + // Called when the active clock changes + fun onCurrentClockChanged() {} + + // Called when the list of available clocks changes + fun onAvailableClocksChanged() {} } private val availableClocks = mutableMapOf<ClockId, ClockInfo>() @@ -92,7 +95,7 @@ open class ClockRegistry( protected set(value) { if (field != value) { field = value - scope.launch(mainDispatcher) { onClockChanged() } + scope.launch(mainDispatcher) { onClockChanged { it.onCurrentClockChanged() } } } } @@ -164,9 +167,9 @@ open class ClockRegistry( Assert.isNotMainThread() } - private fun onClockChanged() { + private fun onClockChanged(func: (ClockChangeListener) -> Unit) { assertMainThread() - clockChangeListeners.forEach { it.onClockChanged() } + clockChangeListeners.forEach(func) } private fun mutateSetting(mutator: (ClockSettings) -> ClockSettings) { @@ -241,6 +244,7 @@ open class ClockRegistry( } private fun connectClocks(provider: ClockProvider) { + var isAvailableChanged = false val currentId = currentClockId for (clock in provider.getClocks()) { val id = clock.clockId @@ -251,10 +255,11 @@ open class ClockRegistry( "Clock Id conflict: $id is registered by both " + "${provider::class.simpleName} and ${current.provider::class.simpleName}" ) - return + continue } availableClocks[id] = ClockInfo(clock, provider) + isAvailableChanged = true if (DEBUG) { Log.i(TAG, "Added ${clock.clockId}") } @@ -263,24 +268,35 @@ open class ClockRegistry( if (DEBUG) { Log.i(TAG, "Current clock ($currentId) was connected") } - onClockChanged() + onClockChanged { it.onCurrentClockChanged() } } } + + if (isAvailableChanged) { + onClockChanged { it.onAvailableClocksChanged() } + } } private fun disconnectClocks(provider: ClockProvider) { + var isAvailableChanged = false val currentId = currentClockId for (clock in provider.getClocks()) { availableClocks.remove(clock.clockId) + isAvailableChanged = true + if (DEBUG) { Log.i(TAG, "Removed ${clock.clockId}") } if (currentId == clock.clockId) { Log.w(TAG, "Current clock ($currentId) was disconnected") - onClockChanged() + onClockChanged { it.onCurrentClockChanged() } } } + + if (isAvailableChanged) { + onClockChanged { it.onAvailableClocksChanged() } + } } fun getClocks(): List<ClockMetadata> { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index baaeb2a1b3a5..b85b2b8314ed 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -151,8 +151,13 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mLogBuffer = logBuffer; mView.setLogBuffer(mLogBuffer); - mClockChangedListener = () -> { - setClock(mClockRegistry.createCurrentClock()); + mClockChangedListener = new ClockRegistry.ClockChangeListener() { + @Override + public void onCurrentClockChanged() { + setClock(mClockRegistry.createCurrentClock()); + } + @Override + public void onAvailableClocksChanged() { } }; } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt index 403576cd1ec0..72b317c6274c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt @@ -170,7 +170,12 @@ constructor( } private fun setUpClock(parentView: ViewGroup) { - val clockChangeListener = ClockRegistry.ClockChangeListener { onClockChanged(parentView) } + val clockChangeListener = + object : ClockRegistry.ClockChangeListener { + override fun onCurrentClockChanged() { + onClockChanged(parentView) + } + } clockRegistry.registerClockChangeListener(clockChangeListener) disposables.add( DisposableHandle { clockRegistry.unregisterClockChangeListener(clockChangeListener) } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java index ccc4e4af4ac8..a5f90f8441b2 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java @@ -241,7 +241,7 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase { mController.init(); verify(mClockRegistry).registerClockChangeListener(listenerArgumentCaptor.capture()); - listenerArgumentCaptor.getValue().onClockChanged(); + listenerArgumentCaptor.getValue().onCurrentClockChanged(); verify(mView, times(2)).setClock(mClockController, StatusBarState.SHADE); verify(mClockEventController, times(2)).setClock(mClockController); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt index d01edccb6a82..26eff61066ee 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/ClockRegistryTest.kt @@ -230,7 +230,7 @@ class ClockRegistryTest : SysuiTestCase() { } @Test - fun pluginRemoved_clockChanged() { + fun pluginRemoved_clockAndListChanged() { val plugin1 = FakeClockPlugin() .addClock("clock_1", "clock 1") .addClock("clock_2", "clock 2") @@ -239,20 +239,36 @@ class ClockRegistryTest : SysuiTestCase() { .addClock("clock_3", "clock 3", { mockClock }) .addClock("clock_4", "clock 4") + + var changeCallCount = 0 + var listChangeCallCount = 0 + registry.registerClockChangeListener(object : ClockRegistry.ClockChangeListener { + override fun onCurrentClockChanged() { changeCallCount++ } + override fun onAvailableClocksChanged() { listChangeCallCount++ } + }) + registry.applySettings(ClockSettings("clock_3", null)) + assertEquals(0, changeCallCount) + assertEquals(0, listChangeCallCount) + pluginListener.onPluginConnected(plugin1, mockContext) - pluginListener.onPluginConnected(plugin2, mockContext) + assertEquals(0, changeCallCount) + assertEquals(1, listChangeCallCount) - var changeCallCount = 0 - registry.registerClockChangeListener { changeCallCount++ } + pluginListener.onPluginConnected(plugin2, mockContext) + assertEquals(1, changeCallCount) + assertEquals(2, listChangeCallCount) pluginListener.onPluginDisconnected(plugin1) - assertEquals(0, changeCallCount) + assertEquals(1, changeCallCount) + assertEquals(3, listChangeCallCount) pluginListener.onPluginDisconnected(plugin2) - assertEquals(1, changeCallCount) + assertEquals(2, changeCallCount) + assertEquals(4, listChangeCallCount) } + @Test fun jsonDeserialization_gotExpectedObject() { val expected = ClockSettings("ID", null).apply { _applied_timestamp = 500 } |