|
|
@@ -1,10 +1,15 @@
|
|
|
package info.knacki.pass.services;
|
|
|
|
|
|
+import android.content.ClipData;
|
|
|
+import android.content.ClipboardManager;
|
|
|
+import android.content.Context;
|
|
|
import android.content.Intent;
|
|
|
import android.graphics.PixelFormat;
|
|
|
import android.os.Build;
|
|
|
import android.os.Bundle;
|
|
|
import android.os.Handler;
|
|
|
+import android.os.IBinder;
|
|
|
+import android.support.annotation.RequiresApi;
|
|
|
import android.view.Gravity;
|
|
|
import android.view.WindowManager;
|
|
|
import android.view.accessibility.AccessibilityEvent;
|
|
|
@@ -13,11 +18,17 @@ import android.widget.Toast;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.util.Date;
|
|
|
+import java.util.logging.Level;
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
import info.knacki.pass.R;
|
|
|
+import info.knacki.pass.io.FileInterfaceFactory;
|
|
|
+import info.knacki.pass.io.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 static AccessibilityService fInstance;
|
|
|
private boolean fManagingEvent;
|
|
|
@@ -80,8 +91,9 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
@Override
|
|
|
public void OnPasswordClicked(File f) {
|
|
|
new Handler(getMainLooper()).post(() -> {
|
|
|
- CloseOpenWindow(openWindow);
|
|
|
- LoadFile(f, source);
|
|
|
+ LoadFile(f, openWindow.getWindowToken(), source, () ->
|
|
|
+ CloseOpenWindow(openWindow)
|
|
|
+ );
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -115,10 +127,23 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void LoadFile(File f, AccessibilityNodeInfo source) {
|
|
|
+ private void LoadFile(File f, IBinder windowToken, AccessibilityNodeInfo source, Runnable done) {
|
|
|
fManagingEvent = false;
|
|
|
- Logger.getAnonymousLogger().severe("Loading " +f.getName());
|
|
|
- //SendPassword(source, ""))
|
|
|
+ log.info("Loading " +f.getName());
|
|
|
+ FileInterfaceFactory.GetFileInterface(this, PasswordPickerFactory.GetPasswordPicker(this, windowToken), f).ReadFile(new OnResponseListener<String>() {
|
|
|
+ @Override
|
|
|
+ public void OnResponse(String result) {
|
|
|
+ done.run();
|
|
|
+ SendPassword(source, result);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void OnError(String msg, Throwable e) {
|
|
|
+ done.run();
|
|
|
+ Toast.makeText(AccessibilityService.this, msg, Toast.LENGTH_LONG).show();
|
|
|
+ log.log(Level.SEVERE, msg, e);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
private void SendPassword(AccessibilityNodeInfo accessibilityNode, String password) {
|
|
|
@@ -128,10 +153,10 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
try {
|
|
|
accessibilityNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, passContent);
|
|
|
} catch (Throwable e) {
|
|
|
- LegacySendPassword(password);
|
|
|
+ LegacySendPassword(accessibilityNode, password);
|
|
|
}
|
|
|
} else {
|
|
|
- LegacySendPassword(password);
|
|
|
+ LegacySendPassword(accessibilityNode, password);
|
|
|
}
|
|
|
fManagingEvent = false;
|
|
|
}
|
|
|
@@ -142,8 +167,14 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void LegacySendPassword(String password) {
|
|
|
- // FIXME
|
|
|
+ private void LegacySendPassword(AccessibilityNodeInfo accessibilityNode, String password) {
|
|
|
+ final ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
|
|
|
+ final ClipData passClip = ClipData.newPlainText("password", password);
|
|
|
+ final ClipData prev = clipboard.getPrimaryClip();
|
|
|
+
|
|
|
+ clipboard.setPrimaryClip(passClip);
|
|
|
+ accessibilityNode.performAction(AccessibilityNodeInfo.ACTION_PASTE);
|
|
|
+ clipboard.setPrimaryClip(prev == null ? ClipData.newPlainText("", "") : prev);
|
|
|
}
|
|
|
|
|
|
@Override
|