From de63b0dd9618f241991f91f868a157fca2021b51 Mon Sep 17 00:00:00 2001 From: Jake McGinty Date: Mon, 4 Aug 2014 13:13:47 -0700 Subject: [PATCH] make reminder a custom view, make push reminder // FREEBIE --- .../ic_push_registration_reminder.png | Bin 0 -> 2393 bytes .../ic_push_registration_reminder.png | Bin 0 -> 1827 bytes .../ic_push_registration_reminder.png | Bin 0 -> 2946 bytes .../ic_push_registration_reminder.png | Bin 0 -> 4100 bytes res/values/strings.xml | 2 + .../securesms/ConversationListFragment.java | 111 +++--------------- .../components/DefaultSmsReminder.java | 51 ++++++++ .../components/PushRegistrationReminder.java | 43 +++++++ .../securesms/components/Reminder.java | 49 ++++++++ .../securesms/components/ReminderView.java | 73 ++++++++++++ .../components/SystemSmsImportReminder.java | 51 ++++++++ .../securesms/util/TextSecurePreferences.java | 10 ++ 12 files changed, 293 insertions(+), 97 deletions(-) create mode 100644 res/drawable-hdpi/ic_push_registration_reminder.png create mode 100644 res/drawable-mdpi/ic_push_registration_reminder.png create mode 100644 res/drawable-xhdpi/ic_push_registration_reminder.png create mode 100644 res/drawable-xxhdpi/ic_push_registration_reminder.png create mode 100644 src/org/thoughtcrime/securesms/components/DefaultSmsReminder.java create mode 100644 src/org/thoughtcrime/securesms/components/PushRegistrationReminder.java create mode 100644 src/org/thoughtcrime/securesms/components/Reminder.java create mode 100644 src/org/thoughtcrime/securesms/components/ReminderView.java create mode 100644 src/org/thoughtcrime/securesms/components/SystemSmsImportReminder.java diff --git a/res/drawable-hdpi/ic_push_registration_reminder.png b/res/drawable-hdpi/ic_push_registration_reminder.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb00a4e5198ee1a4a85f58c3792b5586a7b8364 GIT binary patch literal 2393 zcmaJ@dpwlu79JA0RVw#r43){4F;`4ui@6B795kk=%;lRgn2VWV#-)-{E@`_aC3Om2 zD7Q#8ZAv8+9a}^y(#bVCyAZNFGnMxFqkX>L_kHiX)^9z}dfv6xA8(4Ux0|k(i53V1 z(skcT@>8sy%5Ryv;_u)cJE~ZWC1je!U%-|~=^_B+!V)k5use^=0sH_uD<-lTAb>zi zthfO*3C(L8o+;qL>B<tO)Rr^$uXhhBF;m5a(aO1Q}jIzyl<7u#6YM7vp74kgvRW#a`(~K)_!^B;ihw zZ=z^kzF?w21c0${v@O#Pi3HZBBm!}$KnN!KyDG4 zhpyWUT}K?v!=sP>8n7Os;V=+n^M} zcuFUn(1xo$Mowp2UeT4Sy=*^8L*LQuCp@Xon}3v9t6JuHi^fTy>e+C|Kr;zm+|{L2 zeDp3=OX$Nw_3MdF+?8XPktcO);-=p9o4luFMRpa3Fk6z&rK^vTD@gZl8pxNabFA29 zsy>OQV&hD9YZf*OD{dRXCUq-I5~F7?RE0UFEbLD6hm}~ZOHg0p=g3xB?ZOET?>cyR z8F{l7!KC{k-b~(zYfN3LbJjj5j`bqqtnanw@dOU@5(DX-U;GF|b@Bd>Yy#V_CnV7- z+XB7Qn@NKa`R~H!mqaYJZ|M+IjVjxy>{HzzZrhw;7H37?K1PG}VNKy(Mo{%Ny|`|Z z2UYD0E{vyXr?5S=x6y(89mNjgVdt}hsM}z0A@*?E_L0hr>TL^oP12x-RnC=jEz5n9 z+&tcJblNV&r955#@(ycErT%8`<=iiab)#ambj0?ei3xOY*^<#Oxt;j!^3ly&eG>+0 zV(F~`#@<0Bn8N+cS1}qnR*ly&9OM0p4NH75seT}aU)f9OyXZcB+3k7$$@w5NZ3CZcw)B9zbVGfj1I^6s0$}R-M}m2Vo^Q{EuYSR(nb+xtnYM40kB1HB z+{C|$I+^RXr3DsWZsCfI4jx8chX12&q|lB!xt_`y7(Elo?ET}PrRmROudEL)-8ox? zFHa~oHcYLVX(IFrGVeQ;MU_HgEX3#I(3?6vc6j$aAler58~!X(%^Ic}x9o`Jja&Tt zc2YZb$Z`AJ?qNgk(bKI>0{?o-S#_Z?Id`aMP0F>^FwjE$9G>=P|HWF&{>OG3zYIs;utebpqPRz3uWi!q z9cqFOsXfU_o?#TfCRGGo5?;s+TD4{rEL%-j(dBWcqn(|ckq*>NR>^%aFEYv3Z$VkV z=s%5y4rR2cyWdX?;}eT%-RD~THx0o~!uIFX(i(HCn{cRm>7P^^8c|XCJCFLdE$>*V zC->`E`5WfF>9ZC4G9YH{_4`W-@-%K@Chdb>-_36M=oaOv$r;-_^ZH{CK^5?Ox?Kk^>6r%`YVFNGq!alJQXe-TmHfN- z#)G64sd0q{)mzpkp&JIzqBmq3#lvA;E9$Xn*fWzkGxPRG0C@Fu&D^VivvTUjLTOgr zm*!Q=?*VZ|y;Zf(@;2rDo3HQA%ElManjvz*8&oMIWBaUl)-r;DPTWsPs8ZXQfwV4&&`9$z6DmXvYq;cPJ zPpao+$}{A#PW@GszFkJc>qFzGPt)03I|GM3Y6eiY<-TpR7mJP}U#QKZ{cWfNAKzTM zm6ju3c^-P;mp+Y&hl#W#oG(Ne+u*4OP>k9&2-4zcn>ie?BNd1>~F@wb8kIl&ie#xRbp}S6xFA F{|oBX@#_Ep literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_push_registration_reminder.png b/res/drawable-mdpi/ic_push_registration_reminder.png new file mode 100644 index 0000000000000000000000000000000000000000..7b98c77b45993b11484774a82382a22a1caf1ec0 GIT binary patch literal 1827 zcmaJ?X;c$e6b=$uwTczWCJqq+L9&qqGbUg{Kq3Yq1VK?`NCp@nnV5_wB0UHc0i_lf zR4T`^2&7_J>IQ-WDn*O?DJqE8r6RT}2#R7wJ3+wyD4p%SchC2I_r81YJChR}v~;?e ztr>wpm@W(ui1CrGe@%?=uY*r^Ek4*_ei2wG8jEQl6-?mC&=?pH%Aq(|3`4R_>o39_ z0>RJ;kwjn-qUE3zm6IVohOCtoBB;F9_pnn(a57<2>1CE<~N+Jam;A*)c2r3p_MMGGk@G%{7crE#E0^#4$~d;+b;#PH{M|5I2k z*`$OiVpxrCP)YH^#m>{aQi8rJ7{XAM1Vxj^vltwYVyHSERRX@DEWlL+NfCwKuwaxS z5`jX68iN#4SSa9B4Jnw!CK0_ez_4ns{^5{%9-;X)Y6`;}$ za#(?lb7h~oUXyb5%^+9eo&~T9*$B)0Rj3>o-86_y9t&eqy)mwA@>rOYaw&K)6n$y` zRqAmQ-aq>3MC0O%iPnb|c)zRg#xB0!8-kyge4&6R(RMv6hzyt=V%@eDt^BFHp`VDw!`bCD|FUsl(DyETXYLxk=_jL> zC(M?Mm#|IJJBo;ZWF+N%5!*~O$v}%{U>Q;UkwnLiXrJ5D-Gq6Tc1CmVd&j%f4%tL@ zPQPu+k6!unRqyoOz#YNI@@owdQyc=WtoG5V#R1&6j;&V}gzCHe9l{q8u6v8i-xmv2 zx4L-A3_fR#b(0Op7$H~7_qCW-ek*f~>bE*#AuGNYMClk<)(zyD#Kv_7_FNgfWCAfv ztw8zIu=Mb%D>mljd6;)k-L7>!mu_b2?!fU~f7-h6N#?69h(YEnWm`M* z#@2HTl*EsCI2g6W(eZ`0G|0Qd)f}?9>(L^p$sJ&7&MbY>blhUjY|MjTxNFggedZ>W zExA`xQ`1vArM1Tfb!R>6U`@01MPqC8(RU>GGbDTO#{>I%iRSfBIw4Z)K_Z+`J7Tj> z&}bM~|KtLb-Mz~BKt;Z;hM36NL2^hV+)Aa#dv*?4_V>bTdHt6lgVLf^*D38g6|3vo zkWx3ZM}@vq_E*%Km|2e07LFXu{JUm2B+2QJ{rlRN4_uZQTY8yE-bocF+8=T$y2sBN zVR2ZEf7|odVnNN6h2`1+azRkYCd}kj26~F7gpMzzhf0_ zWE7v0CBlN2N(;jle+ZHMdcsD9+&iDJ@Upz@y%g+9Xk6uX@#6~cepMV2-YhA*PIf20 zj-LDc$G1tR(7BJFK1$B_uQ-x@n30IoS>-jnzOkWGlWClyoOX0&r5#sswq#r4u_#@q1#A}*$h#ED+I>fH=jTv#ekstLA>rBrvTLdwuF8`f+~J=`afqz!NmXo literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_push_registration_reminder.png b/res/drawable-xhdpi/ic_push_registration_reminder.png new file mode 100644 index 0000000000000000000000000000000000000000..4efc673cf63899618fa87857819ed0438e71185d GIT binary patch literal 2946 zcmaJ@dpJ~U7pIV%Bcog+Z6mplnPD&^G|XTeBWfx>k}-Q|VlHL|GcLvCe!oY}sl(|) zF1Zv55y~YcP6?678DA$EqT81`XLPFb{qgnfXYaknL?7pXmau1+lY^;ysbr8J)<@kX zCAEGBjpWVsCc0xNOgfCb76aqaSrW9A)Gh}ei%bcja)CfpVaLH|DhOoq-tT0Gx;L8P- zWMhLtn7ugXFS#T;JLnNEmxVDmkBp3jMOwg^>|k>Q8jW7#KqAc~5oR1dgG=U_F*tf( z8E{k%g-v5|X-o#N#z+oihI8$pl1l$>fzJ9y%iw%DCdq-B^T;f71Ps2`($_#D@&AX? z>EEI`+`ZI)>iwU@91@>JHQ!6+FvHmt$>4(Y)>5%BPHZZf%Vd+7%+Rl==y`<6Wpa)% zS%A|%E5MLQrqCE`4x`TqA`wGiaJXa!g-XELK_wh88V$tY;TD!i8*3cG(gKe_;4K|3 zaX2SuXGaSx5`}ieqrPHsOiDPN%HV#*g8yLg-^H$pfzFa-#!=a{2rB5zX3~MrO=D=^ zuf_4Zd|$BO_iJ(bF4kO9jQQGV|7+A=T@wAQEx!p@viT-`Dnp`ownW&=r%WxRq&BP& za99#=eEv{$?S6{N;kOa{PhM9qOw%y3OX|-o&`G!k)jaRc$GOj5A$>A;Ij?KEZWf*+r(qRXT?qJ zV&9P1kXY4+BO`gxNY5(bF9JgnL={&mCCgJ44Q*d{R}%Mp+!*Yydl4m%#tk zMu;}+g@~4C?B;B(5F3!~1N*T_sTz2a&AURr>TBVws~M3e@o6W*2T zsKOw6FK$f~(Xo)kj~RTVkv(`IPqjBg`<9#ot3AD`8hcd-8j@PsoQhfxN(Qfj|DF#*@ZU zhv@t3iU-NCz^u0>z0D+z_%8T;51jzpDvzja_tS)dN5zV53d4lQW2nWajn={s_e7(w z2O_D%k!G$Y^x!=*B2uCr>;}@shvO-P59cF21qOpg=Q= z66i3$*bEyu*{4gc9erA7B2?b7zG1u17$!@wT1ubacwu&7GrOrcc~_&ohhYAJ)tiKE zNzZ=QaXxL_QUP6>CXU}eQ#;0LElCam#QZ8k4r=^%O?+Y3>m-ic&DRkE9@HLg zjF8RPsiioFiE34Ie>xo@h`HR>je-aq0*bRuV*JEvZf-jW^6MVI52uG5EDo`Ga;i#( zd%0uodT!>Qh|^UWtVGRXTQ#kFH#4eVEMJd(DTB3tVKOet;*G=oq))8(Yl@yB9?e^? zfXJDo!Yaqu#NRm?Y#WC&ovB6EmKzWjmNj%e}js&AR2|D8P@CTtDgbFmGYwpyJ$6#6F|e&5N-^4*f7+IIKS_?h)2K?QQ36TIzEP3a7W$rHnni#WbVbP#?0Z0@Vy| zn5491cVBKpyi^UjB@n)xVb+ydA9PMKgrCUUn=Fx~N?%&>#`wY^^rl%@3*gp4q5`48%`?%BMAeX2P5XWkE-o!IA%UW3+4HP(}Usq zl^sQb7060jiEel3&fYD8iE|?}p{1}-GWBI=G&U>eIrodO#k(D0~lx4W!$KAL}5 zv9=?j|6;smRNU>+)ai%w^nO3}``x}B^Eskux8m~ya)FGQt2eYS=8PqwGkx;0`=T%X zX4l-d#1_4hvX<6OcE111F`t{ldlM(g?ZF=PgJc(LCpF`wS{i7*{m_=Kz6OvkE_j*1 zsOmk0J>c4=L_Ky;Y+Yh~vEkLkgi5DEp-y`YdKn#7UT-AR-P?^*i$JNT zSGN}k=xNzpH&e=mI|x|e?!#O7Gvu-}`k^k(4e83JH*-Octi^{;aaN#yitdFImb%>w z?Rh*;RAN&$$syHz8>GF=xl=2gs&fLO2*M22M@lDT$~xcXy>_ti92I~H`q2Ja?d)|n z(n@oz5{nq!lShA0BD`JLai|TGBv5H7x%O<>Y44EdKzB=VaF46XKy&$)v9nCUjy-Q; z^H-B?3RsjEuP(mYp92c-wF>!Hi?3vIR_v#vU#mPbxGYPM>+V=LEDKh14BVd#$32?V zTi)$im;0ljwR$oUnlgD`?zh&&cSIiEnXk9x`-gsNA-qDF?_8kq+`%Ee(hhvx_@Lo zf400>eTkH_7=JGLMX#~bVqR!w4#aI{q!JjKjw!i9PHG{jI+FjrOLd2Zntw22UDQvY zZumYM8Fv#yVuzP(svP`ko#}o56gcDn@wXAiB>*jlirx=NR4DuVbE_=-NjX3&$^XFu T{Nt?7+FvmN?}4jv3=sSU-Jtbp literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_push_registration_reminder.png b/res/drawable-xxhdpi/ic_push_registration_reminder.png new file mode 100644 index 0000000000000000000000000000000000000000..7d85e0c15d25fa83a5077dad058c382820c669f7 GIT binary patch literal 4100 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 E4{fd%NB{r; literal 0 HcmV?d00001 diff --git a/res/values/strings.xml b/res/values/strings.xml index cced6800e6..20e3c48a18 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -861,6 +861,8 @@ TextSecure is not currently your default SMS app. Import system SMS? TextSecure can copy your phone\'s SMS messages into its encrypted database. + Enable TextSecure messages? + Instant delivery, stronger privacy, and no SMS fees. diff --git a/src/org/thoughtcrime/securesms/ConversationListFragment.java b/src/org/thoughtcrime/securesms/ConversationListFragment.java index 887f174333..20a15c77ba 100644 --- a/src/org/thoughtcrime/securesms/ConversationListFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationListFragment.java @@ -21,28 +21,19 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; -import android.content.Intent; import android.database.Cursor; import android.os.AsyncTask; -import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; -import android.provider.Telephony; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.text.TextUtils; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; -import android.widget.Button; import android.widget.CursorAdapter; -import android.widget.ImageButton; -import android.widget.ImageView; import android.widget.ListView; -import android.widget.TextView; import com.actionbarsherlock.app.SherlockListFragment; import com.actionbarsherlock.view.ActionMode; @@ -51,15 +42,17 @@ import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.widget.SearchView; +import org.thoughtcrime.securesms.components.DefaultSmsReminder; +import org.thoughtcrime.securesms.components.PushRegistrationReminder; +import org.thoughtcrime.securesms.components.ReminderView; +import org.thoughtcrime.securesms.components.SystemSmsImportReminder; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.loaders.ConversationListLoader; import org.thoughtcrime.securesms.notifications.MessageNotifier; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.service.ApplicationMigrationService; import org.thoughtcrime.securesms.util.Dialogs; -import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.textsecure.crypto.MasterSecret; -import org.thoughtcrime.securesms.util.Util; import java.util.Set; @@ -71,13 +64,13 @@ public class ConversationListFragment extends SherlockListFragment private ConversationSelectedListener listener; private MasterSecret masterSecret; private ActionMode actionMode; - private View reminderView; - private String queryFilter = ""; + private ReminderView reminderView; + private String queryFilter = ""; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { final View view = inflater.inflate(R.layout.conversation_list_fragment, container, false); - reminderView = LayoutInflater.from(getActivity()).inflate(R.layout.reminder_header, null); + reminderView = new ReminderView(getActivity()); return view; } @@ -203,17 +196,14 @@ public class ConversationListFragment extends SherlockListFragment } private void initializeReminders() { - final boolean isDefault = Util.isDefaultSmsProvider(getActivity()); - if (isDefault) { - TextSecurePreferences.setPromptedDefaultSmsProvider(getActivity(), false); - } - - if (!isDefault && !TextSecurePreferences.hasPromptedDefaultSmsProvider(getActivity())) { - showDefaultSmsReminder(); - } else if (isDefault && !ApplicationMigrationService.isDatabaseImported(getActivity())) { - showSystemSmsImportReminder(); + if (DefaultSmsReminder.isEligible(getActivity())) { + reminderView.showReminder(new DefaultSmsReminder(getActivity())); + } else if (SystemSmsImportReminder.isEligible(getActivity())) { + reminderView.showReminder(new SystemSmsImportReminder(getActivity(), masterSecret)); + } else if (PushRegistrationReminder.isEligible(getActivity())) { + reminderView.showReminder(new PushRegistrationReminder(getActivity(), masterSecret)); } else { - reminderView.findViewById(R.id.container).setVisibility(View.GONE); + reminderView.hide(); } } @@ -339,79 +329,6 @@ public class ConversationListFragment extends SherlockListFragment actionMode = null; } - @TargetApi(VERSION_CODES.KITKAT) - private void showDefaultSmsReminder() { - final ViewGroup container = (ViewGroup) reminderView.findViewById(R.id.container); - - setReminderData(R.drawable.sms_selection_icon, - R.string.reminder_header_sms_default_title, - R.string.reminder_header_sms_default_text, - new OnClickListener() { - @Override - public void onClick(View v) { - TextSecurePreferences.setPromptedDefaultSmsProvider(getActivity(), true); - Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); - intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getActivity().getPackageName()); - startActivity(intent); - } - }, - new OnClickListener() { - @Override - public void onClick(View v) { - TextSecurePreferences.setPromptedDefaultSmsProvider(getActivity(), true); - container.setVisibility(View.GONE); - } - }); - container.setVisibility(View.VISIBLE); - } - - private void showSystemSmsImportReminder() { - final ViewGroup container = (ViewGroup) reminderView.findViewById(R.id.container); - - setReminderData(R.drawable.sms_system_import_icon, - R.string.reminder_header_sms_import_title, - R.string.reminder_header_sms_import_text, - new OnClickListener() { - @Override - public void onClick(View v) { - Intent intent = new Intent(getActivity(), ApplicationMigrationService.class); - intent.setAction(ApplicationMigrationService.MIGRATE_DATABASE); - intent.putExtra("master_secret", masterSecret); - getActivity().startService(intent); - - Intent nextIntent = new Intent(getActivity(), ConversationListActivity.class); - intent.putExtra("master_secret", masterSecret); - - Intent activityIntent = new Intent(getActivity(), DatabaseMigrationActivity.class); - activityIntent.putExtra("master_secret", masterSecret); - activityIntent.putExtra("next_intent", nextIntent); - getActivity().startActivity(activityIntent); - } - }, - new OnClickListener() { - @Override - public void onClick(View v) { - ApplicationMigrationService.setDatabaseImported(getActivity()); - container.setVisibility(View.GONE); - } - }); - container.setVisibility(View.VISIBLE); - } - - private void setReminderData(int iconResId, int titleResId, int textResId, OnClickListener okListener, OnClickListener cancelListener) { - final ImageButton cancel = (ImageButton) reminderView.findViewById(R.id.cancel); - final Button ok = (Button ) reminderView.findViewById(R.id.ok); - final TextView title = (TextView ) reminderView.findViewById(R.id.reminder_title); - final TextView text = (TextView ) reminderView.findViewById(R.id.reminder_text); - final ImageView icon = (ImageView ) reminderView.findViewById(R.id.icon); - - icon.setImageResource(iconResId); - title.setText(titleResId); - text.setText(textResId); - ok.setOnClickListener(okListener); - cancel.setOnClickListener(cancelListener); - } - } diff --git a/src/org/thoughtcrime/securesms/components/DefaultSmsReminder.java b/src/org/thoughtcrime/securesms/components/DefaultSmsReminder.java new file mode 100644 index 0000000000..6a2a0ea8ba --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/DefaultSmsReminder.java @@ -0,0 +1,51 @@ +package org.thoughtcrime.securesms.components; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Build.VERSION_CODES; +import android.provider.Telephony; +import android.view.View; +import android.view.View.OnClickListener; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.thoughtcrime.securesms.util.Util; + +public class DefaultSmsReminder extends Reminder { + + @TargetApi(VERSION_CODES.KITKAT) + public DefaultSmsReminder(final Context context) { + super(R.drawable.sms_selection_icon, + R.string.reminder_header_sms_default_title, + R.string.reminder_header_sms_default_text); + + final OnClickListener okListener = new OnClickListener() { + @Override + public void onClick(View v) { + TextSecurePreferences.setPromptedDefaultSmsProvider(context, true); + Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); + intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName()); + context.startActivity(intent); + } + }; + final OnClickListener cancelListener = new OnClickListener() { + @Override + public void onClick(View v) { + TextSecurePreferences.setPromptedDefaultSmsProvider(context, true); + } + }; + setOkListener(okListener); + setCancelListener(cancelListener); + } + + public static boolean isEligible(Context context) { + final boolean isDefault = Util.isDefaultSmsProvider(context); + if (isDefault) { + TextSecurePreferences.setPromptedDefaultSmsProvider(context, false); + } + + return !isDefault && !TextSecurePreferences.hasPromptedDefaultSmsProvider(context); + } +} diff --git a/src/org/thoughtcrime/securesms/components/PushRegistrationReminder.java b/src/org/thoughtcrime/securesms/components/PushRegistrationReminder.java new file mode 100644 index 0000000000..910e545b27 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/PushRegistrationReminder.java @@ -0,0 +1,43 @@ +package org.thoughtcrime.securesms.components; + +import android.content.Context; +import android.content.Intent; +import android.view.View; +import android.view.View.OnClickListener; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.RegistrationActivity; +import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.whispersystems.textsecure.crypto.MasterSecret; + +public class PushRegistrationReminder extends Reminder { + public static final long REMINDER_INTERVAL_MS = 3 * 24 * 60 * 60 * 1000; + + public PushRegistrationReminder(final Context context, final MasterSecret masterSecret) { + super(R.drawable.ic_push_registration_reminder, + R.string.reminder_header_push_title, + R.string.reminder_header_push_text); + + final OnClickListener okListener = new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(context, RegistrationActivity.class); + intent.putExtra("master_secret", masterSecret); + context.startActivity(intent); + } + }; + final OnClickListener cancelListener = new OnClickListener() { + @Override + public void onClick(View v) { + TextSecurePreferences.setLastPushReminderTime(context, System.currentTimeMillis()); + } + }; + setOkListener(okListener); + setCancelListener(cancelListener); + } + + public static boolean isEligible(Context context) { + return !TextSecurePreferences.isPushRegistered(context) && + (TextSecurePreferences.getLastPushReminderTime(context) + REMINDER_INTERVAL_MS < System.currentTimeMillis()); + } +} diff --git a/src/org/thoughtcrime/securesms/components/Reminder.java b/src/org/thoughtcrime/securesms/components/Reminder.java new file mode 100644 index 0000000000..6334675546 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/Reminder.java @@ -0,0 +1,49 @@ +package org.thoughtcrime.securesms.components; + +import android.content.Context; +import android.view.View.OnClickListener; +import android.view.ViewGroup; + +import org.thoughtcrime.securesms.R; + +public abstract class Reminder { + private int iconResId; + private int titleResId; + private int textResId; + private OnClickListener okListener; + private OnClickListener cancelListener; + + public Reminder(int iconResId, int titleResId, int textResId) { + this.iconResId = iconResId; + this.titleResId = titleResId; + this.textResId = textResId; + } + + public int getIconResId() { + return iconResId; + } + + public int getTitleResId() { + return titleResId; + } + + public int getTextResId() { + return textResId; + } + + public OnClickListener getOkListener() { + return okListener; + } + + public OnClickListener getCancelListener() { + return cancelListener; + } + + public void setOkListener(OnClickListener okListener) { + this.okListener = okListener; + } + + public void setCancelListener(OnClickListener cancelListener) { + this.cancelListener = cancelListener; + } +} diff --git a/src/org/thoughtcrime/securesms/components/ReminderView.java b/src/org/thoughtcrime/securesms/components/ReminderView.java new file mode 100644 index 0000000000..b684814eb4 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/ReminderView.java @@ -0,0 +1,73 @@ +package org.thoughtcrime.securesms.components; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build.VERSION_CODES; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.thoughtcrime.securesms.R; + +/** + * View to display actionable reminders to the user + */ +public class ReminderView extends LinearLayout { + private ViewGroup container; + private ImageButton cancel; + private Button ok; + private TextView title; + private TextView text; + private ImageView icon; + + public ReminderView(Context context) { + super(context); + initialize(); + } + + public ReminderView(Context context, AttributeSet attrs) { + super(context, attrs); + initialize(); + } + + @TargetApi(VERSION_CODES.HONEYCOMB) + public ReminderView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initialize(); + } + + private void initialize() { + LayoutInflater.from(getContext()).inflate(R.layout.reminder_header, this, true); + container = (ViewGroup ) findViewById(R.id.container); + cancel = (ImageButton) findViewById(R.id.cancel); + ok = (Button ) findViewById(R.id.ok); + title = (TextView ) findViewById(R.id.reminder_title); + text = (TextView ) findViewById(R.id.reminder_text); + icon = (ImageView ) findViewById(R.id.icon); + } + + public void showReminder(final Reminder reminder) { + icon.setImageResource(reminder.getIconResId()); + title.setText(reminder.getTitleResId()); + text.setText(reminder.getTextResId()); + ok.setOnClickListener(reminder.getOkListener()); + cancel.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + hide(); + if (reminder.getCancelListener() != null) reminder.getCancelListener().onClick(v); + } + }); + container.setVisibility(View.VISIBLE); + } + + public void hide() { + container.setVisibility(View.GONE); + } +} diff --git a/src/org/thoughtcrime/securesms/components/SystemSmsImportReminder.java b/src/org/thoughtcrime/securesms/components/SystemSmsImportReminder.java new file mode 100644 index 0000000000..6badeabec4 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/SystemSmsImportReminder.java @@ -0,0 +1,51 @@ +package org.thoughtcrime.securesms.components; + +import android.content.Context; +import android.content.Intent; +import android.view.View; +import android.view.View.OnClickListener; + +import org.thoughtcrime.securesms.ConversationListActivity; +import org.thoughtcrime.securesms.DatabaseMigrationActivity; +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.service.ApplicationMigrationService; +import org.whispersystems.textsecure.crypto.MasterSecret; + +public class SystemSmsImportReminder extends Reminder { + + public SystemSmsImportReminder(final Context context, final MasterSecret masterSecret) { + super(R.drawable.sms_system_import_icon, + R.string.reminder_header_sms_import_title, + R.string.reminder_header_sms_import_text); + + final OnClickListener okListener = new OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(context, ApplicationMigrationService.class); + intent.setAction(ApplicationMigrationService.MIGRATE_DATABASE); + intent.putExtra("master_secret", masterSecret); + context.startService(intent); + + Intent nextIntent = new Intent(context, ConversationListActivity.class); + intent.putExtra("master_secret", masterSecret); + + Intent activityIntent = new Intent(context, DatabaseMigrationActivity.class); + activityIntent.putExtra("master_secret", masterSecret); + activityIntent.putExtra("next_intent", nextIntent); + context.startActivity(activityIntent); + } + }; + final OnClickListener cancelListener = new OnClickListener() { + @Override + public void onClick(View v) { + ApplicationMigrationService.setDatabaseImported(context); + } + }; + setOkListener(okListener); + setCancelListener(cancelListener); + } + + public static boolean isEligible(Context context) { + return !ApplicationMigrationService.isDatabaseImported(context); + } +} diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java index 65d08e2bba..b67874ee36 100644 --- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -55,6 +55,8 @@ public class TextSecurePreferences { private static final String GCM_REGISTRATION_ID_PREF = "pref_gcm_registration_id"; private static final String GCM_REGISTRATION_ID_VERSION_PREF = "pref_gcm_registration_id_version"; + private static final String PUSH_REGISTRATION_REMINDER_PREF = "pref_push_registration_reminder"; + public static void setGcmRegistrationId(Context context, String registrationId) { setStringPreference(context, GCM_REGISTRATION_ID_PREF, registrationId); setIntegerPrefrence(context, GCM_REGISTRATION_ID_VERSION_PREF, Util.getCurrentApkReleaseVersion(context)); @@ -305,6 +307,14 @@ public class TextSecurePreferences { return Integer.parseInt(getStringPreference(context, THREAD_TRIM_LENGTH, "500")); } + public static long getLastPushReminderTime(Context context) { + return getLongPreference(context, PUSH_REGISTRATION_REMINDER_PREF, 0L); + } + + public static void setLastPushReminderTime(Context context, long time) { + setLongPreference(context, PUSH_REGISTRATION_REMINDER_PREF, System.currentTimeMillis()); + } + private static void setBooleanPreference(Context context, String key, boolean value) { PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(key, value).apply(); }