Merge "Revert "Revert "Always get window insets from server""" into rvc-dev
This commit is contained in:
@@ -16,6 +16,11 @@
|
|||||||
|
|
||||||
package android.view;
|
package android.view;
|
||||||
|
|
||||||
|
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||||
|
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
|
||||||
|
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
|
||||||
|
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.app.ResourcesManager;
|
import android.app.ResourcesManager;
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
@@ -67,10 +72,6 @@ public final class WindowManagerImpl implements WindowManager {
|
|||||||
|
|
||||||
private IBinder mDefaultToken;
|
private IBinder mDefaultToken;
|
||||||
|
|
||||||
private boolean mIsViewAdded;
|
|
||||||
private View mLastView;
|
|
||||||
private WindowManager.LayoutParams mLastParams;
|
|
||||||
|
|
||||||
public WindowManagerImpl(Context context) {
|
public WindowManagerImpl(Context context) {
|
||||||
this(context, null);
|
this(context, null);
|
||||||
}
|
}
|
||||||
@@ -102,9 +103,6 @@ public final class WindowManagerImpl implements WindowManager {
|
|||||||
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
|
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
|
||||||
applyDefaultToken(params);
|
applyDefaultToken(params);
|
||||||
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow);
|
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow);
|
||||||
mIsViewAdded = true;
|
|
||||||
mLastView = view;
|
|
||||||
mLastParams = (WindowManager.LayoutParams) params;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -247,21 +245,19 @@ public final class WindowManagerImpl implements WindowManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private WindowInsets computeWindowInsets() {
|
private WindowInsets computeWindowInsets() {
|
||||||
// TODO(window-context): This can only be properly implemented
|
// TODO(b/118118435): This can only be properly implemented
|
||||||
// once we flip the new insets mode flag.
|
// once we flip the new insets mode flag.
|
||||||
if (mParentWindow != null) {
|
// Initialize params which used for obtaining all system insets.
|
||||||
if (mParentWindow.getDecorView().isAttachedToWindow()) {
|
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
|
||||||
return mParentWindow.getDecorView().getViewRootImpl()
|
params.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR;
|
||||||
.getWindowInsets(true /* forceConstruct */);
|
params.token = (mParentWindow != null) ? mParentWindow.getContext().getActivityToken()
|
||||||
}
|
: mContext.getActivityToken();
|
||||||
return getWindowInsetsFromServer(mParentWindow.getAttributes());
|
params.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||||
}
|
| SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
|
||||||
if (mIsViewAdded) {
|
params.setFitInsetsTypes(0);
|
||||||
return mLastView.getViewRootImpl().getWindowInsets(true /* forceConstruct */);
|
params.setFitInsetsSides(0);
|
||||||
} else {
|
|
||||||
return getWindowInsetsFromServer(new WindowManager.LayoutParams());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
return getWindowInsetsFromServer(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
private WindowInsets getWindowInsetsFromServer(WindowManager.LayoutParams attrs) {
|
private WindowInsets getWindowInsetsFromServer(WindowManager.LayoutParams attrs) {
|
||||||
|
|||||||
@@ -138,6 +138,9 @@
|
|||||||
<!-- vr test permissions -->
|
<!-- vr test permissions -->
|
||||||
<uses-permission android:name="android.permission.RESTRICTED_VR_ACCESS" />
|
<uses-permission android:name="android.permission.RESTRICTED_VR_ACCESS" />
|
||||||
|
|
||||||
|
<!-- WindowMetricsTest permissions -->
|
||||||
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||||
|
|
||||||
<application android:theme="@style/Theme" android:supportsRtl="true">
|
<application android:theme="@style/Theme" android:supportsRtl="true">
|
||||||
<uses-library android:name="android.test.runner" />
|
<uses-library android:name="android.test.runner" />
|
||||||
<uses-library android:name="org.apache.http.legacy" android:required="false" />
|
<uses-library android:name="org.apache.http.legacy" android:required="false" />
|
||||||
|
|||||||
96
core/tests/coretests/src/android/view/WindowMetricsTest.java
Normal file
96
core/tests/coretests/src/android/view/WindowMetricsTest.java
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* 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 android.view;
|
||||||
|
|
||||||
|
import static android.view.Display.DEFAULT_DISPLAY;
|
||||||
|
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.hardware.display.DisplayManager;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.platform.test.annotations.Presubmit;
|
||||||
|
import android.util.Size;
|
||||||
|
|
||||||
|
import androidx.test.filters.FlakyTest;
|
||||||
|
import androidx.test.filters.SmallTest;
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for {@link WindowManager#getCurrentWindowMetrics()} and
|
||||||
|
* {@link WindowManager#getMaximumWindowMetrics()}.
|
||||||
|
*
|
||||||
|
* <p>Build/Install/Run:
|
||||||
|
* atest FrameworksCoreTests:WindowMetricsTest
|
||||||
|
*
|
||||||
|
* <p>This test class is a part of Window Manager Service tests and specified in
|
||||||
|
* {@link com.android.server.wm.test.filters.FrameworksTestsFilter}.
|
||||||
|
*/
|
||||||
|
@FlakyTest(bugId = 148789183, detail = "Remove after confirmed it's stable.")
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
@SmallTest
|
||||||
|
@Presubmit
|
||||||
|
public class WindowMetricsTest {
|
||||||
|
private Context mWindowContext;
|
||||||
|
private WindowManager mWm;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
final Context insetContext = InstrumentationRegistry.getInstrumentation()
|
||||||
|
.getTargetContext();
|
||||||
|
final Display display = insetContext.getSystemService(DisplayManager.class)
|
||||||
|
.getDisplay(DEFAULT_DISPLAY);
|
||||||
|
mWindowContext = insetContext.createDisplayContext(display)
|
||||||
|
.createWindowContext(TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||||
|
mWm = mWindowContext.getSystemService(WindowManager.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAddViewANdRemoveView_GetMetrics_DoNotCrash() {
|
||||||
|
final View view = new View(mWindowContext);
|
||||||
|
final WindowManager.LayoutParams params =
|
||||||
|
new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
|
||||||
|
Handler.getMain().runWithScissors(() -> {
|
||||||
|
mWm.addView(view, params);
|
||||||
|
// Check get metrics do not crash.
|
||||||
|
WindowMetrics currentMetrics = mWm.getCurrentWindowMetrics();
|
||||||
|
WindowMetrics maxMetrics = mWm.getMaximumWindowMetrics();
|
||||||
|
verifyMetricsSanity(currentMetrics, maxMetrics);
|
||||||
|
|
||||||
|
mWm.removeViewImmediate(view);
|
||||||
|
// Check get metrics do not crash.
|
||||||
|
currentMetrics = mWm.getCurrentWindowMetrics();
|
||||||
|
maxMetrics = mWm.getMaximumWindowMetrics();
|
||||||
|
verifyMetricsSanity(currentMetrics, maxMetrics);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void verifyMetricsSanity(WindowMetrics currentMetrics,
|
||||||
|
WindowMetrics maxMetrics) {
|
||||||
|
Size currentSize = currentMetrics.getSize();
|
||||||
|
Size maxSize = maxMetrics.getSize();
|
||||||
|
|
||||||
|
assertTrue(maxSize.getWidth() >= currentSize.getWidth());
|
||||||
|
assertTrue(maxSize.getHeight() >= currentSize.getHeight());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8075,8 +8075,10 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
public void getWindowInsets(WindowManager.LayoutParams attrs,
|
public void getWindowInsets(WindowManager.LayoutParams attrs,
|
||||||
int displayId, Rect outContentInsets, Rect outStableInsets,
|
int displayId, Rect outContentInsets, Rect outStableInsets,
|
||||||
DisplayCutout.ParcelableWrapper displayCutout) {
|
DisplayCutout.ParcelableWrapper displayCutout) {
|
||||||
|
final long origId = Binder.clearCallingIdentity();
|
||||||
|
try {
|
||||||
synchronized (mGlobalLock) {
|
synchronized (mGlobalLock) {
|
||||||
final DisplayContent dc = mRoot.getDisplayContentOrCreate(displayId);
|
final DisplayContent dc = getDisplayContentOrCreate(displayId, attrs.token);
|
||||||
if (dc == null) {
|
if (dc == null) {
|
||||||
throw new WindowManager.InvalidDisplayException("Display#" + displayId
|
throw new WindowManager.InvalidDisplayException("Display#" + displayId
|
||||||
+ "could not be found!");
|
+ "could not be found!");
|
||||||
@@ -8088,13 +8090,15 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
} else {
|
} else {
|
||||||
activity = null;
|
activity = null;
|
||||||
}
|
}
|
||||||
final Rect taskBounds = new Rect();
|
final Rect taskBounds;
|
||||||
final boolean floatingStack;
|
final boolean floatingStack;
|
||||||
if (activity != null && activity.getTask() != null) {
|
if (activity != null && activity.getTask() != null) {
|
||||||
final Task task = activity.getTask();
|
final Task task = activity.getTask();
|
||||||
|
taskBounds = new Rect();
|
||||||
task.getBounds(taskBounds);
|
task.getBounds(taskBounds);
|
||||||
floatingStack = task.isFloating();
|
floatingStack = task.isFloating();
|
||||||
} else {
|
} else {
|
||||||
|
taskBounds = null;
|
||||||
floatingStack = false;
|
floatingStack = false;
|
||||||
}
|
}
|
||||||
final DisplayFrames displayFrames = dc.mDisplayFrames;
|
final DisplayFrames displayFrames = dc.mDisplayFrames;
|
||||||
@@ -8102,5 +8106,8 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
policy.getLayoutHintLw(attrs, taskBounds, displayFrames, floatingStack,
|
policy.getLayoutHintLw(attrs, taskBounds, displayFrames, floatingStack,
|
||||||
new Rect(), outContentInsets, outStableInsets, displayCutout);
|
new Rect(), outContentInsets, outStableInsets, displayCutout);
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
Binder.restoreCallingIdentity(origId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public final class FrameworksTestsFilter extends SelectTest {
|
|||||||
"android.view.InsetsSourceTest",
|
"android.view.InsetsSourceTest",
|
||||||
"android.view.InsetsSourceConsumerTest",
|
"android.view.InsetsSourceConsumerTest",
|
||||||
"android.view.InsetsStateTest",
|
"android.view.InsetsStateTest",
|
||||||
|
"android.view.WindowMetricsTest"
|
||||||
};
|
};
|
||||||
|
|
||||||
public FrameworksTestsFilter(Bundle testArgs) {
|
public FrameworksTestsFilter(Bundle testArgs) {
|
||||||
|
|||||||
Reference in New Issue
Block a user