Skip to content

Commit de63b0d

Browse files
committed
make reminder a custom view, make push reminder
// FREEBIE
1 parent eb4ac40 commit de63b0d

12 files changed

Lines changed: 293 additions & 97 deletions
2.34 KB
Loading
1.78 KB
Loading
2.88 KB
Loading
4 KB
Loading

res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,8 @@
861861
<string name="reminder_header_sms_default_text">TextSecure is not currently your default SMS app.</string>
862862
<string name="reminder_header_sms_import_title">Import system SMS?</string>
863863
<string name="reminder_header_sms_import_text">TextSecure can copy your phone\'s SMS messages into its encrypted database.</string>
864+
<string name="reminder_header_push_title">Enable TextSecure messages?</string>
865+
<string name="reminder_header_push_text">Instant delivery, stronger privacy, and no SMS fees.</string>
864866
<!-- EOF -->
865867

866868
</resources>

src/org/thoughtcrime/securesms/ConversationListFragment.java

Lines changed: 14 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,19 @@
2121
import android.app.AlertDialog;
2222
import android.app.ProgressDialog;
2323
import android.content.DialogInterface;
24-
import android.content.Intent;
2524
import android.database.Cursor;
2625
import android.os.AsyncTask;
27-
import android.os.Build;
2826
import android.os.Build.VERSION_CODES;
2927
import android.os.Bundle;
30-
import android.provider.Telephony;
3128
import android.support.v4.app.LoaderManager;
3229
import android.support.v4.content.Loader;
3330
import android.text.TextUtils;
34-
import android.util.Log;
3531
import android.view.LayoutInflater;
3632
import android.view.View;
37-
import android.view.View.OnClickListener;
3833
import android.view.ViewGroup;
3934
import android.widget.AdapterView;
40-
import android.widget.Button;
4135
import android.widget.CursorAdapter;
42-
import android.widget.ImageButton;
43-
import android.widget.ImageView;
4436
import android.widget.ListView;
45-
import android.widget.TextView;
4637

4738
import com.actionbarsherlock.app.SherlockListFragment;
4839
import com.actionbarsherlock.view.ActionMode;
@@ -51,15 +42,17 @@
5142
import com.actionbarsherlock.view.MenuItem;
5243
import com.actionbarsherlock.widget.SearchView;
5344

45+
import org.thoughtcrime.securesms.components.DefaultSmsReminder;
46+
import org.thoughtcrime.securesms.components.PushRegistrationReminder;
47+
import org.thoughtcrime.securesms.components.ReminderView;
48+
import org.thoughtcrime.securesms.components.SystemSmsImportReminder;
5449
import org.thoughtcrime.securesms.database.DatabaseFactory;
5550
import org.thoughtcrime.securesms.database.loaders.ConversationListLoader;
5651
import org.thoughtcrime.securesms.notifications.MessageNotifier;
5752
import org.thoughtcrime.securesms.recipients.Recipients;
5853
import org.thoughtcrime.securesms.service.ApplicationMigrationService;
5954
import org.thoughtcrime.securesms.util.Dialogs;
60-
import org.thoughtcrime.securesms.util.TextSecurePreferences;
6155
import org.whispersystems.textsecure.crypto.MasterSecret;
62-
import org.thoughtcrime.securesms.util.Util;
6356

6457
import java.util.Set;
6558

@@ -71,13 +64,13 @@ public class ConversationListFragment extends SherlockListFragment
7164
private ConversationSelectedListener listener;
7265
private MasterSecret masterSecret;
7366
private ActionMode actionMode;
74-
private View reminderView;
75-
private String queryFilter = "";
67+
private ReminderView reminderView;
68+
private String queryFilter = "";
7669

7770
@Override
7871
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
7972
final View view = inflater.inflate(R.layout.conversation_list_fragment, container, false);
80-
reminderView = LayoutInflater.from(getActivity()).inflate(R.layout.reminder_header, null);
73+
reminderView = new ReminderView(getActivity());
8174
return view;
8275
}
8376

@@ -203,17 +196,14 @@ public boolean onItemLongClick(AdapterView<?> arg0, View v, int position, long i
203196
}
204197

205198
private void initializeReminders() {
206-
final boolean isDefault = Util.isDefaultSmsProvider(getActivity());
207-
if (isDefault) {
208-
TextSecurePreferences.setPromptedDefaultSmsProvider(getActivity(), false);
209-
}
210-
211-
if (!isDefault && !TextSecurePreferences.hasPromptedDefaultSmsProvider(getActivity())) {
212-
showDefaultSmsReminder();
213-
} else if (isDefault && !ApplicationMigrationService.isDatabaseImported(getActivity())) {
214-
showSystemSmsImportReminder();
199+
if (DefaultSmsReminder.isEligible(getActivity())) {
200+
reminderView.showReminder(new DefaultSmsReminder(getActivity()));
201+
} else if (SystemSmsImportReminder.isEligible(getActivity())) {
202+
reminderView.showReminder(new SystemSmsImportReminder(getActivity(), masterSecret));
203+
} else if (PushRegistrationReminder.isEligible(getActivity())) {
204+
reminderView.showReminder(new PushRegistrationReminder(getActivity(), masterSecret));
215205
} else {
216-
reminderView.findViewById(R.id.container).setVisibility(View.GONE);
206+
reminderView.hide();
217207
}
218208
}
219209

@@ -339,79 +329,6 @@ public void onDestroyActionMode(ActionMode mode) {
339329
actionMode = null;
340330
}
341331

342-
@TargetApi(VERSION_CODES.KITKAT)
343-
private void showDefaultSmsReminder() {
344-
final ViewGroup container = (ViewGroup) reminderView.findViewById(R.id.container);
345-
346-
setReminderData(R.drawable.sms_selection_icon,
347-
R.string.reminder_header_sms_default_title,
348-
R.string.reminder_header_sms_default_text,
349-
new OnClickListener() {
350-
@Override
351-
public void onClick(View v) {
352-
TextSecurePreferences.setPromptedDefaultSmsProvider(getActivity(), true);
353-
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
354-
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getActivity().getPackageName());
355-
startActivity(intent);
356-
}
357-
},
358-
new OnClickListener() {
359-
@Override
360-
public void onClick(View v) {
361-
TextSecurePreferences.setPromptedDefaultSmsProvider(getActivity(), true);
362-
container.setVisibility(View.GONE);
363-
}
364-
});
365-
container.setVisibility(View.VISIBLE);
366-
}
367-
368-
private void showSystemSmsImportReminder() {
369-
final ViewGroup container = (ViewGroup) reminderView.findViewById(R.id.container);
370-
371-
setReminderData(R.drawable.sms_system_import_icon,
372-
R.string.reminder_header_sms_import_title,
373-
R.string.reminder_header_sms_import_text,
374-
new OnClickListener() {
375-
@Override
376-
public void onClick(View v) {
377-
Intent intent = new Intent(getActivity(), ApplicationMigrationService.class);
378-
intent.setAction(ApplicationMigrationService.MIGRATE_DATABASE);
379-
intent.putExtra("master_secret", masterSecret);
380-
getActivity().startService(intent);
381-
382-
Intent nextIntent = new Intent(getActivity(), ConversationListActivity.class);
383-
intent.putExtra("master_secret", masterSecret);
384-
385-
Intent activityIntent = new Intent(getActivity(), DatabaseMigrationActivity.class);
386-
activityIntent.putExtra("master_secret", masterSecret);
387-
activityIntent.putExtra("next_intent", nextIntent);
388-
getActivity().startActivity(activityIntent);
389-
}
390-
},
391-
new OnClickListener() {
392-
@Override
393-
public void onClick(View v) {
394-
ApplicationMigrationService.setDatabaseImported(getActivity());
395-
container.setVisibility(View.GONE);
396-
}
397-
});
398-
container.setVisibility(View.VISIBLE);
399-
}
400-
401-
private void setReminderData(int iconResId, int titleResId, int textResId, OnClickListener okListener, OnClickListener cancelListener) {
402-
final ImageButton cancel = (ImageButton) reminderView.findViewById(R.id.cancel);
403-
final Button ok = (Button ) reminderView.findViewById(R.id.ok);
404-
final TextView title = (TextView ) reminderView.findViewById(R.id.reminder_title);
405-
final TextView text = (TextView ) reminderView.findViewById(R.id.reminder_text);
406-
final ImageView icon = (ImageView ) reminderView.findViewById(R.id.icon);
407-
408-
icon.setImageResource(iconResId);
409-
title.setText(titleResId);
410-
text.setText(textResId);
411-
ok.setOnClickListener(okListener);
412-
cancel.setOnClickListener(cancelListener);
413-
}
414-
415332
}
416333

417334

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.thoughtcrime.securesms.components;
2+
3+
import android.annotation.TargetApi;
4+
import android.content.Context;
5+
import android.content.Intent;
6+
import android.os.Build;
7+
import android.os.Build.VERSION_CODES;
8+
import android.provider.Telephony;
9+
import android.view.View;
10+
import android.view.View.OnClickListener;
11+
12+
import org.thoughtcrime.securesms.R;
13+
import org.thoughtcrime.securesms.util.TextSecurePreferences;
14+
import org.thoughtcrime.securesms.util.Util;
15+
16+
public class DefaultSmsReminder extends Reminder {
17+
18+
@TargetApi(VERSION_CODES.KITKAT)
19+
public DefaultSmsReminder(final Context context) {
20+
super(R.drawable.sms_selection_icon,
21+
R.string.reminder_header_sms_default_title,
22+
R.string.reminder_header_sms_default_text);
23+
24+
final OnClickListener okListener = new OnClickListener() {
25+
@Override
26+
public void onClick(View v) {
27+
TextSecurePreferences.setPromptedDefaultSmsProvider(context, true);
28+
Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
29+
intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
30+
context.startActivity(intent);
31+
}
32+
};
33+
final OnClickListener cancelListener = new OnClickListener() {
34+
@Override
35+
public void onClick(View v) {
36+
TextSecurePreferences.setPromptedDefaultSmsProvider(context, true);
37+
}
38+
};
39+
setOkListener(okListener);
40+
setCancelListener(cancelListener);
41+
}
42+
43+
public static boolean isEligible(Context context) {
44+
final boolean isDefault = Util.isDefaultSmsProvider(context);
45+
if (isDefault) {
46+
TextSecurePreferences.setPromptedDefaultSmsProvider(context, false);
47+
}
48+
49+
return !isDefault && !TextSecurePreferences.hasPromptedDefaultSmsProvider(context);
50+
}
51+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.thoughtcrime.securesms.components;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.view.View;
6+
import android.view.View.OnClickListener;
7+
8+
import org.thoughtcrime.securesms.R;
9+
import org.thoughtcrime.securesms.RegistrationActivity;
10+
import org.thoughtcrime.securesms.util.TextSecurePreferences;
11+
import org.whispersystems.textsecure.crypto.MasterSecret;
12+
13+
public class PushRegistrationReminder extends Reminder {
14+
public static final long REMINDER_INTERVAL_MS = 3 * 24 * 60 * 60 * 1000;
15+
16+
public PushRegistrationReminder(final Context context, final MasterSecret masterSecret) {
17+
super(R.drawable.ic_push_registration_reminder,
18+
R.string.reminder_header_push_title,
19+
R.string.reminder_header_push_text);
20+
21+
final OnClickListener okListener = new OnClickListener() {
22+
@Override
23+
public void onClick(View v) {
24+
Intent intent = new Intent(context, RegistrationActivity.class);
25+
intent.putExtra("master_secret", masterSecret);
26+
context.startActivity(intent);
27+
}
28+
};
29+
final OnClickListener cancelListener = new OnClickListener() {
30+
@Override
31+
public void onClick(View v) {
32+
TextSecurePreferences.setLastPushReminderTime(context, System.currentTimeMillis());
33+
}
34+
};
35+
setOkListener(okListener);
36+
setCancelListener(cancelListener);
37+
}
38+
39+
public static boolean isEligible(Context context) {
40+
return !TextSecurePreferences.isPushRegistered(context) &&
41+
(TextSecurePreferences.getLastPushReminderTime(context) + REMINDER_INTERVAL_MS < System.currentTimeMillis());
42+
}
43+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.thoughtcrime.securesms.components;
2+
3+
import android.content.Context;
4+
import android.view.View.OnClickListener;
5+
import android.view.ViewGroup;
6+
7+
import org.thoughtcrime.securesms.R;
8+
9+
public abstract class Reminder {
10+
private int iconResId;
11+
private int titleResId;
12+
private int textResId;
13+
private OnClickListener okListener;
14+
private OnClickListener cancelListener;
15+
16+
public Reminder(int iconResId, int titleResId, int textResId) {
17+
this.iconResId = iconResId;
18+
this.titleResId = titleResId;
19+
this.textResId = textResId;
20+
}
21+
22+
public int getIconResId() {
23+
return iconResId;
24+
}
25+
26+
public int getTitleResId() {
27+
return titleResId;
28+
}
29+
30+
public int getTextResId() {
31+
return textResId;
32+
}
33+
34+
public OnClickListener getOkListener() {
35+
return okListener;
36+
}
37+
38+
public OnClickListener getCancelListener() {
39+
return cancelListener;
40+
}
41+
42+
public void setOkListener(OnClickListener okListener) {
43+
this.okListener = okListener;
44+
}
45+
46+
public void setCancelListener(OnClickListener cancelListener) {
47+
this.cancelListener = cancelListener;
48+
}
49+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.thoughtcrime.securesms.components;
2+
3+
import android.annotation.TargetApi;
4+
import android.content.Context;
5+
import android.os.Build.VERSION_CODES;
6+
import android.util.AttributeSet;
7+
import android.view.LayoutInflater;
8+
import android.view.View;
9+
import android.view.ViewGroup;
10+
import android.widget.Button;
11+
import android.widget.ImageButton;
12+
import android.widget.ImageView;
13+
import android.widget.LinearLayout;
14+
import android.widget.TextView;
15+
16+
import org.thoughtcrime.securesms.R;
17+
18+
/**
19+
* View to display actionable reminders to the user
20+
*/
21+
public class ReminderView extends LinearLayout {
22+
private ViewGroup container;
23+
private ImageButton cancel;
24+
private Button ok;
25+
private TextView title;
26+
private TextView text;
27+
private ImageView icon;
28+
29+
public ReminderView(Context context) {
30+
super(context);
31+
initialize();
32+
}
33+
34+
public ReminderView(Context context, AttributeSet attrs) {
35+
super(context, attrs);
36+
initialize();
37+
}
38+
39+
@TargetApi(VERSION_CODES.HONEYCOMB)
40+
public ReminderView(Context context, AttributeSet attrs, int defStyleAttr) {
41+
super(context, attrs, defStyleAttr);
42+
initialize();
43+
}
44+
45+
private void initialize() {
46+
LayoutInflater.from(getContext()).inflate(R.layout.reminder_header, this, true);
47+
container = (ViewGroup ) findViewById(R.id.container);
48+
cancel = (ImageButton) findViewById(R.id.cancel);
49+
ok = (Button ) findViewById(R.id.ok);
50+
title = (TextView ) findViewById(R.id.reminder_title);
51+
text = (TextView ) findViewById(R.id.reminder_text);
52+
icon = (ImageView ) findViewById(R.id.icon);
53+
}
54+
55+
public void showReminder(final Reminder reminder) {
56+
icon.setImageResource(reminder.getIconResId());
57+
title.setText(reminder.getTitleResId());
58+
text.setText(reminder.getTextResId());
59+
ok.setOnClickListener(reminder.getOkListener());
60+
cancel.setOnClickListener(new OnClickListener() {
61+
@Override
62+
public void onClick(View v) {
63+
hide();
64+
if (reminder.getCancelListener() != null) reminder.getCancelListener().onClick(v);
65+
}
66+
});
67+
container.setVisibility(View.VISIBLE);
68+
}
69+
70+
public void hide() {
71+
container.setVisibility(View.GONE);
72+
}
73+
}

0 commit comments

Comments
 (0)