summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictoria Lease <violets@google.com>2012-09-30 11:44:22 -0700
committerVictoria Lease <violets@google.com>2012-10-01 09:09:25 -0700
commit38389b6cf7bd2ef49d2bd20ff1bca8677596590e (patch)
treedf60d969dee05b53545e2b0b18bfba57d266d595
parentce803d8ed8350179a8474564df8ff26be32bbe5e (diff)
downloadframeworks_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
-rwxr-xr-xlocation/java/com/android/internal/location/GpsNetInitiatedHandler.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java5
-rw-r--r--services/java/com/android/server/LocationManagerService.java32
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.
*/