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

Commit 08c33bb5 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/26473073',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/26473073', 'googleplex-android-review.googlesource.com/26495848', 'googleplex-android-review.googlesource.com/26593332'] into 24Q2-release.

Change-Id: I3aa21b0ae55aeda9e0d65edd77b76888e7899cb5
parents b938b7e1 2638773d
Loading
Loading
Loading
Loading
+41 −1
Original line number Original line Diff line number Diff line
@@ -334,6 +334,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
        boolean isDisplayRotationAnimationStarted = false;
        boolean isDisplayRotationAnimationStarted = false;
        final boolean isDreamTransition = isDreamTransition(info);
        final boolean isDreamTransition = isDreamTransition(info);
        final boolean isOnlyTranslucent = isOnlyTranslucent(info);
        final boolean isOnlyTranslucent = isOnlyTranslucent(info);
        final boolean isActivityLevel = isActivityLevelOnly(info);


        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
            final TransitionInfo.Change change = info.getChanges().get(i);
            final TransitionInfo.Change change = info.getChanges().get(i);
@@ -502,8 +503,35 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                        : new Rect(change.getEndAbsBounds());
                        : new Rect(change.getEndAbsBounds());
                clipRect.offsetTo(0, 0);
                clipRect.offsetTo(0, 0);


                final TransitionInfo.Root animRoot = TransitionUtil.getRootFor(change, info);
                final Point animRelOffset = new Point(
                        change.getEndAbsBounds().left - animRoot.getOffset().x,
                        change.getEndAbsBounds().top - animRoot.getOffset().y);
                if (change.getActivityComponent() != null && !isActivityLevel) {
                    // At this point, this is an independent activity change in a non-activity
                    // transition. This means that an activity transition got erroneously combined
                    // with another ongoing transition. This then means that the animation root may
                    // not tightly fit the activities, so we have to put them in a separate crop.
                    final int layer = Transitions.calculateAnimLayer(change, i,
                            info.getChanges().size(), info.getType());
                    final SurfaceControl leash = new SurfaceControl.Builder()
                            .setName("Transition ActivityWrap: "
                                    + change.getActivityComponent().toShortString())
                            .setParent(animRoot.getLeash())
                            .setContainerLayer().build();
                    startTransaction.setCrop(leash, clipRect);
                    startTransaction.setPosition(leash, animRelOffset.x, animRelOffset.y);
                    startTransaction.setLayer(leash, layer);
                    startTransaction.show(leash);
                    startTransaction.reparent(change.getLeash(), leash);
                    startTransaction.setPosition(change.getLeash(), 0, 0);
                    animRelOffset.set(0, 0);
                    finishTransaction.reparent(leash, null);
                    leash.release();
                }

                buildSurfaceAnimation(animations, a, change.getLeash(), onAnimFinish,
                buildSurfaceAnimation(animations, a, change.getLeash(), onAnimFinish,
                        mTransactionPool, mMainExecutor, change.getEndRelOffset(), cornerRadius,
                        mTransactionPool, mMainExecutor, animRelOffset, cornerRadius,
                        clipRect);
                        clipRect);


                if (info.getAnimationOptions() != null) {
                if (info.getAnimationOptions() != null) {
@@ -612,6 +640,18 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
        return (translucentOpen + translucentClose) > 0;
        return (translucentOpen + translucentClose) > 0;
    }
    }


    /**
     * Does `info` only contain activity-level changes? This kinda assumes that if so, they are
     * all in one task.
     */
    private static boolean isActivityLevelOnly(@NonNull TransitionInfo info) {
        for (int i = info.getChanges().size() - 1; i >= 0; --i) {
            final TransitionInfo.Change change = info.getChanges().get(i);
            if (change.getActivityComponent() == null) return false;
        }
        return true;
    }

    @Override
    @Override
    public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
    public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
            @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget,
+43 −47
Original line number Original line Diff line number Diff line
@@ -31,7 +31,6 @@ import static android.view.WindowManager.fixScale;
import static android.window.TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
import static android.window.TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW;
import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW;
import static android.window.TransitionInfo.FLAG_IS_OCCLUDED;
import static android.window.TransitionInfo.FLAG_IS_OCCLUDED;
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP;
import static android.window.TransitionInfo.FLAG_NO_ANIMATION;
import static android.window.TransitionInfo.FLAG_NO_ANIMATION;
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
@@ -530,78 +529,75 @@ public class Transitions implements RemoteCallable<Transitions>,
        }
        }
    }
    }


    /**
    static int calculateAnimLayer(@NonNull TransitionInfo.Change change, int i,
     * Reparents all participants into a shared parent and orders them based on: the global transit
            int numChanges, @WindowManager.TransitionType int transitType) {
     * type, their transit mode, and their destination z-order.
     */
    private static void setupAnimHierarchy(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) {
        final int type = info.getType();
        final boolean isOpening = isOpeningType(type);
        final boolean isClosing = isClosingType(type);
        for (int i = 0; i < info.getRootCount(); ++i) {
            t.show(info.getRoot(i).getLeash());
        }
        final int numChanges = info.getChanges().size();
        // Put animating stuff above this line and put static stuff below it.
        // Put animating stuff above this line and put static stuff below it.
        final int zSplitLine = numChanges + 1;
        final int zSplitLine = numChanges + 1;
        // changes should be ordered top-to-bottom in z
        final boolean isOpening = isOpeningType(transitType);
        for (int i = numChanges - 1; i >= 0; --i) {
        final boolean isClosing = isClosingType(transitType);
            final TransitionInfo.Change change = info.getChanges().get(i);
            final SurfaceControl leash = change.getLeash();
        final int mode = change.getMode();
        final int mode = change.getMode();

            // Don't reparent anything that isn't independent within its parents
            if (!TransitionInfo.isIndependent(change, info)) {
                continue;
            }

            boolean hasParent = change.getParent() != null;

            final int rootIdx = TransitionUtil.rootIndexFor(change, info);
            if (!hasParent) {
                t.reparent(leash, info.getRoot(rootIdx).getLeash());
                t.setPosition(leash,
                        change.getStartAbsBounds().left - info.getRoot(rootIdx).getOffset().x,
                        change.getStartAbsBounds().top - info.getRoot(rootIdx).getOffset().y);
            }
            final int layer;
        // Put all the OPEN/SHOW on top
        // Put all the OPEN/SHOW on top
            if ((change.getFlags() & FLAG_IS_WALLPAPER) != 0) {
                // Wallpaper is always at the bottom, opening wallpaper on top of closing one.
        if (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT) {
        if (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT) {
                    layer = -zSplitLine + numChanges - i;
                } else {
                    layer = -zSplitLine - i;
                }
            } else if (mode == TRANSIT_OPEN || mode == TRANSIT_TO_FRONT) {
            if (isOpening
            if (isOpening
                    // This is for when an activity launches while a different transition is
                    // This is for when an activity launches while a different transition is
                    // collecting.
                    // collecting.
                    || change.hasFlags(FLAG_MOVED_TO_TOP)) {
                    || change.hasFlags(FLAG_MOVED_TO_TOP)) {
                // put on top
                // put on top
                    layer = zSplitLine + numChanges - i;
                return zSplitLine + numChanges - i;
            } else {
            } else {
                // put on bottom
                // put on bottom
                    layer = zSplitLine - i;
                return zSplitLine - i;
            }
            }
        } else if (mode == TRANSIT_CLOSE || mode == TRANSIT_TO_BACK) {
        } else if (mode == TRANSIT_CLOSE || mode == TRANSIT_TO_BACK) {
            if (isOpening) {
            if (isOpening) {
                // put on bottom and leave visible
                // put on bottom and leave visible
                    layer = zSplitLine - i;
                return zSplitLine - i;
            } else {
            } else {
                // put on top
                // put on top
                    layer = zSplitLine + numChanges - i;
                return zSplitLine + numChanges - i;
            }
            }
        } else { // CHANGE or other
        } else { // CHANGE or other
            if (isClosing || TransitionUtil.isOrderOnly(change)) {
            if (isClosing || TransitionUtil.isOrderOnly(change)) {
                // Put below CLOSE mode (in the "static" section).
                // Put below CLOSE mode (in the "static" section).
                    layer = zSplitLine - i;
                return zSplitLine - i;
            } else {
            } else {
                // Put above CLOSE mode.
                // Put above CLOSE mode.
                    layer = zSplitLine + numChanges - i;
                return zSplitLine + numChanges - i;
            }
            }
        }
        }
    }

    /**
     * Reparents all participants into a shared parent and orders them based on: the global transit
     * type, their transit mode, and their destination z-order.
     */
    private static void setupAnimHierarchy(@NonNull TransitionInfo info,
            @NonNull SurfaceControl.Transaction t, @NonNull SurfaceControl.Transaction finishT) {
        final int type = info.getType();
        for (int i = 0; i < info.getRootCount(); ++i) {
            t.show(info.getRoot(i).getLeash());
        }
        final int numChanges = info.getChanges().size();
        // changes should be ordered top-to-bottom in z
        for (int i = numChanges - 1; i >= 0; --i) {
            final TransitionInfo.Change change = info.getChanges().get(i);
            final SurfaceControl leash = change.getLeash();

            // Don't reparent anything that isn't independent within its parents
            if (!TransitionInfo.isIndependent(change, info)) {
                continue;
            }

            boolean hasParent = change.getParent() != null;

            final TransitionInfo.Root root = TransitionUtil.getRootFor(change, info);
            if (!hasParent) {
                t.reparent(leash, root.getLeash());
                t.setPosition(leash,
                        change.getStartAbsBounds().left - root.getOffset().x,
                        change.getStartAbsBounds().top - root.getOffset().y);
            }
            final int layer = calculateAnimLayer(change, i, numChanges, type);
            t.setLayer(leash, layer);
            t.setLayer(leash, layer);
        }
        }
    }
    }
+3 −1
Original line number Original line Diff line number Diff line
@@ -404,7 +404,9 @@ constructor(
                            if (nextAlarmMillis > 0) nextAlarmMillis else null,
                            if (nextAlarmMillis > 0) nextAlarmMillis else null,
                            SysuiR.string::status_bar_alarm.name
                            SysuiR.string::status_bar_alarm.name
                        )
                        )
                        .also { data -> clock?.run { events.onAlarmDataChanged(data) } }
                        .also { data ->
                            mainExecutor.execute { clock?.run { events.onAlarmDataChanged(data) } }
                        }
            }
            }
        }
        }


+29 −1
Original line number Original line Diff line number Diff line
@@ -42,6 +42,9 @@ import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.notifications.DisplayNotificationManager;
import com.android.server.display.notifications.DisplayNotificationManager;
import com.android.server.display.utils.DebugUtils;
import com.android.server.display.utils.DebugUtils;


import java.util.HashSet;
import java.util.Set;

/**
/**
 * Listens for Skin thermal sensor events, disables external displays if thermal status becomes
 * Listens for Skin thermal sensor events, disables external displays if thermal status becomes
 * equal or above {@link android.os.Temperature#THROTTLING_CRITICAL}, enables external displays if
 * equal or above {@link android.os.Temperature#THROTTLING_CRITICAL}, enables external displays if
@@ -106,6 +109,10 @@ class ExternalDisplayPolicy {
    private final ExternalDisplayStatsService mExternalDisplayStatsService;
    private final ExternalDisplayStatsService mExternalDisplayStatsService;
    @ThrottlingStatus
    @ThrottlingStatus
    private volatile int mStatus = THROTTLING_NONE;
    private volatile int mStatus = THROTTLING_NONE;
    //@GuardedBy("mSyncRoot")
    private boolean mIsBootCompleted;
    //@GuardedBy("mSyncRoot")
    private final Set<Integer> mDisplayIdsWaitingForBootCompletion = new HashSet<>();


    ExternalDisplayPolicy(@NonNull final Injector injector) {
    ExternalDisplayPolicy(@NonNull final Injector injector) {
        mInjector = injector;
        mInjector = injector;
@@ -121,6 +128,17 @@ class ExternalDisplayPolicy {
     * Starts listening for temperature changes.
     * Starts listening for temperature changes.
     */
     */
    void onBootCompleted() {
    void onBootCompleted() {
        synchronized (mSyncRoot) {
            mIsBootCompleted = true;
            for (var displayId : mDisplayIdsWaitingForBootCompletion) {
                var logicalDisplay = mLogicalDisplayMapper.getDisplayLocked(displayId);
                if (logicalDisplay != null) {
                    handleExternalDisplayConnectedLocked(logicalDisplay);
                }
            }
            mDisplayIdsWaitingForBootCompletion.clear();
        }

        if (!mFlags.isConnectedDisplayManagementEnabled()) {
        if (!mFlags.isConnectedDisplayManagementEnabled()) {
            if (DEBUG) {
            if (DEBUG) {
                Slog.d(TAG, "External display management is not enabled on your device:"
                Slog.d(TAG, "External display management is not enabled on your device:"
@@ -189,6 +207,11 @@ class ExternalDisplayPolicy {
            return;
            return;
        }
        }


        if (!mIsBootCompleted) {
            mDisplayIdsWaitingForBootCompletion.add(logicalDisplay.getDisplayIdLocked());
            return;
        }

        mExternalDisplayStatsService.onDisplayConnected(logicalDisplay);
        mExternalDisplayStatsService.onDisplayConnected(logicalDisplay);


        if ((Build.IS_ENG || Build.IS_USERDEBUG)
        if ((Build.IS_ENG || Build.IS_USERDEBUG)
@@ -227,7 +250,12 @@ class ExternalDisplayPolicy {
            return;
            return;
        }
        }


        mExternalDisplayStatsService.onDisplayDisconnected(logicalDisplay.getDisplayIdLocked());
        var displayId = logicalDisplay.getDisplayIdLocked();
        if (mDisplayIdsWaitingForBootCompletion.remove(displayId)) {
            return;
        }

        mExternalDisplayStatsService.onDisplayDisconnected(displayId);
    }
    }


    /**
    /**
+5 −0
Original line number Original line Diff line number Diff line
@@ -2408,6 +2408,7 @@ public class DisplayManagerServiceTest {
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        manageDisplaysPermission(/* granted= */ true);
        manageDisplaysPermission(/* granted= */ true);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
        DisplayManagerInternal localService = displayManager.new LocalService();
        DisplayManagerInternal localService = displayManager.new LocalService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
@@ -2440,6 +2441,7 @@ public class DisplayManagerServiceTest {
                .when(() -> SystemProperties.getBoolean(ENABLE_ON_CONNECT, false));
                .when(() -> SystemProperties.getBoolean(ENABLE_ON_CONNECT, false));
        manageDisplaysPermission(/* granted= */ true);
        manageDisplaysPermission(/* granted= */ true);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
        DisplayManagerInternal localService = displayManager.new LocalService();
        DisplayManagerInternal localService = displayManager.new LocalService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
@@ -2487,6 +2489,7 @@ public class DisplayManagerServiceTest {
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        manageDisplaysPermission(/* granted= */ true);
        manageDisplaysPermission(/* granted= */ true);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
        FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
@@ -2652,6 +2655,7 @@ public class DisplayManagerServiceTest {
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        manageDisplaysPermission(/* granted= */ true);
        manageDisplaysPermission(/* granted= */ true);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        DisplayManagerInternal localService = displayManager.new LocalService();
        DisplayManagerInternal localService = displayManager.new LocalService();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
@@ -2699,6 +2703,7 @@ public class DisplayManagerServiceTest {
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        when(mMockFlags.isConnectedDisplayManagementEnabled()).thenReturn(true);
        manageDisplaysPermission(/* granted= */ true);
        manageDisplaysPermission(/* granted= */ true);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        DisplayManagerService displayManager = new DisplayManagerService(mContext, mBasicInjector);
        displayManager.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        DisplayManagerService.BinderService bs = displayManager.new BinderService();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        LogicalDisplayMapper logicalDisplayMapper = displayManager.getLogicalDisplayMapper();
        FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
        FakeDisplayManagerCallback callback = new FakeDisplayManagerCallback();
Loading