improve: change starting Activity to show floating window on record stop

This commit is contained in:
hyb1996
2017-08-04 18:36:41 +08:00
parent 37dc1966dc
commit 2ad0d6c269
6 changed files with 131 additions and 72 deletions

View File

@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid" applicationId "com.stardust.scriptdroid"
minSdkVersion 17 minSdkVersion 17
targetSdkVersion 23 targetSdkVersion 23
versionCode 157 versionCode 158
versionName "2.0.16 Alpha" versionName "2.0.16 Alpha2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
ndk { ndk {

View File

@@ -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 extends Dialog> 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;
}
}

View File

@@ -1,15 +1,21 @@
package com.stardust.scriptdroid.external.floatingwindow.menu.content; package com.stardust.scriptdroid.external.floatingwindow.menu.content;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v7.widget.SwitchCompat; import android.support.v7.widget.SwitchCompat;
import android.view.ContextThemeWrapper;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; 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.Recorder;
import com.stardust.autojs.runtime.record.accessibility.AccessibilityActionRecorder; import com.stardust.autojs.runtime.record.accessibility.AccessibilityActionRecorder;
import com.stardust.autojs.runtime.record.inputevent.InputEventObserver; 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.accessibility.AccessibilityEventHelper;
import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; 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.scriptdroid.ui.main.MainActivity;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
import com.stardust.util.ClipboardUtil;
import com.stardust.util.MessageEvent; import com.stardust.util.MessageEvent;
import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.view.accessibility.OnKeyListener; import com.stardust.view.accessibility.OnKeyListener;
@@ -34,6 +43,8 @@ import butterknife.OnClick;
import io.mattcarroll.hover.Navigator; import io.mattcarroll.hover.Navigator;
import io.mattcarroll.hover.NavigatorContent; import io.mattcarroll.hover.NavigatorContent;
import static android.content.Context.CLIPBOARD_SERVICE;
/** /**
* Created by Stardust on 2017/3/12. * Created by Stardust on 2017/3/12.
@@ -83,7 +94,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
}; };
public RecordNavigatorContent(Context context) { public RecordNavigatorContent(Context context) {
mContext = context; mContext = new ContextThemeWrapper(context, R.style.AppTheme);
mView = View.inflate(context, R.layout.floating_window_record, null); mView = View.inflate(context, R.layout.floating_window_record, null);
ButterKnife.bind(this, mView); ButterKnife.bind(this, mView);
HoverMenuService.getEventBus().register(this); HoverMenuService.getEventBus().register(this);
@@ -216,14 +227,47 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
public void onStop() { public void onStop() {
if (!mDiscard) { if (!mDiscard) {
if (mRecorder instanceof TouchRecorder) { if (mRecorder instanceof TouchRecorder) {
MainActivity.importScriptFile(mContext, mRecorder.getCode()); new ScriptOperations(mContext, null)
.importFile(mRecorder.getCode())
.subscribe();
} else { } else {
MainActivity.onRecordStop(mContext, mRecorder.getCode()); handleRecordedScript(mRecorder.getCode());
} }
} }
mRecorder = null; 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 @Override
public void onPause() { public void onPause() {
} }

View File

@@ -1,44 +1,40 @@
package com.stardust.scriptdroid.ui.common; package com.stardust.scriptdroid.ui.common;
import android.app.Activity; 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.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.text.InputType; import android.text.InputType;
import android.util.Log;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog; 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.PFile;
import com.stardust.pio.UncheckedIOException; import com.stardust.pio.UncheckedIOException;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.ScriptFile;
import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.script.Scripts;
import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.script.StorageScriptProvider;
import com.stardust.scriptdroid.script.sample.Sample; 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.scriptdroid.ui.main.script_list.MyScriptListFragment;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; 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.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import io.reactivex.Observable; 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.Consumer;
import io.reactivex.functions.Function; import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
@@ -50,18 +46,18 @@ import io.reactivex.subjects.PublishSubject;
public class ScriptOperations { public class ScriptOperations {
private Activity mActivity; private Context mContext;
private View mView; private View mView;
private ScriptFile mCurrentDirectory; private ScriptFile mCurrentDirectory;
public ScriptOperations(Activity activity, View view, ScriptFile currentDirectory) { public ScriptOperations(Context context, View view, ScriptFile currentDirectory) {
mActivity = activity; mContext = context;
mView = view; mView = view;
mCurrentDirectory = currentDirectory; mCurrentDirectory = currentDirectory;
} }
public ScriptOperations(Activity activity, View view) { public ScriptOperations(Context context, View view) {
this(activity, view, MyScriptListFragment.getCurrentDirectory()); this(context, view, MyScriptListFragment.getCurrentDirectory());
} }
public void newScriptFileForScript(final String script) { public void newScriptFileForScript(final String script) {
@@ -88,14 +84,14 @@ public class ScriptOperations {
try { try {
PFile.write(path, script); PFile.write(path, script);
} catch (UncheckedIOException e) { } catch (UncheckedIOException e) {
Snackbar.make(mView, R.string.text_file_write_fail, Snackbar.LENGTH_LONG).show(); showMessage(R.string.text_file_write_fail);
} }
} }
notifyScriptFileChanged(); notifyScriptFileChanged();
if (edit) if (edit)
Scripts.edit(path); Scripts.edit(path);
} else { } 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) { private void showMessage(final int resId) {
mActivity.runOnUiThread(new Runnable() { if (Looper.myLooper() == Looper.getMainLooper()) {
showMessageDirectly(resId);
}
App.getApp().getUiHandler().post(new Runnable() {
@Override @Override
public void run() { 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<String> showFileNameInputDialog(String prefix, String ext) { private Observable<String> showFileNameInputDialog(String prefix, String ext) {
return showNameInputDialog(prefix, new InputCallback(ext)); return showNameInputDialog(prefix, new InputCallback(ext));
@@ -175,7 +182,7 @@ public class ScriptOperations {
private Observable<String> showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher) { private Observable<String> showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher) {
final PublishSubject<String> input = PublishSubject.create(); final PublishSubject<String> 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) .inputType(InputType.TYPE_CLASS_TEXT)
.alwaysCallInputCallback() .alwaysCallInputCallback()
.input(getString(R.string.text_please_input_name), prefix, false, textWatcher) .input(getString(R.string.text_please_input_name), prefix, false, textWatcher)
@@ -186,21 +193,22 @@ public class ScriptOperations {
input.onComplete(); input.onComplete();
} }
}) })
.show(); .build());
return input; return input;
} }
private CharSequence getString(int resId) { private CharSequence getString(int resId) {
return mActivity.getString(resId); return mContext.getString(resId);
} }
public Observable<String> importSample(Sample sample) { public Observable<String> importSample(Sample sample) {
try { try {
return importFile(sample.name, mActivity.getAssets().open(sample.path)); return importFile(sample.name, mContext.getAssets().open(sample.path));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
Snackbar.make(mView, R.string.text_import_fail, Snackbar.LENGTH_SHORT).show(); showMessage(R.string.text_import_fail);
return Observable.error(e); return Observable.error(e);
} }
} }

View File

@@ -300,12 +300,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
if (action == null) if (action == null)
return; return;
switch (action) { 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: case ACTION_IMPORT_SCRIPT:
handleImportScriptFile(intent); handleImportScriptFile(intent);
break; break;
@@ -326,33 +321,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
.subscribe(); .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) { public static void importScriptFile(Context context, String path) {

View File

@@ -298,15 +298,17 @@ public class ScriptRuntime {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
images.releaseScreenCapturer(); images.releaseScreenCapturer();
} }
if (events != null)
events.recycle();
if (loopers != null)
loopers.quitAll();
if (mRootShell != null) { if (mRootShell != null) {
mRootShell.exit(); mRootShell.exitAndWaitFor();
mRootShell = null;
} }
mRootShell = null;
mShellSupplier = null; mShellSupplier = null;
if (events != null) {
events.recycle();
}
if (loopers != null) {
loopers.quitAll();
}
} }
public Object getImages() { public Object getImages() {