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

Commit 4a950ec9 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[CS] Have PowerUI listen for VR mode changes directly.

Bug: 277764509
Test: smoke test of power menu
Test: atest PowerUITest
Change-Id: Ib51a54e8cf387e7cfdad2886d1015b4b5b010697
parent b5e861ee
Loading
Loading
Loading
Loading
+32 −14
Original line number Diff line number Diff line
@@ -35,11 +35,14 @@ import android.os.SystemClock;
import android.os.Temperature;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.text.format.DateUtils;
import android.util.Log;
import android.util.Slog;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.fuelgauge.Estimate;
@@ -51,17 +54,13 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.CentralSurfaces;

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Optional;
import java.util.concurrent.Future;

import javax.inject.Inject;

import dagger.Lazy;

@SysUISingleton
public class PowerUI implements CoreStartable, CommandQueue.Callbacks {

@@ -107,12 +106,15 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
    @VisibleForTesting int mBatteryLevel = 100;
    @VisibleForTesting int mBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN;

    private boolean mInVrMode;

    private IThermalEventListener mSkinThermalEventListener;
    private IThermalEventListener mUsbThermalEventListener;
    private final Context mContext;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final CommandQueue mCommandQueue;
    private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
    @Nullable
    private final IVrManager mVrManager;
    private final WakefulnessLifecycle.Observer mWakefulnessObserver =
            new WakefulnessLifecycle.Observer() {
                @Override
@@ -134,17 +136,28 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
                }
            };

    private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
        @Override
        public void onVrStateChanged(boolean enabled) {
            mInVrMode = enabled;
        }
    };

    @Inject
    public PowerUI(Context context, BroadcastDispatcher broadcastDispatcher,
            CommandQueue commandQueue, Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
            WarningsUI warningsUI, EnhancedEstimates enhancedEstimates,
    public PowerUI(
            Context context,
            BroadcastDispatcher broadcastDispatcher,
            CommandQueue commandQueue,
            @Nullable IVrManager vrManager,
            WarningsUI warningsUI,
            EnhancedEstimates enhancedEstimates,
            WakefulnessLifecycle wakefulnessLifecycle,
            PowerManager powerManager,
            UserTracker userTracker) {
        mContext = context;
        mBroadcastDispatcher = broadcastDispatcher;
        mCommandQueue = commandQueue;
        mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy;
        mVrManager = vrManager;
        mWarnings = warningsUI;
        mEnhancedEstimates = enhancedEstimates;
        mPowerManager = powerManager;
@@ -199,6 +212,14 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
                });
        initThermalEventListeners();
        mCommandQueue.addCallback(this);

        if (mVrManager != null) {
            try {
                mVrManager.registerListener(mVrStateCallbacks);
            } catch (RemoteException e) {
                Slog.e(TAG, "Failed to register VR mode state listener: " + e);
            }
        }
    }

    @Override
@@ -718,10 +739,7 @@ public class PowerUI implements CoreStartable, CommandQueue.Callbacks {
            int status = temp.getStatus();

            if (status >= Temperature.THROTTLING_EMERGENCY) {
                final Optional<CentralSurfaces> centralSurfacesOptional =
                        mCentralSurfacesOptionalLazy.get();
                if (!centralSurfacesOptional.map(CentralSurfaces::isDeviceInVrMode)
                        .orElse(false)) {
                if (!mInVrMode) {
                    mWarnings.showHighTemperatureWarning();
                    Slog.d(TAG, "SkinThermalEventListener: notifyThrottling was called "
                            + ", current skin status = " + status
+0 −2
Original line number Diff line number Diff line
@@ -200,8 +200,6 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner {

    void onKeyguardViewManagerStatesUpdated();

    boolean isDeviceInVrMode();

    NotificationPresenter getPresenter();

    /**
+0 −1
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ abstract class CentralSurfacesEmptyImpl : CentralSurfaces {
    override fun getKeyguardMessageArea(): AuthKeyguardMessageArea? = null
    override fun isLaunchingActivityOverLockscreen() = false
    override fun onKeyguardViewManagerStatesUpdated() {}
    override fun isDeviceInVrMode() = false
    override fun getPresenter(): NotificationPresenter? = null
    override fun onInputFocusTransfer(start: Boolean, cancel: Boolean, velocity: Float) {}
    override fun getCommandQueuePanelsEnabled() = false
+0 −5
Original line number Diff line number Diff line
@@ -1666,11 +1666,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
        logStateToEventlog();
    }

    @Override
    public boolean isDeviceInVrMode() {
        return mPresenter.isDeviceInVrMode();
    }

    @Override
    public NotificationPresenter getPresenter() {
        return mPresenter;
+29 −10
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ import android.os.IThermalService;
import android.os.PowerManager;
import android.os.Temperature;
import android.provider.Settings;
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -50,20 +52,17 @@ import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.power.PowerUI.WarningsUI;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.CentralSurfaces;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.time.Duration;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

import dagger.Lazy;

@RunWith(AndroidTestingRunner.class)
@RunWithLooper
@SmallTest
@@ -93,15 +92,12 @@ public class PowerUITest extends SysuiTestCase {
    private IThermalEventListener mSkinThermalEventListener;
    @Mock private BroadcastDispatcher mBroadcastDispatcher;
    @Mock private CommandQueue mCommandQueue;
    @Mock private Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
    @Mock private CentralSurfaces mCentralSurfaces;
    @Mock private IVrManager mVrManager;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

        when(mCentralSurfacesOptionalLazy.get()).thenReturn(Optional.of(mCentralSurfaces));

        createPowerUi();
        mSkinThermalEventListener = mPowerUI.new SkinThermalEventListener();
        mUsbThermalEventListener = mPowerUI.new UsbThermalEventListener();
@@ -142,6 +138,23 @@ public class PowerUITest extends SysuiTestCase {
        verify(mMockWarnings, never()).dismissHighTemperatureWarning();
    }

    @Test
    public void testSkinWarning_throttlingEmergency_butVrMode() throws Exception {
        mPowerUI.start();

        ArgumentCaptor<IVrStateCallbacks> vrCallback =
                ArgumentCaptor.forClass(IVrStateCallbacks.class);
        verify(mVrManager).registerListener(vrCallback.capture());

        vrCallback.getValue().onVrStateChanged(true);
        final Temperature temp = getEmergencyStatusTemp(Temperature.TYPE_SKIN, "skin2");
        mSkinThermalEventListener.notifyThrottling(temp);

        TestableLooper.get(this).processAllMessages();
        // don't show skin high temperature warning when in VR mode
        verify(mMockWarnings, never()).showHighTemperatureWarning();
    }

    @Test
    public void testUsbAlarm_throttlingCritical() throws Exception {
        mPowerUI.start();
@@ -683,8 +696,14 @@ public class PowerUITest extends SysuiTestCase {

    private void createPowerUi() {
        mPowerUI = new PowerUI(
                mContext, mBroadcastDispatcher, mCommandQueue, mCentralSurfacesOptionalLazy,
                mMockWarnings, mEnhancedEstimates, mWakefulnessLifecycle, mPowerManager,
                mContext,
                mBroadcastDispatcher,
                mCommandQueue,
                mVrManager,
                mMockWarnings,
                mEnhancedEstimates,
                mWakefulnessLifecycle,
                mPowerManager,
                mUserTracker);
        mPowerUI.mThermalService = mThermalServiceMock;
    }