11/*
22 * Nextcloud Talk - Android Client
33 *
4- * SPDX-FileCopyrightText: 2025 Sowjanya Kota <sowjanya.kch@gmail.com>
4+ * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
55 * SPDX-License-Identifier: GPL-3.0-or-later
66 */
77
8- package com.nextcloud.talk.ui.dialog
8+ package com.nextcloud.talk.chooseaccount
99
1010import android.app.Activity
1111import android.content.Context
@@ -42,7 +42,6 @@ import androidx.compose.material3.TextButton
4242import androidx.compose.runtime.Composable
4343import androidx.compose.runtime.LaunchedEffect
4444import androidx.compose.runtime.MutableState
45- import androidx.compose.runtime.collectAsState
4645import androidx.compose.runtime.getValue
4746import androidx.compose.runtime.mutableStateListOf
4847import androidx.compose.runtime.mutableStateOf
@@ -64,7 +63,7 @@ import androidx.compose.ui.unit.dp
6463import androidx.compose.ui.viewinterop.AndroidView
6564import androidx.compose.ui.window.Dialog
6665import androidx.core.net.toUri
67- import androidx.fragment.app.FragmentActivity
66+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
6867import autodagger.AutoInjector
6968import coil.compose.AsyncImage
7069import com.nextcloud.android.common.core.utils.ecosystem.EcosystemApp
@@ -74,14 +73,18 @@ import com.nextcloud.talk.R
7473import com.nextcloud.talk.account.ServerSelectionActivity
7574import com.nextcloud.talk.account.data.model.AccountItem
7675import com.nextcloud.talk.application.NextcloudTalkApplication
77- import com.nextcloud.talk.chooseaccount.StatusUiState
78- import com.nextcloud.talk.chooseaccount.StatusViewModel
76+ import com.nextcloud.talk.chooseaccount.ui.OnlineStatusModalBottomSheet
77+ import com.nextcloud.talk.chooseaccount.ui.StatusMessageModalBottomSheet
78+ import com.nextcloud.talk.chooseaccount.viewmodel.StatusMessageViewModel
79+ import com.nextcloud.talk.chooseaccount.viewmodel.StatusUiState
80+ import com.nextcloud.talk.chooseaccount.viewmodel.StatusViewModel
7981import com.nextcloud.talk.contacts.loadImage
8082import com.nextcloud.talk.conversationlist.ConversationsListActivity
8183import com.nextcloud.talk.data.network.NetworkMonitor
8284import com.nextcloud.talk.data.user.model.User
8385import com.nextcloud.talk.invitation.viewmodels.InvitationsViewModel
8486import com.nextcloud.talk.models.json.status.Status
87+ import com.nextcloud.talk.models.json.status.StatusType
8588import com.nextcloud.talk.settings.SettingsActivity
8689import com.nextcloud.talk.ui.StatusDrawable
8790import com.nextcloud.talk.ui.theme.ViewThemeUtils
@@ -118,6 +121,9 @@ class ChooseAccountDialogCompose {
118121 @Inject
119122 lateinit var statusViewModel: StatusViewModel
120123
124+ @Inject
125+ lateinit var statusMessageViewModel: StatusMessageViewModel
126+
121127 @Inject
122128 lateinit var networkMonitor: NetworkMonitor
123129
@@ -131,10 +137,12 @@ class ChooseAccountDialogCompose {
131137 if (shouldDismiss.value) return
132138 val colorScheme = viewThemeUtils.getColorScheme(activity)
133139 val status = remember { mutableStateOf<Status ?>(null ) }
140+ val showOnlineStatusSheet = remember { mutableStateOf(false ) }
141+ val showStatusMessageSheet = remember { mutableStateOf(false ) }
134142 val context = LocalContext .current
135- val statusViewState by statusViewModel.statusViewState.collectAsState ()
136- val invitationsState by invitationsViewModel.getInvitationsViewState.collectAsState ()
137- val isOnline by networkMonitor.isOnline.collectAsState ()
143+ val statusViewState by statusViewModel.statusViewState.collectAsStateWithLifecycle ()
144+ val invitationsState by invitationsViewModel.getInvitationsViewState.collectAsStateWithLifecycle ()
145+ val isOnline by networkMonitor.isOnline.collectAsStateWithLifecycle ()
138146 val currentUser = currentUserProvider.currentUser.blockingGet()!!
139147 val isStatusAvailable = CapabilitiesUtil .isUserStatusAvailable(currentUser)
140148 ecosystemManager = EcosystemManager (activity)
@@ -166,12 +174,11 @@ class ChooseAccountDialogCompose {
166174 accountItems = userItems,
167175 onCurrentUserClick = { shouldDismiss.value = true },
168176 onSetOnlineStatusClick = {
169- shouldDismiss.value = true
170- openSetOnlineStatusFragment(status.value, activity)
177+ showOnlineStatusSheet.value = true
171178 },
172179 onSetStatusMessageClick = {
173- shouldDismiss.value = true
174- openSetStatusMessageFragment(status .value, activity)
180+ statusMessageViewModel.resetDismissed()
181+ showStatusMessageSheet .value = true
175182 },
176183 onAddAccountClick = {
177184 shouldDismiss.value = true
@@ -202,6 +209,28 @@ class ChooseAccountDialogCompose {
202209 showEcosystem = showEcosystem,
203210 context = context
204211 )
212+ if (showOnlineStatusSheet.value) {
213+ val currentStatusType = StatusType .entries.firstOrNull { it.string == status.value?.status }
214+ OnlineStatusModalBottomSheet (
215+ currentStatusType = currentStatusType,
216+ onStatusSelected = { statusType ->
217+ statusViewModel.setStatusType(statusType)
218+ },
219+ onDismiss = { showOnlineStatusSheet.value = false }
220+ )
221+ }
222+ if (showStatusMessageSheet.value) {
223+ status.value?.let { currentStatus ->
224+ StatusMessageModalBottomSheet (
225+ currentStatus = currentStatus,
226+ viewModel = statusMessageViewModel,
227+ onDismiss = {
228+ showStatusMessageSheet.value = false
229+ statusViewModel.getStatus()
230+ }
231+ )
232+ }
233+ }
205234 }
206235 }
207236
@@ -229,22 +258,6 @@ class ChooseAccountDialogCompose {
229258 }
230259 }
231260
232- private fun openSetOnlineStatusFragment (status : Status ? , activity : Activity ) {
233- val fragmentActivity = activity as FragmentActivity
234- status?.let {
235- val setStatusDialog = OnlineStatusBottomDialogFragment .newInstance(it)
236- setStatusDialog.show(fragmentActivity.supportFragmentManager, " fragment_set_status" )
237- } ? : Log .w(TAG , " status was null" )
238- }
239-
240- private fun openSetStatusMessageFragment (status : Status ? , activity : Activity ) {
241- val fragmentActivity = activity as FragmentActivity
242- status?.let {
243- val setStatusDialog = StatusMessageBottomDialogFragment .newInstance(it)
244- setStatusDialog.show(fragmentActivity.supportFragmentManager, " fragment_set_status" )
245- } ? : Log .w(TAG , " status was null" )
246- }
247-
248261 private fun addAccount (activity : Activity ) {
249262 val intent = Intent (activity, ServerSelectionActivity ::class .java)
250263 intent.putExtra(BundleKeys .ADD_ADDITIONAL_ACCOUNT , true )
0 commit comments