diff options
author | Remi NGUYEN VAN <reminv@google.com> | 2020-06-01 11:49:29 +0000 |
---|---|---|
committer | Remi NGUYEN VAN <reminv@google.com> | 2020-06-02 00:13:03 +0000 |
commit | 3f5206b726944271f5a58759e8a348fe810c15cd (patch) | |
tree | a1485ce1821d66216d9f856de2cbf82eee8dc6a8 | |
parent | d44616a143669a0c940c92a717da3c602ba54525 (diff) |
Fix venue info notification not displaying
The venue info notification was never displayed, because querying the
notification channel from UserHandle.ALL returns no channel.
Channels must be handled from the NetworkStack (owner) user, not the ALL
user that is used to send notifications.
Bug: 157203874
Test: atest NetworkStackTests; manual: verified showing or disabling the
notification as owner or alternate user.
Original-Change: https://android-review.googlesource.com/1321357
Merged-In: I9ce908cebdef81bb524353219f7ee9ead2487056
Change-Id: I9ce908cebdef81bb524353219f7ee9ead2487056
-rw-r--r-- | src/com/android/networkstack/NetworkStackNotifier.java | 22 | ||||
-rw-r--r-- | tests/unit/src/com/android/networkstack/NetworkStackNotifierTest.kt | 10 |
2 files changed, 28 insertions, 4 deletions
diff --git a/src/com/android/networkstack/NetworkStackNotifier.java b/src/com/android/networkstack/NetworkStackNotifier.java index a330c70..872834a 100644 --- a/src/com/android/networkstack/NetworkStackNotifier.java +++ b/src/com/android/networkstack/NetworkStackNotifier.java @@ -16,6 +16,8 @@ package com.android.networkstack; +import static android.app.NotificationManager.IMPORTANCE_NONE; + import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -142,7 +144,19 @@ public class NetworkStackNotifier { resources.getString(title), importance); channel.setDescription(resources.getString(description)); - mNotificationManager.createNotificationChannel(channel); + getNotificationManagerForChannels().createNotificationChannel(channel); + } + + /** + * Get the NotificationManager to use to query channels, as opposed to posting notifications. + * + * Although notifications are posted as USER_ALL, notification channels are always created + * based on the UID calling NotificationManager, regardless of the context UserHandle. + * When querying notification channels, using a USER_ALL context would return no channel: the + * default context (as UserHandle 0 for NetworkStack) must be used. + */ + private NotificationManager getNotificationManagerForChannels() { + return mContext.getSystemService(NotificationManager.class); } /** @@ -284,7 +298,11 @@ public class NetworkStackNotifier { } private boolean isVenueInfoNotificationEnabled() { - return mNotificationManager.getNotificationChannel(CHANNEL_VENUE_INFO) != null; + final NotificationChannel channel = getNotificationManagerForChannels() + .getNotificationChannel(CHANNEL_VENUE_INFO); + if (channel == null) return false; + + return channel.getImportance() != IMPORTANCE_NONE; } private static String getNotificationTag(@NonNull Network network) { diff --git a/tests/unit/src/com/android/networkstack/NetworkStackNotifierTest.kt b/tests/unit/src/com/android/networkstack/NetworkStackNotifierTest.kt index 1be6ee7..b2607eb 100644 --- a/tests/unit/src/com/android/networkstack/NetworkStackNotifierTest.kt +++ b/tests/unit/src/com/android/networkstack/NetworkStackNotifierTest.kt @@ -20,6 +20,7 @@ import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager import android.app.NotificationManager.IMPORTANCE_DEFAULT +import android.app.NotificationManager.IMPORTANCE_NONE import android.app.PendingIntent import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.content.Context @@ -80,6 +81,8 @@ class NetworkStackNotifierTest { @Mock private lateinit var mNm: NotificationManager @Mock + private lateinit var mNotificationChannelsNm: NotificationManager + @Mock private lateinit var mCm: ConnectivityManager @Mock private lateinit var mResources: Resources @@ -141,10 +144,12 @@ class NetworkStackNotifierTest { realContext.packageName, 0, UserHandle.ALL) mAllUserContext.mockService(Context.NOTIFICATION_SERVICE, NotificationManager::class, mNm) + mContext.mockService(Context.NOTIFICATION_SERVICE, NotificationManager::class, + mNotificationChannelsNm) mContext.mockService(Context.CONNECTIVITY_SERVICE, ConnectivityManager::class, mCm) doReturn(NotificationChannel(CHANNEL_VENUE_INFO, "TestChannel", IMPORTANCE_DEFAULT)) - .`when`(mNm).getNotificationChannel(CHANNEL_VENUE_INFO) + .`when`(mNotificationChannelsNm).getNotificationChannel(CHANNEL_VENUE_INFO) doReturn(mPendingIntent).`when`(mDependencies).getActivityPendingIntent( any(), any(), anyInt()) @@ -247,7 +252,8 @@ class NetworkStackNotifierTest { fun testConnectedVenueInfoNotification_VenueInfoDisabled() { // Venue info (CaptivePortalData) is not available for API <= Q assumeTrue(NetworkInformationShimImpl.useApiAboveQ()) - doReturn(null).`when`(mNm).getNotificationChannel(CHANNEL_VENUE_INFO) + val channel = NotificationChannel(CHANNEL_VENUE_INFO, "test channel", IMPORTANCE_NONE) + doReturn(channel).`when`(mNotificationChannelsNm).getNotificationChannel(CHANNEL_VENUE_INFO) mNotifier.notifyCaptivePortalValidationPending(TEST_NETWORK) onLinkPropertiesChanged(mTestCapportLp) onDefaultNetworkAvailable(TEST_NETWORK) |