diff options
| author | Victoria Lease <violets@google.com> | 2012-09-30 11:44:22 -0700 |
|---|---|---|
| committer | Victoria Lease <violets@google.com> | 2012-10-01 09:09:25 -0700 |
| commit | 38389b6cf7bd2ef49d2bd20ff1bca8677596590e (patch) | |
| tree | df60d969dee05b53545e2b0b18bfba57d266d595 | |
| parent | ce803d8ed8350179a8474564df8ff26be32bbe5e (diff) | |
| download | frameworks_base-38389b6cf7bd2ef49d2bd20ff1bca8677596590e.zip frameworks_base-38389b6cf7bd2ef49d2bd20ff1bca8677596590e.tar.gz frameworks_base-38389b6cf7bd2ef49d2bd20ff1bca8677596590e.tar.bz2 | |
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
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<LocationProviderProxy> mProxyProviders = new ArrayList<LocationProviderProxy>(); + // 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. */ |
