content: package com.android.launcher3;
  
  import android.annotation.TargetApi;
  import android.app.ActivityManager;
  import android.content.Context;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.graphics.Rect;
  import android.util.AttributeSet;
  import android.view.View;
  import android.view.ViewDebug;
  
  import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV;
  import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW;
  
  public class LauncherRootView extends InsettableFrameLayout {
  
      private final Paint mOpaquePaint;
      @ViewDebug.ExportedProperty(category = "launcher")
      private boolean mDrawSideInsetBar;
      @ViewDebug.ExportedProperty(category = "launcher")
      private int mLeftInsetBarWidth;
      @ViewDebug.ExportedProperty(category = "launcher")
      private int mRightInsetBarWidth;
  
      private View mAlignedView;
  
      public LauncherRootView(Context context, AttributeSet attrs) {
          super(context, attrs);
  
          mOpaquePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
          mOpaquePaint.setColor(Color.BLACK);
          mOpaquePaint.setStyle(Paint.Style.FILL);
      }
  
      @Override
      protected void onFinishInflate() {
          if (getChildCount() > 0) {
              // LauncherRootView contains only one child, which should be aligned
              // based on the horizontal insets.
              mAlignedView = getChildAt(0);
          }
          super.onFinishInflate();
      }
  
      @TargetApi(23)
      @Override
      protected boolean fitSystemWindows(Rect insets) {
          mDrawSideInsetBar = (insets.right > 0 || insets.left > 0) &&
                  (!Utilities.ATLEAST_MARSHMALLOW ||
                          getContext().getSystemService(ActivityManager.class).isLowRamDevice());
          if (mDrawSideInsetBar) {
              mLeftInsetBarWidth = insets.left;
              mRightInsetBarWidth = insets.right;
              insets = new Rect(0, insets.top, 0, insets.bottom);
          } else {
              mLeftInsetBarWidth = mRightInsetBarWidth = 0;
          }
          Launcher.getLauncher(getContext()).getSystemUiController().updateUiState(
                  UI_STATE_ROOT_VIEW, mDrawSideInsetBar ? FLAG_DARK_NAV : 0);
  
          boolean rawInsetsChanged = !mInsets.equals(insets);
          setInsets(insets);
  
          if (mAlignedView != null) {
              // Apply margins on aligned view to handle left/right insets.
              MarginLayoutParams lp = (MarginLayoutParams) mAlignedView.getLayoutParams();
              if (lp.leftMargin != mLeftInsetBarWidth || lp.rightMargin != mRightInsetBarWidth) {
                  lp.leftMargin = mLeftInsetBarWidth;
                  lp.rightMargin = mRightInsetBarWidth;
                  mAlignedView.setLayoutParams(lp);
              }
          }
  
          if (rawInsetsChanged) {
              // Update the grid again
              Launcher launcher = Launcher.getLauncher(getContext());
              launcher.onInsetsChanged(insets);
          }
  
          return true; // I'll take it from here
      }
  
      @Override
      protected void dispatchDraw(Canvas canvas) {
          super.dispatchDraw(canvas);
  
          // If the right inset is opaque, draw a black rectangle to ensure that is stays opaque.
          if (mDrawSideInsetBar) {
              if (mRightInsetBarWidth > 0) {
                  int width = getWidth();
                  canvas.drawRect(width - mRightInsetBarWidth, 0, width, getHeight(), mOpaquePaint);
              }
              if (mLeftInsetBarWidth > 0) {
                  canvas.drawRect(0, 0, mLeftInsetBarWidth, getHeight(), mOpaquePaint);
              }
          }
      }
  }