From b375189e555de69a4e55203546ddf1cdf041452e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=8B=D1=82=D0=BA=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Tue, 28 Jan 2025 20:53:14 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B8=D0=B0=D0=BB=D0=BE=D0=B3=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/release/baselineProfiles/0/app-release.dm | Bin 10969 -> 10005 bytes app/release/baselineProfiles/1/app-release.dm | Bin 10919 -> 9918 bytes app/release/output-metadata.json | 2 +- .../app/di/modules/domain/UseCasesModule.kt | 7 + .../data/storages/local/LocalStorage.kt | 4 +- .../domain/usecases/RenameStorageUseCase.kt | 12 ++ .../{viewmodel => }/ViewModelBase.kt | 2 +- .../wallenc/presentation/WallencViewModel.kt | 1 - .../presentation/elements/StorageTree.kt | 188 ++++++++++++++++++ .../screens/main/MainViewModel.kt | 2 +- .../screens/local/vault/LocalVaultScreen.kt | 72 ++----- .../local/vault/LocalVaultViewModel.kt | 11 +- .../screens/remotes/RemoteVaultsViewModel.kt | 2 +- .../screens/settings/SettingsViewModel.kt | 2 +- presentation/src/main/res/values/strings.xml | 3 + 15 files changed, 239 insertions(+), 69 deletions(-) create mode 100644 domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/RenameStorageUseCase.kt rename presentation/src/main/java/com/github/nullptroma/wallenc/presentation/{viewmodel => }/ViewModelBase.kt (86%) create mode 100644 presentation/src/main/java/com/github/nullptroma/wallenc/presentation/elements/StorageTree.kt diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm index 9811576ebc6bc8982fa8bc60a92684b076c21a7f..261d49fab8dc9b443b960572b87e4cf2f95848df 100644 GIT binary patch literal 10005 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 diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm index a9809b330e95e4ba9e84f4f207bedb943841c951..19d23373203c67cf5072c8cd035fa81f30b4135d 100644 GIT binary patch literal 9918 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 F0RVFp`Jn&+ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 54665c7..a66dcf1 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -33,5 +33,5 @@ ] } ], - "minSdkVersionForDexing": 24 + "minSdkVersionForDexing": 26 } \ No newline at end of file diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt index e16b72f..13fbe01 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/domain/UseCasesModule.kt @@ -4,6 +4,7 @@ import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase +import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase import dagger.Module import dagger.Provides @@ -31,4 +32,10 @@ class UseCasesModule { fun provideStorageFileManagementUseCase(): StorageFileManagementUseCase { return StorageFileManagementUseCase() } + + @Provides + @Singleton + fun provideRenameStorageUseCase(): RenameStorageUseCase { + return RenameStorageUseCase() + } } \ No newline at end of file diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/storages/local/LocalStorage.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/storages/local/LocalStorage.kt index 0658ec1..df26fff 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/storages/local/LocalStorage.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/storages/local/LocalStorage.kt @@ -35,7 +35,7 @@ class LocalStorage( private val _accessor = LocalStorageAccessor(absolutePath, ioDispatcher) override val accessor: IStorageAccessor = _accessor override val isVirtualStorage: Boolean = false - private val metaInfoFileName: String = "$uuid$ENC_INFO_FILE_POSTFIX" + private val metaInfoFileName: String = "$uuid$STORAGE_INFO_FILE_POSTFIX" suspend fun init() { _accessor.init() @@ -91,7 +91,7 @@ class LocalStorage( } companion object { - const val ENC_INFO_FILE_POSTFIX = ".enc-info" + const val STORAGE_INFO_FILE_POSTFIX = ".storage-info" private val jackson = jacksonObjectMapper().apply { findAndRegisterModules() } } } \ No newline at end of file diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/RenameStorageUseCase.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/RenameStorageUseCase.kt new file mode 100644 index 0000000..d82cee9 --- /dev/null +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/usecases/RenameStorageUseCase.kt @@ -0,0 +1,12 @@ +package com.github.nullptroma.wallenc.domain.usecases + +import com.github.nullptroma.wallenc.domain.interfaces.IStorage +import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo + +class RenameStorageUseCase { + suspend fun rename(storage: IStorageInfo, newName: String) { + when (storage) { + is IStorage -> storage.rename(newName) + } + } +} \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/viewmodel/ViewModelBase.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/ViewModelBase.kt similarity index 86% rename from presentation/src/main/java/com/github/nullptroma/wallenc/presentation/viewmodel/ViewModelBase.kt rename to presentation/src/main/java/com/github/nullptroma/wallenc/presentation/ViewModelBase.kt index c92ff4d..c8f87cf 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/viewmodel/ViewModelBase.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/ViewModelBase.kt @@ -1,4 +1,4 @@ -package com.github.nullptroma.wallenc.presentation.viewmodel +package com.github.nullptroma.wallenc.presentation import androidx.lifecycle.ViewModel diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/WallencViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/WallencViewModel.kt index 16fc821..28e0df7 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/WallencViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/WallencViewModel.kt @@ -7,7 +7,6 @@ import androidx.lifecycle.viewmodel.compose.saveable import com.github.nullptroma.wallenc.presentation.screens.ScreenRoute import com.github.nullptroma.wallenc.presentation.screens.main.MainRoute import com.github.nullptroma.wallenc.presentation.screens.settings.SettingsRoute -import com.github.nullptroma.wallenc.presentation.viewmodel.ViewModelBase import dagger.hilt.android.lifecycle.HiltViewModel import kotlin.collections.set diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/elements/StorageTree.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/elements/StorageTree.kt new file mode 100644 index 0000000..2a0f4a6 --- /dev/null +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/elements/StorageTree.kt @@ -0,0 +1,188 @@ +package com.github.nullptroma.wallenc.presentation.elements + +import android.app.Dialog +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Divider +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.PlatformTextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.github.nullptroma.wallenc.domain.datatypes.Tree +import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo +import com.github.nullptroma.wallenc.presentation.R + +@Composable +fun StorageTree( + modifier: Modifier, + tree: Tree, + onClick: (Tree) -> Unit, + onRename: (Tree, String) -> Unit, +) { + val cur = tree.value + val cardShape = RoundedCornerShape(30.dp) + Column(modifier) { + Card( + modifier = Modifier + .fillMaxWidth() + .clip(cardShape) + .clickable { + onClick(tree) + //viewModel.printStorageInfoToLog(cur) + }, + shape = cardShape, + elevation = CardDefaults.cardElevation( + defaultElevation = 4.dp + ), + ) { + val available by cur.isAvailable.collectAsStateWithLifecycle() + val numOfFiles by cur.numberOfFiles.collectAsStateWithLifecycle() + val size by cur.size.collectAsStateWithLifecycle() + val metaInfo by cur.metaInfo.collectAsStateWithLifecycle() + + Row(modifier = Modifier.height(IntrinsicSize.Min)) { + Column(modifier = Modifier.padding(8.dp)) { + Text(metaInfo.name ?: stringResource(R.string.no_name)) + Text( + text = "IsAvailable: $available" + ) + Text("Files: $numOfFiles") + Text("Size: $size") + Text("IsVirtual: ${cur.isVirtualStorage}") + } + Column( + modifier = Modifier, + horizontalAlignment = Alignment.End + ) { + Box(modifier = Modifier.padding(0.dp, 8.dp, 8.dp, 0.dp)) { + var expanded by remember { mutableStateOf(false) } + var showRenameDialog by remember { mutableStateOf(false) } + IconButton(onClick = { expanded = !expanded }) { + Icon( + Icons.Default.MoreVert, + contentDescription = stringResource(R.string.show_storage_item_menu) + ) + } + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + DropdownMenuItem( + onClick = { + expanded = false + showRenameDialog = true + }, + text = { Text(stringResource(R.string.rename)) } + ) + } + + if (showRenameDialog) { + RenameDialog( + onDismiss = { showRenameDialog = false }, + onConfirmation = { newName -> + showRenameDialog = false + onRename(tree, newName) + }, + startName = tree.value.metaInfo.value.name ?: "" + ) + } + } + Spacer(modifier = Modifier.weight(1f)) + Text( + modifier = Modifier + .fillMaxWidth() + .padding(0.dp, 0.dp, 12.dp, 8.dp) + .align(Alignment.End), + text = cur.uuid.toString(), + textAlign = TextAlign.End, + fontSize = 8.sp, + style = LocalTextStyle.current.copy( + platformStyle = PlatformTextStyle( + includeFontPadding = true + ) + ) + ) + } + } + } + for (i in tree.children ?: listOf()) { + StorageTree(Modifier.padding(16.dp, 0.dp, 0.dp, 0.dp), i, onClick, onRename) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RenameDialog(onDismiss: () -> Unit, onConfirmation: (String) -> Unit, startName: String = "") { + var name by remember { mutableStateOf(startName) } + BasicAlertDialog( + onDismissRequest = { onDismiss() } + ) { + Card { + Column(modifier = Modifier.padding(12.dp)) { + Text("New name", style = MaterialTheme.typography.titleLarge) + TextField(name, { + name = it + }) + Spacer(modifier = Modifier.height(24.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly, + ) { + Button(modifier = Modifier.weight(1f), onClick = onDismiss) { + Text("Cancel") + } + Spacer(modifier = Modifier.width(12.dp)) + Button(modifier = Modifier.weight(1f), onClick = { + onConfirmation(name) + }) { + Text("Ok") + } + } + } + } + } +} diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt index e76f001..843191a 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/MainViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.viewmodel.compose.saveable import com.github.nullptroma.wallenc.presentation.screens.ScreenRoute import com.github.nullptroma.wallenc.presentation.screens.main.screens.local.vault.LocalVaultRoute import com.github.nullptroma.wallenc.presentation.screens.main.screens.remotes.RemoteVaultsRoute -import com.github.nullptroma.wallenc.presentation.viewmodel.ViewModelBase +import com.github.nullptroma.wallenc.presentation.ViewModelBase import dagger.hilt.android.lifecycle.HiltViewModel @HiltViewModel diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt index 368e5e3..f0b2441 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultScreen.kt @@ -47,6 +47,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.github.nullptroma.wallenc.domain.datatypes.Tree import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.presentation.R +import com.github.nullptroma.wallenc.presentation.elements.StorageTree import kotlin.random.Random @OptIn(ExperimentalMaterial3Api::class) @@ -54,7 +55,7 @@ import kotlin.random.Random fun LocalVaultScreen( modifier: Modifier = Modifier, viewModel: LocalVaultViewModel = hiltViewModel(), - openTextEdit: (String)->Unit + openTextEdit: (String) -> Unit ) { val uiState by viewModel.state.collectAsStateWithLifecycle() @@ -68,66 +69,19 @@ fun LocalVaultScreen( } }) { innerPadding -> LazyColumn(modifier = Modifier.padding(innerPadding)) { - items(uiState.storagesList) { tree -> - Storage(Modifier.padding(8.dp), tree) { - openTextEdit(it.value.uuid.toString()) - } + items(uiState.storagesList) { listItem -> + StorageTree( + modifier = Modifier.padding(8.dp), + tree = listItem, + onClick = { + openTextEdit(it.value.uuid.toString()) + }, + onRename = { tree, newName -> + viewModel.rename(tree.value, newName) + } + ) } } } } -@Composable -fun Storage(modifier: Modifier, tree: Tree, onClick: (Tree) -> Unit) { - val cur = tree.value - val cardShape = RoundedCornerShape(30.dp) - Column(modifier) { - Card( - modifier = Modifier - .fillMaxWidth() - .clip(cardShape) - .clickable { - onClick(tree) - //viewModel.printStorageInfoToLog(cur) - }, - shape = cardShape, - elevation = CardDefaults.cardElevation( - defaultElevation = 4.dp - ), - ) { - val available by cur.isAvailable.collectAsStateWithLifecycle() - val numOfFiles by cur.numberOfFiles.collectAsStateWithLifecycle() - val size by cur.size.collectAsStateWithLifecycle() - val metaInfo by cur.metaInfo.collectAsStateWithLifecycle() - - Row { - Column(modifier = Modifier.padding(8.dp)) { - Text(metaInfo.name ?: stringResource(R.string.no_name)) - Text( - text = "IsAvailable: $available" - ) - Text("Files: $numOfFiles") - Text("Size: $size") - Text("IsVirtual: ${cur.isVirtualStorage}") - Text( - modifier = Modifier - .fillMaxWidth() - .padding(0.dp,0.dp,8.dp,0.dp) - .align(Alignment.End), - text = cur.uuid.toString(), - textAlign = TextAlign.End, - fontSize = 8.sp, - style = LocalTextStyle.current.copy( - platformStyle = PlatformTextStyle( - includeFontPadding = true - ) - ) - ) - } - } - } - for(i in tree.children ?: listOf()) { - Storage(Modifier.padding(16.dp,0.dp,0.dp,0.dp), i, onClick) - } - } -} diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt index 3836730..95bc770 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/local/vault/LocalVaultViewModel.kt @@ -1,7 +1,6 @@ package com.github.nullptroma.wallenc.presentation.screens.main.screens.local.vault import androidx.lifecycle.viewModelScope -import com.github.nullptroma.wallenc.domain.datatypes.EncryptKey import com.github.nullptroma.wallenc.domain.datatypes.Tree import com.github.nullptroma.wallenc.domain.interfaces.IDirectory import com.github.nullptroma.wallenc.domain.interfaces.IFile @@ -9,9 +8,10 @@ import com.github.nullptroma.wallenc.domain.interfaces.ILogger import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo import com.github.nullptroma.wallenc.domain.usecases.GetOpenedStoragesUseCase import com.github.nullptroma.wallenc.domain.usecases.ManageLocalVaultUseCase +import com.github.nullptroma.wallenc.domain.usecases.RenameStorageUseCase import com.github.nullptroma.wallenc.domain.usecases.StorageFileManagementUseCase import com.github.nullptroma.wallenc.presentation.extensions.toPrintable -import com.github.nullptroma.wallenc.presentation.viewmodel.ViewModelBase +import com.github.nullptroma.wallenc.presentation.ViewModelBase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine @@ -24,6 +24,7 @@ class LocalVaultViewModel @Inject constructor( private val manageLocalVaultUseCase: ManageLocalVaultUseCase, private val getOpenedStoragesUseCase: GetOpenedStoragesUseCase, private val storageFileManagementUseCase: StorageFileManagementUseCase, + private val renameStorageUseCase: RenameStorageUseCase, private val logger: ILogger ) : ViewModelBase(LocalVaultScreenState(listOf())) { init { @@ -75,4 +76,10 @@ class LocalVaultViewModel @Inject constructor( manageLocalVaultUseCase.createStorage() } } + + fun rename(storage: IStorageInfo, newName: String) { + viewModelScope.launch { + renameStorageUseCase.rename(storage, newName) + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt index e556f69..ca94c35 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/main/screens/remotes/RemoteVaultsViewModel.kt @@ -1,6 +1,6 @@ package com.github.nullptroma.wallenc.presentation.screens.main.screens.remotes -import com.github.nullptroma.wallenc.presentation.viewmodel.ViewModelBase +import com.github.nullptroma.wallenc.presentation.ViewModelBase import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject diff --git a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt index 658e01c..9ba5264 100644 --- a/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt +++ b/presentation/src/main/java/com/github/nullptroma/wallenc/presentation/screens/settings/SettingsViewModel.kt @@ -1,6 +1,6 @@ package com.github.nullptroma.wallenc.presentation.screens.settings -import com.github.nullptroma.wallenc.presentation.viewmodel.ViewModelBase +import com.github.nullptroma.wallenc.presentation.ViewModelBase import dagger.hilt.android.lifecycle.HiltViewModel @HiltViewModel diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index d65a8c1..8f6c55a 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -7,4 +7,7 @@ Settings Screen Title! <noname> + Show storage item menu + Rename + \ No newline at end of file