add permission check to placeCall method

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/CallIntegrationConnectionService.java | 11 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java                   | 30 
src/main/res/values/strings.xml                                                     |  1 
3 files changed, 24 insertions(+), 18 deletions(-)

Detailed changes

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

@@ -1,9 +1,11 @@
 package eu.siacs.conversations.services;
 
+import android.Manifest;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
@@ -17,6 +19,7 @@ import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
 import android.util.Log;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
 
@@ -25,6 +28,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
 
 import eu.siacs.conversations.Config;
+import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.ui.RtpSessionActivity;
 import eu.siacs.conversations.xmpp.Jid;
@@ -221,7 +225,6 @@ public class CallIntegrationConnectionService extends ConnectionService {
             final Account account,
             final Jid with,
             final Set<Media> media) {
-        Log.d(Config.LOGTAG, "place call media=" + media);
         if (CallIntegration.selfManaged()) {
             final var extras = new Bundle();
             extras.putParcelable(
@@ -231,6 +234,12 @@ public class CallIntegrationConnectionService extends ConnectionService {
                     Media.audioOnly(media)
                             ? VideoProfile.STATE_AUDIO_ONLY
                             : VideoProfile.STATE_BIDIRECTIONAL);
+            if (service.checkSelfPermission(Manifest.permission.MANAGE_OWN_CALLS)
+                    != PackageManager.PERMISSION_GRANTED) {
+                Toast.makeText(service, R.string.no_permission_to_place_call, Toast.LENGTH_SHORT)
+                        .show();
+                return;
+            }
             service.getSystemService(TelecomManager.class)
                     .placeCall(CallIntegration.address(with), extras);
         } else {

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -1981,26 +1981,22 @@ public class ConversationFragment extends XmppFragment
     }
 
     private boolean hasPermissions(int requestCode, List<String> permissions) {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            final List<String> missingPermissions = new ArrayList<>();
-            for (String permission : permissions) {
-                if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU || Config.ONLY_INTERNAL_STORAGE) && permission.equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
-                    continue;
-                }
-                if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
-                    missingPermissions.add(permission);
-                }
+        final List<String> missingPermissions = new ArrayList<>();
+        for (String permission : permissions) {
+            if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU || Config.ONLY_INTERNAL_STORAGE) && permission.equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
+                continue;
             }
-            if (missingPermissions.size() == 0) {
-                return true;
-            } else {
-                requestPermissions(
-                        missingPermissions.toArray(new String[0]),
-                        requestCode);
-                return false;
+            if (activity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
+                missingPermissions.add(permission);
             }
-        } else {
+        }
+        if (missingPermissions.size() == 0) {
             return true;
+        } else {
+            requestPermissions(
+                    missingPermissions.toArray(new String[0]),
+                    requestCode);
+            return false;
         }
     }
 

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

@@ -595,6 +595,7 @@
     <string name="me">Me</string>
     <string name="contact_asks_for_presence_subscription">Contact asks for presence subscription</string>
     <string name="allow">Allow</string>
+    <string name="no_permission_to_place_call">No permission to place phone call</string>
     <string name="no_permission_to_access_x">No permission to access %s</string>
     <string name="remote_server_not_found">Remote server not found</string>
     <string name="remote_server_timeout">Remote server timeout</string>