aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-11-14 03:24:07 +0100
committerDominik Schürmann <dominik@dominikschuermann.de>2015-12-27 15:00:14 +0100
commit00e97586b06e5e61f6639b75423f9ec3edba47a0 (patch)
tree594795a6d66d4d3f0a09a0b9108b2d533691397f /OpenKeychain
parentfd119bda00bac1cfe6dbcafa2736c65e3624c083 (diff)
downloadopen-keychain-00e97586b06e5e61f6639b75423f9ec3edba47a0.tar.gz
open-keychain-00e97586b06e5e61f6639b75423f9ec3edba47a0.tar.bz2
open-keychain-00e97586b06e5e61f6639b75423f9ec3edba47a0.zip
inline subkey editing (wip commit)
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java3
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java272
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java29
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml4
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml104
-rw-r--r--OpenKeychain/src/main/res/menu/edit_subkeys.xml12
-rw-r--r--OpenKeychain/src/main/res/menu/edit_user_id.xml2
-rw-r--r--OpenKeychain/src/main/res/menu/key_view.xml2
-rw-r--r--OpenKeychain/src/main/res/values-cs/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-de/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-es/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-eu/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-fr/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-it/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-ja/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-nl/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-pl/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-ru/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-sl/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-sr/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-sv/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-tr/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-uk/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values-zh-rTW/strings.xml2
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml5
26 files changed, 409 insertions, 60 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
index fa0edec48..969a84f14 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
@@ -231,7 +231,8 @@ public class EditKeyFragment extends QueueingCryptoOperationFragment<SaveKeyring
mUserIdsAddedAdapter = new UserIdsAddedAdapter(getActivity(), mSaveKeyringParcel.mAddUserIds, false);
mUserIdsAddedList.setAdapter(mUserIdsAddedAdapter);
- mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0, mSaveKeyringParcel);
+ mSubkeysAdapter = new SubkeysAdapter(getActivity(), null, 0);
+ mSubkeysAdapter.setEditMode(mSaveKeyringParcel);
mSubkeysList.setAdapter(mSubkeysAdapter);
mSubkeysAddedAdapter = new SubkeysAddedAdapter(getActivity(), mSaveKeyringParcel.mAddSubKeys, false);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java
index bd00c6780..ce68bfab1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvSubkeysFragment.java
@@ -20,30 +20,59 @@ package org.sufficientlysecure.keychain.ui;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
+import android.view.ActionMode;
+import android.view.ActionMode.Callback;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
import android.widget.ListView;
+import android.widget.ViewAnimator;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
+import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType;
import org.sufficientlysecure.keychain.provider.KeychainContract;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel;
+import org.sufficientlysecure.keychain.service.SaveKeyringParcel.SubkeyChange;
import org.sufficientlysecure.keychain.ui.adapter.SubkeysAdapter;
+import org.sufficientlysecure.keychain.ui.adapter.SubkeysAddedAdapter;
+import org.sufficientlysecure.keychain.ui.adapter.UserIdsAddedAdapter;
+import org.sufficientlysecure.keychain.ui.dialog.AddSubkeyDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyDialogFragment;
+import org.sufficientlysecure.keychain.ui.dialog.EditSubkeyExpiryDialogFragment;
+import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
public static final String ARG_DATA_URI = "data_uri";
+ public static final int LOADER_ID_SUBKEYS = 0;
private ListView mSubkeysList;
+ private ListView mSubkeysAddedList;
+ private View mSubkeysAddedLayout;
+ private ViewAnimator mSubkeyAddFabLayout;
+
private SubkeysAdapter mSubkeysAdapter;
+ private SubkeysAddedAdapter mSubkeysAddedAdapter;
private Uri mDataUriSubkeys;
+ private boolean mHasSecret;
+ private SaveKeyringParcel mEditModeSaveKeyringParcel;
+
/**
* Creates new instance of this fragment
*/
@@ -64,6 +93,36 @@ public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements
mSubkeysList = (ListView) view.findViewById(R.id.keys);
+ mSubkeysList = (ListView) view.findViewById(R.id.view_key_user_ids);
+ mSubkeysAddedList = (ListView) view.findViewById(R.id.view_key_user_ids_added);
+ mSubkeysAddedLayout = view.findViewById(R.id.view_key_user_ids_add_layout);
+
+ mSubkeysList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ editSubkey(position);
+ }
+ });
+
+ View footer = new View(getActivity());
+ int spacing = (int) android.util.TypedValue.applyDimension(
+ android.util.TypedValue.COMPLEX_UNIT_DIP, 72, getResources().getDisplayMetrics()
+ );
+ android.widget.AbsListView.LayoutParams params = new android.widget.AbsListView.LayoutParams(
+ android.widget.AbsListView.LayoutParams.MATCH_PARENT,
+ spacing
+ );
+ footer.setLayoutParams(params);
+ mSubkeysAddedList.addFooterView(footer, null, false);
+
+ mSubkeyAddFabLayout = (ViewAnimator) view.findViewById(R.id.view_key_subkey_fab_layout);
+ view.findViewById(R.id.view_key_subkey_fab).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ addSubkey();
+ }
+ });
+
return root;
}
@@ -90,7 +149,7 @@ public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements
// Prepare the loaders. Either re-connect with an existing ones,
// or start new ones.
- getLoaderManager().initLoader(0, null, this);
+ getLoaderManager().initLoader(LOADER_ID_SUBKEYS, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
@@ -122,4 +181,215 @@ public class ViewKeyAdvSubkeysFragment extends LoaderFragment implements
mSubkeysAdapter.swapCursor(null);
}
+ private void enterEditMode() {
+ FragmentActivity activity = getActivity();
+ activity.startActionMode(new Callback() {
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+
+ mEditModeSaveKeyringParcel = new SaveKeyringParcel(0L, new byte[0]);
+
+ mSubkeysAddedAdapter =
+ new SubkeysAddedAdapter(getActivity(), mEditModeSaveKeyringParcel.mAddSubKeys, false);
+ mSubkeysAddedList.setAdapter(mSubkeysAddedAdapter);
+ mSubkeysAddedLayout.setVisibility(View.VISIBLE);
+ mSubkeyAddFabLayout.setDisplayedChild(1);
+
+ mSubkeysAdapter.setEditMode(mEditModeSaveKeyringParcel);
+ getLoaderManager().restartLoader(LOADER_ID_SUBKEYS, null, ViewKeyAdvSubkeysFragment.this);
+
+ mode.setTitle(R.string.title_edit_subkeys);
+ mode.getMenuInflater().inflate(R.menu.action_edit_uids, menu);
+
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ mode.finish();
+ return true;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ mEditModeSaveKeyringParcel = null;
+ mSubkeysAdapter.setEditMode(null);
+ mSubkeysAddedLayout.setVisibility(View.GONE);
+ mSubkeyAddFabLayout.setDisplayedChild(0);
+ getLoaderManager().restartLoader(0, null, ViewKeyAdvSubkeysFragment.this);
+ }
+ });
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_edit_subkeys:
+ enterEditMode();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void addSubkey() {
+ boolean willBeMasterKey;
+ if (mSubkeysAdapter != null) {
+ willBeMasterKey = mSubkeysAdapter.getCount() == 0 && mSubkeysAddedAdapter.getCount() == 0;
+ } else {
+ willBeMasterKey = mSubkeysAddedAdapter.getCount() == 0;
+ }
+
+ AddSubkeyDialogFragment addSubkeyDialogFragment =
+ AddSubkeyDialogFragment.newInstance(willBeMasterKey);
+ addSubkeyDialogFragment
+ .setOnAlgorithmSelectedListener(
+ new AddSubkeyDialogFragment.OnAlgorithmSelectedListener() {
+ @Override
+ public void onAlgorithmSelected(SaveKeyringParcel.SubkeyAdd newSubkey) {
+ mSubkeysAddedAdapter.add(newSubkey);
+ }
+ }
+ );
+ addSubkeyDialogFragment.show(getActivity().getSupportFragmentManager(), "addSubkeyDialog");
+ }
+
+ private void editSubkey(final int position) {
+ final long keyId = mSubkeysAdapter.getKeyId(position);
+
+ Handler returnHandler = new Handler() {
+ @Override
+ public void handleMessage(Message message) {
+ switch (message.what) {
+ case EditSubkeyDialogFragment.MESSAGE_CHANGE_EXPIRY:
+ editSubkeyExpiry(position);
+ break;
+ case EditSubkeyDialogFragment.MESSAGE_REVOKE:
+ // toggle
+ if (mEditModeSaveKeyringParcel.mRevokeSubKeys.contains(keyId)) {
+ mEditModeSaveKeyringParcel.mRevokeSubKeys.remove(keyId);
+ } else {
+ mEditModeSaveKeyringParcel.mRevokeSubKeys.add(keyId);
+ }
+ break;
+ case EditSubkeyDialogFragment.MESSAGE_STRIP: {
+ SecretKeyType secretKeyType = mSubkeysAdapter.getSecretKeyType(position);
+ if (secretKeyType == SecretKeyType.GNU_DUMMY) {
+ // Key is already stripped; this is a no-op.
+ break;
+ }
+
+ SubkeyChange change = mEditModeSaveKeyringParcel.getSubkeyChange(keyId);
+ if (change == null) {
+ mEditModeSaveKeyringParcel.mChangeSubKeys.add(new SubkeyChange(keyId, true, false));
+ break;
+ }
+ // toggle
+ change.mDummyStrip = !change.mDummyStrip;
+ if (change.mDummyStrip && change.mMoveKeyToCard) {
+ // User had chosen to divert key, but now wants to strip it instead.
+ change.mMoveKeyToCard = false;
+ }
+ break;
+ }
+ case EditSubkeyDialogFragment.MESSAGE_MOVE_KEY_TO_CARD: {
+ // TODO: enable later when Admin PIN handling is resolved
+ Notify.create(getActivity(),
+ "This feature will be available in an upcoming OpenKeychain version.",
+ Notify.Style.WARN).show();
+ break;
+
+// Activity activity = EditKeyFragment.this.getActivity();
+// SecretKeyType secretKeyType = mSubkeysAdapter.getSecretKeyType(position);
+// if (secretKeyType == SecretKeyType.DIVERT_TO_CARD ||
+// secretKeyType == SecretKeyType.GNU_DUMMY) {
+// Notify.create(activity, R.string.edit_key_error_bad_nfc_stripped, Notify.Style.ERROR)
+// .show((ViewGroup) activity.findViewById(R.id.import_snackbar));
+// break;
+// }
+// int algorithm = mSubkeysAdapter.getAlgorithm(position);
+// // these are the PGP constants for RSA_GENERAL, RSA_ENCRYPT and RSA_SIGN
+// if (algorithm != 1 && algorithm != 2 && algorithm != 3) {
+// Notify.create(activity, R.string.edit_key_error_bad_nfc_algo, Notify.Style.ERROR)
+// .show((ViewGroup) activity.findViewById(R.id.import_snackbar));
+// break;
+// }
+// if (mSubkeysAdapter.getKeySize(position) != 2048) {
+// Notify.create(activity, R.string.edit_key_error_bad_nfc_size, Notify.Style.ERROR)
+// .show((ViewGroup) activity.findViewById(R.id.import_snackbar));
+// break;
+// }
+//
+//
+// SubkeyChange change;
+// change = mSaveKeyringParcel.getSubkeyChange(keyId);
+// if (change == null) {
+// mSaveKeyringParcel.mChangeSubKeys.add(
+// new SubkeyChange(keyId, false, true)
+// );
+// break;
+// }
+// // toggle
+// change.mMoveKeyToCard = !change.mMoveKeyToCard;
+// if (change.mMoveKeyToCard && change.mDummyStrip) {
+// // User had chosen to strip key, but now wants to divert it.
+// change.mDummyStrip = false;
+// }
+// break;
+ }
+ }
+ getLoaderManager().getLoader(LOADER_ID_SUBKEYS).forceLoad();
+ }
+ };
+
+ // Create a new Messenger for the communication back
+ final Messenger messenger = new Messenger(returnHandler);
+
+ DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
+ public void run() {
+ EditSubkeyDialogFragment dialogFragment =
+ EditSubkeyDialogFragment.newInstance(messenger);
+
+ dialogFragment.show(getActivity().getSupportFragmentManager(), "editSubkeyDialog");
+ }
+ });
+ }
+
+ private void editSubkeyExpiry(final int position) {
+ final long keyId = mSubkeysAdapter.getKeyId(position);
+ final Long creationDate = mSubkeysAdapter.getCreationDate(position);
+ final Long expiryDate = mSubkeysAdapter.getExpiryDate(position);
+
+ Handler returnHandler = new Handler() {
+ @Override
+ public void handleMessage(Message message) {
+ switch (message.what) {
+ case EditSubkeyExpiryDialogFragment.MESSAGE_NEW_EXPIRY:
+ mEditModeSaveKeyringParcel.getOrCreateSubkeyChange(keyId).mExpiry =
+ (Long) message.getData().getSerializable(
+ EditSubkeyExpiryDialogFragment.MESSAGE_DATA_EXPIRY);
+ break;
+ }
+ getLoaderManager().getLoader(LOADER_ID_SUBKEYS).forceLoad();
+ }
+ };
+
+ // Create a new Messenger for the communication back
+ final Messenger messenger = new Messenger(returnHandler);
+
+ DialogFragmentWorkaround.INTERFACE.runnableRunDelayed(new Runnable() {
+ public void run() {
+ EditSubkeyExpiryDialogFragment dialogFragment =
+ EditSubkeyExpiryDialogFragment.newInstance(messenger, creationDate, expiryDate);
+
+ dialogFragment.show(getActivity().getSupportFragmentManager(), "editSubkeyExpiryDialog");
+ }
+ });
+ }
+
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java
index e98970754..c8e892276 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvUserIdsFragment.java
@@ -101,8 +101,8 @@ public class ViewKeyAdvUserIdsFragment extends LoaderFragment implements
footer.setLayoutParams(params);
mUserIdsAddedList.addFooterView(footer, null, false);
- mUserIdAddFabLayout = (ViewAnimator) view.findViewById(R.id.view_key_user_id_fab_layout);
- view.findViewById(R.id.view_key_user_id_fab).setOnClickListener(new View.OnClickListener() {
+ mUserIdAddFabLayout = (ViewAnimator) view.findViewById(R.id.view_key_subkey_fab_layout);
+ view.findViewById(R.id.view_key_subkey_fab).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addUserId();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java
index 24f5f04a1..84608f2dc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SubkeysAdapter.java
@@ -22,6 +22,7 @@ import android.content.res.ColorStateList;
import android.database.Cursor;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
+import android.support.annotation.Nullable;
import android.support.v4.widget.CursorAdapter;
import android.text.Spannable;
import android.text.SpannableString;
@@ -49,7 +50,7 @@ public class SubkeysAdapter extends CursorAdapter {
private LayoutInflater mInflater;
private SaveKeyringParcel mSaveKeyringParcel;
- private boolean hasAnySecret;
+ private boolean mHasAnySecret;
private ColorStateList mDefaultTextColor;
public static final String[] SUBKEYS_PROJECTION = new String[]{
@@ -85,16 +86,10 @@ public class SubkeysAdapter extends CursorAdapter {
private static final int INDEX_EXPIRY = 13;
private static final int INDEX_FINGERPRINT = 14;
- public SubkeysAdapter(Context context, Cursor c, int flags,
- SaveKeyringParcel saveKeyringParcel) {
+ public SubkeysAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
- mSaveKeyringParcel = saveKeyringParcel;
- }
-
- public SubkeysAdapter(Context context, Cursor c, int flags) {
- this(context, c, flags, null);
}
public long getKeyId(int position) {
@@ -133,12 +128,12 @@ public class SubkeysAdapter extends CursorAdapter {
@Override
public Cursor swapCursor(Cursor newCursor) {
- hasAnySecret = false;
+ mHasAnySecret = false;
if (newCursor != null && newCursor.moveToFirst()) {
do {
SecretKeyType hasSecret = SecretKeyType.fromNum(newCursor.getInt(INDEX_HAS_SECRET));
if (hasSecret.isUsable()) {
- hasAnySecret = true;
+ mHasAnySecret = true;
break;
}
} while (newCursor.moveToNext());
@@ -354,4 +349,18 @@ public class SubkeysAdapter extends CursorAdapter {
}
}
+ /** Set this adapter into edit mode. This mode displays additional info for
+ * each item from a supplied SaveKeyringParcel reference.
+ *
+ * Note that it is up to the caller to reload the underlying cursor after
+ * updating the SaveKeyringParcel!
+ *
+ * @see SaveKeyringParcel
+ *
+ * @param saveKeyringParcel The parcel to get info from, or null to leave edit mode.
+ */
+ public void setEditMode(@Nullable SaveKeyringParcel saveKeyringParcel) {
+ mSaveKeyringParcel = saveKeyringParcel;
+ }
+
}
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml
index ab0c59865..98ee2d492 100644
--- a/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_main_fragment.xml
@@ -63,7 +63,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
- android:id="@+id/view_key_user_id_fab_layout"
+ android:id="@+id/view_key_subkey_fab_layout"
android:inAnimation="@anim/fab_slide_in"
android:outAnimation="@anim/fab_slide_down">
@@ -72,7 +72,7 @@
android:layout_height="wrap_content" />
<android.support.design.widget.FloatingActionButton
- android:id="@+id/view_key_user_id_fab"
+ android:id="@+id/view_key_subkey_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="24dp"
diff --git a/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml
index 62fd113f9..c86b32349 100644
--- a/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_adv_subkeys_fragment.xml
@@ -1,34 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+android:layout_width="match_parent"
+android:layout_height="match_parent"
+xmlns:tools="http://schemas.android.com/tools">
+
+<ScrollView
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:focusable="true"
- android:focusableInTouchMode="true"
- android:descendantFocusability="beforeDescendants"
- android:orientation="vertical">
-
- <TextView
- style="@style/SectionHeader"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:layout_marginTop="8dp"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
- android:text="@string/section_keys" />
+ android:layout_height="match_parent">
- <FrameLayout
+ <!-- focusable and related properties to workaround http://stackoverflow.com/q/16182331-->
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="wrap_content"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:descendantFocusability="beforeDescendants"
+ android:orientation="vertical"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp">
+
+ <TextView
+ style="@style/SectionHeader"
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_marginTop="8dp"
+ android:text="@string/section_keys"
+ android:layout_weight="1" />
- <ListView
+ <org.sufficientlysecure.keychain.ui.widget.FixedListView
android:id="@+id/keys"
android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_marginBottom="4dp"
+ android:layout_weight="1"
+ android:scrollbarStyle="outsideOverlay" />
+
+ <LinearLayout
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:scrollbarStyle="outsideOverlay"
- android:paddingLeft="16dp"
- android:paddingRight="16dp"
- android:layout_marginBottom="8dp" />
- </FrameLayout>
+ android:orientation="vertical"
+ android:id="@+id/view_key_subkeys_add_layout"
+ android:visibility="gone"
+ tools:visibility="visible">
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:background="?android:attr/listDivider" />
+
+ <org.sufficientlysecure.keychain.ui.widget.FixedListView
+ android:id="@+id/view_key_subkeys_added"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+</ScrollView>
+
+<ViewAnimator
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentBottom="true"
+ android:id="@+id/view_key_subkey_fab_layout"
+ android:inAnimation="@anim/fab_slide_in"
+ android:outAnimation="@anim/fab_slide_down">
+
+ <Space
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/view_key_subkey_fab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="24dp"
+ android:src="@drawable/ic_person_add_grey_24dp"
+ android:visibility="invisible"
+ android:layout_gravity="bottom"
+ tools:visibility="visible" />
+
+</ViewAnimator>
-</LinearLayout> \ No newline at end of file
+</RelativeLayout>
diff --git a/OpenKeychain/src/main/res/menu/edit_subkeys.xml b/OpenKeychain/src/main/res/menu/edit_subkeys.xml
new file mode 100644
index 000000000..f9f75ebbb
--- /dev/null
+++ b/OpenKeychain/src/main/res/menu/edit_subkeys.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <item
+ android:id="@+id/menu_edit_subkeys"
+ android:icon="@drawable/ic_mode_edit_white_24dp"
+ android:title="@string/key_view_action_edit_subkeys"
+ app:showAsAction="always"
+ />
+
+</menu> \ No newline at end of file
diff --git a/OpenKeychain/src/main/res/menu/edit_user_id.xml b/OpenKeychain/src/main/res/menu/edit_user_id.xml
index d1f856fd2..617dae841 100644
--- a/OpenKeychain/src/main/res/menu/edit_user_id.xml
+++ b/OpenKeychain/src/main/res/menu/edit_user_id.xml
@@ -5,7 +5,7 @@
<item
android:id="@+id/menu_edit_user_ids"
android:icon="@drawable/ic_mode_edit_white_24dp"
- android:title="@string/key_view_action_edit"
+ android:title="@string/key_view_action_edit_ids"
app:showAsAction="always"
/>
diff --git a/OpenKeychain/src/main/res/menu/key_view.xml b/OpenKeychain/src/main/res/menu/key_view.xml
index c0adfcd6f..a3de4efed 100644
--- a/OpenKeychain/src/main/res/menu/key_view.xml
+++ b/OpenKeychain/src/main/res/menu/key_view.xml
@@ -7,7 +7,7 @@
android:icon="@drawable/ic_mode_edit_white_24dp"
android:visible="false"
app:showAsAction="always"
- android:title="@string/key_view_action_edit" />
+ android:title="@string/key_view_action_edit_ids" />
<item
android:id="@+id/menu_key_view_refresh"
diff --git a/OpenKeychain/src/main/res/values-cs/strings.xml b/OpenKeychain/src/main/res/values-cs/strings.xml
index 25f6803d0..6b080e665 100644
--- a/OpenKeychain/src/main/res/values-cs/strings.xml
+++ b/OpenKeychain/src/main/res/values-cs/strings.xml
@@ -385,7 +385,7 @@
<string name="key_list_empty_text1">Žádný klíč nenalezen!</string>
<string name="key_list_filter_show_all">Zobrazit všechny klíče</string>
<!--Key view-->
- <string name="key_view_action_edit">Editovat klíč</string>
+ <string name="key_view_action_edit_ids">Editovat klíč</string>
<string name="key_view_action_encrypt">Zašifrovat text</string>
<string name="key_view_action_encrypt_files">soubory</string>
<string name="key_view_action_certify">Potvrdit klíč</string>
diff --git a/OpenKeychain/src/main/res/values-de/strings.xml b/OpenKeychain/src/main/res/values-de/strings.xml
index 6f4b8d1d5..6a29c338f 100644
--- a/OpenKeychain/src/main/res/values-de/strings.xml
+++ b/OpenKeychain/src/main/res/values-de/strings.xml
@@ -572,7 +572,7 @@
<string name="key_list_fab_search">Schlüsselsuche</string>
<string name="key_list_fab_import">Aus Datei importieren</string>
<!--Key view-->
- <string name="key_view_action_edit">Schlüssel bearbeiten</string>
+ <string name="key_view_action_edit_ids">Schlüssel bearbeiten</string>
<string name="key_view_action_encrypt">Text verschlüsseln</string>
<string name="key_view_action_encrypt_files">Dateien</string>
<string name="key_view_action_certify">Schlüssel bestätigen</string>
diff --git a/OpenKeychain/src/main/res/values-es/strings.xml b/OpenKeychain/src/main/res/values-es/strings.xml
index b39ccac5c..b895ced33 100644
--- a/OpenKeychain/src/main/res/values-es/strings.xml
+++ b/OpenKeychain/src/main/res/values-es/strings.xml
@@ -581,7 +581,7 @@
<string name="key_list_fab_search">Búsqueda de clave</string>
<string name="key_list_fab_import">Importar desde fichero</string>
<!--Key view-->
- <string name="key_view_action_edit">Editar clave</string>
+ <string name="key_view_action_edit_ids">Editar clave</string>
<string name="key_view_action_encrypt">Cifrar texto</string>
<string name="key_view_action_encrypt_files">ficheros</string>
<string name="key_view_action_certify">Confirmar clave</string>
diff --git a/OpenKeychain/src/main/res/values-eu/strings.xml b/OpenKeychain/src/main/res/values-eu/strings.xml
index 3d2ba88d8..b26be00ce 100644
--- a/OpenKeychain/src/main/res/values-eu/strings.xml
+++ b/OpenKeychain/src/main/res/values-eu/strings.xml
@@ -576,7 +576,7 @@
<string name="key_list_fab_search">Giltza Bilaketa</string>
<string name="key_list_fab_import">Inportatu Agiritik</string>
<!--Key view-->
- <string name="key_view_action_edit">Editatu giltza</string>
+ <string name="key_view_action_edit_ids">Editatu giltza</string>
<string name="key_view_action_encrypt">Enkriptatu idazkia</string>
<string name="key_view_action_encrypt_files">agiriak</string>
<string name="key_view_action_certify">Baieztatu giltza</string>
diff --git a/OpenKeychain/src/main/res/values-fr/strings.xml b/OpenKeychain/src/main/res/values-fr/strings.xml
index d80ff8988..506cf2af9 100644
--- a/OpenKeychain/src/main/res/values-fr/strings.xml
+++ b/OpenKeychain/src/main/res/values-fr/strings.xml
@@ -586,7 +586,7 @@
<string name="key_list_fab_search">Recherche de clefs</string>
<string name="key_list_fab_import">Importer d\'un fichier</string>
<!--Key view-->
- <string name="key_view_action_edit">Modifier la clef</string>
+ <string name="key_view_action_edit_ids">Modifier la clef</string>
<string name="key_view_action_encrypt">Chiffrer un texte</string>
<string name="key_view_action_encrypt_files">fichiers</string>
<string name="key_view_action_certify">Confirmer la clef</string>
diff --git a/OpenKeychain/src/main/res/values-it/strings.xml b/OpenKeychain/src/main/res/values-it/strings.xml
index 42478af12..8a9fc394f 100644
--- a/OpenKeychain/src/main/res/values-it/strings.xml
+++ b/OpenKeychain/src/main/res/values-it/strings.xml
@@ -441,7 +441,7 @@ Permetti accesso?\n\nATTENZIONE: Se non sai perche\' questo schermata e\' appars
<string name="key_list_empty_text1">Nessuna chiave trovata!</string>
<string name="key_list_filter_show_all">Mostra tutte le chiavi</string>
<!--Key view-->
- <string name="key_view_action_edit">Modifica chiave</string>
+ <string name="key_view_action_edit_ids">Modifica chiave</string>
<string name="key_view_action_encrypt">Codifica Testo</string>
<string name="key_view_action_encrypt_files">documenti</string>
<string name="key_view_action_update">Aggiorna dal server delle chiavi</string>
diff --git a/OpenKeychain/src/main/res/values-ja/strings.xml b/OpenKeychain/src/main/res/values-ja/strings.xml
index 82a4c8f33..5b1b3e9ef 100644
--- a/OpenKeychain/src/main/res/values-ja/strings.xml
+++ b/OpenKeychain/src/main/res/values-ja/strings.xml
@@ -573,7 +573,7 @@
<string name="key_list_fab_search">鍵の検索</string>
<string name="key_list_fab_import">ファイルからインポート</string>
<!--Key view-->
- <string name="key_view_action_edit">鍵の編集</string>
+ <string name="key_view_action_edit_ids">鍵の編集</string>
<string name="key_view_action_encrypt">テキスト暗号化</string>
<string name="key_view_action_encrypt_files">ファイル</string>
<string name="key_view_action_certify">鍵の確認</string>
diff --git a/OpenKeychain/src/main/res/values-nl/strings.xml b/OpenKeychain/src/main/res/values-nl/strings.xml
index 04fac67f2..932832f60 100644
--- a/OpenKeychain/src/main/res/values-nl/strings.xml
+++ b/OpenKeychain/src/main/res/values-nl/strings.xml
@@ -489,7 +489,7 @@
<string name="key_list_empty_text1">Geen sleutels gevonden!</string>
<string name="key_list_filter_show_all">Alle sleutels weergeven</string>
<!--Key view-->
- <string name="key_view_action_edit">Sleutel bewerken</string>
+ <string name="key_view_action_edit_ids">Sleutel bewerken</string>
<string name="key_view_action_encrypt">Versleutel tekst</string>
<string name="key_view_action_encrypt_files">bestanden</string>
<string name="key_view_action_certify">Sleutel bevestigen</string>
diff --git a/OpenKeychain/src/main/res/values-pl/strings.xml b/OpenKeychain/src/main/res/values-pl/strings.xml
index 5c80bf161..adb3cf49f 100644
--- a/OpenKeychain/src/main/res/values-pl/strings.xml
+++ b/OpenKeychain/src/main/res/values-pl/strings.xml
@@ -373,7 +373,7 @@ OSTRZEŻENIE: Jeżeli nie wiesz, czemu wyświetlił się ten komunikat, nie zezw
<string name="key_list_empty_text1">Nie znaleziono kluczy!</string>
<string name="key_list_filter_show_all">Pokaż wszystkie klucze</string>
<!--Key view-->
- <string name="key_view_action_edit">Edytuj klucz</string>
+ <string name="key_view_action_edit_ids">Edytuj klucz</string>
<string name="key_view_action_encrypt">Szyfruj tekst</string>
<string name="key_view_action_encrypt_files">pliki</string>
<string name="key_view_action_update">Aktualizuj z serwera kluczy</string>
diff --git a/OpenKeychain/src/main/res/values-ru/strings.xml b/OpenKeychain/src/main/res/values-ru/strings.xml
index c1710c063..10dd79cba 100644
--- a/OpenKeychain/src/main/res/values-ru/strings.xml
+++ b/OpenKeychain/src/main/res/values-ru/strings.xml
@@ -487,7 +487,7 @@
<string name="key_list_filter_show_all">Показать все ключи</string>
<string name="key_list_fab_search">Поиск ключа</string>
<!--Key view-->
- <string name="key_view_action_edit">Изменить ключ</string>
+ <string name="key_view_action_edit_ids">Изменить ключ</string>
<string name="key_view_action_encrypt">Зашифровать текст</string>
<string name="key_view_action_encrypt_files">файлы</string>
<string name="key_view_action_certify">Подтвердить ключ</string>
diff --git a/OpenKeychain/src/main/res/values-sl/strings.xml b/OpenKeychain/src/main/res/values-sl/strings.xml
index d7db38ccf..697de0984 100644
--- a/OpenKeychain/src/main/res/values-sl/strings.xml
+++ b/OpenKeychain/src/main/res/values-sl/strings.xml
@@ -426,7 +426,7 @@
<string name="key_list_empty_text1">Najden ni bil noben ključ!</string>
<string name="key_list_filter_show_all">Prikaži vse ključe</string>
<!--Key view-->
- <string name="key_view_action_edit">Uredi ključ</string>
+ <string name="key_view_action_edit_ids">Uredi ključ</string>
<string name="key_view_action_encrypt">Šifriraj besedilo</string>
<string name="key_view_action_encrypt_files">datoteke</string>
<string name="key_view_action_certify">Potrdi ključ</string>
diff --git a/OpenKeychain/src/main/res/values-sr/strings.xml b/OpenKeychain/src/main/res/values-sr/strings.xml
index f19f92087..8ff26f896 100644
--- a/OpenKeychain/src/main/res/values-sr/strings.xml
+++ b/OpenKeychain/src/main/res/values-sr/strings.xml
@@ -600,7 +600,7 @@
<string name="key_list_fab_search">Претрага кључа</string>
<string name="key_list_fab_import">Увези из фајла</string>
<!--Key view-->
- <string name="key_view_action_edit">Уреди кључ</string>
+ <string name="key_view_action_edit_ids">Уреди кључ</string>
<string name="key_view_action_encrypt">Шифруј текст</string>
<string name="key_view_action_encrypt_files">фајлови</string>
<string name="key_view_action_certify">Потврди кључ</string>
diff --git a/OpenKeychain/src/main/res/values-sv/strings.xml b/OpenKeychain/src/main/res/values-sv/strings.xml
index 23d7e6908..f3a818ecf 100644
--- a/OpenKeychain/src/main/res/values-sv/strings.xml
+++ b/OpenKeychain/src/main/res/values-sv/strings.xml
@@ -476,7 +476,7 @@
<string name="key_list_fab_search">Nyckelsökning</string>
<string name="key_list_fab_import">Importera från fil</string>
<!--Key view-->
- <string name="key_view_action_edit">Redigera nyckel</string>
+ <string name="key_view_action_edit_ids">Redigera nyckel</string>
<string name="key_view_action_encrypt">Kryptera text</string>
<string name="key_view_action_encrypt_files">filer</string>
<string name="key_view_action_certify">Bekräfta nyckel</string>
diff --git a/OpenKeychain/src/main/res/values-tr/strings.xml b/OpenKeychain/src/main/res/values-tr/strings.xml
index 22cd4e361..b6088a954 100644
--- a/OpenKeychain/src/main/res/values-tr/strings.xml
+++ b/OpenKeychain/src/main/res/values-tr/strings.xml
@@ -302,7 +302,7 @@
</plurals>
<string name="key_list_filter_show_all">Tüm anahtarları göster</string>
<!--Key view-->
- <string name="key_view_action_edit">Anahtarı düzenle</string>
+ <string name="key_view_action_edit_ids">Anahtarı düzenle</string>
<string name="key_view_action_encrypt">Metni şifrele</string>
<string name="key_view_action_encrypt_files">dosyalar</string>
<string name="key_view_action_update">Anahtar sunucusundan güncelle</string>
diff --git a/OpenKeychain/src/main/res/values-uk/strings.xml b/OpenKeychain/src/main/res/values-uk/strings.xml
index 0613819e9..97f9ec391 100644
--- a/OpenKeychain/src/main/res/values-uk/strings.xml
+++ b/OpenKeychain/src/main/res/values-uk/strings.xml
@@ -309,7 +309,7 @@
<string name="key_list_empty_text1">Ключ не знайдено!</string>
<string name="key_list_filter_show_all">Показати усі ключі</string>
<!--Key view-->
- <string name="key_view_action_edit">Редагувати ключ</string>
+ <string name="key_view_action_edit_ids">Редагувати ключ</string>
<string name="key_view_action_encrypt">Зашифрувати текст</string>
<string name="key_view_action_encrypt_files">файли</string>
<string name="key_view_action_update">Оновити із сервера ключів</string>
diff --git a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
index 81b3bf126..cb4ebf002 100644
--- a/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
+++ b/OpenKeychain/src/main/res/values-zh-rTW/strings.xml
@@ -479,7 +479,7 @@
<!--Key list-->
<string name="key_list_empty_text1">找不到金鑰!</string>
<!--Key view-->
- <string name="key_view_action_edit">編輯金鑰</string>
+ <string name="key_view_action_edit_ids">編輯金鑰</string>
<string name="key_view_action_encrypt">加密文字</string>
<string name="key_view_action_encrypt_files">檔案</string>
<string name="key_view_action_share_with">分享...</string>
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 78d4e03ee..ee498b969 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -666,7 +666,8 @@
<string name="key_list_fab_import">"Import from File"</string>
<!-- Key view -->
- <string name="key_view_action_edit">"Edit key"</string>
+ <string name="key_view_action_edit_ids">"Edit Identities"</string>
+ <string name="key_view_action_edit_subkeys">"Edit Subkeys"</string>
<string name="key_view_action_encrypt">"Encrypt text"</string>
<string name="key_view_action_encrypt_files">"files"</string>
<string name="key_view_action_certify">"Confirm key"</string>
@@ -1707,5 +1708,7 @@
<string name="menu_uids_save">Save</string>
<string name="menu_uids_save">"Save"</string>
<string name="title_edit_identities">"Edit Identities"</string>
+ <string name="title_edit_subkeys">"Edit Subkeys"</string>
+ <string name="btn_search_for_query">"Search for\n'%s'"</string>
</resources>