[PM-24411] Extract Authenticator functions from IntentManager (#5702)

This commit is contained in:
Patrick Honkonen 2025-08-15 12:09:21 -04:00 committed by GitHub
parent b9cc664efa
commit b0b4379307
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 46 additions and 41 deletions

View File

@ -1,9 +1,6 @@
package com.bitwarden.authenticator.ui.authenticator.feature.itemlisting
import android.Manifest
import android.content.Intent
import android.net.Uri
import android.provider.Settings
import android.widget.Toast
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
@ -83,6 +80,8 @@ import com.bitwarden.authenticator.ui.platform.composition.LocalPermissionsManag
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
import com.bitwarden.authenticator.ui.platform.manager.permissions.PermissionsManager
import com.bitwarden.authenticator.ui.platform.theme.Typography
import com.bitwarden.authenticator.ui.platform.util.startAuthenticatorAppSettings
import com.bitwarden.authenticator.ui.platform.util.startBitwardenAccountSettings
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
@ -139,10 +138,7 @@ fun ItemListingScreen(
is ItemListingEvent.NavigateToEditItem -> onNavigateToEditItemScreen(event.id)
is ItemListingEvent.NavigateToAppSettings -> {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.parse("package:" + context.packageName)
intentManager.startActivity(intent = intent)
intentManager.startAuthenticatorAppSettings(context)
}
ItemListingEvent.NavigateToBitwardenListing -> {
@ -156,7 +152,7 @@ fun ItemListingScreen(
}
ItemListingEvent.NavigateToBitwardenSettings -> {
intentManager.startMainBitwardenAppAccountSettings()
intentManager.startBitwardenAccountSettings()
}
is ItemListingEvent.ShowFirstTimeSyncSnackbar -> {

View File

@ -19,16 +19,6 @@ interface IntentManager {
*/
fun startActivity(intent: Intent)
/**
* Start the main Bitwarden app with scheme that routes to the account security screen.
*/
fun startMainBitwardenAppAccountSettings()
/**
* Starts the application's settings activity.
*/
fun startApplicationDetailsSettingsActivity()
/**
* Start an activity to view the given [uri] in an external browser.
*/

View File

@ -6,7 +6,6 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.provider.MediaStore
import android.provider.Settings
import android.webkit.MimeTypeMap
import androidx.activity.compose.ManagedActivityResultLauncher
import androidx.activity.compose.rememberLauncherForActivityResult
@ -14,7 +13,6 @@ import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import com.bitwarden.annotation.OmitFromCoverage
import com.bitwarden.ui.platform.model.FileData
import com.bitwarden.ui.platform.resource.BitwardenString
@ -30,7 +28,7 @@ class IntentManagerImpl(
override fun startActivity(intent: Intent) {
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
} catch (_: ActivityNotFoundException) {
// no-op
}
}
@ -75,12 +73,6 @@ class IntentManagerImpl(
putExtra(Intent.EXTRA_TITLE, fileName)
}
override fun startApplicationDetailsSettingsActivity() {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = "package:$context.packageName".toUri()
startActivity(intent = intent)
}
override fun launchUri(uri: Uri) {
val newUri = if (uri.scheme == null) {
uri.buildUpon().scheme("https").build()
@ -90,17 +82,6 @@ class IntentManagerImpl(
startActivity(Intent(Intent.ACTION_VIEW, newUri))
}
override fun startMainBitwardenAppAccountSettings() {
startActivity(
Intent(
Intent.ACTION_VIEW,
"bitwarden://settings/account_security".toUri(),
).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
},
)
}
private fun getLocalFileData(uri: Uri): FileData? =
context
.contentResolver

View File

@ -0,0 +1,34 @@
@file:OmitFromCoverage
package com.bitwarden.authenticator.ui.platform.util
import android.content.Context
import android.content.Intent
import android.provider.Settings
import androidx.core.net.toUri
import com.bitwarden.annotation.OmitFromCoverage
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
/**
* Launches the authenticator app settings.
*/
fun IntentManager.startAuthenticatorAppSettings(context: Context) {
startActivity(
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData("package:${context.packageName}".toUri()),
)
}
/**
* Launches the Bitwarden account settings.
*/
fun IntentManager.startBitwardenAccountSettings() {
startActivity(
Intent(
Intent.ACTION_VIEW,
"bitwarden://settings/account_security".toUri(),
).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
},
)
}

View File

@ -15,6 +15,7 @@ import com.bitwarden.authenticator.ui.authenticator.feature.model.VerificationCo
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
import com.bitwarden.authenticator.ui.platform.manager.permissions.FakePermissionManager
import com.bitwarden.authenticator.ui.platform.util.startBitwardenAccountSettings
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme
import com.bitwarden.ui.util.asText
@ -23,6 +24,7 @@ import com.bitwarden.ui.util.onNodeWithTextAfterScroll
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.runs
import io.mockk.verify
import kotlinx.coroutines.flow.MutableStateFlow
@ -181,9 +183,11 @@ class ItemListingScreenTest : AuthenticatorComposeTest() {
@Test
@Suppress("MaxLineLength")
fun `on NavigateToBitwardenSettings receive should launch bitwarden account security deep link`() {
every { intentManager.startMainBitwardenAppAccountSettings() } just runs
mockkStatic(IntentManager::startBitwardenAccountSettings) {
every { intentManager.startBitwardenAccountSettings() } just runs
mutableEventFlow.tryEmit(ItemListingEvent.NavigateToBitwardenSettings)
verify { intentManager.startMainBitwardenAppAccountSettings() }
verify { intentManager.startBitwardenAccountSettings() }
}
}
@Test