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
onCreate(Bundle savedInstanceState)31     public void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         setHasOptionsMenu(true);
34     }
35 
36     @Override
onActivityCreated(Bundle savedInstanceState)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
onOptionsItemSelected(MenuItem item)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      */
toggleHideyBar()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