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 + +