From 3c210ca437e2e4a15ba70f33f035eb6e544e89ab Mon Sep 17 00:00:00 2001 From: Brice-W Date: Mon, 19 Apr 2021 10:46:19 +1000 Subject: [PATCH 1/6] optimization on contacts selection --- .../securesms/loki/activities/SelectContactsAdapter.kt | 8 ++++---- .../org/thoughtcrime/securesms/loki/views/UserView.kt | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt index 135762f661..c81c0e38d3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt @@ -26,7 +26,7 @@ class SelectContactsAdapter(private val context: Context, private val glide: Gli override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { val member = members[position] - viewHolder.view.setOnClickListener { onMemberClick(member) } + viewHolder.view.setOnClickListener { onMemberClick(viewHolder, member) } val isSelected = selectedMembers.contains(member) viewHolder.view.bind(Recipient.from( context, @@ -36,13 +36,13 @@ class SelectContactsAdapter(private val context: Context, private val glide: Gli isSelected) } - private fun onMemberClick(member: String) { + private fun onMemberClick(viewHolder: ViewHolder, member: String) { if (selectedMembers.contains(member)) { selectedMembers.remove(member) + viewHolder.view.toggleCheckbox() } else { selectedMembers.add(member) + viewHolder.view.toggleCheckbox(true) } - val index = members.indexOf(member) - notifyItemChanged(index) } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt index 4c6098a710..ae9f001f5c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt @@ -82,6 +82,11 @@ class UserView : LinearLayout { } } + fun toggleCheckbox(isSelected: Boolean = false) { + actionIndicatorImageView.visibility = View.VISIBLE + actionIndicatorImageView.setImageResource(if (isSelected) R.drawable.ic_circle_check else R.drawable.ic_circle) + } + fun unbind() { } From cba4e65b9e15022c2b164883e54962b946def490 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Mon, 19 Apr 2021 13:35:09 +1000 Subject: [PATCH 2/6] update with payload logic --- .../loki/activities/SelectContactsAdapter.kt | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt index c81c0e38d3..4fb31d9fdb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt @@ -26,7 +26,7 @@ class SelectContactsAdapter(private val context: Context, private val glide: Gli override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) { val member = members[position] - viewHolder.view.setOnClickListener { onMemberClick(viewHolder, member) } + viewHolder.view.setOnClickListener { onMemberClick(member) } val isSelected = selectedMembers.contains(member) viewHolder.view.bind(Recipient.from( context, @@ -36,13 +36,39 @@ class SelectContactsAdapter(private val context: Context, private val glide: Gli isSelected) } - private fun onMemberClick(viewHolder: ViewHolder, member: String) { - if (selectedMembers.contains(member)) { - selectedMembers.remove(member) - viewHolder.view.toggleCheckbox() + override fun onBindViewHolder(viewHolder: ViewHolder, + position: Int, + payloads: MutableList) { + if (payloads.isNotEmpty()) { + // Because these updates can be batched, + // there can be multiple payloads for a single bind + when (payloads[0]) { + Payload.MEMBER_CLICKED -> { + val member = members[position] + val isSelected = selectedMembers.contains(member) + viewHolder.view.toggleCheckbox(isSelected) + } + } } else { - selectedMembers.add(member) - viewHolder.view.toggleCheckbox(true) + // When payload list is empty, + // or we don't have logic to handle a given type, + // default to full bind: + this.onBindViewHolder(viewHolder, position) } } + + private fun onMemberClick(member: String) { + if (selectedMembers.contains(member)) { + selectedMembers.remove(member) + } else { + selectedMembers.add(member) + } + val index = members.indexOf(member) + notifyItemChanged(index, Payload.MEMBER_CLICKED) + } + + // define below the different events used to notify the adapter + enum class Payload { + MEMBER_CLICKED + } } \ No newline at end of file From b92f2e79048b10f72d7a14895507fb554e77263f Mon Sep 17 00:00:00 2001 From: Brice-W Date: Mon, 19 Apr 2021 13:36:42 +1000 Subject: [PATCH 3/6] clean --- .../main/java/org/thoughtcrime/securesms/loki/views/UserView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt index ae9f001f5c..19642a6c87 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/UserView.kt @@ -91,4 +91,4 @@ class UserView : LinearLayout { } // endregion -} \ No newline at end of file +} From be2692fec672cbf5cb3fe00d81752879b2d10b04 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Mon, 19 Apr 2021 13:37:34 +1000 Subject: [PATCH 4/6] clean --- .../securesms/loki/activities/SelectContactsAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt index 4fb31d9fdb..e8bbede270 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SelectContactsAdapter.kt @@ -71,4 +71,4 @@ class SelectContactsAdapter(private val context: Context, private val glide: Gli enum class Payload { MEMBER_CLICKED } -} \ No newline at end of file +} From 10554011f8b1873afa55fd87fecf41198cb9d2f1 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 20 Apr 2021 09:39:51 +1000 Subject: [PATCH 5/6] avoid displaying self in the contacts list --- .../securesms/loki/activities/CreateClosedGroupActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt index 2ad317bdba..bebbc58856 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt @@ -32,6 +32,10 @@ class CreateClosedGroupActivity : PassphraseRequiredActionBarActivity(), LoaderM set(newValue) { field = newValue; invalidateOptionsMenu() } private var members = listOf() set(value) { field = value; selectContactsAdapter.members = value } + private val publicKey: String + get() { + return TextSecurePreferences.getLocalNumber(this)!! + } private val selectContactsAdapter by lazy { SelectContactsAdapter(this, GlideApp.with(this)) @@ -72,7 +76,7 @@ class CreateClosedGroupActivity : PassphraseRequiredActionBarActivity(), LoaderM } private fun update(members: List) { - this.members = members + this.members = members.minus(publicKey) mainContentContainer.visibility = if (members.isEmpty()) View.GONE else View.VISIBLE emptyStateContainer.visibility = if (members.isEmpty()) View.VISIBLE else View.GONE invalidateOptionsMenu() From f9de34f9479ad9752fd30f6933d510a83aebdd87 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 20 Apr 2021 09:45:29 +1000 Subject: [PATCH 6/6] comment --- .../securesms/loki/activities/CreateClosedGroupActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt index bebbc58856..f3a7f94bd4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreateClosedGroupActivity.kt @@ -76,6 +76,7 @@ class CreateClosedGroupActivity : PassphraseRequiredActionBarActivity(), LoaderM } private fun update(members: List) { + //if there is a Note to self conversation, it loads self in the list, so we need to remove it here this.members = members.minus(publicKey) mainContentContainer.visibility = if (members.isEmpty()) View.GONE else View.VISIBLE emptyStateContainer.visibility = if (members.isEmpty()) View.VISIBLE else View.GONE