Merge "KeyguardBottomAreaView new impl. - domain layer" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
62c47f6c03
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.common.domain.model
|
||||
|
||||
import com.android.systemui.common.data.model.Position as DataLayerPosition
|
||||
|
||||
/** Models a two-dimensional position */
|
||||
data class Position(
|
||||
val x: Int,
|
||||
val y: Int,
|
||||
) {
|
||||
companion object {
|
||||
fun DataLayerPosition.toDomainLayer(): Position {
|
||||
return Position(
|
||||
x = x,
|
||||
y = y,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,7 @@ import com.android.systemui.keyguard.DismissCallbackRegistry;
|
||||
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
|
||||
import com.android.systemui.keyguard.KeyguardViewMediator;
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepositoryModule;
|
||||
import com.android.systemui.keyguard.domain.usecase.KeyguardUseCaseModule;
|
||||
import com.android.systemui.navigationbar.NavigationModeController;
|
||||
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
||||
import com.android.systemui.statusbar.NotificationShadeWindowController;
|
||||
@@ -70,6 +71,7 @@ import dagger.Provides;
|
||||
includes = {
|
||||
FalsingModule.class,
|
||||
KeyguardRepositoryModule.class,
|
||||
KeyguardUseCaseModule.class,
|
||||
})
|
||||
public class KeyguardModule {
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
|
||||
@Module
|
||||
interface KeyguardUseCaseModule {
|
||||
|
||||
@Binds
|
||||
fun launchQuickAffordance(
|
||||
impl: LaunchKeyguardQuickAffordanceUseCaseImpl
|
||||
): LaunchKeyguardQuickAffordanceUseCase
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import android.content.Intent
|
||||
import com.android.internal.widget.LockPatternUtils
|
||||
import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.StrongAuthFlags
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
import com.android.systemui.settings.UserTracker
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController
|
||||
import javax.inject.Inject
|
||||
|
||||
/** Defines interface for classes that can launch a quick affordance. */
|
||||
interface LaunchKeyguardQuickAffordanceUseCase {
|
||||
operator fun invoke(
|
||||
intent: Intent,
|
||||
canShowWhileLocked: Boolean,
|
||||
animationController: ActivityLaunchAnimator.Controller?,
|
||||
)
|
||||
}
|
||||
|
||||
/** Real implementation of [LaunchKeyguardQuickAffordanceUseCase] */
|
||||
class LaunchKeyguardQuickAffordanceUseCaseImpl
|
||||
@Inject
|
||||
constructor(
|
||||
private val lockPatternUtils: LockPatternUtils,
|
||||
private val keyguardStateController: KeyguardStateController,
|
||||
private val userTracker: UserTracker,
|
||||
private val activityStarter: ActivityStarter,
|
||||
) : LaunchKeyguardQuickAffordanceUseCase {
|
||||
override operator fun invoke(
|
||||
intent: Intent,
|
||||
canShowWhileLocked: Boolean,
|
||||
animationController: ActivityLaunchAnimator.Controller?,
|
||||
) {
|
||||
@StrongAuthFlags
|
||||
val strongAuthFlags =
|
||||
lockPatternUtils.getStrongAuthForUser(userTracker.userHandle.identifier)
|
||||
val needsToUnlockFirst =
|
||||
when {
|
||||
strongAuthFlags ==
|
||||
LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT -> true
|
||||
!canShowWhileLocked && !keyguardStateController.isUnlocked -> true
|
||||
else -> false
|
||||
}
|
||||
if (needsToUnlockFirst) {
|
||||
activityStarter.postStartActivityDismissingKeyguard(
|
||||
intent,
|
||||
0 /* delay */,
|
||||
animationController
|
||||
)
|
||||
} else {
|
||||
activityStarter.startActivity(
|
||||
intent,
|
||||
true /* dismissShade */,
|
||||
animationController,
|
||||
true /* showOverLockscreenWhenLocked */,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/** Use-case for observing whether doze state transitions should animate the bottom area */
|
||||
class ObserveAnimateBottomAreaTransitionsUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(): Flow<Boolean> {
|
||||
return repository.animateBottomAreaDozingTransitions
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/** Use-case for observing the alpha of the bottom area */
|
||||
class ObserveBottomAreaAlphaUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(): Flow<Float> {
|
||||
return repository.bottomAreaAlpha
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.common.domain.model.Position
|
||||
import com.android.systemui.common.domain.model.Position.Companion.toDomainLayer
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
||||
/** Use-case for observing the position of the clock. */
|
||||
class ObserveClockPositionUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(): Flow<Position> {
|
||||
return repository.clockPosition.map { it.toDomainLayer() }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/** Use-case for observing the amount of doze the system is in. */
|
||||
class ObserveDozeAmountUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(): Flow<Float> {
|
||||
return repository.dozeAmount
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
/** Use-case for observing whether we are dozing. */
|
||||
class ObserveIsDozingUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(): Flow<Boolean> {
|
||||
return repository.isDozing
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardQuickAffordanceRepository
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardQuickAffordanceModel
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardQuickAffordancePosition
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
|
||||
/** Use-case for observing the model of a quick affordance in the keyguard. */
|
||||
class ObserveKeyguardQuickAffordanceUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardQuickAffordanceRepository,
|
||||
private val isDozingUseCase: ObserveIsDozingUseCase,
|
||||
private val dozeAmountUseCase: ObserveDozeAmountUseCase,
|
||||
) {
|
||||
operator fun invoke(
|
||||
position: KeyguardQuickAffordancePosition
|
||||
): Flow<KeyguardQuickAffordanceModel> {
|
||||
return combine(
|
||||
repository.affordance(position),
|
||||
isDozingUseCase(),
|
||||
dozeAmountUseCase(),
|
||||
) { affordance, isDozing, dozeAmount ->
|
||||
if (!isDozing && dozeAmount == 0f) {
|
||||
affordance
|
||||
} else {
|
||||
KeyguardQuickAffordanceModel.Hidden
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
import com.android.systemui.keyguard.data.config.KeyguardQuickAffordanceConfigs
|
||||
import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig
|
||||
import com.android.systemui.keyguard.data.quickaffordance.KeyguardQuickAffordanceConfig.OnClickedResult
|
||||
import javax.inject.Inject
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/** Use-case for handling a click on a keyguard quick affordance (e.g. bottom button). */
|
||||
class OnKeyguardQuickAffordanceClickedUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val configs: KeyguardQuickAffordanceConfigs,
|
||||
private val launchAffordanceUseCase: LaunchKeyguardQuickAffordanceUseCase,
|
||||
) {
|
||||
operator fun invoke(
|
||||
configKey: KClass<*>,
|
||||
animationController: ActivityLaunchAnimator.Controller?,
|
||||
) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val config = configs.get(configKey as KClass<out KeyguardQuickAffordanceConfig>)
|
||||
when (val result = config.onQuickAffordanceClicked(animationController)) {
|
||||
is OnClickedResult.StartActivity ->
|
||||
launchAffordanceUseCase(
|
||||
intent = result.intent,
|
||||
canShowWhileLocked = result.canShowWhileLocked,
|
||||
animationController = animationController
|
||||
)
|
||||
is OnClickedResult.Handled -> Unit
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
/** Use-case for setting the updated clock position. */
|
||||
class SetClockPositionUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val keyguardRepository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(x: Int, y: Int) {
|
||||
keyguardRepository.setClockPosition(x, y)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
/** Use-case for setting the alpha that the keyguard bottom area should use */
|
||||
class SetKeyguardBottomAreaAlphaUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(alpha: Float) {
|
||||
repository.setBottomAreaAlpha(alpha)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Use-case for setting whether the keyguard bottom area should animate the next doze transitions
|
||||
*/
|
||||
class SetKeyguardBottomAreaAnimateDozingTransitionsUseCase
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: KeyguardRepository,
|
||||
) {
|
||||
operator fun invoke(animate: Boolean) {
|
||||
repository.setAnimateDozingTransitions(animate)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import android.content.Intent
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
|
||||
/** Fake implementation of [LaunchKeyguardQuickAffordanceUseCase], for tests. */
|
||||
class FakeLaunchKeyguardQuickAffordanceUseCase : LaunchKeyguardQuickAffordanceUseCase {
|
||||
|
||||
data class Invocation(
|
||||
val intent: Intent,
|
||||
val canShowWhileLocked: Boolean,
|
||||
val animationController: ActivityLaunchAnimator.Controller?
|
||||
)
|
||||
|
||||
private val _invocations = mutableListOf<Invocation>()
|
||||
val invocations: List<Invocation> = _invocations
|
||||
|
||||
override fun invoke(
|
||||
intent: Intent,
|
||||
canShowWhileLocked: Boolean,
|
||||
animationController: ActivityLaunchAnimator.Controller?
|
||||
) {
|
||||
_invocations.add(
|
||||
Invocation(
|
||||
intent = intent,
|
||||
canShowWhileLocked = canShowWhileLocked,
|
||||
animationController = animationController,
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import android.content.Intent
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.internal.widget.LockPatternUtils
|
||||
import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
import com.android.systemui.settings.UserTracker
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController
|
||||
import com.android.systemui.util.mockito.any
|
||||
import com.android.systemui.util.mockito.mock
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.Parameterized
|
||||
import org.junit.runners.Parameterized.Parameter
|
||||
import org.junit.runners.Parameterized.Parameters
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.verify
|
||||
import org.mockito.Mockito.`when` as whenever
|
||||
import org.mockito.MockitoAnnotations
|
||||
|
||||
@SmallTest
|
||||
@RunWith(Parameterized::class)
|
||||
class LaunchKeyguardQuickAffordanceUseCaseImplTest : SysuiTestCase() {
|
||||
|
||||
companion object {
|
||||
private val INTENT = Intent("some.intent.action")
|
||||
|
||||
@Parameters(
|
||||
name =
|
||||
"needStrongAuthAfterBoot={0}, canShowWhileLocked={1}," +
|
||||
" keyguardIsUnlocked={2}, needsToUnlockFirst={3}"
|
||||
)
|
||||
@JvmStatic
|
||||
fun data() =
|
||||
listOf(
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ false,
|
||||
/* canShowWhileLocked= */ false,
|
||||
/* keyguardIsUnlocked= */ false,
|
||||
/* needsToUnlockFirst= */ true,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ false,
|
||||
/* canShowWhileLocked= */ false,
|
||||
/* keyguardIsUnlocked= */ true,
|
||||
/* needsToUnlockFirst= */ false,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ false,
|
||||
/* canShowWhileLocked= */ true,
|
||||
/* keyguardIsUnlocked= */ false,
|
||||
/* needsToUnlockFirst= */ false,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ false,
|
||||
/* canShowWhileLocked= */ true,
|
||||
/* keyguardIsUnlocked= */ true,
|
||||
/* needsToUnlockFirst= */ false,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ true,
|
||||
/* canShowWhileLocked= */ false,
|
||||
/* keyguardIsUnlocked= */ false,
|
||||
/* needsToUnlockFirst= */ true,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ true,
|
||||
/* canShowWhileLocked= */ false,
|
||||
/* keyguardIsUnlocked= */ true,
|
||||
/* needsToUnlockFirst= */ true,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ true,
|
||||
/* canShowWhileLocked= */ true,
|
||||
/* keyguardIsUnlocked= */ false,
|
||||
/* needsToUnlockFirst= */ true,
|
||||
),
|
||||
arrayOf(
|
||||
/* needStrongAuthAfterBoot= */ true,
|
||||
/* canShowWhileLocked= */ true,
|
||||
/* keyguardIsUnlocked= */ true,
|
||||
/* needsToUnlockFirst= */ true,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Mock private lateinit var lockPatternUtils: LockPatternUtils
|
||||
@Mock private lateinit var keyguardStateController: KeyguardStateController
|
||||
@Mock private lateinit var userTracker: UserTracker
|
||||
@Mock private lateinit var activityStarter: ActivityStarter
|
||||
@Mock private lateinit var animationController: ActivityLaunchAnimator.Controller
|
||||
|
||||
private lateinit var underTest: LaunchKeyguardQuickAffordanceUseCase
|
||||
|
||||
@JvmField @Parameter(0) var needStrongAuthAfterBoot: Boolean = false
|
||||
@JvmField @Parameter(1) var canShowWhileLocked: Boolean = false
|
||||
@JvmField @Parameter(2) var keyguardIsUnlocked: Boolean = false
|
||||
@JvmField @Parameter(3) var needsToUnlockFirst: Boolean = false
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
MockitoAnnotations.initMocks(this)
|
||||
|
||||
underTest =
|
||||
LaunchKeyguardQuickAffordanceUseCaseImpl(
|
||||
lockPatternUtils = lockPatternUtils,
|
||||
keyguardStateController = keyguardStateController,
|
||||
userTracker = userTracker,
|
||||
activityStarter = activityStarter,
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun invoke() {
|
||||
setUpMocks(
|
||||
needStrongAuthAfterBoot = needStrongAuthAfterBoot,
|
||||
keyguardIsUnlocked = keyguardIsUnlocked,
|
||||
)
|
||||
|
||||
underTest(
|
||||
intent = INTENT,
|
||||
canShowWhileLocked = canShowWhileLocked,
|
||||
animationController = animationController,
|
||||
)
|
||||
|
||||
if (needsToUnlockFirst) {
|
||||
verify(activityStarter)
|
||||
.postStartActivityDismissingKeyguard(
|
||||
INTENT,
|
||||
/* delay= */ 0,
|
||||
animationController,
|
||||
)
|
||||
} else {
|
||||
verify(activityStarter)
|
||||
.startActivity(
|
||||
INTENT,
|
||||
/* dismissShade= */ true,
|
||||
animationController,
|
||||
/* showOverLockscreenWhenLocked= */ true,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setUpMocks(
|
||||
needStrongAuthAfterBoot: Boolean = true,
|
||||
keyguardIsUnlocked: Boolean = false,
|
||||
) {
|
||||
whenever(userTracker.userHandle).thenReturn(mock())
|
||||
whenever(lockPatternUtils.getStrongAuthForUser(any()))
|
||||
.thenReturn(
|
||||
if (needStrongAuthAfterBoot) {
|
||||
LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
|
||||
} else {
|
||||
LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED
|
||||
}
|
||||
)
|
||||
whenever(keyguardStateController.isUnlocked).thenReturn(keyguardIsUnlocked)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.systemui.keyguard.domain.usecase
|
||||
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.containeddrawable.ContainedDrawable
|
||||
import com.android.systemui.keyguard.data.quickaffordance.HomeControlsKeyguardQuickAffordanceConfig
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardQuickAffordanceRepository
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardQuickAffordanceModel
|
||||
import com.android.systemui.keyguard.shared.model.KeyguardQuickAffordancePosition
|
||||
import com.android.systemui.util.mockito.mock
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.test.runBlockingTest
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.JUnit4
|
||||
|
||||
@SmallTest
|
||||
@RunWith(JUnit4::class)
|
||||
class ObserveKeyguardQuickAffordanceUseCaseTest : SysuiTestCase() {
|
||||
|
||||
private lateinit var underTest: ObserveKeyguardQuickAffordanceUseCase
|
||||
|
||||
private lateinit var repository: FakeKeyguardRepository
|
||||
private lateinit var quickAffordanceRepository: FakeKeyguardQuickAffordanceRepository
|
||||
private lateinit var isDozingUseCase: ObserveIsDozingUseCase
|
||||
private lateinit var dozeAmountUseCase: ObserveDozeAmountUseCase
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
repository = FakeKeyguardRepository()
|
||||
isDozingUseCase = ObserveIsDozingUseCase(repository)
|
||||
dozeAmountUseCase = ObserveDozeAmountUseCase(repository)
|
||||
quickAffordanceRepository = FakeKeyguardQuickAffordanceRepository()
|
||||
|
||||
underTest =
|
||||
ObserveKeyguardQuickAffordanceUseCase(
|
||||
repository = quickAffordanceRepository,
|
||||
isDozingUseCase = isDozingUseCase,
|
||||
dozeAmountUseCase = dozeAmountUseCase,
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invoke - affordance is visible`() = runBlockingTest {
|
||||
val configKey = HomeControlsKeyguardQuickAffordanceConfig::class
|
||||
val model =
|
||||
KeyguardQuickAffordanceModel.Visible(
|
||||
configKey = configKey,
|
||||
icon = ICON,
|
||||
contentDescriptionResourceId = CONTENT_DESCRIPTION_RESOURCE_ID,
|
||||
)
|
||||
quickAffordanceRepository.setModel(
|
||||
KeyguardQuickAffordancePosition.BOTTOM_END,
|
||||
model,
|
||||
)
|
||||
|
||||
var latest: KeyguardQuickAffordanceModel? = null
|
||||
val job = underTest(KeyguardQuickAffordancePosition.BOTTOM_END)
|
||||
.onEach { latest = it }
|
||||
.launchIn(this)
|
||||
|
||||
assertThat(latest).isInstanceOf(KeyguardQuickAffordanceModel.Visible::class.java)
|
||||
val visibleModel = latest as KeyguardQuickAffordanceModel.Visible
|
||||
assertThat(visibleModel.configKey).isEqualTo(configKey)
|
||||
assertThat(visibleModel.icon).isEqualTo(ICON)
|
||||
assertThat(visibleModel.contentDescriptionResourceId)
|
||||
.isEqualTo(CONTENT_DESCRIPTION_RESOURCE_ID)
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invoke - affordance not visible while dozing`() = runBlockingTest {
|
||||
repository.setDozing(true)
|
||||
val configKey = HomeControlsKeyguardQuickAffordanceConfig::class
|
||||
val model =
|
||||
KeyguardQuickAffordanceModel.Visible(
|
||||
configKey = configKey,
|
||||
icon = ICON,
|
||||
contentDescriptionResourceId = CONTENT_DESCRIPTION_RESOURCE_ID,
|
||||
)
|
||||
quickAffordanceRepository.setModel(
|
||||
KeyguardQuickAffordancePosition.BOTTOM_END,
|
||||
model,
|
||||
)
|
||||
|
||||
var latest: KeyguardQuickAffordanceModel? = null
|
||||
val job = underTest(KeyguardQuickAffordancePosition.BOTTOM_END)
|
||||
.onEach { latest = it }
|
||||
.launchIn(this)
|
||||
assertThat(latest).isEqualTo(KeyguardQuickAffordanceModel.Hidden)
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invoke - affordance not visible doze amount is not 0`() = runBlockingTest {
|
||||
repository.setDozeAmount(0.3f)
|
||||
val configKey = HomeControlsKeyguardQuickAffordanceConfig::class
|
||||
val model =
|
||||
KeyguardQuickAffordanceModel.Visible(
|
||||
configKey = configKey,
|
||||
icon = ICON,
|
||||
contentDescriptionResourceId = CONTENT_DESCRIPTION_RESOURCE_ID,
|
||||
)
|
||||
quickAffordanceRepository.setModel(
|
||||
KeyguardQuickAffordancePosition.BOTTOM_END,
|
||||
model,
|
||||
)
|
||||
|
||||
var latest: KeyguardQuickAffordanceModel? = null
|
||||
val job = underTest(KeyguardQuickAffordancePosition.BOTTOM_END)
|
||||
.onEach { latest = it }
|
||||
.launchIn(this)
|
||||
assertThat(latest).isEqualTo(KeyguardQuickAffordanceModel.Hidden)
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `invoke - affordance is none`() = runBlockingTest {
|
||||
quickAffordanceRepository.setModel(
|
||||
KeyguardQuickAffordancePosition.BOTTOM_START,
|
||||
KeyguardQuickAffordanceModel.Hidden,
|
||||
)
|
||||
|
||||
var latest: KeyguardQuickAffordanceModel? = null
|
||||
val job = underTest(KeyguardQuickAffordancePosition.BOTTOM_START)
|
||||
.onEach { latest = it }
|
||||
.launchIn(this)
|
||||
assertThat(latest).isEqualTo(KeyguardQuickAffordanceModel.Hidden)
|
||||
job.cancel()
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val ICON: ContainedDrawable = mock()
|
||||
private const val CONTENT_DESCRIPTION_RESOURCE_ID = 1337
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user