diff options
| author | 2021-02-17 12:21:37 -0800 | |
|---|---|---|
| committer | 2021-02-17 12:21:37 -0800 | |
| commit | 7ea2a7e1cb58d4da8c800a1fff28a0a96949d5e3 (patch) | |
| tree | c9484ed9f7e72234346c63da5d91661c4388b47a | |
| parent | 66fa53a95383412e801a4ae08a0f1de106846ecd (diff) | |
Fix early registration problem
SystemDeviceIdleHelper was attempting to interact with the system before
it was ready.
Bug: 180445021
Test: atest android.webkit.cts.GeolocationTest
Change-Id: I27c68f9a80124c314485fc8b053c6eb2dc423abc
4 files changed, 74 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index 5eec315aa51c..6deb19a53629 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -1424,6 +1424,8 @@ public class LocationManagerService extends ILocationManager.Stub { mAppForegroundHelper.onSystemReady(); mLocationPowerSaveModeHelper.onSystemReady(); mScreenInteractiveHelper.onSystemReady(); + mDeviceStationaryHelper.onSystemReady(); + mDeviceIdleHelper.onSystemReady(); if (mEmergencyCallHelper != null) { mEmergencyCallHelper.onSystemReady(); diff --git a/services/core/java/com/android/server/location/injector/SystemDeviceIdleHelper.java b/services/core/java/com/android/server/location/injector/SystemDeviceIdleHelper.java index 6a89079d81ba..736b65484de6 100644 --- a/services/core/java/com/android/server/location/injector/SystemDeviceIdleHelper.java +++ b/services/core/java/com/android/server/location/injector/SystemDeviceIdleHelper.java @@ -21,50 +21,80 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.Binder; import android.os.PowerManager; +import com.android.internal.util.Preconditions; import com.android.server.FgThread; +import java.util.Objects; + /** * Provides accessors and listeners for device stationary state. */ public class SystemDeviceIdleHelper extends DeviceIdleHelper { private final Context mContext; - private final PowerManager mPowerManager; + private PowerManager mPowerManager; + + private boolean mSystemReady; + private boolean mRegistrationRequired; private @Nullable BroadcastReceiver mReceiver; public SystemDeviceIdleHelper(Context context) { mContext = context; - mPowerManager = context.getSystemService(PowerManager.class); } - @Override - protected void registerInternal() { - if (mReceiver == null) { - mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - notifyDeviceIdleChanged(); - } - }; + public synchronized void onSystemReady() { + mSystemReady = true; + mPowerManager = Objects.requireNonNull(mContext.getSystemService(PowerManager.class)); + onRegistrationStateChanged(); + } - mContext.registerReceiver(mReceiver, - new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED), null, - FgThread.getHandler()); - } + @Override + protected synchronized void registerInternal() { + mRegistrationRequired = true; + onRegistrationStateChanged(); } @Override - protected void unregisterInternal() { - if (mReceiver != null) { - mContext.unregisterReceiver(mReceiver); + protected synchronized void unregisterInternal() { + mRegistrationRequired = false; + onRegistrationStateChanged(); + } + + private void onRegistrationStateChanged() { + if (!mSystemReady) { + return; + } + + final long identity = Binder.clearCallingIdentity(); + try { + if (mRegistrationRequired && mReceiver == null) { + BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + notifyDeviceIdleChanged(); + } + }; + mContext.registerReceiver(receiver, + new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED), null, + FgThread.getHandler()); + mReceiver = receiver; + } else if (!mRegistrationRequired && mReceiver != null) { + BroadcastReceiver receiver = mReceiver; + mReceiver = null; + mContext.unregisterReceiver(receiver); + } + } finally { + Binder.restoreCallingIdentity(identity); } } @Override public boolean isDeviceIdle() { + Preconditions.checkState(mPowerManager != null); return mPowerManager.isDeviceIdleMode(); } } diff --git a/services/core/java/com/android/server/location/injector/SystemDeviceStationaryHelper.java b/services/core/java/com/android/server/location/injector/SystemDeviceStationaryHelper.java index 6f0e681b808f..9874ecfdefdf 100644 --- a/services/core/java/com/android/server/location/injector/SystemDeviceStationaryHelper.java +++ b/services/core/java/com/android/server/location/injector/SystemDeviceStationaryHelper.java @@ -16,6 +16,9 @@ package com.android.server.location.injector; +import android.os.Binder; + +import com.android.internal.util.Preconditions; import com.android.server.DeviceIdleInternal; import com.android.server.LocalServices; @@ -26,19 +29,35 @@ import java.util.Objects; */ public class SystemDeviceStationaryHelper extends DeviceStationaryHelper { - private final DeviceIdleInternal mDeviceIdle; + private DeviceIdleInternal mDeviceIdle; + + public SystemDeviceStationaryHelper() {} - public SystemDeviceStationaryHelper() { + public void onSystemReady() { mDeviceIdle = Objects.requireNonNull(LocalServices.getService(DeviceIdleInternal.class)); } @Override public void addListener(DeviceIdleInternal.StationaryListener listener) { - mDeviceIdle.registerStationaryListener(listener); + Preconditions.checkState(mDeviceIdle != null); + + long identity = Binder.clearCallingIdentity(); + try { + mDeviceIdle.registerStationaryListener(listener); + } finally { + Binder.restoreCallingIdentity(identity); + } } @Override public void removeListener(DeviceIdleInternal.StationaryListener listener) { - mDeviceIdle.unregisterStationaryListener(listener); + Preconditions.checkState(mDeviceIdle != null); + + long identity = Binder.clearCallingIdentity(); + try { + mDeviceIdle.unregisterStationaryListener(listener); + } finally { + Binder.restoreCallingIdentity(identity); + } } } diff --git a/services/core/java/com/android/server/location/injector/SystemScreenInteractiveHelper.java b/services/core/java/com/android/server/location/injector/SystemScreenInteractiveHelper.java index 0d7bcb049f15..03ade5f2abd8 100644 --- a/services/core/java/com/android/server/location/injector/SystemScreenInteractiveHelper.java +++ b/services/core/java/com/android/server/location/injector/SystemScreenInteractiveHelper.java @@ -68,7 +68,7 @@ public class SystemScreenInteractiveHelper extends ScreenInteractiveHelper { mReady = true; } - private void onScreenInteractiveChanged(boolean interactive) { + void onScreenInteractiveChanged(boolean interactive) { if (interactive == mIsInteractive) { return; } |