summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Soonil Nagarkar <sooniln@google.com> 2021-02-17 12:21:37 -0800
committer Soonil Nagarkar <sooniln@google.com> 2021-02-17 12:21:37 -0800
commit7ea2a7e1cb58d4da8c800a1fff28a0a96949d5e3 (patch)
treec9484ed9f7e72234346c63da5d91661c4388b47a
parent66fa53a95383412e801a4ae08a0f1de106846ecd (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
-rw-r--r--services/core/java/com/android/server/location/LocationManagerService.java2
-rw-r--r--services/core/java/com/android/server/location/injector/SystemDeviceIdleHelper.java66
-rw-r--r--services/core/java/com/android/server/location/injector/SystemDeviceStationaryHelper.java27
-rw-r--r--services/core/java/com/android/server/location/injector/SystemScreenInteractiveHelper.java2
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;
}