From 311307c48910c34f7ecff61c27bd6070e8eac875 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Fri, 21 Dec 2018 14:25:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E4=BB=A3=E7=A0=81=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=92=8C=E6=96=87=E6=A1=A3=E6=8F=8F=E8=BF=B0=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autojs/src/main/assets/modules/__app__.js | 2 +- .../src/main/assets/modules/__automator__.js | 36 +++++++--- autojs/src/main/assets/modules/__images__.js | 69 ++++++++++--------- .../accessibility/AccessibilityBridge.java | 45 +++++++++--- .../accessibility/SimpleActionAutomator.java | 16 +++-- .../autojs/core/accessibility/UiSelector.java | 24 +++++-- .../core/activity/ActivityInfoProvider.kt | 45 +++++++++--- .../stardust/autojs/runtime/api/Images.java | 19 ++--- .../accessibility/AccessibilityService.kt | 2 +- .../main/java/com/stardust/auojs/inrt/Pref.kt | 20 +++--- 10 files changed, 185 insertions(+), 93 deletions(-) diff --git a/autojs/src/main/assets/modules/__app__.js b/autojs/src/main/assets/modules/__app__.js index 02f461e7..d5282755 100644 --- a/autojs/src/main/assets/modules/__app__.js +++ b/autojs/src/main/assets/modules/__app__.js @@ -42,7 +42,7 @@ module.exports = function (runtime, global) { } if (i.type) { if (i.data) { - intent.setDataAndType(android.net.Uri.parse(i.data), i.type); + intent.setDataAndType(app.parseUri(i.data), i.type); } else { intent.setType(i.type); } diff --git a/autojs/src/main/assets/modules/__automator__.js b/autojs/src/main/assets/modules/__automator__.js index 21071194..449013bb 100644 --- a/autojs/src/main/assets/modules/__automator__.js +++ b/autojs/src/main/assets/modules/__automator__.js @@ -138,11 +138,15 @@ module.exports = function(runtime, global){ } auto.setFlags = function(flags){ - if(typeof(flags) !== "string"){ - throw new TypeError("flags should be a string"); + let flagStrings; + if(Array.isArray(flags)){ + flagStrings = flags; + } else if(typeof(flags) == "string"){ + flagStrings = [flags]; + } else { + throw new TypeError("flags = " + flags); } let flagsInt = 0; - let flagStrings = flags.split("|"); for(let i = 0; i < flagStrings.length; i++){ let flag = flagsMap[flagStrings[i]]; if(flag == undefined){ @@ -153,22 +157,36 @@ module.exports = function(runtime, global){ runtime.accessibilityBridge.setFlags(flagsInt); } - auto.getService = function(){ + auto.__defineGetter__("service", function() { return runtime.accessibilityBridge.getService(); - } + }); - auto.getWindows = function(){ + auto.__defineGetter__("windows", function() { var service = auto.getService(); return service == null ? [] : util.java.toJsArray(service.getWindows(), true); - } + }); - auto.getRoot = function(){ + auto.__defineGetter__("root", function() { var root = runtime.accessibilityBridge.getRootInCurrentWindow(); if(root == null){ return null; } return com.stardust.automator.UiObject.Companion.createRoot(root); - } + }); + + auto.__defineGetter__("rootInActiveWindow", function() { + var root = runtime.accessibilityBridge.getRootInActiveWindow(); + if(root == null){ + return null; + } + return com.stardust.automator.UiObject.Companion.createRoot(root); + }); + + auto.__defineGetter__("windowRoots", function() { + return util.java.toJsArray(runtime.accessibilityBridge.windowRoots(), false) + .map(root => com.stardust.automator.UiObject.Companion.createRoot(root)); + }); + auto.setWindowFilter = function(filter){ runtime.accessibilityBridge.setWindowFilter(new com.stardust.autojs.core.accessibility.AccessibilityBridge.WindowFilter(filter)); diff --git a/autojs/src/main/assets/modules/__images__.js b/autojs/src/main/assets/modules/__images__.js index 1c35e4cb..59f8ea93 100644 --- a/autojs/src/main/assets/modules/__images__.js +++ b/autojs/src/main/assets/modules/__images__.js @@ -64,22 +64,22 @@ module.exports = function (runtime, scope) { MatchingResult.prototype.best = function () { return this.findMax((l, r) => r.similarity - l.similarity); } - MatchingResult.prototype.sortBy = function(cmp) { + MatchingResult.prototype.sortBy = function (cmp) { var comparatorFn = null; - if(typeof(cmp) == 'string'){ + if (typeof (cmp) == 'string') { cmp.split("-").forEach(direction => { var buildInFn = comparators[direction]; - if(!buildInFn){ - throw new Error("unknown direction '" + direction + "' in '" + cmp +"'"); + if (!buildInFn) { + throw new Error("unknown direction '" + direction + "' in '" + cmp + "'"); } - (function(fn){ - if(comparatorFn == null){ + (function (fn) { + if (comparatorFn == null) { comparatorFn = fn; - }else{ - comparatorFn = (function(comparatorFn, fn){ - return function(l, r){ + } else { + comparatorFn = (function (comparatorFn, fn) { + return function (l, r) { var cmpValue = comparatorFn(l, r); - if(cmpValue == 0){ + if (cmpValue == 0) { return fn(l, r); } return cmpValue; @@ -88,7 +88,7 @@ module.exports = function (runtime, scope) { } })(buildInFn); }); - }else{ + } else { comparatorFn = cmp; } var clone = this.matches.slice(); @@ -188,29 +188,32 @@ module.exports = function (runtime, scope) { images.inRange = function (img, lowerBound, upperBound) { initIfNeeded(); - var lb, ub; - if (typeof (lowerBound) == 'string') { - if (typeof (upperBound) == 'string') { - lb = new Scalar(colors.red(lowerBound), colors.green(lowerBound), - colors.blue(lowerBound), colors.alpha(lowerBound)); - ub = new Scalar(colors.red(upperBound), colors.green(upperBound), - colors.blue(upperBound), colors.alpha(lowerBound)); - } else if (typeof (upperBound) == 'number') { - var color = lowerBound; - var threshold = upperBound; - lb = new Scalar(colors.red(color) - threshold, colors.green(color) - threshold, - colors.blue(color) - threshold, colors.alpha(color)); - ub = new Scalar(colors.red(color) + threshold, colors.green(color) + threshold, - colors.blue(color) + threshold, colors.alpha(color)); - } else { - throw new TypeError('lowerBound = ' + lowerBound, + 'upperBound = ' + upperBound); - } + var lb = new Scalar(colors.red(lowerBound), colors.green(lowerBound), + colors.blue(lowerBound), colors.alpha(lowerBound)); + var ub = new Scalar(colors.red(upperBound), colors.green(upperBound), + colors.blue(upperBound), colors.alpha(lowerBound)) + if (typeof (upperBound) == 'number') { + var color = lowerBound; + var threshold = upperBound; + + } else { + throw new TypeError('lowerBound = ' + lowerBound, + 'upperBound = ' + upperBound); } var bi = new Mat(); Core.inRange(img.mat, lb, ub, bi); return images.matToImage(bi); } + images.interval = function (img, color, threshold) { + initIfNeeded(); + var lb = new Scalar(colors.red(color) - threshold, colors.green(color) - threshold, + colors.blue(color) - threshold, colors.alpha(color)); + var ub = new Scalar(colors.red(color) + threshold, colors.green(color) + threshold, + colors.blue(color) + threshold, colors.alpha(color)); + var bi = new Mat(); + Core.inRange(img.mat, lb, ub, bi); + return images.matToImage(bi); + } images.adaptiveThreshold = function (img, maxValue, adaptiveMethod, thresholdType, blockSize, C) { initIfNeeded(); @@ -225,7 +228,7 @@ module.exports = function (runtime, scope) { initIfNeeded(); var mat = new Mat(); size = newSize(size); - type = Imgproc["BORDER_" + (type || "CONSTANT")]; + type = Imgproc["BORDER_" + (type || "DEFAULT")]; if (point == undefined) { Imgproc.blur(img.mat, mat, size); } else { @@ -322,12 +325,10 @@ module.exports = function (runtime, scope) { return javaImages.rotate(img, x, y, degree); } - images.concat = function (img1, img2, direction, rect1, rect2) { + images.concat = function (img1, img2, direction) { initIfNeeded(); direction = direction || "right"; - rect1 = buildRegion(rect1, img1); - rect2 = buildRegion(rect2, img1); - return javaImages.concat(img1, rect1, img2, rect2, android.view.Gravity[direction.toUpperCase()]); + return javaImages.concat(img1, img2, android.view.Gravity[direction.toUpperCase()]); } images.detectsColor = function (img, color, x, y, threshold, algorithm) { @@ -525,7 +526,7 @@ module.exports = function (runtime, scope) { var width = region[2] === undefined ? img.getWidth() - x : region[2]; var height = region[3] === undefined ? (img.getHeight() - y) : region[3]; var r = new org.opencv.core.Rect(x, y, width, height); - if(x < 0 || y < 0 || x + width > img.width || y + height > img.height) { + if (x < 0 || y < 0 || x + width > img.width || y + height > img.height) { throw new Error("out of region: region = [" + [x, y, width, height] + "], image.size = [" + [img.width, img.height] + "]"); } return r; diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java index 2e3c13e9..a42ee0a3 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/AccessibilityBridge.java @@ -19,6 +19,10 @@ import com.stardust.autojs.core.activity.ActivityInfoProvider; import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityService; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * Created by Stardust on 2017/4/2. @@ -62,25 +66,40 @@ public abstract class AccessibilityBridge { @Nullable public abstract AccessibilityService getService(); + public List windowRoots() { + AccessibilityService service = getService(); + if (service == null) + return Collections.emptyList(); + ArrayList roots = new ArrayList<>(); + if (mWindowFilter != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + for (AccessibilityWindowInfo window : service.getWindows()) { + if (mWindowFilter.filter(window)) { + AccessibilityNodeInfo root = window.getRoot(); + if (root != null) { + roots.add(root); + } + } + } + return roots; + } + if ((mMode & MODE_FAST) != 0) { + return Collections.singletonList(service.fastRootInActiveWindow()); + } + return Collections.singletonList(service.getRootInActiveWindow()); + } + @Nullable public AccessibilityNodeInfo getRootInCurrentWindow() { AccessibilityService service = getService(); - if (service == null) return null; if (mWindowFilter != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - AccessibilityWindowInfo activeWindow = null; for (AccessibilityWindowInfo window : service.getWindows()) { if (mWindowFilter.filter(window)) { return window.getRoot(); } - if (window.isActive()) { - activeWindow = window; - } - } - if (activeWindow != null) { - return activeWindow.getRoot(); } + return null; } if ((mMode & MODE_FAST) != 0) { return service.fastRootInActiveWindow(); @@ -88,6 +107,16 @@ public abstract class AccessibilityBridge { return service.getRootInActiveWindow(); } + public AccessibilityNodeInfo getRootInActiveWindow() { + AccessibilityService service = getService(); + if (service == null) + return null; + if ((mMode & MODE_FAST) != 0) { + return service.fastRootInActiveWindow(); + } + return service.getRootInActiveWindow(); + } + public void setWindowFilter(WindowFilter windowFilter) { mWindowFilter = windowFilter; } diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java index 65c7c0e0..764279a1 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java @@ -5,7 +5,9 @@ import android.accessibilityservice.GestureDescription; import android.graphics.Rect; import android.os.Build; import android.os.Handler; + import androidx.annotation.RequiresApi; + import android.util.Log; import android.view.accessibility.AccessibilityNodeInfo; @@ -20,6 +22,8 @@ import com.stardust.automator.simple_action.SimpleAction; import com.stardust.util.DeveloperUtils; import com.stardust.util.ScreenMetrics; +import java.util.List; + /** * Created by Stardust on 2017/4/2. */ @@ -253,11 +257,15 @@ public class SimpleActionAutomator { Log.d(TAG, "performAction: running package is self. return false"); return false; } - AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow(); - if (root == null) + List roots = mAccessibilityBridge.windowRoots(); + if (roots.isEmpty()) return false; - Log.v(TAG, "performAction: " + simpleAction + " root = " + root); - return simpleAction.perform(UiObject.Companion.createRoot(root)); + Log.v(TAG, "performAction: " + simpleAction + " windowRoots = " + roots); + boolean succeed = true; + for (AccessibilityNodeInfo root : roots) { + succeed &= simpleAction.perform(UiObject.Companion.createRoot(root)); + } + return succeed; } private boolean isRunningPackageSelf() { diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java index 9f014ffc..b6785efb 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/UiSelector.java @@ -21,6 +21,9 @@ import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; + import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS; import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT; import static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE; @@ -94,17 +97,24 @@ public class UiSelector extends UiGlobalSelector { @NonNull @ScriptInterface protected UiObjectCollection findImpl(int max) { - AccessibilityNodeInfo root = mAccessibilityBridge.getRootInCurrentWindow(); + List roots = mAccessibilityBridge.windowRoots(); if (BuildConfig.DEBUG) - Log.d(TAG, "find: root = " + root); - if (root == null) { + Log.d(TAG, "find: roots = " + roots); + if (roots.isEmpty()) { return UiObjectCollection.Companion.getEMPTY(); } - if (root.getPackageName() != null && mAccessibilityBridge.getConfig().whiteListContains(root.getPackageName().toString())) { - Log.d(TAG, "package in white list, return null"); - return UiObjectCollection.Companion.getEMPTY(); + List result = new ArrayList<>(); + for (AccessibilityNodeInfo root : roots) { + if (root.getPackageName() != null && mAccessibilityBridge.getConfig().whiteListContains(root.getPackageName().toString())) { + Log.d(TAG, "package in white list, return null"); + return UiObjectCollection.Companion.getEMPTY(); + } + result.addAll(findAndReturnList(UiObject.Companion.createRoot(root, mAllocator), max - result.size())); + if (result.size() >= max) { + break; + } } - return findOf(UiObject.Companion.createRoot(root, mAllocator), max); + return UiObjectCollection.Companion.of(result); } @Override diff --git a/autojs/src/main/java/com/stardust/autojs/core/activity/ActivityInfoProvider.kt b/autojs/src/main/java/com/stardust/autojs/core/activity/ActivityInfoProvider.kt index 02393978..331cae1e 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/activity/ActivityInfoProvider.kt +++ b/autojs/src/main/java/com/stardust/autojs/core/activity/ActivityInfoProvider.kt @@ -7,8 +7,10 @@ import android.content.ComponentName import android.content.Context import android.content.pm.PackageManager import android.os.Build +import android.os.SystemClock import android.util.Log import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityWindowInfo import androidx.annotation.RequiresApi import com.stardust.app.isOpPermissionGranted import com.stardust.autojs.core.util.Shell @@ -76,7 +78,13 @@ class ActivityInfoProvider(private val context: Context) : AccessibilityDelegate override fun onAccessibilityEvent(service: AccessibilityService, event: AccessibilityEvent): Boolean { if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { - setLatestComponent(event.packageName, event.className) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val window = service.getWindow(event.windowId) + if (window?.isFocused != false) { + setLatestComponent(event.packageName, event.className) + return false + } + } } return false } @@ -146,19 +154,24 @@ class ActivityInfoProvider(private val context: Context) : AccessibilityDelegate } private fun setLatestComponent(latestPackage: CharSequence?, latestClass: CharSequence?) { - if (latestPackage == null || latestClass == null) + if (latestPackage == null) return val latestPackageStr = latestPackage.toString() - val latestClassStr = latestClass.toString() - if (latestClassStr.startsWith("android.view.") || latestClassStr.startsWith("android.widget.")) - return - try { - val componentName = ComponentName(latestPackageStr, latestClassStr) - mLatestActivity = mPackageManager.getActivityInfo(componentName, PackageManager.MATCH_DEFAULT_ONLY).name - } catch (ignored: PackageManager.NameNotFoundException) { - return + val latestClassStr = (latestClass ?: "").toString() + if (isPackageExists(latestPackageStr)) { + mLatestPackage = latestPackage.toString() + mLatestActivity = latestClassStr + } + Log.d(LOG_TAG, "setLatestComponent: $latestPackage/$latestClassStr $mLatestPackage/$mLatestActivity") + } + + private fun isPackageExists(packageName: String): Boolean { + return try { + mPackageManager.getPackageInfo(packageName, 0) + true + } catch (e: PackageManager.NameNotFoundException) { + false } - mLatestPackage = latestPackage.toString() } companion object { @@ -179,3 +192,13 @@ class ActivityInfoProvider(private val context: Context) : AccessibilityDelegate private const val LOG_TAG = "ActivityInfoProvider" } } + +@RequiresApi(Build.VERSION_CODES.LOLLIPOP) +private fun AccessibilityService.getWindow(windowId: Int): AccessibilityWindowInfo? { + windows.forEach { + if (it.id == windowId) { + return it + } + } + return null +} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java index 53fb17f9..a6ee6279 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java @@ -34,6 +34,7 @@ import com.stardust.util.ScreenMetrics; import org.opencv.core.Point; import org.opencv.core.Rect; +import org.opencv.imgproc.Imgproc; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; @@ -145,7 +146,7 @@ public class Images { return image.pixel(x, y); } - public static ImageWrapper concat(ImageWrapper img1, Rect rect1, ImageWrapper img2, Rect rect2, int direction) { + public static ImageWrapper concat(ImageWrapper img1, ImageWrapper img2, int direction) { if (!Arrays.asList(Gravity.LEFT, Gravity.RIGHT, Gravity.TOP, Gravity.BOTTOM).contains(direction)) { throw new IllegalArgumentException("unknown direction " + direction); } @@ -157,21 +158,21 @@ public class Images { img2 = tmp; } if (direction == Gravity.LEFT || direction == Gravity.RIGHT) { - width = rect1.width + rect2.width; - height = Math.max(rect1.height, rect2.height); + width = img1.getWidth() + img2.getWidth(); + height = Math.max(img1.getHeight(), img2.getHeight()); } else { - width = Math.max(rect1.width, rect2.height); - height = rect1.height + rect2.height; + width = Math.max(img1.getWidth(), img2.getHeight()); + height = img1.getHeight() + img2.getHeight(); } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); if (direction == Gravity.LEFT || direction == Gravity.RIGHT) { - canvas.drawBitmap(img1.getBitmap(), 0, (height - rect1.height) / 2, paint); - canvas.drawBitmap(img2.getBitmap(), rect1.width, (height - rect2.height) / 2, paint); + canvas.drawBitmap(img1.getBitmap(), 0, (height - img1.getHeight()) / 2, paint); + canvas.drawBitmap(img2.getBitmap(), img1.getWidth(), (height - img2.getHeight()) / 2, paint); } else { - canvas.drawBitmap(img1.getBitmap(), (width - rect1.width) / 2, 0, paint); - canvas.drawBitmap(img2.getBitmap(), (width - rect2.width) / 2, rect1.height, paint); + canvas.drawBitmap(img1.getBitmap(), (width - img1.getWidth()) / 2, 0, paint); + canvas.drawBitmap(img2.getBitmap(), (width - img2.getWidth()) / 2, img1.getHeight(), paint); } return ImageWrapper.ofBitmap(bitmap); } diff --git a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.kt b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.kt index 934ab093..591249e1 100644 --- a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.kt +++ b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.kt @@ -41,7 +41,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ override fun onAccessibilityEvent(event: AccessibilityEvent) { instance = this - //Log.v(TAG, "onAccessibilityEvent: " + event); + // Log.v(TAG, "onAccessibilityEvent: $event"); if (!containsAllEventTypes && !eventTypes.contains(event.eventType)) return val type = event.eventType diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/Pref.kt b/inrt/src/main/java/com/stardust/auojs/inrt/Pref.kt index 8a20eb26..e2e62a77 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/Pref.kt +++ b/inrt/src/main/java/com/stardust/auojs/inrt/Pref.kt @@ -14,18 +14,20 @@ object Pref { private const val KEY_FIRST_USING = "key_first_using" private var sPreferences: SharedPreferences? = null - val preferences: SharedPreferences? + val preferences: SharedPreferences get() { - if (sPreferences == null) - sPreferences = PreferenceManager.getDefaultSharedPreferences(GlobalAppContext.get()) - return sPreferences + return sPreferences ?: { + val pref = PreferenceManager.getDefaultSharedPreferences(GlobalAppContext.get()) + sPreferences = pref + pref + }() } val isFirstUsing: Boolean get() { - val firstUsing = preferences!!.getBoolean(KEY_FIRST_USING, true) + val firstUsing = preferences.getBoolean(KEY_FIRST_USING, true) if (firstUsing) { - preferences!!.edit().putBoolean(KEY_FIRST_USING, false).apply() + preferences.edit().putBoolean(KEY_FIRST_USING, false).apply() } return firstUsing } @@ -35,14 +37,14 @@ object Pref { } fun shouldEnableAccessibilityServiceByRoot(): Boolean { - return preferences!!.getBoolean(getString(R.string.key_enable_accessibility_service_by_root), false) + return preferences.getBoolean(getString(R.string.key_enable_accessibility_service_by_root), false) } fun shouldHideLogs(): Boolean { - return preferences!!.getBoolean(getString(R.string.key_dont_show_main_activity), false) + return preferences.getBoolean(getString(R.string.key_dont_show_main_activity), false) } fun shouldStopAllScriptsWhenVolumeUp(): Boolean { - return preferences!!.getBoolean(getString(R.string.key_use_volume_control_running), true) + return preferences.getBoolean(getString(R.string.key_use_volume_control_running), true) } }