From f6b0966e5a6fc4664cd1e1b2d62323fdd4aff658 Mon Sep 17 00:00:00 2001 From: str4d Date: Sun, 9 Mar 2014 23:06:00 +0000 Subject: [PATCH] New identity creation --- .../ic_device_access_new_account.png | Bin 0 -> 1673 bytes .../ic_device_access_new_account.png | Bin 0 -> 1421 bytes .../ic_device_access_new_account.png | Bin 0 -> 1926 bytes res/layout/fragment_edit_identity.xml | 12 ++- res/menu/settings.xml | 10 ++ res/values/strings.xml | 1 + src/i2p/bote/config/EditIdentityActivity.java | 7 +- src/i2p/bote/config/EditIdentityFragment.java | 94 ++++++++++++++---- src/i2p/bote/config/SettingsActivity.java | 22 ++++ 9 files changed, 124 insertions(+), 22 deletions(-) create mode 100644 res/drawable-hdpi/ic_device_access_new_account.png create mode 100644 res/drawable-mdpi/ic_device_access_new_account.png create mode 100644 res/drawable-xhdpi/ic_device_access_new_account.png create mode 100644 res/menu/settings.xml diff --git a/res/drawable-hdpi/ic_device_access_new_account.png b/res/drawable-hdpi/ic_device_access_new_account.png new file mode 100644 index 0000000000000000000000000000000000000000..593b163c7090097f997ece44e2454b433ccb0a78 GIT binary patch literal 1673 zcmaJ?Yfuwc6kY-bjL?cjc~xB(!Ge(Nh5%+E@=7AH1`%Qjh)PHnvSPB!W-$S=Mi>iK z7{@w_2$YUm>kF$z+gL0nl<|Qx;)r(efx{FP9~45VucEaZ1lk{^JF|Q5J#)VAeCM8T zWFn9<>7h}G}wF|0&$H9 zN{^7kaxxLq;z`96mR6jsP#5Q`g&HV!F&JY)83G+ft3Z=(z21PDM9?TN%IqCs9t4i2 z(D@?hohYR|1xzF;42!q2v2?5!a}q&XnkG>m&uBDqjp1B^%HttIp^yjjd3=5tlM!Yp($gwanBEXD&LGAN zY6>T5oX~>~MpX_`NQ)pw>AMzmU0y?209h{ zNAG_U8x%z(#!JNvL?NYS2A3P)C`F=)6sDpHNJ`laClOz!wfo-sVv4Qd;_MDQiKj1Z5qWV*CL*jZw#xMR104+DVE2G z;Wo76UJo@6V}J{jNd87*n8U8y8wVSA`{0eOt<@MKGxny@%n6+EDvp2 zI`oDWFFpuz^jU|e86mEhrzAehZS^B5Sz_LP)Z*2)JKEEGf6oP|;-i;wo_D?C6~`;I z$4UonD4zH0<{ocubz99rnVxmlzG7d^7sCx3JD&dXJf@?4I3z>3cB?tTIzK(V^=ig@ zd(0uE&DG9%efdW-mc3Bv`Vgq?*lb?VgZgaim26<)^nyihxn*qax@M?(g=@8~2;Ld! zG-8`Kr@Ek_`%6v?=P5hgCTke<6DB;hIr)9F@r=9F1{$-cJ(?12g)Q1**N~nW%BdGl zcYJ7{_D5OYwyq|x;hFucfS}GtekUQYxnk%0GkY-+(BX4;*edNT%-&74JPW*tpL)LD zZ|@bL`h12i)2ylc#G2>fr*v+zCXl7iRCO$Gan(gjsii)k?V2b%T)n@%HFUsy;07mv z_38JB^+3g(zXsMtR!Zex7fkiZ0q!^z*q4ht`_7u)Zhh=ya=*8PtSEWwZ&7DjBLk1o zS!Gr)(&JoYa9ruI&ri2Fs@Lvzw=DQp)wZD}dpWh4Lm^0~X=zqh|CalGa&li){mxwO zB~x(f3%o0HmWAI`d8H_BpT$3@ZwuJ_KzVmcd2qI;vYi#wWR12*YL2(HIR94p?Wv+G z_mhtJuYFi_fdW!1xj*%Ac=TBryCChz$-v@Gih8}7vN$(1x;G}fB(1E!O26`~+y1yatnp^@vbeA#?%Ja>%2(G~H`rGVTYk>>sky#} z3Nf4xT}kv=1umE5-N4I%;alFhU#)3aRmC5y{PVg`@Y^2-w)D17A56c*-t;8y@{^uf zcOqZMez!1GLj^ke^2JuZ{B#F?yS>(|;2z{S%{~|Vdt=rt7eUue=^R9!JFnm#8~z~X o!MVDHPLk=~ERGX${5;DYI5cwSI=d_#ar_))l4S9TgzVD40m1ouPXGV_ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_device_access_new_account.png b/res/drawable-mdpi/ic_device_access_new_account.png new file mode 100644 index 0000000000000000000000000000000000000000..aae6a9587a83c88d4783b54db9e7992dfcaae055 GIT binary patch literal 1421 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsViq(A?D0)!5k7$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1ObbUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnqfX zG!Lpb1-Dy_aO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z?&4ox$H2h&-_yl0 zq~g|_>F2dw0!5BLKRcsm{^H0VfnGW-Q>Fx!xrmu~yJr4l;MUx@DZzW=hJfV6)Z~RC z+==OmC%ZU1H5Pi-@gM$NlV2OZcbVip|NO^SmRpzKn{9c&_}$Luchxn!9u;2RBRBnQ zDPyEqopz&Jz|r&56ZmWXv^L~i;NRt7$a<%-bOVE2se9rgj?V{7GFbC_A~?7T?yxmK zxV2JBf+_a_;~wK~rLW9A`y_i9=L<`&VDLV`pThQmwdx?}^d#1hW;?FUrp#X#OgPu7 zdB#EY`BR1Y7tJjLTUa%VTRWzdH%JL2#fn%eDy-{_Go2Y&-mD_XTKUvP@Lkhv6IL~s zJqAUEZzbPYC@SzY>Fn`2t9io7c3U;4QbJ3#f1x05^P7eA~y_Reid>ATcZ&mA>a zJT6}(x_+bdty^88&poY#dYV(u)_b_kXRI<_Q2H+UiLli3YrY&O99U!;oHy_vTJWv? zcc{~X$&d5Dr`=(-O_;)3#!`Y)%9 zWbD-`7pF8tZt!4yZsq6pa@K6~v!+M;m_1kVHkW;hNSMU9jHr(9zyJ=glS!67H98U+7}pA;P%*9=A%F?@3+8S2rEXybrL>c=F;z i^}+wASFZi0dw?Of)6slUXv+yu0qN=L=d#Wzp$Py5&HXw6 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_device_access_new_account.png b/res/drawable-xhdpi/ic_device_access_new_account.png new file mode 100644 index 0000000000000000000000000000000000000000..e61a09f5e85c3af92b7c434c110dfd9cea928731 GIT binary patch literal 1926 zcmaJ?X;2eM6rLaf7EvRYD2ihgErA>Z36Mx6kOU19%tC~KSH@%{5t9j%K?1TGz?0P~ z%Tna>DABS66&1Wzj-Y}iqVb?a(Opnj1fjrdS15Gdi2}PnmYuGd?tb;Y?|rY|>zdut z=p~aJXE*`?FiE^r7(>i_>+4`gd`mSczY)`PTqMV1(e-#5j3Gdn3SEbQVlAA6#2~OL zJ>?D(0ss@{X=HL-E{WnQQ7s*|`p}J9J%I**kWix@Rwg4jxDH9u=y=qD>$Ox+qvBEH z*%GEiFF@3qr5P9!n-MKjW+W>)Dr)FrFvQ3u2($yNMD6?dxUBP7$!C)d^Pd$&3_EcYTiW?fiG`xeFLx_2iG8^*KLeFpVkK zJW42OQ{9@cZZ|>nhgVev;)bu#R|OQ6X35tjm7bcNc_N_t!5_7ypVq9nbTIOyj8o+1 zNEsVa*D{+}v!C={+YWwEH#s!NhdIUo@at7Kx)PV^mQ9CPNSpGcWz=b)Dz1uu2v&gjh zj$l^5lbmmPp0MZj?CdSfqt)IdA2aZj>{T?M@3Qvup=BN3Z)THP2A``Y7o<9Ea}Maw zKFoR55W4c#>xSjzqSe%EB2r>y!_PkTAm+&Wh==g^z=my({Dv6~dSEpw8CB+{E`b!eHAM4avEyGkx>(Qgxm=@cyq0 zrh9Iv%D9tnaa-F|KOE_s)hqv4Y=4xKIiu%GQ$R#QV0;m1YOHwoi^CvY+Jd>alY*)uC!UD$#EZ^@ue#C;TDFoH=9s)oH}~`x><@0(eAE=D zf7l^=Qv~RgHQ5z4)$Q&JA}dv(1t z|4Fx}ymH>9kKP@hi{nZ@4T5IMV|AC@O<*eUsg7?slv>;OE4yMBblydGG?Q70B8*4eZH+JZP&bz`39iWZ&=S7iSUEVc4* literal 0 HcmV?d00001 diff --git a/res/layout/fragment_edit_identity.xml b/res/layout/fragment_edit_identity.xml index 1c4f56f..3b06d0a 100644 --- a/res/layout/fragment_edit_identity.xml +++ b/res/layout/fragment_edit_identity.xml @@ -31,12 +31,20 @@ android:hint="@string/description" android:inputType="text" /> - + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 9cd4710..9f3a2a3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -61,6 +61,7 @@ Password changed successfully Identities + New identity Public name Description Default identity diff --git a/src/i2p/bote/config/EditIdentityActivity.java b/src/i2p/bote/config/EditIdentityActivity.java index fa9b68a..23c7bcf 100644 --- a/src/i2p/bote/config/EditIdentityActivity.java +++ b/src/i2p/bote/config/EditIdentityActivity.java @@ -16,8 +16,11 @@ public class EditIdentityActivity extends ActionBarActivity implements getSupportActionBar().setDisplayHomeAsUpEnabled(true); if (savedInstanceState == null) { - EditIdentityFragment f = EditIdentityFragment.newInstance( - getIntent().getExtras().getString(EditIdentityFragment.IDENTITY_KEY)); + String key = null; + Bundle args = getIntent().getExtras(); + if (args != null) + key = args.getString(EditIdentityFragment.IDENTITY_KEY); + EditIdentityFragment f = EditIdentityFragment.newInstance(key); getSupportFragmentManager().beginTransaction() .add(R.id.edit_identity_frag, f).commit(); } diff --git a/src/i2p/bote/config/EditIdentityFragment.java b/src/i2p/bote/config/EditIdentityFragment.java index d85762a..5aef0f4 100644 --- a/src/i2p/bote/config/EditIdentityFragment.java +++ b/src/i2p/bote/config/EditIdentityFragment.java @@ -2,10 +2,13 @@ package i2p.bote.config; import java.io.IOException; import java.security.GeneralSecurityException; +import java.util.List; import i2p.bote.I2PBote; import i2p.bote.R; import i2p.bote.StatusListener; +import i2p.bote.crypto.CryptoFactory; +import i2p.bote.crypto.CryptoImplementation; import i2p.bote.email.EmailIdentity; import i2p.bote.fileencryption.PasswordException; import i2p.bote.util.BoteHelper; @@ -24,8 +27,10 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; +import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; +import android.widget.Spinner; import android.widget.TextView; public class EditIdentityFragment extends Fragment { @@ -60,11 +65,15 @@ public class EditIdentityFragment extends Fragment { // instance of this fragment after rotation. static final String IDENTITY_WAITER_TAG = "identityWaiterTask"; + static final int DEFAULT_CRYPTO_IMPL = 2; + private String mKey; private FragmentManager mFM; MenuItem mSave; EditText mNameField; EditText mDescField; + Spinner mCryptoField; + int mDefaultPos; CheckBox mDefaultField; TextView mError; @@ -104,20 +113,30 @@ public class EditIdentityFragment extends Fragment { mDefaultField = (CheckBox) view.findViewById(R.id.default_identity); mError = (TextView) view.findViewById(R.id.error); - try { - EmailIdentity identity = BoteHelper.getIdentity(mKey); - mNameField.setText(identity.getPublicName()); - mDescField.setText(identity.getDescription()); - mDefaultField.setChecked(identity.isDefault()); - } catch (PasswordException e) { - // TODO Handle - e.printStackTrace(); - } catch (IOException e) { - // TODO Handle - e.printStackTrace(); - } catch (GeneralSecurityException e) { - // TODO Handle - e.printStackTrace(); + if (mKey == null) { + // Show the encryption choice field + mCryptoField = (Spinner) view.findViewById(R.id.crypto_impl); + CryptoAdapter adapter = new CryptoAdapter(getActivity()); + mCryptoField.setAdapter(adapter); + mCryptoField.setSelection(mDefaultPos); + mCryptoField.setVisibility(View.VISIBLE); + } else { + // Load the identity to edit + try { + EmailIdentity identity = BoteHelper.getIdentity(mKey); + mNameField.setText(identity.getPublicName()); + mDescField.setText(identity.getDescription()); + mDefaultField.setChecked(identity.isDefault()); + } catch (PasswordException e) { + // TODO Handle + e.printStackTrace(); + } catch (IOException e) { + // TODO Handle + e.printStackTrace(); + } catch (GeneralSecurityException e) { + // TODO Handle + e.printStackTrace(); + } } } @@ -139,6 +158,10 @@ public class EditIdentityFragment extends Fragment { String description = mDescField.getText().toString(); boolean setDefault = mDefaultField.isChecked(); + int cryptoImplId = -1; + if (mKey == null) + cryptoImplId = ((CryptoImplementation) mCryptoField.getSelectedItem()).getId(); + InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mNameField.getWindowToken(), 0); @@ -146,8 +169,8 @@ public class EditIdentityFragment extends Fragment { mError.setText(""); IdentityWaiterFrag f = IdentityWaiterFrag.newInstance( - false, - -1, + (mKey == null ? true : false), + cryptoImplId, mKey, publicName, description, @@ -177,6 +200,40 @@ public class EditIdentityFragment extends Fragment { } } + private class CryptoAdapter extends ArrayAdapter { + public CryptoAdapter(Context context) { + super(context, android.R.layout.simple_spinner_item); + setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + List instances = CryptoFactory.getInstances(); + mDefaultPos = 0; + for (CryptoImplementation instance : instances) { + add(instance); + if (instance.getId() == DEFAULT_CRYPTO_IMPL) + mDefaultPos = getPosition(instance); + } + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = super.getView(position, convertView, parent); + setViewText(v, position); + return v; + } + + @Override + public View getDropDownView (int position, View convertView, ViewGroup parent) { + View v = super.getDropDownView(position, convertView, parent); + setViewText(v, position); + return v; + } + + private void setViewText(View v, int position) { + TextView text = (TextView) v.findViewById(android.R.id.text1); + text.setText(getItem(position).getName()); + } + } + public static class IdentityWaiterFrag extends TaskFragment { static final String CREATE_NEW = "create_new"; static final String CRYPTO_IMPL_ID = "crypto_impl_id"; @@ -268,7 +325,6 @@ public class EditIdentityFragment extends Fragment { publishProgress(status); } }; - lsnr.updateStatus("Saving identity"); try { BoteHelper.createOrModifyIdentity( (Boolean) params[0], @@ -277,7 +333,9 @@ public class EditIdentityFragment extends Fragment { (String) params[3], (String) params[4], (String) params[5], - (Boolean) params[6]); + (Boolean) params[6], + lsnr); + lsnr.updateStatus("Saving identity"); I2PBote.getInstance().getIdentities().save(); return null; } catch (Throwable e) { diff --git a/src/i2p/bote/config/SettingsActivity.java b/src/i2p/bote/config/SettingsActivity.java index 1adb7a5..5f034cd 100644 --- a/src/i2p/bote/config/SettingsActivity.java +++ b/src/i2p/bote/config/SettingsActivity.java @@ -23,6 +23,8 @@ import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -102,6 +104,26 @@ public class SettingsActivity extends PreferenceActivity { super.onPause(); } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu + getMenuInflater().inflate(R.menu.settings, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_new_identity: + Intent ni = new Intent(this, EditIdentityActivity.class); + startActivity(ni); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + @Override protected boolean isValidFragment(String fragmentName) { return SettingsFragment.class.getName().equals(fragmentName);