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

Commit eb004b86 authored by Chen Bai's avatar Chen Bai Committed by Android (Google) Code Review
Browse files

Merge "do wom: DisplayOffload hook to DisplayManager" into main

parents 948da5df fc965acc
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -698,4 +698,34 @@ public abstract class DisplayManagerInternal {
            return "AmbientLightSensorData(" + sensorName + ", " + sensorType + ")";
        }
    }

    /**
     * Associate a internal display to a {@link DisplayOffloader}.
     *
     * @param displayId the id of the internal display.
     * @param displayOffloader the {@link DisplayOffloader} that controls offloading ops of internal
     *                         display whose id is displayId.
     * @return a {@link DisplayOffloadSession} associated with given displayId and displayOffloader.
     */
    public abstract DisplayOffloadSession registerDisplayOffloader(
            int displayId, DisplayOffloader displayOffloader);

    /** The callbacks that controls the entry & exit of display offloading. */
    public interface DisplayOffloader {
        boolean startOffload();

        void stopOffload();
    }

    /** A session token that associates a internal display with a {@link DisplayOffloader}. */
    public interface DisplayOffloadSession {
        /** Provide the display state to use in place of state DOZE. */
        void setDozeStateOverride(int displayState);
        /** Returns the associated DisplayOffloader. */
        DisplayOffloader getDisplayOffloader();
        /** Returns whether displayoffload supports the given display state. */
        static boolean isSupportedOffloadState(int displayState) {
            return Display.isSuspendedState(displayState);
        }
    }
}
+19 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayViewport;
import android.os.IBinder;
import android.util.Slog;
@@ -205,6 +206,24 @@ abstract class DisplayDevice {
     */
    public Runnable requestDisplayStateLocked(int state, float brightnessState,
            float sdrBrightnessState) {
        return requestDisplayStateLocked(state, brightnessState, sdrBrightnessState, null);
    }

    /**
     * Sets the display state, if supported.
     *
     * @param state The new display state.
     * @param brightnessState The new display brightnessState.
     * @param sdrBrightnessState The new display brightnessState for SDR layers.
     * @param displayOffloadSession {@link DisplayOffloadSession} associated with current device.
     * @return A runnable containing work to be deferred until after we have exited the critical
     *     section, or null if none.
     */
    public Runnable requestDisplayStateLocked(
            int state,
            float brightnessState,
            float sdrBrightnessState,
            @Nullable DisplayManagerInternal.DisplayOffloadSession displayOffloadSession) {
        return null;
    }

+53 −6
Original line number Diff line number Diff line
@@ -1772,7 +1772,7 @@ public final class DisplayManagerService extends SystemService {
        synchronized (mSyncRoot) {
            // main display adapter
            registerDisplayAdapterLocked(mInjector.getLocalDisplayAdapter(mSyncRoot, mContext,
                    mHandler, mDisplayDeviceRepo));
                    mHandler, mDisplayDeviceRepo, mFlags));

            // Standalone VR devices rely on a virtual display as their primary display for
            // 2D UI. We register virtual display adapter along side the main display adapter
@@ -2093,8 +2093,11 @@ public final class DisplayManagerService extends SystemService {
            // Only send a request for display state if display state has already been initialized.
            if (state != Display.STATE_UNKNOWN) {
                final BrightnessPair brightnessPair = mDisplayBrightnesses.get(displayId);
                return device.requestDisplayStateLocked(state, brightnessPair.brightness,
                        brightnessPair.sdrBrightness);
                return device.requestDisplayStateLocked(
                        state,
                        brightnessPair.brightness,
                        brightnessPair.sdrBrightness,
                        display.getDisplayOffloadSessionLocked());
            }
        }
        return null;
@@ -3183,9 +3186,10 @@ public final class DisplayManagerService extends SystemService {
        }

        LocalDisplayAdapter getLocalDisplayAdapter(SyncRoot syncRoot, Context context,
                                                   Handler handler,
                                                   DisplayAdapter.Listener displayAdapterListener) {
            return new LocalDisplayAdapter(syncRoot, context, handler, displayAdapterListener);
                Handler handler, DisplayAdapter.Listener displayAdapterListener,
                DisplayManagerFlags flags) {
            return new LocalDisplayAdapter(syncRoot, context, handler, displayAdapterListener,
                    flags);
        }

        long getDefaultDisplayDelayTimeout() {
@@ -4806,6 +4810,49 @@ public final class DisplayManagerService extends SystemService {
            }
            return displayGroupIds;
        }

        @Override
        public DisplayManagerInternal.DisplayOffloadSession registerDisplayOffloader(
                int displayId, @NonNull DisplayManagerInternal.DisplayOffloader displayOffloader) {
            if (!mFlags.isDisplayOffloadEnabled()) {
                return null;
            }
            synchronized (mSyncRoot) {
                LogicalDisplay logicalDisplay = mLogicalDisplayMapper.getDisplayLocked(displayId);
                if (logicalDisplay == null) {
                    Slog.w(TAG, "registering DisplayOffloader: LogicalDisplay for displayId="
                            + displayId + " is not found. No Op.");
                    return null;
                }

                DisplayPowerControllerInterface displayPowerController =
                        mDisplayPowerControllers.get(logicalDisplay.getDisplayIdLocked());
                if (displayPowerController == null) {
                    Slog.w(TAG,
                            "setting doze state override: DisplayPowerController for displayId="
                                    + displayId + " is unavailable. No Op.");
                    return null;
                }

                DisplayOffloadSession session =
                        new DisplayOffloadSession() {
                            @Override
                            public void setDozeStateOverride(int displayState) {
                                synchronized (mSyncRoot) {
                                    displayPowerController.overrideDozeScreenState(displayState);
                                }
                            }

                            @Override
                            public DisplayOffloader getDisplayOffloader() {
                                return displayOffloader;
                            }
                        };
                logicalDisplay.setDisplayOffloadSessionLocked(session);
                displayPowerController.setDisplayOffloadSession(session);
                return session;
            }
        }
    }

    class DesiredDisplayModeSpecsObserver
+23 −1
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import android.hardware.display.AmbientBrightnessDayStats;
import android.hardware.display.BrightnessChangeEvent;
import android.hardware.display.BrightnessConfiguration;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession;
import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
import android.metrics.LogMaker;
@@ -588,8 +590,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            new SparseArray<>();

    private boolean mBootCompleted;

    private final DisplayManagerFlags mFlags;
    private int mDozeStateOverride = Display.STATE_UNKNOWN;
    private DisplayManagerInternal.DisplayOffloadSession mDisplayOffloadSession;

    /**
     * Creates the display power controller.
@@ -956,6 +959,23 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        }
    }

    @Override
    public void overrideDozeScreenState(int displayState) {
        synchronized (mLock) {
            if (mDisplayOffloadSession == null ||
                    !DisplayOffloadSession.isSupportedOffloadState(displayState)) {
                return;
            }
            mDozeStateOverride = displayState;
            sendUpdatePowerState();
        }
    }

    @Override
    public void setDisplayOffloadSession(DisplayOffloadSession session) {
        mDisplayOffloadSession = session;
    }

    @Override
    public BrightnessConfiguration getDefaultBrightnessConfiguration() {
        if (mAutomaticBrightnessController == null) {
@@ -1518,6 +1538,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                } else {
                    state = Display.STATE_DOZE;
                }
                state = mDozeStateOverride == Display.STATE_UNKNOWN ? state : mDozeStateOverride;
                if (!mAllowAutoBrightnessWhileDozingConfig) {
                    brightnessState = mPowerRequest.dozeScreenBrightness;
                    mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE);
@@ -3001,6 +3022,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            pw.println("  mLeadDisplayId=" + mLeadDisplayId);
            pw.println("  mLightSensor=" + mLightSensor);
            pw.println("  mDisplayBrightnessFollowers=" + mDisplayBrightnessFollowers);
            pw.println("  mDozeStateOverride=" + mDozeStateOverride);

            pw.println();
            pw.println("Display Power Controller Locked State:");
+38 −14
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import android.hardware.display.AmbientBrightnessDayStats;
import android.hardware.display.BrightnessChangeEvent;
import android.hardware.display.BrightnessConfiguration;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayOffloadSession;
import android.hardware.display.DisplayManagerInternal.DisplayPowerCallbacks;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
import android.metrics.LogMaker;
@@ -470,9 +472,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
            new SparseArray();

    private boolean mBootCompleted;

    private final DisplayManagerFlags mFlags;

    private DisplayManagerInternal.DisplayOffloadSession mDisplayOffloadSession;

    /**
     * Creates the display power controller.
     */
@@ -588,7 +591,9 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal

        if (mDisplayId == Display.DEFAULT_DISPLAY) {
            mCdsi = LocalServices.getService(ColorDisplayServiceInternal.class);
            boolean active = mCdsi.setReduceBrightColorsListener(new ReduceBrightColorsListener() {
            if (mCdsi != null) {
                boolean active = mCdsi.setReduceBrightColorsListener(
                        new ReduceBrightColorsListener() {
                            @Override
                            public void onReduceBrightColorsActivationChanged(boolean activated,
                                    boolean userInitiated) {
@@ -604,6 +609,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                if (active) {
                    applyReduceBrightColorsSplineAdjustment();
                }
            }
        } else {
            mCdsi = null;
        }
@@ -759,6 +765,24 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        }
    }

    @Override
    public void overrideDozeScreenState(int displayState) {
        mHandler.postAtTime(() -> {
            if (mDisplayOffloadSession == null
                    || !(DisplayOffloadSession.isSupportedOffloadState(displayState)
                    || displayState == Display.STATE_UNKNOWN)) {
                return;
            }
            mDisplayStateController.overrideDozeScreenState(displayState);
            sendUpdatePowerState();
        }, mClock.uptimeMillis());
    }

    @Override
    public void setDisplayOffloadSession(DisplayOffloadSession session) {
        mDisplayOffloadSession = session;
    }

    @Override
    public BrightnessConfiguration getDefaultBrightnessConfiguration() {
        if (mAutomaticBrightnessController == null) {
Loading