/
PermissionsKernelService.java
133 lines (111 loc) · 4.76 KB
/
PermissionsKernelService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package host.exp.exponent.kernel.services;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import org.json.JSONException;
import org.json.JSONObject;
import host.exp.exponent.Constants;
import host.exp.exponent.kernel.ExperienceId;
import host.exp.exponent.storage.ExponentSharedPreferences;
public class PermissionsKernelService extends BaseKernelService {
private ExponentSharedPreferences mExponentSharedPreferences;
public PermissionsKernelService(Context context, ExponentSharedPreferences exponentSharedPreferences) {
super(context);
mExponentSharedPreferences = exponentSharedPreferences;
}
public void grantScopedPermissions(String permission, ExperienceId experienceId) {
try {
JSONObject metadata = mExponentSharedPreferences.getExperienceMetadata(experienceId.get());
if (metadata == null) {
metadata = new JSONObject();
}
JSONObject permissions;
if (metadata.has(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS)) {
permissions = metadata.getJSONObject(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS);
} else {
permissions = new JSONObject();
}
JSONObject permissionObject;
if (permissions.has(permission)) {
permissionObject = permissions.getJSONObject(permission);
} else {
permissionObject = new JSONObject();
}
permissionObject.put("status", "granted");
permissions.put(permission, permissionObject);
metadata.put(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS, permissions);
mExponentSharedPreferences.updateExperienceMetadata(experienceId.get(), metadata);
} catch (JSONException e) {
e.printStackTrace();
}
}
public void revokeScopedPermissions(String permission, ExperienceId experienceId) {
try {
JSONObject metadata = mExponentSharedPreferences.getExperienceMetadata(experienceId.get());
if (metadata == null) {
return;
}
if (metadata.has(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS)) {
JSONObject permissions = metadata.getJSONObject(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS);
if (permissions.has(permission)) {
permissions.remove(permission);
metadata.put(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS, permissions);
mExponentSharedPreferences.updateExperienceMetadata(experienceId.get(), metadata);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public boolean hasGrantedPermissions(String permission, ExperienceId experienceId) {
// we don't want to worry about per-experience permissions for shell apps
if (Constants.isStandaloneApp()) {
return true;
}
JSONObject metadata = mExponentSharedPreferences.getExperienceMetadata(experienceId.get());
if (metadata == null) {
return false;
}
try {
if (metadata.has(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS)) {
JSONObject permissions = metadata.getJSONObject(ExponentSharedPreferences.EXPERIENCE_METADATA_PERMISSIONS);
if (permissions.has(permission)) {
JSONObject permissionsObject = permissions.getJSONObject(permission);
return permissionsObject.has("status") &&
permissionsObject.getString("status").equals("granted");
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return false;
}
public int getPermissions(int globalPermissionStatus, PackageManager packageManager, String permission, ExperienceId experienceId) {
// only these permissions, which show a dialog to the user should be scoped.
boolean isDangerousPermission;
try {
isDangerousPermission = isDangerousPermission(permission, packageManager);
} catch (PackageManager.NameNotFoundException e) {
return PackageManager.PERMISSION_DENIED;
}
if (Constants.isStandaloneApp() || !isDangerousPermission) {
return globalPermissionStatus;
}
if (globalPermissionStatus == PackageManager.PERMISSION_GRANTED &&
hasGrantedPermissions(permission, experienceId)) {
return PackageManager.PERMISSION_GRANTED;
} else {
return PackageManager.PERMISSION_DENIED;
}
}
private boolean isDangerousPermission(String permission, PackageManager packageManager) throws PackageManager.NameNotFoundException {
PermissionInfo permissionInfo = packageManager.getPermissionInfo(permission, PackageManager.GET_META_DATA);
return (permissionInfo.protectionLevel & PermissionInfo.PROTECTION_DANGEROUS) != 0;
}
@Override
public void onExperienceForegrounded(ExperienceId experienceId) {
}
@Override
public void onExperienceBackgrounded(ExperienceId experienceId) {
}
}