|
|
@@ -1,9 +1,11 @@
|
|
|
package info.knacki.pass.services;
|
|
|
|
|
|
+import android.accessibilityservice.AccessibilityServiceInfo;
|
|
|
import android.content.ClipData;
|
|
|
import android.content.ClipboardManager;
|
|
|
import android.content.Context;
|
|
|
import android.content.Intent;
|
|
|
+import android.content.pm.ResolveInfo;
|
|
|
import android.graphics.PixelFormat;
|
|
|
import android.os.Build;
|
|
|
import android.os.Bundle;
|
|
|
@@ -13,6 +15,7 @@ import android.support.annotation.RequiresApi;
|
|
|
import android.view.Gravity;
|
|
|
import android.view.WindowManager;
|
|
|
import android.view.accessibility.AccessibilityEvent;
|
|
|
+import android.view.accessibility.AccessibilityManager;
|
|
|
import android.view.accessibility.AccessibilityNodeInfo;
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
@@ -21,15 +24,16 @@ import java.util.Date;
|
|
|
import java.util.logging.Level;
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
+import info.knacki.gitdroid.callback.OnResponseListener;
|
|
|
import info.knacki.pass.R;
|
|
|
import info.knacki.pass.io.FileInterfaceFactory;
|
|
|
-import info.knacki.gitdroid.callback.OnResponseListener;
|
|
|
import info.knacki.pass.ui.passwordPicker.PasswordPickerFactory;
|
|
|
|
|
|
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
|
|
|
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
|
|
|
private static final Logger log = Logger.getLogger(AccessibilityService.class.getName());
|
|
|
private final static long CANCEL_DELAY_SEC = 10;
|
|
|
+ private final int NOTIFICATION_ID = 1;
|
|
|
private static AccessibilityService fInstance;
|
|
|
private boolean fManagingEvent;
|
|
|
|
|
|
@@ -62,6 +66,7 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
|
|
|
@Override
|
|
|
protected void onServiceConnected() {
|
|
|
+ log.info("Service started");
|
|
|
super.onServiceConnected();
|
|
|
fInstance = this;
|
|
|
fManagingEvent = false;
|
|
|
@@ -69,6 +74,7 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
|
|
|
@Override
|
|
|
public void onAccessibilityEvent(AccessibilityEvent event) {
|
|
|
+ log.severe("BOATS !");
|
|
|
synchronized (AccessibilityService.class) {
|
|
|
if (fManagingEvent || fLastCancellation.IsCancelling(event.getSource(), true))
|
|
|
return;
|
|
|
@@ -177,17 +183,38 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
clipboard.setPrimaryClip(prev == null ? ClipData.newPlainText("", "") : prev);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void onInterrupt() {
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public boolean onUnbind(Intent intent) {
|
|
|
+ log.info("Accessibility service unbinded");
|
|
|
fInstance = null;
|
|
|
return super.onUnbind(intent);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void onInterrupt() {
|
|
|
+ }
|
|
|
+
|
|
|
public static boolean IsRunning() {
|
|
|
return fInstance != null;
|
|
|
}
|
|
|
+
|
|
|
+ public static boolean IsEnabled(Context ctx) {
|
|
|
+ final AccessibilityManager accessibilityManager = (AccessibilityManager) ctx.getSystemService(ACCESSIBILITY_SERVICE);
|
|
|
+ final String myAppProcessName = ctx.getApplicationInfo().processName;
|
|
|
+
|
|
|
+ for (AccessibilityServiceInfo i: accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK)) {
|
|
|
+ ResolveInfo resolveInfo = i.getResolveInfo();
|
|
|
+ if (resolveInfo == null ||
|
|
|
+ resolveInfo.serviceInfo == null ||
|
|
|
+ resolveInfo.serviceInfo.applicationInfo == null)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (myAppProcessName.equals(i.getResolveInfo().serviceInfo.applicationInfo.processName)) {
|
|
|
+ if (!IsRunning())
|
|
|
+ log.warning("Service enabled but not running");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|