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"
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 {

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;
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() {
}

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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() {