aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-03-21 22:18:58 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-03-21 22:18:58 +0100
commit04c7639a5a9b4f85122b7d5f299ba09131ce3036 (patch)
treefc4bf4afbca231d107b445487572d24165d2d455 /OpenKeychain
parent1ad3635d139ea5033b06e5cdd87a7b2eab5f2e75 (diff)
downloadopen-keychain-04c7639a5a9b4f85122b7d5f299ba09131ce3036.tar.gz
open-keychain-04c7639a5a9b4f85122b7d5f299ba09131ce3036.tar.bz2
open-keychain-04c7639a5a9b4f85122b7d5f299ba09131ce3036.zip
split up wait/action yubikey fragments
Diffstat (limited to 'OpenKeychain')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java105
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java88
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/yubi_icon.pngbin0 -> 2517 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-hdpi/yubi_icon_24dp.pngbin0 -> 1203 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/yubi_icon.pngbin0 -> 1715 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-mdpi/yubi_icon_24dp.pngbin0 -> 753 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon.pngbin0 -> 4078 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon_24dp.pngbin0 -> 1715 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon.pngbin0 -> 5808 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon_24dp.pngbin0 -> 2854 bytes
-rw-r--r--OpenKeychain/src/main/res/drawable-xxxhdpi/yubi_icon_24dp.pngbin0 -> 4078 bytes
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml24
-rw-r--r--OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml83
17 files changed, 230 insertions, 86 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
index fd86d4b92..46db30ad0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperation.java
@@ -74,7 +74,7 @@ public class PromoteKeyOperation extends BaseOperation {
mProviderHelper.getCanonicalizedPublicKeyRing(masterKeyId);
// create divert-to-card secret key from public key
- promotedRing = pubRing.createDummySecretRing();
+ promotedRing = pubRing.createDummySecretRing(true);
} catch (PgpKeyNotFoundException e) {
log.add(LogType.MSG_PR_ERROR_KEY_NOT_FOUND, 2);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
index c2506685d..fa5b0785e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/CanonicalizedPublicKeyRing.java
@@ -97,10 +97,12 @@ public class CanonicalizedPublicKeyRing extends CanonicalizedKeyRing {
}
/** Create a dummy secret ring from this key */
- public UncachedKeyRing createDummySecretRing () {
+ public UncachedKeyRing createDummySecretRing (boolean divertToCard) {
PGPSecretKeyRing secRing = PGPSecretKeyRing.constructDummyFromPublic(getRing(),
- S2K.GNU_PROTECTION_MODE_NO_PRIVATE_KEY);
+ divertToCard
+ ? S2K.GNU_PROTECTION_MODE_DIVERT_TO_CARD
+ : S2K.GNU_PROTECTION_MODE_NO_PRIVATE_KEY);
return new UncachedKeyRing(secRing);
}
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 9919e2aab..5c2fcde82 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyActivity.java
@@ -84,7 +84,13 @@ public class CreateKeyActivity extends BaseNfcActivity {
protected void onNfcPerform() throws IOException {
if (mCurrentFragment instanceof NfcListenerFragment) {
((NfcListenerFragment) mCurrentFragment).onNfcPerform();
+ return;
}
+
+ byte[] scannedFingerprint = nfcGetFingerprint(0);
+ Fragment frag = CreateKeyYubiFragment.createInstance(scannedFingerprint);
+ loadFragment(frag, FragAction.TO_RIGHT);
+
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
index d23d598fa..3f56949f5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyStartFragment.java
@@ -98,7 +98,7 @@ public class CreateKeyStartFragment extends Fragment {
mYubiKey.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- CreateKeyYubiFragment frag = new CreateKeyYubiFragment();
+ CreateKeyYubiWaitFragment frag = new CreateKeyYubiWaitFragment();
mCreateKeyActivity.loadFragment(frag, FragAction.TO_RIGHT);
}
});
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
index 483a5f4e5..63549c3d6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiFragment.java
@@ -23,8 +23,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import android.app.Activity;
-import android.app.ProgressDialog;
-import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
@@ -38,11 +36,9 @@ import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.EditText;
import android.widget.TextView;
import android.widget.ViewAnimator;
-import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
@@ -51,57 +47,59 @@ import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
-import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
import org.sufficientlysecure.keychain.ui.CreateKeyActivity.NfcListenerFragment;
-import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.util.Notify.Style;
import org.sufficientlysecure.keychain.ui.widget.NameEditText;
-import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
-public class CreateKeyYubiFragment extends Fragment implements NfcListenerFragment,
- LoaderManager.LoaderCallbacks<Cursor> {
+public class CreateKeyYubiFragment extends Fragment
+ implements LoaderManager.LoaderCallbacks<Cursor> {
+
+ private static final String ARG_FINGERPRINT = "fingerprint";
CreateKeyActivity mCreateKeyActivity;
- NameEditText mNameEdit;
- View mBackButton;
- View mNextButton;
- private TextView mUnknownFingerprint;
- public static final String ARGS_MASTER_KEY_ID = "master_key_id";
private byte[] mScannedFingerprint;
private long mScannedMasterKeyId;
+
private ViewAnimator mAnimator;
+ private TextView mUnknownFingerprint;
private TextView mFingerprint;
private TextView mUserId;
- private YubiImportState mState = YubiImportState.SCAN;
+ private YubiImportState mState;
+
+ public static Fragment createInstance(byte[] scannedFingerprint) {
+ Bundle args = new Bundle();
+ args.putByteArray(ARG_FINGERPRINT, scannedFingerprint);
+
+ CreateKeyYubiFragment frag = new CreateKeyYubiFragment();
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mScannedFingerprint = getArguments().getByteArray(ARG_FINGERPRINT);
+ mScannedMasterKeyId = getKeyIdFromFingerprint(mScannedFingerprint);
+
+ getLoaderManager().initLoader(0, null, this);
+ }
enum YubiImportState {
- SCAN, // waiting for scan
UNKNOWN, // scanned unknown key (ready to import)
BAD_FINGERPRINT, // scanned key, bad fingerprint
IMPORTED, // imported key (ready to promote)
}
- private static boolean isEditTextNotEmpty(Context context, EditText editText) {
- boolean output = true;
- if (editText.getText().length() == 0) {
- editText.setError(context.getString(R.string.create_key_empty));
- editText.requestFocus();
- output = false;
- } else {
- editText.setError(null);
- }
-
- return output;
- }
-
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.create_yubikey_fragment, container, false);
@@ -113,8 +111,8 @@ public class CreateKeyYubiFragment extends Fragment implements NfcListenerFragme
mFingerprint = (TextView) view.findViewById(R.id.create_yubikey_fingerprint);
mUserId = (TextView) view.findViewById(R.id.create_yubikey_user_id);
- mBackButton = view.findViewById(R.id.create_key_back_button);
- mNextButton = view.findViewById(R.id.create_key_next_button);
+ View mBackButton = view.findViewById(R.id.create_key_back_button);
+ View mNextButton = view.findViewById(R.id.create_key_next_button);
mBackButton.setOnClickListener(new View.OnClickListener() {
@Override
@@ -138,16 +136,6 @@ public class CreateKeyYubiFragment extends Fragment implements NfcListenerFragme
mCreateKeyActivity = (CreateKeyActivity) getActivity();
}
- @Override
- public void onNfcPerform() throws IOException {
-
- mScannedFingerprint = mCreateKeyActivity.nfcGetFingerprint(0);
- mScannedMasterKeyId = getKeyIdFromFingerprint(mScannedFingerprint);
-
- getLoaderManager().initLoader(0, null, this);
-
- }
-
// These are the rows that we will retrieve.
static final String[] UNIFIED_PROJECTION = new String[]{
KeychainContract.KeyRings._ID,
@@ -185,35 +173,26 @@ public class CreateKeyYubiFragment extends Fragment implements NfcListenerFragme
return;
}
- showKey(data);
+ String userId = data.getString(INDEX_USER_ID);
+ boolean hasSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
- } else {
- showUnknownKey();
- }
- }
+ String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
+ mFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp));
- public void showUnknownKey() {
- String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
- mUnknownFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp));
-
- mAnimator.setDisplayedChild(1);
- mState = YubiImportState.UNKNOWN;
- }
+ mUserId.setText(userId);
- public void showKey(Cursor data) {
- String userId = data.getString(INDEX_USER_ID);
- boolean hasSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
+ mAnimator.setDisplayedChild(2);
+ mState = YubiImportState.IMPORTED;
- String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
- mFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp));
-
- mUserId.setText(userId);
+ } else {
+ String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint);
+ mUnknownFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp));
- mAnimator.setDisplayedChild(2);
- mState = YubiImportState.IMPORTED;
+ mAnimator.setDisplayedChild(1);
+ mState = YubiImportState.UNKNOWN;
+ }
}
-
private void nextClicked() {
switch (mState) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java
new file mode 100644
index 000000000..c338a0f1f
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.Messenger;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.ViewAnimator;
+
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
+import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
+import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
+import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult;
+import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
+import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.FragAction;
+import org.sufficientlysecure.keychain.ui.CreateKeyActivity.NfcListenerFragment;
+import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
+import org.sufficientlysecure.keychain.ui.util.Notify;
+import org.sufficientlysecure.keychain.ui.util.Notify.Style;
+import org.sufficientlysecure.keychain.ui.widget.NameEditText;
+import org.sufficientlysecure.keychain.util.Preferences;
+
+
+public class CreateKeyYubiWaitFragment extends Fragment {
+
+ CreateKeyActivity mCreateKeyActivity;
+ View mBackButton;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.create_yubikey_wait_fragment, container, false);
+
+ mBackButton = view.findViewById(R.id.create_key_back_button);
+
+ mBackButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mCreateKeyActivity.loadFragment(null, FragAction.TO_LEFT);
+ }
+ });
+
+ return view;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ mCreateKeyActivity = (CreateKeyActivity) getActivity();
+ }
+
+}
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/yubi_icon.png b/OpenKeychain/src/main/res/drawable-hdpi/yubi_icon.png
new file mode 100644
index 000000000..428ad6fad
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/yubi_icon.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-hdpi/yubi_icon_24dp.png b/OpenKeychain/src/main/res/drawable-hdpi/yubi_icon_24dp.png
new file mode 100644
index 000000000..6fb41223d
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-hdpi/yubi_icon_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/yubi_icon.png b/OpenKeychain/src/main/res/drawable-mdpi/yubi_icon.png
new file mode 100644
index 000000000..05c21c052
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/yubi_icon.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-mdpi/yubi_icon_24dp.png b/OpenKeychain/src/main/res/drawable-mdpi/yubi_icon_24dp.png
new file mode 100644
index 000000000..753f22607
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-mdpi/yubi_icon_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon.png b/OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon.png
new file mode 100644
index 000000000..cfa799e74
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon_24dp.png b/OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon_24dp.png
new file mode 100644
index 000000000..05c21c052
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon.png b/OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon.png
new file mode 100644
index 000000000..f20f562ec
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon_24dp.png b/OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon_24dp.png
new file mode 100644
index 000000000..9bae15a02
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/drawable-xxxhdpi/yubi_icon_24dp.png b/OpenKeychain/src/main/res/drawable-xxxhdpi/yubi_icon_24dp.png
new file mode 100644
index 000000000..cfa799e74
--- /dev/null
+++ b/OpenKeychain/src/main/res/drawable-xxxhdpi/yubi_icon_24dp.png
Binary files differ
diff --git a/OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml
index ec2505706..2fb3737ba 100644
--- a/OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/create_yubikey_fragment.xml
@@ -19,26 +19,12 @@
android:id="@+id/create_yubikey_animator"
>
- <LinearLayout
- android:layout_width="match_parent"
+ <ProgressBar
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:orientation="vertical">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="16dp"
- android:layout_marginLeft="8dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="Hold Yubikey against device dawg"
- />
-
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/yubikey_phone" />
-
- </LinearLayout>
+ android:layout_gravity="center"
+ android:indeterminate="true"
+ />
<LinearLayout
android:layout_width="match_parent"
diff --git a/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml b/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml
new file mode 100644
index 000000000..c7f9821eb
--- /dev/null
+++ b/OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml
@@ -0,0 +1,83 @@
+<?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:fillViewport="true"
+ android:layout_above="@+id/create_key_buttons">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="10dp"
+ android:paddingRight="10dp"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:layout_marginLeft="8dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="Hold Yubikey against device dawg"
+ />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:src="@drawable/yubikey_phone" />
+
+ </LinearLayout>
+
+ </ScrollView>
+
+ <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="@color/holo_gray_bright"
+ 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_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_weight="1"
+ android:text="@string/btn_next"
+ android:textAllCaps="true"
+ android:minHeight="?android:attr/listPreferredItemHeight"
+ android:drawableRight="@drawable/yubi_icon_24dp"
+ android:drawablePadding="16dp"
+ android:gravity="right|center_vertical"
+ android:clickable="false"
+ style="?android:attr/borderlessButtonStyle" />
+
+ </LinearLayout>
+
+</RelativeLayout> \ No newline at end of file