Browse Source

Refactor views

isundil 7 years ago
parent
commit
6803eb4e23

+ 12 - 16
app/src/main/java/info/knacki/pass/generator/ui/PasswordGeneratorWizard.java

@@ -2,12 +2,12 @@ package info.knacki.pass.generator.ui;
 
 import android.content.Context;
 import android.support.v7.widget.AppCompatSpinner;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.LinearLayout;
 import android.widget.NumberPicker;
-import android.widget.TextView;
 
 import info.knacki.pass.R;
 import info.knacki.pass.generator.PasswordGenerator;
@@ -75,10 +75,11 @@ public class PasswordGeneratorWizard extends LinearLayout implements PasswordGen
     public PasswordGeneratorWizard(Context c) {
         super(c);
 
-        LinearLayout difficultyLayout = new LinearLayout(c);
+        LayoutInflater.from(c).inflate(R.layout.password_generator_wizard, this, true);
+
         ArrayAdapter fDifficultyAdapter = new ArrayAdapter<>(c, android.R.layout.simple_spinner_item, c.getResources().getStringArray(R.array.fDifficulty));
         fDifficultyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-        fDifficulty = new AppCompatSpinner(c);
+        fDifficulty = findViewById(R.id.difficulty);
         fDifficulty.setAdapter(fDifficultyAdapter);
         fDifficulty.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
@@ -89,22 +90,17 @@ public class PasswordGeneratorWizard extends LinearLayout implements PasswordGen
             @Override
             public void onNothingSelected(AdapterView<?> adapterView) {}
         });
-        TextView tv = new TextView(c);
-        tv.setText(R.string.generate_difficulty);
-        difficultyLayout.setOrientation(HORIZONTAL);
-        difficultyLayout.addView(tv);
-        difficultyLayout.addView(fDifficulty);
-        addView(difficultyLayout);
-        fNum = new Checkbox(c, R.string.generate_number, fChangeListener, this);
-        fAlpha = new Checkbox(c, R.string.generate_alpha, fChangeListener, this);
-        fCapitalize = new Checkbox(c, R.string.generate_capitalize, fChangeListener, this);
-        fSpecial = new Checkbox(c, R.string.generate_special, fChangeListener, this);
-        fLength = new NumberPicker(c);
+
+        fNum = ((Checkbox) findViewById(R.id.generate_numbers)).SetOnCheckedChangeListener(fChangeListener);
+        fAlpha = ((Checkbox) findViewById(R.id.generate_alpha)).SetOnCheckedChangeListener(fChangeListener);
+        fCapitalize = ((Checkbox) findViewById(R.id.generate_capitalize)).SetOnCheckedChangeListener(fChangeListener);
+        fSpecial = ((Checkbox) findViewById(R.id.generate_special)).SetOnCheckedChangeListener(fChangeListener);
+
+        fLength = findViewById(R.id.length);
         fLength.setMinValue(4);
         fLength.setMaxValue(21);
         fLength.setOnValueChangedListener(fChangeListener);
-        addView(fLength);
-        setOrientation(VERTICAL);
+
         fDifficulty.setSelection(2, false);
         fChangeListener.setLocked(false);
     }

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

@@ -1,11 +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.LayoutInflater;
 import android.view.ViewGroup;
-import android.widget.ScrollView;
 
 import info.knacki.pass.R;
 import info.knacki.pass.io.PathUtils;
@@ -17,41 +16,44 @@ public class AccessibilityView extends LinearLayoutCompat {
         void cancel();
     }
 
-    PasswordListView fPasswordListView;
-    AccessibilityViewListener fAccessibilityViewListener;
+    private PasswordListView fPasswordListView;
+    private 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);
+    public AccessibilityView Init(Context ctx, final AccessibilityViewListener listener) {
+        fPasswordListView = findViewById(R.id.password_list);
+        fPasswordListView.Init(listener, PathUtils.GetPassDir(ctx));
         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 -> {
+        findViewById(R.id.cancel).setOnClickListener(v -> {
             if (fAccessibilityViewListener != null)
                 fAccessibilityViewListener.cancel();
         });
         return this;
     }
 
+    public AccessibilityView AddCancelButton() {
+        findViewById(R.id.cancel).setVisibility(VISIBLE);
+        return this;
+    }
+
     public AccessibilityView(Context ctx) {
         super(ctx);
+        setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+        LayoutInflater.from(ctx).inflate(R.layout.activity_accessibility, this);
+        findViewById(R.id.cancel).setVisibility(INVISIBLE);
     }
 
     public AccessibilityView(Context ctx, AttributeSet attrs) {
         super(ctx, attrs);
+        setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+        LayoutInflater.from(ctx).inflate(R.layout.activity_accessibility, this);
+        findViewById(R.id.cancel).setVisibility(INVISIBLE);
     }
 
     public AccessibilityView(Context ctx, AttributeSet attrs, int defStyle) {
         super(ctx, attrs, defStyle);
+        setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+        LayoutInflater.from(ctx).inflate(R.layout.activity_accessibility, this);
+        findViewById(R.id.cancel).setVisibility(INVISIBLE);
     }
 
     public void reset() {

+ 1 - 6
app/src/main/java/info/knacki/pass/services/InputService.java

@@ -12,7 +12,6 @@ import android.view.View;
 import android.view.Window;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.LinearLayout;
 import android.widget.Toast;
 
 import java.io.File;
@@ -119,11 +118,7 @@ public class InputService extends InputMethodService implements AccessibilityVie
         });
         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);
+        fPasswordListView = ((AccessibilityView) fInputView.findViewById(R.id.accessibility)).Init(this, this);
         return fInputView;
     }
 

+ 2 - 3
app/src/main/java/info/knacki/pass/ui/MainActivity.java

@@ -9,7 +9,6 @@ import android.os.Bundle;
 import android.support.v7.app.AppCompatActivity;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.widget.ScrollView;
 import android.widget.Toast;
 
 import java.io.File;
@@ -120,8 +119,8 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
         setContentView(R.layout.activity_pass_list);
 
         setTitle(R.string.title);
-        fPasswordListView = new EditablePasswordListView(this, this, PathUtils.GetPassDir(this), false);
-        ((ScrollView)findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
+        fPasswordListView = findViewById(R.id.password_list);
+        fPasswordListView.Init(this, PathUtils.GetPassDir(this), false);
 
         requestPermissions();
     }

+ 21 - 1
app/src/main/java/info/knacki/pass/ui/passwordList/EditablePasswordListView.java

@@ -1,6 +1,8 @@
 package info.knacki.pass.ui.passwordList;
 
 import android.app.Activity;
+import android.content.Context;
+import android.util.AttributeSet;
 import android.view.MenuItem;
 import android.widget.PopupMenu;
 
@@ -13,9 +15,27 @@ public class EditablePasswordListView extends PasswordListView implements PopupM
     private PasswordView fSelectedPassword;
     private boolean fDisplayHiddenFiles;
 
+    public EditablePasswordListView(Context ctx) {
+        super(ctx);
+    }
+
+    public EditablePasswordListView(Context ctx, AttributeSet attrs) {
+        super(ctx, attrs);
+    }
+
+    public EditablePasswordListView(Context ctx, AttributeSet attrs, int style) {
+        super(ctx, attrs, style);
+    }
+
     public EditablePasswordListView(Activity ctx, PasswordEditListener editListener, String rootPath, boolean displayHidden) {
-        super(ctx, editListener, rootPath);
+        super(ctx);
+        Init(editListener, rootPath, displayHidden);
+    }
+
+    public EditablePasswordListView Init(PasswordEditListener editListener, String rootPath, boolean displayHidden) {
+        super.Init(editListener, rootPath);
         fDisplayHiddenFiles = displayHidden;
+        return this;
     }
 
     public void SetDisplayHiddenFiles(boolean displayHidden) {

+ 18 - 4
app/src/main/java/info/knacki/pass/ui/passwordList/PasswordListView.java

@@ -2,6 +2,7 @@ package info.knacki.pass.ui.passwordList;
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.util.AttributeSet;
 import android.widget.LinearLayout;
 
 import java.io.File;
@@ -12,9 +13,9 @@ import info.knacki.pass.io.FileUtils;
 import info.knacki.pass.io.PathUtils;
 
 public class PasswordListView extends LinearLayout {
-    public final String fRootPath;
+    public String fRootPath;
     public String fCurrentDir;
-    protected final PasswordClickListener fClickListener;
+    protected PasswordClickListener fClickListener;
     protected final Context fContext;
 
     class FileIdentity implements Comparable<FileIdentity> {
@@ -75,10 +76,23 @@ public class PasswordListView extends LinearLayout {
         return pv;
     }
 
-    public PasswordListView(final Context ctx, PasswordClickListener clickListener, String rootPath) {
+    public PasswordListView(final Context ctx) {
         super(ctx);
-        fClickListener = clickListener;
         fContext = ctx;
+    }
+
+    public PasswordListView(Context ctx, AttributeSet attrs) {
+        super(ctx, attrs);
+        fContext = ctx;
+    }
+
+    public PasswordListView(Context ctx, AttributeSet attrs, int style) {
+        super(ctx, attrs, style);
+        fContext = ctx;
+    }
+
+    public void Init(PasswordClickListener clickListener, String rootPath) {
+        fClickListener = clickListener;
         File rootDir = new File(rootPath);
         if (!rootDir.exists())
             FileUtils.MkDir(rootDir, true);

+ 36 - 13
app/src/main/java/info/knacki/pass/ui/widget/Checkbox.java

@@ -4,33 +4,56 @@ import android.annotation.SuppressLint;
 import android.content.Context;
 import android.support.v7.widget.AppCompatImageView;
 import android.support.v7.widget.AppCompatTextView;
-import android.view.ViewGroup;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
 import android.widget.Checkable;
 import android.widget.LinearLayout;
 
+import info.knacki.pass.R;
+
 @SuppressLint("ViewConstructor")
 public class Checkbox extends LinearLayout implements Checkable {
     protected final AppCompatImageView fCheckbox;
     protected final AppCompatTextView fTextView;
-    protected final OnCheckedChangeListener fCheckedChangeListener;
+    protected OnCheckedChangeListener fCheckedChangeListener;
     protected boolean fChecked;
 
     public interface OnCheckedChangeListener {
         void onCheckedChanged();
     }
 
-    public Checkbox(Context context, int text, OnCheckedChangeListener onCheckedChangeListener, ViewGroup parent) {
-        super(context);
-        setOrientation(HORIZONTAL);
-        fCheckbox = new AppCompatImageView(context);
-        fTextView = new AppCompatTextView(context);
-        addView(fCheckbox);
-        addView(fTextView);
-        fTextView.setText(text);
-        parent.addView(this);
-        setOnClickListener(view -> toggle());
-        setChecked(false);
+    public Checkbox(Context ctx) {
+        super(ctx);
+        LayoutInflater.from(ctx).inflate(R.layout.checkbox, this, true);
+        fCheckbox = findViewById(R.id.checkbox_check);
+        fTextView = findViewById(R.id.checkbox_label);
+    }
+
+    public Checkbox(Context ctx, AttributeSet attrs) {
+        super(ctx, attrs);
+        LayoutInflater.from(ctx).inflate(R.layout.checkbox, this, true);
+        fCheckbox = findViewById(R.id.checkbox_check);
+        fTextView = findViewById(R.id.checkbox_label);
+
+        final String textAttribute = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.Checkbox, 0, 0).getString(R.styleable.Checkbox_text);
+        if (textAttribute != null)
+            fTextView.setText(textAttribute);
+    }
+
+    public Checkbox(Context ctx, AttributeSet attrs, int style) {
+        super(ctx, attrs, style);
+        LayoutInflater.from(ctx).inflate(R.layout.checkbox, this, true);
+        fCheckbox = findViewById(R.id.checkbox_check);
+        fTextView = findViewById(R.id.checkbox_label);
+
+        final String textAttribute = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.Checkbox, 0, 0).getString(R.styleable.Checkbox_text);
+        if (textAttribute != null)
+            fTextView.setText(textAttribute);
+    }
+
+    public Checkbox SetOnCheckedChangeListener(OnCheckedChangeListener onCheckedChangeListener) {
         fCheckedChangeListener = onCheckedChangeListener;
+        return this;
     }
 
     private void SetIcon() {

+ 15 - 6
app/src/main/res/layout/activity_accessibility.xml

@@ -1,17 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
-<info.knacki.pass.services.AccessibilityView xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
+<android.support.v7.widget.LinearLayoutCompat xmlns:tools="http://schemas.android.com/tools"
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:background="@color/inputBackground"
     android:orientation="vertical"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_height="wrap_content"
     tools:context="info.knacki.pass.services.AccessibilityView">
     <ScrollView
         android:id="@+id/passwordListContainer"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:minHeight="@dimen/keyboard_min_height"
-        android:maxHeight="@dimen/keyboard_max_height"
-        />
-</info.knacki.pass.services.AccessibilityView>
+        android:maxHeight="@dimen/keyboard_max_height">
+        <info.knacki.pass.ui.passwordList.PasswordListView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:id="@+id/password_list"/>
+    </ScrollView>
+    <android.support.v7.widget.AppCompatButton
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/cancel"
+        android:text="@string/cancel"
+        style="@style/Widget.AppCompat.Button.ButtonBar.AlertDialog"/>
+</android.support.v7.widget.LinearLayoutCompat>

+ 6 - 1
app/src/main/res/layout/activity_pass_list.xml

@@ -12,7 +12,12 @@
     <ScrollView
         android:id="@+id/passwordListContainer"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent">
+        <info.knacki.pass.ui.passwordList.EditablePasswordListView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:id="@+id/password_list"/>
+    </ScrollView>
 </LinearLayout>
 
 </android.support.constraint.ConstraintLayout>

+ 14 - 0
app/src/main/res/layout/checkbox.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.LinearLayoutCompat
+    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
+    <android.support.v7.widget.AppCompatImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/checkbox_check"/>
+    <android.support.v7.widget.AppCompatTextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:id="@+id/checkbox_label"/>
+</android.support.v7.widget.LinearLayoutCompat>

+ 4 - 0
app/src/main/res/layout/input.xml

@@ -70,6 +70,10 @@
         android:layout_width="match_parent"
         android:layout_height="1dp"
         android:background="@color/colorSeparator"/>
+    <info.knacki.pass.services.AccessibilityView
+        android:id="@+id/accessibility"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
 </LinearLayout>
 
 </android.support.constraint.ConstraintLayout>

+ 43 - 0
app/src/main/res/layout/password_generator_wizard.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    xmlns:knacki="http://schemas.android.com/apk/res-auto"
+    android:orientation="vertical">
+    <android.support.v7.widget.LinearLayoutCompat
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+        <android.support.v7.widget.AppCompatTextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" android:text="@string/generate_difficulty"/>
+        <android.support.v7.widget.AppCompatSpinner
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:id="@+id/difficulty"/>
+    </android.support.v7.widget.LinearLayoutCompat>
+    <info.knacki.pass.ui.widget.Checkbox
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/generate_numbers"
+        knacki:text="@string/generate_number"/>
+    <info.knacki.pass.ui.widget.Checkbox
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/generate_alpha"
+        knacki:text="@string/generate_alpha"/>
+    <info.knacki.pass.ui.widget.Checkbox
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/generate_capitalize"
+        knacki:text="@string/generate_capitalize"/>
+    <info.knacki.pass.ui.widget.Checkbox
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/generate_special"
+        knacki:text="@string/generate_special"/>
+    <NumberPicker
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/length"/>
+</android.support.v7.widget.LinearLayoutCompat>

+ 6 - 0
app/src/main/res/values/checkbox_attrs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="Checkbox">
+        <attr name="text" format="string" />
+    </declare-styleable>
+</resources>