isundil 6 年之前
父節點
當前提交
92a8fdf163

+ 3 - 0
.idea/gradle.xml

@@ -3,6 +3,9 @@
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
+        <compositeConfiguration>
+          <compositeBuild compositeDefinitionSource="SCRIPT" />
+        </compositeConfiguration>
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="modules">

+ 1 - 0
.idea/vcs.xml

@@ -2,5 +2,6 @@
 <project version="4">
   <component name="VcsDirectoryMappings">
     <mapping directory="" vcs="Git" />
+    <mapping directory="$PROJECT_DIR$/gitdroid" vcs="Git" />
   </component>
 </project>

+ 32 - 5
app/src/main/java/info/knacki/pass/services/AccessibilityService.java

@@ -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;
+    }
 }

+ 3 - 1
app/src/main/java/info/knacki/pass/settings/ui/SettingsActivity.java

@@ -201,7 +201,9 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
         }
 
         private boolean IsAccessibilityEnabled() {
-            return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && AccessibilityService.IsRunning();
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2)
+                return false;
+            return AccessibilityService.IsEnabled(getActivity());
         }
 
         private boolean IsDrawOverEnabled() {

+ 28 - 16
app/src/main/java/info/knacki/pass/ui/alertPrompt/views/ConflictView.java

@@ -18,33 +18,45 @@ public class ConflictView extends HorizontalScrollView {
     protected final HashMap<String, ConflictState> fConflicts;
     protected final AlertPrompt fDialog;
 
-    public ConflictView(Context context, AlertPrompt parentDialog, Set<String> conflicts) {
-        super(context);
-        fConflicts = new HashMap<>();
-        fDialog = parentDialog;
-        LinearLayout rootLayout = new LinearLayout(context);
-        rootLayout.setOrientation(LinearLayout.VERTICAL);
-        rootLayout.setPadding(15, 0, 15, 0);
-        addView(rootLayout);
-        for (String i: conflicts) {
+    private class ConflictLine extends LinearLayout {
+        public final RadioButton useMineButton;
+        public final RadioButton useTheirButton;
+
+        public ConflictLine(Context context, String text) {
+            super(context);
+            setOrientation(VERTICAL);
+
             TextView label = new TextView(context);
-            label.setText(i);
-            rootLayout.addView(label);
+            label.setText(text);
+            addView(label);
 
             LinearLayout controls = new LinearLayout(context);
             controls.setOrientation(LinearLayout.HORIZONTAL);
             RadioGroup input = new RadioGroup(context);
             input.setOrientation(LinearLayout.HORIZONTAL);
-            RadioButton useMineButton = new RadioButton(context);
-            RadioButton useTheirButton = new RadioButton(context);
+            useMineButton = new RadioButton(context);
+            useTheirButton = new RadioButton(context);
             input.addView(useMineButton);
             input.addView(useTheirButton);
             useMineButton.setText(R.string.useMine);
             useTheirButton.setText(R.string.useTheir);
-            createListeners(useMineButton, useTheirButton, i);
-
             controls.addView(input);
-            rootLayout.addView(controls);
+            addView(controls);
+        }
+    }
+
+    public ConflictView(Context context, AlertPrompt parentDialog, Set<String> conflicts) {
+        super(context);
+        fConflicts = new HashMap<>();
+        fDialog = parentDialog;
+        LinearLayout rootLayout = new LinearLayout(context);
+        rootLayout.setOrientation(LinearLayout.VERTICAL);
+        rootLayout.setPadding(15, 0, 15, 0);
+        addView(rootLayout);
+        for (String i: conflicts) {
+            ConflictLine uiLine = new ConflictLine(context, i);
+            createListeners(uiLine.useMineButton, uiLine.useTheirButton, i);
+            rootLayout.addView(uiLine);
         }
     }
 

+ 5 - 9
app/src/main/java/info/knacki/pass/ui/passwordList/PasswordView.java

@@ -1,7 +1,7 @@
 package info.knacki.pass.ui.passwordList;
 
 import android.content.Context;
-import android.view.Gravity;
+import android.view.LayoutInflater;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -22,8 +22,9 @@ public class PasswordView extends LinearLayout {
 
     public PasswordView(Context ctx, int type, String name) {
         super(ctx);
+        LinearLayout content = (LinearLayout) LayoutInflater.from(ctx).inflate(R.layout.password_line, this, true);
         fFullName = name;
-        vIcon = new ImageView(ctx);
+        vIcon = content.findViewById(R.id.password_icon);
         fType = type;
         if ((type & TYPE_PARENT) != 0)
             vIcon.setImageResource(android.R.drawable.ic_media_previous);
@@ -31,14 +32,9 @@ public class PasswordView extends LinearLayout {
             vIcon.setImageResource(R.drawable.ic_doc_folder);
         else
             vIcon.setImageResource(R.drawable.ic_doc_text);
-        vIcon.setMinimumHeight(ICON_SIZE);
-        vIcon.setMinimumWidth(ICON_SIZE);
-        addView(vIcon);
-        vName = new TextView(ctx);
-        vName.setHeight(ICON_SIZE);
-        vName.setGravity(Gravity.CENTER_VERTICAL);
+
+        vName = content.findViewById(R.id.password_name);
         vName.setText(FileUtils.TrimExtension(name));
-        addView(vName);
         setClickable(true);
     }
 

+ 1 - 0
app/src/main/res/layout/activity_accessibility.xml

@@ -5,6 +5,7 @@
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:maxHeight="@dimen/keyboard_max_height"
     tools:context="info.knacki.pass.services.AccessibilityView">
     <ScrollView
         android:id="@+id/passwordListContainer"

+ 2 - 1
app/src/main/res/layout/input.xml

@@ -2,7 +2,8 @@
 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/inputBackground">
+    android:background="@color/inputBackground"
+    android:maxHeight="@dimen/keyboard_max_height">
 
 <LinearLayout
     android:layout_width="match_parent"

+ 11 - 3
app/src/main/res/layout/password_line.xml

@@ -1,6 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout
+<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
     android:layout_height="match_parent">
-
-</android.support.constraint.ConstraintLayout>
+    <ImageView
+        android:layout_width="@dimen/password_icon_size"
+        android:layout_height="@dimen/password_icon_size"
+        android:id="@+id/password_icon"/>
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/password_icon_size"
+        android:gravity="center_vertical"
+        android:id="@+id/password_name"/>
+</LinearLayout>

+ 1 - 0
app/src/main/res/values/dimens.xml

@@ -5,4 +5,5 @@
     <dimen name="keyboard_min_height">550px</dimen>
     <dimen name="keyboard_max_height">614px</dimen>
     <dimen name="fab_margin">16dp</dimen>
+    <dimen name="password_icon_size">42dp</dimen>
 </resources>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -27,4 +27,5 @@
     <integer name="id_keyboard_delete" translatable="false">-5</integer>
     <string name="id_accessibility_settings" translatable="false">id_accessibility_settings</string>
     <string name="id_draw_over_settings" translatable="false">id_draw_over_settings</string>
+    <string name="acc_service_name" translatable="false">info.knacki.pass.accessibility</string>
 </resources>