Global setting to disable link previews

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/AppSettings.java               |  5 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 29 
src/main/res/values/defaults.xml                                    |  1 
src/main/res/xml/preferences_interface.xml                          |  6 
4 files changed, 28 insertions(+), 13 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/AppSettings.java 🔗

@@ -45,6 +45,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_LINK_PREVIEWS = "show_link_previews";
 
     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 +109,10 @@ public class AppSettings {
         return getBooleanPreference(LARGE_FONT, R.bool.large_font);
     }
 
+    public boolean showLinkPreviews() {
+        return getBooleanPreference(SHOW_LINK_PREVIEWS, R.bool.show_link_previews);
+    }
+
     public boolean isUseTor() {
         return getBooleanPreference(USE_TOR, R.bool.use_tor);
     }

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -164,6 +164,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
     private final boolean mForceNames;
     private final Map<String, WebxdcUpdate> lastWebxdcUpdate = new HashMap<>();
     private String selectionUuid = null;
+    private final AppSettings appSettings;
 
     public MessageAdapter(
             final XmppActivity activity, final List<Message> messages, final boolean forceNames) {
@@ -171,6 +172,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         this.audioPlayer = new AudioPlayer(this);
         this.activity = activity;
         metrics = getContext().getResources().getDisplayMetrics();
+        appSettings = new AppSettings(activity);
         updatePreferences();
         this.mForceNames = forceNames;
     }
@@ -1541,18 +1543,20 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 setTextColor(viewHolder.inReplyTo, bubbleColor);
             }
 
-            final var descriptions = message.getLinkDescriptions();
-            viewHolder.link_descriptions.setAdapter(new ArrayAdapter<>(activity, 0, descriptions) {
-                @Override
-                public View getView(int position, View view, @NonNull ViewGroup parent) {
-                    final LinkDescriptionBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.link_description, parent, false);
-                    binding.title.setText(getItem(position).findChildContent("title", "https://ogp.me/ns#"));
-                    binding.description.setText(getItem(position).findChildContent("description", "https://ogp.me/ns#"));
-                    binding.url.setText(getItem(position).findChildContent("url", "https://ogp.me/ns#"));
-                    return binding.getRoot();
-                }
-            });
-            Util.justifyListViewHeightBasedOnChildren(viewHolder.link_descriptions, (int)(metrics.density * 100), true);
+            if (appSettings.showLinkPreviews()) {
+                final var descriptions = message.getLinkDescriptions();
+                viewHolder.link_descriptions.setAdapter(new ArrayAdapter<>(activity, 0, descriptions) {
+                    @Override
+                    public View getView(int position, View view, @NonNull ViewGroup parent) {
+                        final LinkDescriptionBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.link_description, parent, false);
+                        binding.title.setText(getItem(position).findChildContent("title", "https://ogp.me/ns#"));
+                        binding.description.setText(getItem(position).findChildContent("description", "https://ogp.me/ns#"));
+                        binding.url.setText(getItem(position).findChildContent("url", "https://ogp.me/ns#"));
+                        return binding.getRoot();
+                    }
+                });
+                Util.justifyListViewHeightBasedOnChildren(viewHolder.link_descriptions, (int)(metrics.density * 100), true);
+            }
         }
 
         displayStatus(viewHolder, message, type, bubbleColor);
@@ -1626,7 +1630,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
     }
 
     public void updatePreferences() {
-        final AppSettings appSettings = new AppSettings(activity);
         this.bubbleDesign =
                 new BubbleDesign(appSettings.isColorfulChatBubbles(), appSettings.isLargeFont());
     }

src/main/res/values/defaults.xml 🔗

@@ -52,6 +52,7 @@
     <bool name="enable_quiet_hours">false</bool>
     <bool name="autojoin">true</bool>
     <bool name="send_link_previews">true</bool>
+    <bool name="show_link_previews">true</bool>
     <bool name="compose_rich_text">true</bool>
     <bool name="auto_accept_unmetered">true</bool>
 </resources>

src/main/res/xml/preferences_interface.xml 🔗

@@ -99,6 +99,12 @@
             android:key="show_dynamic_tags"
             android:summary="@string/pref_show_dynamic_tags_summary"
             android:title="@string/pref_show_dynamic_tags" />
+        <SwitchPreferenceCompat
+            android:defaultValue="@bool/show_link_previews"
+            android:icon="@drawable/ic_link_24dp"
+            android:key="show_link_previews"
+            android:summary="When a sender has included link descriptions, show them"
+            android:title="Show Link Previews" />
     </PreferenceCategory>
     <PreferenceCategory android:title="@string/pref_category_operating_system">
         <SwitchPreferenceCompat