Skip to content

Commit abf571d

Browse files
authored
Merge pull request #5227 from nextcloud/feature/5095/improveAccountDialogFragment
Improve AccountDialogFragment
2 parents b66e57b + 5d6d0ee commit abf571d

15 files changed

Lines changed: 744 additions & 572 deletions

File tree

app/src/androidTest/java/com/nextcloud/talk/ui/LoginIT.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ public void login() throws InterruptedException {
6868
try {
6969
// Delete account if exists
7070
onView(withId(R.id.switch_account_button)).perform(click());
71-
onView(withId(R.id.manage_settings)).perform(click());
7271
onView(withId(R.id.settings_remove_account)).perform(click());
7372
onView(withText(R.string.nc_settings_remove)).perform(click());
7473
// The remove button must be clicked two times
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Sowjanya Kota <sowjanya.kch@gmail.com>
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.talk.account.data.model
9+
10+
import com.nextcloud.talk.data.user.model.User
11+
12+
data class AccountItem(val user: User, val userId: String?, val pendingInvitation: Int)

app/src/main/java/com/nextcloud/talk/api/NcApiCoroutines.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import com.nextcloud.talk.models.json.chat.ChatOverallSingleMessage
1515
import com.nextcloud.talk.models.json.conversations.RoomOverall
1616
import com.nextcloud.talk.models.json.conversations.RoomsOverall
1717
import com.nextcloud.talk.models.json.generic.GenericOverall
18+
import com.nextcloud.talk.models.json.invitation.InvitationOverall
1819
import com.nextcloud.talk.models.json.participants.AddParticipantOverall
1920
import com.nextcloud.talk.models.json.participants.TalkBan
2021
import com.nextcloud.talk.models.json.participants.TalkBanOverall
2122
import com.nextcloud.talk.models.json.profile.ProfileOverall
23+
import com.nextcloud.talk.models.json.status.StatusOverall
2224
import com.nextcloud.talk.models.json.testNotification.TestNotificationOverall
2325
import com.nextcloud.talk.models.json.threads.ThreadOverall
2426
import com.nextcloud.talk.models.json.threads.ThreadsOverall
@@ -315,4 +317,10 @@ interface NcApiCoroutines {
315317
@Url url: String,
316318
@Query("searchTerm") searchTerm: String?
317319
): RoomsOverall
320+
321+
@GET
322+
suspend fun getInvitations(@Header("Authorization") authorization: String, @Url url: String): InvitationOverall
323+
324+
@GET
325+
suspend fun status(@Header("Authorization") authorization: String, @Url url: String): StatusOverall
318326
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Sowjanya Kota <sowjanya.kch@gmail.com>
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.talk.chooseaccount
9+
10+
import com.nextcloud.talk.models.json.status.StatusOverall
11+
12+
interface StatusRepository {
13+
suspend fun setStatus(): StatusOverall
14+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Sowjanya Kota <sowjanya.kch@gmail.com>
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.talk.chooseaccount
9+
10+
import com.nextcloud.talk.api.NcApiCoroutines
11+
import com.nextcloud.talk.data.user.model.User
12+
import com.nextcloud.talk.models.json.status.StatusOverall
13+
import com.nextcloud.talk.utils.ApiUtils
14+
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
15+
import javax.inject.Inject
16+
17+
class StatusRepositoryImplementation @Inject constructor(
18+
private val ncApiCoroutines: NcApiCoroutines,
19+
private val currentUserProvider: CurrentUserProviderNew
20+
) : StatusRepository {
21+
private val _currentUser = currentUserProvider.currentUser.blockingGet()
22+
val currentUser: User = _currentUser
23+
val credentials = ApiUtils.getCredentials(_currentUser.username, _currentUser.token)
24+
25+
override suspend fun setStatus(): StatusOverall {
26+
val url = ApiUtils.getUrlForStatus(currentUser.baseUrl!!)
27+
val statusOverall = credentials?.let {
28+
ncApiCoroutines.status(credentials, url)
29+
}
30+
return statusOverall!!
31+
}
32+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2025 Sowjanya Kota <sowjanya.kch@gmail.com>
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.talk.chooseaccount
9+
10+
import androidx.lifecycle.ViewModel
11+
import androidx.lifecycle.viewModelScope
12+
import com.nextcloud.talk.models.json.status.StatusOverall
13+
import kotlinx.coroutines.flow.MutableStateFlow
14+
import kotlinx.coroutines.flow.StateFlow
15+
import kotlinx.coroutines.launch
16+
import javax.inject.Inject
17+
18+
class StatusViewModel @Inject constructor(private val repository: StatusRepository) : ViewModel() {
19+
20+
private val _statusViewState = MutableStateFlow<StatusUiState>(StatusUiState.None)
21+
val statusViewState: StateFlow<StatusUiState> = _statusViewState
22+
23+
@Suppress("Detekt.TooGenericExceptionCaught")
24+
fun getStatus() {
25+
viewModelScope.launch {
26+
try {
27+
val status = repository.setStatus()
28+
_statusViewState.value = StatusUiState.Success(status)
29+
} catch (exception: Exception) {
30+
_statusViewState.value = StatusUiState.Error(exception.message ?: "")
31+
}
32+
}
33+
}
34+
}
35+
36+
sealed class StatusUiState {
37+
data object None : StatusUiState()
38+
open class Success(val status: StatusOverall) : StatusUiState()
39+
open class Error(val message: String) : StatusUiState()
40+
}

app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import androidx.activity.OnBackPressedCallback
3838
import androidx.annotation.OptIn
3939
import androidx.appcompat.app.AlertDialog
4040
import androidx.appcompat.widget.SearchView
41+
import androidx.compose.runtime.mutableStateOf
4142
import androidx.compose.ui.platform.ViewCompositionStrategy
4243
import androidx.core.content.pm.ShortcutInfoCompat
4344
import androidx.core.content.pm.ShortcutManagerCompat
@@ -112,7 +113,7 @@ import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository
112113
import com.nextcloud.talk.settings.SettingsActivity
113114
import com.nextcloud.talk.threadsoverview.ThreadsOverviewActivity
114115
import com.nextcloud.talk.ui.BackgroundVoiceMessageCard
115-
import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment
116+
import com.nextcloud.talk.ui.dialog.ChooseAccountDialogCompose
116117
import com.nextcloud.talk.ui.dialog.ChooseAccountShareToDialogFragment
117118
import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog
118119
import com.nextcloud.talk.ui.dialog.FilterConversationFragment
@@ -824,6 +825,15 @@ class ConversationsListActivity :
824825
}
825826
}
826827

828+
private fun showChooseAccountDialog() {
829+
binding.genericComposeView.apply {
830+
val shouldDismiss = mutableStateOf(false)
831+
setContent {
832+
ChooseAccountDialogCompose().GetChooseAccountDialog(shouldDismiss, this@ConversationsListActivity)
833+
}
834+
}
835+
}
836+
827837
private fun loadUserAvatar(button: MaterialButton) {
828838
val target = object : Target {
829839
override fun onStart(placeholder: Drawable?) {
@@ -1175,8 +1185,7 @@ class ConversationsListActivity :
11751185

11761186
if (resources!!.getBoolean(R.bool.multiaccount_support) && userManager.users.blockingGet().size > 1) {
11771187
dialogBuilder.setPositiveButton(R.string.nc_switch_account) { _, _ ->
1178-
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
1179-
newFragment.show(supportFragmentManager, ChooseAccountDialogFragment.TAG)
1188+
showChooseAccountDialog()
11801189
}
11811190
}
11821191

@@ -1295,8 +1304,7 @@ class ConversationsListActivity :
12951304

12961305
binding.switchAccountButton.setOnClickListener {
12971306
if (resources != null && resources!!.getBoolean(R.bool.multiaccount_support)) {
1298-
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
1299-
newFragment.show(supportFragmentManager, ChooseAccountDialogFragment.TAG)
1307+
showChooseAccountDialog()
13001308
} else {
13011309
val intent = Intent(context, SettingsActivity::class.java)
13021310
startActivity(intent)
@@ -2068,8 +2076,7 @@ class ConversationsListActivity :
20682076

20692077
if (resources!!.getBoolean(R.bool.multiaccount_support) && userManager.users.blockingGet().size > 1) {
20702078
dialogBuilder.setNegativeButton(R.string.nc_switch_account) { _, _ ->
2071-
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
2072-
newFragment.show(supportFragmentManager, ChooseAccountDialogFragment.TAG)
2079+
showChooseAccountDialog()
20732080
}
20742081
}
20752082

@@ -2112,8 +2119,7 @@ class ConversationsListActivity :
21122119

21132120
if (resources!!.getBoolean(R.bool.multiaccount_support) && userManager.users.blockingGet().size > 1) {
21142121
dialogBuilder.setNegativeButton(R.string.nc_switch_account) { _, _ ->
2115-
val newFragment: DialogFragment = ChooseAccountDialogFragment.newInstance()
2116-
newFragment.show(supportFragmentManager, ChooseAccountDialogFragment.TAG)
2122+
showChooseAccountDialog()
21172123
}
21182124
}
21192125

app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import com.nextcloud.talk.chat.data.ChatMessageRepository
1919
import com.nextcloud.talk.chat.data.network.ChatNetworkDataSource
2020
import com.nextcloud.talk.chat.data.network.OfflineFirstChatRepository
2121
import com.nextcloud.talk.chat.data.network.RetrofitChatNetwork
22+
import com.nextcloud.talk.chooseaccount.StatusRepository
23+
import com.nextcloud.talk.chooseaccount.StatusRepositoryImplementation
2224
import com.nextcloud.talk.contacts.ContactsRepository
2325
import com.nextcloud.talk.contacts.ContactsRepositoryImpl
2426
import com.nextcloud.talk.conversationcreation.ConversationCreationRepository
@@ -147,7 +149,8 @@ class RepositoryModule {
147149
): ConversationInfoEditRepository = ConversationInfoEditRepositoryImpl(ncApi, ncApiCoroutines, userProvider)
148150

149151
@Provides
150-
fun provideInvitationsRepository(ncApi: NcApi): InvitationsRepository = InvitationsRepositoryImpl(ncApi)
152+
fun provideInvitationsRepository(ncApi: NcApi, ncApiCoroutines: NcApiCoroutines): InvitationsRepository =
153+
InvitationsRepositoryImpl(ncApi, ncApiCoroutines)
151154

152155
@Provides
153156
fun provideOfflineFirstChatRepository(
@@ -215,4 +218,10 @@ class RepositoryModule {
215218
networkLoginDataSource: NetworkLoginDataSource,
216219
localLoginDataSource: LocalLoginDataSource
217220
): LoginRepository = LoginRepository(networkLoginDataSource, localLoginDataSource)
221+
222+
@Provides
223+
fun provideStatusRepository(
224+
ncApiCoroutines: NcApiCoroutines,
225+
currentUserProviderNew: CurrentUserProviderNew
226+
): StatusRepository = StatusRepositoryImplementation(ncApiCoroutines, currentUserProviderNew)
218227
}

app/src/main/java/com/nextcloud/talk/dagger/modules/ViewModelModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider
1212
import com.nextcloud.talk.account.viewmodels.BrowserLoginActivityViewModel
1313
import com.nextcloud.talk.chat.viewmodels.ChatViewModel
1414
import com.nextcloud.talk.chat.viewmodels.MessageInputViewModel
15+
import com.nextcloud.talk.chooseaccount.StatusViewModel
1516
import com.nextcloud.talk.contacts.ContactsViewModel
1617
import com.nextcloud.talk.contextchat.ContextChatViewModel
1718
import com.nextcloud.talk.conversationcreation.ConversationCreationViewModel
@@ -172,4 +173,9 @@ abstract class ViewModelModule {
172173
@IntoMap
173174
@ViewModelKey(ContextChatViewModel::class)
174175
abstract fun contextChatViewModel(viewModel: ContextChatViewModel): ViewModel
176+
177+
@Binds
178+
@IntoMap
179+
@ViewModelKey(StatusViewModel::class)
180+
abstract fun statusRepositoryViewModel(viewModel: StatusViewModel): ViewModel
175181
}

app/src/main/java/com/nextcloud/talk/invitation/data/InvitationsRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ interface InvitationsRepository {
1313
fun fetchInvitations(user: User): Observable<InvitationsModel>
1414
fun acceptInvitation(user: User, invitation: Invitation): Observable<InvitationActionModel>
1515
fun rejectInvitation(user: User, invitation: Invitation): Observable<InvitationActionModel>
16+
suspend fun getInvitations(user: User): InvitationsModel
1617
}

0 commit comments

Comments
 (0)