From 4ed51b6b56e18f6b0a53a6beb817cbd33078f8bf Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 4 Feb 2025 22:38:15 +0100 Subject: [PATCH 1/3] show profiles connectivity state --- .../securesms/ConversationListActivity.java | 7 ++- .../AccountSelectionListFragment.java | 51 +++++++++++++------ .../accounts/AccountSelectionListItem.java | 14 +++-- .../securesms/components/AvatarView.java | 31 +++++++++++ ...status.xml => ic_circle_status_online.xml} | 2 +- .../layout/account_selection_list_item.xml | 5 +- src/main/res/layout/avatar_view.xml | 2 +- .../res/layout/conversation_list_activity.xml | 7 +-- src/main/res/values/colors.xml | 4 +- 9 files changed, 86 insertions(+), 37 deletions(-) rename src/main/res/drawable/{ic_circle_status.xml => ic_circle_status_online.xml} (72%) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index b02dbe6969..7b6fc3a31c 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -58,7 +58,7 @@ import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; -import org.thoughtcrime.securesms.components.AvatarImageView; +import org.thoughtcrime.securesms.components.AvatarView; import org.thoughtcrime.securesms.components.SearchToolbar; import org.thoughtcrime.securesms.connect.AccountManager; import org.thoughtcrime.securesms.connect.DcHelper; @@ -89,7 +89,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit private ConversationListFragment conversationListFragment; public TextView title; - private AvatarImageView selfAvatar; + private AvatarView selfAvatar; private ImageView unreadIndicator; private SearchFragment searchFragment; private SearchToolbar searchToolbar; @@ -300,6 +300,8 @@ public void refreshTitle() { boolean multiProfile = DcHelper.getAccounts(this).getAll().length > 1; String defText = multiProfile? DcHelper.getContext(this).getName() : getString(R.string.app_name); title.setText(DcHelper.getConnectivitySummary(this, defText)); + // refreshTitle is called by ConversationListFragment when connectivity changes so update connectivity dot here + selfAvatar.setConnectivity(DcHelper.getContext(this).getConnectivity()); getSupportActionBar().setDisplayHomeAsUpEnabled(false); } } @@ -352,6 +354,7 @@ public void refreshUnreadIndicator() { @Override public void onResume() { super.onResume(); + refreshTitle(); invalidateOptionsMenu(); DirectShareUtil.triggerRefreshDirectShare(this); } diff --git a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java index 800eda81ac..50248c1df0 100644 --- a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListFragment.java @@ -21,6 +21,7 @@ import com.b44t.messenger.DcAccounts; import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; +import com.b44t.messenger.DcEvent; import com.b44t.messenger.rpc.Rpc; import com.b44t.messenger.rpc.RpcException; @@ -29,6 +30,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.AvatarView; import org.thoughtcrime.securesms.connect.AccountManager; +import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; @@ -38,28 +40,21 @@ import static com.b44t.messenger.DcContact.DC_CONTACT_ID_ADD_ACCOUNT; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PRIVATE_TAG; -public class AccountSelectionListFragment extends DialogFragment +public class AccountSelectionListFragment extends DialogFragment implements DcEventCenter.DcEventDelegate { private RecyclerView recyclerView; + private AccountSelectionListAdapter adapter; @Override public void onActivityCreated(Bundle icicle) { super.onActivityCreated(icicle); - AccountSelectionListAdapter adapter = new AccountSelectionListAdapter(this, - GlideApp.with(getActivity()), - new ListClickListener()); + adapter = new AccountSelectionListAdapter(this, GlideApp.with(getActivity()), new ListClickListener()); recyclerView.setAdapter(adapter); - - DcAccounts accounts = DcHelper.getAccounts(getActivity()); - int[] accountIds = accounts.getAll(); - - int[] ids = new int[accountIds.length + 1]; - int j = 0; - for (int accountId : accountIds) { - ids[j++] = accountId; - } - ids[j] = DC_CONTACT_ID_ADD_ACCOUNT; - adapter.changeData(ids, accounts.getSelectedAccount().getAccountId()); + refreshData(); + DcEventCenter eventCenter = DcHelper.getEventCenter(requireActivity()); + eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CONNECTIVITY_CHANGED, this); + eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_INCOMING_MSG, this); + eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_MSGS_NOTICED, this); } @NonNull @@ -80,6 +75,32 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { return builder.setView(view).create(); } + @Override + public void onDestroy() { + super.onDestroy(); + DcHelper.getEventCenter(requireActivity()).removeObservers(this); + } + + @Override + public void handleEvent(@NonNull DcEvent event) { + refreshData(); + } + + private void refreshData() { + if (adapter == null) return; + + DcAccounts accounts = DcHelper.getAccounts(getActivity()); + int[] accountIds = accounts.getAll(); + + int[] ids = new int[accountIds.length + 1]; + int j = 0; + for (int accountId : accountIds) { + ids[j++] = accountId; + } + ids[j] = DC_CONTACT_ID_ADD_ACCOUNT; + adapter.changeData(ids, accounts.getSelectedAccount().getAccountId()); + } + @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); diff --git a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java index 1f136cb183..ee31d7abc4 100644 --- a/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java +++ b/src/main/java/org/thoughtcrime/securesms/accounts/AccountSelectionListItem.java @@ -20,7 +20,7 @@ import com.b44t.messenger.DcContext; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.AvatarImageView; +import org.thoughtcrime.securesms.components.AvatarView; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.ThemeUtil; @@ -28,7 +28,7 @@ public class AccountSelectionListItem extends LinearLayout { - private AvatarImageView contactPhotoImage; + private AvatarView contactPhotoImage; private View addrContainer; private TextView addrOrTagView; private TextView nameView; @@ -64,8 +64,11 @@ public void bind(@NonNull GlideRequests glideRequests, int accountId, DcContext int unreadCount = 0; boolean isMuted = dcContext.isMuted(); + Recipient recipient; if (accountId == DcContact.DC_CONTACT_ID_ADD_ACCOUNT) { name = getContext().getString(R.string.add_account); + recipient = null; + this.contactPhotoImage.setSeenRecently(false); // hide connectivity dot } else { self = dcContext.getContact(DcContact.DC_CONTACT_ID_SELF); name = dcContext.getConfig(CONFIG_DISPLAY_NAME); @@ -77,13 +80,8 @@ public void bind(@NonNull GlideRequests glideRequests, int accountId, DcContext addrOrTag = self.getAddr(); } unreadCount = dcContext.getFreshMsgs().length; - } - - Recipient recipient; - if (accountId != DcContact.DC_CONTACT_ID_ADD_ACCOUNT) { recipient = new Recipient(getContext(), self, name); - } else { - recipient = null; + this.contactPhotoImage.setConnectivity(dcContext.getConnectivity()); } this.contactPhotoImage.setAvatar(glideRequests, recipient, false); diff --git a/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java b/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java index 5ad6221a9b..c836af2861 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java +++ b/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.components; import android.content.Context; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; @@ -10,9 +11,13 @@ import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; +import com.amulyakhare.textdrawable.TextDrawable; +import com.b44t.messenger.DcContext; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.util.ViewUtil; public class AvatarView extends ConstraintLayout { @@ -61,6 +66,32 @@ public void setSeenRecently(boolean enabled) { seenRecentlyIndicator.setVisibility(enabled? View.VISIBLE : View.GONE); } + public void setConnectivity(int connectivity) { + final int id; + String text = ""; + if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTED) { + id = R.color.status_dot_online; + } else if (connectivity >= DcContext.DC_CONNECTIVITY_WORKING) { + text = "⇅"; + id = R.color.status_dot_online; + } else if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTING) { + id = R.color.status_dot_connecting; + } else { + id = R.color.status_dot_offline; + } + int size = ViewUtil.dpToPx(getContext(), 24); + seenRecentlyIndicator.setImageDrawable(TextDrawable.builder() + .beginConfig() + .width(size) + .height(size) + .textColor(Color.WHITE) + .fontSize(ViewUtil.dpToPx(getContext(), 23)) + .bold() + .endConfig() + .buildRound(text, getResources().getColor(id))); + seenRecentlyIndicator.setVisibility(View.VISIBLE); + } + public void clear(@NonNull GlideRequests glideRequests) { avatarImage.clear(glideRequests); } diff --git a/src/main/res/drawable/ic_circle_status.xml b/src/main/res/drawable/ic_circle_status_online.xml similarity index 72% rename from src/main/res/drawable/ic_circle_status.xml rename to src/main/res/drawable/ic_circle_status_online.xml index 9008196dad..b481cbb186 100644 --- a/src/main/res/drawable/ic_circle_status.xml +++ b/src/main/res/drawable/ic_circle_status_online.xml @@ -3,6 +3,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> - + diff --git a/src/main/res/layout/account_selection_list_item.xml b/src/main/res/layout/account_selection_list_item.xml index d576703979..72e30da72e 100644 --- a/src/main/res/layout/account_selection_list_item.xml +++ b/src/main/res/layout/account_selection_list_item.xml @@ -18,16 +18,13 @@ android:layout_width="45dp" android:layout_height="50dp"> - diff --git a/src/main/res/layout/avatar_view.xml b/src/main/res/layout/avatar_view.xml index edf76b431f..f175f8c8b4 100644 --- a/src/main/res/layout/avatar_view.xml +++ b/src/main/res/layout/avatar_view.xml @@ -26,7 +26,7 @@ app:layout_constraintTop_toTopOf="@+id/top_guideline" app:layout_constraintBottom_toBottomOf="parent" - android:src="@drawable/ic_circle_status" + android:src="@drawable/ic_circle_status_online" android:contentDescription="@null" android:visibility="gone" /> diff --git a/src/main/res/layout/conversation_list_activity.xml b/src/main/res/layout/conversation_list_activity.xml index fc0cbb0804..2766ecbc66 100644 --- a/src/main/res/layout/conversation_list_activity.xml +++ b/src/main/res/layout/conversation_list_activity.xml @@ -37,20 +37,17 @@ android:id="@+id/self_avatar_container" android:orientation="vertical" android:layout_width="wrap_content" - android:layout_height="match_parent"> - + #88000000 #505050 - #34c759 + #34c759 + #ffcc00 + #bdbdbd #999999 #55444444 From e28e6b9b73555ac36319e3ebeefc5e0e9c4af008 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 5 Feb 2025 15:26:00 +0100 Subject: [PATCH 2/3] don't display dot when connected --- .../securesms/components/AvatarView.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java b/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java index c836af2861..f90c1d2de8 100644 --- a/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java +++ b/src/main/java/org/thoughtcrime/securesms/components/AvatarView.java @@ -67,14 +67,13 @@ public void setSeenRecently(boolean enabled) { } public void setConnectivity(int connectivity) { + if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTED || connectivity >= DcContext.DC_CONNECTIVITY_WORKING) { + seenRecentlyIndicator.setVisibility(View.GONE); + return; + } + final int id; - String text = ""; - if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTED) { - id = R.color.status_dot_online; - } else if (connectivity >= DcContext.DC_CONNECTIVITY_WORKING) { - text = "⇅"; - id = R.color.status_dot_online; - } else if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTING) { + if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTING) { id = R.color.status_dot_connecting; } else { id = R.color.status_dot_offline; @@ -88,7 +87,7 @@ public void setConnectivity(int connectivity) { .fontSize(ViewUtil.dpToPx(getContext(), 23)) .bold() .endConfig() - .buildRound(text, getResources().getColor(id))); + .buildRound("", getResources().getColor(id))); seenRecentlyIndicator.setVisibility(View.VISIBLE); } From 78b3c3883d0c4daef99aeb6ea6b2145fc782fba1 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Wed, 5 Feb 2025 15:39:56 +0100 Subject: [PATCH 3/3] change offline color --- src/main/res/values/colors.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 1d80668b13..7de9df27cc 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -48,7 +48,7 @@ #505050 #34c759 #ffcc00 - #bdbdbd + #ff0c16 #999999 #55444444