diff --git a/app/build.gradle b/app/build.gradle index d39dfb15..f96f9718 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 19 targetSdkVersion 23 - versionCode 123 - versionName "2.0.9d Alpha" + versionCode 125 + versionName "2.0.9 Beta" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { @@ -18,6 +18,11 @@ android { } } buildTypes { + debug { + shrinkResources false + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } release { shrinkResources false minifyEnabled false @@ -42,17 +47,7 @@ android { output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } - packagingOptions { - pickFirst 'org/mozilla/javascript/tools/debugger/build.xml' - pickFirst 'org/mozilla/javascript/tools/debugger/test.js' - pickFirst 'org/mozilla/javascript/tools/idswitch/README' - pickFirst 'org/mozilla/javascript/NativeString.java.orig' - pickFirst 'org/mozilla/javascript/Node.java.orig' - pickFirst 'org/mozilla/javascript/resources/Messages_fr.properties' - pickFirst 'org/mozilla/javascript/resources/Messages.properties' - pickFirst 'org/mozilla/javascript/*.java.orig' - pickFirst 'org/mozilla/javascript/tools/resources/*.properties' - } + dexcount { format = "list" includeClasses = true diff --git a/app/libs/920-app-debug.aar b/app/libs/920-app-debug.aar index 00552524..8e62ad84 100644 Binary files a/app/libs/920-app-debug.aar and b/app/libs/920-app-debug.aar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8cec44d0..60c920d9 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -93,19 +93,19 @@ } # Google Play Services library - -keep class * extends java.util.ListResourceBundle { - protected Object[ ][ ] getContents(); +-keep class * extends java.util.ListResourceBundle { + protected Object[ ][ ] getContents(); } - -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { - public static final *** NULL; - } +-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { + public static final *** NULL; +} - -keepnames @com.google.android.gms.common.annotation.KeepName class * - -keepclassmembernames class * { +-keepnames @com.google.android.gms.common.annotation.KeepName class * +-keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; - } +} - -keepnames class * implements android.os.Parcelable { - public static final ** CREATOR; - } \ No newline at end of file +-keepnames class * implements android.os.Parcelable { + public static final ** CREATOR; +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d922f1c7..7ac2b7a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,7 +69,9 @@ android:resource="@xml/provider_paths"/> - + @@ -158,7 +160,7 @@ @@ -198,7 +200,7 @@ diff --git a/app/src/main/assets/js/autojs_init.js b/app/src/main/assets/js/autojs_init.js index cd501fe6..709faded 100644 --- a/app/src/main/assets/js/autojs_init.js +++ b/app/src/main/assets/js/autojs_init.js @@ -5,11 +5,11 @@ var dialogs = {}; dialogs.rawInput = function(title, prefill){ prefill = prefill || ""; - return __runtime__.dialogs.rawInput(title, prefill); + return String(__runtime__.dialogs.rawInput(title, prefill)); }; dialogs.input = function(title, prefill){ - return eval(dialogs.rawInput(title, prefill) + ""); + return eval(dialogs.rawInput(title, prefill)); } dialogs.prompt = dialogs.rawInput; @@ -25,6 +25,9 @@ dialogs.confirm = function(title, prefill){ } dialogs.select = function(title, items){ + if(items instanceof Array){ + return __runtime__.dialogs.select(title, items); + } return __runtime__.dialogs.select(title, [].slice.call(arguments, 1)); } diff --git a/app/src/main/assets/sample/JavaScript/HelloWorld.js b/app/src/main/assets/sample/JavaScript/HelloWorld.js index d598500b..c2f03276 100644 --- a/app/src/main/assets/sample/JavaScript/HelloWorld.js +++ b/app/src/main/assets/sample/JavaScript/HelloWorld.js @@ -1,3 +1,3 @@ log("Hello world!!!"); toast("Hello, AutoJs!"); -openConsole(); \ No newline at end of file +console.show(); \ No newline at end of file diff --git a/app/src/main/assets/sample/对话框/简单计算器.js b/app/src/main/assets/sample/对话框/简单计算器.js index 505322df..c5557263 100644 --- a/app/src/main/assets/sample/对话框/简单计算器.js +++ b/app/src/main/assets/sample/对话框/简单计算器.js @@ -1,5 +1,5 @@ var num1 = dialogs.input("请输入第一个数字"); -var op = dialogs.singleChoice("请选择运算", 0, "加", "减", "乘", "除", "幂"); +var op = dialogs.singleChoice("请选择运算", ["加", "减", "乘", "除", "幂"]); var num2 = dialogs.input("请输入第二个数字"); var result = 0; switch(op){ diff --git a/app/src/main/assets/sample/控制台/终端模拟器.js b/app/src/main/assets/sample/控制台/终端模拟器.js index 951fc3a2..2adebcd8 100644 --- a/app/src/main/assets/sample/控制台/终端模拟器.js +++ b/app/src/main/assets/sample/控制台/终端模拟器.js @@ -1,11 +1,10 @@ var sh = new Shell(); sh.setCallback({ - onNewLine: function(str){ - console.log(str); + onOutput: function(str){ + print(str); } }) console.show(); -console.info("请输入要运行命令:"); do { var cmd = console.rawInput(); sh.exec(cmd); diff --git a/app/src/main/java/com/stardust/app/Fragment.java b/app/src/main/java/com/stardust/app/Fragment.java index 2938f5e1..265ad096 100644 --- a/app/src/main/java/com/stardust/app/Fragment.java +++ b/app/src/main/java/com/stardust/app/Fragment.java @@ -45,5 +45,4 @@ public abstract class Fragment extends android.support.v4.app.Fragment { public abstract View createView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState); - } diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java b/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java index 31e919a5..4409f9cf 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java @@ -26,7 +26,7 @@ public class BlockedMaterialDialog extends MaterialDialog { @Override public void show() { if (!isActivityContext(getContext())) { - getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE); } super.show(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java index ff15d885..1d5aeb07 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuAdapter.java @@ -7,6 +7,8 @@ import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.OvalShape; import android.os.Build; import android.support.annotation.ColorInt; import android.support.annotation.DrawableRes; @@ -75,9 +77,9 @@ public class HoverMenuAdapter implements io.mattcarroll.hover.HoverMenuAdapter { private View getTabViewInner(int index) { String menuItemId = mTabIds.get(index); if (ID_MAIN.equals(menuItemId)) { - return createTabView(R.drawable.ic_android_eat_js_100); + return createTabView(R.drawable.ic_android_eat_js_64); } else if (ID_RECORD.equals(menuItemId)) { - return createTabView(R.drawable.ic_video_record); + return createTabView(R.drawable.ic_ali_record); } else if (ID_SCRIPT_LIST.equals(menuItemId)) { return createTabView(R.drawable.ic_menu); } else { @@ -125,7 +127,7 @@ public class HoverMenuAdapter implements io.mattcarroll.hover.HoverMenuAdapter { Resources resources = mContext.getResources(); int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, resources.getDisplayMetrics()); - DemoTabView view = new DemoTabView(mContext, resources.getDrawable(R.drawable.tab_background), resources.getDrawable(tabBitmapRes)); + DemoTabView view = new DemoTabView(mContext, getCircleDrawable(), resources.getDrawable(tabBitmapRes)); view.setTabBackgroundColor(backgroundColor); view.setTabForegroundColor(iconColor); view.setPadding(padding, padding, padding, padding); @@ -135,6 +137,12 @@ public class HoverMenuAdapter implements io.mattcarroll.hover.HoverMenuAdapter { return view; } + private Drawable getCircleDrawable() { + ShapeDrawable oval = new ShapeDrawable(new OvalShape()); + return oval; + } + + public class DemoTabView extends View { private int mBackgroundColor; @@ -183,13 +191,8 @@ public class HoverMenuAdapter implements io.mattcarroll.hover.HoverMenuAdapter { @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - - // Make circle as large as View minus padding. mCircleDrawable.setBounds(getPaddingLeft(), getPaddingTop(), w - getPaddingRight(), h - getPaddingBottom()); - - // Re-size the icon as necessary. updateIconBounds(); - invalidate(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java index ad9ea2e6..39821022 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java @@ -85,7 +85,6 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe } if (mConsole.submitInput(input)) { mEditText.setText(""); - mEditText.requestFocus(); } } @@ -93,6 +92,17 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe mEditText = (EditText) findViewById(R.id.input); mEditText.setFocusableInTouchMode(true); mInputContainer = (LinearLayout) findViewById(R.id.input_container); + OnClickListener listener = new OnClickListener() { + @Override + public void onClick(View v) { + if (mWindow != null) { + mWindow.requestWindowFocus(); + mEditText.requestFocus(); + } + } + }; + mEditText.setOnClickListener(listener); + mInputContainer.setOnClickListener(listener); } public void setConsole(StardustConsole console) { @@ -103,7 +113,6 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe @Override public void onNewLog(StardustConsole.Log log) { log(log.level, log.content); - log(log.level, "\n"); } private void log(int level, CharSequence log) { @@ -114,6 +123,7 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe public void run() { mTextView.append(spannable); mContentContainer.fullScroll(View.FOCUS_DOWN); + mEditText.requestFocus(); } }); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java index 2ffce35d..c79c2f30 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java @@ -50,6 +50,12 @@ public class JraskaConsole extends AbstractConsole { Console.writeLine(getLevelSpannable(level, charSequence)); } + @Override + public void write(int level, CharSequence data) { + Console.write(getLevelSpannable(level, getTag(level))); + Console.write(getLevelSpannable(level, data)); + } + private CharSequence getTag(int level) { return TextUtils.join("", DATE_FORMAT.format(new Date()), TAGS.get(level), ": "); } @@ -80,4 +86,6 @@ public class JraskaConsole extends AbstractConsole { public void setTitle(CharSequence title) { } + + } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java index 4e571950..43b3163b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java @@ -13,7 +13,6 @@ import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.autojs.api.VolatileBox; import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger; import com.stardust.util.UiHandler; @@ -79,7 +78,7 @@ public class StardustConsole extends AbstractConsole { @Override public void println(int level, CharSequence charSequence) { - Log log = new Log(level, charSequence); + Log log = new Log(level, charSequence + "\n"); mLogs.add(log); GLOBAL_CONSOLE.println(level, charSequence); if (mLogListener != null) { @@ -88,6 +87,17 @@ public class StardustConsole extends AbstractConsole { } + @Override + public void write(int level, CharSequence charSequence) { + Log log = new Log(level, charSequence); + mLogs.add(log); + GLOBAL_CONSOLE.print(level, charSequence); + if (mLogListener != null) { + mLogListener.onNewLog(log); + } + } + + @Override public void clear() { mLogs.clear(); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/error/ErrorReportActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/error/ErrorReportActivity.java index b301b2fb..ffb7de6c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/error/ErrorReportActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/error/ErrorReportActivity.java @@ -5,9 +5,11 @@ import android.content.ClipboardManager; import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v7.widget.Toolbar; import android.util.Log; +import android.util.SparseIntArray; import android.widget.TextView; import android.widget.Toast; @@ -27,16 +29,40 @@ import java.util.TimerTask; public class ErrorReportActivity extends BaseActivity { private static final String TAG = "ErrorReportActivity"; + private static final SparseIntArray CRASH_COUNT = new SparseIntArray(); + private static final String KEY_CRASH_COUNT = "Eating... you are my halo..."; + + static { + CRASH_COUNT.put(2, R.string.text_again); + CRASH_COUNT.put(3, R.string.text_again_and_again); + CRASH_COUNT.put(4, R.string.text_again_and_again_again); + CRASH_COUNT.put(5, R.string.text_again_and_again_again_again); + } + + private String mTitle; protected void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); + mTitle = getCrashCountText() + getString(R.string.text_crash); setUpUI(); handleIntent(); } catch (Throwable throwable) { Log.e(TAG, "", throwable); exit(); } + + } + + private String getCrashCountText() { + int i = PreferenceManager.getDefaultSharedPreferences(this).getInt(KEY_CRASH_COUNT, 0); + i++; + PreferenceManager.getDefaultSharedPreferences(this).edit().putInt(KEY_CRASH_COUNT, i).apply(); + if (i < 2) + return ""; + if (i > 5) + i = 5; + return getString(CRASH_COUNT.get(i)); } @@ -49,7 +75,7 @@ public class ErrorReportActivity extends BaseActivity { private void showErrorMessageByDialog(String message, final String errorDetail) { new ThemeColorMaterialDialogBuilder(this) - .title(R.string.text_crash) + .title(mTitle) .content(R.string.crash_feedback) .positiveText(R.string.text_exit) .neutralText(R.string.text_copy_debug_info) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/AppbarWithTabFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/AppbarWithTabFragment.java deleted file mode 100644 index 21079b82..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/AppbarWithTabFragment.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.stardust.scriptdroid.ui.main; - -import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; - -import com.stardust.scriptdroid.R; - -/** - * Created by Stardust on 2017/3/23. - */ - -public abstract class AppbarWithTabFragment extends BottomNavigationFragment { - - - @Nullable - @Override - public View createView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_app_bar_tab, container, false); - FrameLayout contentContainer = (FrameLayout) view.findViewById(R.id.content); - contentContainer.addView(createContentView(inflater, contentContainer)); - return view; - } - - @CallSuper - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - } - - protected abstract View createContentView(LayoutInflater inflater, @Nullable ViewGroup container); -} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/BottomNavigationFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/BottomNavigationFragment.java deleted file mode 100644 index d76d6426..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/BottomNavigationFragment.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.stardust.scriptdroid.ui.main; - - -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; - -import com.ashokvarma.bottomnavigation.BottomNavigationBar; -import com.ashokvarma.bottomnavigation.BottomNavigationItem; -import com.stardust.app.Fragment; -import com.stardust.theme.ThemeColor; -import com.stardust.theme.ThemeColorManager; -import com.stardust.theme.ThemeColorMutable; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/3/23. - */ - -public abstract class BottomNavigationFragment extends Fragment { - - public static class Builder implements BottomNavigationBar.OnTabSelectedListener, ThemeColorMutable { - private int mFragmentId; - private BottomNavigationBar mBottomNavigationBar; - private FragmentManager mFragmentManager; - private List mFragments = new ArrayList<>(); - - public Builder(int fragmentId, BottomNavigationBar bottomNavigationBar, FragmentManager fragmentManager) { - mFragmentId = fragmentId; - mBottomNavigationBar = bottomNavigationBar; - mFragmentManager = fragmentManager; - mBottomNavigationBar.setTabSelectedListener(this); - ThemeColorManager.add(this); - } - - public Builder add(BottomNavigationFragment fragment) { - mFragments.add(fragment); - mBottomNavigationBar.addItem(new BottomNavigationItem(fragment.getIconResId(), fragment.getTitle())); - return this; - } - - public void build() { - mBottomNavigationBar.setFirstSelectedPosition(0); - mBottomNavigationBar.initialise(); - mFragmentManager.beginTransaction().replace(mFragmentId, mFragments.get(0)).commit(); - } - - - @Override - public void onTabSelected(int position) { - BottomNavigationFragment fragment = mFragments.get(position); - mFragmentManager.beginTransaction().replace(mFragmentId, fragment).commit(); - } - - @Override - public void onTabUnselected(int position) { - - } - - @Override - public void onTabReselected(int position) { - - } - - @Override - public void setThemeColor(ThemeColor themeColor) { - mBottomNavigationBar.setActiveColor("#" + Integer.toHexString(themeColor.colorPrimary).substring(2)); - } - } - - protected abstract String getTitle(); - - protected abstract int getIconResId(); - - -} 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 012b1a8c..1daa915e 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 @@ -27,8 +27,10 @@ import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.app.FragmentPagerAdapterBuilder; import com.stardust.app.NotAskAgainDialog; import com.stardust.app.OnActivityResultDelegate; +import com.stardust.enhancedfloaty.FloatyService; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger; import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.StorageScriptProvider; @@ -80,6 +82,7 @@ public class MainActivity extends BaseActivity { private DrawableSaver mDrawerHeaderBackgroundSaver, mAppbarBackgroundSaver; private VersionGuard mVersionGuard; private Intent mIntentToHandle; + private ViewPager mViewPager; @Override protected void onCreate(Bundle savedInstanceState) { @@ -164,15 +167,14 @@ public class MainActivity extends BaseActivity { private void setUpTabViewPager() { TabLayout tabLayout = $(R.id.tab); - ViewPager viewPager = $(R.id.viewpager); + mViewPager = $(R.id.viewpager); mPagerAdapter = new FragmentPagerAdapterBuilder(this) .add(new MyScriptListFragment(), R.string.text_my_script) .add(new SampleScriptListFragment(), R.string.text_sample_script) .add(new TaskManagerFragment(), R.string.text_task_manage) .build(); - viewPager.setAdapter(mPagerAdapter); - viewPager.setOffscreenPageLimit(mPagerAdapter.getCount()); - tabLayout.setupWithViewPager(viewPager); + mViewPager.setAdapter(mPagerAdapter); + tabLayout.setupWithViewPager(mViewPager); mPagerAdapter.setOnFragmentInstantiateListener(new FragmentPagerAdapterBuilder.OnFragmentInstantiateListener() { @Override public void OnInstantiate(Fragment fragment) { @@ -235,8 +237,11 @@ public class MainActivity extends BaseActivity { } @ViewBinding.Click(R.id.exit) - public void finish() { - super.finish(); + public void exitCompletely() { + FloatingWindowManger.hideHoverMenu(); + stopService(new Intent(this, FloatyService.class)); + AutoJs.getInstance().getScriptEngineService().stopAll(); + finish(); } @ViewBinding.Click(R.id.drawer_header_img) @@ -265,22 +270,38 @@ public class MainActivity extends BaseActivity { handleRecordedScript(intent.getStringExtra(ARGUMENT_SCRIPT)); break; case ACTION_IMPORT_SCRIPT: - getMyScriptListFragment().importFile(intent.getStringExtra(ARGUMENT_PATH)); + handleImportScriptFile(intent); break; case ACTION_IMPORT_SAMPLE: - importSample((Sample) intent.getSerializableExtra(ARGUMENT_SAMPLE)); + handleImportSample(intent); 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 handleImportScriptFile(Intent intent) { + mViewPager.setCurrentItem(0, true); + MyScriptListFragment fragment = getMyScriptListFragment(); + if (fragment == null) { + mIntentToHandle = intent; + } else { + fragment.importFile(intent.getStringExtra(ARGUMENT_PATH)); } + } + private void handleImportSample(Intent intent) { + mViewPager.setCurrentItem(0, true); + MyScriptListFragment fragment = getMyScriptListFragment(); + if (fragment == null) { + mIntentToHandle = intent; + } else { + Sample sample = (Sample) intent.getSerializableExtra(ARGUMENT_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) { 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 1da82663..b99f9532 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 @@ -21,26 +21,25 @@ import com.stardust.scriptdroid.ui.main.MainActivity; public class SampleScriptListFragment extends Fragment { - private SampleScriptListRecyclerView mSampleScriptListRecyclerView; - @Nullable @Override public View createView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_sample_script_list, container, false); } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mSampleScriptListRecyclerView = $(R.id.script_list); - mSampleScriptListRecyclerView.setSamples(SampleFileManager.getInstance().getSamplesFromAssets(getContext().getAssets(), "sample")); - mSampleScriptListRecyclerView.setOnItemLongClickListener(new SampleScriptListRecyclerView.OnItemLongClickListener() { + SampleScriptListRecyclerView sampleScriptListRecyclerView = $(R.id.script_list); + sampleScriptListRecyclerView.setSamples(SampleFileManager.getInstance().getSamplesFromAssets(getContext().getAssets(), "sample")); + sampleScriptListRecyclerView.setOnItemLongClickListener(new SampleScriptListRecyclerView.OnItemLongClickListener() { @Override public void onItemLongClick(Sample sample) { showMenuDialog(sample); } }); - mSampleScriptListRecyclerView.setOnItemClickListener(new SampleScriptListRecyclerView.OnItemClickListener() { + sampleScriptListRecyclerView.setOnItemClickListener(new SampleScriptListRecyclerView.OnItemClickListener() { @Override public void onItemClick(Sample sample) { viewSample(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 ee02bb5e..830fd813 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 @@ -61,6 +61,7 @@ public class MyScriptListFragment extends Fragment { return inflater.inflate(R.layout.fragment_my_script_list, container, false); } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); 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 5980825b..0ac69bd9 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 @@ -84,6 +84,8 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { return; } ScriptFile file = mAdapter.getScriptFileAt(position); + if (file == null) + return; if (file.isDirectory()) { setCurrentDirectory(file, true); } else if (mOnItemClickListener != null) { @@ -96,7 +98,10 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { public boolean onLongClick(View v) { if (mOnItemLongClickListener != null) { int position = getChildViewHolder(v).getAdapterPosition(); - mOnItemLongClickListener.onLongClick(mAdapter.getScriptFileAt(position), position); + ScriptFile file = mAdapter.getScriptFileAt(position); + if (file == null) + return false; + mOnItemLongClickListener.onLongClick(file, position); return true; } return false; @@ -108,6 +113,8 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { public void onClick(View v) { int position = getChildViewHolder((View) v.getParent()).getAdapterPosition(); ScriptFile file = mAdapter.getScriptFileAt(position); + if (file == null) + return; Scripts.run(file); } }; @@ -337,8 +344,13 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { return getScriptFileAt(position).isDirectory() ? VIEW_TYPE_DIRECTORY : VIEW_TYPE_FILE; } + @Nullable public ScriptFile getScriptFileAt(int position) { - return mScriptFileList[mCanGoBack ? position - 1 : position]; + int actualPos = mCanGoBack ? position - 1 : position; + if (actualPos >= mScriptFileList.length || actualPos < 0) { + return null; + } + return mScriptFileList[actualPos]; } void setScripts(ScriptFile[] scriptFiles) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java index 7b5d69fa..941f249a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java @@ -6,12 +6,16 @@ import android.content.ClipboardManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.automator.UiObject; +import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.tool.IntentTool; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; @@ -29,6 +33,7 @@ import moe.feng.alipay.zerosdk.AlipayZeroSdk; public class AboutActivity extends BaseActivity { + private static final String TAG = "AboutActivity"; private int mLolClickCount = 0; @Override @@ -100,18 +105,54 @@ public class AboutActivity extends BaseActivity { mLolClickCount++; Toast.makeText(this, R.string.text_lll, Toast.LENGTH_LONG).show(); if (mLolClickCount >= 5) { - new ThemeColorMaterialDialogBuilder(this) - .title("Crash Test") - .positiveText("Crash") - .onPositive(new MaterialDialog.SingleButtonCallback() { - @Override - public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - throw new RuntimeException("Crash Test"); - } - }).show(); + crashTest(); } } + private void showEasterEgg() { + new MaterialDialog.Builder(this) + .customView(R.layout.paint_layout, false) + .show(); + } + + private void uiObjectCreateTest() { + new Thread(new Runnable() { + @Override + public void run() { + int i = 0; + while (true) { + AccessibilityNodeInfo root = AccessibilityWatchDogService.getInstance().getRootInActiveWindow(); + if (root != null) { + UiObject uiObject = UiObject.createRoot(root); + UiObject child = uiObject.child(0); + if (i % 1000 == 0) { + Log.v(TAG, String.valueOf(i)); + Log.v(TAG, Runtime.getRuntime().totalMemory() + "/" + Runtime.getRuntime().maxMemory()); + if (child != null) + Log.v(TAG, String.valueOf(child.getChildCount())); + } + if (child != null) + child.recycle(); + i++; + } + } + } + }).start(); + + } + + private void crashTest() { + new ThemeColorMaterialDialogBuilder(this) + .title("Crash Test") + .positiveText("Crash") + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + throw new RuntimeException("Crash Test"); + } + }).show(); + } + @ViewBinding.Click(R.id.developer) private void hhh() { Toast.makeText(this, R.string.text_it_is_the_developer_of_app, Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/settings/PaintView.java b/app/src/main/java/com/stardust/scriptdroid/ui/settings/PaintView.java new file mode 100644 index 00000000..eeea6a93 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/settings/PaintView.java @@ -0,0 +1,106 @@ +package com.stardust.scriptdroid.ui.settings; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.os.Build; +import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.stardust.theme.ThemeColorManagerCompat; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Stardust on 2017/5/10. + */ + +public class PaintView extends View { + + private List mPaths = new ArrayList<>(); + private Path mCurrentPath; + private Paint mPaint; + + public PaintView(Context context) { + super(context); + init(); + } + + public PaintView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public PaintView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(); + } + + private void init() { + mPaint = new Paint(); + mPaint.setColor(ThemeColorManagerCompat.getColorPrimary()); + mPaint.setAntiAlias(true); + mPaint.setStrokeWidth(5); + setWillNotDraw(false); + setClickable(true); + setBackgroundColor(Color.TRANSPARENT); + } + + @Override + protected void onDraw(Canvas canvas) { + for (Path path : mPaths) { + canvas.drawPath(path, mPaint); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getY(); + float y = event.getY(); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + onTouchDown(x, y); + return true; + case MotionEvent.ACTION_MOVE: + onTouchMove(x, y); + return true; + case MotionEvent.ACTION_UP: + onTouchUp(x, y); + return true; + } + return super.onTouchEvent(event); + } + + private void onTouchDown(float x, float y) { + if (mCurrentPath != null) { + mCurrentPath.close(); + mPaths.add(mCurrentPath); + invalidate(); + } + mCurrentPath = new Path(); + mCurrentPath.moveTo(x, y); + } + + private void onTouchMove(float x, float y) { + mCurrentPath.moveTo(x, y); + } + + private void onTouchUp(float x, float y) { + mCurrentPath.close(); + mPaths.add(mCurrentPath); + mCurrentPath = null; + invalidate(); + } +} diff --git a/app/src/main/java/com/stardust/theme/widget/ThemeColorImageViewCompat.java b/app/src/main/java/com/stardust/theme/widget/ThemeColorImageViewCompat.java new file mode 100644 index 00000000..53469058 --- /dev/null +++ b/app/src/main/java/com/stardust/theme/widget/ThemeColorImageViewCompat.java @@ -0,0 +1,57 @@ +package com.stardust.theme.widget; + +import android.content.Context; +import android.graphics.PorterDuff; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; + +import com.stardust.theme.ThemeColor; +import com.stardust.theme.ThemeColorManager; +import com.stardust.theme.ThemeColorMutable; + +/** + * Created by Stardust on 2017/5/10. + */ + +public class ThemeColorImageViewCompat extends AppCompatImageView implements ThemeColorMutable { + private int mColor; + + public ThemeColorImageViewCompat(Context context) { + super(context); + this.init(); + } + + public ThemeColorImageViewCompat(Context context, AttributeSet attrs) { + super(context, attrs); + this.init(); + } + + public ThemeColorImageViewCompat(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.init(); + } + + private void init() { + ThemeColorManager.add(this); + } + + public void setThemeColor(ThemeColor color) { + if (this.mColor != color.colorPrimary) { + this.mColor = color.colorPrimary; + this.setColor(color.colorPrimary); + } + } + + public void setImageResource(int resId) { + super.setImageResource(resId); + if (this.mColor != 0) { + this.setColor(this.mColor); + } + + } + + private void setColor(int color) { + getDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN); + } + +} diff --git a/app/src/main/res/drawable/ic_add_file.png b/app/src/main/res/drawable/ic_add_file.png new file mode 100644 index 00000000..a13454ed Binary files /dev/null and b/app/src/main/res/drawable/ic_add_file.png differ diff --git a/app/src/main/res/drawable/ic_add_file_green.png b/app/src/main/res/drawable/ic_add_file_green.png deleted file mode 100644 index bfce3dff..00000000 Binary files a/app/src/main/res/drawable/ic_add_file_green.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_ali_delete.png b/app/src/main/res/drawable/ic_ali_delete.png index e7ac00ae..b092a3a4 100644 Binary files a/app/src/main/res/drawable/ic_ali_delete.png and b/app/src/main/res/drawable/ic_ali_delete.png differ diff --git a/app/src/main/res/drawable/ic_ali_open.png b/app/src/main/res/drawable/ic_ali_open.png index 8e700664..4c8f9ec2 100644 Binary files a/app/src/main/res/drawable/ic_ali_open.png and b/app/src/main/res/drawable/ic_ali_open.png differ diff --git a/app/src/main/res/drawable/ic_ali_record.png b/app/src/main/res/drawable/ic_ali_record.png new file mode 100644 index 00000000..213504bb Binary files /dev/null and b/app/src/main/res/drawable/ic_ali_record.png differ diff --git a/app/src/main/res/drawable/ic_ali_rename.png b/app/src/main/res/drawable/ic_ali_rename.png index 8777c5c5..5de9ddbb 100644 Binary files a/app/src/main/res/drawable/ic_ali_rename.png and b/app/src/main/res/drawable/ic_ali_rename.png differ diff --git a/app/src/main/res/drawable/ic_ali_run.png b/app/src/main/res/drawable/ic_ali_run.png new file mode 100644 index 00000000..c5cab272 Binary files /dev/null and b/app/src/main/res/drawable/ic_ali_run.png differ diff --git a/app/src/main/res/drawable/ic_ali_shortcut.png b/app/src/main/res/drawable/ic_ali_shortcut.png index be72dd6e..24d705bf 100644 Binary files a/app/src/main/res/drawable/ic_ali_shortcut.png and b/app/src/main/res/drawable/ic_ali_shortcut.png differ diff --git a/app/src/main/res/drawable/ic_android_eat_js_100.png b/app/src/main/res/drawable/ic_android_eat_js_100.png deleted file mode 100644 index e42c278e..00000000 Binary files a/app/src/main/res/drawable/ic_android_eat_js_100.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_android_eat_js_64.png b/app/src/main/res/drawable/ic_android_eat_js_64.png new file mode 100644 index 00000000..a3dc653c Binary files /dev/null and b/app/src/main/res/drawable/ic_android_eat_js_64.png differ diff --git a/app/src/main/res/drawable/ic_close.png b/app/src/main/res/drawable/ic_close.png index 5c476fbe..d960ded4 100644 Binary files a/app/src/main/res/drawable/ic_close.png and b/app/src/main/res/drawable/ic_close.png differ diff --git a/app/src/main/res/drawable/ic_developer_512.png b/app/src/main/res/drawable/ic_developer.png similarity index 100% rename from app/src/main/res/drawable/ic_developer_512.png rename to app/src/main/res/drawable/ic_developer.png diff --git a/app/src/main/res/drawable/ic_folder_open_outline_green.png b/app/src/main/res/drawable/ic_folder_open_outline_green.png deleted file mode 100644 index 145b63db..00000000 Binary files a/app/src/main/res/drawable/ic_folder_open_outline_green.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_folder_yellow_100px.png b/app/src/main/res/drawable/ic_folder_yellow_100px.png index 62b711d4..6e555ec3 100644 Binary files a/app/src/main/res/drawable/ic_folder_yellow_100px.png and b/app/src/main/res/drawable/ic_folder_yellow_100px.png differ diff --git a/app/src/main/res/drawable/ic_import.png b/app/src/main/res/drawable/ic_import.png new file mode 100644 index 00000000..9ce0dfa0 Binary files /dev/null and b/app/src/main/res/drawable/ic_import.png differ diff --git a/app/src/main/res/drawable/ic_menu.png b/app/src/main/res/drawable/ic_menu.png index 9b437059..593027f2 100644 Binary files a/app/src/main/res/drawable/ic_menu.png and b/app/src/main/res/drawable/ic_menu.png differ diff --git a/app/src/main/res/drawable/ic_move_cursor.png b/app/src/main/res/drawable/ic_move_cursor.png index c558d96a..988274c8 100644 Binary files a/app/src/main/res/drawable/ic_move_cursor.png and b/app/src/main/res/drawable/ic_move_cursor.png differ diff --git a/app/src/main/res/drawable/ic_new_directory.png b/app/src/main/res/drawable/ic_new_directory.png index 5c10f435..9b0a3805 100644 Binary files a/app/src/main/res/drawable/ic_new_directory.png and b/app/src/main/res/drawable/ic_new_directory.png differ diff --git a/app/src/main/res/drawable/ic_play.png b/app/src/main/res/drawable/ic_play.png deleted file mode 100644 index e00cacbb..00000000 Binary files a/app/src/main/res/drawable/ic_play.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_play_green.png b/app/src/main/res/drawable/ic_play_green.png deleted file mode 100644 index a223b07f..00000000 Binary files a/app/src/main/res/drawable/ic_play_green.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_resizer.png b/app/src/main/res/drawable/ic_resizer.png index 9150e644..0f8f81c2 100644 Binary files a/app/src/main/res/drawable/ic_resizer.png and b/app/src/main/res/drawable/ic_resizer.png differ diff --git a/app/src/main/res/drawable/ic_robot_64.png b/app/src/main/res/drawable/ic_robot_64.png new file mode 100644 index 00000000..88027a39 Binary files /dev/null and b/app/src/main/res/drawable/ic_robot_64.png differ diff --git a/app/src/main/res/drawable/ic_settings_applications_green_48dp.png b/app/src/main/res/drawable/ic_settings_applications_green_48dp.png deleted file mode 100644 index caa0822d..00000000 Binary files a/app/src/main/res/drawable/ic_settings_applications_green_48dp.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_speech_bubble.png b/app/src/main/res/drawable/ic_speech_bubble.png new file mode 100644 index 00000000..f798c8c7 Binary files /dev/null and b/app/src/main/res/drawable/ic_speech_bubble.png differ diff --git a/app/src/main/res/drawable/ic_video_record.png b/app/src/main/res/drawable/ic_video_record.png deleted file mode 100644 index fc0232a1..00000000 Binary files a/app/src/main/res/drawable/ic_video_record.png and /dev/null differ diff --git a/app/src/main/res/drawable/side_menu_bg.png b/app/src/main/res/drawable/side_menu_bg.png deleted file mode 100644 index 6387aa6a..00000000 Binary files a/app/src/main/res/drawable/side_menu_bg.png and /dev/null differ diff --git a/app/src/main/res/drawable/side_menu_bg.webp b/app/src/main/res/drawable/side_menu_bg.webp new file mode 100644 index 00000000..55a821e8 Binary files /dev/null and b/app/src/main/res/drawable/side_menu_bg.webp differ diff --git a/app/src/main/res/drawable/tab_background.png b/app/src/main/res/drawable/tab_background.png deleted file mode 100644 index ba00401b..00000000 Binary files a/app/src/main/res/drawable/tab_background.png and /dev/null differ diff --git a/app/src/main/res/drawable/toolbar_bg.jpg b/app/src/main/res/drawable/toolbar_bg.jpg index bcc352ce..8c8d9dee 100644 Binary files a/app/src/main/res/drawable/toolbar_bg.jpg and b/app/src/main/res/drawable/toolbar_bg.jpg differ diff --git a/app/src/main/res/layout/activity_about_items.xml b/app/src/main/res/layout/activity_about_items.xml index 00b319d3..80914d08 100644 --- a/app/src/main/res/layout/activity_about_items.xml +++ b/app/src/main/res/layout/activity_about_items.xml @@ -20,7 +20,7 @@ android:layout_width="20dp" android:layout_height="20dp" android:layout_margin="16dp" - android:src="@drawable/ic_developer_512"/> + android:src="@drawable/ic_developer"/> - + android:src="@drawable/ic_add_file"/> - - + android:src="@drawable/ic_import"/> - @@ -43,7 +43,7 @@ android:paddingLeft="24dp" android:paddingTop="16dp"> - diff --git a/app/src/main/res/layout/dialog_script_file_operations.xml b/app/src/main/res/layout/dialog_script_file_operations.xml index 96224fb7..8dd7d651 100644 --- a/app/src/main/res/layout/dialog_script_file_operations.xml +++ b/app/src/main/res/layout/dialog_script_file_operations.xml @@ -17,7 +17,7 @@ android:paddingLeft="24dp" android:paddingTop="16dp"> - @@ -43,7 +43,7 @@ android:paddingLeft="24dp" android:paddingTop="16dp"> - @@ -69,7 +69,7 @@ android:paddingLeft="24dp" android:paddingTop="16dp"> - @@ -95,7 +95,7 @@ android:paddingLeft="24dp" android:paddingTop="16dp"> - diff --git a/app/src/main/res/layout/drawer.xml b/app/src/main/res/layout/drawer.xml index 957b62c5..1a7ff245 100644 --- a/app/src/main/res/layout/drawer.xml +++ b/app/src/main/res/layout/drawer.xml @@ -63,8 +63,8 @@ + android:layout_gravity="bottom" + android:baselineAligned="false"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_edit_side_menu.xml b/app/src/main/res/layout/fragment_edit_side_menu.xml index 6df16b68..47971f4a 100644 --- a/app/src/main/res/layout/fragment_edit_side_menu.xml +++ b/app/src/main/res/layout/fragment_edit_side_menu.xml @@ -13,7 +13,7 @@ android:gravity="center_vertical" android:orientation="horizontal"> - - - - - + android:src="@drawable/ic_speech_bubble"/> - - + android:src="@drawable/ic_robot_64"/> - - + diff --git a/app/src/main/res/layout/paint_layout.xml b/app/src/main/res/layout/paint_layout.xml new file mode 100644 index 00000000..de6ce787 --- /dev/null +++ b/app/src/main/res/layout/paint_layout.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/script_and_folder_list_recycler_view_file.xml b/app/src/main/res/layout/script_and_folder_list_recycler_view_file.xml index 5cd33a1d..29725b53 100644 --- a/app/src/main/res/layout/script_and_folder_list_recycler_view_file.xml +++ b/app/src/main/res/layout/script_and_folder_list_recycler_view_file.xml @@ -45,11 +45,11 @@ android:orientation="vertical"> + android:src="@drawable/ic_ali_run"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f347c9f2..266b2ca8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -174,6 +174,10 @@ 强制停止 \n------------\n[%s]运行结束,用时%f秒 录制格式错误 + + 又双 + 又双叒 + 又双叒叕 diff --git a/autojs/src/androidTest/java/com/stardust/autojs/ExampleInstrumentedTest.java b/autojs/src/androidTest/java/com/stardust/autojs/ExampleInstrumentedTest.java index 48e8b1c8..ca86f2f5 100644 --- a/autojs/src/androidTest/java/com/stardust/autojs/ExampleInstrumentedTest.java +++ b/autojs/src/androidTest/java/com/stardust/autojs/ExampleInstrumentedTest.java @@ -1,8 +1,13 @@ package com.stardust.autojs; +import android.app.Instrumentation; +import android.app.UiAutomation; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; +import android.support.test.uiautomator.UiDevice; +import android.view.InputEvent; +import android.test.ActivityInstrumentationTestCase2; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/autojs/src/main/assets/modules/__console__.js b/autojs/src/main/assets/modules/__console__.js index 19ee6151..fae66653 100644 --- a/autojs/src/main/assets/modules/__console__.js +++ b/autojs/src/main/assets/modules/__console__.js @@ -11,9 +11,9 @@ module.exports = function(__runtime__, scope){ return eval(console.rawInput.call(console, [].slice(arguments)) + ""); } - scope.print = console.log.bind(console); + scope.print = console.print.bind(console, android.util.Log.DEBUG); - scope.log = scope.print; + scope.log = console.log.bind(console); scope.err = console.error.bind(console); diff --git a/autojs/src/main/assets/modules/__shell__.js b/autojs/src/main/assets/modules/__shell__.js index d70d5f08..71926614 100644 --- a/autojs/src/main/assets/modules/__shell__.js +++ b/autojs/src/main/assets/modules/__shell__.js @@ -3,7 +3,7 @@ module.exports = function(__runtime__, scope){ scope.SetScreenMetrics = function(w, h){ - __runtime__.getRootShell().SetScreenMetrics(x, y); + __runtime__.getRootShell().SetScreenMetrics(w, h); } scope.Tap = function(x, y){ diff --git a/autojs/src/main/assets/modules/__unit_test__.js b/autojs/src/main/assets/modules/__unit_test__.js index dc5ec835..1bf75670 100644 --- a/autojs/src/main/assets/modules/__unit_test__.js +++ b/autojs/src/main/assets/modules/__unit_test__.js @@ -1,9 +1,103 @@ -assert = console.assert.bind(console); + +function test(){ + //testInput(); + ///sleep(500); + //testLongClick(); + //sleep(500); + testScrollAndShow(); +} + +Function.prototype.getName = function(){ + return this.name || this.toString().match(/function\s*([^(]*)\(/)[1] +} + +assert = function(){ + if(arguments.length == 1){ + if(!arguments[0]){ + throw new Error("Assertion fail"); + } + return; + } + if(arguments[0] != arguments[1]){ + var msg = "Assertion fail: " + arguments[0] + " != " + arguments[1]; + throw new Error(msg); + } +} + + +function testInput(){ + log("testInput..."); + id("add").findOne().click(); + while(!click("新建文件")); + for(var i = 0; i < 9; i++){ + input(i); + } + sleep(200); + assert('请输入名称012345678', editable().findOne().text()); + sleep(400); + back(); + sleep(200); + back(); + sleep(200); + back(); +} + +function random(){ + return ("" + Math.random()).substring(2); +} + +function testLongClick(){ + log("testLongClick..."); + id("script_list_recycler_view").findOne().child(0).longClick(); + while(!click("重命名")); + sleep(200); + var r = random(); + editable().setText(r); + sleep(200); + while(!click("确定")); + sleep(200); + assert(text(r).exists()); +} + +function newFile(name){ + name = name + random(); + id("add").findOne().click(); + sleep(400); + while(!click("新建文件")); + sleep(400); + editable().setText(name); + sleep(400); + while(!click("确定")); + sleep(500); + back(); + sleep(200); + back(); + return name; +} + +function testScrollAndShow(){ + var name1 = newFile("zzz"); + for(var i = 0; i < 10; i++){ + id("script_list_recycler_view").scrollForward(); + } + assert(text(name1).findOne().visibleToUser()); + sleep(500); + var name2 = newFile("000"); + sleep(200); + for(var i = 0; i < 10; i++){ + id("script_list_recycler_view").scrollForward(); + } + sleep(500); + text(name2).findOne().show(); + assert(text(name2).findOne().visibleToUser()); + +} function testApp(){ - print('正在测试模块:app'); + before(); assert("com.tencent.mm" == app.getPackageName("微信")); assert("com.tencent.mobileqq" == app.getPackageName("QQ")); +} -} \ No newline at end of file +module.exports = test; \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java index def8c72b..552c8129 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java @@ -4,7 +4,6 @@ import android.support.annotation.Nullable; import android.util.Log; import com.stardust.autojs.runtime.ScriptStopException; -import com.stardust.autojs.runtime.api.Console; /** * Created by Stardust on 2017/5/1. @@ -24,6 +23,12 @@ public abstract class AbstractConsole implements Console { return String.format(data.toString(), options); } + @Override + public void print(int level, Object data, Object... options) { + write(level, format(data, options)); + } + + protected abstract void write(int level, CharSequence data); @Override public void verbose(@Nullable Object data, Object... options) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Console.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Console.java index 5578415b..a2c69cb4 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Console.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Console.java @@ -16,6 +16,9 @@ public interface Console { @ScriptInterface void log(@Nullable Object data, Object... options); + @ScriptInterface + void print(int level, Object data, Object... options); + @ScriptInterface void info(@Nullable Object data, Object... options); 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 e5194d9a..1eec0e08 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 @@ -151,7 +151,6 @@ public class UiSelector extends UiGlobalSelector { } else { super.id(id); } - Intent intent; return this; } @@ -160,6 +159,11 @@ public class UiSelector extends UiGlobalSelector { return untilFind().performAction(action, arguments); } + public boolean exists() { + UiObjectCollection collection = find(); + return collection != null && collection.size() > 0; + } + @ScriptInterface public boolean click() { return performAction(ACTION_CLICK); diff --git a/automator/build.gradle b/automator/build.gradle index 4c1f3072..ff7cc3e4 100644 --- a/automator/build.gradle +++ b/automator/build.gradle @@ -25,6 +25,7 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) + androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2' testCompile 'junit:junit:4.12' compile project(path: ':common') } diff --git a/automator/src/main/java/com/stardust/automator/UiObject.java b/automator/src/main/java/com/stardust/automator/UiObject.java index b2f9cc1e..5233e0ed 100644 --- a/automator/src/main/java/com/stardust/automator/UiObject.java +++ b/automator/src/main/java/com/stardust/automator/UiObject.java @@ -4,6 +4,7 @@ import android.app.UiAutomation; import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.Pools; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; @@ -129,8 +130,10 @@ public class UiObject extends AccessibilityNodeInfoCompat { return getViewIdResourceName(); } + @NonNull public CharSequence text() { - return getText(); + CharSequence t = getText(); + return t == null ? "" : t; } public CharSequence desc() { @@ -305,6 +308,10 @@ public class UiObject extends AccessibilityNodeInfoCompat { return mAllocator.getParent(this); } + public boolean visibleToUser() { + return isVisibleToUser(); + } + @Override public List findAccessibilityNodeInfosByText(String text) { if (mAllocator == null) diff --git a/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java b/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java index a61c1efe..1d444b05 100644 --- a/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java +++ b/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java @@ -48,7 +48,7 @@ public class ActionFactory { @Override protected void performAction(UiObject node) { Bundle args = new Bundle(); - args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text); + args.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, node.text() + text); node.performAction(getAction(), args); } }; diff --git a/automator/src/main/java/com/stardust/uiautomator/Test.java b/automator/src/main/java/com/stardust/uiautomator/Test.java new file mode 100644 index 00000000..bb1b74c0 --- /dev/null +++ b/automator/src/main/java/com/stardust/uiautomator/Test.java @@ -0,0 +1,35 @@ +package com.stardust.uiautomator; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.InstrumentationInfo; +import android.widget.Toast; + +import java.util.List; + +/** + * Created by Stardust on 2017/5/9. + */ + +public class Test { + + + private void runTests(Context context) { + final String packageName = context.getPackageName(); + final List list = + context.getPackageManager().queryInstrumentation(packageName, 0); + if (list.isEmpty()) { + Toast.makeText(context, "Cannot find instrumentation for " + packageName, + Toast.LENGTH_SHORT).show(); + return; + } + final InstrumentationInfo instrumentationInfo = list.get(0); + final ComponentName componentName = + new ComponentName(instrumentationInfo.packageName, + instrumentationInfo.name); + if (!context.startInstrumentation(componentName, null, null)) { + Toast.makeText(context, "Cannot run instrumentation for " + packageName, + Toast.LENGTH_SHORT).show(); + } + } +}