Merge "Added displayPosition in LogicalDisplay" into rvc-dev am: ae1c541a6f

Change-Id: I99718460d50aac2d683a949c218db7e6cdfbbb28
This commit is contained in:
Chavi Weingarten
2020-04-06 18:38:21 +00:00
committed by Automerger Merge Worker
5 changed files with 125 additions and 0 deletions

View File

@@ -17,6 +17,7 @@
package android.hardware.display;
import android.annotation.Nullable;
import android.graphics.Point;
import android.hardware.SensorManager;
import android.os.Handler;
import android.os.PowerManager;
@@ -89,6 +90,16 @@ public abstract class DisplayManagerInternal {
*/
public abstract DisplayInfo getDisplayInfo(int displayId);
/**
* Returns the position of the display's projection.
*
* @param displayId The logical display id.
* @return The x, y coordinates of the display, or null if the display does not exist. The
* return object must be treated as immutable.
*/
@Nullable
public abstract Point getDisplayPosition(int displayId);
/**
* Registers a display transaction listener to provide the client a chance to
* update its surfaces within the same transaction as any display layout updates.

View File

@@ -2515,6 +2515,17 @@ public final class DisplayManagerService extends SystemService {
return getDisplayInfoInternal(displayId, Process.myUid());
}
@Override
public Point getDisplayPosition(int displayId) {
synchronized (mSyncRoot) {
LogicalDisplay display = mLogicalDisplays.get(displayId);
if (display != null) {
return display.getDisplayPosition();
}
return null;
}
}
@Override
public void registerDisplayTransactionListener(DisplayTransactionListener listener) {
if (listener == null) {

View File

@@ -16,6 +16,7 @@
package com.android.server.display;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.display.DisplayManagerInternal;
import android.view.Display;
@@ -97,6 +98,11 @@ final class LogicalDisplay {
private int mDisplayOffsetX;
private int mDisplayOffsetY;
/**
* The position of the display projection sent to SurfaceFlinger
*/
private final Point mDisplayPosition = new Point();
/**
* {@code true} if display scaling is disabled, or {@code false} if the default scaling mode
* is used.
@@ -334,6 +340,16 @@ final class LogicalDisplay {
}
}
/**
* Returns the position of the display's projection.
*
* @return The x, y coordinates of the display. The return object must be treated as immutable.
*/
Point getDisplayPosition() {
// Allocate a new object to avoid a data race.
return new Point(mDisplayPosition);
}
/**
* Applies the layer stack and transformation to the given display device
* so that it shows the contents of this logical display.
@@ -445,6 +461,8 @@ final class LogicalDisplay {
} else { // Surface.ROTATION_270
mTempDisplayRect.offset(-mDisplayOffsetY, mDisplayOffsetX);
}
mDisplayPosition.set(mTempDisplayRect.left, mTempDisplayRect.top);
device.setProjectionLocked(t, orientation, mTempLayerStackRect, mTempDisplayRect);
}

View File

@@ -5433,6 +5433,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
return mDisplayPolicy.getSystemUiContext();
}
Point getDisplayPosition() {
return mWmService.mDisplayManagerInternal.getDisplayPosition(getDisplayId());
}
class RemoteInsetsControlTarget implements InsetsControlTarget {
private final IDisplayWindowInsetsController mRemoteInsetsController;

View File

@@ -0,0 +1,81 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.display;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.graphics.Point;
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.SurfaceControl;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
public class LogicalDisplayTest {
private static final int DISPLAY_ID = 0;
private static final int LAYER_STACK = 0;
private static final int DISPLAY_WIDTH = 100;
private static final int DISPLAY_HEIGHT = 200;
private LogicalDisplay mLogicalDisplay;
private DisplayDevice mDisplayDevice;
@Before
public void setUp() {
// Share classloader to allow package private access.
System.setProperty("dexmaker.share_classloader", "true");
mDisplayDevice = mock(DisplayDevice.class);
DisplayDeviceInfo displayDeviceInfo = new DisplayDeviceInfo();
displayDeviceInfo.width = DISPLAY_WIDTH;
displayDeviceInfo.height = DISPLAY_HEIGHT;
displayDeviceInfo.flags = DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT;
mLogicalDisplay = new LogicalDisplay(DISPLAY_ID, LAYER_STACK, mDisplayDevice);
when(mDisplayDevice.getDisplayDeviceInfoLocked()).thenReturn(displayDeviceInfo);
ArrayList<DisplayDevice> displayDevices = new ArrayList<>();
displayDevices.add(mDisplayDevice);
mLogicalDisplay.updateLocked(displayDevices);
}
@Test
public void testGetDisplayPosition() {
Point expectedPosition = new Point();
SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
mLogicalDisplay.configureDisplayLocked(t, mDisplayDevice, false);
assertEquals(expectedPosition, mLogicalDisplay.getDisplayPosition());
expectedPosition.set(20, 40);
mLogicalDisplay.setDisplayOffsetsLocked(20, 40);
mLogicalDisplay.configureDisplayLocked(t, mDisplayDevice, false);
assertEquals(expectedPosition, mLogicalDisplay.getDisplayPosition());
expectedPosition.set(40, -20);
DisplayInfo displayInfo = new DisplayInfo();
displayInfo.logicalWidth = DISPLAY_HEIGHT;
displayInfo.logicalHeight = DISPLAY_WIDTH;
displayInfo.rotation = Surface.ROTATION_90;
mLogicalDisplay.setDisplayInfoOverrideFromWindowManagerLocked(displayInfo);
mLogicalDisplay.configureDisplayLocked(t, mDisplayDevice, false);
assertEquals(expectedPosition, mLogicalDisplay.getDisplayPosition());
}
}