Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7ea2a7e1 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

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
parent 66fa53a9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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();
+48 −18
Original line number Diff line number Diff line
@@ -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() {
    protected synchronized void registerInternal() {
        mRegistrationRequired = true;
        onRegistrationStateChanged();
    }

    @Override
    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(mReceiver,
                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);
            }
    }

    @Override
    protected void unregisterInternal() {
        if (mReceiver != null) {
            mContext.unregisterReceiver(mReceiver);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
    }

    @Override
    public boolean isDeviceIdle() {
        Preconditions.checkState(mPowerManager != null);
        return mPowerManager.isDeviceIdleMode();
    }
}
+23 −4
Original line number Diff line number Diff line
@@ -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) {
        Preconditions.checkState(mDeviceIdle != null);

        long identity = Binder.clearCallingIdentity();
        try {
            mDeviceIdle.registerStationaryListener(listener);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
    }

    @Override
    public void removeListener(DeviceIdleInternal.StationaryListener listener) {
        Preconditions.checkState(mDeviceIdle != null);

        long identity = Binder.clearCallingIdentity();
        try {
            mDeviceIdle.unregisterStationaryListener(listener);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ public class SystemScreenInteractiveHelper extends ScreenInteractiveHelper {
        mReady = true;
    }

    private void onScreenInteractiveChanged(boolean interactive) {
    void onScreenInteractiveChanged(boolean interactive) {
        if (interactive == mIsInteractive) {
            return;
        }