Merge "Fix early registration problem" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
742862492c
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class SystemScreenInteractiveHelper extends ScreenInteractiveHelper {
|
||||
mReady = true;
|
||||
}
|
||||
|
||||
private void onScreenInteractiveChanged(boolean interactive) {
|
||||
void onScreenInteractiveChanged(boolean interactive) {
|
||||
if (interactive == mIsInteractive) {
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user