diff --git a/app-release-1.17.0213.apk b/app-release-1.17.0213.apk
new file mode 100644
index 00000000..7859212d
Binary files /dev/null and b/app-release-1.17.0213.apk differ
diff --git a/app1.17.0212.apk b/app/app-release.apk
similarity index 64%
rename from app1.17.0212.apk
rename to app/app-release.apk
index 26ec00c9..dd09e415 100644
Binary files a/app1.17.0212.apk and b/app/app-release.apk differ
diff --git a/app/build.gradle b/app/build.gradle
index 0b633908..6682df18 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,13 +2,13 @@ apply plugin: 'com.android.application'
android {
compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ buildToolsVersion "25.0.1"
defaultConfig {
applicationId "com.stardust.scriptdroid"
minSdkVersion 19
targetSdkVersion 23
- versionCode 20
- versionName "1.17.0212"
+ versionCode 22
+ versionName "1.17.0213"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -25,6 +25,12 @@ android {
dataBinding {
enabled = true
}
+ android.applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ def file = output.outputFile
+ output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
+ }
+ }
}
repositories {
@@ -37,8 +43,8 @@ dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:25.0.0'
- compile 'com.android.support:design:25.0.0'
+ compile 'com.android.support:appcompat-v7:25.1.0'
+ compile 'com.android.support:design:25.1.0'
compile 'com.afollestad.material-dialogs:core:0.9.2.3'
compile 'com.google.code.gson:gson:2.8.0'
@@ -48,15 +54,16 @@ dependencies {
compile 'moe.feng:AlipayZeroSdk:1.1'
compile 'com.jraska:console:0.4.3'
compile 'com.jraska:console-timber-tree:0.4.3'
+ compile 'com.heinrichreimersoftware:android-issue-reporter:eae4c73cbeb91e98da83fe79a3dea088a8b97448'
compile files('libs/JSTransformer.jar')
compile 'com.afollestad.material-dialogs:commons:0.9.2.3'
compile 'com.makeramen:roundedimageview:2.2.1'
compile 'com.rengwuxian.materialedittext:library:2.0.3'
- compile(name:'920-common-release', ext:'aar')
- compile(name:'920-styles-debug', ext:'aar')
- compile(name:'920-file_explorer-release', ext:'aar')
- compile(name:'920-app-debug', ext:'aar')
+ compile(name: '920-common-release', ext: 'aar')
+ compile(name: '920-styles-debug', ext: 'aar')
+ compile(name: '920-file_explorer-release', ext: 'aar')
+ compile(name: '920-app-debug', ext: 'aar')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e6b0d4cf..db448335 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,15 +8,17 @@
+ android:theme="@style/AppTheme"
+ tools:replace="android:label">
@@ -39,7 +41,7 @@
android:name=".droid.runtime.action.ActionPerformService"
android:enabled="true"
android:exported="true"
- android:label="@string/app_name"
+ android:label="@string/_app_name"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
@@ -77,6 +79,9 @@
+
diff --git a/app/src/main/assets/javasccript_engine_init.js b/app/src/main/assets/javasccript_engine_init.js
index 08f46a6b..af750f8a 100644
--- a/app/src/main/assets/javasccript_engine_init.js
+++ b/app/src/main/assets/javasccript_engine_init.js
@@ -115,4 +115,9 @@ var openConsole = function(){
var clearConsole = function(){
droid.clearConsole();
+}
+
+var shell = function(cmd, root){
+ root = root ? 1 : 0;
+ droid.shell(cmd, root);
}
\ No newline at end of file
diff --git a/app/src/main/assets/sample_alipay_scan.js b/app/src/main/assets/sample_alipay_scan.js
index 03a71740..dc84c0f9 100644
--- a/app/src/main/assets/sample_alipay_scan.js
+++ b/app/src/main/assets/sample_alipay_scan.js
@@ -1,3 +1,2 @@
-launchApp("微信");
-while(!click("发现"));
-while(!click("朋友圈"));
\ No newline at end of file
+launchApp("支付宝");
+while(!click("扫一扫"));
\ No newline at end of file
diff --git a/app/src/main/assets/sample_wechat_scan.js b/app/src/main/assets/sample_wechat_scan.js
index e69de29b..214e9208 100644
--- a/app/src/main/assets/sample_wechat_scan.js
+++ b/app/src/main/assets/sample_wechat_scan.js
@@ -0,0 +1,3 @@
+launch("com.tencent.mm");
+while(!click("发现"));
+while(!click("扫一扫"));
\ No newline at end of file
diff --git a/app/src/main/java/android/bug/WrapContentLinearLayoutManager.java b/app/src/main/java/android/bug/WrapContentLinearLayoutManager.java
index f5714fa8..ae4a9bd4 100644
--- a/app/src/main/java/android/bug/WrapContentLinearLayoutManager.java
+++ b/app/src/main/java/android/bug/WrapContentLinearLayoutManager.java
@@ -1,8 +1,35 @@
package android.bug;
+import android.content.Context;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.util.Log;
+
/**
* Created by Stardust on 2017/2/13.
+ * http://stackoverflow.com/questions/31759171/recyclerview-and-java-lang-indexoutofboundsexception-inconsistency-detected-in
*/
-public class WrapContentLinearLayoutManager {
+public class WrapContentLinearLayoutManager extends LinearLayoutManager {
+ public WrapContentLinearLayoutManager(Context context) {
+ super(context);
+ }
+
+ public WrapContentLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
+ super(context, orientation, reverseLayout);
+ }
+
+ public WrapContentLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+ try {
+ super.onLayoutChildren(recycler, state);
+ } catch (IndexOutOfBoundsException e) {
+ Log.e("LinearLayoutManager", "Android bug ", e);
+ }
+ }
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java b/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java
index f107f525..b689292f 100644
--- a/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java
@@ -1,11 +1,13 @@
package com.stardust.scriptdroid;
+import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.view.View;
+import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
@@ -29,10 +31,17 @@ public class AboutActivity extends BaseActivity {
private void setUpUI() {
setContentView(R.layout.activity_about);
+ setVersionName();
setUpToolbar();
ViewBinder.bind(this);
}
+ @SuppressLint("SetTextI18n")
+ private void setVersionName() {
+ TextView version = $(R.id.version);
+ version.setText("Version " + BuildConfig.VERSION_NAME);
+ }
+
private void setUpToolbar() {
Toolbar toolbar = $(R.id.toolbar);
setSupportActionBar(toolbar);
diff --git a/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java b/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java
index 10ce199c..f2344df9 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java
@@ -2,6 +2,7 @@ package com.stardust.scriptdroid;
import android.content.ClipData;
import android.content.ClipboardManager;
+import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
@@ -31,14 +32,16 @@ public class ErrorReportActivity extends BaseActivity {
handleIntent();
} catch (Throwable throwable) {
Log.e(TAG, "", throwable);
+ exit();
}
}
+
private void handleIntent() {
String message = getIntent().getStringExtra("message");
final String errorDetail = getIntent().getStringExtra("error");
- //showErrorMessage(message, errorDetail);
showErrorMessageByDialog(message, errorDetail);
+ //showErrorMessage(message, errorDetail);
}
private void showErrorMessageByDialog(String message, final String errorDetail) {
@@ -46,24 +49,39 @@ public class ErrorReportActivity extends BaseActivity {
.title(R.string.text_crash)
.content(R.string.crash_feedback)
.positiveText(R.string.text_exit)
- .negativeText(R.string.text_copy_debug_info)
+ .neutralText(R.string.text_copy_debug_info)
+ .negativeText(R.string.text_report_bug)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
exit();
}
})
- .onNegative(new MaterialDialog.SingleButtonCallback() {
+ .onNeutral(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
copyToClip(getDeviceMessage() + errorDetail);
exitAfter(1000);
}
})
+ .onNegative(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ startIssueReportActivity();
+ finish();
+ }
+ })
.cancelable(false)
.show();
}
+ private void startIssueReportActivity() {
+ Intent intent = new Intent(this, IssueReportActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.putExtras(getIntent());
+ startActivity(intent);
+ }
+
private void showErrorMessage(String message, String errorDetail) {
((TextView) findViewById(R.id.error)).setText(message + "\n" + errorDetail);
}
@@ -93,7 +111,8 @@ public class ErrorReportActivity extends BaseActivity {
}
private void setUpToolbar() {
- Toolbar toolbar = $(R.id.toolbar);
+ Toolbar toolbar;
+ toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.text_error_report));
setSupportActionBar(toolbar);
getSupportActionBar().setHomeButtonEnabled(false);
diff --git a/app/src/main/java/com/stardust/scriptdroid/IssueReportActivity.java b/app/src/main/java/com/stardust/scriptdroid/IssueReportActivity.java
index cbbe9ff7..dc1fd959 100644
--- a/app/src/main/java/com/stardust/scriptdroid/IssueReportActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/IssueReportActivity.java
@@ -1,12 +1,16 @@
package com.stardust.scriptdroid;
import android.os.Bundle;
-import android.support.v7.widget.Toolbar;
+import android.support.design.widget.FloatingActionButton;
+import android.view.View;
import android.widget.EditText;
+import android.widget.Toast;
import com.heinrichreimersoftware.androidissuereporter.IssueReporterActivity;
import com.heinrichreimersoftware.androidissuereporter.model.github.GithubTarget;
-import com.stardust.scriptdroid.R;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
/**
* Created by Stardust on 2017/2/13.
@@ -20,8 +24,29 @@ public class IssueReportActivity extends IssueReporterActivity {
handleIntent();
findViewById(com.heinrichreimersoftware.androidissuereporter.R.id.air_optionAnonymous).performClick();
((EditText) findViewById(R.id.air_inputTitle)).setText(R.string.text_bug_report);
- Toolbar toolbar = (Toolbar) this.findViewById(com.heinrichreimersoftware.androidissuereporter.R.id.air_toolbar);
- toolbar.setTitle(R.string.text_report_bug);
+ getSupportActionBar().setTitle(R.string.text_report_bug);
+ FloatingActionButton send = (FloatingActionButton) this.findViewById(com.heinrichreimersoftware.androidissuereporter.R.id.air_buttonSend);
+ try {
+ final Method reportIssue = IssueReporterActivity.class.getDeclaredMethod("reportIssue");
+ reportIssue.setAccessible(true);
+ send.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ reportIssue.invoke(IssueReportActivity.this);
+ Toast.makeText(IssueReportActivity.this, R.string.text_report_succeed, Toast.LENGTH_SHORT).show();
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ e.printStackTrace();
+ Toast.makeText(IssueReportActivity.this, R.string.text_report_fail, Toast.LENGTH_SHORT).show();
+ }
+ exit();
+ }
+ });
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ }
+
+
}
private void handleIntent() {
@@ -29,6 +54,10 @@ public class IssueReportActivity extends IssueReporterActivity {
((EditText) findViewById(R.id.air_inputDescription)).setText(errorDetail);
}
+ private void exit() {
+ finishAffinity();
+ }
+
@Override
protected GithubTarget getTarget() {
return new GithubTarget("hyb1996", "NoRootScriptDroid");
@@ -36,7 +65,7 @@ public class IssueReportActivity extends IssueReporterActivity {
@Override
protected String getGuestToken() {
- return "7860bbb3897c8b2bb29a49a0820dd626bd638b1c";
+ return "cd403d68a9f3a3590a14408d055c55180e7af7d3";
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/MainActivity.java
index 7ab4b806..5e763ef2 100644
--- a/app/src/main/java/com/stardust/scriptdroid/MainActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/MainActivity.java
@@ -1,7 +1,11 @@
package com.stardust.scriptdroid;
import android.Manifest;
+import android.annotation.SuppressLint;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
@@ -11,6 +15,7 @@ import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.view.View;
+import android.widget.TextView;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
@@ -21,6 +26,7 @@ import com.stardust.scriptdroid.droid.script.file.ScriptFile;
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList;
import com.stardust.scriptdroid.file.FileUtils;
+import com.stardust.scriptdroid.file.SampleFileTool;
import com.stardust.scriptdroid.tool.BackPressedHandler;
import com.stardust.scriptdroid.ui.ScriptFileOperation;
import com.stardust.scriptdroid.ui.ScriptListRecyclerView;
@@ -35,16 +41,25 @@ import java.io.File;
public class MainActivity extends BaseActivity implements FileChooserDialog.FileCallback {
+ public static final String ACTION_NOTIFY_SCRIPT_LIST_CHANGE = "ACTION_NOTIFY_SCRIPT_LIST_CHANGE";
+
private SlidingUpPanel mAddFilePanel;
private ScriptListRecyclerView mScriptListRecyclerView;
private ScriptFileList mScriptFileList;
private DrawerLayout mDrawerLayout;
+ private Receiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setUpUI();
checkPermissions();
+ registerReceivers();
+ }
+
+ private void registerReceivers() {
+ mReceiver = new Receiver();
+ registerReceiver(mReceiver, new IntentFilter(ACTION_NOTIFY_SCRIPT_LIST_CHANGE));
}
private void checkPermissions() {
@@ -84,7 +99,6 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
mScriptListRecyclerView.getAdapter().notifyItemInserted(mScriptFileList.size() - 1);
}
-
private void setUpUI() {
mDrawerLayout = (DrawerLayout) View.inflate(this, R.layout.activity_main, null);
setContentView(mDrawerLayout);
@@ -92,15 +106,22 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
mAddFilePanel = $(R.id.bottom_menu);
setUpToolbar();
+ setVersionName();
setUpScriptList();
ViewBinder.bind(this);
}
+ @SuppressLint("SetTextI18n")
+ private void setVersionName() {
+ TextView version = $(R.id.version);
+ version.setText("Version " + BuildConfig.VERSION_NAME);
+ }
+
private void setUpToolbar() {
Toolbar toolbar = $(R.id.toolbar);
setSupportActionBar(toolbar);
- toolbar.setTitle(R.string.app_name);
+ toolbar.setTitle(R.string._app_name);
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.text_drawer_open,
R.string.text_drawer_close);
@@ -114,7 +135,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
mScriptListRecyclerView.setScriptFileList(mScriptFileList);
}
- @ViewBinding.Click(R.id.fab)
+ @ViewBinding.Click(R.id.add)
private void showAddFilePanel() {
mAddFilePanel.show();
}
@@ -144,6 +165,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
@ViewBinding.Click(R.id.import_from_file)
private void showFileChooser() {
new FileChooserDialog.Builder(this)
+ .initialPath(ScriptFile.DEFAULT_FOLDER)
.extensionsFilter(".js", ".txt")
.show();
}
@@ -162,7 +184,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- NonUiInitializer.getInstance().copySampleScriptFileIfNeeded();
+ SampleFileTool.getInstance().copySampleScriptFileIfNeeded();
mScriptListRecyclerView.getAdapter().notifyDataSetChanged();
}
}
@@ -174,8 +196,31 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
private BackPressedHandler mBackPressedHandler = new BackPressedHandler.DoublePressExit(this);
+
@Override
public void onBackPressed() {
- mBackPressedHandler.onBackPressed();
+ if (mScriptListRecyclerView.getScriptFileOperationPopupMenu().isShowing()) {
+ mScriptListRecyclerView.getScriptFileOperationPopupMenu().dismiss();
+ } else if (mAddFilePanel.isShowing()) {
+ mAddFilePanel.dismiss();
+ } else {
+ mBackPressedHandler.onBackPressed();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(mReceiver);
+ }
+
+ private class Receiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(ACTION_NOTIFY_SCRIPT_LIST_CHANGE)) {
+ mScriptListRecyclerView.getAdapter().notifyDataSetChanged();
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/stardust/scriptdroid/Pref.java b/app/src/main/java/com/stardust/scriptdroid/Pref.java
index db9b07e4..36f52802 100644
--- a/app/src/main/java/com/stardust/scriptdroid/Pref.java
+++ b/app/src/main/java/com/stardust/scriptdroid/Pref.java
@@ -10,10 +10,8 @@ import android.preference.PreferenceManager;
public class Pref {
private static final SharedPreferences DISPOSABLE_BOOLEAN = App.getApp().getSharedPreferences("DISPOSABLE_BOOLEAN", Context.MODE_PRIVATE);
-
public static final String SAMPLE_SCRIPTS_COPIED = "SAMPLE_SCRIPTS_COPIED";
-
public static SharedPreferences def() {
return PreferenceManager.getDefaultSharedPreferences(App.getApp());
}
@@ -33,4 +31,8 @@ public class Pref {
public static boolean isFirstGoToAccessibilitySetting() {
return getDisposableBoolean("isFirstGoToAccessibilitySetting", true);
}
+
+ public static int oldVersion(){
+ return 0;
+ }
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java b/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java
index 5e9c06c0..9ed0a72a 100644
--- a/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java
@@ -9,6 +9,7 @@ import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Toast;
+import com.stardust.scriptdroid.file.SampleFileTool;
import com.stardust.util.MapEntries;
import java.util.Map;
@@ -65,9 +66,10 @@ public class SettingsActivity extends BaseActivity {
.entry(getString(R.string.text_re_import_samples), new Runnable() {
@Override
public void run() {
- int failCount = NonUiInitializer.getInstance().copySampleScriptFile();
+ int failCount = SampleFileTool.getInstance().copySampleScriptFile();
if (failCount <= 0) {
Toast.makeText(getActivity(), R.string.text_re_import_succeed, Toast.LENGTH_SHORT).show();
+ notifyScriptListChanged();
} else
Toast.makeText(getActivity(), R.string.text_fail, Toast.LENGTH_SHORT).show();
}
@@ -87,6 +89,10 @@ public class SettingsActivity extends BaseActivity {
.map();
}
+ private void notifyScriptListChanged() {
+ getActivity().sendBroadcast(new Intent(MainActivity.ACTION_NOTIFY_SCRIPT_LIST_CHANGE));
+ }
+
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Runnable action = ACTION_MAP.get(preference.getTitle().toString());
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java b/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
index 9ae91366..396de90e 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
@@ -41,7 +41,7 @@ public class Droid {
public void onRunFinished(Object result, Exception e) {
if (e != null) {
RUNTIME.toast(App.getApp().getString(R.string.text_error) + ": " + e.getMessage());
- Timber.e(App.getApp().getString(R.string.text_error), e);
+ Timber.e(e, App.getApp().getString(R.string.text_error));
}
}
};
@@ -55,12 +55,18 @@ public class Droid {
}
public void runScriptFile(File file) {
- checkFile(file);
- runScript(FileUtils.readString(file));
+ runScriptFile(file, null);
}
public void runScriptFile(File file, OnRunFinishedListener listener) {
- checkFile(file);
+ Timber.v("开始运行脚本文件: " + file);
+ listener = listener == null ? DEFAULT_LISTENER : listener;
+ try {
+ checkFile(file);
+ } catch (Exception e) {
+ listener.onRunFinished(null, e);
+ return;
+ }
runScript(FileUtils.readString(file), listener, RunningConfig.getDefault());
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java
index 86ffdb87..70e4c1f2 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java
@@ -19,6 +19,7 @@ import com.stardust.scriptdroid.droid.runtime.action.ActionFactory;
import com.stardust.scriptdroid.droid.runtime.action.ActionPerformService;
import com.stardust.scriptdroid.droid.runtime.action.ActionTarget;
import com.stardust.scriptdroid.droid.runtime.api.IDroidRuntime;
+import com.stardust.scriptdroid.tool.Shell;
import java.util.List;
@@ -160,7 +161,7 @@ public class DroidRuntime implements IDroidRuntime {
App.getApp().startActivity(new Intent(App.getApp(), ConsoleActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
- public void clearConsole(){
+ public void clearConsole() {
Console.clear();
}
@@ -200,6 +201,10 @@ public class DroidRuntime implements IDroidRuntime {
}
}
+ public void shell(String cmd, int root) {
+ Shell.execCommand(cmd, root != 0);
+ }
+
@Override
public boolean isStopped() {
return Thread.currentThread().isInterrupted();
diff --git a/app/src/main/java/com/stardust/scriptdroid/file/SampleFileTool.java b/app/src/main/java/com/stardust/scriptdroid/file/SampleFileTool.java
index 3d7214e6..c6ff9157 100644
--- a/app/src/main/java/com/stardust/scriptdroid/file/SampleFileTool.java
+++ b/app/src/main/java/com/stardust/scriptdroid/file/SampleFileTool.java
@@ -10,6 +10,7 @@ import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList;
import com.stardust.util.MapEntries;
+import java.util.LinkedHashMap;
import java.util.Map;
/**
@@ -17,13 +18,13 @@ import java.util.Map;
*/
public class SampleFileTool {
- private static final Map SAMPLES = new MapEntries()
- .entry("sample_alipay_scan.js", R.string.text_sample_alipay_scan)
- .entry("sample_wechat_scan.js", R.string.text_sample_wechat_scan)
+ private static final Map SAMPLES = new MapEntries<>(new LinkedHashMap())
.entry("sample_open_running_services.js", R.string.text_sample_open_running_services)
.entry("sample_qq_hongbao.js", R.string.text_sample_qq_hongbao)
.entry("sample_simple_calculator.js", R.string.text_sample_simple_calculator)
.entry("sample_force_qq_chat.js", R.string.text_sample_for_qq_chat)
+ .entry("sample_wechat_scan.js", R.string.text_sample_wechat_scan)
+ .entry("sample_alipay_scan.js", R.string.text_sample_alipay_scan)
.map();
private static SampleFileTool instance = new SampleFileTool();
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/AssistClipListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/AssistClipListRecyclerView.java
index 3bd7a963..d353d9b4 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/AssistClipListRecyclerView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/AssistClipListRecyclerView.java
@@ -1,8 +1,8 @@
package com.stardust.scriptdroid.ui;
+import android.bug.WrapContentLinearLayoutManager;
import android.content.Context;
import android.support.annotation.Nullable;
-import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -44,7 +44,7 @@ public class AssistClipListRecyclerView extends ExpandableRecyclerView {
}
private void init() {
- setLayoutManager(new LinearLayoutManager(getContext()));
+ setLayoutManager(new WrapContentLinearLayoutManager(getContext()));
setAdapter(new Adapter());
setOnChildClickListener(new OnChildClickListener() {
@Override
@@ -58,12 +58,14 @@ public class AssistClipListRecyclerView extends ExpandableRecyclerView {
mBoundsAssistClipList.setOnClipChangedListener(new BoundsAssistClipList.OnClipChangedListener() {
@Override
public void onClipRemove(int position) {
- getAdapter().notifyItemRemoved(position);
+ if (isExpanded())
+ getAdapter().notifyItemRemoved(position);
}
@Override
public void onClipInsert(int position) {
- getAdapter().notifyItemInserted(position);
+ if (isExpanded())
+ getAdapter().notifyItemInserted(position);
}
@Override
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/FunctionListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/FunctionListRecyclerView.java
index d8342aee..d205dadd 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/FunctionListRecyclerView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/FunctionListRecyclerView.java
@@ -1,8 +1,8 @@
package com.stardust.scriptdroid.ui;
+import android.bug.WrapContentLinearLayoutManager;
import android.content.Context;
import android.support.annotation.Nullable;
-import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -68,7 +68,7 @@ public class FunctionListRecyclerView extends ExpandableRecyclerView {
}
private void init() {
- setLayoutManager(new LinearLayoutManager(getContext()));
+ setLayoutManager(new WrapContentLinearLayoutManager(getContext()));
setAdapter(new Adapter());
setFunctionList(FUNCTION_LIST);
setOnChildClickListener(new OnChildClickListener() {
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/ScriptFileOperationPopupMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/ScriptFileOperationPopupMenu.java
index 250acca8..5a180705 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/ScriptFileOperationPopupMenu.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/ScriptFileOperationPopupMenu.java
@@ -1,7 +1,7 @@
package com.stardust.scriptdroid.ui;
import android.content.Context;
-import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -60,7 +60,7 @@ public class ScriptFileOperationPopupMenu extends PopupWindow {
private void init() {
setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
- setBackgroundDrawable(new BitmapDrawable());
+ setBackgroundDrawable(new ColorDrawable());
setOutsideTouchable(true);
setAnimationStyle(-1);
initContentView();
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java
index eadd7ca2..1be60a6e 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java
@@ -77,6 +77,10 @@ public class ScriptListRecyclerView extends RecyclerView {
init();
}
+ public ScriptFileOperationPopupMenu getScriptFileOperationPopupMenu() {
+ return mScriptFileOperationPopupMenu;
+ }
+
private void init() {
setAdapter(new Adapter());
setLayoutManager(new LinearLayoutManager(getContext()));
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java
index 63792843..59a7ae86 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java
@@ -54,6 +54,7 @@ public class SlideMenuFragment extends Fragment {
syncSwitchState();
}
+
private void syncSwitchState() {
mAutoOperateServiceSwitch.postDelayed(new Runnable() {
@Override
diff --git a/app/src/main/java/com/stardust/view/accessibility/AccessibilityServiceUtils.java b/app/src/main/java/com/stardust/view/accessibility/AccessibilityServiceUtils.java
index 7252d296..f382cbb3 100644
--- a/app/src/main/java/com/stardust/view/accessibility/AccessibilityServiceUtils.java
+++ b/app/src/main/java/com/stardust/view/accessibility/AccessibilityServiceUtils.java
@@ -18,7 +18,7 @@ public class AccessibilityServiceUtils {
public static void goToAccessibilitySetting(Context context) {
if (Pref.isFirstGoToAccessibilitySetting()) {
- Toast.makeText(context, context.getString(R.string.text_please_choose) + context.getString(R.string.app_name), Toast.LENGTH_LONG).show();
+ Toast.makeText(context, context.getString(R.string.text_please_choose) + context.getString(R.string._app_name), Toast.LENGTH_LONG).show();
}
context.startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
}
diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml
index 00dc7b9e..14fd0263 100644
--- a/app/src/main/res/layout/activity_about.xml
+++ b/app/src/main/res/layout/activity_about.xml
@@ -50,13 +50,13 @@
android:src="@drawable/ic_android_eat_js"/>
diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml
index 3241a202..1c2f6e88 100644
--- a/app/src/main/res/layout/activity_edit.xml
+++ b/app/src/main/res/layout/activity_edit.xml
@@ -18,7 +18,7 @@
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
- android:title="@string/app_name"
+ android:title="@string/_app_name"
app:popupTheme="@style/AppTheme.PopupOverlay">
+ android:title="@string/_app_name"
+ app:popupTheme="@style/AppTheme.PopupOverlay">
+
+
+
+
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
index f187b807..f7053878 100644
--- a/app/src/main/res/layout/content_main.xml
+++ b/app/src/main/res/layout/content_main.xml
@@ -16,14 +16,4 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
-
-
-
diff --git a/app/src/main/res/layout/drawer.xml b/app/src/main/res/layout/drawer.xml
index acaf3de0..dac9a957 100644
--- a/app/src/main/res/layout/drawer.xml
+++ b/app/src/main/res/layout/drawer.xml
@@ -28,7 +28,6 @@
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:gravity="center"
- android:text="@string/version"
android:textColor="@android:color/white"
android:textSize="14sp"/>
@@ -40,7 +39,7 @@
android:layout_above="@id/version"
android:layout_marginLeft="8dp"
android:gravity="center"
- android:text="@string/app_name"
+ android:text="@string/_app_name"
android:textColor="@android:color/white"
android:textSize="28sp"/>
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
index db543162..24b89e51 100644
--- 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
@@ -12,7 +12,7 @@
android:layout_height="20dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
- android:contentDescription="@string/app_name"/>
+ android:contentDescription="@string/_app_name"/>
@@ -62,7 +62,7 @@
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center"
- android:contentDescription="@string/app_name"
+ android:contentDescription="@string/_app_name"
android:src="@drawable/ic_edit_gray_48dp"/>
@@ -80,7 +80,7 @@
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center"
- android:contentDescription="@string/app_name"
+ android:contentDescription="@string/_app_name"
android:src="@drawable/ic_navigation_show_more_vertical_512"/>
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index d096a821..158eefea 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -2,27 +2,5 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.stardust.scriptdroid.MainActivity">
-
-
-
-
-
-
diff --git a/app/src/main/res/raw/document.md b/app/src/main/res/raw/document.md
index b69a5c1b..bfc151c8 100644
--- a/app/src/main/res/raw/document.md
+++ b/app/src/main/res/raw/document.md
@@ -24,6 +24,7 @@
* `launchApp(appName)` 运存应用名称为appName的应用。例如launchApp("QQ")。不同应用名称可能相同,这时只运行其中某一个应用。
* `notStopped` 若当前脚本处于运行状态时返回`true`, 否则返回`false`。对于某些循环, 例如`while(true)`,请用`while(notStopped())`代替,以免死循环造成的脚本无法正常停止。
* `isStoppd` 若当前脚本处于停止状态时返回`true`, 否则返回`false`。
+* `shell(cmd, root=false)` 执行shell命令cmd, 其中参数root表示是否以root权限执行,默认为false。例如`shell("input keyevent 26", true); //锁屏`。
###四、全局变量
* `context` ApplicationContext,参见安卓[android.content.Context](https://developer.android.com/reference/android/content/Context.html)
> 这里的context由于是ApplicationContext,是不可见的,不能用于dialog和其他UI相关。如果要显示弹窗或者视图,请启动UI模式(代码的第一行为`"ui";`既可)并使用activity代替。
diff --git a/app/src/main/res/raw/licenses.xml b/app/src/main/res/raw/licenses.xml
index 6538ebf1..fe272428 100644
--- a/app/src/main/res/raw/licenses.xml
+++ b/app/src/main/res/raw/licenses.xml
@@ -36,5 +36,16 @@
https://github.com/fython/AlipayZeroSdk
Apache Software License 2.0
-
+
+ Console
+ Copyright 2015 Josef Raska
+ https://github.com/jraska/Console
+ Apache Software License 2.0
+
+
+ android-issue-reporter
+
+ https://github.com/HeinrichReimer/android-issue-reporter
+ Apache Software License 2.0
+
\ 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
deleted file mode 100644
index 55344e51..00000000
--- a/app/src/main/res/values-en/strings.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 09ff8494..9687e2a5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,6 +1,5 @@
- 免Root脚本精灵
- Version 1.17.0212
+ 免Root脚本精灵
设置
关闭服务
使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。
@@ -38,7 +37,7 @@
关于
开放源代码许可
不再提示
- 示例:打开朋友圈
+ 支付宝扫一扫
示例:打开正在运行的服务(安卓6.0+)
示例:简单计算器
Copyright©2016 All right reserves.
@@ -87,12 +86,17 @@
\"点击区域辅助服务\"是在要点击的区域不是文本时使用的,参见\"语法与API\"。\"点击区域辅助服务\"只有在\"自动操作服务\"开启时才有效。
请选择
崩溃了o(≧口≦)o
- 点击\"退出\"退出程序(ಥ _ ಥ)或者复制调试信息反馈给开发者(≧∇≦)ノ
+ 点击\"退出\"退出程序(ಥ _ ಥ)或者提交错误报告或者复制调试信息反馈给开发者(≧∇≦)ノ
无法在后台显示弹框,脚本已停止运行
示例:QQ强制聊天
重新导入示例脚本文件
- 导入成功,重新打开应用生效
+ 导入成功
失败
清空
控制台
+ 微信扫一扫
+ 提交错误报告
+ Bug Report
+ 提交失败
+ 提交成功
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index e44f5bdf..2f7f6f46 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,6 +8,15 @@
- @color/colorAccent
+
+