title: Put Navigation Drawer Under Status Bar
body: <p>I'm trying to make my navigation drawer go under the status bar. I've read extensively about the ScrimInsetsFrameLayout view and I tried implementing it, but for some reason it won't go under.</p>
  
  <p>Here's the code that I used/wrote.</p>
  
  <p>XML DrawerLayout:</p>
  
  <pre><code>&lt;android.support.v4.widget.DrawerLayout
      android:id="@+id/drawer_layout"
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"&gt;
  
      &lt;FrameLayout
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical"&gt;
  
          &lt;FrameLayout
              android:id="@+id/content_frame"
              android:layout_width="match_parent"
              android:layout_height="match_parent" /&gt;
  
          &lt;include layout="@layout/toolbar" /&gt;
  
      &lt;/FrameLayout&gt;
  
      &lt;com.andrewq.planets.util.ScrimInsetsFrameLayout
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/linearLayout"
          android:layout_width="304dp"
          android:layout_height="match_parent"
          android:layout_gravity="start"
          android:fitsSystemWindows="true"
          app:insetForeground="#4000"&gt;
  
          &lt;ListView
              android:id="@+id/left_drawer"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:choiceMode="singleChoice" /&gt;
      &lt;/com.andrewq.planets.util.ScrimInsetsFrameLayout&gt;
  
  
  &lt;/android.support.v4.widget.DrawerLayout&gt;
  </code></pre>
  
  <p>ScrimInsetsFrameLayout.java:</p>
  
  <pre><code>package com.andrewq.planets.util;
  
  /*
  * Copyright 2014 Google Inc.
  *
  * 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.
  */
  
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.graphics.Canvas;
  import android.graphics.Rect;
  import android.graphics.drawable.Drawable;
  import android.support.v4.view.ViewCompat;
  import android.util.AttributeSet;
  import android.widget.FrameLayout;
  
  import com.andrewq.planets.R;
  
  /**
   * A layout that draws something in the insets passed to {@link #fitSystemWindows(Rect)}, i.e. the area above UI chrome
   * (status and navigation bars, overlay action bars).
   */
  public class ScrimInsetsFrameLayout extends FrameLayout {
      private Drawable mInsetForeground;
  
      private Rect mInsets;
      private Rect mTempRect = new Rect();
      private OnInsetsCallback mOnInsetsCallback;
  
      public ScrimInsetsFrameLayout(Context context) {
          super(context);
          init(context, null, 0);
      }
  
      public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) {
          super(context, attrs);
          init(context, attrs, 0);
      }
  
      public ScrimInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
          init(context, attrs, defStyle);
      }
  
      private void init(Context context, AttributeSet attrs, int defStyle) {
          final TypedArray a = context.obtainStyledAttributes(attrs,
                  R.styleable.ScrimInsetsView, defStyle, 0);
          if (a == null) {
              return;
          }
          mInsetForeground = a.getDrawable(R.styleable.ScrimInsetsView_insetForeground);
          a.recycle();
  
          setWillNotDraw(true);
      }
  
      @Override
      protected boolean fitSystemWindows(Rect insets) {
          mInsets = new Rect(insets);
          setWillNotDraw(mInsetForeground == null);
          ViewCompat.postInvalidateOnAnimation(this);
          if (mOnInsetsCallback != null) {
              mOnInsetsCallback.onInsetsChanged(insets);
          }
          return true; // consume insets
      }
  
      @Override
      public void draw(Canvas canvas) {
          super.draw(canvas);
  
          int width = getWidth();
          int height = getHeight();
          if (mInsets != null &amp;&amp; mInsetForeground != null) {
              int sc = canvas.save();
              canvas.translate(getScrollX(), getScrollY());
  
              // Top
              mTempRect.set(0, 0, width, mInsets.top);
              mInsetForeground.setBounds(mTempRect);
              mInsetForeground.draw(canvas);
  
              // Bottom
              mTempRect.set(0, height - mInsets.bottom, width, height);
              mInsetForeground.setBounds(mTempRect);
              mInsetForeground.draw(canvas);
  
              // Left
              mTempRect.set(0, mInsets.top, mInsets.left, height - mInsets.bottom);
              mInsetForeground.setBounds(mTempRect);
              mInsetForeground.draw(canvas);
  
              // Right
              mTempRect.set(width - mInsets.right, mInsets.top, width, height - mInsets.bottom);
              mInsetForeground.setBounds(mTempRect);
              mInsetForeground.draw(canvas);
  
              canvas.restoreToCount(sc);
          }
      }
  
      @Override
      protected void onAttachedToWindow() {
          super.onAttachedToWindow();
          if (mInsetForeground != null) {
              mInsetForeground.setCallback(this);
          }
      }
  
      @Override
      protected void onDetachedFromWindow() {
          super.onDetachedFromWindow();
          if (mInsetForeground != null) {
              mInsetForeground.setCallback(null);
          }
      }
  
      /**
       * Allows the calling container to specify a callback for custom processing when insets change (i.e. when
       * {@link #fitSystemWindows(Rect)} is called. This is useful for setting padding on UI elements based on
       * UI chrome insets (e.g. a Google Map or a ListView). When using with ListView or GridView, remember to set
       * clipToPadding to false.
       */
      public void setOnInsetsCallback(OnInsetsCallback onInsetsCallback) {
          mOnInsetsCallback = onInsetsCallback;
      }
  
      public static interface OnInsetsCallback {
          public void onInsetsChanged(Rect insets);
      }
  }
  </code></pre>
  
  <p>And finally, here's my styles.xml for values-v21:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;resources&gt;
  
      &lt;style name="AppThemeNavDrawer" parent="Theme.AppCompat.NoActionBar"&gt;
          &lt;item name="colorAccent"&gt;#F8F8F8&lt;/item&gt;
          &lt;item name="android:windowTranslucentStatus"&gt;true&lt;/item&gt;
  
          &lt;item name="windowActionBar"&gt;false&lt;/item&gt;
          &lt;item name="windowActionModeOverlay"&gt;true&lt;/item&gt;
          &lt;item name="android:windowDrawsSystemBarBackgrounds"&gt;true&lt;/item&gt;
          &lt;item name="android:statusBarColor"&gt;@android:color/transparent&lt;/item&gt;
      &lt;/style&gt;
  &lt;/resources&gt;
  </code></pre>
  
  <p>I've looked at the 2014 I/O app source code as well as <a href="https://stackoverflow.com/questions/26745300/navigation-drawer-semi-transparent-over-status-bar-not-working">this</a> question, and I don't know what is so different.</p>
  
  <p>Here's a screenshot of what I have so far minus the drawer under the status bar:
  <img src="https://i.stack.imgur.com/3NuQA.png" alt="Screenshot"></p>
  
  <p>I've got everything else working perfectly and this is the last thing I need to do. Help is greatly appreciated!</p>
  
  <h2>Edit:</h2>
  
  <p>To clarify, I want to have the image be tinted under the status bar just like in most of the Google Apps and Google Now.</p>