fix: volume key control not working when accessibility service is disabled

This commit is contained in:
hyb1996 2017-08-15 10:04:22 +08:00
parent 405075757e
commit a9ef908ef2
4 changed files with 123 additions and 27 deletions

View File

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

View File

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

View File

@ -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<OnVolumeDownListener> VOLUME_DOWN_EVENT = new EventDispatcher.Event<OnVolumeDownListener>() {
@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<OnVolumeDownListener> 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();
}
}
}

View File

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