From 2d6fed4c997de525962d85e54de62d569a0c49a4 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Mon, 28 May 2018 20:51:05 +0800
Subject: [PATCH] api(runtime): runtime.requestPermissions()
---
app/src/main/AndroidManifest.xml | 5 ++
.../autojs/autojs/ui/edit/EditActivity.java | 22 +++++++-
.../autojs/autojs/ui/main/MainActivity.java | 26 ++++++++-
autojs/src/main/AndroidManifest.xml | 6 +++
.../OnRequestPermissionsResultCallback.java | 8 +++
.../permission/PermissionRequestActivity.java | 33 ++++++++++++
.../PermissionRequestProxyActivity.java | 16 ++++++
.../autojs/core/permission/Permissions.java | 53 +++++++++++++++++++
.../RequestPermissionCallbacks.java | 32 +++++++++++
.../autojs/runtime/ScriptRuntime.java | 19 +++++++
inrt/src/main/AndroidManifest.xml | 13 ++++-
11 files changed, 229 insertions(+), 4 deletions(-)
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/permission/OnRequestPermissionsResultCallback.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/permission/PermissionRequestActivity.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/permission/PermissionRequestProxyActivity.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/permission/Permissions.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/permission/RequestPermissionCallbacks.java
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0356aca7..620f916c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,6 +13,11 @@
+
+
+
+
+
diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java
index c791a377..4751adef 100644
--- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java
+++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java
@@ -9,7 +9,11 @@ import android.view.Menu;
import android.view.MenuItem;
import com.stardust.app.OnActivityResultDelegate;
+import com.stardust.autojs.core.permission.OnRequestPermissionsResultCallback;
+import com.stardust.autojs.core.permission.PermissionRequestProxyActivity;
+import com.stardust.autojs.core.permission.RequestPermissionCallbacks;
import com.stardust.pio.PFiles;
+
import org.autojs.autojs.R;
import org.autojs.autojs.storage.file.TmpScriptFiles;
import org.autojs.autojs.ui.BaseActivity;
@@ -35,7 +39,7 @@ import static org.autojs.autojs.ui.edit.EditorView.EXTRA_READ_ONLY;
* Created by Stardust on 2017/1/29.
*/
@EActivity(R.layout.activity_edit)
-public class EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost {
+public class EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, PermissionRequestProxyActivity {
private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
@@ -44,6 +48,7 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega
private EditorMenu mEditorMenu;
+ private RequestPermissionCallbacks mRequestPermissionCallbacks = new RequestPermissionCallbacks();
public static void editFile(Context context, String path) {
editFile(context, null, path);
@@ -192,4 +197,19 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega
}
}
+ @Override
+ public void addRequestPermissionsCallback(OnRequestPermissionsResultCallback callback) {
+ mRequestPermissionCallbacks.addCallback(callback);
+ }
+
+ @Override
+ public boolean removeRequestPermissionsCallback(OnRequestPermissionsResultCallback callback) {
+ return mRequestPermissionCallbacks.removeCallback(callback);
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ mRequestPermissionCallbacks.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
}
diff --git a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java
index 415d4d8b..d0ffe0cf 100644
--- a/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java
+++ b/app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java
@@ -20,8 +20,12 @@ import android.view.View;
import com.stardust.app.FragmentPagerAdapterBuilder;
import com.stardust.app.OnActivityResultDelegate;
+import com.stardust.autojs.core.permission.OnRequestPermissionsResultCallback;
+import com.stardust.autojs.core.permission.PermissionRequestProxyActivity;
+import com.stardust.autojs.core.permission.RequestPermissionCallbacks;
import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.pio.PFiles;
+
import org.autojs.autojs.BuildConfig;
import org.autojs.autojs.Pref;
import org.autojs.autojs.R;
@@ -42,8 +46,11 @@ import org.autojs.autojs.ui.settings.SettingsActivity_;
import org.autojs.autojs.ui.update.VersionGuard;
import org.autojs.autojs.ui.widget.CommonMarkdownView;
import org.autojs.autojs.ui.widget.SearchViewItem;
+
import com.stardust.theme.ThemeColorManager;
+
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
+
import com.stardust.util.BackPressedHandler;
import com.stardust.util.DeveloperUtils;
import com.stardust.util.DrawerAutoClose;
@@ -58,7 +65,8 @@ import org.greenrobot.eventbus.Subscribe;
import java.util.Arrays;
@EActivity(R.layout.activity_main)
-public class MainActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, BackPressedHandler.HostActivity {
+public class MainActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, BackPressedHandler.HostActivity, PermissionRequestProxyActivity {
+
public static class DrawerOpenEvent {
static DrawerOpenEvent SINGLETON = new DrawerOpenEvent();
@@ -77,6 +85,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator();
+ private RequestPermissionCallbacks mRequestPermissionCallbacks = new RequestPermissionCallbacks();
private VersionGuard mVersionGuard;
private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer();
private SearchViewItem mSearchViewItem;
@@ -228,6 +237,9 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (mRequestPermissionCallbacks.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
+ return;
+ }
if (getGrantResult(Manifest.permission.READ_EXTERNAL_STORAGE, permissions, grantResults) == PackageManager.PERMISSION_GRANTED) {
StorageFileProvider.getDefault().notifyStoragePermissionGranted();
}
@@ -275,6 +287,17 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
}
}
+ @Override
+ public void addRequestPermissionsCallback(OnRequestPermissionsResultCallback callback) {
+ mRequestPermissionCallbacks.addCallback(callback);
+ }
+
+ @Override
+ public boolean removeRequestPermissionsCallback(OnRequestPermissionsResultCallback callback) {
+ return mRequestPermissionCallbacks.removeCallback(callback);
+ }
+
+
@Override
public BackPressedHandler.Observer getBackPressedObserver() {
return mBackPressObserver;
@@ -289,6 +312,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
return true;
}
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_log) {
diff --git a/autojs/src/main/AndroidManifest.xml b/autojs/src/main/AndroidManifest.xml
index c303a483..39c0a23a 100644
--- a/autojs/src/main/AndroidManifest.xml
+++ b/autojs/src/main/AndroidManifest.xml
@@ -17,6 +17,12 @@
android:theme="@style/AppTheme"/>
+
+
= Build.VERSION_CODES.M) {
+ requestPermissions(permissions, Permissions.REQUEST_CODE);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ finish();
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/permission/PermissionRequestProxyActivity.java b/autojs/src/main/java/com/stardust/autojs/core/permission/PermissionRequestProxyActivity.java
new file mode 100644
index 00000000..26ab78ff
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/permission/PermissionRequestProxyActivity.java
@@ -0,0 +1,16 @@
+package com.stardust.autojs.core.permission;
+
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+
+public interface PermissionRequestProxyActivity {
+
+ void addRequestPermissionsCallback(OnRequestPermissionsResultCallback callback);
+
+ boolean removeRequestPermissionsCallback(OnRequestPermissionsResultCallback callback);
+
+ @RequiresApi(Build.VERSION_CODES.M)
+ void requestPermissions(@NonNull String[] permissions, int requestCode);
+
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/permission/Permissions.java b/autojs/src/main/java/com/stardust/autojs/core/permission/Permissions.java
new file mode 100644
index 00000000..6783dc41
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/permission/Permissions.java
@@ -0,0 +1,53 @@
+package com.stardust.autojs.core.permission;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import static android.content.pm.PackageManager.PERMISSION_DENIED;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+
+public class Permissions {
+
+ private static final String[] EMPTY_STRING_ARRAY = new String[0];
+
+ static final int REQUEST_CODE = 18777;
+
+ public static String[] getPermissionsNeedToRequest(Context context, String[] permissions) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return EMPTY_STRING_ARRAY;
+ }
+ ArrayList list = new ArrayList<>();
+ for (String permission : permissions) {
+ if (!permission.startsWith("android.permission.")) {
+ permission = "android.permission." + permission.toUpperCase();
+ }
+ if (context.checkSelfPermission(permission) == PERMISSION_DENIED) {
+ list.add(permission);
+ }
+ }
+ return list.toArray(EMPTY_STRING_ARRAY);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ public static void requestPermissions(PermissionRequestProxyActivity activity, String[] permissions, OnRequestPermissionsResultCallback callback) {
+ if (callback != null) {
+ activity.addRequestPermissionsCallback((code, p, grantResults) -> {
+ activity.removeRequestPermissionsCallback(callback);
+ callback.onRequestPermissionsResult(code, p, grantResults);
+ });
+ }
+ activity.requestPermissions(permissions, REQUEST_CODE);
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ public static void requestPermissions(Context context, String[] permissions) {
+ context.startActivity(new Intent(context, PermissionRequestActivity.class)
+ .putExtra(PermissionRequestActivity.EXTRA_PERMISSIONS, permissions)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/permission/RequestPermissionCallbacks.java b/autojs/src/main/java/com/stardust/autojs/core/permission/RequestPermissionCallbacks.java
new file mode 100644
index 00000000..cb8d18fa
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/permission/RequestPermissionCallbacks.java
@@ -0,0 +1,32 @@
+package com.stardust.autojs.core.permission;
+
+import android.support.annotation.NonNull;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RequestPermissionCallbacks {
+
+ private List mCallbacks = new ArrayList<>();
+
+
+ public void addCallback(OnRequestPermissionsResultCallback callback) {
+ mCallbacks.add(callback);
+ }
+
+
+ public boolean removeCallback(OnRequestPermissionsResultCallback callback) {
+ return mCallbacks.remove(callback);
+ }
+
+ public boolean onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ if (mCallbacks.size() == 0) {
+ return false;
+ }
+ for (OnRequestPermissionsResultCallback callback : mCallbacks) {
+ callback.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ return true;
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java
index 45ae14cb..b91b0157 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java
@@ -1,5 +1,7 @@
package com.stardust.autojs.runtime;
+import android.Manifest;
+import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Looper;
@@ -10,6 +12,8 @@ import com.stardust.autojs.ScriptEngineService;
import com.stardust.autojs.annotation.ScriptVariable;
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
import com.stardust.autojs.core.image.Colors;
+import com.stardust.autojs.core.permission.PermissionRequestProxyActivity;
+import com.stardust.autojs.core.permission.Permissions;
import com.stardust.autojs.rhino.AndroidClassLoader;
import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils;
@@ -49,9 +53,13 @@ import org.mozilla.javascript.ContextFactory;
import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import static android.content.pm.PackageManager.PERMISSION_DENIED;
+
/**
* Created by Stardust on 2017/1/27.
@@ -305,6 +313,17 @@ public class ScriptRuntime {
}
}
+ public void requestPermissions(String[] permissions) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return;
+ }
+ Context context = uiHandler.getContext();
+ permissions = Permissions.getPermissionsNeedToRequest(context, permissions);
+ if (permissions.length == 0)
+ return;
+ Permissions.requestPermissions(context, permissions);
+ }
+
public void loadJar(String path) {
try {
((AndroidClassLoader) ContextFactory.getGlobal().getApplicationClassLoader()).loadJar(new File(path));
diff --git a/inrt/src/main/AndroidManifest.xml b/inrt/src/main/AndroidManifest.xml
index c9b23e8b..1f081ede 100644
--- a/inrt/src/main/AndroidManifest.xml
+++ b/inrt/src/main/AndroidManifest.xml
@@ -3,13 +3,22 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.stardust.auojs.inrt">
-
+
+
+
+
+
-
+
+
+
+
+
+