add: root record generates js file
fix: delay of tap, swipe by adding RootAutomator
This commit is contained in:
@@ -186,7 +186,6 @@
|
||||
<data android:mimeType="application/plain"/>
|
||||
<data android:mimeType="application/x-javascript"/>
|
||||
<data android:mimeType="text/*"/>
|
||||
<data android:mimeType="*/*" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND"/>
|
||||
@@ -210,9 +209,9 @@
|
||||
|
||||
<activity
|
||||
android:name=".external.open.ImportIntentActivity"
|
||||
android:theme="@style/AppTheme.Transparent"
|
||||
android:icon="@drawable/ic_import"
|
||||
android:label="@string/text_import_script">
|
||||
android:label="@string/text_import_script"
|
||||
android:theme="@style/AppTheme.Transparent">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
@@ -228,8 +227,6 @@
|
||||
<data android:mimeType="application/plain"/>
|
||||
<data android:mimeType="application/x-javascript"/>
|
||||
<data android:mimeType="text/*"/>
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:mimeType="application/*" android:host="*" android:pathPattern=".*.auto" android:scheme="content" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND"/>
|
||||
|
||||
@@ -128,4 +128,9 @@ public class Pref {
|
||||
public static boolean isRecordToastEnabled() {
|
||||
return def().getBoolean(getString(R.string.key_record_toast), true);
|
||||
}
|
||||
|
||||
public static boolean rootRecordGeneratesBinary() {
|
||||
return def().getString(getString(R.string.key_root_record_out_file_type), "binary")
|
||||
.equals("binary");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@ import com.stardust.autojs.core.inputevent.InputEventCodes;
|
||||
import com.stardust.autojs.core.inputevent.ShellKeyObserver;
|
||||
import com.stardust.autojs.core.record.Recorder;
|
||||
import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder;
|
||||
import com.stardust.autojs.core.record.inputevent.InputEventRecorder;
|
||||
import com.stardust.autojs.core.record.inputevent.InputEventToAutoFileRecorder;
|
||||
import com.stardust.autojs.core.record.inputevent.InputEventToRootAutomatorRecorder;
|
||||
import com.stardust.autojs.core.record.inputevent.TouchRecorder;
|
||||
import com.stardust.autojs.runtime.api.Shell;
|
||||
import com.stardust.scriptdroid.App;
|
||||
@@ -45,8 +48,6 @@ public class GlobalRecorder implements Recorder.OnStateChangedListener {
|
||||
private TouchRecorder mTouchRecorder;
|
||||
private Context mContext;
|
||||
private boolean mDiscard = false;
|
||||
private long mLastVolumeDownEventTime;
|
||||
private ShellKeyObserver mShellKeyObserver;
|
||||
|
||||
public static GlobalRecorder getSingleton(Context context) {
|
||||
if (sSingleton == null) {
|
||||
@@ -55,61 +56,25 @@ public class GlobalRecorder implements Recorder.OnStateChangedListener {
|
||||
return sSingleton;
|
||||
}
|
||||
|
||||
|
||||
public static void initSingleton(Context context) {
|
||||
getSingleton(context);
|
||||
}
|
||||
|
||||
public GlobalRecorder(Context context) {
|
||||
mContext = new ContextThemeWrapper(context.getApplicationContext(), R.style.AppTheme);
|
||||
mTouchRecorder = new TouchRecorder(context);
|
||||
addKeyListeners();
|
||||
mTouchRecorder = new TouchRecorder(context) {
|
||||
@Override
|
||||
protected InputEventRecorder createInputEventRecorder() {
|
||||
if (Pref.rootRecordGeneratesBinary())
|
||||
return new InputEventToAutoFileRecorder(mContext);
|
||||
else
|
||||
return new InputEventToRootAutomatorRecorder();
|
||||
}
|
||||
};
|
||||
EventBus.getDefault().register(this);
|
||||
}
|
||||
|
||||
private void addKeyListeners() {
|
||||
AccessibilityService.getStickOnKeyObserver().addListener(new OnKeyListener() {
|
||||
@Override
|
||||
public void onKeyEvent(int keyCode, KeyEvent event) {
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN &&
|
||||
(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {
|
||||
onVolumeDown();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
mShellKeyObserver = new ShellKeyObserver();
|
||||
mShellKeyObserver.setKeyListener(new ShellKeyObserver.KeyListener() {
|
||||
@Override
|
||||
public void onKeyDown(String keyName) {
|
||||
if ("KEY_VOLUMEDOWN".equals(keyName)) {
|
||||
onVolumeDown();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyUp(String keyName) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void onVolumeDown() {
|
||||
if (!Pref.isRecordVolumeControlEnable()) {
|
||||
return;
|
||||
}
|
||||
if (System.currentTimeMillis() - mLastVolumeDownEventTime < 300) {
|
||||
return;
|
||||
}
|
||||
mLastVolumeDownEventTime = System.currentTimeMillis();
|
||||
int state = getState();
|
||||
if (state == Recorder.STATE_RECORDING || state == Recorder.STATE_PAUSED) {
|
||||
stop();
|
||||
} else {
|
||||
start();
|
||||
}
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (Pref.isRecordWithRootEnabled()) {
|
||||
@@ -139,6 +104,10 @@ public class GlobalRecorder implements Recorder.OnStateChangedListener {
|
||||
return mRecorder.getCode();
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return mRecorder.getPath();
|
||||
}
|
||||
|
||||
public int getState() {
|
||||
if (mRecorder == null)
|
||||
return Recorder.STATE_NOT_START;
|
||||
@@ -166,7 +135,11 @@ public class GlobalRecorder implements Recorder.OnStateChangedListener {
|
||||
@Override
|
||||
public void onStop() {
|
||||
if (!mDiscard) {
|
||||
handleRecordedScript(getCode());
|
||||
String code = getCode();
|
||||
if (code != null)
|
||||
handleRecordedScript(code);
|
||||
else
|
||||
handleRecordedFile(getPath());
|
||||
}
|
||||
for (Recorder.OnStateChangedListener listener : mOnStateChangedListeners) {
|
||||
listener.onStop();
|
||||
@@ -212,6 +185,23 @@ public class GlobalRecorder implements Recorder.OnStateChangedListener {
|
||||
}
|
||||
}
|
||||
|
||||
private void handleRecordedFile(final String path) {
|
||||
if (Looper.myLooper() != Looper.getMainLooper()) {
|
||||
App.getApp().getUiHandler().post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
handleRecordedFile(path);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
new ScriptOperations(mContext, null)
|
||||
.importFile(path)
|
||||
.subscribe();
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void showRecordHandleDialog(final String script) {
|
||||
DialogUtils.showDialog(new ThemeColorMaterialDialogBuilder(mContext)
|
||||
.title(R.string.text_recorded)
|
||||
|
||||
@@ -48,7 +48,7 @@ import io.mattcarroll.hover.NavigatorContent;
|
||||
* Created by Stardust on 2017/3/12.
|
||||
*/
|
||||
|
||||
public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStateChangedListener {
|
||||
public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStateChangedListener, OnKeyListener {
|
||||
|
||||
private View mView;
|
||||
@BindView(R.id.sw_recorded_by_root)
|
||||
@@ -68,18 +68,36 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
||||
|
||||
private GlobalRecorder mRecorder;
|
||||
private Context mContext;
|
||||
|
||||
private long mLastVolumeDownEventTime;
|
||||
|
||||
public RecordNavigatorContent(Context context) {
|
||||
mContext = new ContextThemeWrapper(context, R.style.AppTheme);
|
||||
mView = View.inflate(context, R.layout.floating_window_record, null);
|
||||
mView = View.inflate(mContext, R.layout.floating_window_record, null);
|
||||
ButterKnife.bind(this, mView);
|
||||
HoverMenuService.getEventBus().register(this);
|
||||
mRecorder = GlobalRecorder.getSingleton(context);
|
||||
mRecorder.addOnStateChangedListener(this);
|
||||
setState(mRecorder.getState());
|
||||
AccessibilityService.getStickOnKeyObserver().addListener(this);
|
||||
}
|
||||
|
||||
private void onVolumeDown() {
|
||||
if (!Pref.isRecordVolumeControlEnable()) {
|
||||
return;
|
||||
}
|
||||
if (System.currentTimeMillis() - mLastVolumeDownEventTime < 300) {
|
||||
return;
|
||||
}
|
||||
mLastVolumeDownEventTime = System.currentTimeMillis();
|
||||
int state = mRecorder.getState();
|
||||
if (state == Recorder.STATE_RECORDING || state == Recorder.STATE_PAUSED) {
|
||||
mRecorder.stop();
|
||||
} else {
|
||||
mRecorder.start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public View getView() {
|
||||
@@ -161,6 +179,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
||||
public void onMenuExit() {
|
||||
HoverMenuService.getEventBus().unregister(this);
|
||||
mRecorder.removeOnStateChangedListener(this);
|
||||
AccessibilityService.getStickOnKeyObserver().removeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -182,4 +201,13 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
||||
public void onResume() {
|
||||
setState(Recorder.STATE_RECORDING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyEvent(int keyCode, KeyEvent event) {
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN &&
|
||||
(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {
|
||||
onVolumeDown();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import android.text.TextUtils;
|
||||
import android.webkit.MimeTypeMap;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.stardust.pio.PFile;
|
||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||
import com.stardust.scriptdroid.ui.common.ScriptOperations;
|
||||
import com.stardust.scriptdroid.ui.main.MainActivity;
|
||||
@@ -45,9 +46,13 @@ public class ImportIntentActivity extends BaseActivity {
|
||||
private void handleIntent(Intent intent) throws FileNotFoundException {
|
||||
Uri uri = intent.getData();
|
||||
if (uri != null && "content".equals(uri.getScheme())) {
|
||||
String ext = PFile.getExtension(uri.getScheme());
|
||||
if(TextUtils.isEmpty(ext)){
|
||||
ext = "js";
|
||||
}
|
||||
InputStream stream = getContentResolver().openInputStream(uri);
|
||||
new ScriptOperations(this, null)
|
||||
.importFile("", stream)
|
||||
.importFile("", stream, ext)
|
||||
.subscribe(new Consumer<String>() {
|
||||
@Override
|
||||
public void accept(@NonNull String s) throws Exception {
|
||||
|
||||
@@ -96,7 +96,13 @@ public class ScriptOperations {
|
||||
}
|
||||
|
||||
public void newScriptFile() {
|
||||
newScriptFileForScript(null);
|
||||
showFileNameInputDialog("", "js")
|
||||
.subscribe(new Consumer<String>() {
|
||||
@Override
|
||||
public void accept(@io.reactivex.annotations.NonNull String input) throws Exception {
|
||||
createScriptFile(getCurrentDirectoryPath() + input + ".js", null, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Observable<String> importFile(final String pathFrom) {
|
||||
@@ -117,13 +123,13 @@ public class ScriptOperations {
|
||||
});
|
||||
}
|
||||
|
||||
public Observable<String> importFile(String prefix, final InputStream inputStream) {
|
||||
return showFileNameInputDialog(PFile.getNameWithoutExtension(prefix), "js")
|
||||
public Observable<String> importFile(String prefix, final InputStream inputStream, final String ext) {
|
||||
return showFileNameInputDialog(PFile.getNameWithoutExtension(prefix), ext)
|
||||
.observeOn(Schedulers.io())
|
||||
.map(new Function<String, String>() {
|
||||
@Override
|
||||
public String apply(@io.reactivex.annotations.NonNull String s) throws Exception {
|
||||
final String pathTo = getCurrentDirectoryPath() + s + ".js";
|
||||
final String pathTo = getCurrentDirectoryPath() + s + "." + ext;
|
||||
if (PFile.copyStream(inputStream, pathTo)) {
|
||||
showMessage(R.string.text_import_succeed);
|
||||
} else {
|
||||
@@ -198,14 +204,13 @@ public class ScriptOperations {
|
||||
}
|
||||
|
||||
|
||||
|
||||
private CharSequence getString(int resId) {
|
||||
return mContext.getString(resId);
|
||||
}
|
||||
|
||||
public Observable<String> importSample(Sample sample) {
|
||||
try {
|
||||
return importFile(sample.name, mContext.getAssets().open(sample.path));
|
||||
return importFile(sample.name, mContext.getAssets().open(sample.path), PFile.getExtension(sample.path));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
showMessage(R.string.text_import_fail);
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<string name="text_join_qq_group">加入QQ互赞&交流群</string>
|
||||
<string name="text_copied">已复制到剪贴板</string>
|
||||
<string name="text_use_volume_control_record">使用音量下键控制</string>
|
||||
<string name="summary_use_volume_control_record">开启后每次音量下键会开始或停止脚本录制</string>
|
||||
<string name="summary_use_volume_control_record">开启悬浮窗后每次音量下键会开始或停止脚本录制</string>
|
||||
<string name="key_use_volume_control_record">key_use_volume_control_record</string>
|
||||
<string name="text_mobile_qq_not_installed">未安装手机QQ</string>
|
||||
<string name="text_edit">编辑</string>
|
||||
@@ -218,6 +218,9 @@
|
||||
<string name="text_import_script">导入脚本文件</string>
|
||||
<string name="key_record_with_root">key_record_with_root</string>
|
||||
<string name="key_record_toast">key_record_toast</string>
|
||||
<string name="key_root_record_out_file_type">key_root_record_out_file_type</string>
|
||||
<string name="text_root_record_out_file_type">Root录制生成文件类型</string>
|
||||
<string name="text_binary">binary</string>
|
||||
|
||||
|
||||
<string-array name="record_control_keys">
|
||||
@@ -246,4 +249,14 @@
|
||||
<item>Off</item>
|
||||
</string-array>
|
||||
|
||||
|
||||
<string-array name="root_record_out_file_type_keys">
|
||||
<item>可编辑的js文件</item>
|
||||
<item>不可编辑的二进制文件</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="root_record_out_file_type_values">
|
||||
<item>js</item>
|
||||
<item>binary</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
||||
@@ -18,6 +18,14 @@
|
||||
android:defaultValue="true"
|
||||
android:key="@string/key_record_toast"
|
||||
android:title="@string/text_record_msg"/>
|
||||
|
||||
<com.afollestad.materialdialogs.prefs.MaterialListPreference
|
||||
android:defaultValue="@string/text_binary"
|
||||
android:entries="@array/root_record_out_file_type_keys"
|
||||
android:entryValues="@array/root_record_out_file_type_values"
|
||||
android:key="@string/key_root_record_out_file_type"
|
||||
android:title="@string/text_root_record_out_file_type"
|
||||
/>
|
||||
</com.stardust.theme.preference.ThemeColorPreferenceCategory>
|
||||
|
||||
<com.stardust.theme.preference.ThemeColorPreferenceCategory android:title="@string/text_script_running">
|
||||
|
||||
Reference in New Issue
Block a user