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 782245b3..00000000 Binary files a/app/src/main/assets/numbers/0.png and /dev/null differ diff --git a/app/src/main/assets/numbers/1.png b/app/src/main/assets/numbers/1.png deleted file mode 100644 index ea3d3542..00000000 Binary files a/app/src/main/assets/numbers/1.png and /dev/null differ diff --git a/app/src/main/assets/numbers/2.png b/app/src/main/assets/numbers/2.png deleted file mode 100644 index 8c343784..00000000 Binary files a/app/src/main/assets/numbers/2.png and /dev/null differ diff --git a/app/src/main/assets/numbers/3.png b/app/src/main/assets/numbers/3.png deleted file mode 100644 index 43b73e6b..00000000 Binary files a/app/src/main/assets/numbers/3.png and /dev/null differ diff --git a/app/src/main/assets/numbers/4.png b/app/src/main/assets/numbers/4.png deleted file mode 100644 index c6a089ff..00000000 Binary files a/app/src/main/assets/numbers/4.png and /dev/null differ diff --git a/app/src/main/assets/numbers/5.png b/app/src/main/assets/numbers/5.png deleted file mode 100644 index 32d78e3b..00000000 Binary files a/app/src/main/assets/numbers/5.png and /dev/null differ diff --git a/app/src/main/assets/numbers/6.png b/app/src/main/assets/numbers/6.png deleted file mode 100644 index d5a756a3..00000000 Binary files a/app/src/main/assets/numbers/6.png and /dev/null differ diff --git a/app/src/main/assets/numbers/7.png b/app/src/main/assets/numbers/7.png deleted file mode 100644 index dc46da63..00000000 Binary files a/app/src/main/assets/numbers/7.png and /dev/null differ diff --git a/app/src/main/assets/numbers/8.png b/app/src/main/assets/numbers/8.png deleted file mode 100644 index 4e1d4e8b..00000000 Binary files a/app/src/main/assets/numbers/8.png and /dev/null differ diff --git a/app/src/main/assets/numbers/9.png b/app/src/main/assets/numbers/9.png deleted file mode 100644 index a17fa212..00000000 Binary files a/app/src/main/assets/numbers/9.png and /dev/null differ 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); } }