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"> - + + + + + - + + + + + +