Merge changes I3726df57,If1dea7b3 into main
* changes: Updated Orientation interactor Added interupt to accessibility interactor
This commit is contained in:
committed by
Android (Google) Code Review
commit
c8c6c80562
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings.biometrics.fingerprint2.domain.interactor
|
package com.android.settings.biometrics.fingerprint2.domain.interactor
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
import android.view.accessibility.AccessibilityEvent
|
import android.view.accessibility.AccessibilityEvent
|
||||||
import android.view.accessibility.AccessibilityEvent.TYPE_ANNOUNCEMENT
|
import android.view.accessibility.AccessibilityEvent.TYPE_ANNOUNCEMENT
|
||||||
import android.view.accessibility.AccessibilityManager
|
import android.view.accessibility.AccessibilityManager
|
||||||
@@ -30,23 +31,26 @@ import kotlinx.coroutines.flow.stateIn
|
|||||||
interface AccessibilityInteractor {
|
interface AccessibilityInteractor {
|
||||||
/** A flow that contains whether or not accessibility is enabled */
|
/** A flow that contains whether or not accessibility is enabled */
|
||||||
fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean>
|
fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean>
|
||||||
|
|
||||||
val isEnabled: Boolean
|
val isEnabled: Boolean
|
||||||
|
|
||||||
fun announce(clazz: Class<*>, announcement: CharSequence?)
|
fun announce(clazz: Class<*>, announcement: CharSequence?)
|
||||||
|
|
||||||
|
fun interrupt()
|
||||||
}
|
}
|
||||||
|
|
||||||
class AccessibilityInteractorImpl(
|
class AccessibilityInteractorImpl(private val accessibilityManager: AccessibilityManager) :
|
||||||
private val accessibilityManager: AccessibilityManager,
|
AccessibilityInteractor {
|
||||||
) : AccessibilityInteractor {
|
|
||||||
/** A flow that contains whether or not accessibility is enabled */
|
/** A flow that contains whether or not accessibility is enabled */
|
||||||
override fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean> =
|
override fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean> =
|
||||||
callbackFlow {
|
callbackFlow {
|
||||||
val listener =
|
val listener =
|
||||||
AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
|
AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
|
||||||
accessibilityManager.addAccessibilityStateChangeListener(listener)
|
accessibilityManager.addAccessibilityStateChangeListener(listener)
|
||||||
|
|
||||||
// This clause will be called when no one is listening to the flow
|
// This clause will be called when no one is listening to the flow
|
||||||
awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
|
awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
|
||||||
}
|
}
|
||||||
.stateIn(
|
.stateIn(
|
||||||
scope,
|
scope,
|
||||||
SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
|
SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
|
||||||
@@ -63,4 +67,17 @@ class AccessibilityInteractorImpl(
|
|||||||
event.text.add(announcement)
|
event.text.add(announcement)
|
||||||
accessibilityManager.sendAccessibilityEvent(event)
|
accessibilityManager.sendAccessibilityEvent(event)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Interrupts the current accessibility manager from announcing a phrase. */
|
||||||
|
override fun interrupt() {
|
||||||
|
try {
|
||||||
|
accessibilityManager.interrupt()
|
||||||
|
} catch (e: IllegalStateException) {
|
||||||
|
Log.e(TAG, "Error trying to interrupt when accessibility isn't enabled $e")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val TAG = "AccessibilityInteractor"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -19,10 +19,13 @@ package com.android.settings.biometrics.fingerprint2.domain.interactor
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.view.OrientationEventListener
|
import android.view.OrientationEventListener
|
||||||
import com.android.internal.R
|
import com.android.internal.R
|
||||||
|
import com.android.settings.biometrics.fingerprint2.lib.model.Orientation
|
||||||
import kotlinx.coroutines.channels.awaitClose
|
import kotlinx.coroutines.channels.awaitClose
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.callbackFlow
|
import kotlinx.coroutines.flow.callbackFlow
|
||||||
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.onStart
|
||||||
import kotlinx.coroutines.flow.transform
|
import kotlinx.coroutines.flow.transform
|
||||||
|
|
||||||
/** Interactor which provides information about orientation */
|
/** Interactor which provides information about orientation */
|
||||||
@@ -45,6 +48,9 @@ interface OrientationInteractor {
|
|||||||
* [R.bool.config_reverseDefaultConfigRotation]
|
* [R.bool.config_reverseDefaultConfigRotation]
|
||||||
*/
|
*/
|
||||||
fun getRotationFromDefault(rotation: Int): Int
|
fun getRotationFromDefault(rotation: Int): Int
|
||||||
|
|
||||||
|
/** Indicates an orientation changed event has occurred */
|
||||||
|
val orientationChanged: Flow<Orientation>
|
||||||
}
|
}
|
||||||
|
|
||||||
class OrientationInteractorImpl(private val context: Context) : OrientationInteractor {
|
class OrientationInteractorImpl(private val context: Context) : OrientationInteractor {
|
||||||
@@ -60,7 +66,10 @@ class OrientationInteractorImpl(private val context: Context) : OrientationInter
|
|||||||
awaitClose { orientationEventListener.disable() }
|
awaitClose { orientationEventListener.disable() }
|
||||||
}
|
}
|
||||||
|
|
||||||
override val rotation: Flow<Int> = orientation.transform { emit(context.display.rotation) }
|
override val rotation: Flow<Int> =
|
||||||
|
orientation
|
||||||
|
.transform { emit(context.display.rotation) }
|
||||||
|
.onStart { emit(context.display.rotation) }
|
||||||
|
|
||||||
override val rotationFromDefault: Flow<Int> = rotation.map { getRotationFromDefault(it) }
|
override val rotationFromDefault: Flow<Int> = rotation.map { getRotationFromDefault(it) }
|
||||||
|
|
||||||
@@ -73,4 +82,24 @@ class OrientationInteractorImpl(private val context: Context) : OrientationInter
|
|||||||
rotation
|
rotation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val orientationChanged: Flow<Orientation> =
|
||||||
|
rotationFromDefault
|
||||||
|
.map {
|
||||||
|
when (it) {
|
||||||
|
1 -> {
|
||||||
|
Orientation.Portrait
|
||||||
|
}
|
||||||
|
2 -> {
|
||||||
|
Orientation.ReverseLandscape
|
||||||
|
}
|
||||||
|
3 -> {
|
||||||
|
Orientation.UpsideDownPortrait
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
Orientation.Landscape
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.distinctUntilChanged()
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.biometrics.fingerprint2.lib.model
|
||||||
|
|
||||||
|
/** The orientation events correspond to androids internal orientation events. */
|
||||||
|
sealed class Orientation {
|
||||||
|
/** Indicates the device is in landscape orientation */
|
||||||
|
data object Landscape : Orientation()
|
||||||
|
|
||||||
|
/** Indicates the device is in reverse landscape orientation */
|
||||||
|
data object ReverseLandscape : Orientation()
|
||||||
|
|
||||||
|
/** Indicates the device is in portrait orientation */
|
||||||
|
data object Portrait : Orientation()
|
||||||
|
|
||||||
|
/** Indicates the device is in the upside down portrait orientation */
|
||||||
|
data object UpsideDownPortrait : Orientation()
|
||||||
|
}
|
@@ -29,6 +29,7 @@ import com.android.settings.biometrics.fingerprint2.domain.interactor.Accessibil
|
|||||||
import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
|
import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
|
||||||
import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
|
import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
|
||||||
import com.android.settings.biometrics.fingerprint2.lib.model.Default
|
import com.android.settings.biometrics.fingerprint2.lib.model.Default
|
||||||
|
import com.android.settings.biometrics.fingerprint2.lib.model.Orientation
|
||||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
|
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
|
||||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
|
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
|
||||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
|
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
|
||||||
@@ -78,6 +79,7 @@ class Injector(step: FingerprintNavigationStep.UiStep) {
|
|||||||
override val isEnabled: Boolean
|
override val isEnabled: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
|
override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
|
||||||
|
override fun interrupt() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
var foldStateInteractor =
|
var foldStateInteractor =
|
||||||
@@ -97,6 +99,7 @@ class Injector(step: FingerprintNavigationStep.UiStep) {
|
|||||||
override val rotationFromDefault: Flow<Int> = rotation
|
override val rotationFromDefault: Flow<Int> = rotation
|
||||||
|
|
||||||
override fun getRotationFromDefault(rotation: Int): Int = rotation
|
override fun getRotationFromDefault(rotation: Int): Int = rotation
|
||||||
|
override val orientationChanged: Flow<Orientation> = flowOf(Orientation.Portrait)
|
||||||
}
|
}
|
||||||
var gatekeeperViewModel = FingerprintGatekeeperViewModel(fingerprintManagerInteractor)
|
var gatekeeperViewModel = FingerprintGatekeeperViewModel(fingerprintManagerInteractor)
|
||||||
|
|
||||||
|
@@ -30,6 +30,7 @@ import com.android.settings.biometrics.fingerprint2.domain.interactor.Accessibil
|
|||||||
import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
|
import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
|
||||||
import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
|
import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
|
||||||
import com.android.settings.biometrics.fingerprint2.lib.model.Default
|
import com.android.settings.biometrics.fingerprint2.lib.model.Default
|
||||||
|
import com.android.settings.biometrics.fingerprint2.lib.model.Orientation
|
||||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
|
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
|
||||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
|
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
|
||||||
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
|
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
|
||||||
@@ -111,6 +112,8 @@ class FingerprintEnrollFindSensorViewModelV2Test {
|
|||||||
override val isEnabled: Boolean
|
override val isEnabled: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
|
override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
|
||||||
|
override fun interrupt() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
foldStateInteractor =
|
foldStateInteractor =
|
||||||
object : FoldStateInteractor {
|
object : FoldStateInteractor {
|
||||||
@@ -128,6 +131,7 @@ class FingerprintEnrollFindSensorViewModelV2Test {
|
|||||||
override val rotationFromDefault: Flow<Int> = flowOf(Surface.ROTATION_0)
|
override val rotationFromDefault: Flow<Int> = flowOf(Surface.ROTATION_0)
|
||||||
|
|
||||||
override fun getRotationFromDefault(rotation: Int): Int = rotation
|
override fun getRotationFromDefault(rotation: Int): Int = rotation
|
||||||
|
override val orientationChanged: Flow<Orientation> = flowOf(Orientation.Portrait)
|
||||||
}
|
}
|
||||||
underTest =
|
underTest =
|
||||||
FingerprintEnrollFindSensorViewModel(
|
FingerprintEnrollFindSensorViewModel(
|
||||||
|
Reference in New Issue
Block a user