From 38389b6cf7bd2ef49d2bd20ff1bca8677596590e Mon Sep 17 00:00:00 2001 From: Victoria Lease Date: Sun, 30 Sep 2012 11:44:22 -0700 Subject: Route GPS notifications to all users. This takes the easy way around notifying the correct users about GPS state transitions by notifying ALL the users(!). I've also laid groundwork for proper multiuser support in LocationManager and did a tiny bit of cleanup in GpsNetInitiatedHandler while I was looking at notifications. Bug: 7213552 Change-Id: I2d6dc65c459e55d110ac0f5f79ae7a87ad638ede --- .../internal/location/GpsNetInitiatedHandler.java | 9 ++---- .../statusbar/policy/LocationController.java | 5 ++-- .../com/android/server/LocationManagerService.java | 32 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java index 0adba06..57e2786 100755 --- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java +++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.location.LocationManager; import android.os.Bundle; import android.os.RemoteException; +import android.os.UserHandle; import android.util.Log; import com.android.internal.R; @@ -89,7 +90,6 @@ public class GpsNetInitiatedHandler { // configuration of notificaiton behavior private boolean mPlaySounds = false; - private boolean visible = true; private boolean mPopupImmediately = true; // Set to true if string from HAL is encoded as Hex, e.g., "3F0039" @@ -213,11 +213,8 @@ public class GpsNetInitiatedHandler { PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, intent, 0); mNiNotification.setLatestEventInfo(mContext, title, message, pi); - if (visible) { - notificationManager.notify(notif.notificationId, mNiNotification); - } else { - notificationManager.cancel(notif.notificationId); - } + notificationManager.notifyAsUser(null, notif.notificationId, mNiNotification, + UserHandle.ALL); } // Opens the notification dialog and waits for user input diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java index f864d04..776cf36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java @@ -97,7 +97,6 @@ public class LocationController extends BroadcastReceiver { } try { - // XXX WHAT TO DO ABOUT MULTI-USER? if (visible) { Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); gpsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -126,7 +125,7 @@ public class LocationController extends BroadcastReceiver { GPS_NOTIFICATION_ID, n, idOut, - UserHandle.USER_CURRENT); + UserHandle.USER_ALL); for (LocationGpsStateChangeCallback cb : mChangeCallbacks) { cb.onLocationGpsStateChanged(true, text); @@ -134,7 +133,7 @@ public class LocationController extends BroadcastReceiver { } else { mNotificationService.cancelNotificationWithTag( mContext.getPackageName(), null, - GPS_NOTIFICATION_ID, UserHandle.USER_CURRENT); + GPS_NOTIFICATION_ID, UserHandle.USER_ALL); for (LocationGpsStateChangeCallback cb : mChangeCallbacks) { cb.onLocationGpsStateChanged(false, null); diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index a0c1552..d982d0d 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -17,9 +17,11 @@ package com.android.server; import android.app.PendingIntent; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -171,6 +173,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run private final ArrayList mProxyProviders = new ArrayList(); + // current active user on the device - other users are denied location data + private int mCurrentUserId = UserHandle.USER_OWNER; + public LocationManagerService(Context context) { super(); mContext = context; @@ -224,6 +229,20 @@ public class LocationManagerService extends ILocationManager.Stub implements Run }); mPackageMonitor.register(mContext, Looper.myLooper(), true); + // listen for user change + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Intent.ACTION_USER_SWITCHED); + + mContext.registerReceiverAsUser(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_USER_SWITCHED.equals(action)) { + switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); + } + } + }, UserHandle.ALL, intentFilter, null, null); + updateProvidersLocked(); } @@ -302,6 +321,19 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } /** + * Called when the device's active user changes. + * @param userId the new active user's UserId + */ + private void switchUser(int userId) { + //Log.d("LocationManagerService", "switchUser(" + mCurrentUserId + " -> " + userId + ")"); // TODO: remove this + synchronized (mLock) { + // TODO: inform previous user's Receivers that they will no longer receive updates + mCurrentUserId = userId; + // TODO: inform new user's Receivers that they are back on the update train + } + } + + /** * A wrapper class holding either an ILocationListener or a PendingIntent to receive * location updates. */ -- cgit v1.1