Home | History | Annotate | Download | only in com.example.android.immersivemode
      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.immersivemode;
     17 
     18 import android.os.Build;
     19 import android.os.Bundle;
     20 import android.support.v4.app.Fragment;
     21 import android.view.MenuItem;
     22 import android.view.View;
     23 
     24 import com.example.android.common.logger.Log;
     25 
     26 public class ImmersiveModeFragment extends Fragment {
     27 
     28     public static final String TAG = "ImmersiveModeFragment";
     29 
     30     @Override
     31     public void onCreate(Bundle savedInstanceState) {
     32         super.onCreate(savedInstanceState);
     33         setHasOptionsMenu(true);
     34     }
     35 
     36     @Override
     37     public void onActivityCreated(Bundle savedInstanceState) {
     38         super.onActivityCreated(savedInstanceState);
     39         final View decorView = getActivity().getWindow().getDecorView();
     40         decorView.setOnSystemUiVisibilityChangeListener(
     41                 new View.OnSystemUiVisibilityChangeListener() {
     42                     @Override
     43                     public void onSystemUiVisibilityChange(int i) {
     44                         int height = decorView.getHeight();
     45                         Log.i(TAG, "Current height: " + height);
     46                     }
     47                 });
     48     }
     49 
     50     @Override
     51     public boolean onOptionsItemSelected(MenuItem item) {
     52         if (item.getItemId() == R.id.sample_action) {
     53             toggleHideyBar();
     54         }
     55         return true;
     56     }
     57 
     58     /**
     59      * Detects and toggles immersive mode (also known as "hidey bar" mode).
     60      */
     61     public void toggleHideyBar() {
     62 
     63         // BEGIN_INCLUDE (get_current_ui_flags)
     64         // The UI options currently enabled are represented by a bitfield.
     65         // getSystemUiVisibility() gives us that bitfield.
     66         int uiOptions = getActivity().getWindow().getDecorView().getSystemUiVisibility();
     67         int newUiOptions = uiOptions;
     68         // END_INCLUDE (get_current_ui_flags)
     69         // BEGIN_INCLUDE (toggle_ui_flags)
     70         boolean isImmersiveModeEnabled =
     71                 ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
     72         if (isImmersiveModeEnabled) {
     73             Log.i(TAG, "Turning immersive mode mode off. ");
     74         } else {
     75             Log.i(TAG, "Turning immersive mode mode on.");
     76         }
     77 
     78         // Navigation bar hiding:  Backwards compatible to ICS.
     79         if (Build.VERSION.SDK_INT >= 14) {
     80             newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
     81         }
     82 
     83         // Status bar hiding: Backwards compatible to Jellybean
     84         if (Build.VERSION.SDK_INT >= 16) {
     85             newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
     86         }
     87 
     88         // Immersive mode: Backward compatible to KitKat.
     89         // Note that this flag doesn't do anything by itself, it only augments the behavior
     90         // of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample
     91         // all three flags are being toggled together.
     92         // Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
     93         // Sticky immersive mode differs in that it makes the navigation and status bars
     94         // semi-transparent, and the UI flag does not get cleared when the user interacts with
     95         // the screen.
     96         if (Build.VERSION.SDK_INT >= 18) {
     97             newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
     98         }
     99 
    100         getActivity().getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
    101         //END_INCLUDE (set_ui_flags)
    102     }
    103 }
    104