Refactor and cleanup UI and storage components

Refactored TokenStorage to lazily initialize EncryptedSharedPreferences, improving initialization safety. Removed unused variables and imports from MaskedEmailCard and CreateMaskedEmailScreen. Simplified error display logic in MaskedEmailDetailScreen. Updated MaskedEmailListScreen to use AutoMirrored Logout icon for better RTL support.
This commit is contained in:
Paweł Orzech 2026-01-31 02:13:53 +01:00
parent 5ab1be6cd4
commit 5d81c247aa
No known key found for this signature in database
5 changed files with 16 additions and 18 deletions

View file

@ -12,17 +12,19 @@ import javax.inject.Singleton
class TokenStorage @Inject constructor( class TokenStorage @Inject constructor(
@ApplicationContext private val context: Context @ApplicationContext private val context: Context
) { ) {
private val masterKey = MasterKey.Builder(context) private val sharedPreferences: SharedPreferences by lazy {
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM) .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build() .build()
private val sharedPreferences: SharedPreferences = EncryptedSharedPreferences.create( EncryptedSharedPreferences.create(
context, context,
PREFS_FILE_NAME, PREFS_FILE_NAME,
masterKey, masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
) )
}
fun saveToken(token: String) { fun saveToken(token: String) {
sharedPreferences.edit().putString(KEY_API_TOKEN, token).apply() sharedPreferences.edit().putString(KEY_API_TOKEN, token).apply()

View file

@ -49,7 +49,6 @@ fun MaskedEmailCard(
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val haptic = LocalHapticFeedback.current val haptic = LocalHapticFeedback.current
val statusColors = FastMaskStatusColors.current
val stateDescription = when (maskedEmail.state) { val stateDescription = when (maskedEmail.state) {
EmailState.ENABLED -> "Enabled" EmailState.ENABLED -> "Enabled"

View file

@ -36,7 +36,6 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.hapticfeedback.HapticFeedbackType
@ -48,7 +47,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.fastmask.domain.model.EmailState import com.fastmask.domain.model.EmailState
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@ -59,7 +57,6 @@ fun CreateMaskedEmailScreen(
val uiState by viewModel.uiState.collectAsState() val uiState by viewModel.uiState.collectAsState()
val context = LocalContext.current val context = LocalContext.current
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope()
val haptic = LocalHapticFeedback.current val haptic = LocalHapticFeedback.current
LaunchedEffect(Unit) { LaunchedEffect(Unit) {

View file

@ -475,10 +475,10 @@ private fun EmailDetailContent(
enabled = !uiState.isUpdating enabled = !uiState.isUpdating
) )
if (uiState.error != null) { uiState.error?.let { error ->
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
Text( Text(
text = uiState.error!!, text = error,
color = MaterialTheme.colorScheme.error, color = MaterialTheme.colorScheme.error,
style = MaterialTheme.typography.bodyMedium style = MaterialTheme.typography.bodyMedium
) )

View file

@ -21,7 +21,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.FilterList import androidx.compose.material.icons.filled.FilterList
import androidx.compose.material.icons.filled.Logout import androidx.compose.material.icons.automirrored.filled.Logout
import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
@ -140,7 +140,7 @@ fun MaskedEmailListScreen(
} }
) { ) {
Icon( Icon(
imageVector = Icons.Default.Logout, imageVector = Icons.AutoMirrored.Filled.Logout,
contentDescription = null contentDescription = null
) )
} }