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 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; 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); 102 } 103 }