diff --git a/app/build.gradle b/app/build.gradle index 9c21e662..6c4db91d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 160 - versionName "2.0.16 Alpha3" + versionCode 161 + versionName "2.0.16 Alpha4" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index f0903126..039207d8 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -11,6 +11,7 @@ import com.squareup.leakcanary.LeakCanary; import com.stardust.app.SimpleActivityLifecycleCallbacks; import com.stardust.app.VolumeChangeObserver; import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.autojs.key.GlobalKeyObserver; import com.stardust.scriptdroid.autojs.record.GlobalRecorder; import com.stardust.scriptdroid.statics.ScriptStatics; import com.stardust.scriptdroid.tool.CrashHandler; @@ -69,22 +70,10 @@ public class App extends MultiDexApplication { ThemeColorManager.init(this); AutoJs.initInstance(this); JsBeautifierFactory.initJsBeautify(this, "js/jsbeautify.js"); - initVolumeChangeObserver(); + GlobalKeyObserver.getSingleton(); GlobalRecorder.initSingleton(this); } - private void initVolumeChangeObserver() { - AccessibilityService.getStickOnKeyObserver().addListener(new OnKeyListener() { - @Override - public void onKeyEvent(int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN && - (keyCode == KeyEvent.KEYCODE_VOLUME_UP) - && Pref.isRunningVolumeControlEnabled()) { - AutoJs.getInstance().getScriptEngineService().stopAllAndToast(); - } - } - }); - } public UiHandler getUiHandler() { diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/key/GlobalKeyObserver.java b/app/src/main/java/com/stardust/scriptdroid/autojs/key/GlobalKeyObserver.java new file mode 100644 index 00000000..c9d8da04 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/key/GlobalKeyObserver.java @@ -0,0 +1,115 @@ +package com.stardust.scriptdroid.autojs.key; + +import android.util.Log; +import android.view.KeyEvent; + +import com.stardust.autojs.core.inputevent.InputEventObserver; +import com.stardust.autojs.core.inputevent.ShellKeyObserver; +import com.stardust.event.EventDispatcher; +import com.stardust.scriptdroid.Pref; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.view.accessibility.AccessibilityService; +import com.stardust.view.accessibility.OnKeyListener; + +/** + * Created by Stardust on 2017/8/14. + */ + +public class GlobalKeyObserver implements OnKeyListener, ShellKeyObserver.KeyListener { + + + public interface OnVolumeDownListener { + void onVolumeDown(); + } + + private static final EventDispatcher.Event VOLUME_DOWN_EVENT = new EventDispatcher.Event() { + @Override + public void notify(OnVolumeDownListener l) { + l.onVolumeDown(); + } + }; + private static final String LOG_TAG = "GlobalKeyObserver"; + private static final long EVENT_TIMEOUT = 200; + private static GlobalKeyObserver sSingleton = new GlobalKeyObserver(); + private EventDispatcher mVolumeDownEventDispatcher = new EventDispatcher<>(); + private boolean mVolumeDownFromShell, mVolumeDownFromAccessibility; + private boolean mVolumeUpFromShell, mVolumeUpFromAccessibility; + + GlobalKeyObserver() { + AccessibilityService.getStickOnKeyObserver() + .addListener(this); + ShellKeyObserver observer = new ShellKeyObserver(); + observer.setKeyListener(this); + InputEventObserver.getGlobal().addListener(observer); + } + + public static GlobalKeyObserver getSingleton() { + return sSingleton; + } + + public void onVolumeUp() { + Log.d(LOG_TAG, "onVolumeUp at " + System.currentTimeMillis()); + if (Pref.isRunningVolumeControlEnabled()) { + AutoJs.getInstance().getScriptEngineService().stopAllAndToast(); + } + } + + public void onVolumeDown() { + Log.d(LOG_TAG, "onVolumeDown at " + System.currentTimeMillis()); + mVolumeDownEventDispatcher.dispatchEvent(VOLUME_DOWN_EVENT); + } + + public void addVolumeDownListener(OnVolumeDownListener listener) { + mVolumeDownEventDispatcher.addListener(listener); + } + + public boolean removeVolumeDownListener(OnVolumeDownListener listener) { + return mVolumeDownEventDispatcher.removeListener(listener); + } + + @Override + public void onKeyEvent(int keyCode, KeyEvent event) { + if (event.getAction() != KeyEvent.ACTION_UP) + return; + if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { + if (mVolumeDownFromShell) { + mVolumeDownFromShell = false; + return; + } + mVolumeUpFromAccessibility = true; + onVolumeDown(); + } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { + if (mVolumeUpFromShell) { + mVolumeUpFromShell = false; + return; + } + mVolumeUpFromAccessibility = true; + onVolumeUp(); + } + } + + + @Override + public void onKeyDown(String keyName) { + + } + + @Override + public void onKeyUp(String keyName) { + if ("KEY_VOLUMEUP".equals(keyName)) { + if (mVolumeUpFromAccessibility) { + mVolumeUpFromAccessibility = false; + return; + } + mVolumeUpFromShell = true; + onVolumeUp(); + } else if ("KEY_VOLUMEDOWN".equals(keyName)) { + if (mVolumeDownFromAccessibility) { + mVolumeDownFromAccessibility = false; + return; + } + mVolumeDownFromShell = true; + onVolumeDown(); + } + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java index 33c9a868..b2934cce 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/RecordNavigatorContent.java @@ -24,6 +24,7 @@ import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.accessibility.AccessibilityEventHelper; import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.autojs.key.GlobalKeyObserver; import com.stardust.scriptdroid.autojs.record.GlobalRecorder; import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; import com.stardust.scriptdroid.ui.common.ScriptOperations; @@ -48,7 +49,7 @@ import io.mattcarroll.hover.NavigatorContent; * Created by Stardust on 2017/3/12. */ -public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStateChangedListener, OnKeyListener { +public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStateChangedListener, GlobalKeyObserver.OnVolumeDownListener { private View mView; @BindView(R.id.sw_recorded_by_root) @@ -78,10 +79,10 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat mRecorder = GlobalRecorder.getSingleton(context); mRecorder.addOnStateChangedListener(this); setState(mRecorder.getState()); - AccessibilityService.getStickOnKeyObserver().addListener(this); + GlobalKeyObserver.getSingleton().addVolumeDownListener(this); } - private void onVolumeDown() { + public void onVolumeDown() { if (!Pref.isRecordVolumeControlEnable()) { return; } @@ -106,7 +107,6 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat @Override public void onShown(@NonNull Navigator navigator) { - } @Override @@ -179,7 +179,6 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat public void onMenuExit() { HoverMenuService.getEventBus().unregister(this); mRecorder.removeOnStateChangedListener(this); - AccessibilityService.getStickOnKeyObserver().removeListener(this); } @Override @@ -202,12 +201,5 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat setState(Recorder.STATE_RECORDING); } - @Override - public void onKeyEvent(int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN && - (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) { - onVolumeDown(); - } - } } \ No newline at end of file