From 51349356a75469aabeac54493ff6ea070a347e04 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 29 Apr 2017 21:23:45 +0800 Subject: [PATCH] Commit Test --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 2 +- app/src/main/assets/numbers/0.png | Bin 18327 -> 0 bytes app/src/main/assets/numbers/1.png | Bin 18026 -> 0 bytes app/src/main/assets/numbers/2.png | Bin 18257 -> 0 bytes app/src/main/assets/numbers/3.png | Bin 18252 -> 0 bytes app/src/main/assets/numbers/4.png | Bin 18153 -> 0 bytes app/src/main/assets/numbers/5.png | Bin 18253 -> 0 bytes app/src/main/assets/numbers/6.png | Bin 18348 -> 0 bytes app/src/main/assets/numbers/7.png | Bin 18118 -> 0 bytes app/src/main/assets/numbers/8.png | Bin 18370 -> 0 bytes app/src/main/assets/numbers/9.png | Bin 18315 -> 0 bytes .../assets/sample/Shell命令/小米6666脚本.js | 29 --- .../app/FragmentPagerAdapterBuilder.java | 13 ++ .../main/java/com/stardust/mi666/Cracker.java | 68 ------ app/src/main/java/com/stardust/mi666/OCR.java | 81 ------- .../main/java/com/stardust/mi666/Solver.java | 55 ----- .../com/stardust/mi666/ocr/ColorDetector.java | 53 ----- .../main/java/com/stardust/mi666/ocr/OCR.java | 15 -- .../com/stardust/mi666/ocr/SimpleOCR.java | 142 ------------ .../mi666/ocr/SimpleTextDetector.java | 34 --- .../mi666/ocr/SimpleTextSplitter.java | 52 ----- .../stardust/mi666/ocr/TemplateMatching.java | 109 ---------- .../java/com/stardust/scriptdroid/App.java | 8 +- .../java/com/stardust/scriptdroid/Pref.java | 9 + .../content/ScriptListNavigatorContent.java | 1 - .../view/FloatingLayoutBoundsView.java | 1 - .../view/FloatingScriptFileListView.java | 205 ------------------ .../external/open/ImportIntentActivity.java | 10 +- .../view/LayoutBoundsView.java | 16 +- .../scriptdroid/scripts/sample/Sample.java | 5 +- .../stardust/scriptdroid/tool/ImagePHash.java | 162 -------------- .../scriptdroid/ui/console/TimberConsole.java | 22 +- .../scriptdroid/ui/edit/EditActivity.java | 131 +++-------- .../ui/edit/ViewSampleActivity.java | 171 +++++++++++++++ .../scriptdroid/ui/main/MainActivity.java | 60 ++++- .../main/operation/ScriptFileOperation.java | 199 ++++------------- .../ScriptFileOperationPopupMenu.java | 174 --------------- .../sample_list/SampleScriptListFragment.java | 7 +- .../script_list/MyScriptListFragment.java | 16 +- .../ScriptAndFolderListRecyclerView.java | 7 +- .../script_list/ScriptListRecyclerView.java | 151 ------------- .../ScriptListWithProgressBarView.java | 15 +- .../ui/settings/SettingsActivity.java | 1 + .../scriptdroid/ui/update/VersionGuard.java | 13 +- .../com/stardust/widget/SlidingUpPanel.java | 1 + app/src/main/res/layout/activity_edit.xml | 16 +- .../main/res/layout/activity_view_sample.xml | 86 ++++++++ .../layout/air_activity_issue_reporter.xml | 11 +- .../res/layout/air_card_report_compat.xml | 120 ++++++++++ .../layout/script_and_folder_list_view.xml | 13 +- ...ript_file_operation_popup_menu_content.xml | 14 -- .../script_file_operation_popup_menu_item.xml | 27 --- app/src/main/res/menu/menu_editor.xml | 14 +- app/src/main/res/menu/menu_view_sample.xml | 23 ++ app/src/main/res/values-en/strings.xml | 34 +-- app/src/main/res/values/strings.xml | 14 +- app/src/main/res/xml/preferences.xml | 20 +- .../engine/JavaScriptEngineManager.java | 3 +- .../autojs/engine/RhinoJavaScriptEngine.java | 10 +- .../autojs/runtime/api/AutomatorConfig.java | 19 ++ .../autojs/runtime/api/UiSelector.java | 7 +- .../simple_action/SimpleActionAutomator.java | 8 +- .../stardust/pio/PRandomAccessBinaryFile.java | 29 +++ .../com/stardust/util/DeveloperUtils.java | 2 +- 65 files changed, 758 insertions(+), 1751 deletions(-) delete mode 100644 app/src/main/assets/numbers/0.png delete mode 100644 app/src/main/assets/numbers/1.png delete mode 100644 app/src/main/assets/numbers/2.png delete mode 100644 app/src/main/assets/numbers/3.png delete mode 100644 app/src/main/assets/numbers/4.png delete mode 100644 app/src/main/assets/numbers/5.png delete mode 100644 app/src/main/assets/numbers/6.png delete mode 100644 app/src/main/assets/numbers/7.png delete mode 100644 app/src/main/assets/numbers/8.png delete mode 100644 app/src/main/assets/numbers/9.png delete mode 100644 app/src/main/assets/sample/Shell命令/小米6666脚本.js delete mode 100644 app/src/main/java/com/stardust/mi666/Cracker.java delete mode 100644 app/src/main/java/com/stardust/mi666/OCR.java delete mode 100644 app/src/main/java/com/stardust/mi666/Solver.java delete mode 100644 app/src/main/java/com/stardust/mi666/ocr/ColorDetector.java delete mode 100644 app/src/main/java/com/stardust/mi666/ocr/OCR.java delete mode 100644 app/src/main/java/com/stardust/mi666/ocr/SimpleOCR.java delete mode 100644 app/src/main/java/com/stardust/mi666/ocr/SimpleTextDetector.java delete mode 100644 app/src/main/java/com/stardust/mi666/ocr/SimpleTextSplitter.java delete mode 100644 app/src/main/java/com/stardust/mi666/ocr/TemplateMatching.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingScriptFileListView.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/tool/ImagePHash.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListRecyclerView.java create mode 100644 app/src/main/res/layout/activity_view_sample.xml create mode 100644 app/src/main/res/layout/air_card_report_compat.xml delete mode 100644 app/src/main/res/layout/script_file_operation_popup_menu_content.xml delete mode 100644 app/src/main/res/layout/script_file_operation_popup_menu_item.xml create mode 100644 app/src/main/res/menu/menu_view_sample.xml create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/api/AutomatorConfig.java create mode 100644 common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java diff --git a/app/build.gradle b/app/build.gradle index 8a6d71b3..7bc80ffe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,7 @@ dependencies { compile group:'com.twofortyfouram', name:'android-plugin-client-sdk-for-locale', version:'[4.0.2, 5.0[' compile 'com.android.volley:volley:1.0.0' compile 'com.github.hyb1996:EnhancedFloaty:0.11' + compile 'com.android.support:multidex:1.0.1' compile(name: 'libtermexec-release', ext: 'aar') compile(name: 'emulatorview-release', ext: 'aar') compile(name: 'term-debug', ext: 'aar') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 19671223..b69ce066 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -77,13 +77,13 @@ + - diff --git a/app/src/main/assets/numbers/0.png b/app/src/main/assets/numbers/0.png deleted file mode 100644 index 782245b32c3c3fd26ffac623f415f750b454fdcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18327 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 diff --git a/app/src/main/assets/numbers/6.png b/app/src/main/assets/numbers/6.png deleted file mode 100644 index d5a756a3d500ec64d9ecdae161c2529015ff5a00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18348 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 diff --git a/app/src/main/assets/numbers/7.png b/app/src/main/assets/numbers/7.png deleted file mode 100644 index dc46da63fc2f9941a262078ba0ced1fd00d011bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18118 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 Ra{6ItEA!1}`6eD={|9|Ns~7+P diff --git a/app/src/main/assets/numbers/9.png b/app/src/main/assets/numbers/9.png deleted file mode 100644 index a17fa2120a8a99df9cd3534b5f48663d9861b71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18315 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 PtJ%`r#w^>!WB>mH#LbdX diff --git a/app/src/main/assets/sample/Shell命令/小米6666脚本.js b/app/src/main/assets/sample/Shell命令/小米6666脚本.js deleted file mode 100644 index 9327b560..00000000 --- a/app/src/main/assets/sample/Shell命令/小米6666脚本.js +++ /dev/null @@ -1,29 +0,0 @@ -importClass(com.stardust.mi666.Cracker); -var cracker = new Cracker(); -const path = "/sdcard/666.png"; -var count = 1; -sleep(2000); -while(notStopped()){ - Screencap(path); - sleep(2000); - toast("你已经被耍了" + count + "次"); - var coords = cracker.crack(path); - for each(var coord in coords){ - Tap(coord[0], coord[1]); - } - sleep(9000); - 关闭(); - sleep(2000); - console.log(++count); - 再玩一次(); - sleep(10000); -} - - -function 关闭(){ - Tap(933, 660); -} - -function 再玩一次(){ - Tap(521, 1615); -} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/app/FragmentPagerAdapterBuilder.java b/app/src/main/java/com/stardust/app/FragmentPagerAdapterBuilder.java index 954a48aa..a1199590 100644 --- a/app/src/main/java/com/stardust/app/FragmentPagerAdapterBuilder.java +++ b/app/src/main/java/com/stardust/app/FragmentPagerAdapterBuilder.java @@ -16,6 +16,10 @@ import java.util.List; public class FragmentPagerAdapterBuilder { + public interface OnFragmentInstantiateListener { + void OnInstantiate(Fragment fragment); + } + private List mFragments = new ArrayList<>(); private List mTitles = new ArrayList<>(); private FragmentActivity mActivity; @@ -56,6 +60,7 @@ public class FragmentPagerAdapterBuilder { public abstract static class StoredFragmentPagerAdapter extends FragmentPagerAdapter { private SparseArray mStoredFragments = new SparseArray<>(); + private OnFragmentInstantiateListener mOnFragmentInstantiateListener; public StoredFragmentPagerAdapter(FragmentManager fm) { super(fm); @@ -65,9 +70,13 @@ public class FragmentPagerAdapterBuilder { public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); mStoredFragments.put(position, fragment); + if(mOnFragmentInstantiateListener != null){ + mOnFragmentInstantiateListener.OnInstantiate(fragment); + } return fragment; } + @Override public void destroyItem(ViewGroup container, int position, Object object) { mStoredFragments.remove(position); @@ -77,5 +86,9 @@ public class FragmentPagerAdapterBuilder { public Fragment getStoredFragment(int position) { return mStoredFragments.get(position); } + + public void setOnFragmentInstantiateListener(OnFragmentInstantiateListener onFragmentInstantiateListener) { + mOnFragmentInstantiateListener = onFragmentInstantiateListener; + } } } diff --git a/app/src/main/java/com/stardust/mi666/Cracker.java b/app/src/main/java/com/stardust/mi666/Cracker.java deleted file mode 100644 index e2dc1f90..00000000 --- a/app/src/main/java/com/stardust/mi666/Cracker.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.stardust.mi666; - -import com.stardust.util.ScreenMetrics; - -import java.util.List; - -/** - * Created by Stardust on 2017/4/24. - */ - -public class Cracker { - - private OCR mOCR; - private Solver mSolver; - private int mX, mY, mIntervalX, mIntervalY, mWidth, mHeight; - - private void init(int x, int y, int intervalX, int intervalY, int w, int h) { - mOCR = new OCR(x, y, intervalX, intervalY, w, h); - mSolver = new Solver(); - mX = x; - mY = y; - mIntervalY = intervalY; - mIntervalX = intervalX; - mWidth = w; - mHeight = h; - } - - public Cracker() { - if (ScreenMetrics.getScreenWidth() == 1080 && ScreenMetrics.getScreenHeight() == 1920) { - init(68, 724, 238, 236, 228, 68); - } else { - double scaleX = 1080 / ScreenMetrics.getScreenWidth(); - double scaleY = 1920 / ScreenMetrics.getScreenHeight(); - init((int) (68 * scaleX), (int) (724 * scaleY), (int) (238 * scaleX), (int) (236 * scaleY), (int) (228 * scaleX), (int) (68 * scaleY)); - } - } - - public int[][] crack(String path) { - List numbers = mOCR.detect(path); - mSolver.solve(numbers); - if (!mSolver.isSolved()) { - return new int[0][]; - } - List result = mSolver.getResult(); - boolean[] used = new boolean[numbers.size()]; - int[][] coordinates = new int[result.size()][2]; - for (int i = 0; i < coordinates.length; i++) { - int index = indexOf(numbers, used, result.get(i)); - int row = index / 4; - int col = index % 4; - int x = mX + mIntervalX * col + mWidth / 2; - int y = mY + mIntervalY * row + mHeight / 2; - coordinates[i][0] = x; - coordinates[i][1] = y; - } - return coordinates; - } - - private int indexOf(List numbers, boolean[] used, int integer) { - for (int i = 0; i < numbers.size(); i++) { - if (numbers.get(i) == integer && !used[i]) { - used[i] = true; - return i; - } - } - return -1; - } -} diff --git a/app/src/main/java/com/stardust/mi666/OCR.java b/app/src/main/java/com/stardust/mi666/OCR.java deleted file mode 100644 index 3d29edc7..00000000 --- a/app/src/main/java/com/stardust/mi666/OCR.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.stardust.mi666; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.util.Log; - -import com.stardust.mi666.ocr.ColorDetector; -import com.stardust.mi666.ocr.SimpleTextSplitter; -import com.stardust.mi666.ocr.TemplateMatching; -import com.stardust.pio.UncheckedIOException; -import com.stardust.util.ViewUtil; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/4/24. - */ - -public class OCR { - - private static com.stardust.mi666.ocr.OCR ocr; - private static SimpleTextSplitter textSplitter; - - static { - ColorDetector colorDetector = new ColorDetector.SimpleColorDetector(0xff9f826f); - ocr = new TemplateMatching.TemplateMatchingOCR(1, colorDetector); - textSplitter = new SimpleTextSplitter(colorDetector); - } - - private int mX, mY, mIntervalX, mIntervalY, mWidth, mHeight; - - public OCR(int x, int y, int intervalX, int intervalY, int w, int h) { - mX = x; - mY = y; - mIntervalY = intervalY; - mIntervalX = intervalX; - mWidth = w; - mHeight = h; - } - - public static void init(Context context) { - try { - for (int i = 0; i < 10; i++) { - Bitmap number = BitmapFactory.decodeStream(context.getAssets().open("numbers/" + i + ".png")); - ocr.addChar((char) ('0' + i), number); - } - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public List detect(String path) { - Bitmap screenshot = BitmapFactory.decodeFile(path); - try { - List numbers = new ArrayList<>(16); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - Bitmap block = getBlockAt(screenshot, i, j); - List bitmaps = textSplitter.split(block); - StringBuilder sb = new StringBuilder(); - for (Bitmap num : bitmaps) { - sb.append(ocr.detect(num)); - } - numbers.add(Integer.parseInt(sb.toString())); - Log.i("TestOCR", "result = " + sb); - } - } - return numbers; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - private Bitmap getBlockAt(Bitmap bitmap, int row, int col) { - return Bitmap.createBitmap(bitmap, mX + col * mIntervalX, mY + row * mIntervalY, mWidth, mHeight); - } -} diff --git a/app/src/main/java/com/stardust/mi666/Solver.java b/app/src/main/java/com/stardust/mi666/Solver.java deleted file mode 100644 index 58897f29..00000000 --- a/app/src/main/java/com/stardust/mi666/Solver.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.stardust.mi666; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/4/24. - */ - -public class Solver { - - private boolean mSolved = false; - private List mResult = new ArrayList<>(); - private List mTmpList = new ArrayList<>(); - private int[] value; - - - void solve(int sum, int index) { - if (mSolved || index < 0) return; - if (sum == value[index] && mTmpList.size() == 5) { - mSolved = true; - mTmpList.add(value[index]); - mResult.addAll(mTmpList); - return; - } - mTmpList.add(value[index]); - solve(sum - value[index], index - 1); - mTmpList.remove(mTmpList.size() - 1); - solve(sum, index - 1); - } - - public void solve(int[] num) { - mResult.clear(); - mTmpList.clear(); - mSolved = false; - value = num; - solve(6666, 15); - } - - public boolean isSolved() { - return mSolved; - } - - public List getResult() { - return mResult; - } - - public void solve(List numbers) { - int[] num = new int[numbers.size()]; - for (int i = 0; i < num.length; i++) { - num[i] = numbers.get(i); - } - solve(num); - } -} diff --git a/app/src/main/java/com/stardust/mi666/ocr/ColorDetector.java b/app/src/main/java/com/stardust/mi666/ocr/ColorDetector.java deleted file mode 100644 index 9472b374..00000000 --- a/app/src/main/java/com/stardust/mi666/ocr/ColorDetector.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.stardust.mi666.ocr; - -import android.graphics.Color; - -/** - * Created by Stardust on 2017/4/23. - */ - -public interface ColorDetector { - - boolean isCharPixel(int color); - - class ColorDistanceDetector implements ColorDetector { - - private int mColor; - private double mThreshold; - - public ColorDistanceDetector(int color, double threshold) { - mColor = color; - mThreshold = threshold; - } - - public static double distance(int c1, int c2) { - double meanR = (Color.red(c1) + Color.red(c2)) / 2; - int r = Color.red(c1) - Color.red(c2); - int g = Color.green(c1) - Color.green(c2); - int b = Color.blue(c1) - Color.blue(c2); - double weightR = 2 + meanR / 256; - double weightG = 4.0; - double weightB = 2 + (255 - meanR) / 256; - return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b); - } - - @Override - public boolean isCharPixel(int color) { - return distance(color, mColor) < mThreshold; - } - } - - class SimpleColorDetector implements ColorDetector { - - private int mColor; - - public SimpleColorDetector(int color) { - mColor = color; - } - - @Override - public boolean isCharPixel(int color) { - return mColor == color; - } - } -} diff --git a/app/src/main/java/com/stardust/mi666/ocr/OCR.java b/app/src/main/java/com/stardust/mi666/ocr/OCR.java deleted file mode 100644 index 81757171..00000000 --- a/app/src/main/java/com/stardust/mi666/ocr/OCR.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.stardust.mi666.ocr; - -import android.graphics.Bitmap; - -/** - * Created by Stardust on 2017/4/23. - */ - -public interface OCR { - - void addChar(char ch, Bitmap bitmap); - - char detect(Bitmap bitmap); - -} diff --git a/app/src/main/java/com/stardust/mi666/ocr/SimpleOCR.java b/app/src/main/java/com/stardust/mi666/ocr/SimpleOCR.java deleted file mode 100644 index 8f6e8cf9..00000000 --- a/app/src/main/java/com/stardust/mi666/ocr/SimpleOCR.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.stardust.mi666.ocr; - -import android.graphics.Bitmap; -import android.util.Log; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by Stardust on 2017/4/23. - */ - -public class SimpleOCR implements OCR { - - private static class PixelLine { - int start; - int end; - - PixelLine(int start, int end) { - this.start = start; - this.end = end; - } - } - - private static class PixelLines { - int start = -1; - List lines = new ArrayList<>(); - - - void addLine(PixelLine line) { - lines.add(line); - if (start == -1 || start > line.start) { - start = line.start; - } - } - - int distanceTo(PixelLines another) { - if (lines.size() != another.lines.size()) { - return lineWidthSum() + another.lineWidthSum(); - } - int offset = another.start - start; - int sum = 0; - for (int i = 0; i < lines.size(); i++) { - sum += Math.abs(lines.get(i).start + offset - another.lines.get(i).start); - sum += Math.abs(lines.get(i).end + offset - another.lines.get(i).end); - } - return sum; - } - - private int lineWidthSum() { - int sum = 0; - for (PixelLine line : lines) { - sum += line.end - line.start; - } - return sum; - } - } - - - public static class CharFeature { - - private List mPixelLinesPerRow; - - public CharFeature(int rowNumber) { - mPixelLinesPerRow = new ArrayList<>(rowNumber); - for (int i = 0; i < rowNumber; i++) { - mPixelLinesPerRow.add(new PixelLines()); - } - } - - void addLine(int row, PixelLine line) { - mPixelLinesPerRow.get(row).addLine(line); - } - - int distanceTo(CharFeature feature) { - int sum = 0; - if (feature.mPixelLinesPerRow.size() != mPixelLinesPerRow.size()) { - for (PixelLines lines : mPixelLinesPerRow) { - sum += lines.lines.size(); - } - return sum; - } - for (int i = 0; i < mPixelLinesPerRow.size(); i++) { - sum += mPixelLinesPerRow.get(i).distanceTo(feature.mPixelLinesPerRow.get(i)); - } - return sum; - } - - } - - private static final String TAG = "SimpleOCR"; - private Map mChars = new HashMap<>(); - private ColorDetector mColorDetector; - - public SimpleOCR(ColorDetector colorDetector) { - mColorDetector = colorDetector; - } - - public void addChar(char c, Bitmap ch) { - mChars.put(c, getCharFeature(ch)); - } - - public CharFeature getCharFeature(Bitmap bitmap) { - CharFeature feature = new CharFeature(bitmap.getHeight()); - for (int y = 0; y < bitmap.getHeight(); y++) { - int mPixelStart = -1; - for (int x = 0; x < bitmap.getWidth(); x++) { - if (mColorDetector.isCharPixel(bitmap.getPixel(x, y))) { - if (mPixelStart == -1) { - mPixelStart = x; - } - } else if (mPixelStart >= 0) { - feature.addLine(y, new PixelLine(mPixelStart, x)); - mPixelStart = -1; - } - } - if (mPixelStart >= 0) { - feature.addLine(y, new PixelLine(mPixelStart, bitmap.getWidth())); - } - } - return feature; - } - - public char detect(Bitmap bitmap) { - CharFeature feature = getCharFeature(bitmap); - int min = Integer.MAX_VALUE; - char detectedChar = ' '; - for (Map.Entry ch : mChars.entrySet()) { - int distance = ch.getValue().distanceTo(feature); - Log.d(TAG, "ch=" + ch.getKey() + " distance=" + distance); - if (distance < min) { - min = distance; - detectedChar = ch.getKey(); - } - } - return detectedChar; - } - - -} diff --git a/app/src/main/java/com/stardust/mi666/ocr/SimpleTextDetector.java b/app/src/main/java/com/stardust/mi666/ocr/SimpleTextDetector.java deleted file mode 100644 index 05641ddd..00000000 --- a/app/src/main/java/com/stardust/mi666/ocr/SimpleTextDetector.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.stardust.mi666.ocr; - -import android.graphics.Bitmap; - -/** - * Created by Stardust on 2017/4/23. - */ - -public class SimpleTextDetector { - - private ColorDetector mColorDetector; - - public SimpleTextDetector(ColorDetector colorDetector) { - mColorDetector = colorDetector; - } - - public Bitmap detect(Bitmap bitmap) { - int minX = bitmap.getWidth(); - int minY = bitmap.getHeight(); - int maxX = 0; - int maxY = 0; - for (int i = 0; i < bitmap.getWidth(); i++) { - for (int j = 0; j < bitmap.getHeight(); j++) { - if (mColorDetector.isCharPixel(bitmap.getPixel(i, j))) { - minX = Math.min(minX, i); - minY = Math.min(minY, j); - maxX = Math.max(maxX, i); - maxY = Math.max(maxY, j); - } - } - } - return Bitmap.createBitmap(bitmap, minX, minY, maxX - minX, maxY - minY); - } -} diff --git a/app/src/main/java/com/stardust/mi666/ocr/SimpleTextSplitter.java b/app/src/main/java/com/stardust/mi666/ocr/SimpleTextSplitter.java deleted file mode 100644 index 54258087..00000000 --- a/app/src/main/java/com/stardust/mi666/ocr/SimpleTextSplitter.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.stardust.mi666.ocr; - -import android.graphics.Bitmap; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/4/24. - */ - -public class SimpleTextSplitter { - - private ColorDetector mColorDetector; - private SimpleTextDetector mSimpleTextDetector; - - public SimpleTextSplitter(ColorDetector colorDetector) { - mColorDetector = colorDetector; - mSimpleTextDetector = new SimpleTextDetector(colorDetector); - } - - public List split(Bitmap bitmap) { - Bitmap text = mSimpleTextDetector.detect(bitmap); - int[] projection = new int[text.getWidth()]; - for (int i = 0; i < text.getWidth(); i++) { - for (int j = 0; j < text.getHeight(); j++) { - if (mColorDetector.isCharPixel(text.getPixel(i, j))) { - projection[i]++; - } - } - } - int start = -1; - List numbers = new ArrayList<>(); - for (int i = 0; i < text.getWidth(); i++) { - if (projection[i] > 0) { - if (start == -1) { - start = i; - } - } else { - if (start >= 0) { - numbers.add(Bitmap.createBitmap(text, start, 0, i - start, text.getHeight())); - start = -1; - } - } - } - if (start >= 0) { - numbers.add(Bitmap.createBitmap(text, start, 0, text.getWidth() - start, text.getHeight())); - } - return numbers; - } - -} diff --git a/app/src/main/java/com/stardust/mi666/ocr/TemplateMatching.java b/app/src/main/java/com/stardust/mi666/ocr/TemplateMatching.java deleted file mode 100644 index 97f7c7ee..00000000 --- a/app/src/main/java/com/stardust/mi666/ocr/TemplateMatching.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.stardust.mi666.ocr; - -import android.graphics.Bitmap; -import android.util.Log; - -import com.stardust.scriptdroid.tool.BitmapTool; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by Stardust on 2017/4/23. - */ - -public class TemplateMatching { - - private static final String LOG_TAG = "TemplateMatching"; - - private int mBlockSize; - private ColorDetector mColorDetector; - - - public TemplateMatching(int blockSize, ColorDetector colorDetector) { - mBlockSize = blockSize; - mColorDetector = colorDetector; - } - - public int[][] getFeature(Bitmap bitmap) { - int w = bitmap.getWidth() / mBlockSize; - int h = bitmap.getHeight() / mBlockSize; - int[][] mat = new int[w][h]; - for (int i = 0; i < bitmap.getWidth(); i++) { - for (int j = 0; j < bitmap.getHeight(); j++) { - if (mColorDetector.isCharPixel(bitmap.getPixel(i, j))) { - mat[i * w / bitmap.getWidth()][j * h / bitmap.getHeight()]++; - } - } - } - return mat; - } - - public int distance(int[][] f, int[][] template, int offsetX, int offsetY) { - int sum = 0; - for (int i = 0; i < template.length; i++) { - for (int j = 0; j < template[i].length; j++) { - if (i >= f.length || j >= f[i].length) { - sum += template[i].length - j; - break; - } - sum += Math.abs(template[i][j] - f[i + offsetX][j + offsetY]); - - } - } - return sum; - } - - public int minDistance(int[][] f, int[][] template) { - int min = Integer.MAX_VALUE; - int i = 0; - while (i < template.length && i + template.length - 1 < f.length) { - int j = 0; - while (j < template[i].length && j + template[i].length - 1 < f[i].length) { - int d = distance(f, template, i, j); - if (d < min) { - min = d; - } - j++; - } - i++; - } - return min; - } - - public static class TemplateMatchingOCR implements OCR { - - private Map mChars = new HashMap<>(); - private TemplateMatching mTemplateMatching; - private SimpleTextDetector mSimpleTextDetector; - - public TemplateMatchingOCR(int blockSize, ColorDetector colorDetector) { - mTemplateMatching = new TemplateMatching(blockSize, colorDetector); - mSimpleTextDetector = new SimpleTextDetector(colorDetector); - } - - @Override - public void addChar(char ch, Bitmap bitmap) { - mChars.put(ch, mTemplateMatching.getFeature(mSimpleTextDetector.detect(bitmap))); - } - - @Override - public char detect(Bitmap bitmap) { - int min = Integer.MAX_VALUE; - char ch = ' '; - for (Map.Entry entry : mChars.entrySet()) { - int[][] f = mTemplateMatching.getFeature(BitmapTool.scaleBitmap(bitmap, entry.getValue().length, entry.getValue()[0].length)); - int d = mTemplateMatching.distance(f, entry.getValue(), 0, 0); - Log.d(LOG_TAG, "char: " + entry.getKey() + " distance: " + d); - if (d < min) { - if (entry.getKey() == '1' && d > 30) { - continue; - } - min = d; - ch = entry.getKey(); - } - } - return ch; - } - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index d6b43dcb..97383bcc 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -1,16 +1,14 @@ package com.stardust.scriptdroid; import android.app.Activity; -import android.app.Application; import android.content.Intent; import android.content.IntentFilter; -import android.os.Bundle; import android.support.annotation.Keep; +import android.support.multidex.MultiDexApplication; import com.squareup.leakcanary.LeakCanary; import com.stardust.app.SimpleActivityLifecycleCallbacks; import com.stardust.app.VolumeChangeObserver; -import com.stardust.mi666.OCR; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.tool.CrashHandler; @@ -26,7 +24,7 @@ import java.lang.ref.WeakReference; * Created by Stardust on 2017/1/27. */ -public class App extends Application { +public class App extends MultiDexApplication { private static final String TAG = "App"; @@ -65,7 +63,6 @@ public class App extends Application { JsBeautifierFactory.initJsBeautify(this, "js/jsbeautify.js"); initVolumeChangeObserver(); startService(new Intent(this, AccessibilityWatchDogService.class)); - OCR.init(this); } private void initVolumeChangeObserver() { @@ -94,7 +91,6 @@ public class App extends Application { currentActivity = new WeakReference<>(activity); } - }); } diff --git a/app/src/main/java/com/stardust/scriptdroid/Pref.java b/app/src/main/java/com/stardust/scriptdroid/Pref.java index f443edb6..4a470d05 100644 --- a/app/src/main/java/com/stardust/scriptdroid/Pref.java +++ b/app/src/main/java/com/stardust/scriptdroid/Pref.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import com.stardust.autojs.runtime.api.AutomatorConfig; import com.stardust.automator.AccessibilityEventCommandHost; import com.stardust.scriptdroid.autojs.AutoJs; @@ -18,11 +19,19 @@ public class Pref { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals(getString(R.string.key_run_mode))) { AutoJs.getInstance().getCommandHost().setRunMode(getRunModeFromValue(sharedPreferences.getString(key, null))); + } else if (key.equals(getString(R.string.key_guard_mode))) { + AutomatorConfig.setIsUnintendedGuardEnabled(sharedPreferences.getBoolean(getString(R.string.key_guard_mode), false)); } } }; + static { + AutomatorConfig.setIsUnintendedGuardEnabled(def().getBoolean(getString(R.string.key_guard_mode), false)); + } + private static int getRunModeFromValue(String value) { + if (value == null) + return AccessibilityEventCommandHost.RUN_MODE_THREAD_POOL; switch (value) { case "KEY_THREAD_POOL": return AccessibilityEventCommandHost.RUN_MODE_THREAD_POOL; diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java index 5f7032a6..0e74d55c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/content/ScriptListNavigatorContent.java @@ -15,7 +15,6 @@ import com.stardust.scriptdroid.scripts.ScriptFile; import com.stardust.scriptdroid.scripts.StorageScriptProvider; import com.stardust.scriptdroid.ui.edit.EditActivity; import com.stardust.scriptdroid.ui.main.script_list.ScriptAndFolderListRecyclerView; -import com.stardust.scriptdroid.ui.main.script_list.ScriptListRecyclerView; import com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView; import com.stardust.util.MessageEvent; import com.stardust.widget.ViewHolderSupplier; diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java index a8b18d63..36a6f02b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingLayoutBoundsView.java @@ -37,7 +37,6 @@ public class FloatingLayoutBoundsView extends LayoutBoundsView { showNodeInfo(info); } }); - setBackgroundColor(0x66000000); setVisibility(GONE); getPaint().setColor(0xFF222222); getPaint().setStrokeWidth(2f); diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingScriptFileListView.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingScriptFileListView.java deleted file mode 100644 index 5dadcd6c..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/view/FloatingScriptFileListView.java +++ /dev/null @@ -1,205 +0,0 @@ -package com.stardust.scriptdroid.external.floating_window.view; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.TextView; -import android.widget.Toast; -import android.workground.WrapContentLinearLayoutManager; - -import com.afollestad.materialdialogs.MaterialDialog; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.ScriptFileList; -import com.stardust.scriptdroid.App; -import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.external.floating_window.HoverMenuService; -import com.stardust.util.ViewUtil; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperationPopupMenu; -import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; -import com.stardust.util.MessageEvent; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/3/12. - */ - -public class FloatingScriptFileListView extends RecyclerView { - - - private ScriptFileList mScriptFileList; - - private final OnClickListener mOnItemClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - int position = getChildViewHolder(v).getAdapterPosition(); - onItemClicked(v, position); - } - }; - - private final OnClickListener mOnEditIconClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - int position = getChildViewHolder((View) v.getParent()).getAdapterPosition(); - onEditIconClick(v, position); - } - }; - - private final OnClickListener mOnMoreIconClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - mOperateFileIndex = getChildViewHolder((View) v.getParent()).getAdapterPosition(); - showOrDismissOperationPopupMenu(v); - } - - }; - - private ScriptFileOperationPopupMenu mScriptFileOperationPopupMenu; - private int mOperateFileIndex; - - public FloatingScriptFileListView(Context context) { - super(context); - init(); - } - - private void init() { - setAdapter(new Adapter()); - setLayoutManager(new WrapContentLinearLayoutManager(getContext())); - addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); - initScriptFileOperationPopupMenu(); - } - - @Subscribe - public void showMessage(ScriptFileOperation.ShowMessageEvent event) { - Toast.makeText(getContext(), event.messageResId, Toast.LENGTH_SHORT).show(); - } - - private void initScriptFileOperationPopupMenu() { - mScriptFileOperationPopupMenu = new ScriptFileOperationPopupMenu(getContext(), getScriptFileOperations()); - mScriptFileOperationPopupMenu.setOnItemClickListener(new ScriptFileOperationPopupMenu.OnItemClickListener() { - @Override - public void onClick(View view, int position, ScriptFileOperation operation) { - operation.operate(FloatingScriptFileListView.this, mScriptFileList, mOperateFileIndex); - mScriptFileOperationPopupMenu.dismiss(); - if (!(operation instanceof ScriptFileOperation.Rename)) - EventBus.getDefault().post(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); - } - }); - } - - protected List getScriptFileOperations() { - List scriptFileOperations = new ArrayList<>(); - scriptFileOperations.add(new ScriptFileOperation.Run()); - scriptFileOperations.add(new ScriptFileOperation.Rename() { - @Override - public void operate(final RecyclerView recyclerView, final ScriptFileList scriptFileList, final int position) { - String oldName = scriptFileList.get(position).getSimplifiedName(); - MaterialDialog dialog = new ThemeColorMaterialDialogBuilder(recyclerView.getContext()) - .title(R.string.text_rename) - .checkBoxPrompt(App.getApp().getString(R.string.text_rename_file_meanwhile), false, null) - .input(App.getApp().getString(R.string.text_please_input_new_name), oldName, new MaterialDialog.InputCallback() { - @Override - public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { - scriptFileList.rename(position, input.toString(), dialog.isPromptCheckBoxChecked()); - recyclerView.getAdapter().notifyItemChanged(position); - } - }) - .build(); - dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); - dialog.show(); - } - }); - scriptFileOperations.add(new ScriptFileOperation.OpenByOtherApp()); - scriptFileOperations.add(new ScriptFileOperation.CreateShortcut()); - scriptFileOperations.add(new ScriptFileOperation.Remove()); - scriptFileOperations.add(new ScriptFileOperation.Delete()); - return scriptFileOperations; - } - - protected void onItemClicked(View v, int position) { - new ScriptFileOperation.Run().operate(this, mScriptFileList, position); - EventBus.getDefault().post(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); - } - - protected void onEditIconClick(View v, int position) { - new ScriptFileOperation.Edit().operate(this, mScriptFileList, position); - EventBus.getDefault().post(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); - } - - public void setScriptFileList(ScriptFileList scriptFileList) { - mScriptFileList = scriptFileList; - getAdapter().notifyDataSetChanged(); - } - - private void showOrDismissOperationPopupMenu(View v) { - if (mScriptFileOperationPopupMenu.isShowing()) { - mScriptFileOperationPopupMenu.dismiss(); - } else { - mScriptFileOperationPopupMenu.show(v); - } - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - EventBus.getDefault().register(this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - EventBus.getDefault().unregister(this); - } - - @Subscribe - public void onMenuCollapsing(MessageEvent event) { - if (event.message.equals(HoverMenuService.MESSAGE_MENU_COLLAPSING) && mScriptFileOperationPopupMenu.isShowing()) { - mScriptFileOperationPopupMenu.dismiss(); - } - } - - private class Adapter extends RecyclerView.Adapter { - - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View itemView = LayoutInflater.from(getContext()).inflate(R.layout.floating_script_list_recycler_view_file, parent, false); - return new ViewHolder(itemView); - } - - @Override - public void onBindViewHolder(ViewHolder holder, int position) { - ScriptFile scriptFile = mScriptFileList.get(position); - holder.name.setText(scriptFile.getSimplifiedName()); - holder.path.setText(scriptFile.getSimplifiedPath()); - } - - @Override - public int getItemCount() { - return mScriptFileList.size(); - } - } - - private class ViewHolder extends RecyclerView.ViewHolder { - - TextView name, path; - - ViewHolder(View itemView) { - super(itemView); - name = (TextView) itemView.findViewById(R.id.name); - path = (TextView) itemView.findViewById(R.id.path); - ViewUtil.$(itemView, R.id.edit).setOnClickListener(mOnEditIconClickListener); - //ViewUtil.$(itemView, R.id.more).setOnClickListener(mOnMoreIconClickListener); - itemView.setOnClickListener(mOnItemClickListener); - } - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java index 3b2b9984..17ed14af 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java @@ -20,7 +20,7 @@ public class ImportIntentActivity extends BaseActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { - handleIntent(); + handleIntent(getIntent()); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, R.string.edit_and_run_handle_intent_error, Toast.LENGTH_LONG).show(); @@ -28,8 +28,12 @@ public class ImportIntentActivity extends BaseActivity { } } - private void handleIntent() { - Intent intent = getIntent(); + @Override + protected void onNewIntent(Intent intent) { + handleIntent(intent); + } + + private void handleIntent(Intent intent) { final String path = intent.getData().getPath(); if (!TextUtils.isEmpty(path)) MainActivity.importScriptFile(this, path); diff --git a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java index ab988050..94f08d07 100644 --- a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java +++ b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutBoundsView.java @@ -15,6 +15,9 @@ import android.view.View; import com.stardust.scriptdroid.layout_inspector.NodeInfo; import com.stardust.util.ViewUtil; +import java.util.ArrayList; +import java.util.List; + /** * Created by Stardust on 2017/3/10. */ @@ -109,13 +112,20 @@ public class LayoutBoundsView extends View { } } - private NodeInfo findNodeAt(NodeInfo node, int x, int y) { + private List findNodeAt(NodeInfo node, int x, int y) { + List list = null; for (NodeInfo child : node.getChildren()) { if (child != null && child.getBoundsInScreen().contains(x, y)) { - return findNodeAt(child, x, y); + if (list == null) + list = findNodeAt(child, x, y); + else + list.addAll(findNodeAt(child, x, y)); } } - return node; + if (list == null) + list = new ArrayList<>(); + list.add(node); + return list; } } diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java b/app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java index 2c5ab4f0..d7381e4a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java +++ b/app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java @@ -1,10 +1,12 @@ package com.stardust.scriptdroid.scripts.sample; +import java.io.Serializable; + /** * Created by Stardust on 2017/3/13. */ -public class Sample { +public class Sample implements Serializable { public String name; public String path; @@ -12,4 +14,5 @@ public class Sample { this.name = name; this.path = path; } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/ImagePHash.java b/app/src/main/java/com/stardust/scriptdroid/tool/ImagePHash.java deleted file mode 100644 index e0781249..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/tool/ImagePHash.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.stardust.scriptdroid.tool; - -/** - * Created by Stardust on 2017/4/23. - */ - -import android.graphics.Bitmap; - -import com.stardust.mi666.ocr.ColorDetector; -import com.stardust.mi666.ocr.SimpleTextDetector; - -import java.util.HashMap; -import java.util.Map; - -public class ImagePHash { - - private static final String LOG_TAG = "ImagePHash"; - - private int width = 32; - private int height; - private int smallerWidth = 8; - private int smallerHeight; - - public ImagePHash() { - this(32, 8); - } - - public ImagePHash(int width, int smallerWidth) { - this(width, width, smallerWidth, smallerWidth); - } - - public ImagePHash(int width, int height, int smallerWidth, int smallerHeight) { - this.width = width; - this.height = height; - this.smallerWidth = smallerWidth; - this.smallerHeight = smallerHeight; - initCoefficients(); - } - - public int distance(boolean[] s1, boolean[] s2) { - int counter = 0; - for (int k = 0; k < s1.length; k++) { - if (s1[k] != s2[k]) { - counter++; - } - } - return counter; - } - - - public boolean[] getHash(Bitmap img) { - double[][] vals = new double[width][height]; - img = BitmapTool.scaleBitmap(img, width, height); - - for (int x = 0; x < img.getWidth(); x++) { - for (int y = 0; y < img.getHeight(); y++) { - vals[x][y] = getBlue(img, x, y); - } - } - - double[][] dctVals = applyDCT(vals); - - double total = 0; - - for (int x = 0; x < smallerWidth; x++) { - for (int y = 0; y < smallerHeight; y++) { - total += dctVals[x][y]; - } - } - total -= dctVals[0][0]; - - double avg = total / (double) ((smallerWidth * smallerHeight) - 1); - boolean[] hash = new boolean[smallerWidth * smallerHeight]; - int i = 0; - for (int x = 0; x < smallerWidth; x++) { - for (int y = 0; y < smallerHeight; y++) { - if (x != 0 && y != 0) { - hash[i++] = dctVals[x][y] > avg; - } - } - } - return hash; - } - - - private static int getBlue(Bitmap img, int x, int y) { - return img.getPixel(x, y) & 0xff; - } - - private double[] c; - private double[] c2; - - private void initCoefficients() { - c = new double[width]; - c2 = new double[height]; - for (int i = 1; i < width; i++) { - c[i] = 1; - } - for (int i = 1; i < height; i++) { - c2[i] = 1; - } - c[0] = 1 / Math.sqrt(2.0); - c2[0] = 1 / Math.sqrt(2.0); - } - - private double[][] applyDCT(double[][] f) { - double[][] F = new double[width][height]; - for (int u = 0; u < width; u++) { - for (int v = 0; v < height; v++) { - double sum = 0.0; - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - sum += Math.cos(((2 * i + 1) / (2.0 * width)) * u * Math.PI) * Math.cos(((2 * j + 1) / (2.0 * height)) * v * Math.PI) * (f[i][j]); - } - } - sum *= ((c[u] * c2[v]) / 4.0); - F[u][v] = sum; - } - } - return F; - } - - public static class OCR implements com.stardust.mi666.ocr.OCR { - - private SimpleTextDetector mSimpleTextDetector; - private Map mChars = new HashMap<>(); - private ImagePHash mImagePHash; - - public OCR(ColorDetector colorDetector, int size, int smallerSize) { - mSimpleTextDetector = new SimpleTextDetector(colorDetector); - mImagePHash = new ImagePHash(size, smallerSize); - } - - public OCR(ColorDetector colorDetector, ImagePHash pHash) { - mSimpleTextDetector = new SimpleTextDetector(colorDetector); - mImagePHash = pHash; - } - - @Override - public void addChar(char ch, Bitmap bitmap) { - mChars.put(ch, mImagePHash.getHash(mSimpleTextDetector.detect(bitmap))); - } - - @Override - public char detect(Bitmap bitmap) { - bitmap = mSimpleTextDetector.detect(bitmap); - int min = Integer.MAX_VALUE; - boolean[] h = mImagePHash.getHash(bitmap); - char ch = ' '; - for (Map.Entry entry : mChars.entrySet()) { - int d = mImagePHash.distance(h, entry.getValue()); - //Log.i(LOG_TAG, "char: " + entry.getKey() + " distance: " + d); - if (d < min) { - min = d; - ch = entry.getKey(); - } - } - return ch; - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java index 0343c6c0..f232e355 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java @@ -22,19 +22,15 @@ import timber.log.Timber; public class TimberConsole implements Console { static { - try { - Timber.plant(new ConsoleTree.Builder() - .minPriority(Log.VERBOSE) - .verboseColor(0xff909090) - .debugColor(0xffc88b48) - .infoColor(0xffc9c9c9) - .warnColor(0xffa97db6) - .errorColor(0xffff534e) - .assertColor(0xffff5540) - .build()); - } catch (Exception e) { - // FIXME: 2017/4/26 java.lang.NoClassDefFoundError: com.jraska.console.timber.ConsoleTree at android4.4 - } + Timber.plant(new ConsoleTree.Builder() + .minPriority(Log.VERBOSE) + .verboseColor(0xff909090) + .debugColor(0xffc88b48) + .infoColor(0xffc9c9c9) + .warnColor(0xffa97db6) + .errorColor(0xffff534e) + .assertColor(0xffff5540) + .build()); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java index 9fb52656..7d6f32a1 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java @@ -1,6 +1,5 @@ package com.stardust.scriptdroid.ui.edit; -import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -14,51 +13,49 @@ import android.util.SparseArray; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.inputmethod.InputMethod; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; -import com.stardust.autojs.engine.JavaScriptEngine; -import com.stardust.autojs.ScriptExecutionListener; -import com.stardust.autojs.script.FileScriptSource; -import com.stardust.autojs.script.JsBeautifier; -import com.stardust.autojs.script.ScriptSource; -import com.stardust.autojs.script.StringScriptSource; -import com.stardust.enhancedfloaty.ResizableFloatyService; -import com.stardust.pio.PFile; -import com.stardust.scriptdroid.Pref; -import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.external.floating_window.FloatingConsole; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.tool.JsBeautifierFactory; -import com.stardust.scriptdroid.tool.MaterialDialogFactory; -import com.stardust.scriptdroid.ui.BaseActivity; -import com.stardust.scriptdroid.ui.console.ConsoleActivity; -import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity; -import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils; -import com.stardust.scriptdroid.ui.edit.sidemenu.EditSideMenuFragment; -import com.stardust.scriptdroid.ui.edit.sidemenu.FunctionListRecyclerView; -import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; -import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; -import com.stardust.util.SparseArrayEntries; -import com.stardust.view.ViewBinding; -import com.stardust.widget.ToolbarMenuItem; import com.jecelyin.editor.v2.common.Command; import com.jecelyin.editor.v2.common.SaveListener; import com.jecelyin.editor.v2.core.widget.TextView; import com.jecelyin.editor.v2.ui.EditorDelegate; import com.jecelyin.editor.v2.view.EditorView; import com.jecelyin.editor.v2.view.menu.MenuDef; +import com.stardust.autojs.ScriptExecutionListener; +import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.autojs.script.FileScriptSource; +import com.stardust.autojs.script.JsBeautifier; +import com.stardust.autojs.script.ScriptSource; +import com.stardust.autojs.script.StringScriptSource; import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.scripts.ScriptFile; +import com.stardust.scriptdroid.tool.JsBeautifierFactory; +import com.stardust.scriptdroid.tool.MaterialDialogFactory; +import com.stardust.scriptdroid.ui.BaseActivity; +import com.stardust.scriptdroid.ui.console.ConsoleActivity; import com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar; +import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity; +import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils; +import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; +import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; import com.stardust.theme.ThemeColorManager; +import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; +import com.stardust.util.SparseArrayEntries; import com.stardust.view.ViewBinder; +import com.stardust.view.ViewBinding; +import com.stardust.widget.ToolbarMenuItem; import java.io.File; import timber.log.Timber; +import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.ACTION_ON_RUN_FINISHED; +import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.EXTRA_EXCEPTION_MESSAGE; + /** * Created by Stardust on 2017/1/29. */ @@ -94,43 +91,10 @@ public class EditActivity extends Editor920Activity { public static final String EXTRA_CONTENT = "Still Love Eating 17.4.5"; - private static final String ACTION_ON_RUN_FINISHED = "ACTION_ON_RUN_FINISHED"; - private static final String EXTRA_EXCEPTION_MESSAGE = "EXTRA_EXCEPTION_MESSAGE"; - - - private static final ScriptExecutionListener SCRIPT_EXECUTION_LISTENER = new ScriptExecutionListener() { - - @Override - public void onStart(JavaScriptEngine engine, ScriptSource source) { - AutoJs.getInstance().getScriptEngineService().getDefaultListener().onStart(engine, source); - } - - @Override - public void onSuccess(JavaScriptEngine engine, ScriptSource source, Object result) { - App.getApp().sendBroadcast(new Intent(ACTION_ON_RUN_FINISHED)); - } - - @Override - public void onException(JavaScriptEngine engine, ScriptSource source, Exception e) { - App.getApp().sendBroadcast(new Intent(ACTION_ON_RUN_FINISHED) - .putExtra(EXTRA_EXCEPTION_MESSAGE, e.getMessage())); - e.printStackTrace(); - } - - }; - public static void editFile(Context context, String path) { editFile(context, null, path); } - public static void view(Context context, String name, String content) { - context.startActivity(new Intent(context, EditActivity.class) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra("readOnly", true) - .putExtra("content", content) - .putExtra("name", name)); - } - public static void editFile(Context context, String name, String path) { context.startActivity(new Intent(context, EditActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) @@ -145,7 +109,6 @@ public class EditActivity extends Editor920Activity { private String mName; private File mFile; private View mView; - private DrawerLayout mDrawerLayout; private EditorDelegate mEditorDelegate; private SparseArray mMenuMap; private boolean mReadOnly = false; @@ -175,23 +138,6 @@ public class EditActivity extends Editor920Activity { registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_RUN_FINISHED)); } - @Override - protected void onStart() { - super.onStart(); - openDrawerIfFirstUse(); - } - - private void openDrawerIfFirstUse() { - if (Pref.isEditActivityFirstUsing()) { - mDrawerLayout.postDelayed(new Runnable() { - @Override - public void run() { - mDrawerLayout.openDrawer(GravityCompat.END); - } - }, 1000); - } - } - private void handleIntent(Intent intent) { String path = intent.getStringExtra("path"); mName = intent.getStringExtra("name"); @@ -214,25 +160,11 @@ public class EditActivity extends Editor920Activity { private void setUpUI() { ThemeColorManager.addActivityStatusBar(this); - mDrawerLayout = (DrawerLayout) mView.findViewById(R.id.drawer_layout); - initSideMenuFragment(); setUpToolbar(); initMenuItem(); ViewBinder.bind(this); } - private void initSideMenuFragment() { - EditSideMenuFragment.setFragment(EditActivity.this, R.id.fragment_edit_side_menu) - .setOnFunctionClickListener(new FunctionListRecyclerView.OnFunctionClickListener() { - @Override - public void onClick(FunctionListRecyclerView.Function function, int position) { - if (!mReadOnly) - insertText(function.name); - mDrawerLayout.closeDrawer(GravityCompat.END); - } - }); - } - private void setUpEditor() { final EditorView editorView = (EditorView) findViewById(R.id.editor); mEditorDelegate.setEditorView(editorView); @@ -284,9 +216,9 @@ public class EditActivity extends Editor920Activity { Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED); if (mFile != null) { - AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(mName, mFile), SCRIPT_EXECUTION_LISTENER); + ScriptFileOperation.runOnEditView(new FileScriptSource(mName, mFile)); } else { - AutoJs.getInstance().getScriptEngineService().execute(new StringScriptSource(mName, mEditorDelegate.getText()), SCRIPT_EXECUTION_LISTENER); + ScriptFileOperation.runOnEditView(new StringScriptSource(mName, mEditorDelegate.getText())); } } @@ -344,11 +276,19 @@ public class EditActivity extends Editor920Activity { case R.id.action_beautify: beautifyCode(); return true; - + case R.id.action_open_by_other_apps: + openByOtherApps(); + return true; } return super.onOptionsItemSelected(item); } + private void openByOtherApps() { + if (mFile != null) + ScriptFileOperation.openByOtherApps(mFile.getPath()); + + } + private void beautifyCode() { final MaterialDialog dialog = MaterialDialogFactory.showProgress(this); mJsBeautifier.beautify(mEditorDelegate.getText(), new JsBeautifier.Callback() { @@ -365,6 +305,7 @@ public class EditActivity extends Editor920Activity { @Override public void onException(Exception e) { + dialog.dismiss(); e.printStackTrace(); } }); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java new file mode 100644 index 00000000..c7c93619 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java @@ -0,0 +1,171 @@ +package com.stardust.scriptdroid.ui.edit; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.support.design.widget.Snackbar; +import android.util.SparseArray; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import com.jecelyin.editor.v2.common.Command; +import com.jecelyin.editor.v2.ui.EditorDelegate; +import com.jecelyin.editor.v2.view.EditorView; +import com.jecelyin.editor.v2.view.menu.MenuDef; +import com.stardust.autojs.script.StringScriptSource; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.scripts.sample.Sample; +import com.stardust.scriptdroid.ui.BaseActivity; +import com.stardust.scriptdroid.ui.console.ConsoleActivity; +import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity; +import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils; +import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; +import com.stardust.scriptdroid.ui.main.MainActivity; +import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; +import com.stardust.theme.ThemeColorManager; +import com.stardust.util.AssetsCache; +import com.stardust.util.SparseArrayEntries; +import com.stardust.view.ViewBinder; +import com.stardust.view.ViewBinding; +import com.stardust.widget.ToolbarMenuItem; + +import timber.log.Timber; + +import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.ACTION_ON_RUN_FINISHED; +import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.EXTRA_EXCEPTION_MESSAGE; + +/** + * Created by Stardust on 2017/4/29. + */ + +public class ViewSampleActivity extends Editor920Activity { + + public static void view(Context context, Sample sample) { + context.startActivity(new Intent(context, ViewSampleActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra("sample", sample)); + } + + private View mView; + private Sample mSample; + private EditorDelegate mEditorDelegate; + private SparseArray mMenuMap; + private BroadcastReceiver mOnRunFinishedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(ACTION_ON_RUN_FINISHED)) { + setMenuStatus(R.id.run, MenuDef.STATUS_NORMAL); + String msg = intent.getStringExtra(EXTRA_EXCEPTION_MESSAGE); + if (msg != null) { + Snackbar.make(mView, getString(R.string.text_error) + ": " + msg, Snackbar.LENGTH_LONG).show(); + Timber.e(msg); + } + } + } + }; + + public void onCreate(Bundle b) { + super.onCreate(b); + setTheme(R.style.EditorTheme); + mView = View.inflate(this, R.layout.activity_view_sample, null); + setContentView(mView); + handleIntent(getIntent()); + setUpUI(); + setUpEditor(); + registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_RUN_FINISHED)); + } + + private void handleIntent(Intent intent) { + mSample = (Sample) intent.getSerializableExtra("sample"); + String content = AssetsCache.get(this, mSample.path); + mEditorDelegate = new EditorDelegate(0, mSample.name, content); + } + + private void setUpUI() { + ThemeColorManager.addActivityStatusBar(this); + setUpToolbar(); + initMenuItem(); + ViewBinder.bind(this); + } + + private void setUpEditor() { + final EditorView editorView = (EditorView) findViewById(R.id.editor); + mEditorDelegate.setEditorView(editorView); + Editor920Utils.setLang(mEditorDelegate, "JavaScript"); + editorView.getEditText().setReadOnly(true); + editorView.getEditText().setHorizontallyScrolling(true); + } + + private void setUpToolbar() { + BaseActivity.setToolbarAsBack(this, R.id.toolbar, mSample.name); + } + + @ViewBinding.Click(R.id.run) + private void run() { + Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); + setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED); + ScriptFileOperation.runOnEditView(new StringScriptSource(mSample.name, mEditorDelegate.getText())); + } + + private void initMenuItem() { + mMenuMap = new SparseArrayEntries() + .entry(R.id.run, (ToolbarMenuItem) findViewById(R.id.run)) + .sparseArray(); + } + + public void setMenuStatus(int menuResId, int status) { + ToolbarMenuItem menuItem = mMenuMap.get(menuResId); + if (menuItem == null) + return; + boolean disabled = status == MenuDef.STATUS_DISABLED; + menuItem.setEnabled(!disabled); + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_view_sample, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_console: + startActivity(new Intent(getContext(), ConsoleActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + return true; + case R.id.action_help: + HelpCatalogueActivity.showMainCatalogue(this); + return true; + case R.id.action_import: + MainActivity.importSample(this, mSample); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void doCommand(Command command) { + mEditorDelegate.doCommand(command); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(mOnRunFinishedReceiver); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + try { + super.onRestoreInstanceState(savedInstanceState); + } catch (RuntimeException e) { + // FIXME: 2017/3/20 + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index b46cb8f7..e6a9e03a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -9,7 +9,9 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; @@ -29,6 +31,7 @@ import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.scripts.ScriptFile; import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.scripts.sample.Sample; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.tool.AccessibilityServiceTool; import com.stardust.scriptdroid.tool.DrawableSaver; @@ -50,6 +53,8 @@ import com.stardust.widget.SlidingUpPanel; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import java.io.IOException; + public class MainActivity extends BaseActivity { @@ -61,6 +66,9 @@ public class MainActivity extends BaseActivity { private static final String ACTION_IMPORT_SCRIPT = "ACTION_IMPORT_SCRIPT"; private static final String ARGUMENT_SCRIPT = "ARGUMENT_SCRIPT"; private static final String ARGUMENT_PATH = "ARGUMENT_PATH"; + private static final String ACTION_IMPORT_SAMPLE = "I cannot find the way back to you...Eating...17.4.29"; + private static final String ARGUMENT_SAMPLE = "Take a chance on me...ok...?"; + private DrawerLayout mDrawerLayout; @ViewBinding.Id(R.id.bottom_menu) @@ -70,6 +78,7 @@ public class MainActivity extends BaseActivity { private OnActivityResultDelegate.Intermediary mActivityResultIntermediary = new OnActivityResultDelegate.Intermediary(); private DrawableSaver mDrawerHeaderBackgroundSaver, mAppbarBackgroundSaver; private VersionGuard mVersionGuard; + private Intent mIntentToHandle; @Override protected void onCreate(Bundle savedInstanceState) { @@ -77,13 +86,12 @@ public class MainActivity extends BaseActivity { setUpUI(); checkPermissions(); registerBackPressHandlers(); - handleIntent(getIntent()); + mIntentToHandle = getIntent(); EventBus.getDefault().register(this); mVersionGuard = new VersionGuard(this); } - private void registerBackPressHandlers() { registerBackPressedHandler(new BackPressedHandler() { @Override @@ -164,6 +172,15 @@ public class MainActivity extends BaseActivity { viewPager.setAdapter(mPagerAdapter); viewPager.setOffscreenPageLimit(mPagerAdapter.getCount()); tabLayout.setupWithViewPager(viewPager); + mPagerAdapter.setOnFragmentInstantiateListener(new FragmentPagerAdapterBuilder.OnFragmentInstantiateListener() { + @Override + public void OnInstantiate(Fragment fragment) { + if (fragment instanceof MyScriptListFragment && mIntentToHandle != null) { + handleIntent(mIntentToHandle); + mIntentToHandle = null; + } + } + }); } @ViewBinding.Click(R.id.add) @@ -183,13 +200,14 @@ public class MainActivity extends BaseActivity { @ViewBinding.Click(R.id.import_from_file) private void showFileChooser() { + final StorageScriptProvider provider = StorageScriptProvider.getExternalStorageProvider(); new ScriptFileChooserDialogBuilder(this) - .scriptProvider(StorageScriptProvider.getExternalStorageProvider()) + .scriptProvider(provider) .fileCallback(new ScriptFileChooserDialogBuilder.FileCallback() { @Override public void onFileSelection(MaterialDialog dialog, ScriptFile file) { dialog.dismiss(); - StorageScriptProvider.getExternalStorageProvider().clearCacheExceptInitialDirectory(); + provider.clearCacheExceptInitialDirectory(); getMyScriptListFragment().importFile(file.getPath()); } }) @@ -203,7 +221,7 @@ public class MainActivity extends BaseActivity { if (which == DialogAction.POSITIVE) { dialog.dismiss(); } else { - StorageScriptProvider.getExternalStorageProvider().refreshAll(); + provider.refreshAll(); } } }) @@ -225,6 +243,12 @@ public class MainActivity extends BaseActivity { mDrawerHeaderBackgroundSaver.select(this, mActivityResultIntermediary); } + @Override + protected void onResume() { + super.onResume(); + mVersionGuard.checkDeprecateAndUpdate(); + } + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -242,9 +266,22 @@ public class MainActivity extends BaseActivity { case ACTION_IMPORT_SCRIPT: getMyScriptListFragment().importFile(intent.getStringExtra(ARGUMENT_PATH)); break; + case ACTION_IMPORT_SAMPLE: + importSample((Sample) intent.getSerializableExtra(ARGUMENT_SAMPLE)); + break; } } + private void importSample(Sample sample) { + try { + getMyScriptListFragment().importFile(sample.name, getAssets().open(sample.path)); + } catch (IOException e) { + e.printStackTrace(); + Snackbar.make(mDrawerLayout, R.string.text_import_fail, Snackbar.LENGTH_SHORT).show(); + } + + } + private void handleRecordedScript(final String script) { new ThemeColorMaterialDialogBuilder(this) .title(R.string.text_recorded) @@ -280,6 +317,13 @@ public class MainActivity extends BaseActivity { .putExtra(ARGUMENT_PATH, path)); } + public static void importSample(Context context, Sample sample) { + context.startActivity(new Intent(context, MainActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP) + .putExtra(EXTRA_ACTION, ACTION_IMPORT_SAMPLE) + .putExtra(ARGUMENT_SAMPLE, sample)); + } + public MyScriptListFragment getMyScriptListFragment() { return ((MyScriptListFragment) mPagerAdapter.getStoredFragment(0)); } @@ -308,12 +352,6 @@ public class MainActivity extends BaseActivity { } - @Override - protected void onResume() { - super.onResume(); - mVersionGuard.checkDeprecateAndUpdate(); - } - @Override protected void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java index b2ae830f..2d5b9986 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java @@ -2,23 +2,26 @@ package com.stardust.scriptdroid.ui.main.operation; import android.content.Intent; import android.net.Uri; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import android.support.design.widget.Snackbar; -import com.afollestad.materialdialogs.MaterialDialog; +import com.squareup.haha.perflib.Main; +import com.stardust.autojs.ScriptExecutionListener; +import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.script.FileScriptSource; +import com.stardust.autojs.script.ScriptSource; +import com.stardust.autojs.script.StringScriptSource; +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.ScriptFileList; import com.stardust.scriptdroid.external.CommonUtils; import com.stardust.scriptdroid.external.shortcut.Shortcut; import com.stardust.scriptdroid.external.shortcut.ShortcutActivity; +import com.stardust.scriptdroid.scripts.ScriptFile; +import com.stardust.scriptdroid.scripts.sample.Sample; import com.stardust.scriptdroid.ui.edit.EditActivity; -import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; -import com.stardust.scriptdroid.App; -import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.ui.main.MainActivity; -import org.greenrobot.eventbus.EventBus; +import java.io.IOException; /** * Created by Stardust on 2017/1/23. @@ -26,17 +29,34 @@ import org.greenrobot.eventbus.EventBus; public abstract class ScriptFileOperation { + public static final String ACTION_ON_RUN_FINISHED = "ACTION_ON_RUN_FINISHED"; + public static final String EXTRA_EXCEPTION_MESSAGE = "EXTRA_EXCEPTION_MESSAGE"; - public static class ShowMessageEvent { - public int messageResId; - public ShowMessageEvent(int message) { - this.messageResId = message; + private static final ScriptExecutionListener SCRIPT_EXECUTION_LISTENER = new ScriptExecutionListener() { + + @Override + public void onStart(JavaScriptEngine engine, ScriptSource source) { + AutoJs.getInstance().getScriptEngineService().getDefaultListener().onStart(engine, source); } - } - public static void openByOtherApps(ScriptFile scriptFile) { - Uri uri = Uri.parse("file://" + scriptFile.getPath()); + @Override + public void onSuccess(JavaScriptEngine engine, ScriptSource source, Object result) { + App.getApp().sendBroadcast(new Intent(ACTION_ON_RUN_FINISHED)); + } + + @Override + public void onException(JavaScriptEngine engine, ScriptSource source, Exception e) { + App.getApp().sendBroadcast(new Intent(ACTION_ON_RUN_FINISHED) + .putExtra(EXTRA_EXCEPTION_MESSAGE, e.getMessage())); + e.printStackTrace(); + } + + }; + + + public static void openByOtherApps(String path) { + Uri uri = Uri.parse("file://" + path); App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } @@ -53,149 +73,12 @@ public abstract class ScriptFileOperation { EditActivity.editFile(App.getApp(), file.getSimplifiedName(), file.getPath()); } - - public abstract void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position); - - private String mName; - - public ScriptFileOperation(String name, int iconResId) { - mName = name; - mIconResId = iconResId; + public static void run(ScriptFile file) { + AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(file)); } - private int mIconResId; - - public String getName() { - return mName; + public static void runOnEditView(ScriptSource scriptSource) { + AutoJs.getInstance().getScriptEngineService().execute(scriptSource, SCRIPT_EXECUTION_LISTENER); } - public int getIconResId() { - return mIconResId; - } - - public static class Run extends ScriptFileOperation { - - public Run() { - super(App.getApp().getString(R.string.text_run), R.drawable.ic_play_green); - } - - @Override - public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) { - EventBus.getDefault().post(new ShowMessageEvent(R.string.text_start_running)); - ScriptFile scriptFile = scriptFileList.get(position); - AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(scriptFile)); - } - } - - public static class Edit extends ScriptFileOperation { - - private static Edit instance = new Edit(); - - public Edit() { - super(App.getApp().getString(R.string.text_edit), R.drawable.ic_edit_green_48dp); - } - - public static Edit getInstance() { - return instance; - } - - public static void setInstance(Edit instance) { - Edit.instance = instance; - } - - @Override - public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) { - ScriptFile scriptFile = scriptFileList.get(position); - EditActivity.editFile(App.getApp(), scriptFile.getSimplifiedName(), scriptFile.getPath()); - //脚本 - //任务&控制台 - //教程 - // - } - } - - public static class OpenByOtherApp extends ScriptFileOperation { - - public OpenByOtherApp() { - super(App.getApp().getString(R.string.text_open_by_other_apps), R.drawable.ic_open_in_new_green_48dp); - } - - @Override - public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) { - ScriptFile scriptFile = scriptFileList.get(position); - Uri uri = Uri.parse("file://" + scriptFile.getPath()); - App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } - } - - public static class Rename extends ScriptFileOperation { - - public Rename() { - super(App.getApp().getString(R.string.text_rename), R.drawable.ic_rename_green); - } - - @Override - public void operate(final RecyclerView recyclerView, final ScriptFileList scriptFileList, final int position) { - String oldName = scriptFileList.get(position).getSimplifiedName(); - new ThemeColorMaterialDialogBuilder(recyclerView.getContext()) - .title(R.string.text_rename) - .checkBoxPrompt(App.getApp().getString(R.string.text_rename_file_meanwhile), false, null) - .input(App.getApp().getString(R.string.text_please_input_new_name), oldName, new MaterialDialog.InputCallback() { - @Override - public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { - scriptFileList.rename(position, input.toString(), dialog.isPromptCheckBoxChecked()); - recyclerView.getAdapter().notifyItemChanged(position); - } - }) - .show(); - } - } - - public static class CreateShortcut extends ScriptFileOperation { - - public CreateShortcut() { - super(App.getApp().getString(R.string.text_send_shortcut), R.drawable.ic_shortcut_green); - } - - @Override - public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) { - ScriptFile scriptFile = scriptFileList.get(position); - new Shortcut(App.getApp()).name(scriptFile.getSimplifiedName()) - .targetClass(ShortcutActivity.class) - .icon(R.drawable.ic_robot_green) - .extras(new Intent().putExtra("path", scriptFile.getPath())) - .send(); - EventBus.getDefault().post(R.string.text_already_create); - } - } - - public static class Remove extends ScriptFileOperation { - - public Remove() { - super(App.getApp().getString(R.string.text_delete), R.drawable.ic_delete_green_48dp); - } - - @Override - public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) { - scriptFileList.remove(position); - recyclerView.getAdapter().notifyItemRemoved(position); - } - } - - public static class Delete extends ScriptFileOperation { - - public Delete() { - super(App.getApp().getString(R.string.text_delete_absolutly), R.drawable.ic_delete_forever_green_48dp); - } - - @Override - public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) { - boolean succeed = scriptFileList.deleteFromFileSystem(position); - EventBus.getDefault().post(new ShowMessageEvent(succeed ? R.string.text_already_delete : R.string.text_delete_failed)); - if (succeed) - recyclerView.getAdapter().notifyItemRemoved(position); - } - } - - -} +} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java deleted file mode 100644 index 035f2255..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.stardust.scriptdroid.ui.main.operation; - -import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.support.annotation.Nullable; -import android.support.v4.widget.PopupWindowCompat; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.util.AttributeSet; -import android.util.DisplayMetrics; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.PopupWindow; -import android.widget.TextView; -import android.workground.WrapContentLinearLayoutManager; - -import com.stardust.util.ViewUtil; -import com.stardust.scriptdroid.R; - -import java.util.List; - -/** - * Created by Stardust on 2017/1/24. - */ - -public class ScriptFileOperationPopupMenu extends PopupWindow { - - - public interface OnItemClickListener { - void onClick(View view, int position, ScriptFileOperation operation); - } - - private Context mContext; - private ScriptFileOperationListRecyclerView mOperationListRecyclerView; - private OnItemClickListener mOnItemClickListener; - - - private List mScriptFileOperationList; - - private final View.OnClickListener mOnItemClickRealListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mOnItemClickListener != null) { - int position = mOperationListRecyclerView.getChildViewHolder(v).getAdapterPosition(); - mOnItemClickListener.onClick(v, position, mScriptFileOperationList.get(position)); - } - } - }; - - - public ScriptFileOperationPopupMenu(Context context, List scriptFileOperationList) { - super(context); - mContext = context; - mScriptFileOperationList = scriptFileOperationList; - init(); - } - - public void setOnItemClickListener(OnItemClickListener onItemClickListener) { - mOnItemClickListener = onItemClickListener; - } - - public void show(View anchor) { - int y = (int) (getScreenHeight() - anchor.getHeight() - getYInScreen(anchor) - getContentHeight()); - y = Math.min(y, -anchor.getHeight()); - PopupWindowCompat.showAsDropDown(this, anchor, 0, y, Gravity.LEFT | Gravity.BOTTOM); - } - - private int getContentHeight() { - getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); - return getContentView().getMeasuredHeight(); - } - - private int getYInScreen(View anchor) { - int[] location = new int[2]; - anchor.getLocationInWindow(location); - return location[1]; - } - - - private float getScreenHeight() { - DisplayMetrics displaymetrics = new DisplayMetrics(); - ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displaymetrics); - return displaymetrics.heightPixels; - } - - private void init() { - setWidth(WindowManager.LayoutParams.WRAP_CONTENT); - setHeight(WindowManager.LayoutParams.WRAP_CONTENT); - setBackgroundDrawable(new ColorDrawable()); - setOutsideTouchable(true); - setAnimationStyle(-1); - initContentView(); - } - - private void initContentView() { - View contentView = View.inflate(mContext, R.layout.script_file_operation_popup_menu_content, null); - setContentView(contentView); - mOperationListRecyclerView = ViewUtil.$(contentView, R.id.operation_list); - mOperationListRecyclerView.setOnItemClickListener(mOnItemClickRealListener); - mOperationListRecyclerView.setScriptFileOperationList(mScriptFileOperationList); - } - - - public static class ScriptFileOperationListRecyclerView extends RecyclerView { - - private OnClickListener mOnItemClickListener; - - private List mScriptFileOperationList; - - public ScriptFileOperationListRecyclerView(Context context) { - super(context); - init(); - } - - public ScriptFileOperationListRecyclerView(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - init(); - } - - public ScriptFileOperationListRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - public void setScriptFileOperationList(List scriptFileOperationList) { - mScriptFileOperationList = scriptFileOperationList; - } - - private void init() { - setLayoutManager(new WrapContentLinearLayoutManager(getContext())); - setAdapter(new Adapter() { - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View itemView = LayoutInflater.from(getContext()).inflate(R.layout.script_file_operation_popup_menu_item, parent, false); - return new ViewHolder(itemView); - } - - @Override - public void onBindViewHolder(ViewHolder holder, int position) { - ScriptFileOperation operation = mScriptFileOperationList.get(position); - holder.operationName.setText(operation.getName()); - holder.icon.setImageResource(operation.getIconResId()); - } - - @Override - public int getItemCount() { - return mScriptFileOperationList.size(); - } - }); - } - - public void setOnItemClickListener(OnClickListener onItemClickListener) { - mOnItemClickListener = onItemClickListener; - } - - private class ViewHolder extends RecyclerView.ViewHolder { - - TextView operationName; - ImageView icon; - - ViewHolder(View itemView) { - super(itemView); - itemView.setOnClickListener(mOnItemClickListener); - operationName = ViewUtil.$(itemView, R.id.name); - icon = ViewUtil.$(itemView, R.id.icon); - } - } - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java index 184bc780..f750c9b1 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java @@ -9,13 +9,11 @@ import android.view.ViewGroup; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.app.Fragment; -import com.stardust.pio.PFile; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.scripts.sample.Sample; import com.stardust.scriptdroid.scripts.sample.SampleFileManager; -import com.stardust.scriptdroid.ui.edit.EditActivity; +import com.stardust.scriptdroid.ui.edit.ViewSampleActivity; import com.stardust.scriptdroid.ui.main.MainActivity; -import com.stardust.util.AssetsCache; import java.io.IOException; @@ -67,6 +65,7 @@ public class SampleScriptListFragment extends Fragment { } private void copySampleToMyScripts(Sample sample) { + MainActivity.importSample(getActivity(), sample); try { ((MainActivity) getActivity()).getMyScriptListFragment(). importFile(sample.name, getActivity().getAssets().open(sample.path)); @@ -77,7 +76,7 @@ public class SampleScriptListFragment extends Fragment { } private void viewSample(Sample sample) { - EditActivity.view(getContext(), sample.name, AssetsCache.get(getActivity(), sample.path)); + ViewSampleActivity.view(getContext(), sample); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java index bb92c851..1f7a479f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java @@ -5,6 +5,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.text.InputType; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,6 +38,8 @@ public class MyScriptListFragment extends Fragment { public static final String MESSAGE_SCRIPT_FILE_ADDED = "MESSAGE_SCRIPT_FILE_ADDED"; + private static final String TAG = "MyScriptListFragment"; + private ScriptAndFolderListRecyclerView mScriptListRecyclerView; private ScriptListWithProgressBarView mScriptListWithProgressBarView; private View mNoScriptHint; @@ -45,7 +48,7 @@ public class MyScriptListFragment extends Fragment { private ScriptFile mSelectedScriptFile; private MaterialDialog.InputCallback mFileNameInputCallback = new InputCallback(false); private MaterialDialog.InputCallback mDirectoryNameInputCallback = new InputCallback(true); - private int mSelectedPosition; + private String mFilePathToImport; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -67,6 +70,10 @@ public class MyScriptListFragment extends Fragment { mNoScriptHint = $(R.id.hint_no_script); initScriptListRecyclerView(); initDialogs(); + if (mFilePathToImport != null) { + importFile(mFilePathToImport); + mFilePathToImport = null; + } } private void initScriptListRecyclerView() { @@ -91,7 +98,6 @@ public class MyScriptListFragment extends Fragment { @Override public void onLongClick(ScriptFile file, int position) { mSelectedScriptFile = file; - mSelectedPosition = position; if (file.isDirectory()) { mDirectoryOperationDialog.show(); } else { @@ -147,6 +153,10 @@ public class MyScriptListFragment extends Fragment { } public void importFile(final String pathFrom) { + if (getActivity() == null) { + mFilePathToImport = pathFrom; + return; + } try { importFile(PFile.getNameWithoutExtension(pathFrom), new FileInputStream(pathFrom)); } catch (FileNotFoundException e) { @@ -245,7 +255,7 @@ public class MyScriptListFragment extends Fragment { @ViewBinding.Click(R.id.open_by_other_apps) private void openByOtherApps() { dismissDialogs(); - ScriptFileOperation.openByOtherApps(mSelectedScriptFile); + ScriptFileOperation.openByOtherApps(mSelectedScriptFile.getPath()); onScriptFileOperated(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java index 090b783d..ca00dafe 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java @@ -20,6 +20,7 @@ import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.scripts.ScriptFile; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; import com.stardust.widget.ViewHolderMutableAdapter; import com.stardust.widget.ViewHolderSupplier; import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; @@ -107,7 +108,7 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { public void onClick(View v) { int position = getChildViewHolder((View) v.getParent()).getAdapterPosition(); ScriptFile file = mAdapter.getScriptFileAt(position); - AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(file)); + ScriptFileOperation.run(file); } }; private final ViewHolderSupplier mDefaultViewHolderSupplier = new ViewHolderSupplier() { @@ -188,6 +189,10 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { setRootDirectory(mStorageScriptProvider.getInitialDirectory()); } + public StorageScriptProvider getStorageScriptProvider() { + return mStorageScriptProvider; + } + public void setOnItemClickListener(OnScriptFileClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListRecyclerView.java deleted file mode 100644 index ad96b5fd..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListRecyclerView.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.stardust.scriptdroid.ui.main.script_list; - -import android.content.Context; -import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.ThemeColorRecyclerView; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.workground.WrapContentLinearLayoutManager; - -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.ScriptFileList; -import com.stardust.util.ViewUtil; -import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; - -import org.greenrobot.eventbus.Subscribe; - -/** - * Created by Stardust on 2017/1/23. - */ - -public class ScriptListRecyclerView extends ThemeColorRecyclerView { - - public interface OnItemClickListener { - - void OnItemClick(View v, int position); - - } - - private ScriptFileList mScriptFileList; - - private OnItemClickListener mOnItemClickListener; - - private final OnClickListener mOnItemClickListenerProxy = new OnClickListener() { - @Override - public void onClick(View v) { - int position = getChildViewHolder(v).getAdapterPosition(); - if (mOnItemClickListener != null) { - mOnItemClickListener.OnItemClick(v, position); - } - } - }; - - private final OnClickListener mOnEditIconClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - int position = getChildViewHolder((View) v.getParent()).getAdapterPosition(); - onEditIconClick(v, position); - } - }; - - private final OnClickListener mOnRunIconClickListener = new OnClickListener() { - @Override - public void onClick(View v) { - int position = getChildViewHolder((View) v.getParent()).getAdapterPosition(); - //onRunIconClick(v, position); - } - - }; - - - public ScriptListRecyclerView(Context context) { - super(context); - init(); - } - - - public ScriptListRecyclerView(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - init(); - } - - public ScriptListRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - public void setOnItemClickListener(OnItemClickListener onItemClickListener) { - mOnItemClickListener = onItemClickListener; - } - - private void init() { - setAdapter(new Adapter()); - setLayoutManager(new WrapContentLinearLayoutManager(getContext())); - addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); - } - - - protected void onEditIconClick(View v, int position) { - ScriptFileOperation.Edit.getInstance().operate(ScriptListRecyclerView.this, mScriptFileList, position); - } - - public void setScriptFileList(ScriptFileList scriptFileList) { - mScriptFileList = scriptFileList; - getAdapter().notifyDataSetChanged(); - } - - @Subscribe - public void showMessage(ScriptFileOperation.ShowMessageEvent event) { - Snackbar.make(this, event.messageResId, Snackbar.LENGTH_SHORT).show(); - } - - private class Adapter extends RecyclerView.Adapter { - - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View itemView = LayoutInflater.from(getContext()).inflate(R.layout.script_list_recycler_view_item, parent, false); - return new ViewHolder(itemView); - } - - @Override - public void onBindViewHolder(ViewHolder holder, int position) { - ScriptFile scriptFile = mScriptFileList.get(position); - holder.name.setText(scriptFile.getSimplifiedName()); - holder.path.setText(scriptFile.getSimplifiedPath()); - } - - - @Override - public int getItemCount() { - return mScriptFileList.size(); - } - - @Override - public void registerAdapterDataObserver(AdapterDataObserver observer) { - super.registerAdapterDataObserver(observer); - } - } - - private class ViewHolder extends RecyclerView.ViewHolder { - - TextView name, path; - - ViewHolder(View itemView) { - super(itemView); - name = (TextView) itemView.findViewById(R.id.name); - path = (TextView) itemView.findViewById(R.id.path); - ViewUtil.$(itemView, R.id.edit).setOnClickListener(mOnEditIconClickListener); - ViewUtil.$(itemView, R.id.run).setOnClickListener(mOnRunIconClickListener); - itemView.setOnClickListener(mOnItemClickListenerProxy); - } - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java index 0c200f45..f06d997b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java @@ -7,6 +7,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.annotation.StyleRes; +import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; @@ -23,6 +24,7 @@ public class ScriptListWithProgressBarView extends FrameLayout { private View mProgressBar; private ScriptAndFolderListRecyclerView mScriptAndFolderListRecyclerView; + private SwipeRefreshLayout mSwipeRefreshLayout; public ScriptListWithProgressBarView(@NonNull Context context) { super(context); @@ -47,6 +49,7 @@ public class ScriptListWithProgressBarView extends FrameLayout { private void init() { inflate(getContext(), R.layout.script_and_folder_list_view, this); + mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout); mProgressBar = findViewById(R.id.progressBar); mScriptAndFolderListRecyclerView = (ScriptAndFolderListRecyclerView) findViewById(R.id.script_list_recycler_view); mScriptAndFolderListRecyclerView.setFileProcessListener(new ScriptAndFolderListRecyclerView.FileProcessListener() { @@ -60,6 +63,12 @@ public class ScriptListWithProgressBarView extends FrameLayout { hideProgressBar(); } }); + mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + mScriptAndFolderListRecyclerView.getStorageScriptProvider().refreshAll(); + } + }); } @@ -82,11 +91,13 @@ public class ScriptListWithProgressBarView extends FrameLayout { public void showProgressBar() { - mProgressBar.setVisibility(VISIBLE); + mSwipeRefreshLayout.setRefreshing(true); + mScriptAndFolderListRecyclerView.setEnabled(false); } public void hideProgressBar() { - mProgressBar.setVisibility(GONE); + mSwipeRefreshLayout.setRefreshing(false); + mScriptAndFolderListRecyclerView.setEnabled(true); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java index e5d7292a..568a0335 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java @@ -115,6 +115,7 @@ public class SettingsActivity extends BaseActivity { @Override public void run() { EventBus.getDefault().post(new MessageEvent(MainActivity.MESSAGE_CLEAR_BACKGROUND_SETTINGS)); + Toast.makeText(getActivity(), R.string.text_already_reset, Toast.LENGTH_SHORT).show(); } }) .entry(getString(R.string.text_check_update), new Runnable() { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/update/VersionGuard.java b/app/src/main/java/com/stardust/scriptdroid/ui/update/VersionGuard.java index 5eb90324..b4845da4 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/update/VersionGuard.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/update/VersionGuard.java @@ -6,6 +6,7 @@ import android.support.annotation.NonNull; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.tool.UpdateChecker; import com.stardust.scriptdroid.tool.VersionInfo; @@ -43,7 +44,7 @@ public class VersionGuard { if (isCurrentVersionDeprecated) { showDeprecatedDialogIfNeeded(); } else { - showUpdateInfo(info); + showUpdateInfoIfNeeded(info); } } }); @@ -51,10 +52,12 @@ public class VersionGuard { } } - private void showUpdateInfo(UpdateChecker.UpdateInfo info) { - new UpdateInfoDialogBuilder(mActivity, info) - .showDoNotAskAgain() - .show(); + private void showUpdateInfoIfNeeded(UpdateChecker.UpdateInfo info) { + if (BuildConfig.VERSION_CODE < info.versionCode) { + new UpdateInfoDialogBuilder(mActivity, info) + .showDoNotAskAgain() + .show(); + } } private void showDeprecatedDialogIfNeeded() { diff --git a/app/src/main/java/com/stardust/widget/SlidingUpPanel.java b/app/src/main/java/com/stardust/widget/SlidingUpPanel.java index 366efac0..a3ba7e84 100644 --- a/app/src/main/java/com/stardust/widget/SlidingUpPanel.java +++ b/app/src/main/java/com/stardust/widget/SlidingUpPanel.java @@ -50,6 +50,7 @@ public class SlidingUpPanel extends FrameLayout { public void show() { setVisibility(VISIBLE); + setClickable(true); mContentContainer.startAnimation(mSlideUpAnimation); mShowing = true; } diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index f7a86271..0208b4f0 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -63,20 +63,6 @@ - - - - - - + diff --git a/app/src/main/res/layout/activity_view_sample.xml b/app/src/main/res/layout/activity_view_sample.xml new file mode 100644 index 00000000..612c8ac7 --- /dev/null +++ b/app/src/main/res/layout/activity_view_sample.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/air_activity_issue_reporter.xml b/app/src/main/res/layout/air_activity_issue_reporter.xml index 26e0bfc6..c1a3ec88 100644 --- a/app/src/main/res/layout/air_activity_issue_reporter.xml +++ b/app/src/main/res/layout/air_activity_issue_reporter.xml @@ -36,7 +36,7 @@ + android:layout_height="wrap_content"/> @@ -52,12 +52,12 @@ + android:padding="@dimen/air_baseline_card"> @@ -82,8 +82,7 @@ android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/air_baseline" - app:srcCompat="@drawable/air_ic_send_light" - app:backgroundTint="?colorAccent"/> + app:srcCompat="@drawable/air_ic_send_light"/> diff --git a/app/src/main/res/layout/air_card_report_compat.xml b/app/src/main/res/layout/air_card_report_compat.xml new file mode 100644 index 00000000..37b6f5c4 --- /dev/null +++ b/app/src/main/res/layout/air_card_report_compat.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/script_and_folder_list_view.xml b/app/src/main/res/layout/script_and_folder_list_view.xml index 9b18cbf5..3c535c47 100644 --- a/app/src/main/res/layout/script_and_folder_list_view.xml +++ b/app/src/main/res/layout/script_and_folder_list_view.xml @@ -4,10 +4,17 @@ android:layout_height="match_parent" android:background="#fefefe"> - + android:layout_height="match_parent"> + + + + - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/script_file_operation_popup_menu_item.xml b/app/src/main/res/layout/script_file_operation_popup_menu_item.xml deleted file mode 100644 index a1c418da..00000000 --- a/app/src/main/res/layout/script_file_operation_popup_menu_item.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml index c7ab25e3..11d167a2 100644 --- a/app/src/main/res/menu/menu_editor.xml +++ b/app/src/main/res/menu/menu_editor.xml @@ -9,15 +9,21 @@ app:showAsAction="never"/> + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_view_sample.xml b/app/src/main/res/menu/menu_view_sample.xml new file mode 100644 index 00000000..a1985cc9 --- /dev/null +++ b/app/src/main/res/menu/menu_view_sample.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 0a34356a..29ec5ef5 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1,5 +1,5 @@ - UiAutomator + AutoJs Settings Disable Service Required by the script automatic operation (click, long press, slide, etc.). @@ -38,8 +38,6 @@ Don\'t show again Copyright©2016 All right reserves. Stardust - 946994919 - hybbbb1996@gmail.com Source Code Copied Donate @@ -122,7 +120,7 @@ View layout hierarchy View layout bounds Accessibility service is not activated - Sample Scripts + Samples My Scripts Click ADD to create your first script~(。・・)ノ Reset background settings @@ -155,15 +153,15 @@ If the app responses slowly when running script, choose Thread Pool or Create Thread. But it may causes rebooting of the device ON OFF - 请选择要导入的脚本 - 刷新 - ω<*)]]> - 正在检查更新 - 新版本 - 已经是最新版本 - 版本过低 - 这个版本已经不能再使用了哦 - 更新日志 + Select script file to import + Refresh + ω<*)]]> + Checking for updates + New Version + No newer version found + Version too old + This version is deprecated + Release Notes None Volume Up @@ -176,5 +174,15 @@ Create New Thread Every Time Thread Pool + Update + Tasks + Script + + Processing + + Pre-execute script + Check for updates + New Directory + 已重置 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bc1ad476..cdc35180 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - 免Root脚本精灵 + AutoJs 设置 关闭服务 使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。 @@ -12,7 +12,7 @@ 请输入名称 名称 去设置 - 软件需要打开\"自动操作服务\"才能运行,请在随后的设置中选择\"免Root脚本精灵\"并开启服务。\n您也可以稍后在侧拉菜单中设置。 + 软件需要打开\"自动操作服务\"才能运行,请在随后的设置中选择\"AutoJs\"并开启服务。\n您也可以稍后在侧拉菜单中设置。 取消 路径为空 文件不存在 @@ -42,14 +42,14 @@ 示例:简单计算器 Copyright©2016 All right reserves. 星尘幻影 - 946994919 + 2732014414 hybbbb1996@gmail.com 软件源代码 已复制到剪贴板 打赏作者 邮箱 https://github.com/hyb1996/NoRootScriptDroid - [免Root脚本精灵]下载地址:http://www.coolapk.com/apk/com.stardust.scriptdroid + [AutoJs]下载地址:http://www.coolapk.com/apk/com.stardust.scriptdroid 悬浮窗 通知栏点击区域辅助开关 其他 @@ -165,7 +165,7 @@ key_stop_record_trigger 当前活动: 当前应用包名: - 无障碍服务->免Root脚本精灵并开启]]> + 无障碍服务->AutoJs并开启]]> 脚本运行 key_use_volume_control_running 每次音量键变化停止所有脚本 @@ -210,6 +210,10 @@ 此版本不再提示 格式化代码 处理中 + 已重置 + 保护模式 + 在本软件界面无法运行自动操作命令以免误触 + key_guard_mode diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index c0f15410..0ac2da10 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -35,6 +35,12 @@ android:defaultValue="false" android:key="@string/key_use_volume_control_running" android:title="@string/text_use_volume_to_stop_running"/> + + @@ -60,26 +66,12 @@ - - - - - - - diff --git a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java index aea66bee..3ddc6ade 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java @@ -85,8 +85,7 @@ public abstract class JavaScriptEngineManager { void removeEngine(JavaScriptEngine engine) { synchronized (mEngines) { - mEngines.remove(engine); - if (mEngineLifecycleCallback != null) { + if (mEngines.remove(engine) && mEngineLifecycleCallback != null) { mEngineLifecycleCallback.onEngineRemove(engine); } } 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 860a4f46..cc730d8a 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -1,10 +1,10 @@ package com.stardust.autojs.engine; +import android.os.Looper; import android.util.Log; import com.stardust.autojs.rhino_android.AndroidContextFactory; import com.stardust.autojs.rhino_android.RhinoAndroidHelper; -import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptStopException; import com.stardust.autojs.script.ScriptSource; import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; @@ -17,7 +17,6 @@ import org.mozilla.javascript.ScriptableObject; import java.io.File; import java.util.Arrays; -import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import java.util.Timer; @@ -36,6 +35,7 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine { private Thread mThread; private RhinoJavaScriptEngineManager mEngineManager; private Map mTags = new Hashtable<>(); + private boolean mDestroyed = false; public RhinoJavaScriptEngine(RhinoJavaScriptEngineManager engineManager) { mEngineManager = engineManager; @@ -67,7 +67,7 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine { } @Override - public void destroy() { + public synchronized void destroy() { Context.exit(); // TODO: 2017/4/6 XXX :在这里回收内存池并不好 final AccessibilityNodeInfoAllocator allocator = (AccessibilityNodeInfoAllocator) getTag("allocator"); @@ -75,6 +75,7 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine { new Timer().schedule(new TimerTask() { @Override public void run() { + // FIXME: 2017/4/28 //allocator.recycleAll(); } }, 1000); @@ -136,14 +137,13 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine { @Override protected void observeInstructionCount(Context cx, int instructionCount) { if (Thread.currentThread().isInterrupted()) { - + Context.exit(); throw new ScriptStopException(new InterruptedException()); } } @Override protected Context makeContext() { - Context cx = super.makeContext(); cx.setInstructionObserverThreshold(10000); return cx; diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/AutomatorConfig.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AutomatorConfig.java new file mode 100644 index 00000000..9a1f2335 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AutomatorConfig.java @@ -0,0 +1,19 @@ +package com.stardust.autojs.runtime.api; + +/** + * Created by Stardust on 2017/4/29. + */ + +public class AutomatorConfig { + + private static boolean isUnintendedGuardEnabled = false; + + + public static boolean isUnintendedGuardEnabled() { + return isUnintendedGuardEnabled; + } + + public static void setIsUnintendedGuardEnabled(boolean isUnintendedGuardEnabled) { + AutomatorConfig.isUnintendedGuardEnabled = isUnintendedGuardEnabled; + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java index 99a6b7a5..2f8c7ae3 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/UiSelector.java @@ -2,6 +2,7 @@ package com.stardust.autojs.runtime.api; import android.accessibilityservice.AccessibilityService; import android.support.annotation.NonNull; +import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -87,7 +88,8 @@ public class UiSelector extends UiGlobalSelector { @JavascriptInterface public UiObjectCollection find() { ensureAccessibilityServiceEnabled(); - if (isRunningPackageSelf()) { + if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) { + Log.d(TAG, "isSelfPackage return null"); return null; } AccessibilityService service = mAccessibilityBridge.getService(); @@ -105,7 +107,7 @@ public class UiSelector extends UiGlobalSelector { } private boolean isRunningPackageSelf() { - return DeveloperUtils.isRunningPackageSelf(mAccessibilityBridge.getInfoProvider().getLatestPackage()); + return DeveloperUtils.isSelfPackage(mAccessibilityBridge.getInfoProvider().getLatestPackage()); } @@ -115,6 +117,7 @@ public class UiSelector extends UiGlobalSelector { UiObjectCollection uiObjectCollection; do { if (Thread.currentThread().isInterrupted()) { + Log.d(TAG, "Thread isInterrupted"); throw new ScriptStopException(new InterruptedException()); } uiObjectCollection = find(); diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java index 5b6f8ebb..086b09d6 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java @@ -11,6 +11,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import com.stardust.autojs.runtime.AccessibilityBridge; import com.stardust.autojs.runtime.JavascriptInterface; import com.stardust.autojs.runtime.ScriptRuntime; +import com.stardust.autojs.runtime.api.AutomatorConfig; import com.stardust.automator.AccessibilityEventCommandHost; import com.stardust.automator.simple_action.SimpleAction; import com.stardust.automator.simple_action.ActionFactory; @@ -24,6 +25,8 @@ import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator; public class SimpleActionAutomator { + private static final String TAG = "SimpleActionAutomator"; + @Deprecated private static class PerformGlobalActionCommand extends AccessibilityEventCommandHost.AbstractCommand { @@ -185,7 +188,8 @@ public class SimpleActionAutomator { @SuppressWarnings("unchecked") private boolean performAction(SimpleAction simpleAction) { ensureAccessibilityServiceEnabled(); - if (isRunningPackageSelf()) { + if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) { + Log.i(TAG, "performAction: running package is self. return false"); return false; } AccessibilityService service = mAccessibilityBridge.getService(); @@ -203,6 +207,6 @@ public class SimpleActionAutomator { } private boolean isRunningPackageSelf() { - return DeveloperUtils.isRunningPackageSelf(mAccessibilityBridge.getInfoProvider().getLatestPackage()); + return DeveloperUtils.isSelfPackage(mAccessibilityBridge.getInfoProvider().getLatestPackage()); } } diff --git a/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java b/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java new file mode 100644 index 00000000..09007503 --- /dev/null +++ b/common/src/main/java/com/stardust/pio/PRandomAccessBinaryFile.java @@ -0,0 +1,29 @@ +package com.stardust.pio; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * Created by Stardust on 2017/4/29. + */ + +public class PRandomAccessBinaryFile extends RandomAccessFile { + + + private RandomAccessFile mRandomAccessFile; + + public PRandomAccessBinaryFile(String name, String mode) throws FileNotFoundException { + super(name, mode); + } + + public PRandomAccessBinaryFile(File file, String mode) throws FileNotFoundException { + super(file, mode); + } + + public String readline() throws IOException { + return super.readLine(); + } + +} diff --git a/common/src/main/java/com/stardust/util/DeveloperUtils.java b/common/src/main/java/com/stardust/util/DeveloperUtils.java index 5a9b7c7b..66add949 100644 --- a/common/src/main/java/com/stardust/util/DeveloperUtils.java +++ b/common/src/main/java/com/stardust/util/DeveloperUtils.java @@ -16,7 +16,7 @@ public class DeveloperUtils { } } - public static boolean isRunningPackageSelf(@Nullable String runningPackage) { + public static boolean isSelfPackage(@Nullable String runningPackage) { return PACKAGE_NAME.equals(runningPackage); } }