From 28d0e73adde190bd728684bc3c6629b65696adb1 Mon Sep 17 00:00:00 2001 From: str4d Date: Thu, 28 Aug 2014 12:46:05 +0000 Subject: [PATCH] Forward and Reply all --- TODO | 2 - .../i2p/bote/android/NewEmailActivity.java | 13 ++- .../i2p/bote/android/NewEmailFragment.java | 107 ++++++++++++------ .../i2p/bote/android/ViewEmailFragment.java | 30 +++-- .../res/drawable-hdpi/ic_social_forward.png | Bin 0 -> 1469 bytes .../res/drawable-hdpi/ic_social_reply_all.png | Bin 0 -> 1644 bytes .../res/drawable-mdpi/ic_social_forward.png | Bin 0 -> 1271 bytes .../res/drawable-mdpi/ic_social_reply_all.png | Bin 0 -> 1434 bytes .../res/drawable-xhdpi/ic_social_forward.png | Bin 0 -> 1659 bytes .../drawable-xhdpi/ic_social_reply_all.png | Bin 0 -> 1944 bytes app/src/main/res/menu/view_email.xml | 12 ++ app/src/main/res/values/strings.xml | 4 + 12 files changed, 121 insertions(+), 47 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_social_forward.png create mode 100644 app/src/main/res/drawable-hdpi/ic_social_reply_all.png create mode 100644 app/src/main/res/drawable-mdpi/ic_social_forward.png create mode 100644 app/src/main/res/drawable-mdpi/ic_social_reply_all.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_social_forward.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_social_reply_all.png diff --git a/TODO b/TODO index 2878839..81fa4d0 100644 --- a/TODO +++ b/TODO @@ -23,8 +23,6 @@ Features: - Public address book lookup - "Write email" link in address book - Add optional CC: and BCC: fields -- Forward -- Reply all - Attachments - QR codes for identities - "Empty trash" option in Trash folder diff --git a/app/src/main/java/i2p/bote/android/NewEmailActivity.java b/app/src/main/java/i2p/bote/android/NewEmailActivity.java index a3d4d8c..35e64e6 100644 --- a/app/src/main/java/i2p/bote/android/NewEmailActivity.java +++ b/app/src/main/java/i2p/bote/android/NewEmailActivity.java @@ -19,14 +19,17 @@ public class NewEmailActivity extends ActionBarActivity implements getSupportActionBar().setDisplayHomeAsUpEnabled(true); if (savedInstanceState == null) { - String quoteMsgFolder = null; - String quoteMsgId = null; + NewEmailFragment f; Bundle args = getIntent().getExtras(); if (args != null) { - quoteMsgFolder = args.getString(NewEmailFragment.QUOTE_MSG_FOLDER); - quoteMsgId = args.getString(NewEmailFragment.QUOTE_MSG_ID); + String quoteMsgFolder = args.getString(NewEmailFragment.QUOTE_MSG_FOLDER); + String quoteMsgId = args.getString(NewEmailFragment.QUOTE_MSG_ID); + NewEmailFragment.QuoteMsgType quoteMsgType = + (NewEmailFragment.QuoteMsgType) args.getSerializable(NewEmailFragment.QUOTE_MSG_TYPE); + f = NewEmailFragment.newInstance(quoteMsgFolder, quoteMsgId, quoteMsgType); + } else { + f = new NewEmailFragment(); } - NewEmailFragment f = NewEmailFragment.newInstance(quoteMsgFolder, quoteMsgId); getSupportFragmentManager().beginTransaction() .add(android.R.id.content, f).commit(); } diff --git a/app/src/main/java/i2p/bote/android/NewEmailFragment.java b/app/src/main/java/i2p/bote/android/NewEmailFragment.java index fcea528..33f2a98 100644 --- a/app/src/main/java/i2p/bote/android/NewEmailFragment.java +++ b/app/src/main/java/i2p/bote/android/NewEmailFragment.java @@ -52,7 +52,7 @@ public class NewEmailFragment extends Fragment { public void onTaskFinished(); } private static Callbacks sDummyCallbacks = new Callbacks() { - public void onTaskFinished() {}; + public void onTaskFinished() {} }; @Override @@ -71,6 +71,12 @@ public class NewEmailFragment extends Fragment { public static final String QUOTE_MSG_FOLDER = "sender"; public static final String QUOTE_MSG_ID = "recipient"; + public static enum QuoteMsgType { + REPLY, + REPLY_ALL, + FORWARD + } + public static final String QUOTE_MSG_TYPE = "type"; private String mSenderKey; @@ -81,11 +87,13 @@ public class NewEmailFragment extends Fragment { EditText mSubject; EditText mContent; - public static NewEmailFragment newInstance(String quoteMsgFolder, String quoteMsgId) { + public static NewEmailFragment newInstance(String quoteMsgFolder, String quoteMsgId, + QuoteMsgType quoteMsgType) { NewEmailFragment f = new NewEmailFragment(); Bundle args = new Bundle(); args.putString(QUOTE_MSG_FOLDER, quoteMsgFolder); args.putString(QUOTE_MSG_ID, quoteMsgId); + args.putSerializable(QUOTE_MSG_TYPE, quoteMsgType); f.setArguments(args); return f; } @@ -106,39 +114,45 @@ public class NewEmailFragment extends Fragment { public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + mSpinner = (Spinner) view.findViewById(R.id.sender_spinner); + mRecipients = (ContactsCompletionView) view.findViewById(R.id.recipients); + mSubject = (EditText) view.findViewById(R.id.subject); + mContent = (EditText) view.findViewById(R.id.message); + String quoteMsgFolder = getArguments().getString(QUOTE_MSG_FOLDER); String quoteMsgId = getArguments().getString(QUOTE_MSG_ID); - Email origEmail = null; - String recipientName = null; - String recipientAddr = null; - Bitmap recipientPic = null; + QuoteMsgType quoteMsgType = (QuoteMsgType) getArguments().getSerializable(QUOTE_MSG_TYPE); + boolean hide = I2PBote.getInstance().getConfiguration().getHideLocale(); + + List recipients = new ArrayList(); String origSubject = null; String origContent = null; String origFrom = null; try { - origEmail = BoteHelper.getEmail(quoteMsgFolder, quoteMsgId); + Email origEmail = BoteHelper.getEmail(quoteMsgFolder, quoteMsgId); + if (origEmail != null) { mSenderKey = BoteHelper.extractEmailDestination( BoteHelper.getOneLocalRecipient(origEmail).toString()); - String recipient = BoteHelper.getNameAndDestination( - origEmail.getReplyAddress(I2PBote.getInstance().getIdentities())); - recipientName = BoteHelper.extractName(recipient); - recipientAddr = BoteHelper.extractEmailDestination(recipient); - if (recipientAddr == null) { // Assume external address - recipientAddr = recipient; - if (recipientName.isEmpty()) - recipientName = recipientAddr; - } else { - if (recipientName.isEmpty()) // Dest with no name - recipientName = recipientAddr.substring(0, 5); - recipientPic = BoteHelper.getPictureForDestination(recipientAddr); + + if (quoteMsgType == QuoteMsgType.REPLY) { + String recipient = BoteHelper.getNameAndDestination( + origEmail.getReplyAddress(I2PBote.getInstance().getIdentities())); + recipients.add(extractPerson(recipient)); + } else if (quoteMsgType == QuoteMsgType.REPLY_ALL) { + // TODO don't include our address + // What happens if an email is received by multiple local identities? + for (Address address : origEmail.getAllAddresses(true)) { + recipients.add(extractPerson(address.toString())); + } } + origSubject = origEmail.getSubject(); origContent = origEmail.getText(); origFrom = BoteHelper.getShortSenderName(origEmail.getOneFromAddress(), 50); } } catch (PasswordException e) { - // TODO Auto-generated catch block + // Should not happen, we cannot get to this page without authenticating e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block @@ -151,11 +165,12 @@ public class NewEmailFragment extends Fragment { e.printStackTrace(); } - mSpinner = (Spinner) view.findViewById(R.id.sender_spinner); + // Set up identities spinner IdentityAdapter identities = new IdentityAdapter(getActivity()); mSpinner.setAdapter(identities); mSpinner.setSelection(mDefaultPos); + // Set up contacts auto-complete List contacts = new ArrayList(); try { for (Contact contact : I2PBote.getInstance().getAddressBook().getAll()) { @@ -192,21 +207,24 @@ public class NewEmailFragment extends Fragment { } }; - mRecipients = (ContactsCompletionView) view.findViewById(R.id.recipients); mRecipients.setAdapter(mAdapter); - if (recipientAddr != null) { - mRecipients.addObject(new Person(recipientName, recipientAddr, recipientPic)); + for (Person recipient : recipients) { + mRecipients.addObject(recipient); } - mSubject = (EditText) view.findViewById(R.id.subject); - mContent = (EditText) view.findViewById(R.id.message); - boolean hide = I2PBote.getInstance().getConfiguration().getHideLocale(); if (origSubject != null) { - String responsePrefix = getResources().getString( - hide ? R.string.response_prefix_re_hide - : R.string.response_prefix_re); - if (!origSubject.startsWith(responsePrefix)) - origSubject = responsePrefix + " " + origSubject; + String subjectPrefix; + if (quoteMsgType == QuoteMsgType.FORWARD) { + subjectPrefix = getResources().getString( + hide ? R.string.subject_prefix_fwd_hide + : R.string.subject_prefix_fwd); + } else { + subjectPrefix = getResources().getString( + hide ? R.string.response_prefix_re_hide + : R.string.response_prefix_re); + } + if (!origSubject.startsWith(subjectPrefix)) + origSubject = subjectPrefix + " " + origSubject; mSubject.setText(origSubject); } if (origContent != null) { @@ -227,6 +245,31 @@ public class NewEmailFragment extends Fragment { } } + private Person extractPerson(String recipient) { + String recipientName = BoteHelper.extractName(recipient); + String recipientAddr = BoteHelper.extractEmailDestination(recipient); + if (recipientAddr == null) { // Assume external address + recipientAddr = recipient; + if (recipientName.isEmpty()) + recipientName = recipientAddr; + return new Person(recipientName, recipientAddr, null, true); + } else { + if (recipientName.isEmpty()) // Dest with no name + recipientName = recipientAddr.substring(0, 5); + Bitmap recipientPic = null; + try { + recipientPic = BoteHelper.getPictureForDestination(recipientAddr); + } catch (PasswordException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (GeneralSecurityException e) { + e.printStackTrace(); + } + return new Person(recipientName, recipientAddr, recipientPic); + } + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.new_email, menu); diff --git a/app/src/main/java/i2p/bote/android/ViewEmailFragment.java b/app/src/main/java/i2p/bote/android/ViewEmailFragment.java index a2a77ec..8630319 100644 --- a/app/src/main/java/i2p/bote/android/ViewEmailFragment.java +++ b/app/src/main/java/i2p/bote/android/ViewEmailFragment.java @@ -144,15 +144,29 @@ public class ViewEmailFragment extends Fragment { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - case R.id.action_reply: - Intent nei = new Intent(getActivity(), NewEmailActivity.class); - nei.putExtra(NewEmailFragment.QUOTE_MSG_FOLDER, mFolderName); - nei.putExtra(NewEmailFragment.QUOTE_MSG_ID, mMessageId); - startActivity(nei); - return true; + case R.id.action_reply: + case R.id.action_reply_all: + case R.id.action_forward: + Intent nei = new Intent(getActivity(), NewEmailActivity.class); + nei.putExtra(NewEmailFragment.QUOTE_MSG_FOLDER, mFolderName); + nei.putExtra(NewEmailFragment.QUOTE_MSG_ID, mMessageId); + NewEmailFragment.QuoteMsgType type = null; + switch (item.getItemId()) { + case R.id.action_reply: + type = NewEmailFragment.QuoteMsgType.REPLY; + break; + case R.id.action_reply_all: + type = NewEmailFragment.QuoteMsgType.REPLY_ALL; + break; + case R.id.action_forward: + type = NewEmailFragment.QuoteMsgType.FORWARD; + } + nei.putExtra(NewEmailFragment.QUOTE_MSG_TYPE, type); + startActivity(nei); + return true; - default: - return super.onOptionsItemSelected(item); + default: + return super.onOptionsItemSelected(item); } } } diff --git a/app/src/main/res/drawable-hdpi/ic_social_forward.png b/app/src/main/res/drawable-hdpi/ic_social_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..bed191d6b49394adf575973fe9cf9676d775c4b4 GIT binary patch literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$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(#^lGsViy!p+Rc+|G&eP`1g19yq1PFwUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dR=1cL zm|3_v;xrGcHwCv_aO>3vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zz8ZPKgn@xc z-_yl0q~g|_8E3Uw5@n93Z#!BQY39;VRN(0MD+rq_I&D3FXioUW-RZ-cq`=qZzeinp&d+HsH8^DJH_3DlbKgOmj;8PrenIty8}4$fNHE^B ztl}<%>4N^-%`ydyVUGG4i>DlUv!rhI>30iPbnCxL<+j=AEz?-L;pl_-t?Q2+XP=R9 z_V=gu$&(#eCDIfoGln~uXaCg9eekY{HQ@BRXIpnjov|-n=)`xYs!Y~2;QIm98D6jb z@)I~s8XZr$?N?Niy|6!8Z=oEvrEUHiM-clUQ%Oq@CC;op1Qu1gN5pU(So z{o!WE1HnHQu-dfq2RW$J1TZB%Y!=X%!1I2)gOAmo`%Kpp{ETXrxqGc&I!E0?dkxb* l{r6E0+~8Q0IlY{Lnc>9u84E7jaR!14R8Lnwmvv4FO#lk@9UlMy literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_social_reply_all.png b/app/src/main/res/drawable-hdpi/ic_social_reply_all.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee22a854f7bea17c0358a3452150c694de834d0 GIT binary patch literal 1644 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$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(#^lGsViy(bUY?*~!t=$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OqgUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZns$A zG!Lpb1-Dx)aq86vIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1z?sf60Wnf^s=jq}Y zQgQ3e49^S^N0GMO)~8b>%{iK`JLo;~<){!dzcAZnf`DOrq3w|s<)Stfot7OLLMI(N zU!06?QK;aMW6@V*35nrLaxhUlqMCeWOZ~z70X@c{SG{*duV9yN^z{AsKlc6JD%*AM zf1mp=v(7YuH-h%32`v z=j3EY#X620w$!7$7y};7@`~eOd1T%w%KTCLwW8fB#>g5=?~j2zPrPa(n6*CUi9I?j z5zv`Gsb!hgy)R0^o%zi92Qv#e=B!oTC#ciZ{GfUkTgjvQjlmBX=GX02mzTIP`-|@y zqXexwdyD0sv)MNAocq9HbM35uUEIU(*C!cGSW;mb)~GM~PfBq4C(b?W#t$TC^k+G! z?we~V?^;tJWLo;6-qBg0`Ju1@js;`ir6c_!QK`bcHZ0*Yn*NutU(R@TQfKMa$C?p78*JB1Jsrf`>ZLgU=x@e3 zEWazbGGim;f`15A2rTb-T(V$6$K6%z%8O4otoM2NQ|H!-^Sf5oZDQTG^5?9JF-O=6 zX5R|hdqOJG+I^K9r(&J-jdOu1%hTiougpJ~_-^_y4aIAJgO+&MXRirLm!G~&zsYlQ z<`>KE($4rP&OMBCAE=q{J~-{U>y8sL_l|A9@tM18@*R#{hk7ns30u!_J9MI>ku$cZ zDcnZzX2nF;8qqu4zwH(nZPa>eJg0$k;;P^?<^AHTJ+^PA5u?FGW*Yt-J*A{ z_Z)p*DaBoB{Jl3^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(#^lGsViy!p+Rc+|G&eP`1g19yuGh=}r(RHE$SnZc?2=lPS(cjOR+OKs0QR(1CT_R5 z;4}}aHwC9#OkHv6)dxC89~8AnQ4JFUrXLU!o^XL2c+yYJ1E%*PV8X6q3;)5uz?kXj z;uunK>&IDiTnTm^IvOUZQL3Ac+PE0znAlVUGdpoJpcZg%5yu717(i4PFNhlVe^UMznX)z zloQ*F!x<+SbR&)@tYFBON;+)Ta$2qCtk9vadK>s2CQC=P7KlDz4V)%$QJ;UYB+moM z>KRVz>k4~Vr(Ec(t5JD&dMmrm<2z;zZ{8~J{b{#u!!q`BO1m~Rsn=wk(0FQB>MZhF z=d94I!cO5ck7DD)zy9Tw3!bKMQ#dsz@rKC(mbQSyddC6}>TWY!Z@%_th1dzH^@~Ks zcN~|QRnQ>k^Xkr~N!j*mQ$6>qzMO76Sx(|I)1`p+7gyb;`0ww`EP4I%yRB7?$-=V} zw%)y%bnIyCJm!wVC< mMtklF|MgEWr^v-K@h~)Wr!z$vtiJ>*iacHYT-G@yGywnl3^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(#^lGsViy(bUY?*~!(^$-vFf(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1O$kUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dZnrq& zG!Lpb1-DyVaO%|uIz}H9wMbD769T3m5EGtofgE_!Pt60S_ab1zX7*YASs{9YxxVJGc9qXmJP$9z5i<@vG<>-7P}gADuYZ7VT^1SR|;Fq^xlx;s={p zm{tU9vsjap6sJa1h55-J{Bv3hXWU#}Wq0qzG4H7q)nrCgS6kvDV&(iTkdV#!+cCzOLhV>1<6%Y8? z1t?bDF|*Kba~0>in!U53vPm{6U{e+n;ReQ1i`n{V#o@QMMpM=mM{qqrB#J z-t8=l5*nF8lP#iUlm)dv<%C4FiTP^(ZoOz(>1K0)r}9K8r_L(-^1!AIUv~TK)5r>o zWuC#dJZ{zpW|`oii%~1*#LkK}^0|Jl%fjcgSDMg9xBJ0e@<)R9u^(Qba`YvGaKfaP zLeC95(qm=>KW~gSVAp%mqJ1$~zsda;zs^y6r3{zOVt3>1?$>Xtb_DDZQx|^a(vjVM zz-+C=>8FX?xaBfTJ0owiFMe=ji|{I?H$?@RUB+K#PI#4<#ah67PBZM?Z>dIhEdgeB z1^#JMH>&Jla#zUO5&vV&agqCHMQ#}vu3TB{ro~=-gZ-1eWsi^2qbDU>m!1sy8YknH v7w5%2>t9*s_RpaXZ|fa>8=k-QZeV11%fa4}SDLXNR9bqv`njxgN@xNAz$5s` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_social_forward.png b/app/src/main/res/drawable-xhdpi/ic_social_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..340ce9ab55d7c7c9b170c473cb7a3794e3a51746 GIT binary patch literal 1659 zcmaJ?Yfuws6kWgo38GYOMXYoQk7_a5UCeVOVjzh?4MI$XnWB@BED%YuOR_+qpb1c| zTGRrz8XZJhh4Fzwo$9n!<7=X$jcv8s(#EdU`l<%3bwoSWZV=EP(w*78-*@Mpb6;m> zSLNo+i)6*H004;0%9N>SJ2&u#htl7jhVm=4nL^47$c1<@S*5jLfK-ncVPKX?TY{-D zt-iYa43-K2AqfU`0a>7&kLqv}R~v}o+DrtE27uHw8==*eVI)|Dl^DztcHh@W*`Pr$ zVdwLeu#(8YN)4Gc7HnZnj#^h!rW5PgX>-6-8%h(HFj5QJOh&U6wMp26yeNGRxFI$; z7($jw*w2e9Q09UexCI0GT$rPS1qdkMaSCVF6yO-n!s7Y?*E9H>qt_xBm2U{EAH5dgs91+j{Rh(@G~vqfg;2XVau> z8r$=7jdE#I!SvF&JXiDjBzDY(%(+tafe8ssQ4z<|KCHYyzP?GbDM^`$PMp-^Qk`ti zbmg8)bnfnJsDh2#yuNd2%fF$^jK{C|{Ex0|#w#@~JmtIc*j23d;4a`D`wKG$L67D4 z@9GLJ1g=q79^(*0P#@PXUKb%4BS@U=<`NTkLmj{b&s&JN1egeQMK zc8*=BnSJo!*&oZwH_twEZOL~_Yx7xXNM%Fyntuuy#cmAV+zE8L-*cU0$D9Ujk!=pH z4u^zK-rT|nb1z<9!b)Jz{Hw2dd-w&a`5t%Qq98%TN=?NMcc&)0Fzg#@_IZ8-q_GR9 z|K=;cec-c%i@hNUJEtk`tEhRzx(mN+c8E5`ED%Z7I`*_rNMFz;x7SfokNm}s@wfbP z@4dvfva798mxYd&N!*7QqxUQddq1exE%y4BI#hQf`ZxM3r}_o;Td8sD8a7=YD4Zs1 zyw=UQRZ=_oUQaWCdp+xcz222=K%aM| z)1Cm`%c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh**NZ(?$0 z9!LbN!`Ii!Gq1QLF)umQ)5TT^Xog;9W{Q=Yqp6v(vy+*rlYyI|p{t>#iJ_&diIcOV zo2j9>iIX8ruSMv>2~2MaLa#Yay`aR9TL84#CABECEH%ZgC_h&L>}jh^Y;Li1 zb~7_Ka>8jIRBsA4w?Ondfp`!vYThn*#KU(UgH$A5K?Xc@@r8SAMc|{ycjf2zNcj~vI zL+DS-1C|Ts7w=Qi z?X&w&YwR1=9|;j)dZW~TY*t3~>W;UrKR5HlP09bBSK zcMR>CJ}*u`Wcw#GUoCrj^^+BU%(z0=2eGLxj(d7AbKmrt3u8Pt{BCr0(BB|%L)=*0 zBIjspOaFn)t9A(!9KRH-OHWUz=7 z_iD=_E58>HdViNXHO;p_H2)ooZfKU|2DS*#MQS3Q1s!h>G&>oFUSnEX(ln>Kr7=>@ z_Jmdf|Ax-vD{Sf~{EpyV!*K7_w1bLi)%usX=3eks=hKtt@tIG0bguvzhnrKD6rU zLW2u6r5W7`^#v`{@|Gz4ochpw9Z&nsm%nZaay@D}G_msn=b~5A36`SMc_&LB5PcAQ zL3iTc1a}3N?x5>^DxBXwp4% zPs-uG5A|)I;wSxCT6jk2!EUv}jj9Wj+J3Iv0MB~hoanH%?>`d{gK2p7I_^syTA;ep M)78&qol`;+0Bue99RL6T literal 0 HcmV?d00001 diff --git a/app/src/main/res/menu/view_email.xml b/app/src/main/res/menu/view_email.xml index 7272a78..8ab8694 100644 --- a/app/src/main/res/menu/view_email.xml +++ b/app/src/main/res/menu/view_email.xml @@ -8,4 +8,16 @@ android:title="@string/reply" i2pandroid:showAsAction="ifRoom"/> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 712eac6..f667749 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -102,11 +102,15 @@ Received: Status: Reply + Reply all + Forward Compose Subject Compose email Add at least one recipient. Email queued for sending + Fwd: + Fwd: Re: Re: