From 1a8c6bfe28a96ab2cddf77c3f6c04998f5ab90c7 Mon Sep 17 00:00:00 2001 From: str4d Date: Tue, 25 Nov 2014 03:09:05 +0000 Subject: [PATCH] QR code scanning --- .../addressbook/AddressBookActivity.java | 17 +++- .../addressbook/AddressBookFragment.java | 15 +++ .../addressbook/EditContactActivity.java | 15 ++- .../addressbook/EditContactFragment.java | 8 +- .../android/config/ViewIdentityFragment.java | 93 +++++++++--------- .../ic_scan_qr_code_white_24dp.png | Bin 0 -> 1100 bytes .../ic_scan_qr_code_white_24dp.png | Bin 0 -> 691 bytes .../ic_scan_qr_code_white_24dp.png | Bin 0 -> 1471 bytes .../ic_scan_qr_code_white_24dp.png | Bin 0 -> 2114 bytes .../res/layout/fragment_list_contacts.xml | 8 ++ 10 files changed, 100 insertions(+), 56 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_scan_qr_code_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_scan_qr_code_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_scan_qr_code_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_scan_qr_code_white_24dp.png diff --git a/app/src/main/java/i2p/bote/android/addressbook/AddressBookActivity.java b/app/src/main/java/i2p/bote/android/addressbook/AddressBookActivity.java index 9b917c9..5f0b763 100644 --- a/app/src/main/java/i2p/bote/android/addressbook/AddressBookActivity.java +++ b/app/src/main/java/i2p/bote/android/addressbook/AddressBookActivity.java @@ -1,5 +1,6 @@ package i2p.bote.android.addressbook; +import i2p.bote.android.Constants; import i2p.bote.android.InitActivities; import i2p.bote.android.R; import i2p.bote.packet.dht.Contact; @@ -9,6 +10,9 @@ import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; + public class AddressBookActivity extends ActionBarActivity implements AddressBookFragment.OnContactSelectedListener { static final int ALTER_CONTACT_LIST = 1; @@ -39,7 +43,7 @@ public class AddressBookActivity extends ActionBarActivity implements @Override public void onContactSelected(Contact contact) { - if (getIntent().getAction() == Intent.ACTION_PICK) { + if (Intent.ACTION_PICK.equals(getIntent().getAction())) { Intent result = new Intent(); result.putExtra(ViewContactFragment.CONTACT_DESTINATION, contact.getBase64Dest()); setResult(Activity.RESULT_OK, result); @@ -53,7 +57,16 @@ public class AddressBookActivity extends ActionBarActivity implements @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == ALTER_CONTACT_LIST) { + IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); + if (scanResult != null) { + String content = scanResult.getContents(); + if (content != null && content.startsWith(Constants.EMAILDEST_SCHEME)) { + String destination = content.substring(Constants.EMAILDEST_SCHEME.length() + 1); + Intent nci = new Intent(this, EditContactActivity.class); + nci.putExtra(EditContactFragment.NEW_DESTINATION, destination); + startActivityForResult(nci, ALTER_CONTACT_LIST); + } + } else if (requestCode == ALTER_CONTACT_LIST) { if (resultCode == Activity.RESULT_OK) { AddressBookFragment f = (AddressBookFragment) getSupportFragmentManager().findFragmentById(R.id.container); f.updateContactList(); diff --git a/app/src/main/java/i2p/bote/android/addressbook/AddressBookFragment.java b/app/src/main/java/i2p/bote/android/addressbook/AddressBookFragment.java index be3ac83..c70d769 100644 --- a/app/src/main/java/i2p/bote/android/addressbook/AddressBookFragment.java +++ b/app/src/main/java/i2p/bote/android/addressbook/AddressBookFragment.java @@ -15,6 +15,8 @@ import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ListView; +import com.google.zxing.integration.android.IntentIntegrator; + import java.util.SortedSet; import i2p.bote.I2PBote; @@ -76,6 +78,14 @@ public class AddressBookFragment extends AuthenticatedListFragment implements } }); + b = (ImageButton) v.findViewById(R.id.action_scan_qr_code); + b.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startScanQrCode(); + } + }); + return v; } @@ -120,6 +130,11 @@ public class AddressBookFragment extends AuthenticatedListFragment implements getActivity().startActivityForResult(nci, AddressBookActivity.ALTER_CONTACT_LIST); } + private void startScanQrCode() { + IntentIntegrator integrator = new IntentIntegrator(getActivity()); + integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES); + } + @Override public void onListItemClick(ListView parent, View view, int pos, long id) { mCallback.onContactSelected(mAdapter.getItem(pos)); diff --git a/app/src/main/java/i2p/bote/android/addressbook/EditContactActivity.java b/app/src/main/java/i2p/bote/android/addressbook/EditContactActivity.java index 8592c3c..7202e9d 100644 --- a/app/src/main/java/i2p/bote/android/addressbook/EditContactActivity.java +++ b/app/src/main/java/i2p/bote/android/addressbook/EditContactActivity.java @@ -33,11 +33,18 @@ public class EditContactActivity extends ActionBarActivity { getSupportActionBar().setDisplayHomeAsUpEnabled(true); if (savedInstanceState == null) { - String destination = null; + EditContactFragment f = null; Bundle args = getIntent().getExtras(); - if (args != null) - destination = args.getString(EditContactFragment.CONTACT_DESTINATION); - EditContactFragment f = EditContactFragment.newInstance(destination); + if (args != null) { + String destination = args.getString(EditContactFragment.NEW_DESTINATION); + if (destination != null) { + String name = args.getString(EditContactFragment.NEW_NAME); + f = EditContactFragment.newInstance(name, destination); + } else { + destination = args.getString(EditContactFragment.CONTACT_DESTINATION); + f = EditContactFragment.newInstance(destination); + } + } getSupportFragmentManager().beginTransaction() .add(R.id.container, f).commit(); } diff --git a/app/src/main/java/i2p/bote/android/addressbook/EditContactFragment.java b/app/src/main/java/i2p/bote/android/addressbook/EditContactFragment.java index 28f44f1..1af8387 100644 --- a/app/src/main/java/i2p/bote/android/addressbook/EditContactFragment.java +++ b/app/src/main/java/i2p/bote/android/addressbook/EditContactFragment.java @@ -124,7 +124,7 @@ public class EditContactFragment extends EditPictureFragment { } private void initializeContact() { - String newName = getArguments().getString(NEW_NAME); + String newDest = getArguments().getString(NEW_DESTINATION); if (mDestination != null) { try { @@ -141,9 +141,9 @@ public class EditContactFragment extends EditPictureFragment { // TODO Handle e.printStackTrace(); } - } else if (newName != null) { - mNameField.setText(newName); - mDestinationField.setText(getArguments().getString(NEW_DESTINATION)); + } else if (newDest != null) { + mNameField.setText(getArguments().getString(NEW_NAME)); + mDestinationField.setText(newDest); } } diff --git a/app/src/main/java/i2p/bote/android/config/ViewIdentityFragment.java b/app/src/main/java/i2p/bote/android/config/ViewIdentityFragment.java index e9a615c..000a7d8 100644 --- a/app/src/main/java/i2p/bote/android/config/ViewIdentityFragment.java +++ b/app/src/main/java/i2p/bote/android/config/ViewIdentityFragment.java @@ -69,7 +69,7 @@ public class ViewIdentityFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_view_identity, container, false); } @@ -105,7 +105,7 @@ public class ViewIdentityFragment extends Fragment { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - ActionBarActivity activity = ((ActionBarActivity)getActivity()); + ActionBarActivity activity = ((ActionBarActivity) getActivity()); // Set the action bar activity.setSupportActionBar(mToolbar); @@ -148,7 +148,7 @@ public class ViewIdentityFragment extends Fragment { @Override public void onClick(View view) { IntentIntegrator i = new IntentIntegrator(getActivity()); - i.shareText("bote:" + mKey); + i.shareText(Constants.EMAILDEST_SCHEME + ":" + mKey); } }); @@ -164,49 +164,49 @@ public class ViewIdentityFragment extends Fragment { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case R.id.action_edit_identity: - Intent ei = new Intent(getActivity(), EditIdentityActivity.class); - ei.putExtra(EditIdentityFragment.IDENTITY_KEY, mKey); - startActivity(ei); - return true; + case R.id.action_edit_identity: + Intent ei = new Intent(getActivity(), EditIdentityActivity.class); + ei.putExtra(EditIdentityFragment.IDENTITY_KEY, mKey); + startActivity(ei); + return true; - case R.id.action_delete_identity: - DialogFragment df = new DialogFragment() { - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.delete_identity) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - try { - BoteHelper.deleteIdentity(mKey); - getActivity().setResult(Activity.RESULT_OK); - getActivity().finish(); - } catch (PasswordException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (GeneralSecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + case R.id.action_delete_identity: + DialogFragment df = new DialogFragment() { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(R.string.delete_identity) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + try { + BoteHelper.deleteIdentity(mKey); + getActivity().setResult(Activity.RESULT_OK); + getActivity().finish(); + } catch (PasswordException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (GeneralSecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); } - } - }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - return builder.create(); - } - }; - df.show(getActivity().getSupportFragmentManager(), "deletecontact"); - return true; + }); + return builder.create(); + } + }; + df.show(getActivity().getSupportFragmentManager(), "deletecontact"); + return true; - default: - return super.onOptionsItemSelected(item); + default: + return super.onOptionsItemSelected(item); } } @@ -257,11 +257,12 @@ public class ViewIdentityFragment extends Fragment { // render with minimal size return QrCodeUtils.getQRCodeBitmap(qrCodeContent, 0); } + protected void onPostExecute(Bitmap qrCode) { - // only change view, if fragment is attached to activity + // only change view, if fragment is attached to activity if (ViewIdentityFragment.this.isAdded()) { - // scale the image up to our actual size. we do this in code rather - // than let the ImageView do this because we don't require filtering. + // scale the image up to our actual size. we do this in code rather + // than let the ImageView do this because we don't require filtering. Bitmap scaled = Bitmap.createScaledBitmap(qrCode, mKeyQrCode.getHeight(), mKeyQrCode.getHeight(), false); diff --git a/app/src/main/res/drawable-hdpi/ic_scan_qr_code_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_scan_qr_code_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..be7dbf8297f363b07aa326e21129633216c094a1 GIT binary patch literal 1100 zcmV-S1he~zP)3%PeOvp#*It+XonfUE|0f#$UjwMp5eeu@bfZ+bJI98UhSm7cX*eV06R-kf z4zm7d+=8F7y%pOBg{YL$%nM2>J*9Q(NgY+a1LmrQcH+cAoseBPsnx|*Kz-$aE_|Hw zBuwZ_Z>xZ+Caa^}rIgt<=AE5mb=2~e4FpgF%;Zwa%gK|QKpj><>zlw-sR3&JPy*^N z4>f#dUd`CN%A6sgqgz-r9HUe2z`|ts1A9|$#{nFLKQRJrHTnwnG#dRySr;Z^GTzU= zF(M)EsmyJ|E4Ve=i$tQl9Is{nwdkn<)zJ|8v(N<0#!5`ldrf;pz8aV9eK|f2#|tYi z&dtx(Yqc5pMpz5B9*oQbJu`rPY60zX@X|3MxdCXOunc@snR^??;uKM+e`p%} z5Ia)-t3N=C@vw-DzNk(3%<`tb##7|H{GB46C@X|>!&IzIhMTI2`+I)W(dSrtkg;_* zR`^*5Hsd#ZhO2N%&6>TM@?0ID{%9oTro0pHVph}m)!5Jk=xdyxW2^Cf%C}>g%C)ru z=ombJJMl#Jog@5fb+*^!yeqOjOXReTHTw4Bk--2WtaKMn#-}2zpTvXMCc^p61l%QF zloyEWyH~iysltN$H6_MY9{KHfR7BARtjhjw5v3D_Wo{7HcXMw1Rc<^&Wbt2ccU5^S zfJS0IW{POJ4`1M=+`LVcifzKjwh9ZLB`mZL&kJW>QdQo{m9=4dD*Q-f-4Ad&E)xzs zDd&#IL*jb6MS>kK>e_tlPF=4L2GA&xjqB(=VfDwey-d`qIU+JI#f7*=q=?@W=$yd- z>JXtjqtZWB5rHb?X`(t-ObbI<;B&3Q-Q$>P@KA@Q%2` zIp`D)ze@x`rzpG!n!yYP5RqpZReOita`2qUOOFYE8zTzz65-69_%Y{?P@zNdZ9h{u z?Gn9-@>yZU`$ZW!6E}){v}vdSZ4x=DUA%!BG%ER55s7z*C|f1`>3Y1HdvC-=|I*sR zm%-=~-(z*Ww3ITplyXnbU6lRPo7S%_rJS4cj#A2&X8o;}jzdOAA literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_scan_qr_code_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_scan_qr_code_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e1cdd87e5fc8d14fd4783a54acb673b84cb8be54 GIT binary patch literal 691 zcmV;k0!;mhP)6<{43-^bD;Una&k*70%9PxLzO;Xh{aA|T zq$?(yH`z?H6`aCxwth@Hu5z6mcKG1+~#;+J@Z)S$6^IL{pXmrVJ; Zir=-%bC0N$LYV*n002ovPDHLkV1m-SGi3k( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_scan_qr_code_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_scan_qr_code_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..fe48c214d2959e552cdf8c10910739cab880e3fd GIT binary patch literal 1471 zcmV;w1wi_VP)$N-2(#`!42$Fac&evK6G+*>v2f0M7w+K&h2Fqvb!Whv-!t zei4!C7@e#(o;b|94MeS?0BccCQV47Y)>++$z%Jl#)Po%$T2)e2p(H!7*Xj#Jm;LU-gOun1M5ZK&$h#GTNjqVwGu!czv+1Ksu<2j2I1zV-U)2QCg9Fie1FfyZ;1 zt%n8Zjy8LA_XxTeUF~7u1>iWa2Q}ybOMnkT`nfi2&?HC7DAc2#Y0VUT*BfuSJ%0mk zx3PjUin`+{oB)blLX;7AknH^0z|?yDeFS|E@RGe(0dr&enD7Z{q!Iu%z*Ww76L2?h zv&Xjv_|cvZC$t;T;8TI>H0b2JfWLtKR#yVt zgkHtGhpN>Ir|+v#w_9rM-kmgZin;kF5&7JL)S!qwU;${*Xmds60uh<-1;Azzsk9)q zTtr?KkyB0(E4P3sX#}!3>;}F-jdKxdkoCZFqq#=B!E4)z8fVa^3wSb@LDLc-$VP`y z6&Q2sj-wvU&3A%qG=mCMjAo;?Xrj2@X*Yzr^?o$)&58gS)Ih&Nz1KF>@On`%Q*C7c zIE0>^J8bd;#s`{G{BD!2AnOUg1HK6xIIY|1UNjs1(wRs}hye4@61YegMulS{r&IJBA;`QWgNz=kIpPLtgy|a4GNv>VX|5~-R`=Zm1zI~002ovPDHLkV1iZftZ4uM literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_scan_qr_code_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_scan_qr_code_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0f6ed9643a7e082dd1e459b453396050990745 GIT binary patch literal 2114 zcmV-I2)*}-P)lu3$W}#`00t=5QcABM&bjt> z-o5kgTkmV~{>kLtGv~~i>FK#=X3oqja2$s`f^kLE1ITsc4HO4?1I0n!Kyi>aP#mPo zK;3|SfD^Lp(>6JebQq`uumKpHK%2qZrb8O~&nQwgP#fS=V002~M{CpjxW{$4*?gW=-l>+%_Dl_ zfQ(^YRGr&A=y#xB7RO@40pR*5I<^_85h%#wSZr{JXw7EpG*^rR5ssyG26X-aYzB4# zyR~i{7QIFiY5*@juTYEVwR^(f#W!H9mlElk*if+ zfk%E;0{z&=nz53qfwmiM=7wl9*J!gnWM7dODAl#aX3u+HU_ppB3slxmN6sNt1MTv> zPsV>kYofi%`sv6yq-vnup7)V~QnB#L?hcg70c2vKXd>S1b1Z~RWJuLOqk#4Lz6Y3T z>F3%c^q)lXLSD22t^*o?qd+^L2)F>8208;*CD_kp;7?zUC4z^+s~-8jj{o$I<2b!T z>N7FPXIw?fJEHVBrB^6jnnXV*eEPw0oRmFiA~0Xy4*@SA+lV041BXNCEe1LT@EU+B z;;-6I0e^?+tG|tzs)0r$dnUA9a8wNL=!6HB9tC;+Kj2K($Z(Sj3|?A!D9^#HMn@OTGg32J|%yxW=dc8^jy! z2>SLC{D!wWj#F&W<;I{&r6&dGaaY-8O1m+rQt5V1Yz#7s8-t!xdTl^oU6o(wWH1J~ z7=vs)!=yWs!CGXdY5;11_kc6X>j~VA#HDZ3-ElhCL50AFz-*c)%#Ni&_bZW}t&) z?!U7iiB~4dL$vLT%#>Y}J_sxYehZLa3GDExH&^Jsuo-9#O^d*EqZ;`mlR*dIX%Brg zj;@Vbl7h`ZuK`0y@9AnWvIvZa5`$if?ByOtJZL$xQl5j%Ze_^%{#%|lGk}{z^kuy~ zVKdN0U@G>@3yGo=!7F4NZUb%rrUPBIt`;%OIAj((YqS}pB_)KJ#debV4U3b&ok_F{ zlPmf~b-R1B4N3GBcrhZ(^_N^gCE`Kt5f3_!#IfF)?l>C>GmzNhmwR4|ECL@vG66y8 zW8vKdtn#T}ge(V4tOEujC%rWmy+HO1)CTbY6Gi&$9>5QS4gqb0l4gBWzEv3I*}5@N zjeH)%l>S=jpOJJ!FQu0%|3RhAQU{#S_uG|zQRz9__5-C0m2Z~W%CGX&9SItEwhZLx zKx&bIU4z7uR>9%>m@IT80GLAxghw$Sqg?1f{ns9r%YJXZ=OU#joSYO1TL5Je2`wD+ZZK`!2|5 zcgA0wQ;4_uZ3o<>y{oSsGMl+c`x@1KN$WcrI_s7GL&wp}I&w>rE1ktm+J6}!w?z5( z8ufk&GZQO}HVX~Dsnac4Nth*zo=86DDDwFoKsKyJ$O_rT9waz7A|6nVcuom&yQBhH zD|vM`sN5jn>ZC^)u?M;7(Itj_nIS*GqVqeWJ}Bjy(;jpINjtc36YN!5|Dz$lh30#! z3B+zZdl+;-B)Q*Rb-I0&BePaN&5wgtBeBUJS@NJ%iyMRd;Cj$ZrQZ$E;d%)mdFGoPlzzH|CK1U&DN`AMG}iOmst@iHrB5RwsJ-l)xvuNT8WOiFb@bPpY zqB2l1@TgCH1$F~HfNV%hkuAhD53de?1C7?cW*ru_FdaDr@ZZ@(JNl(}k|9zD2o`vnDx#x_hDK8ZlEyaV@A)jAc zBm*#l<~Lk<-6s3{4d8jhl4fWCWKcX_w7W^+Yolip7HsCG~Z64t~4t$2htQEj5$R}5g7_AqUW9X<1 zRF9-D(t!r-3&L9Ew?z!%ChH5eoWpVrFWWJwKmLhyvjqLryeqL8z+1JAdBo!;^QS0( zHBAQvUYx~}w9l3YT}IX~iNgI{P9esr^VFF-&6GuhmKwwe|Ipl1PI~CTPrId@tVV{G sGR;SZyn*5%Z=g8H8z>I)28x6K09OA8X{pMs$N&HU07*qoM6N<$f+U&Rl>h($ literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_list_contacts.xml b/app/src/main/res/layout/fragment_list_contacts.xml index 745d2c6..1398f68 100644 --- a/app/src/main/res/layout/fragment_list_contacts.xml +++ b/app/src/main/res/layout/fragment_list_contacts.xml @@ -23,6 +23,14 @@ app:fab_addButtonColorNormal="@color/accent" app:fab_addButtonColorPressed="@color/accent_dark"> + +