am 319c7e85
: Merge "make FLP play nicely with multiuser" into jb-mr1-dev
* commit '319c7e85019350e3a5f26c64803900b945130c3b': make FLP play nicely with multiuser
This commit is contained in:
@ -405,8 +405,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
mLastLocation.clear();
|
mLastLocation.clear();
|
||||||
for (LocationProviderInterface p : mProviders) {
|
for (LocationProviderInterface p : mProviders) {
|
||||||
updateProviderListenersLocked(p.getName(), false, mCurrentUserId);
|
updateProviderListenersLocked(p.getName(), false, mCurrentUserId);
|
||||||
|
if (!LocationManager.FUSED_PROVIDER.equals(p.getName())) {
|
||||||
p.switchUser(userId);
|
p.switchUser(userId);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
mCurrentUserId = userId;
|
mCurrentUserId = userId;
|
||||||
updateProvidersLocked();
|
updateProvidersLocked();
|
||||||
}
|
}
|
||||||
@ -664,9 +666,27 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
mProvidersByName.remove(provider.getName());
|
mProvidersByName.remove(provider.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the specified UID is SYSTEM_UID or matches the current user.
|
||||||
|
*
|
||||||
|
* @param uid the uid
|
||||||
|
* @return true if uid is SYSTEM_UID or matches the current user
|
||||||
|
*/
|
||||||
|
private boolean isCurrentUserOrSystemLocked(int uid) {
|
||||||
|
return uid == Process.SYSTEM_UID || UserHandle.getUserId(uid) == mCurrentUserId;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isAllowedBySettingsLocked(String provider, int userId) {
|
/**
|
||||||
if (userId != mCurrentUserId) {
|
* Returns the first UID in the current user's range.
|
||||||
|
*
|
||||||
|
* @return the first UID in the current user's range
|
||||||
|
*/
|
||||||
|
private int getCurrentUidBaseLocked() {
|
||||||
|
return UserHandle.getUid(mCurrentUserId, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isAllowedBySettingsLocked(String provider, int uid) {
|
||||||
|
if (!isCurrentUserOrSystemLocked(uid)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mEnabledProviders.contains(provider)) {
|
if (mEnabledProviders.contains(provider)) {
|
||||||
@ -675,6 +695,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
if (mDisabledProviders.contains(provider)) {
|
if (mDisabledProviders.contains(provider)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (uid == Process.SYSTEM_UID) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Use system settings
|
// Use system settings
|
||||||
ContentResolver resolver = mContext.getContentResolver();
|
ContentResolver resolver = mContext.getContentResolver();
|
||||||
|
|
||||||
@ -828,8 +852,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
|
public List<String> getProviders(Criteria criteria, boolean enabledOnly) {
|
||||||
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
|
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
|
||||||
ArrayList<String> out;
|
ArrayList<String> out;
|
||||||
int callingUserId = UserHandle.getCallingUserId();
|
final int callingUid = Binder.getCallingUid();
|
||||||
long identity = Binder.clearCallingIdentity();
|
final long identity = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
out = new ArrayList<String>(mProviders.size());
|
out = new ArrayList<String>(mProviders.size());
|
||||||
@ -839,7 +863,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (allowedResolutionLevel >= getMinimumResolutionLevelForProviderUse(name)) {
|
if (allowedResolutionLevel >= getMinimumResolutionLevelForProviderUse(name)) {
|
||||||
if (enabledOnly && !isAllowedBySettingsLocked(name, callingUserId)) {
|
if (enabledOnly && !isAllowedBySettingsLocked(name, callingUid)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (criteria != null && !LocationProvider.propertiesMeetCriteria(
|
if (criteria != null && !LocationProvider.propertiesMeetCriteria(
|
||||||
@ -915,7 +939,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
LocationProviderInterface p = mProviders.get(i);
|
LocationProviderInterface p = mProviders.get(i);
|
||||||
boolean isEnabled = p.isEnabled();
|
boolean isEnabled = p.isEnabled();
|
||||||
String name = p.getName();
|
String name = p.getName();
|
||||||
boolean shouldBeEnabled = isAllowedBySettingsLocked(name, mCurrentUserId);
|
boolean shouldBeEnabled = isAllowedBySettingsLocked(name, getCurrentUidBaseLocked());
|
||||||
if (isEnabled && !shouldBeEnabled) {
|
if (isEnabled && !shouldBeEnabled) {
|
||||||
updateProviderListenersLocked(name, false, mCurrentUserId);
|
updateProviderListenersLocked(name, false, mCurrentUserId);
|
||||||
changesMade = true;
|
changesMade = true;
|
||||||
@ -943,7 +967,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
final int N = records.size();
|
final int N = records.size();
|
||||||
for (int i = 0; i < N; i++) {
|
for (int i = 0; i < N; i++) {
|
||||||
UpdateRecord record = records.get(i);
|
UpdateRecord record = records.get(i);
|
||||||
if (UserHandle.getUserId(record.mReceiver.mUid) == userId) {
|
if (isCurrentUserOrSystemLocked(record.mReceiver.mUid)) {
|
||||||
// Sends a notification message to the receiver
|
// Sends a notification message to the receiver
|
||||||
if (!record.mReceiver.callProviderEnabledLocked(provider, enabled)) {
|
if (!record.mReceiver.callProviderEnabledLocked(provider, enabled)) {
|
||||||
if (deadReceivers == null) {
|
if (deadReceivers == null) {
|
||||||
@ -982,7 +1006,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
|
|
||||||
if (records != null) {
|
if (records != null) {
|
||||||
for (UpdateRecord record : records) {
|
for (UpdateRecord record : records) {
|
||||||
if (UserHandle.getUserId(record.mReceiver.mUid) == mCurrentUserId) {
|
if (isCurrentUserOrSystemLocked(record.mReceiver.mUid)) {
|
||||||
LocationRequest locationRequest = record.mRequest;
|
LocationRequest locationRequest = record.mRequest;
|
||||||
providerRequest.locationRequests.add(locationRequest);
|
providerRequest.locationRequests.add(locationRequest);
|
||||||
if (locationRequest.getInterval() < providerRequest.interval) {
|
if (locationRequest.getInterval() < providerRequest.interval) {
|
||||||
@ -1000,7 +1024,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
// under that threshold.
|
// under that threshold.
|
||||||
long thresholdInterval = (providerRequest.interval + 1000) * 3 / 2;
|
long thresholdInterval = (providerRequest.interval + 1000) * 3 / 2;
|
||||||
for (UpdateRecord record : records) {
|
for (UpdateRecord record : records) {
|
||||||
if (UserHandle.getUserId(record.mReceiver.mUid) == mCurrentUserId) {
|
if (isCurrentUserOrSystemLocked(record.mReceiver.mUid)) {
|
||||||
LocationRequest locationRequest = record.mRequest;
|
LocationRequest locationRequest = record.mRequest;
|
||||||
if (locationRequest.getInterval() <= thresholdInterval) {
|
if (locationRequest.getInterval() <= thresholdInterval) {
|
||||||
worksource.add(record.mReceiver.mUid);
|
worksource.add(record.mReceiver.mUid);
|
||||||
@ -1223,7 +1247,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
oldRecord.disposeLocked(false);
|
oldRecord.disposeLocked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isProviderEnabled = isAllowedBySettingsLocked(name, UserHandle.getUserId(uid));
|
boolean isProviderEnabled = isAllowedBySettingsLocked(name, uid);
|
||||||
if (isProviderEnabled) {
|
if (isProviderEnabled) {
|
||||||
applyRequirementsLocked(name);
|
applyRequirementsLocked(name);
|
||||||
} else {
|
} else {
|
||||||
@ -1278,9 +1302,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update provider
|
// update provider
|
||||||
|
int currentUidBase = getCurrentUidBaseLocked();
|
||||||
for (String provider : providers) {
|
for (String provider : providers) {
|
||||||
// If provider is already disabled, don't need to do anything
|
// If provider is already disabled, don't need to do anything
|
||||||
if (!isAllowedBySettingsLocked(provider, mCurrentUserId)) {
|
if (!isAllowedBySettingsLocked(provider, currentUidBase)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1298,7 +1323,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
request.getProvider());
|
request.getProvider());
|
||||||
// no need to sanitize this request, as only the provider name is used
|
// no need to sanitize this request, as only the provider name is used
|
||||||
|
|
||||||
long identity = Binder.clearCallingIdentity();
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
final long identity = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
if (mBlacklist.isBlacklisted(packageName)) {
|
if (mBlacklist.isBlacklisted(packageName)) {
|
||||||
if (D) Log.d(TAG, "not returning last loc for blacklisted app: " +
|
if (D) Log.d(TAG, "not returning last loc for blacklisted app: " +
|
||||||
@ -1314,7 +1340,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
LocationProviderInterface provider = mProvidersByName.get(name);
|
LocationProviderInterface provider = mProvidersByName.get(name);
|
||||||
if (provider == null) return null;
|
if (provider == null) return null;
|
||||||
|
|
||||||
if (!isAllowedBySettingsLocked(name, mCurrentUserId)) return null;
|
if (!isAllowedBySettingsLocked(name, callingUid)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Location location = mLastLocation.get(name);
|
Location location = mLastLocation.get(name);
|
||||||
if (location == null) {
|
if (location == null) {
|
||||||
@ -1471,13 +1499,14 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
provider);
|
provider);
|
||||||
if (LocationManager.FUSED_PROVIDER.equals(provider)) return false;
|
if (LocationManager.FUSED_PROVIDER.equals(provider)) return false;
|
||||||
|
|
||||||
long identity = Binder.clearCallingIdentity();
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
final long identity = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
LocationProviderInterface p = mProvidersByName.get(provider);
|
LocationProviderInterface p = mProvidersByName.get(provider);
|
||||||
if (p == null) return false;
|
if (p == null) return false;
|
||||||
|
|
||||||
return isAllowedBySettingsLocked(provider, mCurrentUserId);
|
return isAllowedBySettingsLocked(provider, callingUid);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(identity);
|
Binder.restoreCallingIdentity(identity);
|
||||||
@ -1616,10 +1645,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
Receiver receiver = r.mReceiver;
|
Receiver receiver = r.mReceiver;
|
||||||
boolean receiverDead = false;
|
boolean receiverDead = false;
|
||||||
|
|
||||||
int receiverUserId = UserHandle.getUserId(receiver.mUid);
|
final int receiverUid = receiver.mUid;
|
||||||
if (receiverUserId != mCurrentUserId) {
|
if (!isCurrentUserOrSystemLocked(receiverUid)) {
|
||||||
if (D) {
|
if (D) {
|
||||||
Log.d(TAG, "skipping loc update for background user " + receiverUserId +
|
Log.d(TAG, "skipping loc update for background uid " + receiverUid +
|
||||||
" (current user: " + mCurrentUserId + ", app: " +
|
" (current user: " + mCurrentUserId + ", app: " +
|
||||||
receiver.mPackageName + ")");
|
receiver.mPackageName + ")");
|
||||||
}
|
}
|
||||||
@ -1716,7 +1745,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run
|
|||||||
}
|
}
|
||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
if (isAllowedBySettingsLocked(provider, mCurrentUserId)) {
|
if (isAllowedBySettingsLocked(provider, getCurrentUidBaseLocked())) {
|
||||||
handleLocationChangedLocked(location, passive);
|
handleLocationChangedLocked(location, passive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user