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..f90c1d2de8 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,31 @@ public void setSeenRecently(boolean enabled) {
seenRecentlyIndicator.setVisibility(enabled? View.VISIBLE : View.GONE);
}
+ public void setConnectivity(int connectivity) {
+ if (connectivity >= DcContext.DC_CONNECTIVITY_CONNECTED || connectivity >= DcContext.DC_CONNECTIVITY_WORKING) {
+ seenRecentlyIndicator.setVisibility(View.GONE);
+ return;
+ }
+
+ final int id;
+ 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("", 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
+ #ff0c16
#999999
#55444444