title: How do I maintain the Immersive Mode in Dialogs?
body: <p>How do I maintain the new Immersive Mode when my activities display a custom Dialog?</p>
  
  <p>I am using the code below to maintain the Immersive Mode in Dialogs, but with that solution, the NavBar appears for less than a second when I start my custom Dialog, then it disappears.</p>
  
  <p>The following video explains the issue better (look at the bottom of the screen when the NavBar appears): <a href="http://youtu.be/epnd5ghey8g" rel="noreferrer">http://youtu.be/epnd5ghey8g</a></p>
  
  <p>How do I avoid this behavior?</p>
  
  <p><strong>CODE</strong></p>
  
  <p>The father of all activities in my application:</p>
  
  <pre><code>public abstract class ImmersiveActivity extends Activity {
  
      @SuppressLint("NewApi")
      private void disableImmersiveMode() {
          if (android.os.Build.VERSION.SDK_INT &gt;= android.os.Build.VERSION_CODES.KITKAT) {
              getWindow().getDecorView().setSystemUiVisibility(
                      View.SYSTEM_UI_FLAG_FULLSCREEN
              );
          }
      }
  
      @SuppressLint("NewApi")
      private void enableImmersiveMode() {
          if (android.os.Build.VERSION.SDK_INT &gt;= android.os.Build.VERSION_CODES.KITKAT) {
              getWindow().getDecorView().setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
                      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
                      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
                      | View.SYSTEM_UI_FLAG_FULLSCREEN 
                      | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
                      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
              );
          }
      }
  
  
      /**
       * Set the Immersive mode or not according to its state in the settings:
       * enabled or not.
       */
      protected void updateSystemUiVisibility() {
          // Retrieve if the Immersive mode is enabled or not.
          boolean enabled = getSharedPreferences(Util.PREF_NAME, 0).getBoolean(
                  "immersive_mode_enabled", true);
  
          if (enabled) enableImmersiveMode();
          else disableImmersiveMode();
      }
  
      @Override
      public void onResume() {
          super.onResume();
          updateSystemUiVisibility();
      }
  
      @Override
      public void onWindowFocusChanged(boolean hasFocus) {
          super.onWindowFocusChanged(hasFocus);
          updateSystemUiVisibility();
      }
  
  }
  </code></pre>
  
  <hr>
  
  <hr>
  
  <p>All my custom Dialogs call this method in their <code>onCreate(. . .)</code> method:</p>
  
  <pre><code>/**
   * Copy the visibility of the Activity that has started the dialog {@link mActivity}. If the
   * activity is in Immersive mode the dialog will be in Immersive mode too and vice versa.
   */
  @SuppressLint("NewApi")
  private void copySystemUiVisibility() {
      if (android.os.Build.VERSION.SDK_INT &gt;= android.os.Build.VERSION_CODES.KITKAT) {
          getWindow().getDecorView().setSystemUiVisibility(
                  mActivity.getWindow().getDecorView().getSystemUiVisibility()
          );
      }
  }
  </code></pre>
  
  <hr>
  
  <hr>
  
  <p><strong>EDIT - THE SOLUTION (thanks to Beaver6813, look his answer for more details) :</strong></p>
  
  <p>All my custom dialogs override the show method in this way:</p>
  
  <pre><code>/**
   * An hack used to show the dialogs in Immersive Mode (that is with the NavBar hidden). To
   * obtain this, the method makes the dialog not focusable before showing it, change the UI
   * visibility of the window like the owner activity of the dialog and then (after showing it)
   * makes the dialog focusable again.
   */
  @Override
  public void show() {
      // Set the dialog to not focusable.
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
              WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
  
      copySystemUiVisibility();
  
      // Show the dialog with NavBar hidden.
      super.show();
  
      // Set the dialog to focusable again.
      getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
  }
  </code></pre>