Merge changes I3726df57,If1dea7b3 into main

* changes:
  Updated Orientation interactor
  Added interupt to accessibility interactor
This commit is contained in:
Joshua Mccloskey
2024-11-05 23:24:34 +00:00
committed by Android (Google) Code Review
5 changed files with 95 additions and 10 deletions

View File

@@ -16,6 +16,7 @@
package com.android.settings.biometrics.fingerprint2.domain.interactor
import android.util.Log
import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityEvent.TYPE_ANNOUNCEMENT
import android.view.accessibility.AccessibilityManager
@@ -30,13 +31,16 @@ import kotlinx.coroutines.flow.stateIn
interface AccessibilityInteractor {
/** A flow that contains whether or not accessibility is enabled */
fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean>
val isEnabled: Boolean
fun announce(clazz: Class<*>, announcement: CharSequence?)
fun interrupt()
}
class AccessibilityInteractorImpl(
private val accessibilityManager: AccessibilityManager,
) : AccessibilityInteractor {
class AccessibilityInteractorImpl(private val accessibilityManager: AccessibilityManager) :
AccessibilityInteractor {
/** A flow that contains whether or not accessibility is enabled */
override fun isEnabledFlow(scope: CoroutineScope): Flow<Boolean> =
callbackFlow {
@@ -63,4 +67,17 @@ class AccessibilityInteractorImpl(
event.text.add(announcement)
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"
}
}

View File

@@ -19,10 +19,13 @@ package com.android.settings.biometrics.fingerprint2.domain.interactor
import android.content.Context
import android.view.OrientationEventListener
import com.android.internal.R
import com.android.settings.biometrics.fingerprint2.lib.model.Orientation
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.transform
/** Interactor which provides information about orientation */
@@ -45,6 +48,9 @@ interface OrientationInteractor {
* [R.bool.config_reverseDefaultConfigRotation]
*/
fun getRotationFromDefault(rotation: Int): Int
/** Indicates an orientation changed event has occurred */
val orientationChanged: Flow<Orientation>
}
class OrientationInteractorImpl(private val context: Context) : OrientationInteractor {
@@ -60,7 +66,10 @@ class OrientationInteractorImpl(private val context: Context) : OrientationInter
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) }
@@ -73,4 +82,24 @@ class OrientationInteractorImpl(private val context: Context) : OrientationInter
rotation
}
}
override val orientationChanged: Flow<Orientation> =
rotationFromDefault
.map {
when (it) {
1 -> {
Orientation.Portrait
}
2 -> {
Orientation.ReverseLandscape
}
3 -> {
Orientation.UpsideDownPortrait
}
else -> {
Orientation.Landscape
}
}
}
.distinctUntilChanged()
}

View File

@@ -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()
}

View File

@@ -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.OrientationInteractor
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.RFPSViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
@@ -78,6 +79,7 @@ class Injector(step: FingerprintNavigationStep.UiStep) {
override val isEnabled: Boolean
get() = true
override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
override fun interrupt() {}
}
var foldStateInteractor =
@@ -97,6 +99,7 @@ class Injector(step: FingerprintNavigationStep.UiStep) {
override val rotationFromDefault: Flow<Int> = rotation
override fun getRotationFromDefault(rotation: Int): Int = rotation
override val orientationChanged: Flow<Orientation> = flowOf(Orientation.Portrait)
}
var gatekeeperViewModel = FingerprintGatekeeperViewModel(fingerprintManagerInteractor)

View File

@@ -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.OrientationInteractor
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.FingerprintEnrollFindSensorViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
@@ -111,6 +112,8 @@ class FingerprintEnrollFindSensorViewModelV2Test {
override val isEnabled: Boolean
get() = true
override fun announce(clazz: Class<*>, announcement: CharSequence?) {}
override fun interrupt() {
}
}
foldStateInteractor =
object : FoldStateInteractor {
@@ -128,6 +131,7 @@ class FingerprintEnrollFindSensorViewModelV2Test {
override val rotationFromDefault: Flow<Int> = flowOf(Surface.ROTATION_0)
override fun getRotationFromDefault(rotation: Int): Int = rotation
override val orientationChanged: Flow<Orientation> = flowOf(Orientation.Portrait)
}
underTest =
FingerprintEnrollFindSensorViewModel(