Skip to content

Commit 07a2678

Browse files
authored
Fix notifications in Android 13 (#227)
* Add POST_NOTIFICATIONS permission to manifest * Update to use latest Android 13 notification api * Update versionCode and versionName
1 parent e8cd1de commit 07a2678

File tree

6 files changed

+81
-13
lines changed

6 files changed

+81
-13
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ android {
3434
multiDexEnabled true
3535
targetSdkVersion 33
3636
vectorDrawables.useSupportLibrary = true
37-
versionCode 82
38-
versionName "22"
37+
versionCode 83
38+
versionName "22.1"
3939
}
4040
buildTypes {
4141
debug {

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
android:installLocation="auto">
55

66
<uses-permission android:name="android.permission.INTERNET" />
7+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
78
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
89
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" tools:ignore="ScopedStorage"/>
910
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>

app/src/main/java/org/nutritionfacts/dailydozen/activity/DailyReminderSettingsActivity.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
import android.view.View;
66
import android.widget.TimePicker;
77

8+
import androidx.annotation.NonNull;
89
import androidx.annotation.Nullable;
910
import androidx.appcompat.app.AppCompatActivity;
1011
import androidx.recyclerview.widget.LinearLayoutManager;
1112

1213
import org.greenrobot.eventbus.Subscribe;
1314
import org.nutritionfacts.dailydozen.adapter.DailyReminderAdapter;
1415
import org.nutritionfacts.dailydozen.controller.Bus;
16+
import org.nutritionfacts.dailydozen.controller.PermissionController;
1517
import org.nutritionfacts.dailydozen.controller.Prefs;
1618
import org.nutritionfacts.dailydozen.databinding.ActivityNotificationSettingsBinding;
1719
import org.nutritionfacts.dailydozen.event.ReminderRemovedEvent;
@@ -50,9 +52,24 @@ private void init() {
5052
onDailyReminderSwitchToggled();
5153
onAddReminderClicked();
5254

53-
updateReminderPref = Prefs.getInstance(this).getUpdateReminderPref();
55+
if (PermissionController.canPostNotifications(this)) {
56+
updateReminderPref = Prefs.getInstance(this).getUpdateReminderPref();
5457

55-
if (updateReminderPref != null) {
58+
if (updateReminderPref != null) {
59+
initUpdateReminderPrefConfig();
60+
} else {
61+
disableUpdateReminderPref();
62+
}
63+
} else {
64+
PermissionController.askForPostNotifications(this);
65+
}
66+
}
67+
68+
@Override
69+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
70+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
71+
72+
if (PermissionController.grantedPostNotifications(requestCode, grantResults)) {
5673
initUpdateReminderPrefConfig();
5774
} else {
5875
disableUpdateReminderPref();

app/src/main/java/org/nutritionfacts/dailydozen/activity/DebugActivity.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
import android.widget.AdapterView;
77
import android.widget.ArrayAdapter;
88

9+
import androidx.annotation.NonNull;
910
import androidx.appcompat.app.AlertDialog;
1011
import androidx.appcompat.app.AppCompatActivity;
1112

1213
import org.nutritionfacts.dailydozen.Common;
1314
import org.nutritionfacts.dailydozen.R;
15+
import org.nutritionfacts.dailydozen.controller.PermissionController;
1416
import org.nutritionfacts.dailydozen.databinding.ActivityDebugBinding;
1517
import org.nutritionfacts.dailydozen.task.GenerateDataTask;
1618
import org.nutritionfacts.dailydozen.task.ProgressListener;
@@ -116,7 +118,28 @@ public void onNothingSelected(AdapterView<?> parent) {
116118
}
117119

118120
public void onShowNotificationClicked() {
119-
binding.debugShowNotification.setOnClickListener(v -> NotificationUtil.showUpdateReminderNotification(DebugActivity.this, null));
121+
binding.debugShowNotification.setOnClickListener(v -> {
122+
Timber.d("onShowNotificationClicked");
123+
if (PermissionController.canPostNotifications(this)) {
124+
Timber.d("canPostNotifications = [true]");
125+
NotificationUtil.showUpdateReminderNotification(this, null);
126+
} else {
127+
Timber.d("canPostNotifications = [false]");
128+
PermissionController.askForPostNotifications(this);
129+
}
130+
});
131+
}
132+
133+
@Override
134+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
135+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
136+
137+
if (PermissionController.grantedPostNotifications(requestCode, grantResults)) {
138+
Timber.d("onRequestPermissionsResult = [true]");
139+
NotificationUtil.showUpdateReminderNotification(this, null);
140+
} else {
141+
Timber.d("onRequestPermissionsResult = [false]");
142+
}
120143
}
121144

122145
@Override

app/src/main/java/org/nutritionfacts/dailydozen/controller/PermissionController.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,34 @@
22

33
import android.Manifest;
44
import android.app.Activity;
5+
import android.app.NotificationChannel;
56
import android.content.pm.PackageManager;
67
import android.os.Build;
78

89
import androidx.core.app.ActivityCompat;
10+
import androidx.core.app.NotificationManagerCompat;
911
import androidx.core.content.ContextCompat;
1012

13+
import org.nutritionfacts.dailydozen.util.NotificationUtil;
14+
15+
import timber.log.Timber;
16+
1117
public class PermissionController {
1218
private static final int WRITE_EXTERNAL_STORAGE_REQUEST = 1;
19+
private static final int POST_NOTIFICATIONS_REQUEST = 2;
20+
21+
public static boolean canPostNotifications(final Activity activity) {
22+
boolean areNotificationsEnabled = NotificationManagerCompat.from(activity).areNotificationsEnabled();
23+
Timber.d("NotificationManager.areNotificationsEnabled() = %s", areNotificationsEnabled);
24+
if (areNotificationsEnabled) {
25+
NotificationChannel channel = NotificationManagerCompat.from(activity).getNotificationChannel(NotificationUtil.CHANNEL_REMINDERS);
26+
if (channel != null) {
27+
Timber.d("channel.getImportance() = %s", channel.getImportance());
28+
return channel.getImportance() != NotificationManagerCompat.IMPORTANCE_NONE;
29+
}
30+
}
31+
return false;
32+
}
1333

1434
public static boolean canWriteExternalStorage(final Activity activity) {
1535
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
@@ -18,20 +38,27 @@ public static boolean canWriteExternalStorage(final Activity activity) {
1838
return true;
1939
}
2040

41+
public static void askForPostNotifications(final Activity activity) {
42+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
43+
ActivityCompat.requestPermissions(
44+
activity,
45+
new String[]{Manifest.permission.POST_NOTIFICATIONS},
46+
POST_NOTIFICATIONS_REQUEST);
47+
}
48+
}
49+
2150
public static void askForWriteExternalStorage(final Activity activity) {
2251
ActivityCompat.requestPermissions(
2352
activity,
2453
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
2554
WRITE_EXTERNAL_STORAGE_REQUEST);
2655
}
2756

28-
public static boolean grantedWriteExternalStorage(int requestCode, int[] grantResults) {
29-
boolean permissionGranted = false;
30-
31-
if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST) {
32-
permissionGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
33-
}
57+
public static boolean grantedPostNotifications(int requestCode, int[] grantResults) {
58+
return requestCode == POST_NOTIFICATIONS_REQUEST && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
59+
}
3460

35-
return permissionGranted;
61+
public static boolean grantedWriteExternalStorage(int requestCode, int[] grantResults) {
62+
return requestCode == WRITE_EXTERNAL_STORAGE_REQUEST && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
3663
}
3764
}

app/src/main/java/org/nutritionfacts/dailydozen/util/NotificationUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class NotificationUtil {
2727
private static final int UPDATE_REMINDER_ID = 1;
2828
private static final int NOTIFICATION_SETTINGS_ID = 2;
2929

30-
private static final String CHANNEL_REMINDERS = "DAILY_DOZEN_REMINDERS_CHANNEL";
30+
public static final String CHANNEL_REMINDERS = "DAILY_DOZEN_REMINDERS_CHANNEL";
3131

3232
public static void showUpdateReminderNotification(final Context context, Intent intent) {
3333
final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_REMINDERS)

0 commit comments

Comments
 (0)