From 7ddc23ee839c8648b60217101862b739df4018c3 Mon Sep 17 00:00:00 2001 From: zeapo Date: Wed, 29 Oct 2014 22:09:40 +0100 Subject: corrected some issues with filtering and categories --- .../main/java/com/zeapo/pwdstore/GitAsyncTask.java | 7 +--- .../java/com/zeapo/pwdstore/PasswordFragment.java | 38 ++++++++++++++++++++-- .../java/com/zeapo/pwdstore/PasswordStore.java | 18 ++++++++-- .../zeapo/pwdstore/utils/PasswordRepository.java | 27 +++++++++++++-- 4 files changed, 77 insertions(+), 13 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java index 26ad8c7c..c27bd0d4 100644 --- a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java +++ b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java @@ -5,17 +5,12 @@ import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.AsyncTask; -import android.util.Log; import com.zeapo.pwdstore.utils.PasswordRepository; import org.apache.commons.io.FileUtils; import org.eclipse.jgit.api.CloneCommand; -import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.GitCommand; -import org.eclipse.jgit.api.errors.InvalidRemoteException; -import org.eclipse.jgit.api.errors.JGitInternalException; -import org.eclipse.jgit.api.errors.TransportException; public class GitAsyncTask extends AsyncTask { @@ -86,7 +81,7 @@ public class GitAsyncTask extends AsyncTask { if (refreshListOnEnd) { try { - ((PasswordStore) this.activity).refreshListAdapter(); + ((PasswordStore) this.activity).updateListAdapter(); } catch (ClassCastException e) { // oups, mistake } diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java index 6058d169..1dcce1b8 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java @@ -23,6 +23,7 @@ import com.zeapo.pwdstore.utils.PasswordRepository; import java.io.File; import java.util.ArrayList; +import java.util.List; import java.util.Stack; /** @@ -40,6 +41,7 @@ public class PasswordFragment extends Fragment{ // store the pass files list in a stack private Stack> passListStack; + private Stack pathStack; private Stack scrollPosition; private PasswordRecyclerAdapter recyclerAdapter; private RecyclerView recyclerView; @@ -60,6 +62,7 @@ public class PasswordFragment extends Fragment{ passListStack = new Stack>(); scrollPosition = new Stack(); + pathStack = new Stack(); recyclerAdapter = new PasswordRecyclerAdapter((PasswordStore) getActivity(), mListener, PasswordRepository.getPasswords(new File(path))); } @@ -89,6 +92,7 @@ public class PasswordFragment extends Fragment{ public void onFragmentInteraction(PasswordItem item) { if (item.getType() == PasswordItem.TYPE_CATEGORY) { passListStack.push((ArrayList) recyclerAdapter.getValues().clone()); + pathStack.push(item.getFile()); scrollPosition.push(recyclerView.getVerticalScrollbarPosition()); recyclerView.scrollToPosition(0); recyclerAdapter.clear(); @@ -117,8 +121,12 @@ public class PasswordFragment extends Fragment{ // mListView.closeOpenedItems(); } + /** + * clears the adapter content and sets it back to the root view + */ public void updateAdapter() { passListStack.clear(); + pathStack.clear(); scrollPosition.clear(); recyclerAdapter.clear(); recyclerAdapter.addAll(PasswordRepository.getPasswords()); @@ -126,12 +134,29 @@ public class PasswordFragment extends Fragment{ ((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false); } + /** + * refreshes the adapter with the latest opened category + */ + public void refreshAdapter() { + recyclerAdapter.clear(); + recyclerAdapter.addAll(pathStack.isEmpty() ? + PasswordRepository.getPasswords() : + PasswordRepository.getPasswords(pathStack.peek())); + } + public void filterAdapter(String filter) { + Log.d("FRAG", "filter: " + filter); + if (filter.isEmpty()) { - updateAdapter(); + refreshAdapter(); } else { - for (PasswordItem item : PasswordRepository.getPasswords()) { - boolean matches = item.getName().toLowerCase().contains(filter); + // on the root the pathStack is empty + List passwordItems = pathStack.isEmpty() ? + PasswordRepository.getPasswords() : + PasswordRepository.getPasswords(pathStack.peek()); + + for (PasswordItem item : passwordItems) { + boolean matches = item.toString().toLowerCase().contains(filter.toLowerCase()); boolean inAdapter = recyclerAdapter.getValues().contains(item); if (matches && !inAdapter) { recyclerAdapter.add(item); @@ -142,10 +167,17 @@ public class PasswordFragment extends Fragment{ } } + /** + * Goes back one level back in the path + */ public void popBack() { + if (passListStack.isEmpty()) + return; + recyclerView.scrollToPosition(scrollPosition.pop()); recyclerAdapter.clear(); recyclerAdapter.addAll(passListStack.pop()); + pathStack.pop(); } public boolean isNotEmpty() { diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java index 759b0989..9c3afb56 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java @@ -167,7 +167,7 @@ public class PasswordStore extends ActionBarActivity { return true; case R.id.refresh: - refreshListAdapter(); + updateListAdapter(); return true; case android.R.id.home: @@ -398,7 +398,10 @@ public class PasswordStore extends ActionBarActivity { .show(); } - public void refreshListAdapter() { + /** + * clears adapter's content and updates it with a fresh list of passwords from the root + */ + public void updateListAdapter() { PasswordFragment plist; if (null != (plist = (PasswordFragment) getFragmentManager().findFragmentByTag("PasswordsList"))) { @@ -406,6 +409,17 @@ public class PasswordStore extends ActionBarActivity { } } + /** + * Updates the adapter with the current view of passwords + */ + public void refreshListAdapter() { + PasswordFragment plist; + if (null != + (plist = (PasswordFragment) getFragmentManager().findFragmentByTag("PasswordsList"))) { + plist.refreshAdapter(); + } + } + public void filterListAdapter(String filter) { PasswordFragment plist; if (null != diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java index b35f9701..31dea887 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java @@ -28,6 +28,11 @@ public class PasswordRepository { protected PasswordRepository(){ } + /** + * Returns the git repository + * @param localDir needed only on the creation + * @return the git repository + */ public static Repository getRepository(File localDir) { if (repository == null) { FileRepositoryBuilder builder = new FileRepositoryBuilder(); @@ -92,6 +97,10 @@ public class PasswordRepository { return getFilesList(repository.getWorkTree()); } + /** + * Gets the password items in the root directory + * @return a list of passwords in the root direcotyr + */ public static ArrayList getPasswords() { return getPasswords(repository.getWorkTree()); } @@ -100,27 +109,41 @@ public class PasswordRepository { return repository.getWorkTree(); } + /** + * Gets a file from the working tree + * @param name the relative path of the file + * @return the file in the repository + */ public static File getFile(String name) { return new File(repository.getWorkTree() + "/" + name); } + /** + * Gets the .gpg files in a directory + * @param path the directory path + * @return the list of gpg files in that directory + */ public static ArrayList getFilesList(File path){ if (!path.exists()) return new ArrayList(); - Log.d("REPO", path.getAbsolutePath()); + Log.d("REPO", "current path: " + path.getPath()); ArrayList files = new ArrayList(Arrays.asList(path.listFiles((FileFilter) FileFilterUtils.directoryFileFilter()))); files.addAll( new ArrayList((List)FileUtils.listFiles(path, new String[] {"gpg"}, false))); return new ArrayList(files); } + /** + * Gets the passwords (PasswordItem) in a directory + * @param path the directory path + * @return a list of password items + */ public static ArrayList getPasswords(File path) { //We need to recover the passwords then parse the files ArrayList passList = getFilesList(path); if (passList.size() == 0) return new ArrayList(); - // TODO replace with a set ArrayList passwordList = new ArrayList(); for (File file : passList) { -- cgit v1.2.3