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

Commit c41127d3 authored by Qijing Yao's avatar Qijing Yao Committed by Android (Google) Code Review
Browse files

Merge "Update DisplayLayout bounds on topology change" into main

parents 39879973 7ca515f2
Loading
Loading
Loading
Loading
+31 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.graphics.RectF;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayTopology;
import android.os.RemoteException;
@@ -41,7 +42,9 @@ import com.android.wm.shell.shared.annotations.ShellMainThread;
import com.android.wm.shell.sysui.ShellInit;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
@@ -62,6 +65,7 @@ public class DisplayController {

    private final SparseArray<DisplayRecord> mDisplays = new SparseArray<>();
    private final ArrayList<OnDisplaysChangedListener> mDisplayChangedListeners = new ArrayList<>();
    private final Map<Integer, RectF> mUnpopulatedDisplayBounds = new HashMap<>();

    public DisplayController(Context context, IWindowManager wmService, ShellInit shellInit,
            ShellExecutor mainExecutor, DisplayManager displayManager) {
@@ -193,7 +197,12 @@ public class DisplayController {
                    ? mContext
                    : mContext.createDisplayContext(display);
            final DisplayRecord record = new DisplayRecord(displayId);
            record.setDisplayLayout(context, new DisplayLayout(context, display));
            DisplayLayout displayLayout = new DisplayLayout(context, display);
            if (Flags.enableConnectedDisplaysWindowDrag()
                    && mUnpopulatedDisplayBounds.containsKey(displayId)) {
                displayLayout.setGlobalBoundsDp(mUnpopulatedDisplayBounds.get(displayId));
            }
            record.setDisplayLayout(context, displayLayout);
            mDisplays.put(displayId, record);
            for (int i = 0; i < mDisplayChangedListeners.size(); ++i) {
                mDisplayChangedListeners.get(i).onDisplayAdded(displayId);
@@ -231,10 +240,27 @@ public class DisplayController {
    }

    private void onDisplayTopologyChanged(DisplayTopology topology) {
        // TODO(b/381472611): Call DisplayTopology#getCoordinates and update values in
        //                    DisplayLayout when DM code is ready.
        if (topology == null) {
            return;
        }
        SparseArray<RectF> absoluteBounds = topology.getAbsoluteBounds();
        mUnpopulatedDisplayBounds.clear();
        for (int i = 0; i < absoluteBounds.size(); ++i) {
            int displayId = absoluteBounds.keyAt(i);
            DisplayLayout displayLayout = getDisplayLayout(displayId);
            if (displayLayout == null) {
                // onDisplayTopologyChanged can arrive before onDisplayAdded.
                // Store the bounds to be applied later in onDisplayAdded.
                Slog.d(TAG, "Storing bounds for onDisplayTopologyChanged on unknown"
                        + " display, displayId=" + displayId);
                mUnpopulatedDisplayBounds.put(displayId, absoluteBounds.valueAt(i));
            } else {
                displayLayout.setGlobalBoundsDp(absoluteBounds.valueAt(i));
            }
        }

        for (int i = 0; i < mDisplayChangedListeners.size(); ++i) {
            mDisplayChangedListeners.get(i).onTopologyChanged();
            mDisplayChangedListeners.get(i).onTopologyChanged(topology);
        }
    }

@@ -429,6 +455,6 @@ public class DisplayController {
        /**
         * Called when the display topology has changed.
         */
        default void onTopologyChanged() {}
        default void onTopologyChanged(DisplayTopology topology) {}
    }
}