DO NOT MERGE Prevent isEnabled from mutating state am: ff147d5052

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13008998

Change-Id: I8c441d5aac6d3ba8e7295e4d53fa661f0259e940
This commit is contained in:
Soonil Nagarkar
2020-11-09 23:26:19 +00:00
committed by Automerger Merge Worker

View File

@@ -906,9 +906,26 @@ public class LocationManagerService extends ILocationManager.Stub {
if (enabled == null) {
// this generally shouldn't occur, but might be possible due to race conditions
// on when we are notified of new users
// hack to fix b/171910679. mutating the user enabled state within this method
// may cause unexpected changes to other state (for instance, this could cause
// provider enable/disable notifications to be sent to clients, which could
// result in a dead client being detected, which could result in the client
// being removed, which means that if this function is called while clients are
// being iterated over we have now unexpectedly mutated the iterated
// collection). instead, we return a correct value immediately here, and
// schedule the actual update for later. this has been completely rewritten and
// is no longer a problem in the next version of android.
enabled = mProvider.getState().allowed
&& mUserInfoHelper.isCurrentUserId(userId)
&& mSettingsHelper.isLocationEnabled(userId);
Log.w(TAG, mName + " provider saw user " + userId + " unexpectedly");
onEnabledChangedLocked(userId);
enabled = Objects.requireNonNull(mEnabled.get(userId));
mHandler.post(() -> {
synchronized (mLock) {
onEnabledChangedLocked(userId);
}
});
}
return enabled;