improve: change starting Activity to show floating window on record stop
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
36
app/src/main/java/com/stardust/app/DialogUtils.java
Normal file
36
app/src/main/java/com/stardust/app/DialogUtils.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user