// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Rect; import android.os.Build; import android.view.View; import android.view.WindowInsets; /** * The purpose of this view is to store the system window insets (OSK, status bar) for * later use. */ public class InsetObserverView extends View { protected final Rect mWindowInsets; /** * Constructs a new {@link InsetObserverView} for the appropriate Android version. * @param context The Context the view is running in, through which it can access the current * theme, resources, etc. * @return an instance of a InsetObserverView. */ public static InsetObserverView create(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { return new InsetObserverView(context); } return new InsetObserverViewApi21(context); } /** * Creates an instance of {@link InsetObserverView}. * @param context The Context to create this {@link InsetObserverView} in. */ public InsetObserverView(Context context) { super(context); setVisibility(INVISIBLE); mWindowInsets = new Rect(); } /** * Returns the left {@link WindowInsets} in pixels. */ public int getSystemWindowInsetsLeft() { return mWindowInsets.left; } /** * Returns the top {@link WindowInsets} in pixels. */ public int getSystemWindowInsetsTop() { return mWindowInsets.top; } /** * Returns the right {@link WindowInsets} in pixels. */ public int getSystemWindowInsetsRight() { return mWindowInsets.right; } /** * Returns the bottom {@link WindowInsets} in pixels. */ public int getSystemWindowInsetsBottom() { return mWindowInsets.bottom; } @SuppressWarnings("deprecation") @Override protected boolean fitSystemWindows(Rect insets) { // For Lollipop and above, onApplyWindowInsets will set the insets. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { mWindowInsets.set(insets.left, insets.top, insets.right, insets.bottom); } return false; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static class InsetObserverViewApi21 extends InsetObserverView { /** * Creates an instance of {@link InsetObserverView} for Android versions L and above. * @param context The Context to create this {@link InsetObserverView} in. */ InsetObserverViewApi21(Context context) { super(context); } @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { mWindowInsets.set( insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()); return insets; } } }