Browse Source

refactor input views

isundil 7 years ago
parent
commit
a6d1dc539a

+ 21 - 19
app/src/main/java/info/knacki/pass/services/AccessibilityService.java

@@ -45,32 +45,34 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
                 0,
                 PixelFormat.TRANSLUCENT);
         params.gravity = Gravity.START | Gravity.BOTTOM;
-        params.setTitle("Load Average");
+
+        fOpenWindow = ((AccessibilityView) LayoutInflater.from(this).inflate(R.layout.activity_accessibility, null, false))
+                .init(this, new AccessibilityView.AccessibilityViewListener() {
+                    @Override
+                    public void OnPasswordClicked(File f) {
+                        new Handler(getMainLooper()).post(() -> {
+                            CloseOpenWindow();
+                            LoadFile(f, source);
+                        });
+                    }
+
+                    @Override
+                    public void cancel() {
+                        new Handler(getMainLooper()).post(() -> {
+                            CloseOpenWindow();
+                            fManagingEvent = false;
+                        });
+                    }
+                })
+                .AddCancelButton(this);
 
         try {
             WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
-            fOpenWindow = LayoutInflater.from(this).inflate(R.layout.activity_accessibility, null, false);
             wm.addView(fOpenWindow, params);
-            ((AccessibilityView) fOpenWindow).init(this, new AccessibilityView.AccessibilityViewListener() {
-                @Override
-                public void OnPasswordClicked(File f) {
-                    new Handler(getMainLooper()).post(() -> {
-                        CloseOpenWindow();
-                        LoadFile(f, source);
-                    });
-                }
-
-                @Override
-                public void cancel() {
-                    new Handler(getMainLooper()).post(() -> {
-                        CloseOpenWindow();
-                        fManagingEvent = false;
-                    });
-                }
-            });
             return true;
         }
         catch (WindowManager.BadTokenException e) {
+            fOpenWindow = null;
             Toast.makeText(this, getResources().getString(R.string.app_name) +": " +getResources().getString(R.string.unauthorized_draw_over), Toast.LENGTH_LONG).show();
         }
         return false;

+ 30 - 3
app/src/main/java/info/knacki/pass/services/AccessibilityView.java

@@ -1,8 +1,10 @@
 package info.knacki.pass.services;
 
 import android.content.Context;
+import android.support.v7.widget.AppCompatButton;
 import android.support.v7.widget.LinearLayoutCompat;
 import android.util.AttributeSet;
+import android.view.ViewGroup;
 import android.widget.ScrollView;
 
 import info.knacki.pass.R;
@@ -16,13 +18,26 @@ public class AccessibilityView extends LinearLayoutCompat {
     }
 
     PasswordListView fPasswordListView;
+    AccessibilityViewListener fAccessibilityViewListener;
 
     public AccessibilityView init(Context ctx, final AccessibilityViewListener listener) {
         fPasswordListView = new PasswordListView(ctx, listener, PathUtils.GetPassDir(ctx));
         ((ScrollView) findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
-        findViewById(R.id.cancel_action).setOnClickListener(v -> {
-            if (listener != null)
-                listener.cancel();
+        fAccessibilityViewListener = listener;
+        return this;
+    }
+
+    public AccessibilityView AddCancelButton(Context ctx) {
+        AppCompatButton button = new AppCompatButton(ctx);
+        button.setLayoutParams(new LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT
+        ));
+        button.setText(R.string.cancel);
+        addView(button);
+        button.setOnClickListener(v -> {
+            if (fAccessibilityViewListener != null)
+                fAccessibilityViewListener.cancel();
         });
         return this;
     }
@@ -38,4 +53,16 @@ public class AccessibilityView extends LinearLayoutCompat {
     public AccessibilityView(Context ctx, AttributeSet attrs, int defStyle) {
         super(ctx, attrs, defStyle);
     }
+
+    public void reset() {
+        fPasswordListView.reset();
+    }
+
+    public void refresh() {
+        fPasswordListView.refresh();
+    }
+
+    public String GetCurrentDir() {
+        return fPasswordListView.fCurrentDir;
+    }
 }

+ 17 - 13
app/src/main/java/info/knacki/pass/services/InputService.java

@@ -9,9 +9,10 @@ import android.os.Handler;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.Window;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.ScrollView;
+import android.widget.LinearLayout;
 import android.widget.Toast;
 
 import java.io.File;
@@ -26,17 +27,14 @@ import info.knacki.pass.io.FileInterfaceFactory;
 import info.knacki.pass.io.FileUtils;
 import info.knacki.pass.io.IFileInterface;
 import info.knacki.pass.io.OnResponseListener;
-import info.knacki.pass.io.PathUtils;
 import info.knacki.pass.settings.SettingsManager;
 import info.knacki.pass.ui.MainActivity;
 import info.knacki.pass.ui.alertPrompt.ServiceAlertPromptGenerator;
 import info.knacki.pass.ui.alertPrompt.views.SimpleTextEditWithKeyboard;
-import info.knacki.pass.ui.passwordList.PasswordClickListener;
-import info.knacki.pass.ui.passwordList.PasswordListView;
 import info.knacki.pass.ui.passwordPicker.PasswordPickerFactory;
 
-public class InputService extends InputMethodService implements PasswordClickListener {
-    protected PasswordListView fPasswordListView;
+public class InputService extends InputMethodService implements AccessibilityView.AccessibilityViewListener {
+    protected AccessibilityView fPasswordListView;
     private static final Logger log = Logger.getLogger(InputService.class.getName());
     protected View fInputView;
 
@@ -73,7 +71,8 @@ public class InputService extends InputMethodService implements PasswordClickLis
                 log.log(Level.SEVERE, "Cannot get Input method service");
                 return;
             }
-            if (!service.switchToLastInputMethod(getWindow().getWindow().getAttributes().token))
+            Window win = getWindow().getWindow();
+            if (win != null && !service.switchToLastInputMethod(win.getAttributes().token))
                 PromptInputService();
         }
     }
@@ -82,11 +81,7 @@ public class InputService extends InputMethodService implements PasswordClickLis
     @Override
     public View onCreateInputView() {
         fInputView = LayoutInflater.from(this).inflate(R.layout.input, null, false);
-        fPasswordListView = new PasswordListView(this, this, PathUtils.GetPassDir(this));
-        ((ScrollView)fInputView.findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
-        fInputView.findViewById(R.id.prevButton).setOnClickListener(view -> {
-            SwitchToPreviousInputMethod();
-        });
+        fInputView.findViewById(R.id.prevButton).setOnClickListener(view -> SwitchToPreviousInputMethod());
         fInputView.findViewById(R.id.backspaceButton).setOnTouchListener(new View.OnTouchListener() {
             private final static int INIT_DELAY = 650;
             private final static int DELAY = 250;
@@ -124,6 +119,11 @@ public class InputService extends InputMethodService implements PasswordClickLis
         });
         fInputView.findViewById(R.id.generateButton).setOnClickListener(view -> CreatePassword());
         fInputView.findViewById(R.id.openAppButton).setOnClickListener(view -> startActivity(new Intent(InputService.this, MainActivity.class)));
+
+        fPasswordListView = ((AccessibilityView) LayoutInflater.from(this)
+                .inflate(R.layout.activity_accessibility, null, false))
+                .init(this, this);
+        ((LinearLayout) fInputView.findViewById(R.id.container)).addView(fPasswordListView);
         return fInputView;
     }
 
@@ -137,7 +137,7 @@ public class InputService extends InputMethodService implements PasswordClickLis
                         Toast.makeText(InputService.this, "Error: Empty file name", Toast.LENGTH_LONG).show();
                         return;
                     }
-                    File f = new File(fPasswordListView.fCurrentDir +"/" +filename +FileInterfaceFactory.GetExtension(SettingsManager.GetDefaultEncryptionType(InputService.this)));
+                    File f = new File(fPasswordListView.GetCurrentDir() +"/" +filename +FileInterfaceFactory.GetExtension(SettingsManager.GetDefaultEncryptionType(InputService.this)));
                     try {
                         FileUtils.Touch(f);
                         fPasswordListView.refresh();
@@ -209,4 +209,8 @@ public class InputService extends InputMethodService implements PasswordClickLis
             }
         });
     }
+
+    @Override
+    public void cancel() {
+    }
 }

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

@@ -14,9 +14,4 @@
         android:minHeight="@dimen/keyboard_min_height"
         android:maxHeight="@dimen/keyboard_max_height"
         />
-    <Button
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/cancel"
-        android:id="@+id/cancel_action"/>
 </info.knacki.pass.services.AccessibilityView>

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

@@ -1,15 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".ui.MainActivity"
     android:background="@color/inputBackground">
 
 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:id="@+id/container">
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -71,13 +70,6 @@
         android:layout_width="match_parent"
         android:layout_height="1dp"
         android:background="@color/colorSeparator"/>
-    <ScrollView
-        android:id="@+id/passwordListContainer"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:minHeight="@dimen/keyboard_min_height"
-        android:maxHeight="@dimen/keyboard_max_height"
-        />
 </LinearLayout>
 
 </android.support.constraint.ConstraintLayout>