Browse Source

[tmp] WIP / settings activity

isundil 7 years ago
parent
commit
4ee48e0980
26 changed files with 392 additions and 337 deletions
  1. 1 1
      .idea/misc.xml
  2. 1 1
      app/src/main/AndroidManifest.xml
  3. 1 1
      app/src/main/java/info/knacki/pass/input/InputService.java
  4. 27 2
      app/src/main/java/info/knacki/pass/io/FileInterfaceFactory.java
  5. 26 0
      app/src/main/java/info/knacki/pass/io/FingerprintFileInterface.java
  6. 26 0
      app/src/main/java/info/knacki/pass/io/GPGFileInterface.java
  7. 24 0
      app/src/main/java/info/knacki/pass/io/PasswordFileInterface.java
  8. 98 0
      app/src/main/java/info/knacki/pass/settings/SettingsManager.java
  9. 89 113
      app/src/main/java/info/knacki/pass/settings/ui/SettingsActivity.java
  10. 2 2
      app/src/main/java/info/knacki/pass/ui/EditPasswordActivity.java
  11. 3 2
      app/src/main/java/info/knacki/pass/ui/MainActivity.java
  12. 8 1
      app/src/main/java/info/knacki/pass/ui/PasswordView.java
  13. 0 37
      app/src/main/res/drawable/ic_fingerprint.xml
  14. 0 9
      app/src/main/res/drawable/ic_notifications_black_24dp.xml
  15. 0 9
      app/src/main/res/drawable/ic_sync_black_24dp.xml
  16. 1 1
      app/src/main/res/layout/input.xml
  17. 18 1
      app/src/main/res/values-fr/lang.xml
  18. 18 1
      app/src/main/res/values/lang.xml
  19. 8 67
      app/src/main/res/values/strings.xml
  20. 1 1
      app/src/main/res/xml/method.xml
  21. 0 21
      app/src/main/res/xml/pref_data_sync.xml
  22. 14 0
      app/src/main/res/xml/pref_encryption.xml
  23. 1 31
      app/src/main/res/xml/pref_general.xml
  24. 6 9
      app/src/main/res/xml/pref_headers.xml
  25. 0 27
      app/src/main/res/xml/pref_notification.xml
  26. 19 0
      app/src/main/res/xml/pref_vcs.xml

+ 1 - 1
.idea/misc.xml

@@ -25,7 +25,7 @@
       </value>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -34,7 +34,7 @@
 
         <activity
             android:name=".settings.ui.SettingsActivity"
-            android:label="@string/title_activity_settings"
+            android:label="@string/settings"
             android:parentActivityName=".ui.MainActivity">
             <meta-data
                 android:name="android.support.PARENT_ACTIVITY"

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

@@ -61,7 +61,7 @@ public class InputService extends InputMethodService implements PasswordClickLis
     @Override
     public void OnPasswordClicked(File f) {
         try {
-            String passwordContent = FileInterfaceFactory.GetFileInterface(f).ReadFile();
+            String passwordContent = FileInterfaceFactory.GetFileInterface(this, f).ReadFile();
             for (char i: passwordContent.toCharArray()) {
                 sendKeyChar(i);
             }

+ 27 - 2
app/src/main/java/info/knacki/pass/io/FileInterfaceFactory.java

@@ -1,8 +1,33 @@
 package info.knacki.pass.io;
 
+import android.content.Context;
+
 import java.io.File;
 
+import info.knacki.pass.settings.SettingsManager;
+
 public class FileInterfaceFactory {
-    public static IFileInterface GetFileInterface(File f)
-    { return new RawFileInterface(f); }
+    public final static String FINGERPRINT_SUFFIX = ".fck";
+    public final static String PASSWORD_SUFFIX = ".enc";
+    public final static String GPG_SUFFIX = ".gpg";
+
+    public static IFileInterface GetFileInterface(Context ctx, File f) {
+        if (f.getName().endsWith(FINGERPRINT_SUFFIX))
+            return new FingerprintFileInterface(ctx, f);
+        else if (f.getName().endsWith(PASSWORD_SUFFIX))
+            return new PasswordFileInterface(f);
+        else if (f.getName().endsWith(GPG_SUFFIX))
+            return new GPGFileInterface(ctx, f);
+        return new RawFileInterface(f);
+    }
+
+    public static String GetExtension(SettingsManager.EncryptionType type) {
+        if (SettingsManager.EncryptionType.TYPE_FINGERPRINT.equals(type))
+            return FINGERPRINT_SUFFIX;
+        else if (SettingsManager.EncryptionType.TYPE_PASSWORD.equals(type))
+            return PASSWORD_SUFFIX;
+        else if (SettingsManager.EncryptionType.TYPE_GPG.equals(type))
+            return GPG_SUFFIX;
+        return "";
+    }
 }

+ 26 - 0
app/src/main/java/info/knacki/pass/io/FingerprintFileInterface.java

@@ -0,0 +1,26 @@
+package info.knacki.pass.io;
+
+import android.content.Context;
+
+import java.io.File;
+import java.io.IOException;
+
+class FingerprintFileInterface implements IFileInterface {
+    private final File fFile;
+
+    FingerprintFileInterface(Context c, File f) {
+        fFile = f;
+    }
+
+    @Override
+    public String ReadFile() throws IOException {
+        //FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void WriteFile(String content) throws IOException {
+        //FIXME
+        throw new UnsupportedOperationException();
+    }
+}

+ 26 - 0
app/src/main/java/info/knacki/pass/io/GPGFileInterface.java

@@ -0,0 +1,26 @@
+package info.knacki.pass.io;
+
+import android.content.Context;
+
+import java.io.File;
+import java.io.IOException;
+
+class GPGFileInterface implements IFileInterface {
+    private final File fFile;
+
+    GPGFileInterface(Context ctx, File f) {
+        fFile = f;
+    }
+
+    @Override
+    public String ReadFile() throws IOException {
+        //FIXME
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void WriteFile(String content) throws IOException {
+        //FIXME
+        throw new UnsupportedOperationException();
+    }
+}

+ 24 - 0
app/src/main/java/info/knacki/pass/io/PasswordFileInterface.java

@@ -0,0 +1,24 @@
+package info.knacki.pass.io;
+
+import java.io.File;
+import java.io.IOException;
+
+class PasswordFileInterface implements IFileInterface {
+    private final File fFile;
+
+    PasswordFileInterface(File f) {
+        fFile = f;
+    }
+
+    @Override
+    public String ReadFile() throws IOException {
+        throw new UnsupportedOperationException();
+        //FIXME
+    }
+
+    @Override
+    public void WriteFile(String content) throws IOException {
+        throw new UnsupportedOperationException();
+        //FIXME
+    }
+}

+ 98 - 0
app/src/main/java/info/knacki/pass/settings/SettingsManager.java

@@ -0,0 +1,98 @@
+package info.knacki.pass.settings;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class SettingsManager {
+    public static class EncryptionType {
+        public static final EncryptionType TYPE_RAW = new EncryptionType(0);
+        public static final EncryptionType TYPE_FINGERPRINT = new EncryptionType(1);
+        public static final EncryptionType TYPE_GPG = new EncryptionType(2);
+        public static final EncryptionType TYPE_PASSWORD = new EncryptionType(3);
+
+        private final int fType;
+
+        private EncryptionType(int type) {
+            fType = type;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            return obj != null && obj.getClass().equals(getClass()) && fType == ((EncryptionType)obj).fType;
+        }
+
+        public int IntValue() {
+            return fType;
+        }
+
+        public static EncryptionType FromInt(int i) {
+            if (i == TYPE_RAW.fType)
+                return TYPE_RAW;
+            else if (i == TYPE_FINGERPRINT.fType)
+                return TYPE_FINGERPRINT;
+            else if (i == TYPE_PASSWORD.fType)
+                return TYPE_PASSWORD;
+            else if (i == TYPE_GPG.fType)
+                return TYPE_GPG;
+            return TYPE_RAW;
+        }
+    }
+
+    public static abstract class VCS {
+        public static VCS factory(String system, String data) {
+            Logger.getAnonymousLogger().log(Level.WARNING, "System : " +system +", data: " +data);
+            if ("git".equals(system))
+                return new Git(data);
+            return null;
+        }
+
+        public abstract String GetName();
+        public abstract String GetData();
+    }
+
+    public static class Git extends VCS {
+        Git(String data) {
+        }
+
+        public Git() {
+        }
+
+        public String GetName() {
+            return "git";
+        }
+        public String GetData() {
+            return "";
+        }
+    }
+
+    private final static String SHARED_PREF_FILE = "pass_prefs";
+
+    private static SharedPreferences GetPrefManager(Context c) {
+        return c.getSharedPreferences(SHARED_PREF_FILE, Context.MODE_PRIVATE);
+    }
+
+    public static EncryptionType GetDefaultEncryptionType(Context ctx) {
+        return EncryptionType.FromInt(GetPrefManager(ctx).getInt(EncryptionType.class.getSimpleName(), EncryptionType.TYPE_RAW.fType));
+    }
+
+    public static void SetDefaultEncryptionType(Context ctx, EncryptionType value) {
+        GetPrefManager(ctx).edit().putInt(EncryptionType.class.getSimpleName(), value.IntValue()).commit();
+    }
+
+    public static VCS GetVCS(Context ctx) {
+        SharedPreferences prefs = GetPrefManager(ctx);
+        return VCS.factory(prefs.getString(VCS.class.getSimpleName(), ""), prefs.getString(VCS.class.getSimpleName()+"_data", ""));
+    }
+
+    public static void SetVCS(Context ctx, VCS vcs) {
+        final SharedPreferences.Editor prefs = GetPrefManager(ctx).edit();
+        Logger.getAnonymousLogger().log(Level.WARNING, "save System : " +(vcs == null ? "null" : vcs.GetName()));
+        if (vcs != null)
+            prefs.putString(VCS.class.getSimpleName(), vcs.GetName()).putString(VCS.class.getSimpleName()+"_data", vcs.GetData()).commit();
+        else
+            prefs.remove(VCS.class.getSimpleName()).commit();
+    }
+}

+ 89 - 113
app/src/main/java/info/knacki/pass/settings/ui/SettingsActivity.java

@@ -4,25 +4,23 @@ import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
+import android.preference.SwitchPreference;
 import android.support.v7.app.ActionBar;
 import android.preference.PreferenceFragment;
-import android.preference.PreferenceManager;
-import android.preference.RingtonePreference;
-import android.text.TextUtils;
 import android.view.MenuItem;
 import android.support.v4.app.NavUtils;
 
 import info.knacki.pass.R;
+import info.knacki.pass.settings.SettingsManager;
 
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * A {@link PreferenceActivity} that presents a set of application settings. On
@@ -37,58 +35,6 @@ import java.util.List;
  */
 public class SettingsActivity extends AppCompatPreferenceActivity {
 
-    /**
-     * A preference value change listener that updates the preference's summary
-     * to reflect its new value.
-     */
-    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
-        @Override
-        public boolean onPreferenceChange(Preference preference, Object value) {
-            String stringValue = value.toString();
-
-            if (preference instanceof ListPreference) {
-                // For list preferences, look up the correct display value in
-                // the preference's 'entries' list.
-                ListPreference listPreference = (ListPreference) preference;
-                int index = listPreference.findIndexOfValue(stringValue);
-
-                // Set the summary to reflect the new value.
-                preference.setSummary(
-                        index >= 0
-                                ? listPreference.getEntries()[index]
-                                : null);
-
-            } else if (preference instanceof RingtonePreference) {
-                // For ringtone preferences, look up the correct display value
-                // using RingtoneManager.
-                if (TextUtils.isEmpty(stringValue)) {
-                    // Empty values correspond to 'silent' (no ringtone).
-                    preference.setSummary(R.string.pref_ringtone_silent);
-
-                } else {
-                    Ringtone ringtone = RingtoneManager.getRingtone(
-                            preference.getContext(), Uri.parse(stringValue));
-
-                    if (ringtone == null) {
-                        // Clear the summary if there was a lookup error.
-                        preference.setSummary(null);
-                    } else {
-                        // Set the summary to reflect the new ringtone display
-                        // name.
-                        String name = ringtone.getTitle(preference.getContext());
-                        preference.setSummary(name);
-                    }
-                }
-
-            } else {
-                // For all other preferences, set the summary to the value's
-                // simple string representation.
-                preference.setSummary(stringValue);
-            }
-            return true;
-        }
-    };
-
     /**
      * Helper method to determine if the device has an extra-large screen. For
      * example, 10" tablets are extra-large.
@@ -98,27 +44,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
                 & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
     }
 
-    /**
-     * Binds a preference's summary to its value. More specifically, when the
-     * preference's value is changed, its summary (line of text below the
-     * preference title) is updated to reflect the value. The summary is also
-     * immediately updated upon calling this method. The exact display format is
-     * dependent on the type of preference.
-     *
-     * @see #sBindPreferenceSummaryToValueListener
-     */
-    private static void bindPreferenceSummaryToValue(Preference preference) {
-        // Set the listener to watch for value changes.
-        preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
-
-        // Trigger the listener immediately with the preference's
-        // current value.
-        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
-                PreferenceManager
-                        .getDefaultSharedPreferences(preference.getContext())
-                        .getString(preference.getKey(), ""));
-    }
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -172,14 +97,10 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
     protected boolean isValidFragment(String fragmentName) {
         return PreferenceFragment.class.getName().equals(fragmentName)
                 || GeneralPreferenceFragment.class.getName().equals(fragmentName)
-                || DataSyncPreferenceFragment.class.getName().equals(fragmentName)
-                || NotificationPreferenceFragment.class.getName().equals(fragmentName);
+                || EncryptionPreferenceFragment.class.getName().equals(fragmentName)
+                || VCSPreferenceFragment.class.getName().equals(fragmentName);
     }
 
-    /**
-     * This fragment shows general preferences only. It is used when the
-     * activity is showing a two-pane settings UI.
-     */
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
     public static class GeneralPreferenceFragment extends PreferenceFragment {
         @Override
@@ -188,12 +109,13 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
             addPreferencesFromResource(R.xml.pref_general);
             setHasOptionsMenu(true);
 
-            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
-            // to their values. When their values change, their summaries are
-            // updated to reflect the new value, per the Android Design
-            // guidelines.
-            bindPreferenceSummaryToValue(findPreference("example_text"));
-            bindPreferenceSummaryToValue(findPreference("example_list"));
+            findPreference(getResources().getString(R.string.id_softSettings)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+                @Override
+                public boolean onPreferenceClick(Preference preference) {
+                    //FIXME
+                    return true;
+                }
+            });
         }
 
         @Override
@@ -207,23 +129,27 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
         }
     }
 
-    /**
-     * This fragment shows notification preferences only. It is used when the
-     * activity is showing a two-pane settings UI.
-     */
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
-    public static class NotificationPreferenceFragment extends PreferenceFragment {
+    public static class EncryptionPreferenceFragment extends PreferenceFragment {
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
-            addPreferencesFromResource(R.xml.pref_notification);
+            addPreferencesFromResource(R.xml.pref_encryption);
             setHasOptionsMenu(true);
 
-            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
-            // to their values. When their values change, their summaries are
-            // updated to reflect the new value, per the Android Design
-            // guidelines.
-            bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
+            ListPreference encTypePref = (ListPreference) findPreference(getResources().getString(R.string.id_enctype));
+            final int encTypeIndex = SettingsManager.GetDefaultEncryptionType(getActivity()).IntValue();
+            encTypePref.setSummary(encTypePref.getEntries()[encTypeIndex]);
+            encTypePref.setValueIndex(encTypeIndex);
+            encTypePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object o) {
+                    int value = Integer.parseInt(o.toString());
+                    preference.setSummary(((ListPreference) preference).getEntries()[value]);
+                    SettingsManager.SetDefaultEncryptionType(getActivity(), SettingsManager.EncryptionType.FromInt(value));
+                    return true;
+                }
+            });
         }
 
         @Override
@@ -237,23 +163,73 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
         }
     }
 
-    /**
-     * This fragment shows data and sync preferences only. It is used when the
-     * activity is showing a two-pane settings UI.
-     */
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
-    public static class DataSyncPreferenceFragment extends PreferenceFragment {
+    public static class VCSPreferenceFragment extends PreferenceFragment {
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
-            addPreferencesFromResource(R.xml.pref_data_sync);
+            addPreferencesFromResource(R.xml.pref_vcs);
             setHasOptionsMenu(true);
 
-            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
-            // to their values. When their values change, their summaries are
-            // updated to reflect the new value, per the Android Design
-            // guidelines.
-            bindPreferenceSummaryToValue(findPreference("sync_frequency"));
+            abstract class PrefListener implements Preference.OnPreferenceChangeListener {
+                @Override
+                public boolean onPreferenceChange(Preference preference, Object o) {
+                    savePref(preference, o);
+                    VCSPreferenceFragment.this.reload();
+                    return true;
+                }
+
+                abstract void savePref(Preference preference, Object o);
+            }
+
+            findPreference(getResources().getString(R.string.id_vcs_enable)).setOnPreferenceChangeListener(new PrefListener() {
+                @Override
+                void savePref(Preference preference, Object o) {
+                    if ((Boolean)o)
+                        SettingsManager.SetVCS(getActivity(), new SettingsManager.Git());
+                    else
+                        SettingsManager.SetVCS(getActivity(), null);
+                }
+            });
+            findPreference(getResources().getString(R.string.id_vcs_list)).setOnPreferenceChangeListener(new PrefListener() {
+                @Override
+                void savePref(Preference preference, Object o) {
+                    SettingsManager.VCS vcs = SettingsManager.GetVCS(getActivity());
+                    SettingsManager.VCS newVcs;
+
+                    switch (Integer.parseInt((String) o)) {
+                        case 0:
+                            newVcs = new SettingsManager.Git();
+                            break;
+                        default:
+                            return;
+                    }
+                    if (!vcs.GetName().equals(newVcs.GetName())) {
+                        SettingsManager.SetVCS(getActivity(), newVcs);
+                    }
+                }
+            });
+
+            reload();
+        }
+
+        protected void reload() {
+            SettingsManager.VCS versioning = SettingsManager.GetVCS(getActivity());
+
+            if (versioning != null) {
+                ((SwitchPreference) findPreference(getResources().getString(R.string.id_vcs_enable))).setChecked(true);
+                ListPreference vcsType = (ListPreference) findPreference(getResources().getString(R.string.id_vcs_list));
+                vcsType.setEnabled(true);
+                if (versioning instanceof SettingsManager.Git) {
+                    vcsType.setValueIndex(0);
+                    vcsType.setSummary(vcsType.getEntries()[0]);
+                }
+            } else {
+                ((SwitchPreference) findPreference(getResources().getString(R.string.id_vcs_enable))).setChecked(false);
+                ListPreference vcsType = (ListPreference) findPreference(getResources().getString(R.string.id_vcs_list));
+                vcsType.setEnabled(false);
+                vcsType.setSummary("");
+            }
         }
 
         @Override

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

@@ -47,7 +47,7 @@ public class EditPasswordActivity extends AppCompatActivity {
             @Override
             public void onClick(View view) {
                 try {
-                    FileInterfaceFactory.GetFileInterface(fOutputFile).WriteFile(fTextEdit.getText().toString());
+                    FileInterfaceFactory.GetFileInterface(EditPasswordActivity.this, fOutputFile).WriteFile(fTextEdit.getText().toString());
                 }
                 catch (IOException e) {
                     Toast.makeText(EditPasswordActivity.this, "Error: " +e.getMessage(), Toast.LENGTH_LONG).show();
@@ -66,7 +66,7 @@ public class EditPasswordActivity extends AppCompatActivity {
 
     protected void populateContent(boolean requestFocus) {
         try {
-            String pass = FileInterfaceFactory.GetFileInterface(fOutputFile).ReadFile();
+            String pass = FileInterfaceFactory.GetFileInterface(this, fOutputFile).ReadFile();
             fTextEdit.setText(pass);
             if (requestFocus) {
                 fTextEdit.setSelection(pass.length());

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

@@ -20,6 +20,7 @@ import info.knacki.pass.generator.PasswordGenerator;
 import info.knacki.pass.generator.ui.PasswordGeneratorWizard;
 import info.knacki.pass.io.FileInterfaceFactory;
 import info.knacki.pass.io.IFileInterface;
+import info.knacki.pass.settings.SettingsManager;
 import info.knacki.pass.settings.ui.SettingsActivity;
 
 public class MainActivity extends AppCompatActivity implements PasswordClickListener {
@@ -77,7 +78,7 @@ public class MainActivity extends AppCompatActivity implements PasswordClickList
                             Toast.makeText(MainActivity.this, "Error: Empty file name", Toast.LENGTH_LONG).show();
                             return;
                         }
-                        File f = new File(vPasswordListView.fCurrentDir +"/" +filename);
+                        File f = new File(vPasswordListView.fCurrentDir +"/" +filename +FileInterfaceFactory.GetExtension(SettingsManager.GetDefaultEncryptionType(MainActivity.this)));
                         try {
                             f.createNewFile();
                             vPasswordListView.refresh();
@@ -151,7 +152,7 @@ public class MainActivity extends AppCompatActivity implements PasswordClickList
             .setPositiveButton(R.string.add, new AlertText.OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialogInterface, View view) {
-                    IFileInterface writer = FileInterfaceFactory.GetFileInterface(f);
+                    IFileInterface writer = FileInterfaceFactory.GetFileInterface(MainActivity.this, f);
                     try {
                         writer.WriteFile(PasswordGenerator.generate(wiz));
                     }

+ 8 - 1
app/src/main/java/info/knacki/pass/ui/PasswordView.java

@@ -21,6 +21,13 @@ public class PasswordView extends LinearLayout {
     public static int TYPE_PARENT = 2;
     public static int TYPE_PASSWORD = 4;
 
+    protected static String trimExtension(String in) {
+        int lastIndex = in.lastIndexOf('.');
+        if (lastIndex >= Math.max(in.length() -5, 0))
+            return in.substring(0, lastIndex);
+        return in;
+    }
+
     public PasswordView(Context ctx, int type, String name) {
         super(ctx);
         vIcon = new ImageView(ctx);
@@ -36,7 +43,7 @@ public class PasswordView extends LinearLayout {
         vName = new TextView(ctx);
         vName.setHeight(ICON_SIZE);
         vName.setGravity(Gravity.CENTER_VERTICAL);
-        vName.setText(name);
+        vName.setText(trimExtension(name));
         addView(vName);
         setClickable(true);
     }

+ 0 - 37
app/src/main/res/drawable/ic_fingerprint.xml

@@ -1,37 +0,0 @@
-<!--
-  ~ Copyright (C) 2015 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License
-  -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24.0dp"
-        android:height="24.0dp"
-        android:tint="?attr/colorControlNormal"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#ffffff"
-        android:pathData="M17.5,4.47c-0.08,0.0 -0.16,-0.02 -0.24,-0.06C15.45,3.42 13.88,3.0 12.01,3.0c-1.87,0.0 -3.64,0.47 -5.25,1.4C6.52,4.54 6.22,4.46 6.08,4.22C5.94,3.98 6.02,3.67 6.26,3.54C8.03,2.52 9.96,2.0 12.01,2.0c2.02,0.0 3.79,0.47 5.73,1.53c0.24,0.13 0.33,0.44 0.2,0.68C17.85,4.38 17.68,4.47 17.5,4.47z"/>
-    <path
-        android:fillColor="#ffffff"
-        android:pathData="M3.95,9.72c-0.1,0.0 -0.19,-0.03 -0.28,-0.08C3.44,9.48 3.38,9.17 3.54,8.94c0.94,-1.4 2.14,-2.5 3.56,-3.28c2.99,-1.63 6.82,-1.63 9.81,-0.01c1.42,0.77 2.61,1.87 3.56,3.26c0.15,0.23 0.09,0.54 -0.13,0.69c-0.23,0.16 -0.54,0.09 -0.69,-0.13c-0.85,-1.26 -1.93,-2.24 -3.2,-2.94c-2.7,-1.47 -6.16,-1.46 -8.86,0.01C6.3,7.24 5.22,8.23 4.37,9.5C4.27,9.64 4.11,9.72 3.95,9.72z"/>
-    <path
-        android:fillColor="#ffffff"
-        android:pathData="M9.86,21.79c-0.13,0.0 -0.27,-0.05 -0.36,-0.16c-0.82,-0.87 -1.26,-1.43 -1.9,-2.63c-0.65,-1.23 -1.0,-2.73 -1.0,-4.33c0.0,-2.97 2.42,-5.39 5.39,-5.39s5.39,2.42 5.39,5.39c0.0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0.0,-2.42 -1.97,-4.39 -4.39,-4.39S7.6,12.24 7.6,14.66c0.0,1.44 0.3,2.78 0.88,3.86c0.61,1.15 1.02,1.64 1.75,2.42c0.19,0.2 0.18,0.52 -0.02,0.71C10.11,21.74 9.98,21.79 9.86,21.79z"/>
-    <path
-        android:fillColor="#ffffff"
-        android:pathData="M16.7,19.94c-1.14,0.0 -2.13,-0.3 -2.96,-0.89c-1.41,-1.01 -2.25,-2.65 -2.25,-4.38c0.0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0.0,1.41 0.69,2.75 1.83,3.57c0.66,0.48 1.44,0.71 2.38,0.71c0.23,0.0 0.6,-0.02 0.98,-0.1c0.27,-0.05 0.53,0.13 0.58,0.4c0.05,0.27 -0.13,0.53 -0.4,0.58C17.3,19.93 16.83,19.94 16.7,19.94z"/>
-    <path
-        android:fillColor="#ffffff"
-        android:pathData="M14.76,22.0c-0.05,0.0 -0.09,-0.01 -0.14,-0.02c-1.51,-0.44 -2.51,-1.03 -3.53,-2.11c-1.32,-1.39 -2.05,-3.24 -2.05,-5.21c0.0,-1.62 1.32,-2.94 2.94,-2.94c1.62,0.0 2.94,1.32 2.94,2.94c0.0,1.07 0.87,1.94 1.94,1.94s1.94,-0.87 1.94,-1.94c0.0,-3.77 -3.07,-6.83 -6.83,-6.83c-2.68,0.0 -5.12,1.58 -6.23,4.02c-0.37,0.81 -0.56,1.76 -0.56,2.81c0.0,0.78 0.07,2.01 0.63,3.61c0.09,0.26 -0.04,0.55 -0.3,0.64c-0.26,0.09 -0.55,-0.04 -0.64,-0.3c-0.46,-1.31 -0.69,-2.6 -0.69,-3.95c0.0,-1.2 0.22,-2.28 0.65,-3.23c1.27,-2.8 4.07,-4.61 7.14,-4.61c4.32,0.0 7.83,3.51 7.83,7.83c0.0,1.62 -1.32,2.94 -2.94,2.94c-1.62,0.0 -2.94,-1.32 -2.94,-2.94c0.0,-1.07 -0.87,-1.94 -1.94,-1.94s-1.94,0.87 -1.94,1.94c0.0,1.71 0.63,3.32 1.77,4.52c0.9,0.95 1.74,1.45 3.08,1.84c0.27,0.08 0.42,0.35 0.34,0.62C15.18,21.86 14.98,22.0 14.76,22.0z"/>
-</vector>

+ 0 - 9
app/src/main/res/drawable/ic_notifications_black_24dp.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportHeight="24.0"
-    android:viewportWidth="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M11.5,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zm6.5,-6v-5.5c0,-3.07 -2.13,-5.64 -5,-6.32V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5v0.68c-2.87,0.68 -5,3.25 -5,6.32V16l-2,2v1h17v-1l-2,-2z" />
-</vector>

+ 0 - 9
app/src/main/res/drawable/ic_sync_black_24dp.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportHeight="24.0"
-    android:viewportWidth="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01,-0.25 1.97,-0.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0,-4.42,-3.58,-8,-8,-8zm0 14c-3.31 0,-6,-2.69,-6,-6 0,-1.01,0.25,-1.97,0.7,-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4,-4,-4,-4v3z" />
-</vector>

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

@@ -23,7 +23,7 @@
             android:layout_height="wrap_content"
             android:clickable="true"
             android:focusable="true"
-            android:text="@string/prev"
+            android:text="@string/ChangeKeyboard"
             android:layout_weight="0.5"
             android:textStyle="bold" />
         <View

+ 18 - 1
app/src/main/res/values-fr/lang.xml

@@ -16,8 +16,25 @@
     <string name="edit_ShowPassword">Montrer le mot de passe</string>
     <string name="edit_Save">Sauvegarder</string>
     <string name="cancel">Annuler</string>
-    <string name="prev">Précedent</string>
+    <string name="ChangeKeyboard">Revenir au clavier</string>
     <string name="settings">Configuration</string>
+    <string name="pref_title_system_keyboard_settings">Paramètres système du clavier</string>
+    <string name="pref_header_general">Général</string>
+    <string name="pref_header_Encryption">Chiffrement</string>
+    <string name="pref_header_VCS">VCS</string>
+    <string name="pref_title_enctype">Méthode de chiffrement</string>
+    <array name="pref_enctype_title">
+        <item>Pas de chiffrement</item>
+        <item>Empreinte digitale</item>
+        <item>GPG</item>
+        <item>Mot de passe</item>
+    </array>
+    <string name="pref_vcs_title">Autoriser la gestion de version</string>
+    <string name="pref_vcs_enable">pref_vcs_enable</string>
+    <string name="pref_vcs_list_title">Outil de gestion de version</string>
+    <array name="pref_vcs_list_keys">
+        <item>GIT</item>
+    </array>
     <array name="fDifficulty">
         <item>Code PIN</item>
         <item>Faible</item>

+ 18 - 1
app/src/main/res/values/lang.xml

@@ -16,8 +16,25 @@
     <string name="edit_ShowPassword">Show password</string>
     <string name="edit_Save">Save</string>
     <string name="cancel">Cancel</string>
-    <string name="prev">Previous</string>
+    <string name="ChangeKeyboard">Change keyboard</string>
     <string name="settings">Settings</string>
+    <string name="pref_title_system_keyboard_settings">Keyboard system settings</string>
+    <string name="pref_header_general">General</string>
+    <string name="pref_header_Encryption">Encryption</string>
+    <string name="pref_header_VCS">VCS</string>
+    <string name="pref_title_enctype">Encryption type</string>
+    <array name="pref_enctype_title">
+        <item>No encryption</item>
+        <item>Fingerprint</item>
+        <item>GPG</item>
+        <item>Password</item>
+    </array>
+    <string name="pref_vcs_title">Enable password versioning</string>
+    <string name="pref_vcs_enable">pref_vcs_enable</string>
+    <string name="pref_vcs_list_title">Versioning tool</string>
+    <array name="pref_vcs_list_keys">
+        <item>GIT</item>
+    </array>
     <array name="fDifficulty">
         <item>Number PIN</item>
         <item>Weak</item>

+ 8 - 67
app/src/main/res/values/strings.xml

@@ -1,77 +1,18 @@
 <resources>
     <string name="app_name">pass</string>
     <string name="data_dir_name">pass</string>
-    <string name="title_activity_settings">Settings</string>
 
-    <!-- Strings related to Settings -->
-
-    <!-- Example General settings -->
-    <string name="pref_header_general">General</string>
-
-    <string name="pref_title_social_recommendations">Enable social recommendations</string>
-    <string name="pref_description_social_recommendations">Recommendations for people to contact
-        based on your message history
-    </string>
-
-    <string name="pref_title_display_name">Display name</string>
-    <string name="pref_default_display_name">John Smith</string>
-
-    <string name="pref_title_add_friends_to_messages">Add friends to messages</string>
-    <string-array name="pref_example_list_titles">
-        <item>Always</item>
-        <item>When possible</item>
-        <item>Never</item>
-    </string-array>
-    <string-array name="pref_example_list_values">
-        <item>1</item>
+    <string-array name="pref_enctype_values">
         <item>0</item>
-        <item>-1</item>
-    </string-array>
-
-    <!-- Example settings for Data & Sync -->
-    <string name="pref_header_data_sync">Data &amp; sync</string>
-
-    <string name="pref_title_sync_frequency">Sync frequency</string>
-    <string-array name="pref_sync_frequency_titles">
-        <item>15 minutes</item>
-        <item>30 minutes</item>
-        <item>1 hour</item>
-        <item>3 hours</item>
-        <item>6 hours</item>
-        <item>Never</item>
-    </string-array>
-    <string-array name="pref_sync_frequency_values">
-        <item>15</item>
-        <item>30</item>
-        <item>60</item>
-        <item>180</item>
-        <item>360</item>
-        <item>-1</item>
-    </string-array>
-
-    <string-array name="list_preference_entries">
-        <item>Entry 1</item>
-        <item>Entry 2</item>
-        <item>Entry 3</item>
-    </string-array>
-
-    <string-array name="list_preference_entry_values">
         <item>1</item>
         <item>2</item>
         <item>3</item>
     </string-array>
-
-    <string-array name="multi_select_list_preference_default_value" />
-
-    <string name="pref_title_system_sync_settings">System sync settings</string>
-
-    <!-- Example settings for Notifications -->
-    <string name="pref_header_notifications">Notifications</string>
-
-    <string name="pref_title_new_message_notifications">New message notifications</string>
-
-    <string name="pref_title_ringtone">Ringtone</string>
-    <string name="pref_ringtone_silent">Silent</string>
-
-    <string name="pref_title_vibrate">Vibrate</string>
+    <string-array name="pref_vcs_list_values">
+        <item>0</item>
+    </string-array>
+    <string name="id_softSettings">id_softSettings</string>
+    <string name="id_enctype">id_enctype</string>
+    <string name="id_vcs_enable">id_vcs_enable</string>
+    <string name="id_vcs_list">id_vcs_list</string>
 </resources>

+ 1 - 1
app/src/main/res/xml/method.xml

@@ -1,3 +1,3 @@
 <input-method xmlns:android="http://schemas.android.com/apk/res/android">
-    <subtype android:imeSubtypeMode="keyboard" />
+    <subtype android:imeSubtypeMode="keyboard" android:settingsActivity="info.knacki.pass.settings.ui.SettingsActivity" />
 </input-method>

+ 0 - 21
app/src/main/res/xml/pref_data_sync.xml

@@ -1,21 +0,0 @@
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
-         dismiss it. -->
-    <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
-    <ListPreference
-        android:defaultValue="180"
-        android:entries="@array/pref_sync_frequency_titles"
-        android:entryValues="@array/pref_sync_frequency_values"
-        android:key="sync_frequency"
-        android:negativeButtonText="@null"
-        android:positiveButtonText="@null"
-        android:title="@string/pref_title_sync_frequency" />
-
-    <!-- This preference simply launches an intent when selected. Use this UI sparingly, per
-         design guidelines. -->
-    <Preference android:title="@string/pref_title_system_sync_settings">
-        <intent android:action="android.settings.SYNC_SETTINGS" />
-    </Preference>
-
-</PreferenceScreen>

+ 14 - 0
app/src/main/res/xml/pref_encryption.xml

@@ -0,0 +1,14 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
+         dismiss it. -->
+    <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
+    <ListPreference
+        android:defaultValue="180"
+        android:entries="@array/pref_enctype_title"
+        android:entryValues="@array/pref_enctype_values"
+        android:key="@string/id_enctype"
+        android:negativeButtonText="@null"
+        android:positiveButtonText="@null"
+        android:title="@string/pref_title_enctype" />
+</PreferenceScreen>

+ 1 - 31
app/src/main/res/xml/pref_general.xml

@@ -1,33 +1,3 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <SwitchPreference
-        android:defaultValue="true"
-        android:key="example_switch"
-        android:summary="@string/pref_description_social_recommendations"
-        android:title="@string/pref_title_social_recommendations" />
-
-    <!-- NOTE: EditTextPreference accepts EditText attributes. -->
-    <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
-    <EditTextPreference
-        android:capitalize="words"
-        android:defaultValue="@string/pref_default_display_name"
-        android:inputType="textCapWords"
-        android:key="example_text"
-        android:maxLines="1"
-        android:selectAllOnFocus="true"
-        android:singleLine="true"
-        android:title="@string/pref_title_display_name" />
-
-    <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
-         dismiss it. -->
-    <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
-    <ListPreference
-        android:defaultValue="-1"
-        android:entries="@array/pref_example_list_titles"
-        android:entryValues="@array/pref_example_list_values"
-        android:key="example_list"
-        android:negativeButtonText="@null"
-        android:positiveButtonText="@null"
-        android:title="@string/pref_title_add_friends_to_messages" />
-
+    <Preference android:title="@string/pref_title_system_keyboard_settings" android:key="@string/id_softSettings"/>
 </PreferenceScreen>

+ 6 - 9
app/src/main/res/xml/pref_headers.xml

@@ -6,15 +6,12 @@
         android:fragment="info.knacki.pass.settings.ui.SettingsActivity$GeneralPreferenceFragment"
         android:icon="@drawable/ic_info_black_24dp"
         android:title="@string/pref_header_general" />
-
     <header
-        android:fragment="info.knacki.pass.settings.ui.SettingsActivity$NotificationPreferenceFragment"
-        android:icon="@drawable/ic_notifications_black_24dp"
-        android:title="@string/pref_header_notifications" />
-
+        android:fragment="info.knacki.pass.settings.ui.SettingsActivity$EncryptionPreferenceFragment"
+        android:icon="@drawable/ic_info_black_24dp"
+        android:title="@string/pref_header_Encryption" />
     <header
-        android:fragment="info.knacki.pass.settings.ui.SettingsActivity$DataSyncPreferenceFragment"
-        android:icon="@drawable/ic_sync_black_24dp"
-        android:title="@string/pref_header_data_sync" />
-
+        android:fragment="info.knacki.pass.settings.ui.SettingsActivity$VCSPreferenceFragment"
+        android:icon="@drawable/ic_info_black_24dp"
+        android:title="@string/pref_header_VCS" />
 </preference-headers>

+ 0 - 27
app/src/main/res/xml/pref_notification.xml

@@ -1,27 +0,0 @@
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- A 'parent' preference, which enables/disables child preferences (below)
-         when checked/unchecked. -->
-    <SwitchPreference
-        android:defaultValue="true"
-        android:key="notifications_new_message"
-        android:title="@string/pref_title_new_message_notifications" />
-
-    <!-- Allows the user to choose a ringtone in the 'notification' category. -->
-    <!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
-    <!-- NOTE: RingtonePreference's summary should be set to its value by the activity code. -->
-    <RingtonePreference
-        android:defaultValue="content://settings/system/notification_sound"
-        android:dependency="notifications_new_message"
-        android:key="notifications_new_message_ringtone"
-        android:ringtoneType="notification"
-        android:title="@string/pref_title_ringtone" />
-
-    <!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
-    <SwitchPreference
-        android:defaultValue="true"
-        android:dependency="notifications_new_message"
-        android:key="notifications_new_message_vibrate"
-        android:title="@string/pref_title_vibrate" />
-
-</PreferenceScreen>

+ 19 - 0
app/src/main/res/xml/pref_vcs.xml

@@ -0,0 +1,19 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <SwitchPreference
+        android:defaultValue="false"
+        android:key="@string/id_vcs_enable"
+        android:summary="@string/pref_vcs_enable"
+        android:title="@string/pref_vcs_title" />
+
+    <ListPreference
+        android:defaultValue="-1"
+        android:entries="@array/pref_vcs_list_keys"
+        android:entryValues="@array/pref_vcs_list_values"
+        android:key="@string/id_vcs_list"
+        android:negativeButtonText="@null"
+        android:positiveButtonText="@null"
+        android:enabled="false"
+        android:title="@string/pref_vcs_list_title" />
+
+</PreferenceScreen>