| /* |
| * Copyright (C) 2022 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.ViewGroup.LayoutParams.MATCH_PARENT; |
| import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; |
| |
| import android.app.WindowConfiguration.WindowingMode; |
| import android.graphics.Rect; |
| import android.view.WindowInsets.Type.InsetsType; |
| import android.window.ClientWindowFrames; |
| |
| /** |
| * Computes window frames for the windowless window. |
| * |
| * This can't be replaced with the regular WindowLayout because WindowLayout computes bounds |
| * with insets and cutout values. Since windowless windows aren't affected by insets and |
| * instead are bound by their parent, it will compute incorrect bounds for them if insets are used. |
| * |
| * @hide |
| */ |
| public class WindowlessWindowLayout extends WindowLayout { |
| |
| @Override |
| public void computeFrames(WindowManager.LayoutParams attrs, InsetsState state, |
| Rect displayCutoutSafe, Rect windowBounds, @WindowingMode int windowingMode, |
| int requestedWidth, int requestedHeight, @InsetsType int requestedVisibleTypes, |
| float compatScale, ClientWindowFrames frames) { |
| if (frames.attachedFrame == null) { |
| frames.frame.set(0, 0, attrs.width, attrs.height); |
| frames.parentFrame.set(frames.frame); |
| frames.displayFrame.set(frames.frame); |
| return; |
| } |
| |
| final int height = calculateLength(attrs.height, requestedHeight, |
| frames.attachedFrame.height()); |
| final int width = calculateLength(attrs.width, requestedWidth, |
| frames.attachedFrame.width()); |
| Gravity.apply(attrs.gravity, width, height, frames.attachedFrame, |
| (int) (attrs.x + attrs.horizontalMargin), |
| (int) (attrs.y + attrs.verticalMargin), |
| frames.frame); |
| frames.displayFrame.set(frames.frame); |
| frames.parentFrame.set(frames.attachedFrame); |
| } |
| |
| private static int calculateLength(int attrLength, int requestedLength, int parentLength) { |
| if (attrLength == MATCH_PARENT) { |
| return parentLength; |
| } |
| if (attrLength == WRAP_CONTENT) { |
| return requestedLength; |
| } |
| return attrLength; |
| } |
| } |