Skip to content

Commit cb0f495

Browse files
Merge pull request #5929 from nextcloud/chore/noid/flexMig3
⚒️ Migrate account switcher away from flexible adapter
2 parents 18dea0c + d307be7 commit cb0f495

5 files changed

Lines changed: 78 additions & 251 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Nextcloud Talk - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2017-2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: GPL-3.0-or-later
6+
*/
7+
package com.nextcloud.talk.account
8+
9+
import android.text.TextUtils
10+
import android.view.LayoutInflater
11+
import android.view.View
12+
import android.view.ViewGroup
13+
import androidx.core.net.toUri
14+
import androidx.recyclerview.widget.DiffUtil
15+
import androidx.recyclerview.widget.ListAdapter
16+
import androidx.recyclerview.widget.RecyclerView
17+
import com.nextcloud.talk.adapters.items.AdvancedUserItem
18+
import com.nextcloud.talk.databinding.AccountItemBinding
19+
import com.nextcloud.talk.extensions.loadUserAvatar
20+
21+
class AccountItemAdapter(private val onClick: (AdvancedUserItem) -> Unit) :
22+
ListAdapter<AdvancedUserItem, AccountItemAdapter.ViewHolder>(DiffCallback) {
23+
24+
inner class ViewHolder(val binding: AccountItemBinding) : RecyclerView.ViewHolder(binding.root) {
25+
fun bind(item: AdvancedUserItem) {
26+
itemView.setOnClickListener { onClick(item) }
27+
binding.userName.text = item.model.displayName
28+
if (item.user != null && !TextUtils.isEmpty(item.user.baseUrl)) {
29+
val host = item.user.baseUrl!!.toUri().host
30+
binding.account.text = if (!TextUtils.isEmpty(host)) host else item.user.baseUrl
31+
}
32+
if (item.user?.baseUrl != null &&
33+
(item.user.baseUrl!!.startsWith("http://") || item.user.baseUrl!!.startsWith("https://"))
34+
) {
35+
binding.userIcon.loadUserAvatar(item.user, item.model.calculatedActorId!!, true, false)
36+
}
37+
binding.actionRequired.visibility = if (item.actionRequiredCount > 0) View.VISIBLE else View.GONE
38+
}
39+
}
40+
41+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
42+
ViewHolder(AccountItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
43+
44+
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
45+
holder.bind(getItem(position))
46+
}
47+
48+
companion object {
49+
val DiffCallback = object : DiffUtil.ItemCallback<AdvancedUserItem>() {
50+
override fun areItemsTheSame(oldItem: AdvancedUserItem, newItem: AdvancedUserItem): Boolean =
51+
oldItem.model == newItem.model
52+
53+
override fun areContentsTheSame(oldItem: AdvancedUserItem, newItem: AdvancedUserItem): Boolean =
54+
oldItem == newItem
55+
}
56+
}
57+
}

app/src/main/java/com/nextcloud/talk/account/SwitchAccountActivity.kt

Lines changed: 18 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
/*
22
* Nextcloud Talk - Android Client
33
*
4-
* SPDX-FileCopyrightText: 2023 Marcel Hibbe <dev@mhibbe.de>
5-
* SPDX-FileCopyrightText: 2022 Andy Scherzinger <info@andy-scherzinger.de>
6-
* SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
4+
* SPDX-FileCopyrightText: 2017-2026 Nextcloud GmbH and Nextcloud contributors
75
* SPDX-License-Identifier: GPL-3.0-or-later
86
*/
97
package com.nextcloud.talk.account
@@ -33,9 +31,6 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_BASE_URL
3331
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_IS_ACCOUNT_IMPORT
3432
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_TOKEN
3533
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USERNAME
36-
import eu.davidea.flexibleadapter.FlexibleAdapter
37-
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
38-
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
3934
import org.osmdroid.config.Configuration
4035
import java.net.CookieManager
4136
import javax.inject.Inject
@@ -54,30 +49,10 @@ class SwitchAccountActivity : BaseActivity() {
5449
@Inject
5550
lateinit var cookieManager: CookieManager
5651

57-
private var adapter: FlexibleAdapter<AbstractFlexibleItem<*>>? = null
58-
private val userItems: MutableList<AbstractFlexibleItem<*>> = ArrayList()
52+
private var adapter: AccountItemAdapter? = null
53+
private val userItems: MutableList<AdvancedUserItem> = ArrayList()
5954
private var isAccountImport = false
6055

61-
private val onImportItemClickListener = FlexibleAdapter.OnItemClickListener { _, position ->
62-
if (userItems.size > position) {
63-
val account = (userItems[position] as AdvancedUserItem).account
64-
reauthorizeFromImport(account)
65-
}
66-
true
67-
}
68-
69-
private val onSwitchItemClickListener = FlexibleAdapter.OnItemClickListener { _, position ->
70-
if (userItems.size > position) {
71-
val user = (userItems[position] as AdvancedUserItem).user
72-
73-
if (userManager.setUserAsActive(user!!).blockingGet()) {
74-
cookieManager.cookieStore.removeAll()
75-
finish()
76-
}
77-
}
78-
true
79-
}
80-
8156
@SuppressLint("SourceLockedOrientationActivity")
8257
override fun onCreate(savedInstanceState: Bundle?) {
8358
super.onCreate(savedInstanceState)
@@ -117,7 +92,17 @@ class SwitchAccountActivity : BaseActivity() {
11792
super.onResume()
11893

11994
if (adapter == null) {
120-
adapter = FlexibleAdapter(userItems, this, false)
95+
adapter = AccountItemAdapter { item ->
96+
if (isAccountImport) {
97+
reauthorizeFromImport(item.account)
98+
} else {
99+
if (userManager.setUserAsActive(item.user!!).blockingGet()) {
100+
cookieManager.cookieStore.removeAll()
101+
finish()
102+
}
103+
}
104+
}
105+
121106
var participant: Participant
122107

123108
if (!isAccountImport) {
@@ -132,11 +117,9 @@ class SwitchAccountActivity : BaseActivity() {
132117
participant.actorType = Participant.ActorType.USERS
133118
participant.actorId = userId
134119
participant.displayName = user.displayName
135-
userItems.add(AdvancedUserItem(participant, user, null, viewThemeUtils, 0))
120+
userItems.add(AdvancedUserItem(participant, user, null, 0))
136121
}
137122
}
138-
adapter!!.addListener(onSwitchItemClickListener)
139-
adapter!!.updateDataSet(userItems, false)
140123
} else {
141124
var account: Account
142125
var importAccount: ImportAccount
@@ -150,18 +133,16 @@ class SwitchAccountActivity : BaseActivity() {
150133
participant.displayName = importAccount.getUsername()
151134
user = User()
152135
user.baseUrl = importAccount.getBaseUrl()
153-
userItems.add(AdvancedUserItem(participant, user, account, viewThemeUtils, 0))
136+
userItems.add(AdvancedUserItem(participant, user, account, 0))
154137
}
155-
adapter!!.addListener(onImportItemClickListener)
156-
adapter!!.updateDataSet(userItems, false)
157138
}
139+
adapter!!.submitList(userItems)
158140
}
159141
prepareViews()
160142
}
161143

162144
private fun prepareViews() {
163-
val layoutManager: LinearLayoutManager = SmoothScrollLinearLayoutManager(this)
164-
binding.recyclerView.layoutManager = layoutManager
145+
binding.recyclerView.layoutManager = LinearLayoutManager(this)
165146
binding.recyclerView.setHasFixedSize(true)
166147
binding.recyclerView.adapter = adapter
167148
}
Lines changed: 3 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,21 @@
11
/*
22
* Nextcloud Talk - Android Client
33
*
4-
* SPDX-FileCopyrightText: 2022 Andy Scherzinger <infoi@andy-scherzinger.de>
5-
* SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
4+
* SPDX-FileCopyrightText: 2017-2026 Nextcloud GmbH and Nextcloud contributors
65
* SPDX-License-Identifier: GPL-3.0-or-later
76
*/
87
package com.nextcloud.talk.adapters.items
98

109
import android.accounts.Account
11-
import android.text.TextUtils
12-
import android.view.View
13-
import androidx.core.net.toUri
14-
import androidx.recyclerview.widget.RecyclerView
15-
import com.nextcloud.talk.R
16-
import com.nextcloud.talk.adapters.items.AdvancedUserItem.UserItemViewHolder
1710
import com.nextcloud.talk.data.user.model.User
18-
import com.nextcloud.talk.databinding.AccountItemBinding
19-
import com.nextcloud.talk.extensions.loadUserAvatar
2011
import com.nextcloud.talk.models.json.participants.Participant
21-
import com.nextcloud.talk.ui.theme.ViewThemeUtils
22-
import eu.davidea.flexibleadapter.FlexibleAdapter
23-
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
24-
import eu.davidea.flexibleadapter.items.IFilterable
25-
import eu.davidea.flexibleadapter.items.IFlexible
26-
import eu.davidea.viewholders.FlexibleViewHolder
27-
import java.util.regex.Pattern
2812

2913
class AdvancedUserItem(
30-
/**
31-
* @return the model object
32-
*/
3314
val model: Participant,
3415
@JvmField val user: User?,
3516
val account: Account?,
36-
private val viewThemeUtils: ViewThemeUtils,
37-
private val actionRequiredCount: Int
38-
) : AbstractFlexibleItem<UserItemViewHolder>(),
39-
IFilterable<String?> {
40-
17+
val actionRequiredCount: Int
18+
) {
4119
override fun equals(other: Any?): Boolean =
4220
if (other is AdvancedUserItem) {
4321
model == other.model
@@ -46,64 +24,4 @@ class AdvancedUserItem(
4624
}
4725

4826
override fun hashCode(): Int = model.hashCode()
49-
50-
override fun getLayoutRes(): Int = R.layout.account_item
51-
52-
override fun createViewHolder(
53-
view: View?,
54-
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>?
55-
): UserItemViewHolder = UserItemViewHolder(view, adapter)
56-
57-
override fun bindViewHolder(
58-
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
59-
holder: UserItemViewHolder,
60-
position: Int,
61-
payloads: MutableList<Any>
62-
) {
63-
if (adapter.hasFilter()) {
64-
viewThemeUtils.talk.themeAndHighlightText(
65-
holder.binding.userName,
66-
model.displayName,
67-
adapter.getFilter(String::class.java).toString()
68-
)
69-
} else {
70-
holder.binding.userName.text = model.displayName
71-
}
72-
if (user != null && !TextUtils.isEmpty(user.baseUrl)) {
73-
val host = user.baseUrl!!.toUri().host
74-
if (!TextUtils.isEmpty(host)) {
75-
holder.binding.account.text = user.baseUrl!!.toUri().host
76-
} else {
77-
holder.binding.account.text = user.baseUrl
78-
}
79-
}
80-
if (user?.baseUrl != null &&
81-
(user.baseUrl!!.startsWith("http://") || user.baseUrl!!.startsWith("https://"))
82-
) {
83-
holder.binding.userIcon.loadUserAvatar(user, model.calculatedActorId!!, true, false)
84-
}
85-
if (actionRequiredCount > 0) {
86-
holder.binding.actionRequired.visibility = View.VISIBLE
87-
} else {
88-
holder.binding.actionRequired.visibility = View.GONE
89-
}
90-
}
91-
92-
override fun filter(constraint: String?): Boolean =
93-
model.displayName != null &&
94-
Pattern
95-
.compile(constraint, Pattern.CASE_INSENSITIVE or Pattern.LITERAL)
96-
.matcher(model.displayName!!.trim())
97-
.find()
98-
99-
class UserItemViewHolder(view: View?, adapter: FlexibleAdapter<*>?) : FlexibleViewHolder(view, adapter) {
100-
var binding: AccountItemBinding
101-
102-
/**
103-
* Default constructor.
104-
*/
105-
init {
106-
binding = AccountItemBinding.bind(view!!)
107-
}
108-
}
10927
}

app/src/main/java/com/nextcloud/talk/adapters/items/NotificationSoundItem.java

Lines changed: 0 additions & 95 deletions
This file was deleted.

0 commit comments

Comments
 (0)