aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/build.gradle2
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java12
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/GitHandler.java4
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java35
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/PasswordStore.java65
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java33
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java142
-rw-r--r--app/src/main/res/drawable-xxhdpi/blue_rectangle.xml24
-rw-r--r--app/src/main/res/drawable-xxhdpi/red_rectangle.xml2
-rw-r--r--app/src/main/res/layout/child_row_layout.xml28
-rw-r--r--app/src/main/res/layout/decrypt_layout.xml82
-rw-r--r--app/src/main/res/layout/fragment_password_list.xml5
-rw-r--r--app/src/main/res/values/strings.xml3
13 files changed, 333 insertions, 104 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 82bf9fbb..d453f775 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -6,7 +6,7 @@ android {
defaultConfig {
applicationId "com.zeapo.pwdstore"
- minSdkVersion 15
+ minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
diff --git a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java
index 8db11c43..11071018 100644
--- a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java
+++ b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java
@@ -16,11 +16,13 @@ import org.eclipse.jgit.api.errors.TransportException;
public class GitAsyncTask extends AsyncTask<GitCommand, Integer, Integer> {
private Activity activity;
private boolean finishOnEnd;
+ private boolean refreshListOnEnd;
private ProgressDialog dialog;
- public GitAsyncTask(Activity activity, boolean finishOnEnd) {
+ public GitAsyncTask(Activity activity, boolean finishOnEnd, boolean refreshListOnEnd) {
this.activity = activity;
this.finishOnEnd = finishOnEnd;
+ this.refreshListOnEnd = refreshListOnEnd;
dialog = new ProgressDialog(this.activity);
}
@@ -62,5 +64,13 @@ public class GitAsyncTask extends AsyncTask<GitCommand, Integer, Integer> {
this.activity.setResult(Activity.RESULT_OK);
this.activity.finish();
}
+
+ if (refreshListOnEnd) {
+ try {
+ ((PasswordStore) this.activity).refreshListAdapter();
+ } catch (ClassCastException e){
+ // oups, mistake
+ }
+ }
}
}
diff --git a/app/src/main/java/com/zeapo/pwdstore/GitHandler.java b/app/src/main/java/com/zeapo/pwdstore/GitHandler.java
index aed6b776..7dc25567 100644
--- a/app/src/main/java/com/zeapo/pwdstore/GitHandler.java
+++ b/app/src/main/java/com/zeapo/pwdstore/GitHandler.java
@@ -441,7 +441,7 @@ public class GitHandler extends Activity {
+ ":" +
settings.getString("git_remote_location", "path/to/repository"));
- new GitAsyncTask(activity, true).execute(new Git(PasswordRepository.getRepository(new File("")))
+ new GitAsyncTask(activity, true, false).execute(new Git(PasswordRepository.getRepository(new File("")))
.pull()
.setRebase(true)
.setRemote("origin")
@@ -481,7 +481,7 @@ public class GitHandler extends Activity {
+ ":" +
settings.getString("git_remote_location", "path/to/repository"));
- new GitAsyncTask(activity, true).execute(new Git(PasswordRepository.getRepository(new File("")))
+ new GitAsyncTask(activity, true, false).execute(new Git(PasswordRepository.getRepository(new File("")))
.push()
.setPushAll()
.setRemote("origin")
diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java
index ab7c8a77..db214cc5 100644
--- a/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java
+++ b/app/src/main/java/com/zeapo/pwdstore/PasswordFragment.java
@@ -10,6 +10,8 @@ import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.ExpandableListAdapter;
+import android.widget.ExpandableListView;
import android.widget.ListAdapter;
import android.widget.ListView;
@@ -27,14 +29,14 @@ import java.util.List;
* with a GridView.
* <p />
*/
-public class PasswordFragment extends Fragment implements AbsListView.OnItemClickListener {
+public class PasswordFragment extends Fragment implements ExpandableListView.OnGroupClickListener {
private OnFragmentInteractionListener mListener;
/**
* The fragment's ListView/GridView.
*/
- private ListView mListView;
+ private ExpandableListView mListView;
/**
* The Adapter which will be used to populate the ListView/GridView with
@@ -53,7 +55,7 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
super.onCreate(savedInstanceState);
String path = getArguments().getString("Path");
- mAdapter = new PasswordAdapter(getActivity(), PasswordRepository.getPasswords(new File(path)));
+ mAdapter = new PasswordAdapter((PasswordStore) getActivity(), PasswordRepository.getPasswords(new File(path)));
}
@Override
@@ -62,11 +64,11 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
View view = inflater.inflate(R.layout.fragment_password, container, false);
// Set the adapter
- mListView = (ListView) view.findViewById(R.id.pass_list);
- ((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);
+ mListView = (ExpandableListView) view.findViewById(R.id.pass_list);
+ mListView.setAdapter((android.widget.ExpandableListAdapter) mAdapter);
// Set OnItemClickListener so we can be notified on item clicks
- mListView.setOnItemClickListener(this);
+ mListView.setOnGroupClickListener(this);
mListView.setSelectionFromTop(getArguments().getInt("Position"), 0);
return view;
@@ -97,12 +99,22 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
}
@Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- if (null != mListener) {
- // Notify the active callbacks interface (the activity, if the
- // fragment is attached to one) that an item has been selected.
- mListener.onFragmentInteraction(mAdapter.getItem(position));
+ public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
+ if( ((PasswordItem) mAdapter.getGroup(i)).getType() == PasswordItem.TYPE_CATEGORY ){
+ if (null != mListener) {
+ // Notify the active callbacks interface (the activity, if the
+ // fragment is attached to one) that an item has been selected.
+ mListener.onFragmentInteraction(mAdapter.getItem(i));
+ }
+ } else {
+ if (expandableListView.isGroupExpanded(i)) {
+ expandableListView.collapseGroup(i);
+ } else {
+ expandableListView.expandGroup(i);
+ }
}
+
+ return true;
}
public interface OnFragmentInteractionListener {
@@ -113,6 +125,7 @@ public class PasswordFragment extends Fragment implements AbsListView.OnItemClic
public void updateAdapter() {
mAdapter.clear();
mAdapter.addAll(PasswordRepository.getPasswords(new File(getArguments().getString("Path"))));
+ mListView.setAdapter((ExpandableListAdapter) mAdapter);
}
}
diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java
index 6d51858b..62475867 100644
--- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java
+++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java
@@ -16,6 +16,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
+import android.widget.ExpandableListView;
import android.widget.LinearLayout;
import com.jcraft.jsch.JSch;
@@ -42,7 +43,7 @@ import java.util.Stack;
public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentInteractionListener, PasswordFragment.OnFragmentInteractionListener {
private Stack<Integer> scrollPositions;
/** if we leave the activity to do something, do not add any other fragment */
- private boolean leftActivity = false;
+ public boolean leftActivity = false;
private File currentDir;
private SharedPreferences settings;
private Activity activity;
@@ -171,6 +172,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI
return;
}
PasswordRepository.createRepository(localDir);
+ checkLocalRepository();
}
}
@@ -249,19 +251,6 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI
checkLocalRepository(item.getFile());
} else {
try {
- try {
- this.leftActivity = true;
-
- Intent intent = new Intent(this, PgpHandler.class);
- intent.putExtra("PGP-ID", FileUtils.readFileToString(PasswordRepository.getFile("/.gpg-id")));
- intent.putExtra("NAME", item.toString());
- intent.putExtra("FILE_PATH", item.getFile().getAbsolutePath());
- intent.putExtra("Operation", "DECRYPT");
- startActivityForResult(intent, PgpHandler.REQUEST_CODE_DECRYPT_AND_VERIFY);
-
- } catch (IOException e) {
- e.printStackTrace();
- }
} catch (Exception e) {
@@ -270,6 +259,21 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI
}
}
}
+ public void decryptPassword(PasswordItem item) {
+ try {
+ this.leftActivity = true;
+
+ Intent intent = new Intent(this, PgpHandler.class);
+ intent.putExtra("PGP-ID", FileUtils.readFileToString(PasswordRepository.getFile("/.gpg-id")));
+ intent.putExtra("NAME", item.toString());
+ intent.putExtra("FILE_PATH", item.getFile().getAbsolutePath());
+ intent.putExtra("Operation", "DECRYPT");
+ startActivityForResult(intent, PgpHandler.REQUEST_CODE_DECRYPT_AND_VERIFY);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
public void createPassword(View v) {
this.currentDir = getCurrentDir();
@@ -287,7 +291,36 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI
}
}
- private void refreshListAdapter() {
+ public void deletePassword(final PasswordItem item) {
+ new AlertDialog.Builder(this).
+ setMessage("Are you sure you want to delete the password \"" +
+ item + "\"")
+ .setPositiveButton("YES", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ String path = item.getFile().getAbsolutePath();
+ item.getFile().delete();
+
+ setResult(RESULT_CANCELED);
+ Git git = new Git(PasswordRepository.getRepository(new File("")));
+ GitAsyncTask tasks = new GitAsyncTask(activity, false, true);
+ System.out.println(tasks);
+ tasks.execute(
+ git.rm().addFilepattern(path.replace(PasswordRepository.getWorkTree() + "/", "")),
+ git.commit().setMessage("[ANDROID PwdStore] Remove " + item + " from store.")
+ );
+ }
+ })
+ .setNegativeButton("NO", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+
+ }
+ })
+ .show();
+ }
+
+ public void refreshListAdapter() {
PasswordFragment plist;
if (null !=
(plist = (PasswordFragment) getFragmentManager().findFragmentByTag("PasswordsList"))) {
@@ -310,7 +343,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI
switch (requestCode) {
case PgpHandler.REQUEST_CODE_ENCRYPT :
Git git = new Git(PasswordRepository.getRepository(new File("")));
- GitAsyncTask tasks = new GitAsyncTask(this, false);
+ GitAsyncTask tasks = new GitAsyncTask(this, false, false);
tasks.execute(
git.add().addFilepattern("."),
git.commit().setMessage("[ANDROID PwdStore] Add " + data.getExtras().getString("NAME") + " from store.")
diff --git a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java
index 35404c76..68c71c4b 100644
--- a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java
+++ b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java
@@ -20,6 +20,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
+import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -98,6 +99,10 @@ public class PgpHandler extends Activity {
if (extra.getString("Operation").equals("DECRYPT")) {
setContentView(R.layout.decrypt_layout);
((TextView) findViewById(R.id.crypto_password_file)).setText(extra.getString("NAME"));
+ String cat = new File(extra.getString("FILE_PATH").replace(PasswordRepository.getWorkTree().getAbsolutePath(), ""))
+ .getParentFile().getName();
+
+ ((TextView) findViewById(R.id.crypto_password_category)).setText(cat + "/");
} else if (extra.getString("Operation").equals("ENCRYPT")) {
setContentView(R.layout.encrypt_layout);
String cat = extra.getString("FILE_PATH");
@@ -150,7 +155,7 @@ public class PgpHandler extends Activity {
finish();
break;
case R.id.crypto_delete_button:
- deletePassword();
+// deletePassword();
break;
case R.id.crypto_get_key_ids:
getKeyIds(new Intent());
@@ -221,6 +226,7 @@ public class PgpHandler extends Activity {
protected void onPostExecute(Boolean b) {
//clear password
((TextView) findViewById(R.id.crypto_password_show)).setText("");
+ ((TextView) findViewById(R.id.crypto_extra_show)).setText("");
findViewById(R.id.crypto_extra_show_layout).setVisibility(View.INVISIBLE);
findViewById(R.id.crypto_container).setVisibility(View.INVISIBLE);
}
@@ -456,30 +462,5 @@ public class PgpHandler extends Activity {
}
- private void deletePassword() {
- new AlertDialog.Builder(this).
- setMessage("Are you sure you want to delete the password \"" +
- getIntent().getExtras().getString("NAME") + "\"")
- .setPositiveButton("YES", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- (new File(getIntent().getExtras().getString("FILE_PATH"))).delete();
-
- setResult(RESULT_CANCELED);
- Git git = new Git(PasswordRepository.getRepository(new File("")));
- GitAsyncTask tasks = new GitAsyncTask(activity, true);
- tasks.execute(
- git.rm().addFilepattern(getIntent().getExtras().getString("FILE_PATH").replace(PasswordRepository.getWorkTree() + "/", "")),
- git.commit().setMessage("[ANDROID PwdStore] Remove " + getIntent().getExtras().getString("FILE_PATH") + " from store.")
- );
- }
- })
- .setNegativeButton("NO", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- }
- })
- .show();
- }
}
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 b0cdb5a5..fbc7d817 100644
--- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java
+++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordAdapter.java
@@ -1,19 +1,30 @@
package com.zeapo.pwdstore.utils;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.DataSetObserver;
import android.graphics.Typeface;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ExpandableListAdapter;
+import android.widget.ImageButton;
import android.widget.TextView;
+import com.zeapo.pwdstore.PasswordStore;
import com.zeapo.pwdstore.R;
+import com.zeapo.pwdstore.crypto.PgpHandler;
+
+import org.apache.commons.io.FileUtils;
import java.util.ArrayList;
-public class PasswordAdapter extends ArrayAdapter<PasswordItem> {
- private final Context context;
+public class PasswordAdapter extends ArrayAdapter<PasswordItem> implements ExpandableListAdapter{
+ private final PasswordStore activity;
private final ArrayList<PasswordItem> values;
static class ViewHolder {
@@ -21,20 +32,68 @@ public class PasswordAdapter extends ArrayAdapter<PasswordItem> {
public TextView type;
}
- public PasswordAdapter(Context context, ArrayList<PasswordItem> values) {
- super(context, R.layout.password_row_layout, values);
- this.context = context;
+ public PasswordAdapter(PasswordStore activity, ArrayList<PasswordItem> values) {
+ super(activity, R.layout.password_row_layout, values);
this.values = values;
+ this.activity = activity;
+ }
+
+ @Override
+ public void registerDataSetObserver(DataSetObserver dataSetObserver) {
+
+ }
+
+ @Override
+ public void unregisterDataSetObserver(DataSetObserver dataSetObserver) {
+
+ }
+
+ @Override
+ public int getGroupCount() {
+ return values.size();
+ }
+
+ @Override
+ public int getChildrenCount(int i) {
+ if (values.get(i).getType() == PasswordItem.TYPE_CATEGORY)
+ return 0;
+ else
+ return 1;
+ }
+
+ @Override
+ public Object getGroup(int i) {
+ return values.get(i);
+ }
+
+ @Override
+ public Object getChild(int i, int i2) {
+ return null;
+ }
+
+ @Override
+ public long getGroupId(int i) {
+ return 0;
+ }
+
+ @Override
+ public long getChildId(int i, int i2) {
+ return 0;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return false;
}
@Override
- public View getView(int position, View convertView, ViewGroup parent) {
+ public View getGroupView(int i, boolean b, View convertView, ViewGroup viewGroup) {
View rowView = convertView;
- PasswordItem pass = values.get(position);
+ PasswordItem pass = values.get(i);
// reuse for performance, holder pattern!
if (rowView == null) {
- LayoutInflater inflater = (LayoutInflater) context
+ LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.password_row_layout, null);
@@ -49,15 +108,78 @@ public class PasswordAdapter extends ArrayAdapter<PasswordItem> {
holder.name.setText(pass.toString());
if (pass.getType() == PasswordItem.TYPE_CATEGORY) {
- holder.name.setTextColor(this.context.getResources().getColor(android.R.color.holo_blue_dark));
+ holder.name.setTextColor(this.activity.getResources().getColor(android.R.color.holo_blue_dark));
holder.name.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
holder.type.setText("Category: ");
} else {
holder.type.setText("Password: ");
- holder.name.setTextColor(this.context.getResources().getColor(android.R.color.holo_orange_dark));
+ holder.name.setTextColor(this.activity.getResources().getColor(android.R.color.holo_orange_dark));
holder.name.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL));
}
return rowView;
}
+
+ @Override
+ public View getChildView(int i, int i2, boolean b, View view, ViewGroup viewGroup) {
+ final PasswordItem pass = values.get(i);
+
+ LayoutInflater inflater = (LayoutInflater) this.activity
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ view = inflater.inflate(R.layout.child_row_layout, null);
+
+ View.OnClickListener onClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.crypto_show_button:
+ activity.decryptPassword(pass);
+ break;
+ case R.id.crypto_delete_button:
+ activity.deletePassword(pass);
+ break;
+ }
+ }
+ };
+
+ ((ImageButton) view.findViewById(R.id.crypto_show_button)).setOnClickListener(onClickListener);
+ ((ImageButton) view.findViewById(R.id.crypto_delete_button)).setOnClickListener(onClickListener);
+
+ return view;
+ }
+
+ @Override
+ public boolean isChildSelectable(int i, int i2) {
+ return false;
+ }
+
+ @Override
+ public boolean areAllItemsEnabled() {
+ return false;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return false;
+ }
+
+ @Override
+ public void onGroupExpanded(int i) {
+
+ }
+
+ @Override
+ public void onGroupCollapsed(int i) {
+
+ }
+
+ @Override
+ public long getCombinedChildId(long l, long l2) {
+ return 0;
+ }
+
+ @Override
+ public long getCombinedGroupId(long l) {
+ return 0;
+ }
} \ No newline at end of file
diff --git a/app/src/main/res/drawable-xxhdpi/blue_rectangle.xml b/app/src/main/res/drawable-xxhdpi/blue_rectangle.xml
new file mode 100644
index 00000000..61cb44f5
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/blue_rectangle.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="rectangle"
+ android:dither="true">
+ <corners android:radius="2dp"/>
+ <solid android:color="#ccc" />
+
+ </shape>
+ </item>
+
+ <item>
+ <shape android:shape="rectangle" android:dither="true">
+ <corners android:radius="2dp" />
+ <solid android:color="@android:color/holo_blue_light" />
+
+ <padding android:bottom="8dp"
+ android:left="8dp"
+ android:right="8dp"
+ android:top="8dp" />
+ </shape>
+ </item>
+</layer-list> \ No newline at end of file
diff --git a/app/src/main/res/drawable-xxhdpi/red_rectangle.xml b/app/src/main/res/drawable-xxhdpi/red_rectangle.xml
index b8e6a5d6..a6c48d0f 100644
--- a/app/src/main/res/drawable-xxhdpi/red_rectangle.xml
+++ b/app/src/main/res/drawable-xxhdpi/red_rectangle.xml
@@ -10,7 +10,7 @@
</shape>
</item>
- <item android:bottom="2dp">
+ <item>
<shape android:shape="rectangle" android:dither="true">
<corners android:radius="2dp" />
<solid android:color="@android:color/holo_red_light" />
diff --git a/app/src/main/res/layout/child_row_layout.xml b/app/src/main/res/layout/child_row_layout.xml
new file mode 100644
index 00000000..0fc5e33d
--- /dev/null
+++ b/app/src/main/res/layout/child_row_layout.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical" android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <ImageButton
+ android:id="@+id/crypto_delete_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ico_del"
+ android:background="@drawable/red_rectangle"
+ android:layout_gravity="center_vertical"
+ android:layout_column="1"
+ android:layout_row="0"/>
+
+ <ImageButton
+ android:id="@+id/crypto_show_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ico_key"
+ android:background="@drawable/blue_rectangle"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="8dp"
+ android:layout_column="2"
+ android:layout_row="0"/>
+
+</GridLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/decrypt_layout.xml b/app/src/main/res/layout/decrypt_layout.xml
index c1ae7c6c..e81f288b 100644
--- a/app/src/main/res/layout/decrypt_layout.xml
+++ b/app/src/main/res/layout/decrypt_layout.xml
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.zeapo.pwdstore.crypto.PgpHandler"
android:orientation="vertical"
android:background="#eee">
@@ -19,30 +15,59 @@
<GridLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/rectangle"
- android:orientation="horizontal">
+ android:background="@drawable/rectangle">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@android:color/holo_blue_light"
+ android:text="CATEGORY HERE"
+ android:id="@+id/crypto_password_category"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="8dp"
+ android:layout_column="0"
+ android:layout_row="0"
+ android:layout_columnSpan="2"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_orange_dark"
- android:text="Large Text"
+ android:textStyle="bold"
+ android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium"
+ android:text="PASSWORD FILE NAME HERE"
android:id="@+id/crypto_password_file"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp"
android:layout_column="0"
- android:layout_row="0"/>
+ android:layout_columnSpan="2"
+ android:layout_row="1"/>
+
+
+ <ImageButton
+ android:id="@+id/crypto_delete_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ico_del"
+ android:background="@drawable/red_rectangle"
+ android:layout_gravity="center_vertical"
+ android:onClick="handleClick"
+ android:layout_column="3"
+ android:layout_row="0"
+ android:layout_rowSpan="2"/>
<ImageButton
android:id="@+id/crypto_show_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ico_key"
- android:background="@android:drawable/screen_background_light_transparent"
+ android:background="@drawable/blue_rectangle"
android:layout_gravity="center_vertical"
+ android:layout_marginLeft="8dp"
android:onClick="handleClick"
- android:layout_column="2"
- android:layout_row="0"/>
+ android:layout_column="4"
+ android:layout_row="0"
+ android:layout_rowSpan="2"/>
</GridLayout>
@@ -53,6 +78,10 @@
android:layout_height="wrap_content"
android:background="@drawable/rectangle"
android:layout_marginTop="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
android:visibility="invisible">
<GridLayout
@@ -102,16 +131,12 @@
android:textStyle="bold"
android:textColor="@android:color/black"
android:text="Extra content: "/>
- <ScrollView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <TextView
- android:id="@+id/crypto_extra_show"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="@android:color/black"
- android:typeface="monospace"/>
- </ScrollView>
+ <TextView
+ android:id="@+id/crypto_extra_show"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@android:color/black"
+ android:typeface="monospace"/>
</LinearLayout>
</LinearLayout>
@@ -119,15 +144,4 @@
</LinearLayout>
- <ImageButton
- android:id="@+id/crypto_delete_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ico_del"
- android:background="@drawable/oval"
- android:layout_gravity="center_vertical"
- android:onClick="handleClick"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"/>
-
-</RelativeLayout> \ No newline at end of file
+</ScrollView> \ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_password_list.xml b/app/src/main/res/layout/fragment_password_list.xml
index 64dd3d94..6ae0c0d8 100644
--- a/app/src/main/res/layout/fragment_password_list.xml
+++ b/app/src/main/res/layout/fragment_password_list.xml
@@ -5,11 +5,12 @@
android:layout_height="match_parent"
tools:context="com.zeapo.pwdstore.PasswordFragment">
- <ListView
+ <ExpandableListView
android:id="@+id/pass_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:dividerHeight="@dimen/activity_vertical_margin"
- android:divider="@android:color/transparent"/>
+ android:divider="@android:color/transparent"
+ android:groupIndicator="@android:drawable/screen_background_light_transparent"/>
</FrameLayout>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 51ebc463..9c874b12 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -26,5 +26,8 @@
<string name="crypto_pass_label">Password</string>
<string name="crypto_extra_label">Extra</string>
+ <!-- DECRYPT Layout -->
+ <string name="crypto_category">Category</string>
+
</resources>