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
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user