From 2c37eecfe7d1661c5e3f9ee64ee3723b2ef78505 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 29 Nov 2024 11:41:42 +0100 Subject: [PATCH] add setting to disable avatars on message bubbles --- .../eu/siacs/conversations/AppSettings.java | 8 ++- .../ui/adapter/MessageAdapter.java | 55 +++++++++++++++++-- .../InterfaceBubblesSettingsFragment.java | 19 +++++++ .../res/drawable/ic_account_circle_24dp.xml | 12 ++++ src/main/res/drawable/ic_colors_24dp.xml | 10 ++++ src/main/res/layout/item_message_received.xml | 2 +- src/main/res/layout/item_message_sent.xml | 4 +- src/main/res/values/defaults.xml | 1 + src/main/res/values/dimens.xml | 3 +- src/main/res/values/strings.xml | 5 ++ src/main/res/xml/preferences_interface.xml | 15 ++--- .../res/xml/preferences_interface_bubbles.xml | 21 +++++++ 12 files changed, 131 insertions(+), 24 deletions(-) create mode 100644 src/main/java/eu/siacs/conversations/ui/fragment/settings/InterfaceBubblesSettingsFragment.java create mode 100644 src/main/res/drawable/ic_account_circle_24dp.xml create mode 100644 src/main/res/drawable/ic_colors_24dp.xml create mode 100644 src/main/res/xml/preferences_interface_bubbles.xml diff --git a/src/main/java/eu/siacs/conversations/AppSettings.java b/src/main/java/eu/siacs/conversations/AppSettings.java index 4d39315244a607410df11496ec2ae8cab672a23a..2ce12e3278b28982b952d74061550a20ffd7a7c2 100644 --- a/src/main/java/eu/siacs/conversations/AppSettings.java +++ b/src/main/java/eu/siacs/conversations/AppSettings.java @@ -3,13 +3,10 @@ package eu.siacs.conversations; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; - import androidx.annotation.BoolRes; import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; - import com.google.common.base.Strings; - import java.security.SecureRandom; public class AppSettings { @@ -45,6 +42,7 @@ public class AppSettings { public static final String SEND_CRASH_REPORTS = "send_crash_reports"; public static final String COLORFUL_CHAT_BUBBLES = "use_green_background"; public static final String LARGE_FONT = "large_font"; + public static final String SHOW_AVATARS = "show_avatars"; private static final String ACCEPT_INVITES_FROM_STRANGERS = "accept_invites_from_strangers"; private static final String INSTALLATION_ID = "im.conversations.android.install_id"; @@ -108,6 +106,10 @@ public class AppSettings { return getBooleanPreference(LARGE_FONT, R.bool.large_font); } + public boolean isShowAvatars() { + return getBooleanPreference(SHOW_AVATARS, R.bool.show_avatars); + } + public boolean isUseTor() { return getBooleanPreference(USE_TOR, R.bool.use_tor); } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 1ad73d920f96a93a0de7fa37edb120fed16a584f..709c3186be200a579f2eacf4025faa7fc533c697 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -101,7 +101,7 @@ public class MessageAdapter extends ArrayAdapter { private final DisplayMetrics metrics; private OnContactPictureClicked mOnContactPictureClickedListener; private OnContactPictureLongClicked mOnContactPictureLongClickedListener; - private BubbleDesign bubbleDesign = new BubbleDesign(false, false); + private BubbleDesign bubbleDesign = new BubbleDesign(false, false, true); private final boolean mForceNames; public MessageAdapter( @@ -722,6 +722,7 @@ public class MessageAdapter extends ArrayAdapter { } } + @NonNull @Override public View getView(final int position, View view, final @NonNull ViewGroup parent) { final Message message = getItem(position); @@ -923,11 +924,21 @@ public class MessageAdapter extends ArrayAdapter { // sent and received bubbles final var mergeIntoTop = mergeIntoTop(position, message); final var mergeIntoBottom = mergeIntoBottom(position, message); - final var requiresAvatar = type == SENT ? !mergeIntoBottom : !mergeIntoTop; + final var showAvatar = + bubbleDesign.showAvatars + || (type == RECEIVED + && message.getConversation().getMode() + == Conversation.MODE_MULTI); setBubblePadding(viewHolder.root, mergeIntoTop, mergeIntoBottom); - setRequiresAvatar(viewHolder, requiresAvatar); + if (showAvatar) { + final var requiresAvatar = type == SENT ? !mergeIntoBottom : !mergeIntoTop; + setRequiresAvatar(viewHolder, requiresAvatar); + AvatarWorkerTask.loadAvatar(message, viewHolder.contact_picture, R.dimen.avatar); + } else { + viewHolder.contact_picture.setVisibility(View.GONE); + } + setAvatarDistance(viewHolder.message_box, type, showAvatar); viewHolder.message_box.setClipToOutline(true); - AvatarWorkerTask.loadAvatar(message, viewHolder.contact_picture, R.dimen.avatar); } resetClickListener(viewHolder.message_box, viewHolder.messageBody); @@ -1084,6 +1095,30 @@ public class MessageAdapter extends ArrayAdapter { return view; } + private void setAvatarDistance( + final LinearLayout messageBox, final int type, final boolean showAvatar) { + final ViewGroup.MarginLayoutParams layoutParams = + (ViewGroup.MarginLayoutParams) messageBox.getLayoutParams(); + if (showAvatar) { + final var resources = messageBox.getResources(); + if (type == RECEIVED) { + layoutParams.setMarginStart( + resources.getDimensionPixelSize(R.dimen.bubble_avatar_distance)); + layoutParams.setMarginEnd(0); + } else if (type == SENT) { + layoutParams.setMarginStart(0); + layoutParams.setMarginEnd( + resources.getDimensionPixelSize(R.dimen.bubble_avatar_distance)); + } else { + throw new AssertionError("Avatar distances are not available on this view type"); + } + } else { + layoutParams.setMarginStart(0); + layoutParams.setMarginEnd(0); + } + messageBox.setLayoutParams(layoutParams); + } + private void setBubblePadding( final ConstraintLayout root, final boolean mergeIntoTop, @@ -1254,7 +1289,10 @@ public class MessageAdapter extends ArrayAdapter { public void updatePreferences() { final AppSettings appSettings = new AppSettings(activity); this.bubbleDesign = - new BubbleDesign(appSettings.isColorfulChatBubbles(), appSettings.isLargeFont()); + new BubbleDesign( + appSettings.isColorfulChatBubbles(), + appSettings.isLargeFont(), + appSettings.isShowAvatars()); } public void setHighlightedTerm(List terms) { @@ -1375,10 +1413,15 @@ public class MessageAdapter extends ArrayAdapter { private static class BubbleDesign { public final boolean colorfulChatBubbles; public final boolean largeFont; + public final boolean showAvatars; - private BubbleDesign(final boolean colorfulChatBubbles, final boolean largeFont) { + private BubbleDesign( + final boolean colorfulChatBubbles, + final boolean largeFont, + final boolean showAvatars) { this.colorfulChatBubbles = colorfulChatBubbles; this.largeFont = largeFont; + this.showAvatars = showAvatars; } } diff --git a/src/main/java/eu/siacs/conversations/ui/fragment/settings/InterfaceBubblesSettingsFragment.java b/src/main/java/eu/siacs/conversations/ui/fragment/settings/InterfaceBubblesSettingsFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..73ff4df0b7f7793db77fb3e7195005457ca0cdac --- /dev/null +++ b/src/main/java/eu/siacs/conversations/ui/fragment/settings/InterfaceBubblesSettingsFragment.java @@ -0,0 +1,19 @@ +package eu.siacs.conversations.ui.fragment.settings; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import eu.siacs.conversations.R; + +public class InterfaceBubblesSettingsFragment extends XmppPreferenceFragment { + + @Override + public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) { + setPreferencesFromResource(R.xml.preferences_interface_bubbles, rootKey); + } + + @Override + public void onStart() { + super.onStart(); + requireActivity().setTitle(R.string.pref_title_bubbles); + } +} diff --git a/src/main/res/drawable/ic_account_circle_24dp.xml b/src/main/res/drawable/ic_account_circle_24dp.xml new file mode 100644 index 0000000000000000000000000000000000000000..25c7c244b325d55cda6b94c3a48f7019706eca77 --- /dev/null +++ b/src/main/res/drawable/ic_account_circle_24dp.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/src/main/res/drawable/ic_colors_24dp.xml b/src/main/res/drawable/ic_colors_24dp.xml new file mode 100644 index 0000000000000000000000000000000000000000..106cd34c100146f327ba89881c2041ad50ac0129 --- /dev/null +++ b/src/main/res/drawable/ic_colors_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/src/main/res/layout/item_message_received.xml b/src/main/res/layout/item_message_received.xml index 0df590d2446321be49c9328ed0b61802c6a314e6..74951d43dfef90c850ee07f63c8a92c957cb3d0d 100644 --- a/src/main/res/layout/item_message_received.xml +++ b/src/main/res/layout/item_message_received.xml @@ -23,7 +23,7 @@ android:id="@+id/message_box" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="6dp" + android:layout_marginStart="@dimen/bubble_avatar_distance" android:background="@drawable/background_message_bubble" android:backgroundTint="?colorTertiaryContainer" android:longClickable="true" diff --git a/src/main/res/layout/item_message_sent.xml b/src/main/res/layout/item_message_sent.xml index 8d328df7509cbfe2b91f65dc241300f5fbddf2be..ccf7a1f47a8913167182f9d50d3c4a3da9fc1319 100644 --- a/src/main/res/layout/item_message_sent.xml +++ b/src/main/res/layout/item_message_sent.xml @@ -15,14 +15,14 @@ android:scaleType="fitXY" app:layout_constraintBottom_toBottomOf="@id/message_box" app:layout_constraintEnd_toEndOf="parent" - app:riv_corner_radius="8dp" /> + app:riv_corner_radius="8dp"/> auto true false + true recent false true diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index d7bc0dcd51241cfa2223159e9de6602d1e2e3b84..41888854f4388e318e3c8ad0e4ca6cbdd61a6d1a 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -47,4 +47,5 @@ 4dp 1dp 48dp - + 6dp + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 6e4ce77ea3fa3076a86a2deb28db0a2184758708..eac59070a1cef8de8a847d29cdd7b9f01a3ddbd2 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1088,4 +1088,9 @@ More reactions Could not modify call Your contact’s XMPP client might not support audio/video calls. + Show avatars + Display avatars for your messages and in 1:1 chats, in addition to group chats. + Chat bubbles + Background color, Font size, Avatars + Chat Bubbles diff --git a/src/main/res/xml/preferences_interface.xml b/src/main/res/xml/preferences_interface.xml index 333edb03ab059bfaa311368b721b878d0da4068d..93b951440d8876ec6d6e0fd1f32d53552285f216 100644 --- a/src/main/res/xml/preferences_interface.xml +++ b/src/main/res/xml/preferences_interface.xml @@ -15,18 +15,11 @@ android:key="theme" android:title="@string/pref_light_dark_mode" app:useSimpleSummaryProvider="true" /> - - + app:fragment="eu.siacs.conversations.ui.fragment.settings.InterfaceBubblesSettingsFragment" + app:summary="@string/pref_chat_bubbles_summary" + app:title="@string/pref_chat_bubbles" /> + + + + + \ No newline at end of file