From 539aa9a22c2d656386f7b02dd03270ac51d6827f Mon Sep 17 00:00:00 2001 From: paulhu Date: Wed, 14 Oct 2020 09:51:54 +0800 Subject: [PATCH] NetworkNotificationManager gets NotificationManager locally It's confusing that NetworkNotificationManager uses NotificationManager to put up notifcation which is passed from ConnectivityService. And that NotificationManager should be gotten from a context with UserHandle.ALL because the notification should notify to all users. But the future developer may not know this and pass incorrect NotificationManager probably. Therefore, adjust the design that NetworkNotificationManager will get NotificationManager locally. Bug: 170593746 Test: atest FrameworksNetTests Change-Id: Id65c998052b7b223171c5194ea46b49d7e84729d --- .../java/com/android/server/ConnectivityService.java | 8 +------- .../connectivity/NetworkNotificationManager.java | 8 ++++++-- .../connectivity/NetworkNotificationManagerTest.java | 10 +++++++++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index da2a3de9f9..22423fe00b 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -65,7 +65,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppOpsManager; import android.app.BroadcastOptions; -import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -1146,12 +1145,7 @@ public class ConnectivityService extends IConnectivityManager.Stub dataConnectionStats.startMonitoring(); mKeepaliveTracker = new KeepaliveTracker(mContext, mHandler); - mNotifier = new NetworkNotificationManager(mContext, mTelephonyManager, - // Pass a NotificationManager obtained from a context with UserHandle.ALL, then - // NetworkNotificationManager can put up a notification to all users. - // TODO: Create NotificationManager in NetworkNotificationManager directly. - (NotificationManager) mContext.createContextAsUser(UserHandle.ALL, 0 /* flags */) - .getSystemService(Context.NOTIFICATION_SERVICE)); + mNotifier = new NetworkNotificationManager(mContext, mTelephonyManager); final int dailyLimit = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.NETWORK_SWITCH_NOTIFICATION_DAILY_LIMIT, diff --git a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java index 3d22d6d37c..3385393122 100644 --- a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java +++ b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java @@ -21,6 +21,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; +import android.annotation.NonNull; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; @@ -30,6 +31,7 @@ import android.content.res.Resources; import android.net.NetworkSpecifier; import android.net.TelephonyNetworkSpecifier; import android.net.wifi.WifiInfo; +import android.os.UserHandle; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -83,10 +85,12 @@ public class NetworkNotificationManager { // Tracks the types of notifications managed by this instance, from creation to cancellation. private final SparseIntArray mNotificationTypeMap; - public NetworkNotificationManager(Context c, TelephonyManager t, NotificationManager n) { + public NetworkNotificationManager(@NonNull final Context c, @NonNull final TelephonyManager t) { mContext = c; mTelephonyManager = t; - mNotificationManager = n; + mNotificationManager = + (NotificationManager) c.createContextAsUser(UserHandle.ALL, 0 /* flags */) + .getSystemService(Context.NOTIFICATION_SERVICE); mNotificationTypeMap = new SparseIntArray(); } diff --git a/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java b/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java index fa4df4e8b1..b47be97ed0 100644 --- a/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/NetworkNotificationManagerTest.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; @@ -36,6 +37,7 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.net.NetworkCapabilities; import android.net.NetworkInfo; +import android.os.UserHandle; import android.telephony.TelephonyManager; import androidx.test.filters.SmallTest; @@ -47,6 +49,7 @@ import com.android.server.connectivity.NetworkNotificationManager.NotificationTy import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.AdditionalAnswers; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -104,10 +107,15 @@ public class NetworkNotificationManagerTest { when(mCtx.getResources()).thenReturn(mResources); when(mCtx.getPackageManager()).thenReturn(mPm); when(mCtx.getApplicationInfo()).thenReturn(new ApplicationInfo()); + final Context asUserCtx = mock(Context.class, AdditionalAnswers.delegatesTo(mCtx)); + doReturn(UserHandle.ALL).when(asUserCtx).getUser(); + when(mCtx.createContextAsUser(eq(UserHandle.ALL), anyInt())).thenReturn(asUserCtx); + when(mCtx.getSystemService(eq(Context.NOTIFICATION_SERVICE))) + .thenReturn(mNotificationManager); when(mNetworkInfo.getExtraInfo()).thenReturn("extra"); when(mResources.getColor(anyInt(), any())).thenReturn(0xFF607D8B); - mManager = new NetworkNotificationManager(mCtx, mTelephonyManager, mNotificationManager); + mManager = new NetworkNotificationManager(mCtx, mTelephonyManager); } private void verifyTitleByNetwork(final int id, final NetworkAgentInfo nai, final int title) {