Skip to content

Commit 3d41b68

Browse files
authored
Add custom icon preference for sustainers (#1645)
* Removed all sustainer views and related code hooks. Left the preferences methods for testing. * Fix import. * Add sustainer icon preference, and use activity-alias to swap out the icon when enabled. * Whitespace cleanup. * Added IntentUtils and functions to determine the proper main intent, to fix a crash. * Update to require API 28 to show the sustainer icon setting.
1 parent 555372e commit 3d41b68

15 files changed

+176
-18
lines changed

Simplenote/src/main/AndroidManifest.xml

+35-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
</activity>
4242

4343
<activity
44-
android:name="com.automattic.simplenote.NotesActivity"
44+
android:name=".NotesActivity"
4545
android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"
4646
android:label="@string/app_launcher_name"
4747
android:resizeableActivity="true"
@@ -93,6 +93,40 @@
9393

9494
</activity>
9595

96+
<activity-alias android:label="@string/app_name"
97+
android:enabled="false"
98+
android:exported="true"
99+
android:icon="@mipmap/ic_launcher_green"
100+
android:name=".NotesActivitySustainerAlias"
101+
android:targetActivity=".NotesActivity">
102+
<intent-filter>
103+
<action android:name="android.intent.action.MAIN" />
104+
<category android:name="android.intent.category.LAUNCHER" />
105+
</intent-filter>
106+
107+
<intent-filter>
108+
<action android:name="android.intent.action.SEND" />
109+
<action android:name="com.google.android.gm.action.AUTO_SEND" />
110+
<action android:name="com.google.android.voicesearch.action.AUTO_SEND" />
111+
<action android:name="com.automattic.simplenote.NEW_NOTE" />
112+
<category android:name="android.intent.category.DEFAULT" />
113+
<category android:name="com.google.android.voicesearch.SELF_NOTE" />
114+
<data android:mimeType="text/*" />
115+
</intent-filter>
116+
117+
<intent-filter
118+
android:autoVerify="true">
119+
<action android:name="android.intent.action.VIEW" />
120+
<category android:name="android.intent.category.BROWSABLE" />
121+
<category android:name="android.intent.category.DEFAULT" />
122+
<data
123+
android:host="app.simplenote.com"
124+
android:pathPattern="/account/.*/reset?redirect=simplenote://launch"
125+
android:scheme="https">
126+
</data>
127+
</intent-filter>
128+
</activity-alias>
129+
96130
<activity
97131
android:name="com.automattic.simplenote.NoteEditorActivity"
98132
android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout"

Simplenote/src/main/java/com/automattic/simplenote/CollaboratorsActivity.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.automattic.simplenote.databinding.ActivityCollaboratorsBinding
1515
import com.automattic.simplenote.utils.CollaboratorsAdapter
1616
import com.automattic.simplenote.utils.CollaboratorsAdapter.*
1717
import com.automattic.simplenote.utils.CollaboratorsAdapter.CollaboratorDataItem.*
18+
import com.automattic.simplenote.utils.IntentUtils
1819
import com.automattic.simplenote.utils.toast
1920
import com.automattic.simplenote.viewmodels.CollaboratorsViewModel
2021
import com.automattic.simplenote.viewmodels.CollaboratorsViewModel.Event
@@ -157,7 +158,7 @@ class CollaboratorsActivity : ThemedAppCompatActivity() {
157158
}
158159

159160
private fun navigateToNotesList() {
160-
val intent = Intent(applicationContext, NotesActivity::class.java)
161+
val intent = IntentUtils.maybeAliasedIntent(applicationContext)
161162
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
162163
startActivity(intent)
163164
}

Simplenote/src/main/java/com/automattic/simplenote/DeepLinkActivity.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import androidx.appcompat.app.AppCompatActivity;
99

1010
import com.automattic.simplenote.utils.AuthUtils;
11+
import com.automattic.simplenote.utils.IntentUtils;
12+
import com.automattic.simplenote.utils.WidgetUtils;
1113

1214
import net.openid.appauth.RedirectUriReceiverActivity;
1315

@@ -26,7 +28,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2628
intent.setData(uri);
2729
startActivity(intent);
2830
} else if (uri.getHost().equals(LOGIN_SCHEME)) {
29-
Intent intent = new Intent(this, NotesActivity.class);
31+
Intent intent = IntentUtils.maybeAliasedIntent(getApplicationContext());
3032
Simplenote app = (Simplenote) getApplication();
3133
String email = AuthUtils.extractEmailFromMagicLink(uri);
3234
if (app.isLoggedIn() &&

Simplenote/src/main/java/com/automattic/simplenote/NoteEditorActivity.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import com.automattic.simplenote.utils.AppLog;
3535
import com.automattic.simplenote.utils.AppLog.Type;
3636
import com.automattic.simplenote.utils.DisplayUtils;
37+
import com.automattic.simplenote.utils.IntentUtils;
3738
import com.automattic.simplenote.utils.NetworkUtils;
39+
import com.automattic.simplenote.utils.WidgetUtils;
3840
import com.automattic.simplenote.widgets.NoteEditorViewPager;
3941
import com.automattic.simplenote.widgets.RobotoMediumTextView;
4042
import com.google.android.material.tabs.TabLayout;
@@ -241,7 +243,7 @@ private void handleBackPressed() {
241243
// The editor can be the task root when it comes from an action on a widget
242244
// In these cases, instead of going to the home screen, the notes activity
243245
// is started
244-
Intent intent = new Intent(getApplicationContext(), NotesActivity.class);
246+
Intent intent = IntentUtils.maybeAliasedIntent(getApplicationContext());
245247
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
246248
startActivity(intent);
247249

Simplenote/src/main/java/com/automattic/simplenote/NoteListWidgetDark.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import com.automattic.simplenote.analytics.AnalyticsTracker;
2525
import com.automattic.simplenote.models.Note;
26+
import com.automattic.simplenote.utils.IntentUtils;
2627
import com.automattic.simplenote.utils.PrefUtils;
2728
import com.simperium.Simperium;
2829
import com.simperium.client.Bucket;
@@ -112,14 +113,14 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
112113

113114
if (user.getStatus().equals(User.Status.NOT_AUTHORIZED)) {
114115
// Create intent to navigate to notes activity which redirects to login on widget click
115-
Intent intent = new Intent(context, NotesActivity.class);
116+
Intent intent = IntentUtils.maybeAliasedIntent(context);
116117
intent.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_SIGN_IN_TAPPED);
117118
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
118119
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_IMMUTABLE);
119120
views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
120121

121122
// Reset intent to navigate to note editor on note list add button click to navigate to notes activity, which redirects to login/signup
122-
Intent intentButton = new Intent(context, NotesActivity.class);
123+
Intent intentButton = IntentUtils.maybeAliasedIntent(context);
123124
views.setOnClickPendingIntent(R.id.widget_button, PendingIntent.getActivity(context, appWidgetId, intentButton, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
124125

125126
views.setTextViewText(R.id.widget_text, context.getResources().getString(R.string.log_in_use_widget));
@@ -136,7 +137,7 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
136137

137138
if (cursor.getCount() > 0) {
138139
// Create intent to navigate to notes activity on widget click while loading
139-
Intent intentLoading = new Intent(context, NotesActivity.class);
140+
Intent intentLoading = IntentUtils.maybeAliasedIntent(context);
140141
intentLoading.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_TAPPED);
141142
intentLoading.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
142143
PendingIntent pendingIntentLoading = PendingIntent.getActivity(context, appWidgetId, intentLoading, PendingIntent.FLAG_IMMUTABLE);
@@ -159,7 +160,7 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
159160
views.setPendingIntentTemplate(R.id.widget_list, pendingIntentItem);
160161

161162
// Create intent to navigate to note editor on note list add button click
162-
Intent intentButton = new Intent(context, NotesActivity.class);
163+
Intent intentButton = IntentUtils.maybeAliasedIntent(context);
163164
intentButton.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_BUTTON_TAPPED);
164165
intentButton.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
165166
PendingIntent pendingIntentButton = PendingIntent.getActivity(context, appWidgetId, intentButton, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
@@ -172,14 +173,14 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
172173
views.setViewVisibility(R.id.widget_list, View.VISIBLE);
173174
} else {
174175
// Create intent to navigate to notes activity on widget click
175-
Intent intent = new Intent(context, NotesActivity.class);
176+
Intent intent = IntentUtils.maybeAliasedIntent(context);
176177
intent.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_TAPPED);
177178
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
178179
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_IMMUTABLE);
179180
views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
180181

181182
// Create intent to navigate to note editor on note list add button click
182-
Intent intentButton = new Intent(context, NotesActivity.class);
183+
Intent intentButton = IntentUtils.maybeAliasedIntent(context);
183184
intentButton.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_BUTTON_TAPPED);
184185
intentButton.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
185186
PendingIntent pendingIntentButton = PendingIntent.getActivity(context, appWidgetId, intentButton, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

Simplenote/src/main/java/com/automattic/simplenote/NoteListWidgetLight.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import com.automattic.simplenote.analytics.AnalyticsTracker;
2525
import com.automattic.simplenote.models.Note;
26+
import com.automattic.simplenote.utils.IntentUtils;
2627
import com.automattic.simplenote.utils.PrefUtils;
2728
import com.simperium.Simperium;
2829
import com.simperium.client.Bucket;
@@ -112,14 +113,14 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
112113

113114
if (user.getStatus().equals(User.Status.NOT_AUTHORIZED)) {
114115
// Create intent to navigate to notes activity which redirects to login on widget click
115-
Intent intent = new Intent(context, NotesActivity.class);
116+
Intent intent = IntentUtils.maybeAliasedIntent(context);
116117
intent.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_SIGN_IN_TAPPED);
117118
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
118119
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_IMMUTABLE);
119120
views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
120121

121122
// Reset intent to navigate to note editor on note list add button click to navigate to notes activity, which redirects to login/signup
122-
Intent intentButton = new Intent(context, NotesActivity.class);
123+
Intent intentButton = IntentUtils.maybeAliasedIntent(context);
123124
views.setOnClickPendingIntent(R.id.widget_button, PendingIntent.getActivity(context, appWidgetId, intentButton, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
124125

125126
views.setTextViewText(R.id.widget_text, context.getResources().getString(R.string.log_in_use_widget));
@@ -136,7 +137,7 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
136137

137138
if (cursor.getCount() > 0) {
138139
// Create intent to navigate to notes activity on widget click while loading
139-
Intent intentLoading = new Intent(context, NotesActivity.class);
140+
Intent intentLoading = IntentUtils.maybeAliasedIntent(context);
140141
intentLoading.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_TAPPED);
141142
intentLoading.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
142143
PendingIntent pendingIntentLoading = PendingIntent.getActivity(context, appWidgetId, intentLoading, PendingIntent.FLAG_IMMUTABLE);
@@ -159,7 +160,7 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
159160
views.setPendingIntentTemplate(R.id.widget_list, pendingIntentItem);
160161

161162
// Create intent to navigate to note editor on note list add button click
162-
Intent intentButton = new Intent(context, NotesActivity.class);
163+
Intent intentButton = IntentUtils.maybeAliasedIntent(context);
163164
intentButton.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_BUTTON_TAPPED);
164165
intentButton.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
165166
PendingIntent pendingIntentButton = PendingIntent.getActivity(context, appWidgetId, intentButton, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
@@ -172,14 +173,14 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
172173
views.setViewVisibility(R.id.widget_list, View.VISIBLE);
173174
} else {
174175
// Create intent to navigate to notes activity on widget click
175-
Intent intent = new Intent(context, NotesActivity.class);
176+
Intent intent = IntentUtils.maybeAliasedIntent(context);
176177
intent.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_TAPPED);
177178
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
178179
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_IMMUTABLE);
179180
views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent);
180181

181182
// Create intent to navigate to note editor on note list add button click
182-
Intent intentButton = new Intent(context, NotesActivity.class);
183+
Intent intentButton = IntentUtils.maybeAliasedIntent(context);
183184
intentButton.putExtra(KEY_LIST_WIDGET_CLICK, NOTE_LIST_WIDGET_BUTTON_TAPPED);
184185
intentButton.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
185186
PendingIntent pendingIntentButton = PendingIntent.getActivity(context, appWidgetId, intentButton, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

Simplenote/src/main/java/com/automattic/simplenote/NoteWidgetDark.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.automattic.simplenote.analytics.AnalyticsTracker;
2323
import com.automattic.simplenote.models.Note;
2424
import com.automattic.simplenote.utils.ChecklistUtils;
25+
import com.automattic.simplenote.utils.IntentUtils;
2526
import com.automattic.simplenote.utils.PrefUtils;
2627
import com.simperium.Simperium;
2728
import com.simperium.client.Bucket;
@@ -108,7 +109,7 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
108109

109110
if (user.getStatus().equals(User.Status.NOT_AUTHORIZED)) {
110111
// Create intent to navigate to notes activity which redirects to login on widget click
111-
Intent intent = new Intent(context, NotesActivity.class);
112+
Intent intent = IntentUtils.maybeAliasedIntent(context);
112113
intent.putExtra(KEY_WIDGET_CLICK, NOTE_WIDGET_SIGN_IN_TAPPED);
113114
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
114115
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_IMMUTABLE);

Simplenote/src/main/java/com/automattic/simplenote/NoteWidgetLight.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.automattic.simplenote.analytics.AnalyticsTracker;
2323
import com.automattic.simplenote.models.Note;
2424
import com.automattic.simplenote.utils.ChecklistUtils;
25+
import com.automattic.simplenote.utils.IntentUtils;
2526
import com.automattic.simplenote.utils.PrefUtils;
2627
import com.simperium.Simperium;
2728
import com.simperium.client.Bucket;
@@ -108,7 +109,7 @@ private void updateWidget(Context context, AppWidgetManager appWidgetManager, in
108109

109110
if (user.getStatus().equals(User.Status.NOT_AUTHORIZED)) {
110111
// Create intent to navigate to notes activity which redirects to login on widget click
111-
Intent intent = new Intent(context, NotesActivity.class);
112+
Intent intent = IntentUtils.maybeAliasedIntent(context);
112113
intent.putExtra(KEY_WIDGET_CLICK, NOTE_WIDGET_SIGN_IN_TAPPED);
113114
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
114115
PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, intent, PendingIntent.FLAG_IMMUTABLE);

Simplenote/src/main/java/com/automattic/simplenote/PreferencesFragment.java

+45
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@
1717

1818
import android.app.Activity;
1919
import android.app.Fragment;
20+
import android.content.ComponentName;
2021
import android.content.Context;
2122
import android.content.DialogInterface;
2223
import android.content.Intent;
24+
import android.content.pm.PackageManager;
2325
import android.net.Uri;
2426
import android.os.AsyncTask;
27+
import android.os.Build;
2528
import android.os.Bundle;
2629
import android.os.ParcelFileDescriptor;
30+
import android.widget.Switch;
2731
import android.widget.Toast;
2832

2933
import androidx.appcompat.app.AlertDialog;
@@ -237,6 +241,23 @@ public boolean onPreferenceClick(Preference preference) {
237241
}
238242
});
239243

244+
final SwitchPreferenceCompat sustainerIconPreference = findPreference("pref_key_sustainer_icon");
245+
try {
246+
if (
247+
mPreferencesBucket.get(PREFERENCES_OBJECT_KEY).getCurrentSubscriptionPlatform() != null &&
248+
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
249+
) {
250+
sustainerIconPreference.setVisible(true);
251+
sustainerIconPreference.setOnPreferenceChangeListener((preference, newValue) -> {
252+
toggleSustainerAppIcon((boolean) newValue);
253+
254+
return true;
255+
});
256+
}
257+
} catch (BucketObjectMissingException e) {
258+
sustainerIconPreference.setVisible(false);
259+
}
260+
240261
final Preference membershipPreference = findPreference("pref_key_membership");
241262
membershipPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
242263
@Override
@@ -347,6 +368,30 @@ public boolean onPreferenceClick(Preference preference) {
347368
});
348369
}
349370

371+
private void toggleSustainerAppIcon(boolean enabled) {
372+
Context context = getContext();
373+
if (context == null) {
374+
return;
375+
}
376+
377+
PackageManager packageManager = context.getPackageManager();
378+
String componentPackage = BuildConfig.DEBUG ? "com.automattic.simplenote.debug" : "com.automattic.simplenote";
379+
380+
ComponentName mainComponent = new ComponentName(componentPackage, "com.automattic.simplenote.NotesActivity");
381+
packageManager.setComponentEnabledSetting(
382+
mainComponent,
383+
enabled ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED : PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
384+
PackageManager.DONT_KILL_APP
385+
);
386+
387+
ComponentName sustainerComponent = new ComponentName(componentPackage, "com.automattic.simplenote.NotesActivitySustainerAlias");
388+
packageManager.setComponentEnabledSetting(
389+
sustainerComponent,
390+
enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
391+
PackageManager.DONT_KILL_APP
392+
);
393+
}
394+
350395
private void showProgressDialogDeleteAccount() {
351396
FragmentActivity activity = getActivity();
352397
if (activity == null) {

0 commit comments

Comments
 (0)