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}