From c8fa158eaa7b47564933a8bd761d49754ed15696 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 11 Mar 2024 15:31:38 +0100 Subject: [PATCH] Make AssistantViewModel testable Signed-off-by: alperozturk --- .../client/assistant/AssistantViewModel.kt | 9 +- .../client/assistant/AsssistantScreen.kt | 22 ++++- .../repository/AssistantMockRepository.kt | 87 +++++++++++++++++++ .../ui/composeActivity/ComposeActivity.kt | 8 +- .../android/ui/activity/DrawerActivity.java | 2 +- 5 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/client/assistant/repository/AssistantMockRepository.kt diff --git a/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt b/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt index 2a97e7589fcf..3383df42bbc5 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt @@ -23,8 +23,7 @@ package com.nextcloud.client.assistant import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.nextcloud.client.assistant.repository.AssistantRepository -import com.nextcloud.common.NextcloudClient +import com.nextcloud.client.assistant.repository.AssistantRepositoryType import com.owncloud.android.MainApp import com.owncloud.android.R import com.owncloud.android.lib.resources.assistant.model.Task @@ -35,9 +34,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -class AssistantViewModel(client: NextcloudClient) : ViewModel() { - - private val repository: AssistantRepository = AssistantRepository(client) +class AssistantViewModel(private val repository: AssistantRepositoryType) : ViewModel() { private val _selectedTaskType = MutableStateFlow(null) val selectedTaskType: StateFlow = _selectedTaskType @@ -88,7 +85,7 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() { viewModelScope.launch(Dispatchers.IO) { val allTaskType = MainApp.getAppContext().getString(R.string.assistant_screen_all_task_type) val result = arrayListOf(TaskType(null, allTaskType, null)) - val taskTypes = repository.getTaskTypes().resultData.types ?: listOf() + val taskTypes = repository.getTaskTypes().resultData.types result.addAll(taskTypes) _taskTypes.update { diff --git a/app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt b/app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt index df9786edb683..b49f0db0c9c0 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt @@ -38,6 +38,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -49,13 +50,15 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.nextcloud.client.assistant.component.AddTaskAlertDialog import com.nextcloud.client.assistant.component.CenterText import com.nextcloud.client.assistant.component.TaskTypesRow import com.nextcloud.client.assistant.component.TaskView +import com.nextcloud.client.assistant.repository.AssistantMockRepository +import com.nextcloud.ui.composeActivity.ComposeActivity import com.nextcloud.ui.composeComponents.alertDialog.SimpleAlertDialog import com.owncloud.android.R import com.owncloud.android.lib.resources.assistant.model.Task @@ -66,8 +69,7 @@ import kotlinx.coroutines.delay @Suppress("LongMethod") @OptIn(ExperimentalMaterial3Api::class) @Composable -fun AssistantScreen(viewModel: AssistantViewModel) { - val activity = LocalContext.current as Activity +fun AssistantScreen(viewModel: AssistantViewModel, activity: Activity) { val loading by viewModel.loading.collectAsState() val selectedTaskType by viewModel.selectedTaskType.collectAsState() val filteredTaskList by viewModel.filteredTaskList.collectAsState() @@ -240,3 +242,17 @@ private fun EmptyTaskList(selectedTaskType: TaskType?, taskTypes: List ) } } + +@Composable +@Preview +private fun AssistantScreenPreview() { + val mockRepository = AssistantMockRepository() + MaterialTheme( + content = { + AssistantScreen( + viewModel = AssistantViewModel(repository = mockRepository), + activity = ComposeActivity() + ) + } + ) +} diff --git a/app/src/main/java/com/nextcloud/client/assistant/repository/AssistantMockRepository.kt b/app/src/main/java/com/nextcloud/client/assistant/repository/AssistantMockRepository.kt new file mode 100644 index 000000000000..c2e059ce424f --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/assistant/repository/AssistantMockRepository.kt @@ -0,0 +1,87 @@ +/* + * Nextcloud Android client application + * + * @author Alper Ozturk + * Copyright (C) 2024 Alper Ozturk + * Copyright (C) 2024 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.assistant.repository + +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.assistant.model.Task +import com.owncloud.android.lib.resources.assistant.model.TaskList +import com.owncloud.android.lib.resources.assistant.model.TaskType +import com.owncloud.android.lib.resources.assistant.model.TaskTypes + +class AssistantMockRepository : AssistantRepositoryType { + override fun getTaskTypes(): RemoteOperationResult { + return RemoteOperationResult(RemoteOperationResult.ResultCode.OK).apply { + resultData = TaskTypes( + listOf( + TaskType("1", "FreePrompt", "You can create free prompt text"), + TaskType("2", "Generate Headline", "You can create generate headline text") + ) + ) + } + } + + override fun createTask(input: String, type: String): RemoteOperationResult { + return RemoteOperationResult(RemoteOperationResult.ResultCode.OK) + } + + override fun getTaskList(appId: String): RemoteOperationResult { + return RemoteOperationResult(RemoteOperationResult.ResultCode.OK).apply { + resultData = TaskList( + listOf( + Task( + 1, + "FreePrompt", + null, + "12", + "", + "Give me some text", + "Lorem Ipsum is simply dummy text of the printing and typesetting industry. " + + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s," + + " when an unknown printer took a galley of type and scrambled it to make a type" + + " specimen book. It has survived not only five centuries, " + + "but also the leap into electronic typesetting, remaining essentially unchanged." + + " It was popularised in the 1960s with the release of Letraset sheets containing " + + "Lorem Ipsum passages, and more recently with desktop publishing software like Aldus" + + " PageMaker including versions of Lorem Ipsum", + "", + "" + ), + Task( + 2, + "GenerateHeadline", + null, + "12", + "", + "Give me some text 2", + "Lorem Ipsum is simply dummy text of the printing and typesetting industry.", + "", + "" + ) + ) + ) + } + } + + override fun deleteTask(id: Long): RemoteOperationResult { + return RemoteOperationResult(RemoteOperationResult.ResultCode.OK) + } +} diff --git a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt index 573f11ce62b0..8c812791ad5c 100644 --- a/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt +++ b/app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt @@ -33,6 +33,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import com.nextcloud.client.assistant.AssistantScreen import com.nextcloud.client.assistant.AssistantViewModel +import com.nextcloud.client.assistant.repository.AssistantRepository import com.nextcloud.common.NextcloudClient import com.nextcloud.common.User import com.nextcloud.utils.extensions.getSerializableArgument @@ -103,11 +104,12 @@ class ComposeActivity : DrawerActivity() { } if (destination == ComposeDestination.AssistantScreen) { - nextcloudClient?.let { + nextcloudClient?.let { client -> AssistantScreen( viewModel = AssistantViewModel( - client = it - ) + repository = AssistantRepository(client) + ), + activity = this ) } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 3ba730fceaf1..b4eba3b10c54 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -468,7 +468,7 @@ private void filterDrawerMenu(final Menu menu, @NonNull final User user) { DrawerMenuUtil.filterSearchMenuItems(menu, user, getResources()); DrawerMenuUtil.filterTrashbinMenuItem(menu, capability); DrawerMenuUtil.filterActivityMenuItem(menu, capability); - DrawerMenuUtil.filterAssistantMenuItem(menu, capability); + // DrawerMenuUtil.filterAssistantMenuItem(menu, capability); DrawerMenuUtil.filterGroupfoldersMenuItem(menu, capability); DrawerMenuUtil.setupHomeMenuItem(menu, getResources());