diff --git a/app/build.gradle b/app/build.gradle index e053108f..059ed531 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,14 +3,14 @@ apply from: 'copyLibs.gradle' // enable 'copyLibs.gradle' script plugin apply plugin: 'eclipse' android { - compileSdkVersion 19 - buildToolsVersion "19.1.0" + compileSdkVersion 21 + buildToolsVersion "21.0.1" defaultConfig { applicationId "com.zeapo.pwdstore" minSdkVersion 15 - targetSdkVersion 19 - versionCode 15 - versionName "1.1-b8" + targetSdkVersion 21 + versionCode 16 + versionName "1.2-b1" } buildTypes { release { @@ -29,6 +29,8 @@ repositories { } dependencies { + compile "com.android.support:appcompat-v7:21.+" + //compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':libraries:openpgp-api-lib') compile 'org.eclipse.jgit:org.eclipse.jgit:3.5.+' diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java index 8278931b..7a327ef2 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java @@ -4,7 +4,9 @@ import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.app.Fragment; +import android.support.v7.app.ActionBarActivity; import android.util.Log; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,7 +29,9 @@ import com.zeapo.pwdstore.utils.PasswordItem; import com.zeapo.pwdstore.utils.PasswordRepository; import java.io.File; +import java.util.ArrayList; import java.util.List; +import java.util.Stack; /** * A fragment representing a list of Items. @@ -36,7 +40,10 @@ import java.util.List; * with a GridView. *

*/ -public class PasswordFragment extends Fragment implements SwipeListViewListener { +public class PasswordFragment extends Fragment implements SwipeListViewListener{ + + // store the pass files list in a stack + private Stack> passListStack; private OnFragmentInteractionListener mListener; @@ -62,6 +69,9 @@ public class PasswordFragment extends Fragment implements SwipeListViewListener super.onCreate(savedInstanceState); String path = getArguments().getString("Path"); + + passListStack = new Stack>(); + mAdapter = new PasswordAdapter((PasswordStore) getActivity(), PasswordRepository.getPasswords(new File(path))); } @@ -74,8 +84,6 @@ public class PasswordFragment extends Fragment implements SwipeListViewListener mListView = (SwipeListView) view.findViewById(R.id.pass_list); ((AdapterView) mListView).setAdapter(mAdapter); mListView.setSwipeListViewListener(this); - mListView.setSelectionFromTop(getArguments().getInt("Position"), 0); - return view; } @@ -83,7 +91,23 @@ public class PasswordFragment extends Fragment implements SwipeListViewListener public void onAttach(Activity activity) { super.onAttach(activity); try { - mListener = (OnFragmentInteractionListener) activity; + mListener = new OnFragmentInteractionListener() { + @Override + public void onFragmentInteraction(PasswordItem item) { + if (item.getType() == PasswordItem.TYPE_CATEGORY) { + passListStack.push((ArrayList) mAdapter.getValues().clone()); + mAdapter.clear(); + mAdapter.addAll(PasswordRepository.getPasswords(item.getFile())); + + ((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + } + + @Override + public void savePosition(Integer position) { + + } + }; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); @@ -195,4 +219,12 @@ public class PasswordFragment extends Fragment implements SwipeListViewListener mListView.setAdapter((ListAdapter) mAdapter); } + public void popBack() { + mAdapter.clear(); + mAdapter.addAll(passListStack.pop()); + } + + public boolean isNotEmpty() { + return !passListStack.isEmpty(); + } } diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java index 20f58cfb..2ce7120e 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java @@ -10,6 +10,7 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -25,10 +26,11 @@ import org.eclipse.jgit.api.Git; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Stack; -public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentInteractionListener, PasswordFragment.OnFragmentInteractionListener { +public class PasswordStore extends ActionBarActivity implements ToCloneOrNot.OnFragmentInteractionListener { private Stack scrollPositions; /** if we leave the activity to do something, do not add any other fragment */ public boolean leftActivity = false; @@ -76,6 +78,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); Intent intent; + Log.d("PASS", "Menu item " + id + " pressed"); AlertDialog.Builder initBefore = new AlertDialog.Builder(this) .setMessage("Please clone or create a new repository below before trying to add a password or any synchronization operation.") @@ -137,6 +140,11 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI refreshListAdapter(); return true; + case android.R.id.home: + Log.d("PASS", "Home pressed"); + this.onBackPressed(); + break; + default: break; } @@ -266,41 +274,42 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI fragmentTransaction.commit(); break; default: - PasswordRepository.setInitialized(true); - PasswordFragment passFrag = new PasswordFragment(); - Bundle args = new Bundle(); - args.putString("Path", localDir.getAbsolutePath()); - if (!scrollPositions.isEmpty()) - args.putInt("Position", scrollPositions.pop()); - else - args.putInt("Position", 0); + if (fragmentManager.findFragmentByTag("PasswordsList") == null) { + PasswordRepository.setInitialized(true); + PasswordFragment passFrag = new PasswordFragment(); + Bundle args = new Bundle(); + args.putString("Path", localDir.getAbsolutePath()); - passFrag.setArguments(args); + passFrag.setArguments(args); - if (fragmentManager.findFragmentByTag("PasswordsList") != null) fragmentTransaction.addToBackStack("passlist"); - fragmentTransaction.replace(R.id.main_layout, passFrag, "PasswordsList"); - fragmentTransaction.commit(); + fragmentTransaction.replace(R.id.main_layout, passFrag, "PasswordsList"); + fragmentTransaction.commit(); + } } this.leftActivity = false; } - /** Stack the positions the different fragments were at */ - @Override - public void savePosition(Integer position) { - this.scrollPositions.push(position); - } - /* If an item is clicked in the list of passwords, this will be triggered */ + @Override - public void onFragmentInteraction(PasswordItem item) { - if (item.getType() == PasswordItem.TYPE_CATEGORY) { - checkLocalRepository(item.getFile()); + public void onBackPressed() { + PasswordFragment plist; + if ((null != (plist = (PasswordFragment) getFragmentManager().findFragmentByTag("PasswordsList"))) && + plist.isNotEmpty()) { + plist.popBack(); + } else { + super.onBackPressed(); + } + + if (!plist.isNotEmpty()) { + getSupportActionBar().setDisplayHomeAsUpEnabled(false); } } + public void decryptPassword(PasswordItem item) { try { this.leftActivity = true; diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java index fb9442fb..e3317c01 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java @@ -41,6 +41,9 @@ public class PasswordAdapter extends ArrayAdapter{ this.activity = activity; } + public ArrayList getValues() { + return values; + } @Override public View getView(int i, View convertView, ViewGroup viewGroup) { 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 bc36f1cb..b35f9701 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java @@ -32,9 +32,8 @@ public class PasswordRepository { if (repository == null) { FileRepositoryBuilder builder = new FileRepositoryBuilder(); try { - repository = builder.setWorkTree(localDir) + repository = builder.setGitDir(localDir) .readEnvironment() - .findGitDir() .build(); } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index fa4c64dc..9b35ed79 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,15 +1,6 @@ - - - - - -