diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 85995d5c..3d62b90f 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java b/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java index 6b64526c..e3189496 100644 --- a/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java +++ b/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java @@ -45,7 +45,7 @@ public class AutoJs extends com.stardust.autojs.AutoJs { } @Override - protected Console createGlobalConsole() { + protected GlobalStardustConsole createGlobalConsole() { return new GlobalStardustConsole(getUiHandler()) { @Override public String println(int level, CharSequence charSequence) { diff --git a/app/src/main/java/org/autojs/autojs/external/ScriptIntents.java b/app/src/main/java/org/autojs/autojs/external/ScriptIntents.java index 713c97e3..3dd1a304 100644 --- a/app/src/main/java/org/autojs/autojs/external/ScriptIntents.java +++ b/app/src/main/java/org/autojs/autojs/external/ScriptIntents.java @@ -41,6 +41,7 @@ public class ScriptIntents { long interval = intent.getLongExtra(EXTRA_KEY_LOOP_INTERVAL, 0); ScriptSource source = null; ExecutionConfig config = new ExecutionConfig().loop(delay, loopTimes, interval); + config.setArgument("intent", intent); if (path == null && script != null) { source = new StringScriptSource(script); } else if (path != null && new PathChecker(context).checkAndToastError(path)) { diff --git a/app/src/main/java/org/autojs/autojs/model/script/Scripts.java b/app/src/main/java/org/autojs/autojs/model/script/Scripts.java index 6281dfdb..1d8b4449 100644 --- a/app/src/main/java/org/autojs/autojs/model/script/Scripts.java +++ b/app/src/main/java/org/autojs/autojs/model/script/Scripts.java @@ -1,5 +1,6 @@ package org.autojs.autojs.model.script; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.annotation.Nullable; @@ -147,9 +148,10 @@ public class Scripts { } public static void send(ScriptFile file) { - GlobalAppContext.get().startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND) + Context context = GlobalAppContext.get(); + context.startActivity(Intent.createChooser(new Intent(Intent.ACTION_SEND) .setType("text/plain") - .putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)), + .putExtra(Intent.EXTRA_STREAM, IntentUtil.getUriOfFile(context, file.getPath(), AppFileProvider.AUTHORITY)), GlobalAppContext.getString(R.string.text_send) ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/FullScreenFloatyWindow.java b/app/src/main/java/org/autojs/autojs/ui/floating/FullScreenFloatyWindow.java index 4950c845..82d79e4e 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/FullScreenFloatyWindow.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/FullScreenFloatyWindow.java @@ -24,7 +24,7 @@ public abstract class FullScreenFloatyWindow implements FloatyWindow { mLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_PHONE, + FloatyWindowManger.getWindowType(), WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSLUCENT); mWindowManager.addView(mView, mLayoutParams); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java index 80ee1ff0..60dee927 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java @@ -13,6 +13,7 @@ import com.stardust.app.DialogUtils; import com.stardust.enhancedfloaty.FloatyService; import org.autojs.autojs.R; import org.autojs.autojs.ui.codegeneration.CodeGenerateDialog; +import org.autojs.autojs.ui.floating.FloatyWindowManger; import org.autojs.autojs.ui.floating.FullScreenFloatyWindow; import com.stardust.view.accessibility.NodeInfo; import org.autojs.autojs.ui.widget.BubblePopupMenu; @@ -115,7 +116,7 @@ public class LayoutBoundsFloatyWindow extends FullScreenFloatyWindow { .customView(mNodeInfoView, false) .theme(Theme.LIGHT) .build(); - mNodeInfoDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE); + mNodeInfoDialog.getWindow().setType(FloatyWindowManger.getWindowType()); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java index e2519d91..2c4f1848 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java @@ -14,6 +14,7 @@ import com.stardust.app.DialogUtils; import com.stardust.enhancedfloaty.FloatyService; import org.autojs.autojs.R; import org.autojs.autojs.ui.codegeneration.CodeGenerateDialog; +import org.autojs.autojs.ui.floating.FloatyWindowManger; import org.autojs.autojs.ui.floating.FullScreenFloatyWindow; import com.stardust.view.accessibility.NodeInfo; import org.autojs.autojs.ui.widget.BubblePopupMenu; @@ -124,7 +125,7 @@ public class LayoutHierarchyFloatyWindow extends FullScreenFloatyWindow { .theme(Theme.LIGHT) .build(); if (mNodeInfoDialog.getWindow() != null) - mNodeInfoDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE); + mNodeInfoDialog.getWindow().setType(FloatyWindowManger.getWindowType()); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index e413073c..2db4e801 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -2,15 +2,14 @@ package org.autojs.autojs.ui.project; import android.annotation.SuppressLint; import android.content.Intent; -import android.content.pm.PackageManager; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; import android.support.v7.widget.CardView; +import android.text.Editable; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -25,7 +24,6 @@ import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; -import org.autojs.autojs.App; import org.autojs.autojs.Pref; import org.autojs.autojs.R; import org.autojs.autojs.autojs.build.AutoJsApkBuilder; @@ -41,9 +39,9 @@ import org.autojs.autojs.ui.shortcut.ShortcutIconSelectActivity_; import java.io.File; import java.io.InputStream; -import java.security.KeyStore; import java.util.Locale; import java.util.concurrent.Callable; +import java.util.regex.Pattern; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -60,6 +58,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog public static final String EXTRA_SOURCE = BuildActivity.class.getName() + ".extra_source_file"; private static final String LOG_TAG = "BuildActivity"; + private static final Pattern REGEX_PACKAGE_NAME = Pattern.compile("^([A-Za-z][A-Za-z\\d_]*\\.)+([A-Za-z][A-Za-z\\d_]*)$"); @ViewById(R.id.source_path) TextInputEditText mSourcePath; @@ -221,10 +220,25 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog inputValid &= checkNotEmpty(mSourcePath); inputValid &= checkNotEmpty(mVersionCode); inputValid &= checkNotEmpty(mVersionName); - inputValid &= checkNotEmpty(mPackageName); + inputValid &= checkPackageNameValid(mPackageName); return inputValid; } + private boolean checkPackageNameValid(TextInputEditText editText) { + Editable text = editText.getText(); + String hint = ((TextInputLayout) editText.getParent().getParent()).getHint().toString(); + if(TextUtils.isEmpty(text)){ + editText.setError(hint + getString(R.string.text_should_not_be_empty)); + return false; + } + if(!REGEX_PACKAGE_NAME.matcher(text).matches()){ + editText.setError(getString(R.string.text_invalid_package_name)); + return false; + } + return true; + + } + private boolean checkNotEmpty(TextInputEditText editText) { if (!TextUtils.isEmpty(editText.getText()) || !editText.isShown()) return true; diff --git a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java index d6b834d4..03210a45 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java @@ -7,6 +7,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; +import android.text.Editable; import android.text.TextUtils; import android.view.View; import android.widget.EditText; @@ -35,6 +36,7 @@ import org.autojs.autojs.ui.widget.SimpleTextWatcher; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.regex.Pattern; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -50,6 +52,7 @@ public class ProjectConfigActivity extends BaseActivity { public static final String EXTRA_DIRECTORY = "directory"; private static final int REQUEST_CODE = 12477; + private static final Pattern REGEX_PACKAGE_NAME = Pattern.compile("^([A-Za-z][A-Za-z\\d_]*\\.)+([A-Za-z][A-Za-z\\d_]*)$"); @ViewById(R.id.project_location) @@ -138,10 +141,10 @@ public class ProjectConfigActivity extends BaseActivity { @SuppressLint("CheckResult") @Click(R.id.fab) void commit() { - syncProjectConfig(); if (!checkInputs()) { return; } + syncProjectConfig(); if (mIconBitmap != null) { saveIcon(mIconBitmap) .subscribe(ignored -> saveProjectConfig(), e -> { @@ -209,10 +212,25 @@ public class ProjectConfigActivity extends BaseActivity { inputValid &= checkNotEmpty(mAppName); inputValid &= checkNotEmpty(mVersionCode); inputValid &= checkNotEmpty(mVersionName); - inputValid &= checkNotEmpty(mPackageName); + inputValid &= checkPackageNameValid(mPackageName); return inputValid; } + private boolean checkPackageNameValid(TextInputEditText editText) { + Editable text = editText.getText(); + String hint = ((TextInputLayout) editText.getParent().getParent()).getHint().toString(); + if(TextUtils.isEmpty(text)){ + editText.setError(hint + getString(R.string.text_should_not_be_empty)); + return false; + } + if(!REGEX_PACKAGE_NAME.matcher(text).matches()){ + editText.setError(getString(R.string.text_invalid_package_name)); + return false; + } + return true; + + } + private boolean checkNotEmpty(TextInputEditText editText) { if (!TextUtils.isEmpty(editText.getText())) return true; diff --git a/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java b/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java index a4d4ce31..5c963612 100644 --- a/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java @@ -2,6 +2,7 @@ package org.autojs.autojs.ui.timing; import android.app.DatePickerDialog; import android.app.TimePickerDialog; +import android.content.ActivityNotFoundException; import android.content.Intent; import android.graphics.ColorFilter; import android.net.ConnectivityManager; @@ -346,8 +347,13 @@ public class TimedTaskSettingActivity extends BaseActivity { public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_done) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !((PowerManager) getSystemService(POWER_SERVICE)).isIgnoringBatteryOptimizations(getPackageName())) { - startActivityForResult(new Intent().setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) - .setData(Uri.parse("package:" + getPackageName())), REQUEST_CODE_IGNORE_BATTERY); + try{ + startActivityForResult(new Intent().setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + .setData(Uri.parse("package:" + getPackageName())), REQUEST_CODE_IGNORE_BATTERY); + }catch(ActivityNotFoundException e){ + e.printStackTrace(); + createOrUpdateTask(); + } } else { createOrUpdateTask(); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b17927a..53c5f5d7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -422,4 +422,5 @@ 每分钟一次 某些设置(屏幕方向,地区等)更改时 正则表达式错误 + 非法包名 diff --git a/autojs/src/main/java/com/stardust/autojs/AutoJs.java b/autojs/src/main/java/com/stardust/autojs/AutoJs.java index 3ed9b9ac..f6de2cbe 100644 --- a/autojs/src/main/java/com/stardust/autojs/AutoJs.java +++ b/autojs/src/main/java/com/stardust/autojs/AutoJs.java @@ -54,7 +54,7 @@ public abstract class AutoJs { private final AccessibilityInfoProvider mAccessibilityInfoProvider; private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl(); private final ScriptEngineService mScriptEngineService; - private final Console mGlobalConsole; + private final GlobalStardustConsole mGlobalConsole; protected AutoJs(final Application application) { @@ -70,7 +70,7 @@ public abstract class AutoJs { init(); } - protected Console createGlobalConsole() { + protected GlobalStardustConsole createGlobalConsole() { return new GlobalStardustConsole(mUiHandler); } @@ -161,7 +161,7 @@ public abstract class AutoJs { return mLayoutInspector; } - public Console getGlobalConsole() { + public GlobalStardustConsole getGlobalConsole() { return mGlobalConsole; } 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 0ed26141..69be948b 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 @@ -3,6 +3,7 @@ package com.stardust.autojs.core.console; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; +import android.util.Log; import android.view.WindowManager; import com.stardust.autojs.R; @@ -17,6 +18,8 @@ import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.util.UiHandler; import com.stardust.util.ViewUtil; +import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.concurrent.ArrayBlockingQueue; @@ -115,6 +118,13 @@ public class StardustConsole extends AbstractConsole { return mLogs; } + public void printStackTrace(Throwable t) { + StringWriter out = new StringWriter(); + PrintWriter printWriter = new PrintWriter(out); + t.printStackTrace(printWriter); + println(android.util.Log.ERROR, t.toString()); + } + @Override public String println(int level, CharSequence charSequence) { Log log = new Log(mIdCounter.getAndIncrement(), level, charSequence, true); diff --git a/autojs/src/main/java/com/stardust/autojs/core/floaty/BaseResizableFloatyWindow.java b/autojs/src/main/java/com/stardust/autojs/core/floaty/BaseResizableFloatyWindow.java index 8ad0dde7..70c5de05 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/floaty/BaseResizableFloatyWindow.java +++ b/autojs/src/main/java/com/stardust/autojs/core/floaty/BaseResizableFloatyWindow.java @@ -2,10 +2,12 @@ package com.stardust.autojs.core.floaty; import android.content.Context; import android.graphics.PixelFormat; +import android.os.Build; import android.support.annotation.Nullable; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; @@ -115,10 +117,16 @@ public class BaseResizableFloatyWindow extends ResizableFloatyWindow { } private WindowManager.LayoutParams createWindowLayoutParams() { + int type; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + type = WindowManager.LayoutParams.TYPE_PHONE; + } WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_PHONE, + type, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, PixelFormat.TRANSLUCENT); layoutParams.gravity = Gravity.TOP | Gravity.START; diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/ColorFinder.java b/autojs/src/main/java/com/stardust/autojs/core/image/ColorFinder.java index 6392b5f0..38eb8f6d 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/ColorFinder.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/ColorFinder.java @@ -112,7 +112,8 @@ public class ColorFinder { ColorDetector colorDetector = new ColorDetector.DifferenceDetector(color, threshold); x += startingPoint.x; y += startingPoint.y; - if (x >= image.getWidth() || y >= image.getHeight()) { + if (x >= image.getWidth() || y >= image.getHeight() + || x < 0 || y < 0) { return false; } int c = image.pixel(x, y); diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java b/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java index 6a328ce6..75afd7dd 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/ImageWrapper.java @@ -81,14 +81,17 @@ public class ImageWrapper { } public int getWidth() { + ensureNotRecycled(); return mWidth; } public int getHeight() { + ensureNotRecycled(); return mHeight; } public Mat getMat() { + ensureNotRecycled(); if (mMat == null && mBitmap != null) { mMat = new Mat(); Utils.bitmapToMat(mBitmap, mMat); @@ -119,6 +122,7 @@ public class ImageWrapper { } public Bitmap getBitmap() { + ensureNotRecycled(); return mBitmap; } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/BlockedMaterialDialog.java b/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/BlockedMaterialDialog.java index b84f30df..57cc2951 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/BlockedMaterialDialog.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/BlockedMaterialDialog.java @@ -3,8 +3,10 @@ package com.stardust.autojs.core.ui.dialog; import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; +import android.os.Build; import android.os.Looper; import android.support.annotation.Nullable; +import android.view.Window; import android.view.WindowManager; import com.afollestad.materialdialogs.DialogAction; @@ -29,7 +31,13 @@ public class BlockedMaterialDialog extends MaterialDialog { @Override public void show() { if (!isActivityContext(getContext())) { - getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE); + int type; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + type = WindowManager.LayoutParams.TYPE_PHONE; + } + getWindow().setType(type); } super.show(); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialog.java b/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialog.java index b3b7da89..15b94c4d 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialog.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialog.java @@ -79,8 +79,15 @@ public class JsDialog { Context context = mDialog.getContext(); if (!DialogUtils.isActivityContext(context)) { Window window = mDialog.getWindow(); - if (window != null) - window.setType(WindowManager.LayoutParams.TYPE_PHONE); + if (window != null){ + int type; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + type = WindowManager.LayoutParams.TYPE_PHONE; + } + window.setType(type); + } } } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java index 9f491a38..1457471d 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -193,6 +193,7 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine { } return super.wrap(cx, scope, obj, staticType); } + } private static class InterruptibleAndroidContextFactory extends AndroidContextFactory { diff --git a/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaClassWithPrototype.java b/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaClassWithPrototype.java index 8541f020..e8c15cb9 100644 --- a/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaClassWithPrototype.java +++ b/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaClassWithPrototype.java @@ -14,7 +14,7 @@ import java.util.concurrent.ConcurrentHashMap; public class NativeJavaClassWithPrototype extends NativeJavaClass { private static final Object NULL = new Object(); - private ConcurrentHashMap mProperties = new ConcurrentHashMap(); + private ConcurrentHashMap mProperties = new ConcurrentHashMap<>(); public NativeJavaClassWithPrototype(Scriptable scope, Class javaClass) { super(scope, javaClass); diff --git a/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaObjectWithPrototype.java b/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaObjectWithPrototype.java index 0a5ae184..40970374 100644 --- a/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaObjectWithPrototype.java +++ b/autojs/src/main/java/com/stardust/autojs/rhino/NativeJavaObjectWithPrototype.java @@ -14,6 +14,14 @@ public class NativeJavaObjectWithPrototype extends NativeJavaObject { super(scope, javaObject, staticType); } + public NativeJavaObjectWithPrototype(Scriptable scope, Object javaObject, Class staticType, boolean isAdapter) { + super(scope, javaObject, staticType, isAdapter); + } + + public NativeJavaObjectWithPrototype() { + } + + @Override public boolean has(String name, Scriptable start) { return super.has(name, start) || (prototype != null && prototype.has(name, start)) diff --git a/automator/src/main/java/com/stardust/automator/UiObject.java b/automator/src/main/java/com/stardust/automator/UiObject.java index 477fb2a8..e3703366 100644 --- a/automator/src/main/java/com/stardust/automator/UiObject.java +++ b/automator/src/main/java/com/stardust/automator/UiObject.java @@ -63,6 +63,7 @@ public class UiObject extends AccessibilityNodeInfoCompat { mIndexInParent = indexInParent; if (DEBUG) mStackTrace = Arrays.toString(Thread.currentThread().getStackTrace()); + } diff --git a/common/src/main/java/com/stardust/pio/PFiles.java b/common/src/main/java/com/stardust/pio/PFiles.java index b304b98a..d61825c6 100644 --- a/common/src/main/java/com/stardust/pio/PFiles.java +++ b/common/src/main/java/com/stardust/pio/PFiles.java @@ -4,6 +4,8 @@ import android.app.NativeActivity; import android.content.Context; import android.content.res.AssetManager; import android.os.Environment; +import android.text.TextUtils; +import android.util.Log; import com.stardust.util.Func1; @@ -18,6 +20,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; import java.nio.charset.Charset; +import java.util.Arrays; import java.util.Locale; /** @@ -284,31 +287,36 @@ public class PFiles { } - public static boolean copyAssetDir(Context context, String assetsDir, String toDir) { + public static void copyAssetDir(Context context, String assetsDir, String toDir, String[] list) throws IOException { new File(toDir).mkdirs(); AssetManager manager = context.getAssets(); - try { - String[] list = manager.list(assetsDir); - if (list == null) - return false; - for (String file : list) { - InputStream stream; - try { - stream = manager.open(join(assetsDir, file)); - } catch (IOException e) { - if (!copyAssetDir(context, join(assetsDir, file), join(toDir, file))) { - return false; - } - continue; - } - copyStream(stream, join(toDir, file)); - } - } catch (IOException e) { - e.printStackTrace(); - return false; + if (list == null) { + list = manager.list(assetsDir); + } + if (list == null) + throw new IOException("not a directory: " + assetsDir); + for (String file : list) { + if(TextUtils.isEmpty(file)){ + continue; + } + String fullAssetsPath = join(assetsDir, file); + String[] children = manager.list(fullAssetsPath); + if (children == null || children.length == 0) { + InputStream stream = null; + try { + stream = manager.open(fullAssetsPath); + copyStream(stream, join(toDir, file)); + } catch (IOException e) { + throw e; + } finally { + if (stream != null) { + stream.close(); + } + } + } else { + copyAssetDir(context, fullAssetsPath, join(toDir, file), children); + } } - return true; - } public static String renameWithoutExtensionAndReturnNewPath(String path, String newName) { diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java b/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java index 63080711..6b35b91e 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java @@ -12,17 +12,16 @@ import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; +import android.widget.Toast; -import com.stardust.auojs.inrt.launch.AssetsProjectLauncher; +import com.stardust.auojs.inrt.autojs.AutoJs; import com.stardust.auojs.inrt.launch.GlobalProjectLauncher; import com.stardust.autojs.core.image.OpenCVHelper; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static android.content.pm.PackageManager.PERMISSION_DENIED; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; /** * Created by Stardust on 2018/2/2. @@ -58,7 +57,18 @@ public class SplashActivity extends AppCompatActivity { private void runScript() { - new Thread(() -> GlobalProjectLauncher.getInstance().launch(this)).start(); + new Thread(() -> { + try { + GlobalProjectLauncher.getInstance().launch(this); + } catch (Exception e) { + e.printStackTrace(); + runOnUiThread(() -> { + Toast.makeText(SplashActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); + startActivity(new Intent(SplashActivity.this, LogActivity.class)); + AutoJs.getInstance().getGlobalConsole().printStackTrace(e); + }); + } + }).start(); } @Override diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java b/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java index e8845c27..2c63012e 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java @@ -17,8 +17,10 @@ import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.project.ProjectConfig; import com.stardust.autojs.script.JavaScriptFileSource; import com.stardust.pio.PFiles; +import com.stardust.pio.UncheckedIOException; import java.io.File; +import java.io.IOException; /** * Created by Stardust on 2018/1/24. @@ -86,8 +88,12 @@ public class AssetsProjectLauncher { TextUtils.equals(projectConfig.getBuildInfo().getBuildId(), mProjectConfig.getBuildInfo().getBuildId())) { return; } - PFiles.deleteRecursively(new File(mAssetsProjectDir)); - PFiles.copyAssetDir(mActivity, mAssetsProjectDir, mProjectDir); + PFiles.deleteRecursively(new File(mProjectDir)); + try { + PFiles.copyAssetDir(mActivity, mAssetsProjectDir, mProjectDir, null); + } catch (IOException e) { + throw new UncheckedIOException(e); + } } }