diff --git a/app/build.gradle b/app/build.gradle index feb37d82..58430eac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 157 - versionName "2.0.16 Alpha" + versionCode 158 + versionName "2.0.16 Alpha2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/app/src/main/java/com/stardust/app/DialogUtils.java b/app/src/main/java/com/stardust/app/DialogUtils.java new file mode 100644 index 00000000..4cadcde9 --- /dev/null +++ b/app/src/main/java/com/stardust/app/DialogUtils.java @@ -0,0 +1,36 @@ +package com.stardust.app; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.ContextWrapper; +import android.view.Window; +import android.view.WindowManager; + +/** + * Created by Stardust on 2017/8/4. + */ + +public class DialogUtils { + + public static T showDialog(T dialog) { + Context context = dialog.getContext(); + if (!isActivityContext(context)) { + Window window = dialog.getWindow(); + if (window != null) + window.setType(WindowManager.LayoutParams.TYPE_PHONE); + } + dialog.show(); + return dialog; + } + + + public static boolean isActivityContext(Context context) { + if (context instanceof Activity) + return true; + if (context instanceof ContextWrapper) { + return isActivityContext(((ContextWrapper) context).getBaseContext()); + } + return false; + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java index f717b099..0c5bf16d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java @@ -1,15 +1,21 @@ package com.stardust.scriptdroid.external.floatingwindow.menu.content; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.widget.SwitchCompat; +import android.view.ContextThemeWrapper; import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.app.DialogUtils; import com.stardust.autojs.runtime.record.Recorder; import com.stardust.autojs.runtime.record.accessibility.AccessibilityActionRecorder; import com.stardust.autojs.runtime.record.inputevent.InputEventObserver; @@ -21,7 +27,10 @@ import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.accessibility.AccessibilityEventHelper; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; +import com.stardust.scriptdroid.ui.common.ScriptOperations; import com.stardust.scriptdroid.ui.main.MainActivity; +import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; +import com.stardust.util.ClipboardUtil; import com.stardust.util.MessageEvent; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.OnKeyListener; @@ -34,6 +43,8 @@ import butterknife.OnClick; import io.mattcarroll.hover.Navigator; import io.mattcarroll.hover.NavigatorContent; +import static android.content.Context.CLIPBOARD_SERVICE; + /** * Created by Stardust on 2017/3/12. @@ -83,7 +94,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat }; public RecordNavigatorContent(Context context) { - mContext = context; + mContext = new ContextThemeWrapper(context, R.style.AppTheme); mView = View.inflate(context, R.layout.floating_window_record, null); ButterKnife.bind(this, mView); HoverMenuService.getEventBus().register(this); @@ -216,14 +227,47 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat public void onStop() { if (!mDiscard) { if (mRecorder instanceof TouchRecorder) { - MainActivity.importScriptFile(mContext, mRecorder.getCode()); + new ScriptOperations(mContext, null) + .importFile(mRecorder.getCode()) + .subscribe(); } else { - MainActivity.onRecordStop(mContext, mRecorder.getCode()); + handleRecordedScript(mRecorder.getCode()); } } mRecorder = null; } + private void handleRecordedScript(final String script) { + DialogUtils.showDialog(new ThemeColorMaterialDialogBuilder(mContext) + .title(R.string.text_recorded) + .items(getString(R.string.text_new_file), getString(R.string.text_copy_to_clip)) + .itemsCallback(new MaterialDialog.ListCallback() { + @Override + public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) { + if (position == 0) { + new ScriptOperations(mContext, null) + .newScriptFileForScript(script); + } else { + ClipboardUtil.setClip(mContext, script); + Toast.makeText(mContext, R.string.text_already_copy_to_clip, Toast.LENGTH_SHORT).show(); + } + } + }) + .negativeText(R.string.text_cancel) + .onNegative(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + dialog.dismiss(); + } + }) + .canceledOnTouchOutside(false) + .build()); + } + + private String getString(int res) { + return mContext.getString(res); + } + @Override public void onPause() { } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java index ec1e189b..bc2c11a1 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java @@ -1,44 +1,40 @@ package com.stardust.scriptdroid.ui.common; import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.ContextWrapper; +import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; -import android.support.v4.widget.DrawerLayout; import android.text.InputType; -import android.util.Log; import android.view.View; +import android.view.WindowManager; import android.widget.EditText; +import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; +import com.jecelyin.common.utils.L; +import com.stardust.app.DialogUtils; +import com.stardust.autojs.runtime.api.ui.Dialogs; import com.stardust.pio.PFile; import com.stardust.pio.UncheckedIOException; +import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.script.sample.Sample; -import com.stardust.scriptdroid.ui.edit.EditActivity; -import com.stardust.scriptdroid.ui.main.MainActivity; import com.stardust.scriptdroid.ui.main.script_list.MyScriptListFragment; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; -import com.stardust.util.UnderuseExecutors; - -import org.reactivestreams.Publisher; -import org.reactivestreams.Subscriber; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; -import io.reactivex.Scheduler; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; @@ -50,18 +46,18 @@ import io.reactivex.subjects.PublishSubject; public class ScriptOperations { - private Activity mActivity; + private Context mContext; private View mView; private ScriptFile mCurrentDirectory; - public ScriptOperations(Activity activity, View view, ScriptFile currentDirectory) { - mActivity = activity; + public ScriptOperations(Context context, View view, ScriptFile currentDirectory) { + mContext = context; mView = view; mCurrentDirectory = currentDirectory; } - public ScriptOperations(Activity activity, View view) { - this(activity, view, MyScriptListFragment.getCurrentDirectory()); + public ScriptOperations(Context context, View view) { + this(context, view, MyScriptListFragment.getCurrentDirectory()); } public void newScriptFileForScript(final String script) { @@ -88,14 +84,14 @@ public class ScriptOperations { try { PFile.write(path, script); } catch (UncheckedIOException e) { - Snackbar.make(mView, R.string.text_file_write_fail, Snackbar.LENGTH_LONG).show(); + showMessage(R.string.text_file_write_fail); } } notifyScriptFileChanged(); if (edit) Scripts.edit(path); } else { - Snackbar.make(mView, R.string.text_create_fail, Snackbar.LENGTH_LONG).show(); + showMessage(R.string.text_create_fail); } } @@ -160,14 +156,25 @@ public class ScriptOperations { } private void showMessage(final int resId) { - mActivity.runOnUiThread(new Runnable() { + if (Looper.myLooper() == Looper.getMainLooper()) { + showMessageDirectly(resId); + } + App.getApp().getUiHandler().post(new Runnable() { @Override public void run() { - Snackbar.make(mView, resId, Snackbar.LENGTH_SHORT).show(); + showMessageDirectly(resId); } }); } + private void showMessageDirectly(int resId) { + if (mView != null) { + Snackbar.make(mView, resId, Snackbar.LENGTH_SHORT).show(); + } else { + Toast.makeText(mContext, resId, Toast.LENGTH_SHORT).show(); + } + } + private Observable showFileNameInputDialog(String prefix, String ext) { return showNameInputDialog(prefix, new InputCallback(ext)); @@ -175,7 +182,7 @@ public class ScriptOperations { private Observable showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher) { final PublishSubject input = PublishSubject.create(); - new ThemeColorMaterialDialogBuilder(mActivity).title(R.string.text_name) + DialogUtils.showDialog(new ThemeColorMaterialDialogBuilder(mContext).title(R.string.text_name) .inputType(InputType.TYPE_CLASS_TEXT) .alwaysCallInputCallback() .input(getString(R.string.text_please_input_name), prefix, false, textWatcher) @@ -186,21 +193,22 @@ public class ScriptOperations { input.onComplete(); } }) - .show(); + .build()); return input; } + private CharSequence getString(int resId) { - return mActivity.getString(resId); + return mContext.getString(resId); } public Observable importSample(Sample sample) { try { - return importFile(sample.name, mActivity.getAssets().open(sample.path)); + return importFile(sample.name, mContext.getAssets().open(sample.path)); } catch (IOException e) { e.printStackTrace(); - Snackbar.make(mView, R.string.text_import_fail, Snackbar.LENGTH_SHORT).show(); + showMessage(R.string.text_import_fail); return Observable.error(e); } } 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 d469bd2e..b138cf20 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 @@ -300,12 +300,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega if (action == null) return; switch (action) { - case ACTION_ON_RECORD_STOP: - IntentExtras extras = IntentExtras.fromIntent(intent); - String script = extras.get(ARGUMENT_SCRIPT); - extras.clear(); - handleRecordedScript(script); - break; + case ACTION_IMPORT_SCRIPT: handleImportScriptFile(intent); break; @@ -326,33 +321,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega .subscribe(); } - private void handleRecordedScript(final String script) { - new ThemeColorMaterialDialogBuilder(this) - .title(R.string.text_recorded) - .items(getString(R.string.text_new_file), getString(R.string.text_copy_to_clip)) - .itemsCallback(new MaterialDialog.ListCallback() { - @Override - public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) { - if (position == 0) { - new ScriptOperations(MainActivity.this, mDrawerLayout) - .newScriptFileForScript(script); - } else { - ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)) - .setPrimaryClip(ClipData.newPlainText("script", script)); - Toast.makeText(MainActivity.this, R.string.text_already_copy_to_clip, Toast.LENGTH_SHORT).show(); - } - } - }) - .negativeText(R.string.text_cancel) - .onNegative(new MaterialDialog.SingleButtonCallback() { - @Override - public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - dialog.dismiss(); - } - }) - .canceledOnTouchOutside(false) - .show(); - } + public static void importScriptFile(Context context, String path) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index 36573d34..cb87af01 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -298,15 +298,17 @@ public class ScriptRuntime { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { images.releaseScreenCapturer(); } - if (events != null) - events.recycle(); - if (loopers != null) - loopers.quitAll(); if (mRootShell != null) { - mRootShell.exit(); - mRootShell = null; + mRootShell.exitAndWaitFor(); } + mRootShell = null; mShellSupplier = null; + if (events != null) { + events.recycle(); + } + if (loopers != null) { + loopers.quitAll(); + } } public Object getImages() {