Skip to content

Commit 589a2b5

Browse files
committed
Merge pull request #100815 from m4gr3d/remove_install_permission_for_xr_editor
[Android Editor] Update handling of the `REQUEST_INSTALL_PACKAGES` permission
2 parents c83706f + 7ad9d23 commit 589a2b5

File tree

7 files changed

+53
-58
lines changed

7 files changed

+53
-58
lines changed

platform/android/export/export.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void register_android_exporter() {
5252
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/debug_keystore_pass", PROPERTY_HINT_PASSWORD));
5353

5454
#ifdef ANDROID_ENABLED
55-
EDITOR_DEF_BASIC("export/android/install_exported_apk", true);
55+
EDITOR_DEF_BASIC("export/android/install_exported_apk", !OS::get_singleton()->has_feature("horizonos"));
5656
#else
5757
EDITOR_DEF_BASIC("export/android/java_sdk_path", OS::get_singleton()->get_environment("JAVA_HOME"));
5858
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/java_sdk_path", PROPERTY_HINT_GLOBAL_DIR));

platform/android/java/editor/src/horizonos/AndroidManifest.xml

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
<!-- Scene api -->
3535
<uses-permission android:name="com.oculus.permission.USE_SCENE" />
3636

37+
<!-- Temp removal of the 'REQUEST_INSTALL_PACKAGES' permission as it's currently forbidden by the Horizon OS store -->
38+
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove" />
39+
3740
<application>
3841

3942
<activity

platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt

+11-2
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,20 @@ abstract class BaseGodotEditor : GodotActivity() {
130130
*/
131131
@CallSuper
132132
protected open fun getExcludedPermissions(): MutableSet<String> {
133-
return mutableSetOf(
133+
val excludedPermissions = mutableSetOf(
134134
// The RECORD_AUDIO permission is requested when the "audio/driver/enable_input" project
135135
// setting is enabled.
136-
Manifest.permission.RECORD_AUDIO
136+
Manifest.permission.RECORD_AUDIO,
137137
)
138+
139+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
140+
excludedPermissions.add(
141+
// The REQUEST_INSTALL_PACKAGES permission is requested the first time we attempt to
142+
// open an apk file.
143+
Manifest.permission.REQUEST_INSTALL_PACKAGES,
144+
)
145+
}
146+
return excludedPermissions
138147
}
139148

140149
override fun onCreate(savedInstanceState: Bundle?) {

platform/android/java/lib/src/org/godotengine/godot/Godot.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,8 @@ class Godot(private val context: Context) {
10391039
}
10401040

10411041
fun requestPermission(name: String?): Boolean {
1042-
return requestPermission(name, getActivity())
1042+
val activity = getActivity() ?: return false
1043+
return requestPermission(name, activity)
10431044
}
10441045

10451046
fun requestPermissions(): Boolean {

platform/android/java/lib/src/org/godotengine/godot/GodotIO.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,12 @@
3030

3131
package org.godotengine.godot;
3232

33+
import org.godotengine.godot.error.Error;
3334
import org.godotengine.godot.input.GodotEditText;
3435

3536
import android.app.Activity;
36-
import android.content.ActivityNotFoundException;
3737
import android.content.Intent;
3838
import android.content.pm.ActivityInfo;
39-
import android.graphics.Point;
4039
import android.graphics.Rect;
4140
import android.net.Uri;
4241
import android.os.Build;
@@ -47,7 +46,6 @@
4746
import android.util.Log;
4847
import android.view.Display;
4948
import android.view.DisplayCutout;
50-
import android.view.Surface;
5149
import android.view.WindowInsets;
5250

5351
import androidx.core.content.FileProvider;
@@ -121,10 +119,10 @@ public int openURI(String uriString) {
121119
}
122120

123121
activity.startActivity(intent);
124-
return 0;
122+
return Error.OK.toNativeValue();
125123
} catch (Exception e) {
126124
Log.e(TAG, "Unable to open uri " + uriString, e);
127-
return 1;
125+
return Error.FAILED.toNativeValue();
128126
}
129127
}
130128

platform/android/java/lib/src/org/godotengine/godot/error/Error.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ enum class Error(private val description: String) {
9292
}
9393
}
9494

95-
internal fun toNativeValue(): Int = this.ordinal
95+
fun toNativeValue(): Int = this.ordinal
9696

9797
override fun toString(): String {
9898
return description

platform/android/java/lib/src/org/godotengine/godot/utils/PermissionsUtil.java

+32-48
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,13 @@
4444
import android.text.TextUtils;
4545
import android.util.Log;
4646

47+
import androidx.annotation.NonNull;
4748
import androidx.annotation.Nullable;
4849
import androidx.core.content.ContextCompat;
4950

5051
import java.util.ArrayList;
5152
import java.util.Arrays;
53+
import java.util.Collections;
5254
import java.util.HashSet;
5355
import java.util.List;
5456
import java.util.Set;
@@ -76,11 +78,11 @@ private PermissionsUtil() {
7678
* @param activity the caller activity for this method.
7779
* @return true/false. "true" if permissions are already granted, "false" if a permissions request was dispatched.
7880
*/
79-
public static boolean requestPermissions(Activity activity, List<String> permissions) {
80-
if (activity == null) {
81-
return false;
82-
}
81+
public static boolean requestPermissions(@NonNull Activity activity, List<String> permissions) {
82+
return requestPermissions(activity, permissions, REQUEST_ALL_PERMISSION_REQ_CODE);
83+
}
8384

85+
private static boolean requestPermissions(@NonNull Activity activity, List<String> permissions, int requestCode) {
8486
if (permissions == null || permissions.isEmpty()) {
8587
return true;
8688
}
@@ -90,6 +92,7 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
9092
return true;
9193
}
9294

95+
boolean dispatchedPermissionsRequest = false;
9396
Set<String> requestedPermissions = new HashSet<>();
9497
for (String permission : permissions) {
9598
try {
@@ -104,13 +107,15 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
104107
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
105108
activity.startActivityForResult(intent, REQUEST_MANAGE_EXTERNAL_STORAGE_REQ_CODE);
106109
}
110+
dispatchedPermissionsRequest = true;
107111
}
108112
} else if (permission.equals(Manifest.permission.REQUEST_INSTALL_PACKAGES)) {
109113
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !activity.getPackageManager().canRequestPackageInstalls()) {
110114
try {
111115
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
112116
intent.setData(Uri.parse(String.format("package:%s", activity.getPackageName())));
113117
activity.startActivityForResult(intent, REQUEST_INSTALL_PACKAGES_REQ_CODE);
118+
dispatchedPermissionsRequest = true;
114119
} catch (Exception e) {
115120
Log.e(TAG, "Unable to request permission " + Manifest.permission.REQUEST_INSTALL_PACKAGES);
116121
}
@@ -129,13 +134,12 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
129134
}
130135
}
131136

132-
if (requestedPermissions.isEmpty()) {
133-
// If list is empty, all of dangerous permissions were granted.
134-
return true;
137+
if (!requestedPermissions.isEmpty()) {
138+
activity.requestPermissions(requestedPermissions.toArray(new String[0]), requestCode);
139+
dispatchedPermissionsRequest = true;
135140
}
136141

137-
activity.requestPermissions(requestedPermissions.toArray(new String[0]), REQUEST_ALL_PERMISSION_REQ_CODE);
138-
return false;
142+
return !dispatchedPermissionsRequest;
139143
}
140144

141145
/**
@@ -144,57 +148,37 @@ public static boolean requestPermissions(Activity activity, List<String> permiss
144148
* @param activity the caller activity for this method.
145149
* @return true/false. "true" if permission is already granted, "false" if a permission request was dispatched.
146150
*/
147-
public static boolean requestPermission(String permissionName, Activity activity) {
148-
if (activity == null || TextUtils.isEmpty(permissionName)) {
149-
return false;
150-
}
151-
152-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
153-
// Not necessary, asked on install already
151+
public static boolean requestPermission(String permissionName, @NonNull Activity activity) {
152+
if (TextUtils.isEmpty(permissionName)) {
154153
return true;
155154
}
156155

156+
final int requestCode;
157+
final String updatedPermissionName;
157158
switch (permissionName) {
158159
case "RECORD_AUDIO":
159-
case Manifest.permission.RECORD_AUDIO:
160-
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
161-
activity.requestPermissions(new String[] { Manifest.permission.RECORD_AUDIO }, REQUEST_RECORD_AUDIO_PERMISSION);
162-
return false;
163-
}
164-
return true;
160+
updatedPermissionName = Manifest.permission.RECORD_AUDIO;
161+
requestCode = REQUEST_RECORD_AUDIO_PERMISSION;
162+
break;
165163

166164
case "CAMERA":
167-
case Manifest.permission.CAMERA:
168-
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
169-
activity.requestPermissions(new String[] { Manifest.permission.CAMERA }, REQUEST_CAMERA_PERMISSION);
170-
return false;
171-
}
172-
return true;
165+
updatedPermissionName = Manifest.permission.CAMERA;
166+
requestCode = REQUEST_CAMERA_PERMISSION;
167+
break;
173168

174169
case "VIBRATE":
175-
case Manifest.permission.VIBRATE:
176-
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.VIBRATE) != PackageManager.PERMISSION_GRANTED) {
177-
activity.requestPermissions(new String[] { Manifest.permission.VIBRATE }, REQUEST_VIBRATE_PERMISSION);
178-
return false;
179-
}
180-
return true;
170+
updatedPermissionName = Manifest.permission.VIBRATE;
171+
requestCode = REQUEST_VIBRATE_PERMISSION;
172+
break;
181173

182174
default:
183-
// Check if the given permission is a dangerous permission
184-
try {
185-
PermissionInfo permissionInfo = getPermissionInfo(activity, permissionName);
186-
int protectionLevel = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? permissionInfo.getProtection() : permissionInfo.protectionLevel;
187-
if ((protectionLevel & PermissionInfo.PROTECTION_DANGEROUS) == PermissionInfo.PROTECTION_DANGEROUS && ContextCompat.checkSelfPermission(activity, permissionName) != PackageManager.PERMISSION_GRANTED) {
188-
activity.requestPermissions(new String[] { permissionName }, REQUEST_SINGLE_PERMISSION_REQ_CODE);
189-
return false;
190-
}
191-
} catch (PackageManager.NameNotFoundException e) {
192-
// Unknown permission - return false as it can't be granted.
193-
Log.w(TAG, "Unable to identify permission " + permissionName, e);
194-
return false;
195-
}
196-
return true;
175+
updatedPermissionName = permissionName;
176+
requestCode = REQUEST_SINGLE_PERMISSION_REQ_CODE;
177+
break;
197178
}
179+
180+
List<String> permissions = Collections.singletonList(updatedPermissionName);
181+
return requestPermissions(activity, permissions, requestCode);
198182
}
199183

200184
/**

0 commit comments

Comments
 (0)