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

Commit e94e6400 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

VirtualDisplay API for brightness callback and default.

Any rate limiting will essentially result in the wrong brightness
passed to the display owner. The callback is ONLY invoked if the
display has an explicit default brightness, in practice there will
only be 1-2 such displays at a time.

Bug: 285020111
Test: presubmit
Test: CTS
Flag: android.companion.virtualdevice.flags.device_aware_display_power
Change-Id: Ie991cfc9a85cbd6711d6c67a6ae5b51ac35f2f59
parent 7c65d920
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -5293,13 +5293,19 @@ package android.hardware.display {
    field public static final int VIRTUAL_DISPLAY_FLAG_TRUSTED = 1024; // 0x400
  }
  public abstract static class VirtualDisplay.Callback {
    method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") public void onRequestedBrightnessChanged(@FloatRange(from=0.0f, to=1.0f) float);
  }
  public final class VirtualDisplayConfig implements android.os.Parcelable {
    method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @FloatRange(from=0.0f, to=1.0f) public float getDefaultBrightness();
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_display_insets") @Nullable public android.view.DisplayCutout getDisplayCutout();
    method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") public boolean isHomeSupported();
    method @FlaggedApi("com.android.window.flags.vdm_force_app_universal_resizable_api") public boolean isIgnoreActivitySizeRestrictions();
  }
  public static final class VirtualDisplayConfig.Builder {
    method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDefaultBrightness(@FloatRange(from=0.0f, to=1.0f) float);
    method @FlaggedApi("android.companion.virtualdevice.flags.virtual_display_insets") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDisplayCutout(@Nullable android.view.DisplayCutout);
    method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setHomeSupported(boolean);
    method @FlaggedApi("com.android.window.flags.vdm_force_app_universal_resizable_api") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setIgnoreActivitySizeRestrictions(boolean);
+7 −0
Original line number Diff line number Diff line
@@ -1432,6 +1432,13 @@ public final class DisplayManagerGlobal {
                mExecutor.execute(mCallback::onStopped);
            }
        }

        @Override // Binder call
        public void onRequestedBrightnessChanged(float brightness) {
            if (mCallback != null) {
                mExecutor.execute(() -> mCallback.onRequestedBrightnessChanged(brightness));
            }
        }
    }

    /**
+5 −0
Original line number Diff line number Diff line
@@ -38,4 +38,9 @@ oneway interface IVirtualDisplayCallback {
     * of the application to release() the virtual display.
     */
    void onStopped();

    /**
     * Called when the virtual display's requested brightness has changed.
     */
    void onRequestedBrightnessChanged(float brightness);
}
+22 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
package android.hardware.display;

import android.annotation.FlaggedApi;
import android.annotation.FloatRange;
import android.annotation.SystemApi;
import android.view.Display;
import android.view.Surface;

@@ -164,5 +166,25 @@ public final class VirtualDisplay {
         * of the application to release() the virtual display.
         */
        public void onStopped() { }

        /**
         * Called when the requested brightness of the display has changed.
         *
         * <p>The system may adjust the display's brightness based on user or app activity. This
         * callback will only be invoked if the display has an explicitly specified default
         * brightness value.</p>
         *
         * <p>Value of {@code 0.0} indicates the minimum supported brightness and value of
         * {@code 1.0} indicates the maximum supported brightness.</p>
         *
         * @see android.view.View#setKeepScreenOn(boolean)
         * @see android.view.WindowManager.LayoutParams#screenBrightness
         * @see VirtualDisplayConfig.Builder#setDefaultBrightness(float)
         * @hide
         */
        @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER)
        @SystemApi
        public void onRequestedBrightnessChanged(
                @FloatRange(from = 0.0f, to = 1.0f) float brightness) {}
    }
}
+59 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.media.projection.MediaProjection;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PowerManager;
import android.util.ArraySet;
import android.view.Display;
import android.view.DisplayCutout;
@@ -61,6 +62,7 @@ public final class VirtualDisplayConfig implements Parcelable {
    private final boolean mIsHomeSupported;
    private final DisplayCutout mDisplayCutout;
    private final boolean mIgnoreActivitySizeRestrictions;
    private final float mDefaultBrightness;

    private VirtualDisplayConfig(
            @NonNull String name,
@@ -76,7 +78,8 @@ public final class VirtualDisplayConfig implements Parcelable {
            float requestedRefreshRate,
            boolean isHomeSupported,
            @Nullable DisplayCutout displayCutout,
            boolean ignoreActivitySizeRestrictions) {
            boolean ignoreActivitySizeRestrictions,
            @FloatRange(from = 0.0f, to = 1.0f) float defaultBrightness) {
        mName = name;
        mWidth = width;
        mHeight = height;
@@ -91,6 +94,7 @@ public final class VirtualDisplayConfig implements Parcelable {
        mIsHomeSupported = isHomeSupported;
        mDisplayCutout = displayCutout;
        mIgnoreActivitySizeRestrictions = ignoreActivitySizeRestrictions;
        mDefaultBrightness = defaultBrightness;
    }

    /**
@@ -156,6 +160,22 @@ public final class VirtualDisplayConfig implements Parcelable {
        return mDisplayCutout;
    }

    /**
     * Returns the default brightness of the display.
     *
     * <p>Value of {@code 0.0} indicates the minimum supported brightness and value of {@code 1.0}
     * indicates the maximum supported brightness.</p>
     *
     * @see Builder#setDefaultBrightness(float)
     * @hide
     */
    @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER)
    @SystemApi
    public @FloatRange(from = 0.0f, to = 1.0f) float getDefaultBrightness() {
        return mDefaultBrightness;
    }


    /**
     * Returns the unique identifier for the display. Shouldn't be displayed to the user.
     * @hide
@@ -245,6 +265,7 @@ public final class VirtualDisplayConfig implements Parcelable {
        dest.writeBoolean(mIsHomeSupported);
        DisplayCutout.ParcelableWrapper.writeCutoutToParcel(mDisplayCutout, dest, flags);
        dest.writeBoolean(mIgnoreActivitySizeRestrictions);
        dest.writeFloat(mDefaultBrightness);
    }

    @Override
@@ -272,7 +293,8 @@ public final class VirtualDisplayConfig implements Parcelable {
                && mRequestedRefreshRate == that.mRequestedRefreshRate
                && mIsHomeSupported == that.mIsHomeSupported
                && mIgnoreActivitySizeRestrictions == that.mIgnoreActivitySizeRestrictions
                && Objects.equals(mDisplayCutout, that.mDisplayCutout);
                && Objects.equals(mDisplayCutout, that.mDisplayCutout)
                && mDefaultBrightness == that.mDefaultBrightness;
    }

    @Override
@@ -281,7 +303,7 @@ public final class VirtualDisplayConfig implements Parcelable {
                mName, mWidth, mHeight, mDensityDpi, mFlags, mSurface, mUniqueId,
                mDisplayIdToMirror, mWindowManagerMirroringEnabled, mDisplayCategories,
                mRequestedRefreshRate, mIsHomeSupported, mDisplayCutout,
                mIgnoreActivitySizeRestrictions);
                mIgnoreActivitySizeRestrictions, mDefaultBrightness);
        return hashCode;
    }

@@ -303,6 +325,7 @@ public final class VirtualDisplayConfig implements Parcelable {
                + " mIsHomeSupported=" + mIsHomeSupported
                + " mDisplayCutout=" + mDisplayCutout
                + " mIgnoreActivitySizeRestrictions=" + mIgnoreActivitySizeRestrictions
                + " mDefaultBrightness=" + mDefaultBrightness
                + ")";
    }

@@ -321,6 +344,7 @@ public final class VirtualDisplayConfig implements Parcelable {
        mIsHomeSupported = in.readBoolean();
        mDisplayCutout = DisplayCutout.ParcelableWrapper.readCutoutFromParcel(in);
        mIgnoreActivitySizeRestrictions = in.readBoolean();
        mDefaultBrightness = in.readFloat();
    }

    @NonNull
@@ -355,6 +379,7 @@ public final class VirtualDisplayConfig implements Parcelable {
        private boolean mIsHomeSupported = false;
        private DisplayCutout mDisplayCutout = null;
        private boolean mIgnoreActivitySizeRestrictions = false;
        private float mDefaultBrightness = 0.0f;

        /**
         * Creates a new Builder.
@@ -546,6 +571,35 @@ public final class VirtualDisplayConfig implements Parcelable {
            return this;
        }

        /**
         * Sets the default brightness of the display.
         *
         * <p>The system will use this brightness value whenever the display should be bright, i.e.
         * it is powered on and not dimmed due to user activity or app activity.</p>
         *
         * <p>Value of {@code 0.0} indicates the minimum supported brightness and value of
         * {@code 1.0} indicates the maximum supported brightness.</p>
         *
         * <p>If unset, defaults to {@code 0.0}</p>
         *
         * @see android.view.View#setKeepScreenOn(boolean)
         * @see Builder#setDefaultBrightness(float)
         * @see VirtualDisplay.Callback#onRequestedBrightnessChanged(float)
         * @hide
         */
        @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_DEVICE_AWARE_DISPLAY_POWER)
        @SystemApi
        @NonNull
        public Builder setDefaultBrightness(@FloatRange(from = 0.0f, to = 1.0f) float brightness) {
            if (brightness < PowerManager.BRIGHTNESS_MIN
                    || brightness > PowerManager.BRIGHTNESS_MAX) {
                throw new IllegalArgumentException(
                        "Virtual display default brightness must be in range [0.0, 1.0]");
            }
            mDefaultBrightness = brightness;
            return this;
        }

        /**
         * Builds the {@link VirtualDisplayConfig} instance.
         */
@@ -565,7 +619,8 @@ public final class VirtualDisplayConfig implements Parcelable {
                    mRequestedRefreshRate,
                    mIsHomeSupported,
                    mDisplayCutout,
                    mIgnoreActivitySizeRestrictions);
                    mIgnoreActivitySizeRestrictions,
                    mDefaultBrightness);
        }
    }
}
Loading