BIT-2293, BIT-2294: Add vault and generator shortcuts (#1306)

This commit is contained in:
David Perez
2024-04-25 15:01:13 -05:00
committed by Álison Fernandes
parent 80f6011571
commit bb1fd4ae4f
13 changed files with 336 additions and 11 deletions

View File

@@ -15,6 +15,8 @@ import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.util.isMyVaultShortcut
import com.x8bit.bitwarden.ui.platform.util.isPasswordGeneratorShortcut
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@@ -116,6 +118,8 @@ class MainViewModel @Inject constructor(
val autofillSaveItem = intent.getAutofillSaveItemOrNull()
val autofillSelectionData = intent.getAutofillSelectionDataOrNull()
val shareData = intentManager.getShareDataFromIntent(intent)
val hasGeneratorShortcut = intent.isPasswordGeneratorShortcut
val hasVaultShortcut = intent.isMyVaultShortcut
when {
passwordlessRequestData != null -> {
specialCircumstanceManager.specialCircumstance =
@@ -153,6 +157,15 @@ class MainViewModel @Inject constructor(
shouldFinishWhenComplete = isFirstIntent,
)
}
hasGeneratorShortcut -> {
specialCircumstanceManager.specialCircumstance =
SpecialCircumstance.GeneratorShortcut
}
hasVaultShortcut -> {
specialCircumstanceManager.specialCircumstance = SpecialCircumstance.VaultShortcut
}
}
}
}

View File

@@ -46,4 +46,16 @@ sealed class SpecialCircumstance : Parcelable {
val passwordlessRequestData: PasswordlessRequestData,
val shouldFinishWhenComplete: Boolean,
) : SpecialCircumstance()
/**
* The app was launched via deeplink to the generator.
*/
@Parcelize
data object GeneratorShortcut : SpecialCircumstance()
/**
* The app was launched via deeplink to the vault.
*/
@Parcelize
data object VaultShortcut : SpecialCircumstance()
}

View File

@@ -13,6 +13,8 @@ fun SpecialCircumstance.toAutofillSaveItemOrNull(): AutofillSaveItem? =
is SpecialCircumstance.AutofillSelection -> null
is SpecialCircumstance.PasswordlessRequest -> null
is SpecialCircumstance.ShareNewSend -> null
SpecialCircumstance.GeneratorShortcut -> null
SpecialCircumstance.VaultShortcut -> null
}
/**
@@ -24,4 +26,6 @@ fun SpecialCircumstance.toAutofillSelectionDataOrNull(): AutofillSelectionData?
is SpecialCircumstance.AutofillSelection -> this.autofillSelectionData
is SpecialCircumstance.PasswordlessRequest -> null
is SpecialCircumstance.ShareNewSend -> null
SpecialCircumstance.GeneratorShortcut -> null
SpecialCircumstance.VaultShortcut -> null
}

View File

@@ -59,7 +59,6 @@ class RootNavViewModel @Inject constructor(
action: RootNavAction.Internal.UserStateUpdateReceive,
) {
val userState = action.userState
val specialCircumstance = action.specialCircumstance
val updatedRootNavState = when {
userState?.activeAccount?.trustedDevice?.isDeviceTrusted == false &&
!userState.activeAccount.isVaultUnlocked -> RootNavState.TrustedDevice
@@ -73,7 +72,7 @@ class RootNavViewModel @Inject constructor(
userState.hasPendingAccountAddition -> RootNavState.Auth
userState.activeAccount.isVaultUnlocked -> {
when (specialCircumstance) {
when (val specialCircumstance = action.specialCircumstance) {
is SpecialCircumstance.AutofillSave -> {
RootNavState.VaultUnlockedForAutofillSave(
autofillSaveItem = specialCircumstance.autofillSaveItem,
@@ -93,11 +92,10 @@ class RootNavViewModel @Inject constructor(
RootNavState.VaultUnlockedForAuthRequest
}
null -> {
RootNavState.VaultUnlocked(
activeUserId = userState.activeAccount.userId,
)
}
SpecialCircumstance.GeneratorShortcut,
SpecialCircumstance.VaultShortcut,
null,
-> RootNavState.VaultUnlocked(activeUserId = userState.activeAccount.userId)
}
}

View File

@@ -1,6 +1,8 @@
package com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@@ -11,10 +13,25 @@ import javax.inject.Inject
@HiltViewModel
class VaultUnlockedNavBarViewModel @Inject constructor(
private val authRepository: AuthRepository,
) :
BaseViewModel<Unit, VaultUnlockedNavBarEvent, VaultUnlockedNavBarAction>(
initialState = Unit,
) {
specialCircumstancesManager: SpecialCircumstanceManager,
) : BaseViewModel<Unit, VaultUnlockedNavBarEvent, VaultUnlockedNavBarAction>(
initialState = Unit,
) {
init {
when (specialCircumstancesManager.specialCircumstance) {
SpecialCircumstance.GeneratorShortcut -> {
sendEvent(VaultUnlockedNavBarEvent.NavigateToGeneratorScreen)
specialCircumstancesManager.specialCircumstance = null
}
SpecialCircumstance.VaultShortcut -> {
sendEvent(VaultUnlockedNavBarEvent.NavigateToVaultScreen)
specialCircumstancesManager.specialCircumstance = null
}
else -> Unit
}
}
override fun handleAction(action: VaultUnlockedNavBarAction) {
when (action) {

View File

@@ -0,0 +1,15 @@
package com.x8bit.bitwarden.ui.platform.util
import android.content.Intent
/**
* Returns `true` if the [Intent] is a deeplink to the vault, `false` otherwise.
*/
val Intent.isMyVaultShortcut: Boolean
get() = dataString?.equals("bitwarden://my_vault") == true
/**
* Returns `true` if the [Intent] is a deeplink to the password generator, `false` otherwise.
*/
val Intent.isPasswordGeneratorShortcut: Boolean
get() = dataString?.equals("bitwarden://password_generator") == true