diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ed15d0a1..36404ba8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -37,7 +37,7 @@
+ android:value="2.1"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
@@ -170,6 +197,7 @@
+
diff --git a/app/src/main/java/org/autojs/autojs/external/tile/LayoutBoundsTile.java b/app/src/main/java/org/autojs/autojs/external/tile/LayoutBoundsTile.java
new file mode 100644
index 00000000..883e4984
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/external/tile/LayoutBoundsTile.java
@@ -0,0 +1,23 @@
+package org.autojs.autojs.external.tile;
+
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+
+import com.stardust.view.accessibility.NodeInfo;
+
+import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
+import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow;
+
+@RequiresApi(api = Build.VERSION_CODES.N)
+public class LayoutBoundsTile extends LayoutInspectTileService {
+ @Override
+ protected FullScreenFloatyWindow onCreateWindow(NodeInfo capture) {
+ return new LayoutBoundsFloatyWindow(capture) {
+ @Override
+ public void close() {
+ super.close();
+ inactive();
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/org/autojs/autojs/external/tile/LayoutHierarchyTile.java b/app/src/main/java/org/autojs/autojs/external/tile/LayoutHierarchyTile.java
new file mode 100644
index 00000000..ea9db9d2
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/external/tile/LayoutHierarchyTile.java
@@ -0,0 +1,23 @@
+package org.autojs.autojs.external.tile;
+
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+
+import com.stardust.view.accessibility.NodeInfo;
+
+import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
+import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow;
+
+@RequiresApi(api = Build.VERSION_CODES.N)
+public class LayoutHierarchyTile extends LayoutInspectTileService {
+ @Override
+ protected FullScreenFloatyWindow onCreateWindow(NodeInfo capture) {
+ return new LayoutHierarchyFloatyWindow(capture) {
+ @Override
+ public void close() {
+ super.close();
+ inactive();
+ }
+ };
+ }
+}
diff --git a/app/src/main/java/org/autojs/autojs/external/tile/LayoutInspectTileService.java b/app/src/main/java/org/autojs/autojs/external/tile/LayoutInspectTileService.java
new file mode 100644
index 00000000..962931f9
--- /dev/null
+++ b/app/src/main/java/org/autojs/autojs/external/tile/LayoutInspectTileService.java
@@ -0,0 +1,90 @@
+package org.autojs.autojs.external.tile;
+
+import android.content.Intent;
+import android.os.Build;
+import android.service.quicksettings.Tile;
+import android.service.quicksettings.TileService;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.stardust.app.GlobalAppContext;
+import com.stardust.view.accessibility.LayoutInspector;
+import com.stardust.view.accessibility.NodeInfo;
+
+import org.autojs.autojs.R;
+import org.autojs.autojs.accessibility.AccessibilityService;
+import org.autojs.autojs.autojs.AutoJs;
+import org.autojs.autojs.tool.AccessibilityServiceTool;
+import org.autojs.autojs.ui.floating.FloatyWindowManger;
+import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
+
+@RequiresApi(api = Build.VERSION_CODES.N)
+public abstract class LayoutInspectTileService extends TileService implements LayoutInspector.CaptureAvailableListener {
+
+ private boolean mCapturing = false;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.d(getClass().getName(), "onCreate");
+ AutoJs.getInstance().getLayoutInspector().addCaptureAvailableListener(this);
+ }
+
+ @Override
+ public void onStartListening() {
+ super.onStartListening();
+ Log.d(getClass().getName(), "onStartListening");
+ inactive();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ Log.d(getClass().getName(), "onDestroy");
+ AutoJs.getInstance().getLayoutInspector().removeCaptureAvailableListener(this);
+ }
+
+ @Override
+ public void onClick() {
+ super.onClick();
+ Log.d(getClass().getName(), "onClick");
+ sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ if (AccessibilityService.getInstance() == null) {
+ Toast.makeText(this, R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show();
+ AccessibilityServiceTool.goToAccessibilitySetting();
+ inactive();
+ return;
+ }
+ mCapturing = true;
+ GlobalAppContext.postDelayed(() ->
+ AutoJs.getInstance().getLayoutInspector().captureCurrentWindow()
+ , 1000);
+ }
+
+ protected void inactive() {
+ Tile qsTile = getQsTile();
+ if (qsTile == null)
+ return;
+ qsTile.setState(Tile.STATE_INACTIVE);
+ qsTile.updateTile();
+ }
+
+ @Override
+ public void onCaptureAvailable(NodeInfo capture) {
+ Log.d(getClass().getName(), "onCaptureAvailable: capturing = " + mCapturing);
+ if (!mCapturing) {
+ return;
+ }
+ mCapturing = false;
+ GlobalAppContext.post(() -> {
+ FullScreenFloatyWindow window = onCreateWindow(capture);
+ if (!FloatyWindowManger.addWindow(getApplicationContext(), window)) {
+ inactive();
+ }
+ });
+
+ }
+
+ protected abstract FullScreenFloatyWindow onCreateWindow(NodeInfo capture);
+}
diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/keyboard/FunctionsKeyboardView.java b/app/src/main/java/org/autojs/autojs/ui/edit/keyboard/FunctionsKeyboardView.java
index a1a9d70a..466296e2 100644
--- a/app/src/main/java/org/autojs/autojs/ui/edit/keyboard/FunctionsKeyboardView.java
+++ b/app/src/main/java/org/autojs/autojs/ui/edit/keyboard/FunctionsKeyboardView.java
@@ -99,7 +99,7 @@ public class FunctionsKeyboardView extends FrameLayout {
}
private void initPropertiesView() {
- WrapContentGridLayoutManger manager = new WrapContentGridLayoutManger(getContext(), 2);
+ WrapContentGridLayoutManger manager = new WrapContentGridLayoutManger(getContext(), SPAN_COUNT);
manager.setDebugInfo("FunctionsKeyboardView");
mPropertiesView.setLayoutManager(manager);
mPropertiesView.setAdapter(new PropertiesAdapter());
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 6bb1f31e..eea6a3f6 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
@@ -32,18 +32,21 @@ public class FloatyWindowManger {
private static WeakReference sCircularMenu;
- public static void addWindow(Context context, FloatyWindow window) {
+ public static boolean addWindow(Context context, FloatyWindow window) {
context.startService(new Intent(context, FloatyService.class));
- FloatingPermission.ensurePermissionGranted(context);
+ boolean hasPermission = FloatingPermission.ensurePermissionGranted(context);
try {
FloatyService.addWindow(window);
+ return true;
// SecurityException: https://github.com/hyb1996-guest/AutoJsIssueReport/issues/4781
} catch (Exception e) {
e.printStackTrace();
- manageDrawOverlays(context);
- Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
-
+ if(hasPermission){
+ manageDrawOverlays(context);
+ Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
+ }
}
+ return false;
}
public static boolean isCircularMenuShowing() {
diff --git a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java
index 9bb35a9a..c83c05ce 100644
--- a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java
+++ b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java
@@ -1,5 +1,6 @@
package org.autojs.autojs.ui.shortcut;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -58,12 +59,13 @@ public class ShortcutIconSelectActivity extends BaseActivity {
private void setupApps() {
mApps.setAdapter(new AppsAdapter());
- WrapContentGridLayoutManger manager = new WrapContentGridLayoutManger(this, 2);
+ WrapContentGridLayoutManger manager = new WrapContentGridLayoutManger(this, 5);
manager.setDebugInfo("IconSelectView");
mApps.setLayoutManager(manager);
loadApps();
}
+ @SuppressLint("CheckResult")
private void loadApps() {
List packages = mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA);
Observable.fromIterable(packages)
diff --git a/autojs/src/main/assets/modules/__floaty__.js b/autojs/src/main/assets/modules/__floaty__.js
index 69adbbf0..fa3a81b4 100644
--- a/autojs/src/main/assets/modules/__floaty__.js
+++ b/autojs/src/main/assets/modules/__floaty__.js
@@ -26,13 +26,8 @@ module.exports = function(runtime, global){
get: function(name) {
var value = window[name];
if(typeof(value) == 'undefined'){
- value = viewCache[name];
if(!value){
value = window.findView(name);
- if(value){
- value = ui.__decorate__(value);
- viewCache[name] = value;
- }
}
if(!value){
value = undefined;
diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js
index cd780802..57e9fbe7 100644
--- a/autojs/src/main/assets/modules/__ui__.js
+++ b/autojs/src/main/assets/modules/__ui__.js
@@ -42,6 +42,10 @@ module.exports = function (runtime, global) {
return ui.findByStringId(ui.view, id);
}
+ ui.findView = function(id) {
+ return ui.findById(id);
+ }
+
ui.isUiThread = function () {
let Looper = android.os.Looper;
return Looper.myLooper() == Looper.getMainLooper();
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java
index 5e239961..73e2534f 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java
@@ -1,11 +1,14 @@
package com.stardust.autojs.core.ui.widget;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.os.Handler;
import android.support.v4.view.ViewPager;
+import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import com.stardust.autojs.R;
import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater;
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 c8e59d1b..57b1fe8a 100644
--- a/autojs/src/main/java/com/stardust/autojs/util/FloatingPermission.java
+++ b/autojs/src/main/java/com/stardust/autojs/util/FloatingPermission.java
@@ -12,13 +12,9 @@ import android.text.TextUtils;
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 java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.Set;
import ezy.assist.compat.RomUtil;
import ezy.assist.compat.SettingsCompat;
@@ -42,12 +38,13 @@ public class FloatingPermission {
}
}
- public static void ensurePermissionGranted(Context context) {
+ public static boolean ensurePermissionGranted(Context context) {
if (!canDrawOverlays(context)) {
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
manageDrawOverlays(context);
- return;
+ return false;
}
+ return true;
}
public static void waitForPermissionGranted(Context context) throws InterruptedException {
diff --git a/common/src/main/java/com/stardust/app/GlobalAppContext.java b/common/src/main/java/com/stardust/app/GlobalAppContext.java
index 3731bb29..6915d4a2 100644
--- a/common/src/main/java/com/stardust/app/GlobalAppContext.java
+++ b/common/src/main/java/com/stardust/app/GlobalAppContext.java
@@ -72,4 +72,8 @@ public class GlobalAppContext {
public static void post(Runnable r) {
sHandler.post(r);
}
+
+ public static void postDelayed(Runnable r, long m) {
+ sHandler.postDelayed(r, m);
+ }
}