| /* |
| * Copyright (C) 2021 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.internal.policy; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.graphics.Insets; |
| import android.view.Display; |
| import android.view.DisplayCutout; |
| import android.view.DisplayInfo; |
| import android.view.Surface; |
| |
| import com.android.internal.R; |
| |
| /** |
| * Utility functions for system bars used by both window manager and System UI. |
| * |
| * @hide |
| */ |
| public final class SystemBarUtils { |
| |
| /** |
| * Gets the status bar height. |
| */ |
| public static int getStatusBarHeight(Context context) { |
| return getStatusBarHeight(context.getResources(), context.getDisplay().getCutout()); |
| } |
| |
| /** |
| * Gets the status bar height with a specific display cutout. |
| */ |
| public static int getStatusBarHeight(Resources res, DisplayCutout cutout) { |
| final int defaultSize = res.getDimensionPixelSize(R.dimen.status_bar_height_default); |
| final int safeInsetTop = cutout == null ? 0 : cutout.getSafeInsetTop(); |
| final int waterfallInsetTop = cutout == null ? 0 : cutout.getWaterfallInsets().top; |
| // The status bar height should be: |
| // Max(top cutout size, (status bar default height + waterfall top size)) |
| return Math.max(safeInsetTop, defaultSize + waterfallInsetTop); |
| } |
| |
| /** |
| * Gets the status bar height for a specific rotation. |
| */ |
| public static int getStatusBarHeightForRotation( |
| Context context, @Surface.Rotation int targetRot) { |
| final Display display = context.getDisplay(); |
| final int rotation = display.getRotation(); |
| final DisplayCutout cutout = display.getCutout(); |
| DisplayInfo info = new DisplayInfo(); |
| display.getDisplayInfo(info); |
| Insets insets; |
| Insets waterfallInsets; |
| if (cutout == null) { |
| insets = Insets.NONE; |
| waterfallInsets = Insets.NONE; |
| } else { |
| DisplayCutout rotated = |
| cutout.getRotated(info.logicalWidth, info.logicalHeight, rotation, targetRot); |
| insets = Insets.of(rotated.getSafeInsets()); |
| waterfallInsets = rotated.getWaterfallInsets(); |
| } |
| final int defaultSize = |
| context.getResources().getDimensionPixelSize(R.dimen.status_bar_height_default); |
| // The status bar height should be: |
| // Max(top cutout size, (status bar default height + waterfall top size)) |
| return Math.max(insets.top, defaultSize + waterfallInsets.top); |
| } |
| |
| /** |
| * Gets the height of area above QQS where battery/time go in notification panel. The height |
| * equals to status bar height if status bar height is bigger than the |
| * {@link R.dimen#quick_qs_offset_height}. |
| */ |
| public static int getQuickQsOffsetHeight(Context context) { |
| final int defaultSize = context.getResources().getDimensionPixelSize( |
| R.dimen.quick_qs_offset_height); |
| final int statusBarHeight = getStatusBarHeight(context); |
| // Equals to status bar height if status bar height is bigger. |
| return Math.max(defaultSize, statusBarHeight); |
| } |
| } |