isundil 7 年之前
父節點
當前提交
5c4cf8fb73
共有 30 個文件被更改,包括 324 次插入522 次删除
  1. 1 1
      app/src/main/AndroidManifest.xml
  2. 0 31
      app/src/main/java/info/knacki/pass/Sha1Builder.java
  3. 10 9
      app/src/main/java/info/knacki/pass/git/HttpGitProtocol.java
  4. 6 9
      app/src/main/java/info/knacki/pass/git/entities/GitCommit.java
  5. 3 0
      app/src/main/java/info/knacki/pass/git/entities/GitRef.java
  6. 8 16
      app/src/main/java/info/knacki/pass/input/InputService.java
  7. 30 0
      app/src/main/java/info/knacki/pass/io/CharsetHelper.java
  8. 0 1
      app/src/main/java/info/knacki/pass/io/FileUtils.java
  9. 0 7
      app/src/main/java/info/knacki/pass/io/FingerprintUtil.java
  10. 2 3
      app/src/main/java/info/knacki/pass/io/GPGFileInterface.java
  11. 1 2
      app/src/main/java/info/knacki/pass/io/GPGUtil.java
  12. 2 10
      app/src/main/java/info/knacki/pass/io/OutputStreamWithCheckSum.java
  13. 2 3
      app/src/main/java/info/knacki/pass/io/PasswordFileInterface.java
  14. 2 2
      app/src/main/java/info/knacki/pass/settings/SettingsManager.java
  15. 0 6
      app/src/main/java/info/knacki/pass/settings/ui/AppCompatPreferenceActivity.java
  16. 60 89
      app/src/main/java/info/knacki/pass/settings/ui/SettingsActivity.java
  17. 30 47
      app/src/main/java/info/knacki/pass/ui/EditPasswordActivity.java
  18. 56 104
      app/src/main/java/info/knacki/pass/ui/GitPullActivity.java
  19. 49 87
      app/src/main/java/info/knacki/pass/ui/MainActivity.java
  20. 1 6
      app/src/main/java/info/knacki/pass/ui/alertPrompt/AlertPrompt.java
  21. 9 16
      app/src/main/java/info/knacki/pass/ui/alertPrompt/views/ConflictView.java
  22. 1 5
      app/src/main/java/info/knacki/pass/ui/alertPrompt/views/FingerprintView.java
  23. 2 3
      app/src/main/java/info/knacki/pass/ui/alertPrompt/views/PasswordTextEdit.java
  24. 7 11
      app/src/main/java/info/knacki/pass/ui/passwordList/EditablePasswordListView.java
  25. 9 13
      app/src/main/java/info/knacki/pass/ui/passwordList/PasswordListView.java
  26. 27 33
      app/src/main/java/info/knacki/pass/ui/passwordPicker/FingerprintPicker.java
  27. 2 2
      app/src/main/java/info/knacki/pass/ui/passwordPicker/PasswordPicker.java
  28. 1 1
      app/src/main/res/menu/context_dir_menu.xml
  29. 2 2
      app/src/main/res/menu/context_file_menu.xml
  30. 1 3
      app/src/main/res/xml/provider_paths.xml

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

@@ -50,7 +50,7 @@
         <activity
             android:name=".ui.EditPasswordActivity"
             android:windowSoftInputMode="adjustResize" />
-        <activity android:name=".ui.GitPullActivity"></activity>
+        <activity android:name=".ui.GitPullActivity"/>
 
         <provider
             android:authorities="info.knacki.pass.provider"

+ 0 - 31
app/src/main/java/info/knacki/pass/Sha1Builder.java

@@ -1,31 +0,0 @@
-package info.knacki.pass;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-public class Sha1Builder {
-    private final MessageDigest sha1Builder;
-
-    Sha1Builder() {
-        MessageDigest sha1Builder;
-        try {
-            sha1Builder = MessageDigest.getInstance("SHA1");
-        } catch (NoSuchAlgorithmException e) {
-            sha1Builder = null;
-        }
-        this.sha1Builder = sha1Builder;
-    }
-
-    public Sha1Builder Write(String in) {
-        sha1Builder.update(in.getBytes());
-        return this;
-    }
-
-    public byte[] GetHash() {
-        return sha1Builder.digest();
-    }
-
-    public static byte[] Hash(String in) {
-        return new Sha1Builder().Write(in).GetHash();
-    }
-}

+ 10 - 9
app/src/main/java/info/knacki/pass/git/HttpGitProtocol.java

@@ -135,13 +135,15 @@ class HttpGitProtocol implements GitInterface {
                 return in.getInputStream();
             } catch (Throwable e) {
                 Map<String, List<String>> headers = in.getHeaderFields();
-                lp: for (List<String> i: headers.values()) {
-                    for (String status: i) {
-                        log.severe(in.getURL().toString() + ": " + status);
-                        break lp;
-                    }
-                    break;
+                String msg = null;
+                if (!headers.values().isEmpty()) {
+                    List<String> statuses = headers.values().iterator().next();
+                    if (!statuses.isEmpty())
+                        msg = in.getURL().toString() + ": " +statuses.iterator().next();
                 }
+                if (msg == null)
+                    msg = "Tried to reach " +in.getURL().toString();
+                log.log(Level.SEVERE, msg, e);
                 throw e;
             }
         }
@@ -463,8 +465,7 @@ class HttpGitProtocol implements GitInterface {
                 return false;
             msg.write(GitPackableUtil.getObjHeader(i.GetPackableType(), pack.length))
                 .write(GitPackableUtil.deflate(pack));
-            String tmp = GitSha1.getSha1OfPackable(i);
-            log.severe("Writing pack " +i.GetPackableType() +", " +GitSha1.getSha1OfPackable(i) +new String(i.GetPack()));
+            log.info("Writing pack " +i.GetPackableType() +", " +GitSha1.getSha1OfPackable(i) +new String(i.GetPack()));
         }
         msg.writeSha1();
         return true;
@@ -509,6 +510,7 @@ class HttpGitProtocol implements GitInterface {
                                         onError("Pack error", null);
                                         return;
                                     }
+                                    result.close();
                                 }
                                 catch (IOException e) {
                                     log.log(Level.SEVERE, "Cannot git-upload-pack: " +e.getMessage(), e);
@@ -524,7 +526,6 @@ class HttpGitProtocol implements GitInterface {
                     }
                     catch (IOException e) {
                         response.onError(e.getMessage(), e);
-                        return;
                     }
                 } else {
                     response.onError("Branch " +fConfig.GetBranch() + " not found on remote for pushing", null);

+ 6 - 9
app/src/main/java/info/knacki/pass/git/entities/GitCommit.java

@@ -2,7 +2,6 @@ package info.knacki.pass.git.entities;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
-import java.util.ArrayDeque;
 import java.util.Date;
 import java.util.Locale;
 import java.util.Set;
@@ -12,13 +11,13 @@ import java.util.TreeSet;
 import info.knacki.pass.git.GitSha1;
 
 public class GitCommit implements GitPackable {
-    private String fHash;
+    private final String fHash;
     private byte[] fTreeHash;
     private GitObject.GitTree fTree;
     private String fParent;
     private String fAuthor;
     private String fCommitter;
-    private String fMessage;
+    private final String fMessage;
     private Date fTime;
 
     public GitCommit(String hash, String sha1Content) {
@@ -95,8 +94,8 @@ public class GitCommit implements GitPackable {
         String dateStr = (fTime.getTime() / 1000) +" " +(new SimpleDateFormat("Z", Locale.US).format(fTime));
         String data = "tree " +GitSha1.BytesToString(fTree.GetHash()) +"\n" +
                 "parent " +GetParent() +"\n" +
-                "author " +fAuthor +" " +dateStr +"\n" +
-                "committer " +fCommitter +" " +dateStr +"\n" +
+                "author " +GetAuthor() +" " +dateStr +"\n" +
+                "committer " +GetCommitter() +" " +dateStr +"\n" +
                 "\n" +
                 fMessage +"\n";
         return data.getBytes();
@@ -105,7 +104,6 @@ public class GitCommit implements GitPackable {
     public static class Builder {
         private final GitCommit co;
         private final GitObject.GitTree fTree;
-        private final ArrayDeque<File> fFilesToPush = new ArrayDeque<>();
         private final Set<String> fToPack = new TreeSet<>();
 
         public Builder(GitCommit parent, String author, String authorEmail, String message) {
@@ -125,7 +123,6 @@ public class GitCommit implements GitPackable {
 
         public GitCommit.Builder AddFile(String relativeFilename, File f) {
             if (f.exists()) {
-                fFilesToPush.add(f);
                 GitObject obj = fTree.AddItem(relativeFilename, f);
                 do {
                     fToPack.add(obj.GetGitPath());
@@ -144,11 +141,11 @@ public class GitCommit implements GitPackable {
                     for (String i: fToPack)
                         if (i.startsWith(relativeFilename +"/"))
                             fToPack.remove(i);
-                do {
+                while (obj != null) {
                     fToPack.add(obj.GetGitPath());
                     obj.fSha1 = null;
                     obj = obj.GetParent();
-                } while (obj != null);
+                }
             }
             return this;
         }

+ 3 - 0
app/src/main/java/info/knacki/pass/git/entities/GitRef.java

@@ -1,5 +1,7 @@
 package info.knacki.pass.git.entities;
 
+import android.support.annotation.NonNull;
+
 public class GitRef {
     protected final String fHash;
     protected final String fBranch;
@@ -24,6 +26,7 @@ public class GitRef {
         return fBranch.substring(branchIndex + 1);
     }
 
+    @NonNull
     @Override
     public String toString() {
         return "ref {" + fHash + "} for branch {" + fBranch + "}";

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

@@ -43,24 +43,16 @@ public class InputService extends InputMethodService implements PasswordClickLis
         fInputView = LayoutInflater.from(this).inflate(R.layout.input, null, false);
         fPasswordListView = new PasswordListView<>(this, PathUtils.GetPassDir(this));
         ((ScrollView)fInputView.findViewById(R.id.passwordListContainer)).addView(fPasswordListView);
-        fInputView.findViewById(R.id.prevButton).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                InputMethodManager service = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-                if (null == service) {
-                    Toast.makeText(InputService.this, "Android error", Toast.LENGTH_LONG).show();
-                    log.log(Level.SEVERE, "Cannot get Input method service");
-                    return;
-                }
-                service.showInputMethodPicker();
-            }
-        });
-        fInputView.findViewById(R.id.openAppButton).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                startActivity(new Intent(InputService.this, MainActivity.class));
+        fInputView.findViewById(R.id.prevButton).setOnClickListener(view -> {
+            InputMethodManager service = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+            if (null == service) {
+                Toast.makeText(InputService.this, "Android error", Toast.LENGTH_LONG).show();
+                log.log(Level.SEVERE, "Cannot get Input method service");
+                return;
             }
+            service.showInputMethodPicker();
         });
+        fInputView.findViewById(R.id.openAppButton).setOnClickListener(view -> startActivity(new Intent(InputService.this, MainActivity.class)));
         return fInputView;
     }
 

+ 30 - 0
app/src/main/java/info/knacki/pass/io/CharsetHelper.java

@@ -0,0 +1,30 @@
+package info.knacki.pass.io;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.util.logging.Logger;
+
+public class CharsetHelper {
+    private static final Logger log = Logger.getLogger(CharsetHelper.class.getName());
+    public final static String DEFAULT_CHARSET = "UTF-8";
+
+    public static String ByteArrayToString(byte[] arr) {
+        try {
+            return new String(arr, DEFAULT_CHARSET);
+        }
+        catch (UnsupportedEncodingException e) {
+            log.severe("Unsupported charset " +DEFAULT_CHARSET);
+        }
+        return new String(arr, Charset.defaultCharset());
+    }
+
+    public static byte[] StringToByteArray(String str) {
+        try {
+            return str.getBytes(DEFAULT_CHARSET);
+        }
+        catch (UnsupportedEncodingException e) {
+            log.severe("Unsupported charset " +DEFAULT_CHARSET);
+        }
+        return str.getBytes(Charset.defaultCharset());
+    }
+}

+ 0 - 1
app/src/main/java/info/knacki/pass/io/FileUtils.java

@@ -2,7 +2,6 @@ package info.knacki.pass.io;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;

+ 0 - 7
app/src/main/java/info/knacki/pass/io/FingerprintUtil.java

@@ -1,7 +0,0 @@
-package info.knacki.pass.io;
-
-public class FingerprintUtil {
-    public static void UnlockFinger() {
-
-    }
-}

+ 2 - 3
app/src/main/java/info/knacki/pass/io/GPGFileInterface.java

@@ -5,7 +5,6 @@ import android.content.Context;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
-import java.nio.charset.Charset;
 
 import info.knacki.pass.settings.SettingsManager;
 
@@ -32,7 +31,7 @@ class GPGFileInterface implements IFileInterface {
             GPGUtil.DecryptFile(fContext, fPasswordGetter, fFile, new OnResponseListener<byte[]>() {
                 @Override
                 public void onResponse(byte[] result) {
-                    resp.onResponse(new String(result, Charset.defaultCharset()));
+                    resp.onResponse(CharsetHelper.ByteArrayToString(result));
                 }
 
                 @Override
@@ -50,7 +49,7 @@ class GPGFileInterface implements IFileInterface {
         try {
             if (!SettingsManager.HasGPGKey(fContext))
                 throw new FileNotFoundException("GPG key not set");
-            GPGUtil.CryptFile(fContext, fPasswordGetter, new FileOutputStream(fFile), content.getBytes(), resp);
+            GPGUtil.CryptFile(fContext, new FileOutputStream(fFile), CharsetHelper.StringToByteArray(content), resp);
         }
         catch (Throwable e) {
             resp.onError(e.getMessage(), e);

+ 1 - 2
app/src/main/java/info/knacki/pass/io/GPGUtil.java

@@ -42,7 +42,6 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Date;
@@ -255,7 +254,7 @@ public class GPGUtil {
         }
     }
 
-    public static void CryptFile(final Context ctx, final FileInterfaceFactory.PasswordGetter passwordGetter, final OutputStream fileOutStream, final byte[] data, final OnResponseListener<Void> resp) {
+    public static void CryptFile(final Context ctx, final OutputStream fileOutStream, final byte[] data, final OnResponseListener<Void> resp) {
         try {
             ByteArrayOutputStream compressedDataStream = new ByteArrayOutputStream();
             PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(CompressionAlgorithmTags.UNCOMPRESSED);

+ 2 - 10
app/src/main/java/info/knacki/pass/io/OutputStreamWithCheckSum.java

@@ -9,7 +9,7 @@ import java.util.logging.Logger;
 
 public class OutputStreamWithCheckSum {
     private static final Logger log = Logger.getLogger(OutputStreamWithCheckSum.class.getName());
-    private OutputStream fOutput;
+    private final OutputStream fOutput;
     private MessageDigest fDigest;
 
     public OutputStreamWithCheckSum(OutputStream out) {
@@ -23,22 +23,14 @@ public class OutputStreamWithCheckSum {
         }
     }
 
-    public OutputStreamWithCheckSum write(byte b) throws IOException {
-        log.finer("Add 1 byte");
-        fDigest.update(b);
-        fOutput.write(new byte[] {b});
-        return this;
-    }
-
     public OutputStreamWithCheckSum write(byte []b) throws IOException {
-        log.finer("Add " +b.length +" bytes");
         fDigest.update(b);
         fOutput.write(b);
         return this;
     }
 
     public OutputStreamWithCheckSum write(String b) throws IOException {
-        return write(b.getBytes());
+        return write(CharsetHelper.StringToByteArray(b));
     }
 
     public OutputStreamWithCheckSum writeSha1() throws IOException {

+ 2 - 3
app/src/main/java/info/knacki/pass/io/PasswordFileInterface.java

@@ -27,7 +27,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.nio.charset.Charset;
 import java.security.SecureRandom;
 import java.security.Security;
 import java.util.Date;
@@ -153,7 +152,7 @@ class PasswordFileInterface implements IFileInterface {
             DecryptFile(new OnResponseListener<byte[]>() {
                 @Override
                 public void onResponse(byte[] result) {
-                    resp.onResponse(new String(result, Charset.defaultCharset()));
+                    resp.onResponse(CharsetHelper.ByteArrayToString(result));
                 }
 
                 @Override
@@ -172,7 +171,7 @@ class PasswordFileInterface implements IFileInterface {
         Security.addProvider(new BouncyCastleProvider());
 
         try {
-            CryptFile(new FileOutputStream(fFile), content.getBytes());
+            CryptFile(new FileOutputStream(fFile), CharsetHelper.StringToByteArray(content));
         }
         catch (Throwable e) {
             resp.onError(e.getMessage(), e);

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

@@ -138,13 +138,13 @@ public class SettingsManager {
                 fUrl = url;
             return fUrl;
         }
+
         public String GetUrl() {
             return fUrl;
         }
 
         public String SetPassword(String pass) {
-            fPassword = pass;
-            return fPassword;
+            return fPassword = pass;
         }
 
         public String GetPassword() {

+ 0 - 6
app/src/main/java/info/knacki/pass/settings/ui/AppCompatPreferenceActivity.java

@@ -5,10 +5,8 @@ import android.os.Bundle;
 import android.preference.PreferenceActivity;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.AppCompatDelegate;
-import android.support.v7.widget.Toolbar;
 import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -38,10 +36,6 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
         return getDelegate().getSupportActionBar();
     }
 
-    public void setSupportActionBar(@Nullable Toolbar toolbar) {
-        getDelegate().setSupportActionBar(toolbar);
-    }
-
     @NonNull
     @Override
     public MenuInflater getMenuInflater() {

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

@@ -44,7 +44,6 @@ import info.knacki.pass.io.GPGUtil;
 import info.knacki.pass.io.OnResponseListener;
 import info.knacki.pass.settings.SettingsManager;
 import info.knacki.pass.ui.GitPullActivity;
-import info.knacki.pass.ui.alertPrompt.AlertPrompt;
 import info.knacki.pass.ui.alertPrompt.AlertPromptGenerator;
 import info.knacki.pass.ui.alertPrompt.views.TextView;
 import info.knacki.pass.ui.passwordPicker.PasswordPickerFactory;
@@ -138,12 +137,9 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
             addPreferencesFromResource(R.xml.pref_general);
             setHasOptionsMenu(true);
 
-            findPreference(getResources().getString(R.string.id_softSettings)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    //FIXME
-                    return true;
-                }
+            findPreference(getResources().getString(R.string.id_softSettings)).setOnPreferenceClickListener(preference -> {
+                //FIXME
+                return true;
             });
         }
 
@@ -285,12 +281,9 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
                 }
             });
 
-            findPreference(getResources().getString(R.string.id_vcs_git_pull)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    startActivity(new Intent(getActivity(), GitPullActivity.class));
-                    return true;
-                }
+            findPreference(getResources().getString(R.string.id_vcs_git_pull)).setOnPreferenceClickListener(preference -> {
+                startActivity(new Intent(getActivity(), GitPullActivity.class));
+                return true;
             });
             reload();
         }
@@ -390,38 +383,30 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
                 gitInterface.GetRefs(new OnResponseListener<GitRef[]>() {
                     @Override
                     public void onResponse(final GitRef[] result) {
-                        getActivity().runOnUiThread(new Runnable() {
-                            @Override
-                            public void run() {
-                                CharSequence[] refNames = new CharSequence[result.length];
-                                CharSequence[] refs = new CharSequence[result.length];
-                                int selected = -1;
-
-                                for (int i = 0; i < result.length; ++i) {
-                                    refNames[i] = result[i].GetBranchName();
-                                    refs[i] = result[i].GetBranch();
-                                    if (result[i].GetBranch().equals(versioning.GetBranch()))
-                                        selected = i;
-                                }
-                                gitBranches.setEntries(refNames);
-                                gitBranches.setEntryValues(refs);
-                                gitBranches.setEnabled(true);
-                                if (selected >= 0) {
-                                    gitBranches.setSummary(refNames[selected]);
-                                    gitBranches.setValueIndex(selected);
-                                }
+                        getActivity().runOnUiThread(() -> {
+                            CharSequence[] refNames = new CharSequence[result.length];
+                            CharSequence[] refs = new CharSequence[result.length];
+                            int selected = -1;
+
+                            for (int i = 0; i < result.length; ++i) {
+                                refNames[i] = result[i].GetBranchName();
+                                refs[i] = result[i].GetBranch();
+                                if (result[i].GetBranch().equals(versioning.GetBranch()))
+                                    selected = i;
+                            }
+                            gitBranches.setEntries(refNames);
+                            gitBranches.setEntryValues(refs);
+                            gitBranches.setEnabled(true);
+                            if (selected >= 0) {
+                                gitBranches.setSummary(refNames[selected]);
+                                gitBranches.setValueIndex(selected);
                             }
                         });
                     }
 
                     @Override
                     public void onError(final String msg, final Throwable e) {
-                        getActivity().runOnUiThread(new Runnable() {
-                            @Override
-                            public void run() {
-                                Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();
-                            }
-                        });
+                        getActivity().runOnUiThread(() -> Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show());
                     }
                 });
             } else {
@@ -452,61 +437,47 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
             addPreferencesFromResource(R.xml.pref_gpg);
             setHasOptionsMenu(true);
 
-            findPreference(getResources().getString(R.string.id_gpg_keyfile)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
-                    i.setType("*/*");
-                    i.addCategory(Intent.CATEGORY_OPENABLE);
-                    GPGPreferenceFragment.this.startActivityForResult(i, ACTIVITY_REQUEST_CODE_BROWSEGPG);
-                    return true;
-                }
+            findPreference(getResources().getString(R.string.id_gpg_keyfile)).setOnPreferenceClickListener(preference -> {
+                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
+                i.setType("*/*");
+                i.addCategory(Intent.CATEGORY_OPENABLE);
+                GPGPreferenceFragment.this.startActivityForResult(i, ACTIVITY_REQUEST_CODE_BROWSEGPG);
+                return true;
             });
-            findPreference(getResources().getString(R.string.id_gpg_password)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    try {
-                        GPGUtil.ChangePassword(getActivity(), PasswordPickerFactory.GetPasswordEditor(getActivity()), new OnResponseListener<Void>() {
-                            @Override
-                            public void onResponse(Void result) {
-                                updateGpgFileLabel();
-                            }
+            findPreference(getResources().getString(R.string.id_gpg_password)).setOnPreferenceClickListener(preference -> {
+                try {
+                    GPGUtil.ChangePassword(getActivity(), PasswordPickerFactory.GetPasswordEditor(getActivity()), new OnResponseListener<Void>() {
+                        @Override
+                        public void onResponse(Void result) {
+                            updateGpgFileLabel();
+                        }
 
-                            @Override
-                            public void onError(String msg, Throwable e) {
-                                Toast.makeText(getActivity(), "Error: " + msg, Toast.LENGTH_LONG).show();
-                            }
-                        });
-                    } catch (IOException e) {
-                        Toast.makeText(getActivity(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
-                    }
-                    return true;
+                        @Override
+                        public void onError(String msg, Throwable e) {
+                            Toast.makeText(getActivity(), "Error: " + msg, Toast.LENGTH_LONG).show();
+                        }
+                    });
+                } catch (IOException e) {
+                    Toast.makeText(getActivity(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
                 }
+                return true;
             });
-            findPreference(getResources().getString(R.string.id_gpg_export)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    try {
-                        if (!GPGUtil.CheckIsPasswordProtected(getActivity())) {
-                            AlertPromptGenerator.StaticMake(getActivity())
-                                    .setCancelable(true)
-                                    .setPositiveButton(R.string.yes, new AlertPrompt.OnClickListener() {
-                                        @Override
-                                        public void onClick(DialogInterface dialogInterface, View view) {
-                                            DoExportKey();
-                                        }
-                                    })
-                                    .setNegativeButton(R.string.no, null)
-                                    .setTitle(R.string.are_you_sure)
-                                    .setView(new TextView(getActivity()).SetText(R.string.unprotected_key))
-                                    .show();
-                        } else {
-                            DoExportKey();
-                        }
-                        return true;
-                    } catch (IOException e) {
-                        return false;
+            findPreference(getResources().getString(R.string.id_gpg_export)).setOnPreferenceClickListener(preference -> {
+                try {
+                    if (!GPGUtil.CheckIsPasswordProtected(getActivity())) {
+                        AlertPromptGenerator.StaticMake(getActivity())
+                                .setCancelable(true)
+                                .setPositiveButton(R.string.yes, (DialogInterface dialogInterface, View view) -> DoExportKey())
+                                .setNegativeButton(R.string.no, null)
+                                .setTitle(R.string.are_you_sure)
+                                .setView(new TextView(getActivity()).SetText(R.string.unprotected_key))
+                                .show();
+                    } else {
+                        DoExportKey();
                     }
+                    return true;
+                } catch (IOException e) {
+                    return false;
                 }
             });
             updateGpgFileLabel();

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

@@ -6,8 +6,6 @@ import android.support.v7.widget.AppCompatCheckBox;
 import android.support.v7.widget.AppCompatEditText;
 import android.text.Editable;
 import android.text.InputType;
-import android.view.View;
-import android.widget.CompoundButton;
 import android.widget.Toast;
 
 import java.io.File;
@@ -37,38 +35,29 @@ public class EditPasswordActivity extends AppCompatActivity {
         }
         fOutputFile = new File(path);
         fTextEdit = findViewById(R.id.password_edit);
-        ((AppCompatCheckBox) findViewById(R.id.showPasswordCheckbox)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
-                final int cursorPos = fTextEdit.getSelectionEnd();
-                fTextEdit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | (compoundButton.isChecked() ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_PASSWORD));
-                fTextEdit.setSelection(cursorPos);
-            }
+        ((AppCompatCheckBox) findViewById(R.id.showPasswordCheckbox)).setOnCheckedChangeListener((compoundButton, b) -> {
+            final int cursorPos = fTextEdit.getSelectionEnd();
+            fTextEdit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE | (compoundButton.isChecked() ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_PASSWORD));
+            fTextEdit.setSelection(cursorPos);
         });
-        findViewById(R.id.saveButton).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                final Editable text = fTextEdit.getText();
-                final String textStr = text == null ? "" : text.toString();
+        findViewById(R.id.saveButton).setOnClickListener(view -> {
+            final Editable text = fTextEdit.getText();
+            final String textStr = text == null ? "" : text.toString();
 
-                FileInterfaceFactory.GetFileInterface(EditPasswordActivity.this, PasswordPickerFactory.GetPasswordPicker(EditPasswordActivity.this), fOutputFile).WriteFile(textStr, new OnResponseListener<Void>() {
-                    @Override
-                    public void onResponse(Void result) {
-                        EditPasswordActivity.this.finish();
-                    }
+            FileInterfaceFactory.GetFileInterface(EditPasswordActivity.this, PasswordPickerFactory.GetPasswordPicker(EditPasswordActivity.this), fOutputFile).WriteFile(textStr, new OnResponseListener<Void>() {
+                @Override
+                public void onResponse(Void result) {
+                    EditPasswordActivity.this.finish();
+                }
 
-                    @Override
-                    public void onError(final String msg, final Throwable e) {
-                        EditPasswordActivity.this.runOnUiThread(new Runnable() {
-                            @Override
-                            public void run() {
-                                Toast.makeText(EditPasswordActivity.this, "Error: " +msg, Toast.LENGTH_LONG).show();
-                                log.log(Level.WARNING, msg, e);
-                            }
-                        });
-                    }
-                });
-            }
+                @Override
+                public void onError(final String msg, final Throwable e) {
+                    EditPasswordActivity.this.runOnUiThread(() -> {
+                        Toast.makeText(EditPasswordActivity.this, "Error: " +msg, Toast.LENGTH_LONG).show();
+                        log.log(Level.WARNING, msg, e);
+                    });
+                }
+            });
         });
         boolean editMode = getIntent().getBooleanExtra(INTENT_EDIT, true);
         populateContent(editMode);
@@ -82,28 +71,22 @@ public class EditPasswordActivity extends AppCompatActivity {
         FileInterfaceFactory.GetFileInterface(this, PasswordPickerFactory.GetPasswordPicker(this), fOutputFile).ReadFile(new OnResponseListener<String>() {
             @Override
             public void onResponse(final String pass) {
-                EditPasswordActivity.this.runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        fTextEdit.setEnabled(true);
-                        fTextEdit.setText(pass);
-                        if (requestFocus) {
-                            fTextEdit.setSelection(pass.length());
-                            fTextEdit.requestFocus();
-                        }
+                EditPasswordActivity.this.runOnUiThread(() -> {
+                    fTextEdit.setEnabled(true);
+                    fTextEdit.setText(pass);
+                    if (requestFocus) {
+                        fTextEdit.setSelection(pass.length());
+                        fTextEdit.requestFocus();
                     }
                 });
             }
 
             @Override
             public void onError(final String msg, final Throwable e) {
-                EditPasswordActivity.this.runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        Toast.makeText(EditPasswordActivity.this, "Error: " +msg, Toast.LENGTH_LONG).show();
-                        log.log(Level.WARNING, msg, e);
-                        finish();
-                    }
+                EditPasswordActivity.this.runOnUiThread(() -> {
+                    Toast.makeText(EditPasswordActivity.this, "Error: " +msg, Toast.LENGTH_LONG).show();
+                    log.log(Level.WARNING, msg, e);
+                    finish();
                 });
             }
         });

+ 56 - 104
app/src/main/java/info/knacki/pass/ui/GitPullActivity.java

@@ -1,9 +1,7 @@
 package info.knacki.pass.ui;
 
-import android.content.DialogInterface;
 import android.os.Bundle;
 import android.support.v7.app.AppCompatActivity;
-import android.view.View;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
@@ -38,18 +36,13 @@ public class GitPullActivity extends AppCompatActivity {
     private final static Logger log = Logger.getLogger(GitPullActivity.class.getName());
     public final static String COMMIT_MSG = "Android pass sync";
 
-    public final static int ACTIVITY_REQUEST_CODE_BROWSEGPG = 1;
-
     private GitInterface fGitInterfage;
     private GitCommit fHeadCommit;
 
     private void onMsg(final String msg) {
-        GitPullActivity.this.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                TextView logView = findViewById(R.id.logView);
-                logView.append(msg +"\n");
-            }
+        GitPullActivity.this.runOnUiThread(() -> {
+            TextView logView = findViewById(R.id.logView);
+            logView.append(msg +"\n");
         });
     }
 
@@ -77,37 +70,24 @@ public class GitPullActivity extends AppCompatActivity {
                 @Override
                 public void onResponse(GitCommit result) {
                     fHeadCommit = result;
-                    GitPullActivity.this.runOnUiThread(new Runnable() {
-                        @Override
-                        public void run() {
-                            GitPullActivity.this.OnTreeStructureFetched();
-                        }
-                    });
+                    GitPullActivity.this.runOnUiThread(GitPullActivity.this::OnTreeStructureFetched);
                 }
 
                 @Override
                 public void onError(final String msg, Throwable e) {
-                    GitPullActivity.this.runOnUiThread(new Runnable() {
-                        @Override
-                        public void run() {
-                            ProgressBar pg = findViewById(R.id.progressBar);
-                            pg.setIndeterminate(false);
-                            pg.setMax(1);
-                            pg.setProgress(1);
-                            TextView logView = findViewById(R.id.logView);
-                            logView.append(msg +"\n");
-                            findViewById(R.id.close_bt).setEnabled(true);
-                        }
+                    GitPullActivity.this.runOnUiThread(() -> {
+                        ProgressBar pg = findViewById(R.id.progressBar);
+                        pg.setIndeterminate(false);
+                        pg.setMax(1);
+                        pg.setProgress(1);
+                        TextView logView = findViewById(R.id.logView);
+                        logView.append(msg +"\n");
+                        findViewById(R.id.close_bt).setEnabled(true);
                     });
                 }
             });
         }
-        findViewById(R.id.close_bt).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                GitPullActivity.this.finish();
-            }
-        });
+        findViewById(R.id.close_bt).setOnClickListener(v -> GitPullActivity.this.finish());
     }
 
     public static String LOCALGIT_HASH_VERSION_FILE;
@@ -177,33 +157,22 @@ public class GitPullActivity extends AppCompatActivity {
     }
 
     void AskForConflicts(final GitLocal localVersion, final HashMap<String, GitObject.GitBlob> conflicts, final HashMap<String, GitObject.GitBlob> filesToPull, final Set<String> filesToPush) {
-        runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                AlertPrompt pt = AlertPromptGenerator.StaticMake(GitPullActivity.this)
-                        .setCancelable(true)
-                        .setNegativeButton(R.string.cancel, new AlertPrompt.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialogInterface, View view) {
-                                GitPullActivity.this.finish();
-                            }
-                        })
-                        .setPositiveButton(R.string.ok, new AlertPrompt.OnClickListener() {
-                            @Override
-                            public void onClick(DialogInterface dialogInterface, View v) {
-                                ConflictView.ConflictViewResult viewResult = ((ConflictView) v).GetResult();
-                                for (String s: viewResult.fUseTheir) {
-                                    filesToPull.put(s, conflicts.get(s));
-                                }
-                                filesToPush.addAll(viewResult.fUseMine);
-                                SyncFiles(localVersion, filesToPull, filesToPush);
-                            }
-                        })
-                        .setTitle(R.string.conflictingFiles);
-                ConflictView view = new ConflictView(GitPullActivity.this, pt, conflicts.keySet());
-                pt.setView(view).show();
-                view.UpdateButtonState();
-            }
+        runOnUiThread(() -> {
+            AlertPrompt pt = AlertPromptGenerator.StaticMake(GitPullActivity.this)
+                    .setCancelable(true)
+                    .setNegativeButton(R.string.cancel, (dialogInterface, view) -> GitPullActivity.this.finish())
+                    .setPositiveButton(R.string.ok, (dialogInterface, v) -> {
+                        ConflictView.ConflictViewResult viewResult = ((ConflictView) v).GetResult();
+                        for (String s: viewResult.fUseTheir) {
+                            filesToPull.put(s, conflicts.get(s));
+                        }
+                        filesToPush.addAll(viewResult.fUseMine);
+                        SyncFiles(localVersion, filesToPull, filesToPush);
+                    })
+                    .setTitle(R.string.conflictingFiles);
+            ConflictView view = new ConflictView(GitPullActivity.this, pt, conflicts.keySet());
+            pt.setView(view).show();
+            view.UpdateButtonState();
         });
     }
 
@@ -224,31 +193,25 @@ public class GitPullActivity extends AppCompatActivity {
         final OnStreamResponseListener<Void> allDone = new OnStreamResponseListener<Void>() {
             @Override
             public void onResponse(Void result) {
-                GitPullActivity.this.runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        ProgressBar pg = findViewById(R.id.progressBar);
-                        pg.setIndeterminate(false);
-                        pg.setMax(1);
-                        pg.setProgress(1);
-                        localVersion.Write(new File(LOCALGIT_HASH_VERSION_FILE));
-                        RmEmptyDirs(new File(PathUtils.GetPassDir(GitPullActivity.this)), true);
-                        findViewById(R.id.close_bt).setEnabled(true);
-                    }
+                GitPullActivity.this.runOnUiThread(() -> {
+                    ProgressBar pg = findViewById(R.id.progressBar);
+                    pg.setIndeterminate(false);
+                    pg.setMax(1);
+                    pg.setProgress(1);
+                    localVersion.Write(new File(LOCALGIT_HASH_VERSION_FILE));
+                    RmEmptyDirs(new File(PathUtils.GetPassDir(GitPullActivity.this)), true);
+                    findViewById(R.id.close_bt).setEnabled(true);
                 });
             }
 
             @Override
             public void onError(String msg, Throwable e) {
-                GitPullActivity.this.runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        ProgressBar pg = findViewById(R.id.progressBar);
-                        pg.setIndeterminate(false);
-                        pg.setMax(1);
-                        pg.setProgress(1);
-                        findViewById(R.id.close_bt).setEnabled(true);
-                    }
+                GitPullActivity.this.runOnUiThread(() -> {
+                    ProgressBar pg = findViewById(R.id.progressBar);
+                    pg.setIndeterminate(false);
+                    pg.setMax(1);
+                    pg.setProgress(1);
+                    findViewById(R.id.close_bt).setEnabled(true);
                 });
             }
 
@@ -258,16 +221,13 @@ public class GitPullActivity extends AppCompatActivity {
             }
         };
 
-        final Runnable afterFetching = new Runnable() {
-            @Override
-            public void run() {
-                if (filesToPush.size() > 0) {
-                    GitPullActivity.this.onMsg("Updating remote repository");
-                    PushBlobs(filesToPush, localVersion, allDone);
-                } else {
-                    GitPullActivity.this.onMsg("Nothing to push");
-                    allDone.onResponse(null);
-                }
+        final Runnable afterFetching = () -> {
+            if (filesToPush.size() > 0) {
+                GitPullActivity.this.onMsg("Updating remote repository");
+                PushBlobs(filesToPush, localVersion, allDone);
+            } else {
+                GitPullActivity.this.onMsg("Nothing to push");
+                allDone.onResponse(null);
             }
         };
 
@@ -308,14 +268,11 @@ public class GitPullActivity extends AppCompatActivity {
                 final GitObject.GitBlob blob = files.peek().getValue();
                 final OnResponseListener<byte[]> _this = this;
 
-                GitPullActivity.this.runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        WriteFile(filename, localVersion, blob, result);
-                        logView.append("Done fetching " +files.peek().getValue().GetFilename() +"\n");
-                        files.pop();
-                        DownloadNext(files, localVersion, _this, resp);
-                    }
+                GitPullActivity.this.runOnUiThread(() -> {
+                    WriteFile(filename, localVersion, blob, result);
+                    logView.append("Done fetching " +files.peek().getValue().GetFilename() +"\n");
+                    files.pop();
+                    DownloadNext(files, localVersion, _this, resp);
                 });
             }
 
@@ -323,12 +280,7 @@ public class GitPullActivity extends AppCompatActivity {
             public void onError(final String msg, Throwable e) {
                 log.log(Level.SEVERE, msg, e);
 
-                GitPullActivity.this.runOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        logView.append("Error while fetching " +files.peek().getValue().GetFilename() +": " +msg);
-                    }
-                });
+                GitPullActivity.this.runOnUiThread(() -> logView.append("Error while fetching " +files.peek().getValue().GetFilename() +": " +msg));
 
                 files.pop();
                 if (!files.empty()) {

+ 49 - 87
app/src/main/java/info/knacki/pass/ui/MainActivity.java

@@ -3,14 +3,12 @@ package info.knacki.pass.ui;
 import android.Manifest;
 import android.content.ClipData;
 import android.content.ClipboardManager;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Build;
 import android.os.Bundle;
 import android.support.v7.app.AppCompatActivity;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.view.View;
 import android.widget.ScrollView;
 import android.widget.Toast;
 
@@ -29,7 +27,6 @@ import info.knacki.pass.io.OnResponseListener;
 import info.knacki.pass.io.PathUtils;
 import info.knacki.pass.settings.SettingsManager;
 import info.knacki.pass.settings.ui.SettingsActivity;
-import info.knacki.pass.ui.alertPrompt.AlertPrompt;
 import info.knacki.pass.ui.alertPrompt.AlertPromptGenerator;
 import info.knacki.pass.ui.alertPrompt.views.SimpleTextEdit;
 import info.knacki.pass.ui.alertPrompt.views.TextEditAndCheckbox;
@@ -48,28 +45,20 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
         AlertPromptGenerator.StaticMake(this)
                 .setCancelable(true)
                 .setView(new SimpleTextEdit(this))
-                .setPositiveButton(R.string.add, new AlertPrompt.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, View view) {
-                        final String filename = ((SimpleTextEdit) view).getStr();
+                .setPositiveButton(R.string.add, (dialogInterface, view) -> {
+                    final String filename = ((SimpleTextEdit) view).getStr();
 
-                        if (filename.length() == 0) {
-                            Toast.makeText(MainActivity.this, "Error: Empty file name", Toast.LENGTH_LONG).show();
-                            return;
-                        }
-                        File f = new File(vPasswordListView.fCurrentDir +"/" +filename);
-                        if (!f.mkdir()) {
-                            Toast.makeText(MainActivity.this, "Error: cannot create folder", Toast.LENGTH_LONG).show();
-                        }
-                        vPasswordListView.refresh();
+                    if (filename.length() == 0) {
+                        Toast.makeText(MainActivity.this, "Error: Empty file name", Toast.LENGTH_LONG).show();
+                        return;
                     }
-                })
-                .setNegativeButton(R.string.cancel, new AlertPrompt.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, View s) {
-                        dialogInterface.cancel();
+                    File f = new File(vPasswordListView.fCurrentDir +"/" +filename);
+                    if (!f.mkdir()) {
+                        Toast.makeText(MainActivity.this, "Error: cannot create folder", Toast.LENGTH_LONG).show();
                     }
+                    vPasswordListView.refresh();
                 })
+                .setNegativeButton(R.string.cancel, (dialogInterface, s) -> dialogInterface.cancel())
                 .setTitle(R.string.add_title)
                 .show();
     }
@@ -84,39 +73,31 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
                     .setText(lastFileName.getStr())
                     .setCheckboxCaption(R.string.add_generate)
                     .setChecked(lastFileName.isChecked()))
-                .setPositiveButton(R.string.add, new AlertPrompt.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, View view) {
-                        lastFileName = (TextEditAndCheckbox) view;
-                        final String filename = lastFileName.getStr();
-                        if (filename.length() == 0) {
-                            Toast.makeText(MainActivity.this, "Error: Empty file name", Toast.LENGTH_LONG).show();
-                            return;
-                        }
-                        File f = new File(vPasswordListView.fCurrentDir +"/" +filename +FileInterfaceFactory.GetExtension(SettingsManager.GetDefaultEncryptionType(MainActivity.this)));
-                        try {
-                            f.createNewFile();
-                            vPasswordListView.refresh();
-                        }
-                        catch (IOException e) {
-                            Toast.makeText(MainActivity.this, "Error: " +e.getMessage(), Toast.LENGTH_LONG).show();
-                            log.log(Level.WARNING, e.getMessage(), e);
-                            return;
-                        }
-                        if (lastFileName.isChecked()) {
-                            GeneratePassword(f);
-                        } else {
-                            EditFile(f, true);
-                        }
-                        lastFileName = null;
+                .setPositiveButton(R.string.add, (dialogInterface, view) -> {
+                    lastFileName = (TextEditAndCheckbox) view;
+                    final String filename = lastFileName.getStr();
+                    if (filename.length() == 0) {
+                        Toast.makeText(MainActivity.this, "Error: Empty file name", Toast.LENGTH_LONG).show();
+                        return;
                     }
-                })
-                .setNegativeButton(R.string.cancel, new AlertPrompt.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialogInterface, View s) {
-                        dialogInterface.cancel();
+                    File f = new File(vPasswordListView.fCurrentDir +"/" +filename +FileInterfaceFactory.GetExtension(SettingsManager.GetDefaultEncryptionType(MainActivity.this)));
+                    try {
+                        f.createNewFile();
+                        vPasswordListView.refresh();
+                    }
+                    catch (IOException e) {
+                        Toast.makeText(MainActivity.this, "Error: " +e.getMessage(), Toast.LENGTH_LONG).show();
+                        log.log(Level.WARNING, e.getMessage(), e);
+                        return;
                     }
+                    if (lastFileName.isChecked()) {
+                        GeneratePassword(f);
+                    } else {
+                        EditFile(f, true);
+                    }
+                    lastFileName = null;
                 })
+                .setNegativeButton(R.string.cancel, (dialogInterface, s) -> dialogInterface.cancel())
                 .setTitle(R.string.add_title)
                 .show();
     }
@@ -185,34 +166,23 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
         AlertPromptGenerator.StaticMake(this)
             .setCancelable(true)
             .setView(wiz)
-            .setPositiveButton(R.string.add, new AlertPrompt.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialogInterface, View view) {
-                    IFileInterface writer = FileInterfaceFactory.GetFileInterface(MainActivity.this, PasswordPickerFactory.GetPasswordPicker(MainActivity.this), f);
-                    writer.WriteFile(PasswordGenerator.generate(wiz), new OnResponseListener<Void>() {
-                        @Override
-                        public void onResponse(Void result) {
-                        }
+            .setPositiveButton(R.string.add, (dialogInterface, view) -> {
+                IFileInterface writer = FileInterfaceFactory.GetFileInterface(MainActivity.this, PasswordPickerFactory.GetPasswordPicker(MainActivity.this), f);
+                writer.WriteFile(PasswordGenerator.generate(wiz), new OnResponseListener<Void>() {
+                    @Override
+                    public void onResponse(Void result) {
+                    }
 
-                        @Override
-                        public void onError(final String msg, final Throwable e) {
-                            MainActivity.this.runOnUiThread(new Runnable() {
-                                @Override
-                                public void run() {
-                                    Toast.makeText(MainActivity.this, "Error: " +msg, Toast.LENGTH_LONG).show();
-                                    log.log(Level.WARNING, msg, e);
-                                }
-                            });
-                        }
-                    });
-                }
-            })
-            .setNegativeButton(R.string.cancel, new AlertPrompt.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialogInterface, View s) {
-                    dialogInterface.cancel();
-                }
+                    @Override
+                    public void onError(final String msg, final Throwable e) {
+                        MainActivity.this.runOnUiThread(() -> {
+                            Toast.makeText(MainActivity.this, "Error: " +msg, Toast.LENGTH_LONG).show();
+                            log.log(Level.WARNING, msg, e);
+                        });
+                    }
+                });
             })
+            .setNegativeButton(R.string.cancel, (dialogInterface, s) -> dialogInterface.cancel())
             .setTitle(R.string.generate_title)
             .show();
     }
@@ -251,16 +221,8 @@ public class MainActivity extends AppCompatActivity implements PasswordEditListe
                     .setTitle(R.string.are_you_sure)
                     .setView(new TextView(this)
                             .SetText(R.string.about_to_rm_directory))
-                    .setPositiveButton(R.string.ok, new AlertPrompt.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialogInterface, View view) {
-                            DoRemoveDir(f);
-                        }
-                    })
-                    .setNegativeButton(R.string.cancel, new AlertPrompt.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialogInterface, View view) {
-                        }
+                    .setPositiveButton(R.string.ok, (dialogInterface, view) -> DoRemoveDir(f))
+                    .setNegativeButton(R.string.cancel, (dialogInterface, view) -> {
                     })
                     .show();
 

+ 1 - 6
app/src/main/java/info/knacki/pass/ui/alertPrompt/AlertPrompt.java

@@ -56,12 +56,7 @@ public class AlertPrompt {
     }
 
     public AlertPrompt setPositiveButton(int textId, final OnClickListener listener) {
-        fAlertBuilder.setPositiveButton(textId, new DialogInterface.OnClickListener() {
-            @Override
-            public void onClick(DialogInterface dialogInterface, int i) {
-                listener.onClick(dialogInterface, fView);
-            }
-        });
+        fAlertBuilder.setPositiveButton(textId, (dialogInterface, i) -> listener.onClick(dialogInterface, fView));
         return this;
     }
 

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

@@ -1,7 +1,6 @@
 package info.knacki.pass.ui.alertPrompt.views;
 
 import android.content.Context;
-import android.widget.CompoundButton;
 import android.widget.HorizontalScrollView;
 import android.widget.LinearLayout;
 import android.widget.RadioButton;
@@ -51,28 +50,22 @@ public class ConflictView extends HorizontalScrollView {
 
     private void createListeners(RadioButton mine, RadioButton their, final String name) {
         fConflicts.put(name, new ConflictState());
-        mine.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                if (isChecked) {
-                    fConflicts.get(name).UseMine();
-                    UpdateButtonState();
-                }
+        mine.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            if (isChecked) {
+                fConflicts.get(name).UseMine();
+                UpdateButtonState();
             }
         });
-        their.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                if (isChecked) {
-                    fConflicts.get(name).UseTheir();
-                    UpdateButtonState();
-                }
+        their.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            if (isChecked) {
+                fConflicts.get(name).UseTheir();
+                UpdateButtonState();
             }
         });
     }
 
     public ConflictViewResult GetResult() {
-        ConflictViewResult res = new ConflictViewResult(new HashSet<String>(), new HashSet<String>());
+        ConflictViewResult res = new ConflictViewResult(new HashSet<>(), new HashSet<>());
         for (Map.Entry<String, ConflictState> i: fConflicts.entrySet()) {
             if (i.getValue().fUseMine)
                 res.fUseMine.add(i.getKey());

+ 1 - 5
app/src/main/java/info/knacki/pass/ui/alertPrompt/views/FingerprintView.java

@@ -2,7 +2,6 @@ package info.knacki.pass.ui.alertPrompt.views;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
-import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.LinearLayout;
@@ -10,16 +9,13 @@ import android.widget.LinearLayout;
 import info.knacki.pass.R;
 
 public class FingerprintView extends LinearLayout {
-    private FingerprintManagerCompat fManager;
-
     public FingerprintView(Context context) {
         super(context);
-        fManager = FingerprintManagerCompat.from(context);
         @SuppressLint("InflateParams") View v = LayoutInflater.from(context).inflate(R.layout.fingerprint_picker, null);
         addView(v);
     }
 
     public void onAuthFailed() {
-
+        // FIXME
     }
 }

+ 2 - 3
app/src/main/java/info/knacki/pass/ui/alertPrompt/views/PasswordTextEdit.java

@@ -11,7 +11,6 @@ import info.knacki.pass.ui.alertPrompt.integratedKeyboard.KeyboardWidget;
 
 public class PasswordTextEdit extends LinearLayout implements KeyboardWidget.OnKeyListener {
     private final AppCompatEditText fTextEdit;
-    private final KeyboardView fKeyboard;
 
     public PasswordTextEdit(Context c) {
         super(c);
@@ -19,8 +18,8 @@ public class PasswordTextEdit extends LinearLayout implements KeyboardWidget.OnK
         fTextEdit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
         fTextEdit.setFocusable(false);
         addView(fTextEdit);
-        fKeyboard = new KeyboardWidget(c).SetListener(this);
-        addView(fKeyboard);
+        KeyboardView keyboard = new KeyboardWidget(c).SetListener(this);
+        addView(keyboard);
         setOrientation(VERTICAL);
     }
 

+ 7 - 11
app/src/main/java/info/knacki/pass/ui/passwordList/EditablePasswordListView.java

@@ -2,7 +2,6 @@ package info.knacki.pass.ui.passwordList;
 
 import android.app.Activity;
 import android.view.MenuItem;
-import android.view.View;
 import android.widget.PopupMenu;
 
 import java.io.File;
@@ -19,16 +18,13 @@ public class EditablePasswordListView<T extends Activity & PasswordEditListener>
     protected void AddContextMenu(final FileIdent file, final PasswordView pv) {
         if (file.isParent())
             return;
-        pv.setOnLongClickListener(new OnLongClickListener() {
-            @Override
-            public boolean onLongClick(View v) {
-                fSelectedPassword = pv;
-                PopupMenu menu = new PopupMenu(fClickListener, pv);
-                menu.getMenuInflater().inflate(file.fIsDir ? R.menu.context_dir_menu : R.menu.context_file_menu, menu.getMenu());
-                menu.setOnMenuItemClickListener(EditablePasswordListView.this);
-                menu.show();
-                return true;
-            }
+        pv.setOnLongClickListener(v -> {
+            fSelectedPassword = pv;
+            PopupMenu menu = new PopupMenu(fClickListener, pv);
+            menu.getMenuInflater().inflate(file.fIsDir ? R.menu.context_dir_menu : R.menu.context_file_menu, menu.getMenu());
+            menu.setOnMenuItemClickListener(EditablePasswordListView.this);
+            menu.show();
+            return true;
         });
     }
 

+ 9 - 13
app/src/main/java/info/knacki/pass/ui/passwordList/PasswordListView.java

@@ -2,7 +2,6 @@ package info.knacki.pass.ui.passwordList;
 
 import android.content.Context;
 import android.support.annotation.NonNull;
-import android.view.View;
 import android.widget.LinearLayout;
 
 import java.io.File;
@@ -50,19 +49,16 @@ public class PasswordListView<T extends Context & PasswordClickListener> extends
 
     protected PasswordView CreateView(final FileIdent file) {
         PasswordView pv = new PasswordView(getContext(), file.fIsDir ? ((file.isParent() ? PasswordView.TYPE_PARENT : 0) | PasswordView.TYPE_DIR) : PasswordView.TYPE_PASSWORD, file.fName);
-        pv.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View view) {
-                File f = new File(fCurrentDir +"/" +file.fName);
-                if (file.isParent()) {
-                    f = new File(fCurrentDir).getParentFile();
-                    DisplayDir(f);
-                }
-                if (f.isDirectory())
-                    DisplayDir(f);
-                else
-                    fClickListener.OnPasswordClicked(f);
+        pv.setOnClickListener(view -> {
+            File f = new File(fCurrentDir +"/" +file.fName);
+            if (file.isParent()) {
+                f = new File(fCurrentDir).getParentFile();
+                DisplayDir(f);
             }
+            if (f.isDirectory())
+                DisplayDir(f);
+            else
+                fClickListener.OnPasswordClicked(f);
         });
         return pv;
     }

+ 27 - 33
app/src/main/java/info/knacki/pass/ui/passwordPicker/FingerprintPicker.java

@@ -60,6 +60,29 @@ class FingerprintPicker extends PasswordPicker {
     private Queue<String> fPassword;
     private Queue<String> fPasswordIterator;
 
+    private static final class IvAndPayload {
+        static final char SEPARATOR = '-';
+        final byte[] fIV;
+        final byte[] fPayload;
+
+        IvAndPayload(Cipher c, byte[] payload) {
+            fIV = c.getIV();
+            fPayload = payload;
+        }
+
+        IvAndPayload(String raw) throws Base64DataException {
+            int sep = raw.indexOf(SEPARATOR);
+            if (sep < 0)
+                throw new Base64DataException("Cannot find separator");
+            fIV = Base64.decode(raw.substring(0, sep), Base64.NO_WRAP);
+            fPayload = Base64.decode(raw.substring(sep + 1), Base64.NO_WRAP);
+        }
+
+        public String toString() {
+            return Base64.encodeToString(fIV, Base64.NO_WRAP) + SEPARATOR + Base64.encodeToString(fPayload, Base64.NO_WRAP);
+        }
+    }
+
     FingerprintPicker(Context ctx, AlertPromptGenerator alertFactory) {
         super(ctx, alertFactory);
         fFile = new File(PathUtils.GetFingerprintFile(ctx));
@@ -91,12 +114,7 @@ class FingerprintPicker extends PasswordPicker {
             log.log(Level.SEVERE, msg, e);
             return null;
         }
-        try {
-            return keyStore.getKey(KEY_NAME, null);
-        }
-        catch (NoSuchAlgorithmException | KeyStoreException | UnrecoverableKeyException e) {
-            return null;
-        }
+        return GetKey(keyStore);
     }
 
     private boolean GenerateKey(OnErrorListener resp) {
@@ -142,7 +160,7 @@ class FingerprintPicker extends PasswordPicker {
         catch (InvalidKeyException e) {
             return null;
         }
-        catch (KeyStoreException | UnrecoverableKeyException | NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
+        catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
             final String msg = "Cannot create Cipher";
             resp.onError(msg, e);
             log.log(Level.SEVERE, msg, e);
@@ -151,7 +169,7 @@ class FingerprintPicker extends PasswordPicker {
         return new FingerprintManagerCompat.CryptoObject(c);
     }
 
-    private static Cipher InitCipher(Key key, IvAndPayload ivForDecoding) throws NoSuchAlgorithmException, NoSuchPaddingException, KeyStoreException, InvalidKeyException, UnrecoverableKeyException, InvalidAlgorithmParameterException {
+    private static Cipher InitCipher(Key key, IvAndPayload ivForDecoding) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException {
         Cipher c = Cipher.getInstance(KEY_ALGORITHM +"/" +KEY_BLOCK_MODE +"/" +KEY_PADDING);
         if (ivForDecoding == null)
             c.init(Cipher.ENCRYPT_MODE, key);
@@ -160,29 +178,6 @@ class FingerprintPicker extends PasswordPicker {
         return c;
     }
 
-    private final class IvAndPayload {
-        public static final char SEPARATOR = '-';
-        public final byte[] fIV;
-        public final byte[] fPayload;
-
-        public IvAndPayload(Cipher c, byte[] payload) {
-            fIV = c.getIV();
-            fPayload = payload;
-        }
-
-        public IvAndPayload(String raw) throws Base64DataException {
-            int sep = raw.indexOf(SEPARATOR);
-            if (sep < 0)
-                throw new Base64DataException("Cannot find separator");
-            fIV = Base64.decode(raw.substring(0, sep), Base64.NO_WRAP);
-            fPayload = Base64.decode(raw.substring(sep +1), Base64.NO_WRAP);
-        }
-
-        public String toString() {
-            return Base64.encodeToString(fIV, Base64.NO_WRAP) +SEPARATOR +Base64.encodeToString(fPayload, Base64.NO_WRAP);
-        }
-    }
-
     private void DoWriteFile(FingerprintManagerCompat.CryptoObject cryptoObject, String content) {
         try {
             Cipher cipher = cryptoObject.getCipher();
@@ -193,7 +188,6 @@ class FingerprintPicker extends PasswordPicker {
         }
         catch (IOException | BadPaddingException | IllegalBlockSizeException | NullPointerException e) {
             log.log(Level.SEVERE, e.getMessage(), e);
-            return;
         }
     }
 
@@ -208,7 +202,7 @@ class FingerprintPicker extends PasswordPicker {
                     resp.onError(fContext.getString(R.string.cancelled), null);
                 })
                 .show();
-        final FingerprintManagerCompat.CryptoObject cryptoObject = InitCryptoObject(ivForDecoding, resp::onError);
+        final FingerprintManagerCompat.CryptoObject cryptoObject = InitCryptoObject(ivForDecoding, resp);
         if (cryptoObject == null)
             return; // Error already handled
 

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

@@ -64,7 +64,7 @@ class PasswordPicker implements FileInterfaceFactory.PasswordGetter {
             return R.string.enter_password;
         }
 
-        private FileInterfaceFactory.OnPasswordEnteredListener fOnFirstPassEntered = new FileInterfaceFactory.OnPasswordEnteredListener() {
+        private final FileInterfaceFactory.OnPasswordEnteredListener fOnFirstPassEntered = new FileInterfaceFactory.OnPasswordEnteredListener() {
             @Override
             public boolean onResponse(String result) {
                 if (result == null) {
@@ -82,7 +82,7 @@ class PasswordPicker implements FileInterfaceFactory.PasswordGetter {
             }
         };
 
-        private FileInterfaceFactory.OnPasswordEnteredListener fOnRetypePassEntered = new FileInterfaceFactory.OnPasswordEnteredListener() {
+        private final FileInterfaceFactory.OnPasswordEnteredListener fOnRetypePassEntered = new FileInterfaceFactory.OnPasswordEnteredListener() {
             @Override
             public boolean onResponse(String result) {
                 if (result == null) {

+ 1 - 1
app/src/main/res/menu/context_dir_menu.xml

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:id="@+id/remove" android:title="@string/remove"></item>
+    <item android:id="@+id/remove" android:title="@string/remove"/>
 </menu>

+ 2 - 2
app/src/main/res/menu/context_file_menu.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-<item android:id="@+id/remove" android:title="@string/remove"></item>
-<item android:id="@+id/clipboard" android:title="@string/copy_clipboard"></item>
+<item android:id="@+id/remove" android:title="@string/remove"/>
+<item android:id="@+id/clipboard" android:title="@string/copy_clipboard"/>
 </menu>

+ 1 - 3
app/src/main/res/xml/provider_paths.xml

@@ -1,6 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <paths>
-    <cache-path
-        name="cache"
-        path="."></cache-path>
+    <cache-path name="cache" path="."/>
 </paths>