22 * Nextcloud Talk - Android Client
33 *
44 * SPDX-FileCopyrightText: 2022 Marcel Hibbe <dev@mhibbe.de>
5- + SPDX-FileCopyrightText: 2021 Andy Scherzinger <info@andy-scherzinger.de>
5+ * SPDX-FileCopyrightText: 2021 Andy Scherzinger <info@andy-scherzinger.de>
66 * SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
77 * SPDX-License-Identifier: GPL-3.0-or-later
88 */
@@ -16,44 +16,36 @@ import android.view.View
1616import android.view.ViewGroup
1717import androidx.core.net.toUri
1818import androidx.fragment.app.DialogFragment
19- import androidx.recyclerview.widget.LinearLayoutManager
19+ import androidx.lifecycle.ViewModelProvider
2020import autodagger.AutoInjector
2121import com.google.android.material.dialog.MaterialAlertDialogBuilder
2222import com.nextcloud.android.common.ui.theme.utils.ColorRole
23- import com.nextcloud.talk.adapters.items.AdvancedUserItem
2423import com.nextcloud.talk.application.NextcloudTalkApplication
2524import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
26- import com.nextcloud.talk.data.user.model.User
2725import com.nextcloud.talk.databinding.DialogChooseAccountShareToBinding
2826import com.nextcloud.talk.extensions.loadUserAvatar
29- import com.nextcloud.talk.models.json.participants.Participant
27+ import com.nextcloud.talk.ui.dialog.viewmodels.ChooseAccountShareToViewModel
3028import com.nextcloud.talk.ui.theme.ViewThemeUtils
31- import com.nextcloud.talk.users.UserManager
32- import com.nextcloud.talk.utils.database.user.CurrentUserProviderOld
33- import eu.davidea.flexibleadapter.FlexibleAdapter
34- import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
3529import java.net.CookieManager
3630import javax.inject.Inject
3731
3832@AutoInjector(NextcloudTalkApplication ::class )
3933class ChooseAccountShareToDialogFragment : DialogFragment () {
40- @JvmField
41- @Inject
42- var userManager: UserManager ? = null
4334
4435 @Inject
45- lateinit var currentUserProvider : CurrentUserProviderOld
36+ lateinit var viewModelFactory : ViewModelProvider . Factory
4637
47- @JvmField
4838 @Inject
49- var cookieManager : CookieManager ? = null
39+ lateinit var viewThemeUtils : ViewThemeUtils
5040
5141 @Inject
52- lateinit var viewThemeUtils: ViewThemeUtils
42+ lateinit var cookieManager: CookieManager
43+
5344 private var binding: DialogChooseAccountShareToBinding ? = null
5445 private var dialogView: View ? = null
55- private var adapter: FlexibleAdapter <AdvancedUserItem >? = null
56- private val userItems: MutableList <AdvancedUserItem > = ArrayList ()
46+
47+ private lateinit var viewModel: ChooseAccountShareToViewModel
48+ private lateinit var adapter: ChooseAccountShareToAdapter
5749
5850 @SuppressLint(" InflateParams" )
5951 override fun onCreateDialog (savedInstanceState : Bundle ? ): Dialog {
@@ -65,73 +57,60 @@ class ChooseAccountShareToDialogFragment : DialogFragment() {
6557 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
6658 super .onViewCreated(view, savedInstanceState)
6759 sharedApplication!! .componentApplication.inject(this )
68- val user = currentUserProvider.currentUser.blockingGet()
60+
61+ viewModel = ViewModelProvider (this , viewModelFactory)[ChooseAccountShareToViewModel ::class .java]
62+
6963 themeViews()
70- setupCurrentUser(user)
71- setupListeners(user)
7264 setupAdapter()
73- prepareViews()
74- }
65+ initObservers()
7566
76- private fun setupCurrentUser (user : User ? ) {
77- binding!! .currentAccount.userIcon.tag = " "
78- if (user != null ) {
79- binding!! .currentAccount.userName.text = user.displayName
80- binding!! .currentAccount.ticker.visibility = View .GONE
81- binding!! .currentAccount.account.text = user.baseUrl!! .toUri().host
82- viewThemeUtils!! .platform.colorImageView(binding!! .currentAccount.accountMenu, ColorRole .PRIMARY )
83- if (user.baseUrl != null &&
84- (user.baseUrl!! .startsWith(" http://" ) || user.baseUrl!! .startsWith(" https://" ))
85- ) {
86- binding!! .currentAccount.userIcon.loadUserAvatar(user, user.userId!! , true , false )
87- } else {
88- binding!! .currentAccount.userIcon.visibility = View .INVISIBLE
89- }
90- }
67+ viewModel.loadUsers()
9168 }
9269
93- @Suppress(" Detekt.NestedBlockDepth" )
9470 private fun setupAdapter () {
95- if (adapter == null ) {
96- adapter = FlexibleAdapter (userItems, activity, false )
97- var userEntity: User
98- var participant: Participant
99- for (userItem in userManager!! .users.blockingGet()) {
100- userEntity = userItem
101- if (! userEntity.current) {
102- var userId: String?
103- userId = if (userEntity.userId != null ) {
104- userEntity.userId
105- } else {
106- userEntity.username
107- }
108- participant = Participant ()
109- participant.actorType = Participant .ActorType .USERS
110- participant.actorId = userId
111- participant.displayName = userEntity.displayName
112- userItems.add(AdvancedUserItem (participant, userEntity, null , viewThemeUtils, 0 ))
71+ adapter = ChooseAccountShareToAdapter { user -> viewModel.switchToUser(user) }
72+ binding!! .accountsList.adapter = adapter
73+ }
74+
75+ private fun initObservers () {
76+ viewModel.viewState.observe(this ) { state ->
77+ when (state) {
78+ is ChooseAccountShareToViewModel .LoadUsersSuccessState -> {
79+ setupCurrentUser()
80+ adapter.submitList(state.users)
81+ }
82+ is ChooseAccountShareToViewModel .SwitchUserSuccessState -> {
83+ cookieManager.cookieStore.removeAll()
84+ activity?.recreate()
85+ dismiss()
11386 }
87+ else -> {}
11488 }
115- adapter!! .addListener(onSwitchItemClickListener)
116- adapter!! .updateDataSet(userItems, false )
11789 }
11890 }
11991
120- private fun setupListeners (user : User ) {
121- binding!! .currentAccount.root.setOnClickListener { v: View ? -> dismiss() }
92+ private fun setupCurrentUser () {
93+ val currentAccount = binding!! .currentAccount
94+ val user = viewModel.currentUser
95+ if (user != null ) {
96+ currentAccount.userIcon.tag = " "
97+ currentAccount.userName.text = user.displayName
98+ currentAccount.ticker.visibility = View .GONE
99+ currentAccount.account.text = user.baseUrl!! .toUri().host
100+ viewThemeUtils.platform.colorImageView(currentAccount.accountMenu, ColorRole .PRIMARY )
101+ if (user.baseUrl != null &&
102+ (user.baseUrl!! .startsWith(" http://" ) || user.baseUrl!! .startsWith(" https://" ))
103+ ) {
104+ currentAccount.userIcon.loadUserAvatar(user, user.userId!! , true , false )
105+ } else {
106+ currentAccount.userIcon.visibility = View .INVISIBLE
107+ }
108+ }
109+ currentAccount.root.setOnClickListener { dismiss() }
122110 }
123111
124112 private fun themeViews () {
125- viewThemeUtils!! .platform.themeDialog(binding!! .root)
126- }
127-
128- private fun prepareViews () {
129- if (activity != null ) {
130- val layoutManager: LinearLayoutManager = SmoothScrollLinearLayoutManager (activity)
131- binding!! .accountsList.layoutManager = layoutManager
132- }
133- binding!! .accountsList.setHasFixedSize(true )
134- binding!! .accountsList.adapter = adapter
113+ viewThemeUtils.platform.themeDialog(binding!! .root)
135114 }
136115
137116 override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ): View ? =
@@ -142,18 +121,6 @@ class ChooseAccountShareToDialogFragment : DialogFragment() {
142121 binding = null
143122 }
144123
145- private val onSwitchItemClickListener = FlexibleAdapter .OnItemClickListener { view, position ->
146- if (userItems.size > position) {
147- val user = userItems[position].user
148- if (userManager!! .setUserAsActive(user!! ).blockingGet()) {
149- cookieManager!! .cookieStore.removeAll()
150- activity?.recreate()
151- dismiss()
152- }
153- }
154- true
155- }
156-
157124 companion object {
158125 val TAG = ChooseAccountShareToDialogFragment ::class .java.simpleName
159126 fun newInstance (): ChooseAccountShareToDialogFragment = ChooseAccountShareToDialogFragment ()
0 commit comments