add setting for call integration

Daniel Gultsch created

Change summary

CHANGELOG.md                                                                                 |  2 
src/main/java/eu/siacs/conversations/AppSettings.java                                        |  5 
src/main/java/eu/siacs/conversations/services/CallIntegration.java                           | 15 
src/main/java/eu/siacs/conversations/ui/fragment/settings/NotificationsSettingsFragment.java |  9 
src/main/res/drawable/ic_mobile_friendly_24dp.xml                                            | 10 
src/main/res/values/defaults.xml                                                             |  1 
src/main/res/values/strings.xml                                                              |  2 
src/main/res/xml/preferences_notifications.xml                                               |  8 
8 files changed, 38 insertions(+), 14 deletions(-)

Detailed changes

CHANGELOG.md 🔗

@@ -3,7 +3,7 @@
 ### Version 2.17.5
 
 * Move message bubbles closer together instead of merging them
-* Add ability to hide avatars in chat views when not stricly necessary (Settings -> Interface -> Chat Bubbles -> Show avatars)
+* Add ability to hide avatars in chat view when not strictly necessary (Settings -> Interface -> Chat Bubbles -> Show avatars)
 
 ### Version 2.17.4
 

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

@@ -43,6 +43,7 @@ public class AppSettings {
     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";
+    public static final String CALL_INTEGRATION = "call_integration";
 
     private static final String ACCEPT_INVITES_FROM_STRANGERS = "accept_invites_from_strangers";
     private static final String INSTALLATION_ID = "im.conversations.android.install_id";
@@ -110,6 +111,10 @@ public class AppSettings {
         return getBooleanPreference(SHOW_AVATARS, R.bool.show_avatars);
     }
 
+    public boolean isCallIntegration() {
+        return getBooleanPreference(CALL_INTEGRATION, R.bool.call_integration);
+    }
+
     public boolean isUseTor() {
         return getBooleanPreference(USE_TOR, R.bool.use_tor);
     }

src/main/java/eu/siacs/conversations/services/CallIntegration.java 🔗

@@ -12,22 +12,19 @@ import android.telecom.CallEndpoint;
 import android.telecom.Connection;
 import android.telecom.DisconnectCause;
 import android.util.Log;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-
+import eu.siacs.conversations.AppSettings;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.ui.util.MainThreadExecutor;
 import eu.siacs.conversations.xmpp.Jid;
 import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
 import eu.siacs.conversations.xmpp.jingle.Media;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -46,7 +43,7 @@ public class CallIntegration extends Connection {
      * SecurityException
      */
     private static final List<String> BROKEN_DEVICE_MODELS =
-            Arrays.asList("gtaxlwifi", "a5y17lte", "YT-X705F");
+            Arrays.asList("gtaxlwifi", "a5y17lte", "YT-X705F", "HWAGS2");
 
     /**
      * all Realme devices at least up to and including Android 11 are broken
@@ -525,13 +522,17 @@ public class CallIntegration extends Connection {
         return selfManaged(context);
     }
 
-    public static boolean selfManaged(final Context context) {
+    public static boolean selfManagedAvailable(final Context context) {
         return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
                 && Build.VERSION.SDK_INT < 35
                 && hasSystemFeature(context)
                 && isDeviceModelSupported();
     }
 
+    public static boolean selfManaged(final Context context) {
+        return selfManagedAvailable(context) && new AppSettings(context).isCallIntegration();
+    }
+
     public static boolean hasSystemFeature(final Context context) {
         final var packageManager = context.getPackageManager();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@@ -559,7 +560,7 @@ public class CallIntegration extends Connection {
         }
         // SailfishOS's AppSupport do not support Call Integration
         if (Build.MODEL.endsWith("(AppSupport)")) {
-			return false;
+            return false;
         }
         return true;
     }

src/main/java/eu/siacs/conversations/ui/fragment/settings/NotificationsSettingsFragment.java 🔗

@@ -10,17 +10,15 @@ import android.os.Bundle;
 import android.provider.Settings;
 import android.util.Log;
 import android.widget.Toast;
-
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.preference.Preference;
-
 import com.google.common.base.Optional;
-
 import eu.siacs.conversations.AppSettings;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
+import eu.siacs.conversations.services.CallIntegration;
 import eu.siacs.conversations.services.NotificationService;
 import eu.siacs.conversations.ui.activity.result.PickRingtone;
 import eu.siacs.conversations.utils.Compatibility;
@@ -66,13 +64,15 @@ public class NotificationsSettingsFragment extends XmppPreferenceFragment {
         final var notificationVibrate = findPreference(AppSettings.NOTIFICATION_VIBRATE);
         final var notificationLed = findPreference(AppSettings.NOTIFICATION_LED);
         final var foregroundService = findPreference(AppSettings.KEEP_FOREGROUND_SERVICE);
+        final var callIntegration = findPreference(AppSettings.CALL_INTEGRATION);
         if (messageNotificationSettings == null
                 || fullscreenNotification == null
                 || notificationRingtone == null
                 || notificationHeadsUp == null
                 || notificationVibrate == null
                 || notificationLed == null
-                || foregroundService == null) {
+                || foregroundService == null
+                || callIntegration == null) {
             throw new IllegalStateException("The preference resource file is missing preferences");
         }
         if (Compatibility.runsTwentySix()) {
@@ -91,6 +91,7 @@ public class NotificationsSettingsFragment extends XmppPreferenceFragment {
                         .canUseFullScreenIntent()) {
             fullscreenNotification.setVisible(false);
         }
+        callIntegration.setVisible(CallIntegration.selfManagedAvailable(requireContext()));
     }
 
     @Override

src/main/res/drawable/ic_mobile_friendly_24dp.xml 🔗

@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?attr/colorControlNormal"
+    android:viewportWidth="960"
+    android:viewportHeight="960">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M240,920Q207,920 183.5,896.5Q160,873 160,840L160,120Q160,87 183.5,63.5Q207,40 240,40L640,40Q673,40 696.5,63.5Q720,87 720,120L720,280L640,280L640,240L240,240L240,720L640,720L640,680L720,680L720,840Q720,873 696.5,896.5Q673,920 640,920L240,920ZM240,800L240,840Q240,840 240,840Q240,840 240,840L640,840Q640,840 640,840Q640,840 640,840L640,800L240,800ZM598,640L428,470L484,414L598,528L824,302L880,358L598,640ZM240,160L640,160L640,120Q640,120 640,120Q640,120 640,120L240,120Q240,120 240,120Q240,120 240,120L240,160ZM240,160L240,120Q240,120 240,120Q240,120 240,120L240,120Q240,120 240,120Q240,120 240,120L240,160ZM240,800L240,800L240,840Q240,840 240,840Q240,840 240,840L240,840Q240,840 240,840Q240,840 240,840L240,800Z" />
+</vector>

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

@@ -48,4 +48,5 @@
     <string name="default_push_server">up.conversations.im</string>
     <string name="default_push_account">none</string>
     <bool name="require_channel_binding">false</bool>
+    <bool name="call_integration">true</bool>
 </resources>

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

@@ -1093,4 +1093,6 @@
     <string name="pref_chat_bubbles">Chat bubbles</string>
     <string name="pref_chat_bubbles_summary">Background color, Font size, Avatars</string>
     <string name="pref_title_bubbles">Chat Bubbles</string>
+    <string name="pref_call_integration">Call integration</string>
+    <string name="pref_call_integration_summary">Calls from this app interact with regular phone calls, such as ending one call when another starts.</string>
 </resources>

src/main/res/xml/preferences_notifications.xml 🔗

@@ -38,8 +38,6 @@
         android:key="led"
         android:summary="@string/pref_led_summary"
         android:title="@string/pref_led" />
-
-
     <Preference
         android:icon="@drawable/ic_phone_24dp"
         android:key="call_ringtone"
@@ -51,6 +49,12 @@
         android:key="fullscreen_notification"
         android:summary="@string/pref_fullscreen_notification_summary"
         android:title="@string/pref_fullscreen_notification" />
+    <SwitchPreferenceCompat
+        android:defaultValue="@bool/call_integration"
+        android:icon="@drawable/ic_mobile_friendly_24dp"
+        android:key="call_integration"
+        android:summary="@string/pref_call_integration_summary"
+        android:title="@string/pref_call_integration" />
     <ListPreference
         android:defaultValue="@integer/grace_period"
         android:entries="@array/grace_periods"