Merge "Fix early registration problem" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-02-17 22:03:01 +00:00
committed by Android (Google) Code Review
4 changed files with 74 additions and 23 deletions

View File

@@ -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();

View File

@@ -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);
}
public synchronized void onSystemReady() {
mSystemReady = true;
mPowerManager = Objects.requireNonNull(mContext.getSystemService(PowerManager.class));
onRegistrationStateChanged();
}
@Override
protected void registerInternal() {
if (mReceiver == null) {
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
notifyDeviceIdleChanged();
}
};
protected synchronized void registerInternal() {
mRegistrationRequired = true;
onRegistrationStateChanged();
}
mContext.registerReceiver(mReceiver,
new IntentFilter(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED), null,
FgThread.getHandler());
@Override
protected synchronized void unregisterInternal() {
mRegistrationRequired = false;
onRegistrationStateChanged();
}
private void onRegistrationStateChanged() {
if (!mSystemReady) {
return;
}
}
@Override
protected void unregisterInternal() {
if (mReceiver != null) {
mContext.unregisterReceiver(mReceiver);
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();
}
}

View File

@@ -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);
}
}
}

View File

@@ -68,7 +68,7 @@ public class SystemScreenInteractiveHelper extends ScreenInteractiveHelper {
mReady = true;
}
private void onScreenInteractiveChanged(boolean interactive) {
void onScreenInteractiveChanged(boolean interactive) {
if (interactive == mIsInteractive) {
return;
}