mirror of
https://github.com/bitwarden/android.git
synced 2026-10-22 02:53:19 -05:00
Move FileData to 'ui' module (#5644)
This commit is contained in:
1 parent
f4c4e06dcc
commit
337e751c05
19 files changed
+74
-78
No files matched your search
+4
-4
@@ -11,6 +11,7 @@ import com.bitwarden.ui.platform.base.BaseViewModel
|
||||
import com.bitwarden.ui.platform.base.util.isValidUri
|
||||
import com.bitwarden.ui.platform.base.util.orNullIfBlank
|
||||
import com.bitwarden.ui.platform.base.util.prefixHttpsIfNecessaryOrNull
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.Text
|
||||
import com.bitwarden.ui.util.asText
|
||||
@@ -20,7 +21,6 @@ import com.x8bit.bitwarden.data.platform.manager.model.ImportPrivateKeyResult
|
||||
import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository
|
||||
import com.x8bit.bitwarden.data.vault.manager.FileManager
|
||||
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.platform.manager.keychain.model.PrivateKeyAliasSelectionResult
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
|
||||
@@ -481,7 +481,7 @@ data class EnvironmentState(
|
||||
* Show a dialog to capture the certificate alias and password.
|
||||
*/
|
||||
data class SetCertificateData(
|
||||
val certificateBytes: IntentManager.FileData,
|
||||
val certificateBytes: FileData,
|
||||
) : DialogState()
|
||||
|
||||
/**
|
||||
@@ -626,7 +626,7 @@ sealed class EnvironmentAction {
|
||||
* Indicates that the certificate file selection result was received.
|
||||
*/
|
||||
data class ImportCertificateFilePickerResultReceive(
|
||||
val certificateFileData: IntentManager.FileData,
|
||||
val certificateFileData: FileData,
|
||||
) : EnvironmentAction()
|
||||
|
||||
/**
|
||||
@@ -634,7 +634,7 @@ sealed class EnvironmentAction {
|
||||
*/
|
||||
@Parcelize
|
||||
data class SetCertificateInfoResultReceive(
|
||||
val certificateFileData: IntentManager.FileData,
|
||||
val certificateFileData: FileData,
|
||||
val password: String,
|
||||
val alias: String,
|
||||
) : EnvironmentAction(), Parcelable
|
||||
|
||||
+1
-15
@@ -8,6 +8,7 @@ import androidx.activity.compose.ManagedActivityResultLauncher
|
||||
import androidx.activity.result.ActivityResult
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.Immutable
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@@ -82,11 +83,6 @@ interface IntentManager {
|
||||
*/
|
||||
fun getFileDataFromActivityResult(activityResult: ActivityResult): FileData?
|
||||
|
||||
/**
|
||||
* Processes the [intent] and attempts to get the relevant file data from it.
|
||||
*/
|
||||
fun getFileDataFromIntent(intent: Intent): FileData?
|
||||
|
||||
/**
|
||||
* Processes the [intent] and attempts to derive [ShareData] information from it.
|
||||
*/
|
||||
@@ -107,16 +103,6 @@ interface IntentManager {
|
||||
*/
|
||||
fun startDefaultEmailApplication()
|
||||
|
||||
/**
|
||||
* Represents file information.
|
||||
*/
|
||||
@Parcelize
|
||||
data class FileData(
|
||||
val fileName: String,
|
||||
val uri: Uri,
|
||||
val sizeBytes: Long,
|
||||
) : Parcelable
|
||||
|
||||
/**
|
||||
* Represents data for a share request coming from outside the app.
|
||||
*/
|
||||
|
||||
+10
-8
@@ -25,6 +25,7 @@ import androidx.credentials.CredentialManager
|
||||
import com.bitwarden.annotation.OmitFromCoverage
|
||||
import com.bitwarden.core.data.util.toFormattedPattern
|
||||
import com.bitwarden.core.util.isBuildVersionAtLeast
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.x8bit.bitwarden.BuildConfig
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage
|
||||
@@ -175,15 +176,15 @@ class IntentManagerImpl(
|
||||
|
||||
override fun getFileDataFromActivityResult(
|
||||
activityResult: ActivityResult,
|
||||
): IntentManager.FileData? {
|
||||
): FileData? {
|
||||
if (activityResult.resultCode != Activity.RESULT_OK) return null
|
||||
val uri = activityResult.data?.data
|
||||
return if (uri != null) getLocalFileData(uri) else getCameraFileData()
|
||||
}
|
||||
|
||||
override fun getFileDataFromIntent(
|
||||
private fun getFileDataFromIntent(
|
||||
intent: Intent,
|
||||
): IntentManager.FileData? = intent
|
||||
): FileData? = intent
|
||||
.clipData
|
||||
?.getItemAt(0)
|
||||
?.uri
|
||||
@@ -275,19 +276,19 @@ class IntentManagerImpl(
|
||||
return Intent(Intent.ACTION_VIEW, playStoreUri)
|
||||
}
|
||||
|
||||
private fun getCameraFileData(): IntentManager.FileData {
|
||||
private fun getCameraFileData(): FileData {
|
||||
val tmpDir = File(context.filesDir, TEMP_CAMERA_IMAGE_DIR)
|
||||
val file = File(tmpDir, TEMP_CAMERA_IMAGE_NAME)
|
||||
val uri = FileProvider.getUriForFile(context, FILE_PROVIDER_AUTHORITY, file)
|
||||
val fileName = "photo_${clock.instant().toFormattedPattern(pattern = "yyyyMMddHHmmss")}.jpg"
|
||||
return IntentManager.FileData(
|
||||
return FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = file.length(),
|
||||
)
|
||||
}
|
||||
|
||||
private fun getLocalFileData(uri: Uri): IntentManager.FileData? =
|
||||
private fun getLocalFileData(uri: Uri): FileData? =
|
||||
context
|
||||
.contentResolver
|
||||
.query(
|
||||
@@ -306,12 +307,13 @@ class IntentManagerImpl(
|
||||
.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)
|
||||
.takeIf { it >= 0 }
|
||||
?.let { cursor.getString(it) }
|
||||
?: return@use null
|
||||
val fileSize = cursor
|
||||
.getColumnIndex(MediaStore.MediaColumns.SIZE)
|
||||
.takeIf { it >= 0 }
|
||||
?.let { cursor.getLong(it) }
|
||||
if (fileName == null || fileSize == null) return@use null
|
||||
IntentManager.FileData(
|
||||
?: return@use null
|
||||
FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = fileSize,
|
||||
|
||||
+2
-2
@@ -11,6 +11,7 @@ import com.bitwarden.network.model.PolicyTypeJson
|
||||
import com.bitwarden.send.SendView
|
||||
import com.bitwarden.ui.platform.base.BackgroundEvent
|
||||
import com.bitwarden.ui.platform.base.BaseViewModel
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.Text
|
||||
import com.bitwarden.ui.util.asText
|
||||
@@ -29,7 +30,6 @@ import com.x8bit.bitwarden.data.vault.repository.model.DeleteSendResult
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.UpdateSendResult
|
||||
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
|
||||
import com.x8bit.bitwarden.ui.tools.feature.send.addedit.model.AddEditSendType
|
||||
@@ -889,7 +889,7 @@ sealed class AddEditSendAction {
|
||||
/**
|
||||
* User has chosen a file to be part of the send.
|
||||
*/
|
||||
data class FileChoose(val fileData: IntentManager.FileData) : AddEditSendAction()
|
||||
data class FileChoose(val fileData: FileData) : AddEditSendAction()
|
||||
|
||||
/**
|
||||
* User clicked the remove password button.
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package com.x8bit.bitwarden.ui.tools.feature.send.addedit.handlers
|
||||
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.x8bit.bitwarden.ui.tools.feature.send.addedit.AddEditSendAction
|
||||
import com.x8bit.bitwarden.ui.tools.feature.send.addedit.AddEditSendViewModel
|
||||
import java.time.ZonedDateTime
|
||||
@@ -12,7 +12,7 @@ import java.time.ZonedDateTime
|
||||
data class AddEditSendHandlers(
|
||||
val onNameChange: (String) -> Unit,
|
||||
val onChooseFileClick: (hasPermission: Boolean) -> Unit,
|
||||
val onFileChoose: (IntentManager.FileData) -> Unit,
|
||||
val onFileChoose: (FileData) -> Unit,
|
||||
val onTextChange: (String) -> Unit,
|
||||
val onIsHideByDefaultToggle: (Boolean) -> Unit,
|
||||
val onMaxAccessCountChange: (Int) -> Unit,
|
||||
|
||||
+2
-2
@@ -6,6 +6,7 @@ import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.bitwarden.core.data.repository.model.DataState
|
||||
import com.bitwarden.ui.platform.base.BaseViewModel
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.Text
|
||||
import com.bitwarden.ui.util.asText
|
||||
@@ -17,7 +18,6 @@ import com.x8bit.bitwarden.data.vault.repository.VaultRepository
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.CreateAttachmentResult
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.DeleteAttachmentResult
|
||||
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.vault.feature.attachments.util.toViewState
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
@@ -488,7 +488,7 @@ sealed class AttachmentsAction {
|
||||
* User has chosen the file attachment.
|
||||
*/
|
||||
data class FileChoose(
|
||||
val fileData: IntentManager.FileData,
|
||||
val fileData: FileData,
|
||||
) : AttachmentsAction()
|
||||
|
||||
/**
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package com.x8bit.bitwarden.ui.vault.feature.attachments.handlers
|
||||
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.x8bit.bitwarden.ui.vault.feature.attachments.AttachmentsAction
|
||||
import com.x8bit.bitwarden.ui.vault.feature.attachments.AttachmentsViewModel
|
||||
|
||||
@@ -11,7 +11,7 @@ data class AttachmentsHandlers(
|
||||
val onBackClick: () -> Unit,
|
||||
val onSaveClick: () -> Unit,
|
||||
val onChooseFileClick: () -> Unit,
|
||||
val onFileChoose: (IntentManager.FileData) -> Unit,
|
||||
val onFileChoose: (FileData) -> Unit,
|
||||
val onDeleteClick: (attachmentId: String) -> Unit,
|
||||
val onDismissRequest: () -> Unit,
|
||||
) {
|
||||
|
||||
+2
-1
@@ -13,6 +13,7 @@ import androidx.compose.ui.test.performClick
|
||||
import androidx.compose.ui.test.performScrollTo
|
||||
import androidx.compose.ui.test.performTextInput
|
||||
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.util.asText
|
||||
import com.x8bit.bitwarden.ui.auth.feature.environment.EnvironmentState.DialogState
|
||||
import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest
|
||||
@@ -366,7 +367,7 @@ class EnvironmentScreenTest : BitwardenComposeTest() {
|
||||
@Suppress("MaxLineLength")
|
||||
@Test
|
||||
fun `ConfirmOverwriteCertificate dialog Replace certificate click should send ConfirmOverwriteCertificate action`() {
|
||||
val mockFileData = mockk<IntentManager.FileData>()
|
||||
val mockFileData = mockk<FileData>()
|
||||
mutableStateFlow.update {
|
||||
it.copy(
|
||||
dialog = DialogState.ConfirmOverwriteAlias(
|
||||
|
||||
+5
-5
@@ -7,6 +7,7 @@ import com.bitwarden.core.data.util.asSuccess
|
||||
import com.bitwarden.data.datasource.disk.model.EnvironmentUrlDataJson
|
||||
import com.bitwarden.data.repository.model.Environment
|
||||
import com.bitwarden.ui.platform.base.BaseViewModelTest
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.asText
|
||||
import com.x8bit.bitwarden.data.platform.datasource.disk.model.MutualTlsKeyHost
|
||||
@@ -15,7 +16,6 @@ import com.x8bit.bitwarden.data.platform.manager.model.ImportPrivateKeyResult
|
||||
import com.x8bit.bitwarden.data.platform.repository.util.FakeEnvironmentRepository
|
||||
import com.x8bit.bitwarden.data.vault.manager.FileManager
|
||||
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.platform.manager.keychain.model.PrivateKeyAliasSelectionResult
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
|
||||
@@ -423,7 +423,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() {
|
||||
fun `ImportCertificateFilePickerResultReceive should show SetCertificateData dialog`() =
|
||||
runTest {
|
||||
val viewModel = createViewModel()
|
||||
val mockFileData = mockk<IntentManager.FileData>()
|
||||
val mockFileData = mockk<FileData>()
|
||||
viewModel.trySendAction(
|
||||
EnvironmentAction.ImportCertificateFilePickerResultReceive(
|
||||
certificateFileData = mockFileData,
|
||||
@@ -587,7 +587,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() {
|
||||
runTest {
|
||||
val viewModel = createViewModel()
|
||||
val mockUri = mockk<Uri>()
|
||||
val mockFileData = IntentManager.FileData(
|
||||
val mockFileData = FileData(
|
||||
fileName = "mockFileName",
|
||||
uri = mockUri,
|
||||
sizeBytes = 0,
|
||||
@@ -708,7 +708,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() {
|
||||
runTest {
|
||||
val viewModel = createViewModel()
|
||||
val mockUri = mockk<Uri>()
|
||||
val mockFileData = IntentManager.FileData(
|
||||
val mockFileData = FileData(
|
||||
fileName = "mockFileName",
|
||||
uri = mockUri,
|
||||
sizeBytes = 0,
|
||||
@@ -740,7 +740,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() {
|
||||
fun `ConfirmOverwriteCertificateClick should clear dialog and import certificate`() = runTest {
|
||||
val viewModel = createViewModel()
|
||||
val mockUri = mockk<Uri>()
|
||||
val mockFileData = IntentManager.FileData(
|
||||
val mockFileData = FileData(
|
||||
fileName = "mockFileName",
|
||||
uri = mockUri,
|
||||
sizeBytes = 0,
|
||||
|
||||
+2
-2
@@ -9,6 +9,7 @@ import com.bitwarden.network.model.PolicyTypeJson
|
||||
import com.bitwarden.network.model.SyncResponseJson
|
||||
import com.bitwarden.send.SendView
|
||||
import com.bitwarden.ui.platform.base.BaseViewModelTest
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.Text
|
||||
import com.bitwarden.ui.util.asText
|
||||
@@ -29,7 +30,6 @@ import com.x8bit.bitwarden.data.vault.repository.model.DeleteSendResult
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.UpdateSendResult
|
||||
import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelay
|
||||
import com.x8bit.bitwarden.ui.platform.manager.snackbar.SnackbarRelayManager
|
||||
import com.x8bit.bitwarden.ui.tools.feature.send.addedit.model.AddEditSendType
|
||||
@@ -799,7 +799,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() {
|
||||
val fileName = "test.png"
|
||||
val uri = mockk<Uri>()
|
||||
val size = 50L
|
||||
val fileData = IntentManager.FileData(
|
||||
val fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = size,
|
||||
|
||||
+3
-2
@@ -1,6 +1,7 @@
|
||||
package com.x8bit.bitwarden.ui.tools.feature.send.addedit.util
|
||||
|
||||
import android.net.Uri
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.tools.feature.send.addedit.AddEditSendState
|
||||
@@ -46,7 +47,7 @@ class SpecialCircumstanceExtensionsTest {
|
||||
)
|
||||
val specialCircumstance = SpecialCircumstance.ShareNewSend(
|
||||
data = IntentManager.ShareData.FileSend(
|
||||
fileData = IntentManager.FileData(
|
||||
fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = sizeBytes,
|
||||
@@ -87,7 +88,7 @@ class SpecialCircumstanceExtensionsTest {
|
||||
val fileName = "File Name"
|
||||
val specialCircumstance = SpecialCircumstance.ShareNewSend(
|
||||
data = IntentManager.ShareData.FileSend(
|
||||
fileData = IntentManager.FileData(
|
||||
fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = mockk(),
|
||||
sizeBytes = 0L,
|
||||
|
||||
+6
-6
@@ -6,6 +6,7 @@ import app.cash.turbine.test
|
||||
import com.bitwarden.core.data.repository.model.DataState
|
||||
import com.bitwarden.data.repository.model.Environment
|
||||
import com.bitwarden.ui.platform.base.BaseViewModelTest
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.asText
|
||||
import com.bitwarden.ui.util.concat
|
||||
@@ -19,7 +20,6 @@ import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
|
||||
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.CreateAttachmentResult
|
||||
import com.x8bit.bitwarden.data.vault.repository.model.DeleteAttachmentResult
|
||||
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
|
||||
import com.x8bit.bitwarden.ui.vault.feature.attachments.util.toViewState
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
@@ -159,7 +159,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() {
|
||||
),
|
||||
isPremiumUser = true,
|
||||
)
|
||||
val fileData = IntentManager.FileData(
|
||||
val fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = sizeToBig,
|
||||
@@ -204,7 +204,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() {
|
||||
),
|
||||
isPremiumUser = true,
|
||||
)
|
||||
val fileData = IntentManager.FileData(
|
||||
val fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = sizeJustRight,
|
||||
@@ -279,7 +279,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() {
|
||||
),
|
||||
isPremiumUser = true,
|
||||
)
|
||||
val fileData = IntentManager.FileData(
|
||||
val fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = sizeJustRight,
|
||||
@@ -350,7 +350,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() {
|
||||
),
|
||||
isPremiumUser = true,
|
||||
)
|
||||
val fileData = IntentManager.FileData(
|
||||
val fileData = FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = sizeJustRight,
|
||||
@@ -414,7 +414,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() {
|
||||
@Test
|
||||
fun `ChooseFile should update state with new file data`() = runTest {
|
||||
val uri = createMockUri()
|
||||
val fileData = IntentManager.FileData(
|
||||
val fileData = FileData(
|
||||
fileName = "filename-1",
|
||||
uri = uri,
|
||||
sizeBytes = 100L,
|
||||
|
||||
+2
-2
@@ -11,8 +11,8 @@ import com.bitwarden.authenticator.data.authenticator.repository.model.TotpCodeR
|
||||
import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportDataResult
|
||||
import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportFileFormat
|
||||
import com.bitwarden.authenticator.ui.platform.feature.settings.export.model.ExportVaultFormat
|
||||
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
|
||||
import com.bitwarden.core.data.repository.model.DataState
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
|
||||
@@ -82,7 +82,7 @@ interface AuthenticatorRepository {
|
||||
*/
|
||||
suspend fun importVaultData(
|
||||
format: ImportFileFormat,
|
||||
fileData: IntentManager.FileData,
|
||||
fileData: FileData,
|
||||
): ImportDataResult
|
||||
|
||||
/**
|
||||
|
||||
+2
-2
@@ -21,13 +21,13 @@ import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportDat
|
||||
import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportFileFormat
|
||||
import com.bitwarden.authenticator.data.platform.repository.SettingsRepository
|
||||
import com.bitwarden.authenticator.ui.platform.feature.settings.export.model.ExportVaultFormat
|
||||
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
|
||||
import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager
|
||||
import com.bitwarden.authenticatorbridge.manager.model.AccountSyncState
|
||||
import com.bitwarden.core.data.repository.model.DataState
|
||||
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
|
||||
import com.bitwarden.core.data.repository.util.map
|
||||
import com.bitwarden.data.manager.DispatcherManager
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
@@ -248,7 +248,7 @@ class AuthenticatorRepositoryImpl @Inject constructor(
|
||||
|
||||
override suspend fun importVaultData(
|
||||
format: ImportFileFormat,
|
||||
fileData: IntentManager.FileData,
|
||||
fileData: FileData,
|
||||
): ImportDataResult = fileManager.uriToByteArray(fileData.uri)
|
||||
.map {
|
||||
importManager
|
||||
|
||||
+2
-1
@@ -38,6 +38,7 @@ import com.bitwarden.authenticator.ui.platform.composition.LocalIntentManager
|
||||
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
|
||||
import com.bitwarden.authenticator.ui.platform.util.displayLabel
|
||||
import com.bitwarden.ui.platform.base.util.EventsEffect
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenDrawable
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
@@ -54,7 +55,7 @@ fun ImportingScreen(
|
||||
onNavigateBack: () -> Unit,
|
||||
) {
|
||||
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
|
||||
val importLocationReceive: (IntentManager.FileData) -> Unit = remember {
|
||||
val importLocationReceive: (FileData) -> Unit = remember {
|
||||
{
|
||||
viewModel.trySendAction(ImportAction.ImportLocationReceive(it))
|
||||
}
|
||||
|
||||
+2
-2
@@ -5,8 +5,8 @@ import androidx.lifecycle.viewModelScope
|
||||
import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRepository
|
||||
import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportDataResult
|
||||
import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportFileFormat
|
||||
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
|
||||
import com.bitwarden.ui.platform.base.BaseViewModel
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
import com.bitwarden.ui.platform.resource.BitwardenString
|
||||
import com.bitwarden.ui.util.Text
|
||||
import com.bitwarden.ui.util.asText
|
||||
@@ -202,7 +202,7 @@ sealed class ImportAction {
|
||||
/**
|
||||
* Indicates the user selected a file to import.
|
||||
*/
|
||||
data class ImportLocationReceive(val fileUri: IntentManager.FileData) : ImportAction()
|
||||
data class ImportLocationReceive(val fileUri: FileData) : ImportAction()
|
||||
|
||||
/**
|
||||
* Models actions the [ImportingScreen] itself may send.
|
||||
|
||||
+1
-12
@@ -2,12 +2,11 @@ package com.bitwarden.authenticator.ui.platform.manager.intent
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Parcelable
|
||||
import androidx.activity.compose.ManagedActivityResultLauncher
|
||||
import androidx.activity.result.ActivityResult
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.Immutable
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import com.bitwarden.ui.platform.model.FileData
|
||||
|
||||
/**
|
||||
* A manager class for simplifying the handling of Android Intents within a given context.
|
||||
@@ -58,14 +57,4 @@ interface IntentManager {
|
||||
* Creates an intent to use when selecting to save an item with [fileName] to disk.
|
||||
*/
|
||||
fun createDocumentIntent(fileName: String): Intent
|
||||
|
||||
/**
|
||||
* Represents file information.
|
||||
*/
|
||||
@Parcelize
|
||||
data class FileData(
|
||||
val fileName: String,
|
||||
val uri: Uri,
|
||||
val sizeBytes: Long,
|
||||
) : Parcelable
|
||||
}
|
||||
+9
-8
@@ -16,6 +16,7 @@ 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
|
||||
|
||||
/**
|
||||
@@ -45,7 +46,7 @@ class IntentManagerImpl(
|
||||
|
||||
override fun getFileDataFromActivityResult(
|
||||
activityResult: ActivityResult,
|
||||
): IntentManager.FileData? {
|
||||
): FileData? {
|
||||
if (activityResult.resultCode != Activity.RESULT_OK) return null
|
||||
val uri = activityResult.data?.data ?: return null
|
||||
return getLocalFileData(uri)
|
||||
@@ -66,9 +67,8 @@ class IntentManagerImpl(
|
||||
Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
|
||||
// Attempt to get the MIME type from the file extension
|
||||
val extension = MimeTypeMap.getFileExtensionFromUrl(fileName)
|
||||
type = extension?.let {
|
||||
MimeTypeMap.getSingleton().getMimeTypeFromExtension(it)
|
||||
}
|
||||
type = extension
|
||||
?.let { MimeTypeMap.getSingleton().getMimeTypeFromExtension(it) }
|
||||
?: "*/*"
|
||||
|
||||
addCategory(Intent.CATEGORY_OPENABLE)
|
||||
@@ -77,7 +77,7 @@ class IntentManagerImpl(
|
||||
|
||||
override fun startApplicationDetailsSettingsActivity() {
|
||||
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
|
||||
intent.data = Uri.parse("package:" + context.packageName)
|
||||
intent.data = "package:$context.packageName".toUri()
|
||||
startActivity(intent = intent)
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ class IntentManagerImpl(
|
||||
)
|
||||
}
|
||||
|
||||
private fun getLocalFileData(uri: Uri): IntentManager.FileData? =
|
||||
private fun getLocalFileData(uri: Uri): FileData? =
|
||||
context
|
||||
.contentResolver
|
||||
.query(
|
||||
@@ -120,12 +120,13 @@ class IntentManagerImpl(
|
||||
.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)
|
||||
.takeIf { it >= 0 }
|
||||
?.let { cursor.getString(it) }
|
||||
?: return@use null
|
||||
val fileSize = cursor
|
||||
.getColumnIndex(MediaStore.MediaColumns.SIZE)
|
||||
.takeIf { it >= 0 }
|
||||
?.let { cursor.getLong(it) }
|
||||
if (fileName == null || fileSize == null) return@use null
|
||||
IntentManager.FileData(
|
||||
?: return@use null
|
||||
FileData(
|
||||
fileName = fileName,
|
||||
uri = uri,
|
||||
sizeBytes = fileSize,
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.bitwarden.ui.platform.model
|
||||
|
||||
import android.net.Uri
|
||||
import android.os.Parcelable
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
/**
|
||||
* Represents file information.
|
||||
*/
|
||||
@Parcelize
|
||||
data class FileData(
|
||||
val fileName: String,
|
||||
val uri: Uri,
|
||||
val sizeBytes: Long,
|
||||
) : Parcelable
|
||||
Reference in new issue
Block a user