Skip to content

Commit 278c5e2

Browse files
tjleingThomas Leing
andauthored
Fix notification opt-out checking on Samsung devices (#2883)
* Fix notification opt-out checking on Samsung devices * Add comment to Javadoc * Specify `NotificationManagerCompat#` * Fix unit test by mocking system notification check * Fix Javadoc link Co-authored-by: Thomas Leing <[email protected]>
1 parent 79889a6 commit 278c5e2

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

aws-android-sdk-pinpoint/src/main/java/com/amazonaws/mobileconnectors/pinpoint/targeting/notification/NotificationClientBase.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import android.os.AsyncTask;
3232
import android.os.Bundle;
3333
import androidx.core.app.NotificationCompat;
34+
import androidx.core.app.NotificationManagerCompat;
3435

3536
import com.amazonaws.mobileconnectors.pinpoint.analytics.AnalyticsEvent;
3637
import com.amazonaws.mobileconnectors.pinpoint.internal.core.PinpointContext;
@@ -957,6 +958,9 @@ public final NotificationClient.PushResult handleCampaignPush(NotificationDetail
957958
* notifications was a feature added on devices supporting API Level 16 and
958959
* above, so devices from API level 16 to 18 will return true from this
959960
* method even when local notifications have been disabled for the app.
961+
* Also, at API level 24 and higher, we use the more consistent API
962+
* {@link NotificationManagerCompat#areNotificationsEnabled()} to fix an issue we were
963+
* seeing with Samsung devices.
960964
*
961965
* @return true if local notifications are enabled for this app, otherwise
962966
* false.
@@ -975,6 +979,10 @@ boolean areAppNotificationsEnabledOnPlatform() {
975979
return true;
976980
}
977981

982+
if (android.os.Build.VERSION.SDK_INT >= ANDROID_NOUGAT) {
983+
return NotificationManagerCompat.from(pinpointContext.getApplicationContext()).areNotificationsEnabled();
984+
}
985+
978986
final String appOpsServiceName;
979987
try {
980988
final Field appOpsServiceNameField = Context.class.getDeclaredField(APP_OPS_SERVICE);

aws-android-sdk-pinpoint/src/test/java/com/amazonaws/mobileconnectors/pinpoint/targeting/EndpointProfileTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import com.amazonaws.mobileconnectors.pinpoint.targeting.endpointProfile.EndpointProfile;
3939
import com.amazonaws.mobileconnectors.pinpoint.targeting.endpointProfile.EndpointProfileDemographic;
4040
import com.amazonaws.mobileconnectors.pinpoint.targeting.endpointProfile.EndpointProfileLocation;
41+
42+
import android.app.NotificationManager;
4143
import android.content.Context;
4244
import android.os.Build;
4345

@@ -280,6 +282,9 @@ public void testCountryWithInvalidISO3Code() {
280282
when(mockResources.getConfiguration()).thenReturn(mockConfiguration);
281283
when(mockApplicationContext.getResources()).thenReturn(mockResources);
282284
when(mockApplicationContext.getApplicationContext()).thenReturn(mockedContext);
285+
NotificationManager notificationManager = mock(NotificationManager.class);
286+
when(mockApplicationContext.getSystemService(Context.NOTIFICATION_SERVICE)).thenReturn(notificationManager);
287+
when(notificationManager.areNotificationsEnabled()).thenReturn(true);
283288
when(mockContext.getApplicationContext()).thenReturn(mockApplicationContext);
284289

285290
final TargetingClient targetingClient = new TargetingClient(mockContext, mock(ThreadPoolExecutor.class));

0 commit comments

Comments
 (0)