From 26dd002a229a7320e001fcf853b801d68102de4e Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Tue, 15 Jul 2014 12:07:36 -0400 Subject: [PATCH] Fix hiding of sign-in to network notification. Don't rely on the NetworkAgent still being connected when we go to hide the notification. The notification is hidden when the NetworkAgent is disconnected so that wasn't a safe assumption. By using the NetID as the notification identifier we also fix the issue of multiple notifications of the same network type inadvertently hiding the incorrect notification with the same network type. bug:16317917 Change-Id: I01fdc466a0f430af9fc378445586ec7b83b3ac83 --- .../android/server/ConnectivityService.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 6554ed319c..86f8777a68 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3199,13 +3199,17 @@ public class ConnectivityService extends IConnectivityManager.Stub { break; } case NetworkMonitor.EVENT_PROVISIONING_NOTIFICATION: { - NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); - if (nai == null) { - loge("EVENT_PROVISIONING_NOTIFICATION from unknown NetworkMonitor"); - break; + if (msg.arg1 == 0) { + setProvNotificationVisibleIntent(false, msg.arg2, 0, null, null); + } else { + NetworkAgentInfo nai = mNetworkForNetId.get(msg.arg2); + if (nai == null) { + loge("EVENT_PROVISIONING_NOTIFICATION from unknown NetworkMonitor"); + break; + } + setProvNotificationVisibleIntent(true, msg.arg2, nai.networkInfo.getType(), + nai.networkInfo.getExtraInfo(), (PendingIntent)msg.obj); } - setProvNotificationVisibleIntent(msg.arg1 != 0, nai.networkInfo.getType(), - nai.networkInfo.getExtraInfo(), (PendingIntent)msg.obj); break; } case NetworkStateTracker.EVENT_STATE_CHANGED: { @@ -4958,10 +4962,19 @@ public class ConnectivityService extends IConnectivityManager.Stub { break; } } - setProvNotificationVisibleIntent(visible, networkType, extraInfo, pendingIntent); + // Concatenate the range of types onto the range of NetIDs. + int id = MAX_NET_ID + 1 + (networkType - ConnectivityManager.TYPE_NONE); + setProvNotificationVisibleIntent(visible, id, networkType, extraInfo, pendingIntent); } - private void setProvNotificationVisibleIntent(boolean visible, int networkType, + /** + * Show or hide network provisioning notificaitons. + * + * @param id an identifier that uniquely identifies this notification. This must match + * between show and hide calls. We use the NetID value but for legacy callers + * we concatenate the range of types with the range of NetIDs. + */ + private void setProvNotificationVisibleIntent(boolean visible, int id, int networkType, String extraInfo, PendingIntent intent) { if (DBG) { log("setProvNotificationVisibleIntent: E visible=" + visible + " networkType=" + @@ -5008,14 +5021,14 @@ public class ConnectivityService extends IConnectivityManager.Stub { notification.contentIntent = intent; try { - notificationManager.notify(NOTIFICATION_ID, networkType, notification); + notificationManager.notify(NOTIFICATION_ID, id, notification); } catch (NullPointerException npe) { loge("setNotificaitionVisible: visible notificationManager npe=" + npe); npe.printStackTrace(); } } else { try { - notificationManager.cancel(NOTIFICATION_ID, networkType); + notificationManager.cancel(NOTIFICATION_ID, id); } catch (NullPointerException npe) { loge("setNotificaitionVisible: cancel notificationManager npe=" + npe); npe.printStackTrace();