Home | History | Annotate | Download | only in com.example.android.advancedimmersivemode
      1 /*
      2 * Copyright (C) 2012 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 *      http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 package com.example.android.advancedimmersivemode;
     17 
     18 import android.os.Bundle;
     19 import android.support.v4.app.Fragment;
     20 import android.view.MenuItem;
     21 import android.view.View;
     22 import android.view.ViewGroup;
     23 import android.widget.CheckBox;
     24 
     25 import com.example.android.common.logger.Log;
     26 
     27 /**
     28  * Demonstrates how to update the app's UI by toggling immersive mode.
     29  * Checkboxes are also made available for toggling other UI flags which can
     30  * alter the behavior of immersive mode.
     31  */
     32 public class AdvancedImmersiveModeFragment extends Fragment {
     33 
     34     public static final String TAG = "AdvancedImmersiveModeFragment";
     35     public CheckBox mHideNavCheckbox;
     36     public CheckBox mHideStatusBarCheckBox;
     37     public CheckBox mImmersiveModeCheckBox;
     38     public CheckBox mImmersiveModeStickyCheckBox;
     39     public CheckBox mLowProfileCheckBox;
     40 
     41 
     42     @Override
     43     public void onCreate(Bundle savedInstanceState) {
     44         super.onCreate(savedInstanceState);
     45         setHasOptionsMenu(true);
     46     }
     47 
     48     @Override
     49     public void onActivityCreated(Bundle savedInstanceState) {
     50         super.onActivityCreated(savedInstanceState);
     51 
     52         final View decorView = getActivity().getWindow().getDecorView();
     53         ViewGroup parentView = (ViewGroup) getActivity().getWindow().getDecorView()
     54                 .findViewById(R.id.sample_main_layout);
     55 
     56         mLowProfileCheckBox = new CheckBox(getActivity());
     57         mLowProfileCheckBox.setText("Enable Low Profile mode.");
     58         parentView.addView(mLowProfileCheckBox);
     59 
     60         mHideNavCheckbox = new CheckBox(getActivity());
     61         mHideNavCheckbox.setChecked(true);
     62         mHideNavCheckbox.setText("Hide Navigation bar");
     63         parentView.addView(mHideNavCheckbox);
     64 
     65         mHideStatusBarCheckBox = new CheckBox(getActivity());
     66         mHideStatusBarCheckBox.setChecked(true);
     67         mHideStatusBarCheckBox.setText("Hide Status Bar");
     68         parentView.addView(mHideStatusBarCheckBox);
     69 
     70         mImmersiveModeCheckBox = new CheckBox(getActivity());
     71         mImmersiveModeCheckBox.setText("Enable Immersive Mode.");
     72         parentView.addView(mImmersiveModeCheckBox);
     73 
     74         mImmersiveModeStickyCheckBox = new CheckBox(getActivity());
     75         mImmersiveModeStickyCheckBox.setText("Enable Immersive Mode (Sticky)");
     76         parentView.addView(mImmersiveModeStickyCheckBox);
     77 
     78     }
     79 
     80     @Override
     81     public boolean onOptionsItemSelected(MenuItem item) {
     82         if (item.getItemId() == R.id.sample_action) {
     83             toggleImmersiveMode();
     84         }
     85         return true;
     86     }
     87 
     88     /**
     89      * Detects and toggles immersive mode (also known as "hidey bar" mode).
     90      */
     91     public void toggleImmersiveMode() {
     92 
     93         // BEGIN_INCLUDE (get_current_ui_flags)
     94         // The "Decor View" is the parent view of the Activity.  It's also conveniently the easiest
     95         // one to find from within a fragment, since there's a handy helper method to pull it, and
     96         // we don't have to bother with picking a view somewhere deeper in the hierarchy and calling
     97         // "findViewById" on it.
     98         View decorView = getActivity().getWindow().getDecorView();
     99         int uiOptions = decorView.getSystemUiVisibility();
    100         int newUiOptions = uiOptions;
    101         // END_INCLUDE (get_current_ui_flags)
    102 
    103         // BEGIN_INCLUDE (toggle_lowprofile_mode)
    104         // Low profile mode doesn't resize the screen at all, but it covers the nav & status bar
    105         // icons with black so they're less distracting.  Unlike "full screen" and "hide nav bar,"
    106         // this mode doesn't interact with immersive mode at all, but it's instructive when running
    107         // this sample to observe the differences in behavior.
    108         if (mLowProfileCheckBox.isChecked()) {
    109             newUiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
    110         } else {
    111             newUiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
    112         }
    113         // END_INCLUDE (toggle_lowprofile_mode)
    114 
    115         // BEGIN_INCLUDE (toggle_fullscreen_mode)
    116         // When enabled, this flag hides non-critical UI, such as the status bar,
    117         // which usually shows notification icons, battery life, etc
    118         // on phone-sized devices.  The bar reappears when the user swipes it down.  When immersive
    119         // mode is also enabled, the app-drawable area expands, and when the status bar is swiped
    120         // down, it appears semi-transparently and slides in over the app, instead of pushing it
    121         // down.
    122         if (mHideStatusBarCheckBox.isChecked()) {
    123             newUiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
    124         } else {
    125             newUiOptions &= ~View.SYSTEM_UI_FLAG_FULLSCREEN;
    126         }
    127         // END_INCLUDE (toggle_fullscreen_mode)
    128 
    129         // BEGIN_INCLUDE (toggle_hidenav_mode)
    130         // When enabled, this flag hides the black nav bar along the bottom,
    131         // where the home/back buttons are.  The nav bar normally instantly reappears
    132         // when the user touches the screen.  When immersive mode is also enabled, the nav bar
    133         // stays hidden until the user swipes it back.
    134         if (mHideNavCheckbox.isChecked()) {
    135             newUiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    136         } else {
    137             newUiOptions &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    138         }
    139         // END_INCLUDE (toggle_hidenav_mode)
    140 
    141         // BEGIN_INCLUDE (toggle_immersive_mode)
    142         // Immersive mode doesn't do anything without at least one of the previous flags
    143         // enabled.  When enabled, it allows the user to swipe the status and/or nav bars
    144         // off-screen.  When the user swipes the bars back onto the screen, the flags are cleared
    145         // and immersive mode is automatically disabled.
    146         if (mImmersiveModeCheckBox.isChecked()) {
    147             newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE;
    148         } else {
    149             newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE;
    150         }
    151         // END_INCLUDE (toggle_immersive_mode)
    152 
    153         // BEGIN_INCLUDE (toggle_immersive_mode_sticky)
    154         // There's actually two forms of immersive mode, normal and "sticky".  Sticky immersive mode
    155         // is different in 2 key ways:
    156         //
    157         // * Uses semi-transparent bars for the nav and status bars
    158         // * This UI flag will *not* be cleared when the user interacts with the UI.
    159         //   When the user swipes, the bars will temporarily appear for a few seconds and then
    160         //   disappear again.
    161         if (mImmersiveModeStickyCheckBox.isChecked()) {
    162             newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    163         } else {
    164             newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    165         }
    166         // END_INCLUDE (toggle_immersive_mode_sticky)
    167 
    168         // BEGIN_INCLUDE (set_ui_flags)
    169         //Set the new UI flags.
    170         decorView.setSystemUiVisibility(newUiOptions);
    171         Log.i(TAG, "Current height: " + decorView.getHeight() + ", width: " + decorView.getWidth());
    172         // END_INCLUDE (set_ui_flags)
    173     }
    174 }
    175