From 04c7639a5a9b4f85122b7d5f299ba09131ce3036 Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 21 Mar 2015 22:18:58 +0100 Subject: [PATCH] split up wait/action yubikey fragments --- Graphics/drawables/yubi_icon.svg | 32 +++++ Graphics/update-drawables.sh | 4 +- .../operations/PromoteKeyOperation.java | 2 +- .../pgp/CanonicalizedPublicKeyRing.java | 6 +- .../keychain/ui/CreateKeyActivity.java | 6 + .../keychain/ui/CreateKeyStartFragment.java | 2 +- .../keychain/ui/CreateKeyYubiFragment.java | 109 +++++++----------- .../ui/CreateKeyYubiWaitFragment.java | 88 ++++++++++++++ .../src/main/res/drawable-hdpi/yubi_icon.png | Bin 0 -> 2517 bytes .../main/res/drawable-hdpi/yubi_icon_24dp.png | Bin 0 -> 1203 bytes .../src/main/res/drawable-mdpi/yubi_icon.png | Bin 0 -> 1715 bytes .../main/res/drawable-mdpi/yubi_icon_24dp.png | Bin 0 -> 753 bytes .../src/main/res/drawable-xhdpi/yubi_icon.png | Bin 0 -> 4078 bytes .../res/drawable-xhdpi/yubi_icon_24dp.png | Bin 0 -> 1715 bytes .../main/res/drawable-xxhdpi/yubi_icon.png | Bin 0 -> 5808 bytes .../res/drawable-xxhdpi/yubi_icon_24dp.png | Bin 0 -> 2854 bytes .../res/drawable-xxxhdpi/yubi_icon_24dp.png | Bin 0 -> 4078 bytes .../res/layout/create_yubikey_fragment.xml | 24 +--- .../layout/create_yubikey_wait_fragment.xml | 83 +++++++++++++ glyph_authlite.png | Bin 0 -> 3869 bytes 20 files changed, 266 insertions(+), 90 deletions(-) create mode 100644 Graphics/drawables/yubi_icon.svg create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyYubiWaitFragment.java create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/yubi_icon.png create mode 100644 OpenKeychain/src/main/res/drawable-hdpi/yubi_icon_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/yubi_icon.png create mode 100644 OpenKeychain/src/main/res/drawable-mdpi/yubi_icon_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon.png create mode 100644 OpenKeychain/src/main/res/drawable-xhdpi/yubi_icon_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon.png create mode 100644 OpenKeychain/src/main/res/drawable-xxhdpi/yubi_icon_24dp.png create mode 100644 OpenKeychain/src/main/res/drawable-xxxhdpi/yubi_icon_24dp.png create mode 100644 OpenKeychain/src/main/res/layout/create_yubikey_wait_fragment.xml create mode 100644 glyph_authlite.png diff --git a/Graphics/drawables/yubi_icon.svg b/Graphics/drawables/yubi_icon.svg new file mode 100644 index 000000000..027257550 --- /dev/null +++ b/Graphics/drawables/yubi_icon.svg @@ -0,0 +1,32 @@ + + + + + + + + image/svg+xml + + + + + + + + diff --git a/Graphics/update-drawables.sh b/Graphics/update-drawables.sh index 8da894725..61dc51099 100755 --- a/Graphics/update-drawables.sh +++ b/Graphics/update-drawables.sh @@ -22,7 +22,7 @@ SRC_DIR=./drawables/ #inkscape -w 512 -h 512 -e "$PLAY_DIR/$NAME.png" $NAME.svg -for NAME in "ic_cloud_search" "ic_action_encrypt_file" "ic_action_encrypt_text" "ic_action_verified_cutout" "ic_action_encrypt_copy" "ic_action_encrypt_save" "ic_action_encrypt_share" "status_lock_closed" "status_lock_error" "status_lock_open" "status_signature_expired_cutout" "status_signature_invalid_cutout" "status_signature_revoked_cutout" "status_signature_unknown_cutout" "status_signature_unverified_cutout" "status_signature_verified_cutout" "key_flag_authenticate" "key_flag_certify" "key_flag_encrypt" "key_flag_sign" +for NAME in "ic_cloud_search" "ic_action_encrypt_file" "ic_action_encrypt_text" "ic_action_verified_cutout" "ic_action_encrypt_copy" "ic_action_encrypt_save" "ic_action_encrypt_share" "status_lock_closed" "status_lock_error" "status_lock_open" "status_signature_expired_cutout" "status_signature_invalid_cutout" "status_signature_revoked_cutout" "status_signature_unknown_cutout" "status_signature_unverified_cutout" "status_signature_verified_cutout" "key_flag_authenticate" "key_flag_certify" "key_flag_encrypt" "key_flag_sign" "yubi_icon" do echo $NAME inkscape -w 24 -h 24 -e "$MDPI_DIR/${NAME}_24dp.png" "$SRC_DIR/$NAME.svg" @@ -60,4 +60,4 @@ for NAME in "first_time_1" do echo $NAME inkscape -w 512 -h 512 -e "$DRAWABLE_DIR/$NAME.png" "$SRC_DIR/$NAME.svg" -done \ No newline at end of file +done 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 { +public class CreateKeyYubiFragment extends Fragment + implements LoaderManager.LoaderCallbacks { + + 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; + + String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint); + mFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp)); + + mUserId.setText(userId); + + mAnimator.setDisplayedChild(2); + mState = YubiImportState.IMPORTED; } else { - showUnknownKey(); + String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint); + mUnknownFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp)); + + mAnimator.setDisplayedChild(1); + mState = YubiImportState.UNKNOWN; } } - public void showUnknownKey() { - String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint); - mUnknownFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp)); - - mAnimator.setDisplayedChild(1); - mState = YubiImportState.UNKNOWN; - } - - public void showKey(Cursor data) { - String userId = data.getString(INDEX_USER_ID); - boolean hasSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0; - - String fp = KeyFormattingUtils.convertFingerprintToHex(mScannedFingerprint); - mFingerprint.setText(KeyFormattingUtils.colorizeFingerprint(fp)); - - mUserId.setText(userId); - - mAnimator.setDisplayedChild(2); - mState = YubiImportState.IMPORTED; - } - - 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 + * + * 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 . + */ + +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 0000000000000000000000000000000000000000..428ad6fad6a98fd45754dd37e7472d0f61fca5bf GIT binary patch literal 2517 zcmV;`2`cu9P)EV!KR)T;s3dvGT4Dc~a zQlk_c97!lMwAI5NhK~h3mbGk3lI0^cVo+NpEgx%{6egLx6dC2AiKY`G0}PBXz|64w zRlqo4qqXk?dgn7|scJsV&oXBJ3QPl*0+ql* zd;bb>a;X_B2mrw6fi~bF;09yZ1G|7K;2NL>*aKWuYUa8X0ALWX4frQe4IBso;H~{* zV0cI*ehRo!GudSTfIh%WKm%|Qus6bdxc&(k2rRO89Z*(kM!O2Y!@xe^0^rRI%m?*l zU@&l-wVwg{m73YS004eqOk8bSx-|g+9%uwc+qhO>9WbcW4Ce%Zeerf+Ug+Hi%=G;u z0SGO?Bwzy247>xJR%)gb0RS9pO7B_VFniYvI1ji4_=qvrk_Ciz;5t)|{{`LyE+{qQ zNdR~f*a3XZ+C!1!6K1T|z(^t%w*wWXAKHMKrDi@Y0KnIb=*z8rF0kL;Z8n7%F!nI; z^@Mt15l{~NjYGst#xegXU^nnkWH)RDPPcY%`|{1k$k`;b4uM4|2Nqa+Atf}EQRaIA z%S~2~wReM&lT#f7);MEgY7V==V-^9JW9_As$V^5Vnr#G40RCdkUt{k^rxBMeNXea& z0|0?2jj;LK43vsu18^`LcFt8In?DaY37Np_?dyZALWkm&O@TM8aY@6cbFV71$Y3MjuITB>0I6her3$|MWV6| z$^Lj09%n0iQL<#Mjr}z68Q{1`zdr&qQO@CWz*O&jU4r@ZF0Y^j#wSr?BgvPF<^nR+ zCZyyBBiFeGWtGMw-7%7shy`^C@L?2Mw*%7)DFQ#VMHc{L4UF#C&K}qRTnVfQz1xhm zf3VJ@D6Xi90J|FH74Ek74TaPJ%WRRKBOhRY3^Tdb6~LvWl;djPl+eO`fNPNzc-MBq zHzISq1{@E}wf4=0vH~AM86R)k^AhBo%afN#Pwc z4CNpX0KcRga0O)iy=DpvDA(}txxNW$>r`UT2EF&2 zPz>-U+Kw&2g-BUtD;tq0HG1#=9r^7F;02)G0;yM-i%Nn;L9rXpIAfI;5^-n-s zr;_$?)O)`fp}Yn;B*&ome@B)%-$vfz;W59hw7=!nCt3y}iyc8Nh`h=topWUg z#&swePlvtt+mSpkMY25%f$~mrLvHHY7-C*W+juANVh(fHBSkx$%tvqO>Ycz-NM8-?b^we}2i#!`-i7qSzha2F z7%4mtd@sSgfvYBe0_4@rBF1w=I_M@F zvlZ!=<_rvGs|%45eyX4V81b`=xyON{fkz_5+yNYcqCJny-#1ap?M$R6>g~4;C=a_B zz(AOUlBlat5@T+Juq7zoA89~5i!91)>tBUZ>s?`fodG>R^scTb02m14kRQJuIWs}7 zKOm+R>4_OAzPJ?len>pJQd^LJGA%|VCKm+&1EJEsQ-P< zQ2;Oy2HAGpgG}KFbj(&L<{v;l$0lpnAQ21q*$t9C48!SzP?kN=<03+f&bm;O1It{8J`E9dsU2fu4XYH(UhOJ*k$6GDifT2YL zz=#-XU#$r^2W4}ToEn!BKnd_d(TD}BVNkFd=m=2tF4{aF&T1~!_L{Jq61)r z^djZA-*3!CL+Wt78Y#Yaje#TcT=ytC9{b%}5&%L3-H3elB`6PgYeZRj;CI&dK5PFz z&$X%z!0_CaB?Z6;n@sBNz+hx0f@`>IP)=b=i0IwGm>lNsfzBqQyXtxGi)aP15IF{! zrhVvy`e<|)(E;D4^I738;EaTG2g%Ycz;Erj9lM8Aa^^#X4kYz&H(OE8AX5y{1e}^+ z&Sqo2f>h@DHwXKan(-K-$D-uQcH8a^q))*gbZFAd6~rT7G*MWEj@v(Y$O4donF182iJhm^jC2DKGsu3FHYeS9XOsM2 z7w6n?bg}Y;n4g!SOi)|g*u4LF`cNv~`xnq<>qjC#J&zKivCISSj~x&$&bd)2RbByH f?7iQassH}~RCrB!*PSp?00000NkvXXu0mjf*l~(( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6fb41223dd39c5ecd18b78b5c93a7e9bdb1af8bb GIT binary patch literal 1203 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 JPDHLkV1m6yDsTV* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..753f226079aa4c7cdcc71e6e166c0780ddfbf87f GIT binary patch literal 753 zcmV#~=?88v}hS??2Tlf`k(3yHRHDE2}@P)X8 zrI>>?xQG8s+%$ZJ-*GS^hBsUTjKKvw!C8EaPtjSSsmGsUk=$Wzjdsx{v|((?Xe$$~)Eg<`G1l<*Y^Z2E#x0Tpo*ngK;WqoNxOiC%e#6N{DScOU091$P&;-~hKTXCRJ_8NcTn2IK0CeG9{O}K%*18PyZ z={kIXJs6HZaV#R{N5o=m#D}FGRqMcK5z$fo*h}mR$Xbk)J7qaW;B&NNRLP=lr|=Rh z`lYBwSBqS{ZL)0CJFM!D<=XvRs9V)b>;?c@BiH0!KZkeAUDa9Qm&g*cpdo;=X&!#S zq literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cfa799e74eaa845ee1736c7232b6786f8666fae8 GIT binary patch literal 4078 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 JPDHLkV1m6yDsTV* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f20f562ec5c98fbe0903e746536b0b52d63ab357 GIT binary patch literal 5808 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cfa799e74eaa845ee1736c7232b6786f8666fae8 GIT binary patch literal 4078 zcmV zJ9m3?A2R3EIdAIDOjp%!rn{=Tx}Rr^p;(9Kd82@_z<6WKsl0rvq$={^MDgMl*O1fatCeJW7DknLATDx~qxcZ~Z-pe69M zp3eZ9D9v!L`vmBev=OR306<@0iyCzjun(}&GqLsVM;)YxCC zG5-NH2IdEh@6!h0G`(*Guu=ItfXkCMMzsR~s0GYbBQ6J812aR6@6sJQKJ?K0eEvN^ zjiilIodB4qhTEjZoEXFSKD`1o0`>-GIsE5=I!PO*WRu00aiz-vK{z`txk*JK$t}?u`zAF+TtgDHr3rgYGQEwOo{=@qMZUuGHtB z32asVe}Fzo8>wUfAa&6F0%!*83G@T51^$Ah8*&BWUSx1S(s|BC;H0DtRVo1ZgY0IY zSI9MufeFaKoC^q3fjZi)eaSBFreQ#Ug+K!&O_2)- z8-PLDrt79I0`^VXfJFrW36eIe!Z$nox`-F#56IJibAeNU-vj>&81Y7+eTJ_kinaq6 zYTIXF-PAQyb2l~0__crqs_47G9?oyqI>s3qa{sN)HJcE3^`;yF@aZ5Z`f6iaz`OkjsE#1F#wpU*ACS4 zWd#DjAal$I0X2a~9sV4kVbaFU8UUn@$5-NXpf}dzFu+Sl|ND)ef0DuYZLz^wQ)EiA zP{#LZJ#eJ9cay{a5ZEVa1IGpc=~LIJ@XsTz=8}N2l|UC@vco$j0)X*)%_Kd)i^2n7 z^d%XoZH#hWnx&L@O4~KoZ&m0`h|hj^h_X)sgPrr`qzQt=2PbXlNC1GYSoiQ2B>dkVqGTn~mE7X+Rv>AKIzV%z9&{Vh{rG+VbwxJ5 zPkud8Uu^zrJr zY=e_Fc$%JqzK-Bm0LR2sawam!c0~H!M-g}RPGA@|E!_t@gO&?bDtJqfa+l@UI3$W@ zAeq$m*crR+grw4wA`f@~xIl$#jf@4S6YnsAAViVmq@@t1-a!Ve^BNf2^oJO z&;qHhex1x+O(l|vZLV?;Cw;EzDC#6Y8c{u1)skT_&L%=x|2IEkYMV<2cRAD=^Lak?}_xAk5!TJ zSF7475oM02Qbo_Oo88%GIGTdHf))MSS(M z9o{T*7#NXEtv@D=SKbpD+V`X86R}gTOMrHX0ic2(i>>|q5*hf)u`^+XqMNlnzuImE zd2|Cv-H-v6=y|soGWb#R;n-=;Wk83-08rtFIG^S+WFn>!5_lED_&bmkbw`JHbY9Ac zoB6RmtGDu2#gN61ntNa~!fBI?RR(|xe;PKmyF|Z)dZfCoxzaps!!I@2fHU!*2MFit z^X}I3S7XZa9y0aX8TcIg^>)(qmfA<|9nD3`+a~nkl<@T40)FU%k=LN zS<2-{%`LGD4OapOBnE&g(gUg2H;Aj+4+++Co#i?W$)gA>B|pl3hIB7;_~sF79)jV*`>P^N;!w*DiAY zZiaX_QAbyxuIG96kO`t}k4C`XwXOchSkMf3&GWprIXo}?$f1vIht02V#bz!qCSIQ2 zr!l0?Mcf+EW^-(ywGF5jacwi_y4u*O)?8>Ul7H&twEqrJyUM$uGzRe_*Bxkq7Lo{y zTlqE_`I7vF9M5EEvl(zZ8OjimqG1Cp(DP^V0Kgy%$$KJm4}O;5fkXjN#TsG*D1%IL z_y&kmgu6nopQ`7}DU2KXratd6q^x~)3|ZoWFw)_TN)!N9wjQZ|_HD{{y{0H?hs?hD z=V#<8&#BI{#sGr~V0;&ZUdV)y(UO$)$k$z#c%&9{O+#`sZLm>gI=VvdAFtzD9>!KW`(MKnq>Qp$uj_(MYZr@F z0FAW0$${UNl3~0`3;-3lH_~?+B%R$$`C%2)6-a4GJ-x0WvShY7sjD?xAaTdmkmnSN zD$z7Jsf$=#x~OCUP{9wx7U_Nq9IO0Mgy)aeAzjfWNOau~7yw+2tP9I^Ly&CgR+Y6S z;Z@!nfI~_a09Bv^wyW5N=2MUY+V85!nAy@y#6_+{=K1gyK&z4kK#korpom|e(~Hch zi>juTNH^z^y7SAzh6~>U=gnzCyM%z2f;eCj+OIQZ^qpAj%lcwl5aigbEqKor6Z$no# zB6UQ?m|*c~inenAHubTNELYki3Beab+E@y-E@=Q%i5AGDhcEaI%I{Bp`;vyyVkBK& zM(Qq&BXg9$CgIbei-DFU4S*_99{8Lms)4%dn^Y*{Z%4N>04{R)Q}dL+jBqDnA^P7# z5;t^=H_1(1`>{e(?2J^t);dZs05wxg5LvbOq2;`D01HEHw`K#blkaDeWhUAp6N7 z?Z1?`VY5_ZAhtYkBX)XlFxh8Qm!dVESg&OrMcQc#ac6@vR3vWH92DtBYQpYj?WVdD zU4s;)q58a&9Nzs!l>6N@GTfH9L332538||#ryzrK3sS2p!f1{@r<~OPZPud*vNlJu zy+Ijv0PPbuW*&;wB(?ZzK2ii$23#4@C2jBxjjeDq!15xe1F*$dTaZ$f2Kw76NS)EE z*kXXNJpK-JqwqZC$+UoR*7w&YZM*`4(1q0hWwQpjkie>YWZ&zk#NKy6|2*Uv?mTOo zc86|+y%p%X%K@Ou*Vnh-EmQdzi6JgV)_ukCkT&^UM3(KBV=F&4qYKZG@=E{Nx2N2b zw9$$L#Qx+zqqdcZm75{$x)J+0hd)z!pA$%JCvL1F12F{IJ;m>GHY2gZd&Hak-+}IV z9iy!-&X@NQS}8~BKe#(#r~8sNQWXJFk3faB@;f1WV@Fj}SEA|g3~jiztXC_q3AWT` zTH5=PHclxJQn{VUb9o%yiZjjq9Z9X&?v504`IXumfcCoq$PC0O*h1oTG#hA==Dy%R zG3`p~tk`*>Z6>XBsS&bI#PSFb76S)4*LPs&n8K~*elD`Tq!lhjLh?6rBS6@S{6CvU zL>G}QCqs7C(*}1Rfy48>+Q{03;SrZ@M3R8%jvdI}*>6O(6MM6cAKGDz*5R%u7w-N7VjRYpc}S(+lo*#+0K?-L zA9e!}`!L3=H^vMlx=X4+-u#NV&)wYx<#2eO*8}nWdpd02_@8Cf}_e - - - - - - - + android:layout_gravity="center" + android:indeterminate="true" + /> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/glyph_authlite.png b/glyph_authlite.png new file mode 100644 index 0000000000000000000000000000000000000000..1a40c4a2d5e57feb805a6e4ab2421447bce18d07 GIT binary patch literal 3869 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