mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-21 21:01:43 +08:00
improve: change starting Activity to show floating window on record stop
This commit is contained in:
parent
37dc1966dc
commit
2ad0d6c269
@ -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 {
|
||||
|
||||
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;
|
||||
|
||||
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() {
|
||||
}
|
||||
|
||||
@ -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<String> showFileNameInputDialog(String prefix, String ext) {
|
||||
return showNameInputDialog(prefix, new InputCallback(ext));
|
||||
@ -175,7 +182,7 @@ public class ScriptOperations {
|
||||
|
||||
private Observable<String> showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher) {
|
||||
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)
|
||||
.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<String> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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() {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user