1package eu.siacs.conversations.utils;
  2
  3import android.Manifest;
  4import android.app.Activity;
  5import android.content.pm.PackageManager;
  6import android.os.Build;
  7
  8import androidx.core.app.ActivityCompat;
  9
 10import com.google.common.collect.ImmutableList;
 11import com.google.common.primitives.Ints;
 12
 13import java.util.ArrayList;
 14import java.util.List;
 15
 16public class PermissionUtils {
 17
 18    public static boolean allGranted(int[] grantResults) {
 19        for (int grantResult : grantResults) {
 20            if (grantResult != PackageManager.PERMISSION_GRANTED) {
 21                return false;
 22            }
 23        }
 24        return true;
 25    }
 26
 27    public static boolean writeGranted(final int[] grantResults, final String[] permissions) {
 28        return permissionGranted(
 29                Manifest.permission.WRITE_EXTERNAL_STORAGE, grantResults, permissions);
 30    }
 31
 32    public static boolean audioGranted(final int[] grantResults, final String[] permissions) {
 33        return permissionGranted(Manifest.permission.RECORD_AUDIO, grantResults, permissions);
 34    }
 35
 36    public static boolean cameraGranted(final int[] grantResults, final String[] permissions) {
 37        return permissionGranted(Manifest.permission.CAMERA, grantResults, permissions);
 38    }
 39
 40    private static boolean permissionGranted(
 41            final String permission, final int[] grantResults, final String[] permissions) {
 42        for (int i = 0; i < grantResults.length; ++i) {
 43            if (permission.equals(permissions[i])) {
 44                return grantResults[i] == PackageManager.PERMISSION_GRANTED;
 45            }
 46        }
 47        return false;
 48    }
 49
 50    public static String getFirstDenied(int[] grantResults, String[] permissions) {
 51        for (int i = 0; i < grantResults.length; ++i) {
 52            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
 53                return permissions[i];
 54            }
 55        }
 56        return null;
 57    }
 58
 59    public static class PermissionResult {
 60        public final String[] permissions;
 61        public final int[] grantResults;
 62
 63        public PermissionResult(String[] permissions, int[] grantResults) {
 64            this.permissions = permissions;
 65            this.grantResults = grantResults;
 66        }
 67    }
 68
 69    public static PermissionResult removeBluetoothConnect(
 70            final String[] inPermissions, final int[] inGrantResults) {
 71        final List<String> outPermissions = new ArrayList<>();
 72        final List<Integer> outGrantResults = new ArrayList<>();
 73        for (int i = 0; i < Math.min(inPermissions.length, inGrantResults.length); ++i) {
 74            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
 75                if (inPermissions[i].equals(Manifest.permission.BLUETOOTH_CONNECT)) {
 76                    continue;
 77                }
 78            }
 79            outPermissions.add(inPermissions[i]);
 80            outGrantResults.add(inGrantResults[i]);
 81        }
 82
 83        return new PermissionResult(
 84                outPermissions.toArray(new String[0]), Ints.toArray(outGrantResults));
 85    }
 86
 87    public static boolean hasPermission(
 88            final Activity activity, final List<String> permissions, final int requestCode) {
 89        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 90            final ImmutableList.Builder<String> missingPermissions = new ImmutableList.Builder<>();
 91            for (final String permission : permissions) {
 92                if (ActivityCompat.checkSelfPermission(activity, permission)
 93                        != PackageManager.PERMISSION_GRANTED) {
 94                    missingPermissions.add(permission);
 95                }
 96            }
 97            final ImmutableList<String> missing = missingPermissions.build();
 98            if (missing.size() == 0) {
 99                return true;
100            }
101            ActivityCompat.requestPermissions(
102                    activity, missing.toArray(new String[0]), requestCode);
103            return false;
104        } else {
105            return true;
106        }
107    }
108}