From 220473c109657e8f8d744219fc314d8c8eff206e Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 29 Jul 2018 17:55:02 +0800 Subject: [PATCH] fix: Permission for drawing overlays on MIUI 10 --- .../ui/floating/FloatyWindowManger.java | 2 +- .../autojs/core/console/StardustConsole.java | 5 +- .../autojs/util/FloatingPermission.java | 64 +++++++++++++++++-- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java b/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java index f2be6c8c..54dec712 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java @@ -54,7 +54,7 @@ public class FloatyWindowManger { } public static boolean showCircularMenu() { - if (!SettingsCompat.canDrawOverlays(GlobalAppContext.get())) { + if (!FloatingPermission.canDrawOverlays(GlobalAppContext.get())) { Toast.makeText(GlobalAppContext.get(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); manageDrawOverlays(GlobalAppContext.get()); return false; diff --git a/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java b/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java index 28c1512c..0ed26141 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java +++ b/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java @@ -10,6 +10,7 @@ import com.stardust.autojs.annotation.ScriptInterface; import com.stardust.autojs.runtime.api.AbstractConsole; import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; +import com.stardust.autojs.util.FloatingPermission; import com.stardust.concurrent.ConcurrentArrayList; import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; @@ -151,8 +152,8 @@ public class StardustConsole extends AbstractConsole { if (mShown) { return; } - if (!SettingsCompat.canDrawOverlays(mUiHandler.getContext())) { - SettingsCompat.manageDrawOverlays(mUiHandler.getContext()); + if (!FloatingPermission.canDrawOverlays(mUiHandler.getContext())) { + FloatingPermission.manageDrawOverlays(mUiHandler.getContext()); mUiHandler.toast(R.string.text_no_floating_window_permission); return; } diff --git a/autojs/src/main/java/com/stardust/autojs/util/FloatingPermission.java b/autojs/src/main/java/com/stardust/autojs/util/FloatingPermission.java index 7b5abcda..c8e59d1b 100644 --- a/autojs/src/main/java/com/stardust/autojs/util/FloatingPermission.java +++ b/autojs/src/main/java/com/stardust/autojs/util/FloatingPermission.java @@ -1,8 +1,14 @@ package com.stardust.autojs.util; import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; import android.os.Handler; import android.os.Looper; +import android.provider.Settings; +import android.support.annotation.RequiresApi; +import android.text.TextUtils; import android.widget.Toast; import com.stardust.R; @@ -10,6 +16,11 @@ import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.enhancedfloaty.util.FloatingWindowPermissionUtil; import com.stardust.lang.ThreadCompat; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Set; + +import ezy.assist.compat.RomUtil; import ezy.assist.compat.SettingsCompat; /** @@ -19,8 +30,20 @@ import ezy.assist.compat.SettingsCompat; public class FloatingPermission { + private static final int OP_SYSTEM_ALERT_WINDOW = 24; + private static Method sCheckOp; + + static { + try { + sCheckOp = SettingsCompat.class.getDeclaredMethod("checkOp", Context.class, int.class); + sCheckOp.setAccessible(true); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + public static void ensurePermissionGranted(Context context) { - if (!SettingsCompat.canDrawOverlays(context)) { + if (!canDrawOverlays(context)) { Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); manageDrawOverlays(context); return; @@ -28,7 +51,7 @@ public class FloatingPermission { } public static void waitForPermissionGranted(Context context) throws InterruptedException { - if (SettingsCompat.canDrawOverlays(context)) { + if (canDrawOverlays(context)) { return; } Runnable r = () -> { @@ -41,7 +64,7 @@ public class FloatingPermission { r.run(); } while (true) { - if (SettingsCompat.canDrawOverlays(context)) + if (canDrawOverlays(context)) return; Thread.sleep(200); } @@ -51,11 +74,42 @@ public class FloatingPermission { public static void manageDrawOverlays(Context context) { try { - SettingsCompat.manageDrawOverlays(context); + if (RomUtil.isMiui() && TextUtils.equals("V10", RomUtil.getVersion()) + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + manageDrawOverlaysForAndroidM(context); + } else { + SettingsCompat.manageDrawOverlays(context); + } } catch (Exception ex) { - FloatingWindowPermissionUtil.goToAppDetailSettings(context, context.getPackageName()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + manageDrawOverlaysForAndroidM(context); + } else { + FloatingWindowPermissionUtil.goToAppDetailSettings(context, context.getPackageName()); + + } } } + @RequiresApi(api = Build.VERSION_CODES.M) + public static void manageDrawOverlaysForAndroidM(Context context) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); + intent.setData(Uri.parse("package:" + context.getPackageName())); + context.startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } + public static boolean canDrawOverlays(Context context) { + return SettingsCompat.canDrawOverlays(context); + } + + private static boolean checkOp(Context context, int op) { + if (sCheckOp == null) { + return SettingsCompat.canDrawOverlays(context); + } + try { + return (boolean) sCheckOp.invoke(null, context, op); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } }