From 4dc37bc4ff4dfe13c4c81d63d22aeaec2930a7f4 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Fri, 12 Oct 2018 23:30:50 +0800 Subject: [PATCH] fix: floaty not working --- app/src/main/AndroidManifest.xml | 36 +++++++- .../external/tile/LayoutBoundsTile.java | 23 +++++ .../external/tile/LayoutHierarchyTile.java | 23 +++++ .../tile/LayoutInspectTileService.java | 90 +++++++++++++++++++ .../edit/keyboard/FunctionsKeyboardView.java | 2 +- .../ui/floating/FloatyWindowManger.java | 13 +-- .../shortcut/ShortcutIconSelectActivity.java | 4 +- autojs/src/main/assets/modules/__floaty__.js | 5 -- autojs/src/main/assets/modules/__ui__.js | 4 + .../autojs/core/ui/widget/JsListView.java | 3 + .../autojs/util/FloatingPermission.java | 9 +- .../com/stardust/app/GlobalAppContext.java | 4 + 12 files changed, 194 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/external/tile/LayoutBoundsTile.java create mode 100644 app/src/main/java/org/autojs/autojs/external/tile/LayoutHierarchyTile.java create mode 100644 app/src/main/java/org/autojs/autojs/external/tile/LayoutInspectTileService.java 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); + } }