feat(floaty): wait for floating permission granted when creating a window

This commit is contained in:
hyb1996
2018-01-30 10:37:03 +08:00
parent 8bab1330fd
commit d3899fa3f3
4 changed files with 75 additions and 13 deletions

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.widget.Toast; import android.widget.Toast;
import com.stardust.autojs.util.FloatingPermission;
import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.enhancedfloaty.FloatyWindow; import com.stardust.enhancedfloaty.FloatyWindow;
import com.stardust.enhancedfloaty.util.FloatingWindowPermissionUtil; import com.stardust.enhancedfloaty.util.FloatingWindowPermissionUtil;
@@ -16,6 +17,8 @@ import java.lang.ref.WeakReference;
import ezy.assist.compat.SettingsCompat; import ezy.assist.compat.SettingsCompat;
import static com.stardust.autojs.util.FloatingPermission.manageDrawOverlays;
/** /**
* Created by Stardust on 2017/9/30. * Created by Stardust on 2017/9/30.
*/ */
@@ -26,11 +29,7 @@ public class FloatyWindowManger {
public static void addWindow(Context context, FloatyWindow window) { public static void addWindow(Context context, FloatyWindow window) {
context.startService(new Intent(context, FloatyService.class)); context.startService(new Intent(context, FloatyService.class));
if (!SettingsCompat.canDrawOverlays(context)) { FloatingPermission.ensurePermissionGranted(context);
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
manageDrawOverlays(context);
return;
}
try { try {
FloatyService.addWindow(window); FloatyService.addWindow(window);
// SecurityException: https://github.com/hyb1996-guest/AutoJsIssueReport/issues/4781 // SecurityException: https://github.com/hyb1996-guest/AutoJsIssueReport/issues/4781
@@ -43,14 +42,6 @@ public class FloatyWindowManger {
} }
public static void manageDrawOverlays(Context context) {
try {
SettingsCompat.manageDrawOverlays(context);
} catch (Exception ex) {
FloatingWindowPermissionUtil.goToAppDetailSettings(context, context.getPackageName());
}
}
public static void closeWindow(FloatyWindow window) { public static void closeWindow(FloatyWindow window) {
window.close(); window.close();
} }

View File

@@ -5,6 +5,7 @@ import android.content.Intent;
import android.os.Looper; import android.os.Looper;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.View; import android.view.View;
import android.widget.Toast;
import com.stardust.autojs.R; import com.stardust.autojs.R;
import com.stardust.autojs.core.floaty.FloatyWindow; import com.stardust.autojs.core.floaty.FloatyWindow;
@@ -12,6 +13,7 @@ import com.stardust.autojs.core.ui.JsLayoutInflater;
import com.stardust.autojs.core.ui.JsViewHelper; import com.stardust.autojs.core.ui.JsViewHelper;
import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.autojs.util.FloatingPermission;
import com.stardust.concurrent.VolatileDispose; import com.stardust.concurrent.VolatileDispose;
import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.util.UiHandler; import com.stardust.util.UiHandler;
@@ -20,6 +22,8 @@ import com.stardust.util.ViewUtil;
import java.util.Iterator; import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import ezy.assist.compat.SettingsCompat;
/** /**
* Created by Stardust on 2017/12/5. * Created by Stardust on 2017/12/5.
*/ */
@@ -44,6 +48,11 @@ public class Floaty {
} }
public JsFloatyWindow window(View view) { public JsFloatyWindow window(View view) {
try {
FloatingPermission.waitForPermissionGranted(view.getContext());
} catch (InterruptedException e) {
throw new ScriptInterruptedException();
}
JsFloatyWindow window = new JsFloatyWindow(view); JsFloatyWindow window = new JsFloatyWindow(view);
mWindows.add(window); mWindows.add(window);
return window; return window;

View File

@@ -0,0 +1,61 @@
package com.stardust.autojs.util;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
import com.stardust.R;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.enhancedfloaty.util.FloatingWindowPermissionUtil;
import com.stardust.lang.ThreadCompat;
import ezy.assist.compat.SettingsCompat;
/**
* Created by Stardust on 2018/1/30.
*/
public class FloatingPermission {
public static void ensurePermissionGranted(Context context) {
if (!SettingsCompat.canDrawOverlays(context)) {
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
manageDrawOverlays(context);
return;
}
}
public static void waitForPermissionGranted(Context context) throws InterruptedException {
if (SettingsCompat.canDrawOverlays(context)) {
return;
}
Runnable r = () -> {
manageDrawOverlays(context);
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
};
if (Looper.myLooper() != Looper.getMainLooper()) {
new Handler(Looper.getMainLooper()).post(r);
} else {
r.run();
}
while (true) {
if (SettingsCompat.canDrawOverlays(context))
return;
Thread.sleep(200);
}
}
public static void manageDrawOverlays(Context context) {
try {
SettingsCompat.manageDrawOverlays(context);
} catch (Exception ex) {
FloatingWindowPermissionUtil.goToAppDetailSettings(context, context.getPackageName());
}
}
}

View File

@@ -1,3 +1,4 @@
<resources> <resources>
<string name="app_name">common</string> <string name="app_name">common</string>
<string name="text_no_floating_window_permission">没有悬浮窗权限</string>
</resources> </resources>