diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 4e18222355e6d..71f438eb0455d 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -341,6 +341,8 @@
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt
index 70faf406d6213..dd5c5d31fae3b 100644
--- a/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyboard/data/repository/KeyboardRepository.kt
@@ -18,15 +18,19 @@
package com.android.systemui.keyboard.data.repository
import android.hardware.input.InputManager
+import android.hardware.input.InputManager.KeyboardBacklightListener
+import android.hardware.input.KeyboardBacklightState
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyboard.data.model.BacklightModel
+import java.util.concurrent.Executor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.SendChannel
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
@@ -51,24 +55,22 @@ constructor(
private val connectedDeviceIds: Flow> =
conflatedCallbackFlow {
- fun send(element: Set) = trySendWithFailureLogging(element, TAG)
-
var connectedKeyboards = inputManager.inputDeviceIds.toSet()
val listener =
object : InputManager.InputDeviceListener {
override fun onInputDeviceAdded(deviceId: Int) {
connectedKeyboards = connectedKeyboards + deviceId
- send(connectedKeyboards)
+ sendWithLogging(connectedKeyboards)
}
override fun onInputDeviceChanged(deviceId: Int) = Unit
override fun onInputDeviceRemoved(deviceId: Int) {
connectedKeyboards = connectedKeyboards - deviceId
- send(connectedKeyboards)
+ sendWithLogging(connectedKeyboards)
}
}
- send(connectedKeyboards)
+ sendWithLogging(connectedKeyboards)
inputManager.registerInputDeviceListener(listener, /* handler= */ null)
awaitClose { inputManager.unregisterInputDeviceListener(listener) }
}
@@ -78,6 +80,16 @@ constructor(
replay = 1,
)
+ private val backlightStateListener: Flow = conflatedCallbackFlow {
+ val listener = KeyboardBacklightListener { _, state, isTriggeredByKeyPress ->
+ if (isTriggeredByKeyPress) {
+ sendWithLogging(state)
+ }
+ }
+ inputManager.registerKeyboardBacklightListener(Executor(Runnable::run), listener)
+ awaitClose { inputManager.unregisterKeyboardBacklightListener(listener) }
+ }
+
override val keyboardConnected: Flow =
connectedDeviceIds
.map { it.any { deviceId -> isPhysicalFullKeyboard(deviceId) } }
@@ -85,9 +97,13 @@ constructor(
.flowOn(backgroundDispatcher)
override val backlight: Flow =
- conflatedCallbackFlow {
- // TODO(b/268645734) register BacklightListener
- }
+ backlightStateListener
+ .map { BacklightModel(it.brightnessLevel, it.maxBrightnessLevel) }
+ .flowOn(backgroundDispatcher)
+
+ private fun SendChannel.sendWithLogging(element: T) {
+ trySendWithFailureLogging(element, TAG)
+ }
private fun isPhysicalFullKeyboard(deviceId: Int): Boolean {
val device = inputManager.getInputDevice(deviceId)