diff options
-rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java | 4 | ||||
-rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportResetFragment.java (renamed from OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportFragment.java) | 95 | ||||
-rw-r--r-- | OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml | 128 | ||||
-rw-r--r-- | OpenKeychain/src/main/res/layout/create_yubi_key_import_reset_fragment.xml | 174 | ||||
-rw-r--r-- | OpenKeychain/src/main/res/values/strings.xml | 7 |
5 files changed, 248 insertions, 160 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java index 94b5f4e4b..a4163d7f9 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java @@ -113,7 +113,7 @@ public class CreateKeyActivity extends BaseNfcActivity { byte[] nfcAid = intent.getByteArrayExtra(EXTRA_NFC_AID); if (containsKeys(nfcFingerprints)) { - Fragment frag = CreateYubiKeyImportFragment.newInstance( + Fragment frag = CreateYubiKeyImportResetFragment.newInstance( nfcFingerprints, nfcAid, nfcUserId); loadFragment(frag, FragAction.START); @@ -176,7 +176,7 @@ public class CreateKeyActivity extends BaseNfcActivity { finish(); } catch (PgpKeyNotFoundException e) { - Fragment frag = CreateYubiKeyImportFragment.newInstance( + Fragment frag = CreateYubiKeyImportResetFragment.newInstance( mScannedFingerprints, mNfcAid, mNfcUserId); loadFragment(frag, FragAction.TO_RIGHT); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportResetFragment.java index 648c5f962..3529f98d8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateYubiKeyImportResetFragment.java @@ -28,8 +28,9 @@ import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.RadioButton; import android.widget.TextView; import org.spongycastle.util.encoders.Hex; @@ -45,7 +46,7 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.util.Preferences; -public class CreateYubiKeyImportFragment +public class CreateYubiKeyImportResetFragment extends QueueingCryptoOperationFragment<ImportKeyringParcel, ImportKeyResult> implements NfcListenerFragment { @@ -62,6 +63,10 @@ public class CreateYubiKeyImportFragment private ImportKeysListFragment mListFragment; private TextView vSerNo; private TextView vUserId; + private TextView mNextButton; + private RadioButton mRadioImport; + private RadioButton mRadioReset; + private View mResetWarning; // for CryptoOperationFragment key import private String mKeyserver; @@ -69,7 +74,7 @@ public class CreateYubiKeyImportFragment public static Fragment newInstance(byte[] scannedFingerprints, byte[] nfcAid, String userId) { - CreateYubiKeyImportFragment frag = new CreateYubiKeyImportFragment(); + CreateYubiKeyImportResetFragment frag = new CreateYubiKeyImportResetFragment(); Bundle args = new Bundle(); args.putByteArray(ARG_FINGERPRINTS, scannedFingerprints); @@ -98,49 +103,78 @@ public class CreateYubiKeyImportFragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.create_yubi_key_import_fragment, container, false); + View view = inflater.inflate(R.layout.create_yubi_key_import_reset_fragment, container, false); vSerNo = (TextView) view.findViewById(R.id.yubikey_serno); vUserId = (TextView) view.findViewById(R.id.yubikey_userid); + mNextButton = (TextView) view.findViewById(R.id.create_key_next_button); + mRadioImport = (RadioButton) view.findViewById(R.id.yubikey_decision_import); + mRadioReset = (RadioButton) view.findViewById(R.id.yubikey_decision_reset); + mResetWarning = view.findViewById(R.id.yubikey_import_reset_warning); - { - View mBackButton = view.findViewById(R.id.create_key_back_button); - mBackButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (getFragmentManager().getBackStackEntryCount() == 0) { - getActivity().setResult(Activity.RESULT_CANCELED); - getActivity().finish(); - } else { - mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT); - } + View mBackButton = view.findViewById(R.id.create_key_back_button); + mBackButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getFragmentManager().getBackStackEntryCount() == 0) { + getActivity().setResult(Activity.RESULT_CANCELED); + getActivity().finish(); + } else { + mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT); } - }); + } + }); - View mNextButton = view.findViewById(R.id.create_key_next_button); - mNextButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { + mNextButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mRadioReset.isChecked()) { + resetCard(); + } else { importKey(); } - }); - } + } + }); mListFragment = ImportKeysListFragment.newInstance(null, null, "0x" + mNfcFingerprint, true, null); - view.findViewById(R.id.button_search).setOnClickListener(new OnClickListener() { + mRadioImport.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override - public void onClick(View v) { - refreshSearch(); + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + mNextButton.setText(R.string.btn_import); + mNextButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_key_plus_grey600_24dp, 0); + mNextButton.setVisibility(View.VISIBLE); + mResetWarning.setVisibility(View.GONE); + + getFragmentManager().beginTransaction() + .replace(R.id.yubikey_import_fragment, mListFragment, "yubikey_import") + .commit(); + + getFragmentManager().executePendingTransactions(); + refreshSearch(); + } + } + }); + mRadioReset.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + mNextButton.setText(R.string.btn_reset); + mNextButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_close_grey_24dp, 0); + mNextButton.setVisibility(View.VISIBLE); + mResetWarning.setVisibility(View.VISIBLE); + + getFragmentManager().beginTransaction() + .remove(mListFragment) + .commit(); + } } }); setData(); - getFragmentManager().beginTransaction() - .replace(R.id.yubikey_import_fragment, mListFragment, "yubikey_import") - .commit(); return view; } @@ -195,6 +229,10 @@ public class CreateYubiKeyImportFragment } + public void resetCard() { + + } + @Override public void doNfcInBackground() throws IOException { @@ -212,7 +250,6 @@ public class CreateYubiKeyImportFragment setData(); - refreshSearch(); } @Override diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml deleted file mode 100644 index 3a54f264f..000000000 --- a/OpenKeychain/src/main/res/layout/create_yubi_key_import_fragment.xml +++ /dev/null @@ -1,128 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:padding="4dp" - android:orientation="horizontal" - android:id="@+id/yubikey_status_layout" > - - <ImageView - android:layout_margin="14dp" - android:layout_width="32dp" - android:layout_height="32dp" - android:scaleType="centerCrop" - android:src="@drawable/yubi_icon"/> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_weight="1" - android:orientation="vertical"> - - <TextView - android:id="@+id/yubikey_serno" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:text="Yubikey #" - /> - - <TextView - android:id="@+id/yubikey_userid" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:text="User ID" - /> - - <TextView - android:id="@+id/yubikey_status" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:text="Unknown key, hit next to import" - /> - - </LinearLayout> - - <ImageButton - android:id="@+id/button_search" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:padding="8dp" - android:src="@drawable/ic_search_grey_24dp" - android:layout_gravity="center_vertical" - android:background="?android:selectableItemBackground" /> - - </LinearLayout> - - <View - android:layout_width="match_parent" - android:layout_marginTop="4dp" - android:layout_height="1dip" - android:layout_below="@id/yubikey_status_layout" - android:background="?android:attr/listDivider" /> - - <FrameLayout - android:id="@+id/yubikey_import_fragment" - android:layout_marginTop="8dp" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_below="@id/yubikey_status_layout" - android:layout_above="@id/create_key_buttons" - /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:layout_alignParentBottom="true" - android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" - android:background="?attr/colorButtonRow" - android:id="@+id/create_key_buttons"> - - <TextView - android:id="@+id/create_key_back_button" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_weight="1" - android:text="@string/btn_back" - android:textAllCaps="true" - android:minHeight="?android:attr/listPreferredItemHeight" - android:drawableLeft="@drawable/ic_chevron_left_grey_24dp" - android:drawablePadding="8dp" - android:gravity="left|center_vertical" - android:clickable="true" - style="?android:attr/borderlessButtonStyle" /> - - <TextView - android:id="@+id/create_key_next_button" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_weight="1" - android:text="@string/btn_import" - android:textAllCaps="true" - android:minHeight="?android:attr/listPreferredItemHeight" - android:drawableRight="@drawable/ic_key_plus_grey600_24dp" - android:drawablePadding="8dp" - android:gravity="right|center_vertical" - android:clickable="true" - style="?android:attr/borderlessButtonStyle" /> - - </LinearLayout> - -</RelativeLayout> diff --git a/OpenKeychain/src/main/res/layout/create_yubi_key_import_reset_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubi_key_import_reset_fragment.xml new file mode 100644 index 000000000..7acc2dca9 --- /dev/null +++ b/OpenKeychain/src/main/res/layout/create_yubi_key_import_reset_fragment.xml @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="UTF-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + + <ScrollView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_above="@+id/create_key_buttons" + android:fillViewport="true"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <LinearLayout + android:id="@+id/yubikey_status_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:padding="4dp"> + + <ImageView + android:layout_width="32dp" + android:layout_height="32dp" + android:layout_margin="14dp" + android:scaleType="centerCrop" + android:src="@drawable/yubi_icon" /> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_weight="1" + android:orientation="vertical"> + + <TextView + android:id="@+id/yubikey_serno" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:text="Yubikey #" /> + + <TextView + android:id="@+id/yubikey_userid" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:text="User ID" /> + + </LinearLayout> + + </LinearLayout> + + <LinearLayout + android:id="@+id/yubikey_decision" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/yubikey_status_layout" + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingRight="16dp"> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="8dp" + android:layout_marginTop="8dp" + android:text="@string/yubikey_reset_or_import" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <RadioGroup + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <RadioButton + android:id="@+id/yubikey_decision_import" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:text="@string/yubikey_import_radio" /> + + <RadioButton + android:id="@+id/yubikey_decision_reset" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:layout_marginTop="16dp" + android:text="@string/yubikey_reset_radio" /> + </RadioGroup> + + </LinearLayout> + + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_below="@id/yubikey_decision" + android:layout_marginTop="4dp" + android:background="?android:attr/listDivider" /> + + <FrameLayout + android:id="@+id/yubikey_import_fragment" + android:layout_width="fill_parent" + android:layout_height="match_parent" + android:layout_below="@id/yubikey_decision" + android:layout_marginTop="8dp"> + + <TextView + android:id="@+id/yubikey_import_reset_warning" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:layout_margin="24dp" + android:text="@string/yubikey_reset_warning" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/android_red_dark" + android:visibility="gone" /> + </FrameLayout> + + </RelativeLayout> + </ScrollView> + + <LinearLayout + android:id="@+id/create_key_buttons" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:background="?attr/colorButtonRow" + android:orientation="horizontal"> + + <TextView + android:id="@+id/create_key_back_button" + style="?android:attr/borderlessButtonStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_weight="1" + android:clickable="true" + android:drawableLeft="@drawable/ic_chevron_left_grey_24dp" + android:drawablePadding="8dp" + android:gravity="left|center_vertical" + android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:text="@string/btn_back" + android:textAllCaps="true" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@+id/create_key_next_button" + style="?android:attr/borderlessButtonStyle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_weight="1" + android:clickable="true" + android:drawablePadding="8dp" + android:drawableRight="@drawable/ic_key_plus_grey600_24dp" + android:gravity="right|center_vertical" + android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:text="@string/btn_import" + android:textAllCaps="true" + android:textAppearance="?android:attr/textAppearanceMedium" + android:visibility="invisible" /> + + </LinearLayout> + +</RelativeLayout> diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 11036c9d3..9c2d1a2b0 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -316,7 +316,7 @@ <string name="specify_backup_dest_secret_single">"A full backup of your key will be made, please specify a destination file.\nWARNING: File will be overwritten if it exists!"</string> <string name="specify_backup_dest_secret">"A full backup of all keys including yours will be made, please specify a destination file.\nWARNING: File will be overwritten if it exists!"</string> <string name="key_deletion_confirmation_multi">"Do you really want to delete all selected keys?"</string> - <string name="secret_key_deletion_confirmation">"After deletion you will not be able to read messages encrypted with this key and lose all key confirmations done with it!"</string> + <string name="secret_key_deletion_confirmation">"After deletion you will not be able to decrypt messages/files encrypted with this key and lose all key confirmations done with it!"</string> <string name="public_key_deletetion_confirmation">"Delete key '%s'?"</string> <string name="also_export_secret_keys">"Also export secret keys"</string> <string name="reinstall_openkeychain">"You encountered a known bug with Android. Please reinstall OpenKeychain if you want to link your contacts with keys."</string> @@ -1515,7 +1515,12 @@ <string name="yubikey_status_unbound">"YubiKey matches, can be bound to key"</string> <string name="yubikey_status_partly">"YubiKey matches, partly bound to key"</string> <string name="yubikey_create">"Hold YubiKey against the back of your device."</string> + <string name="yubikey_reset_or_import">"This YubiKey already contains a key. You can import the key using the cloud or reset the YubiKey."</string> <string name="btn_import">"Import"</string> + <string name="btn_reset">"Reset"</string> + <string name="yubikey_import_radio">"Import key"</string> + <string name="yubikey_reset_radio">"Reset YubiKey"</string> + <string name="yubikey_reset_warning">"Resetting the YubiKey completely destroys the keys on it. Afterwards, you will not be able to decrypt messages/files encrypted with this key!"</string> <string name="snack_yubi_other">Different key stored on YubiKey!</string> <string name="error_nfc">"NFC Error: %s"</string> <plurals name="error_pin"> |