UI preparations for yubikey reset

This commit is contained in:
Dominik Schürmann 2015-10-16 14:57:45 +02:00
parent 4f2e02d606
commit 930db9061e
5 changed files with 248 additions and 160 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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>

View file

@ -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>

View file

@ -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">