From d197f8e0fb30a97e930614556f5934b5b1693062 Mon Sep 17 00:00:00 2001 From: Jing Jin <8752427+jinjingforever@users.noreply.github.com> Date: Sat, 19 Apr 2025 19:57:58 -0700 Subject: [PATCH] Show a snackbar when import succeeded. Also handle duplicated import better. --- .../aiedge/gallery/ui/home/HomeScreen.kt | 26 ++++++++++++++----- .../ui/modelmanager/ModelManagerViewModel.kt | 12 +++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/home/HomeScreen.kt b/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/home/HomeScreen.kt index 23921fd..5b476fe 100644 --- a/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/home/HomeScreen.kt +++ b/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/home/HomeScreen.kt @@ -54,6 +54,8 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.SmallFloatingActionButton +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberModalBottomSheetState @@ -71,6 +73,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.scale +import androidx.compose.ui.focus.focusModifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.layout @@ -127,6 +130,8 @@ fun HomeScreen( val selectedLocalModelFileUri = remember { mutableStateOf(null) } val selectedImportedModelInfo = remember { mutableStateOf(null) } val coroutineScope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + val scope = rememberCoroutineScope() val tasks = uiState.tasks val loadingHfModels = uiState.loadingHfModels @@ -173,12 +178,16 @@ fun HomeScreen( } } ) { innerPadding -> - TaskList( - tasks = tasks, - navigateToTaskScreen = navigateToTaskScreen, - modifier = Modifier.fillMaxSize(), - contentPadding = innerPadding, - ) + Box(contentAlignment = Alignment.BottomCenter, modifier = Modifier.fillMaxSize()) { + TaskList( + tasks = tasks, + navigateToTaskScreen = navigateToTaskScreen, + modifier = Modifier.fillMaxSize(), + contentPadding = innerPadding, + ) + + SnackbarHost(hostState = snackbarHostState, modifier = Modifier.padding(bottom = 16.dp)) + } } // Settings dialog. @@ -270,6 +279,11 @@ fun HomeScreen( info = it, ) showImportingDialog = false + + // Show a snack bar for successful import. + scope.launch { + snackbarHostState.showSnackbar("✅ Model imported successfully") + } }) } } diff --git a/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/modelmanager/ModelManagerViewModel.kt b/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/modelmanager/ModelManagerViewModel.kt index d82add5..ad150b4 100644 --- a/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/modelmanager/ModelManagerViewModel.kt +++ b/Android/src/app/src/main/java/com/google/aiedge/gallery/ui/modelmanager/ModelManagerViewModel.kt @@ -424,6 +424,13 @@ open class ModelManagerViewModel( fun addImportedLlmModel(task: Task, info: ImportedModelInfo) { Log.d(TAG, "adding imported llm model: $info") + // Remove duplicated imported model if existed. + val modelIndex = task.models.indexOfFirst { info.fileName == it.name && it.imported } + if (modelIndex >= 0) { + Log.d(TAG, "duplicated imported model found in task. Removing it first") + task.models.removeAt(modelIndex) + } + // Create model. val model = createModelFromImportedModelInfo(info = info, task = task) task.models.add(model) @@ -451,6 +458,11 @@ open class ModelManagerViewModel( // Add to preference storage. val importedModels = dataStoreRepository.readImportedModels().toMutableList() + val importedModelIndex = importedModels.indexOfFirst { info.fileName == it.fileName } + if (importedModelIndex >= 0) { + Log.d(TAG, "duplicated imported model found in preference storage. Removing it first") + importedModels.removeAt(importedModelIndex) + } importedModels.add(info) dataStoreRepository.saveImportedModels(importedModels = importedModels) }