/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.advancedimmersivemode; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import com.example.android.common.logger.Log; /** * Demonstrates how to update the app's UI by toggling immersive mode. * Checkboxes are also made available for toggling other UI flags which can * alter the behavior of immersive mode. */ public class AdvancedImmersiveModeFragment extends Fragment { public static final String TAG = "AdvancedImmersiveModeFragment"; public CheckBox mHideNavCheckbox; public CheckBox mHideStatusBarCheckBox; public CheckBox mImmersiveModeCheckBox; public CheckBox mImmersiveModeStickyCheckBox; public CheckBox mLowProfileCheckBox; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final View decorView = getActivity().getWindow().getDecorView(); ViewGroup parentView = (ViewGroup) getActivity().getWindow().getDecorView() .findViewById(R.id.sample_main_layout); mLowProfileCheckBox = new CheckBox(getActivity()); mLowProfileCheckBox.setText("Enable Low Profile mode."); parentView.addView(mLowProfileCheckBox); mHideNavCheckbox = new CheckBox(getActivity()); mHideNavCheckbox.setChecked(true); mHideNavCheckbox.setText("Hide Navigation bar"); parentView.addView(mHideNavCheckbox); mHideStatusBarCheckBox = new CheckBox(getActivity()); mHideStatusBarCheckBox.setChecked(true); mHideStatusBarCheckBox.setText("Hide Status Bar"); parentView.addView(mHideStatusBarCheckBox); mImmersiveModeCheckBox = new CheckBox(getActivity()); mImmersiveModeCheckBox.setText("Enable Immersive Mode."); parentView.addView(mImmersiveModeCheckBox); mImmersiveModeStickyCheckBox = new CheckBox(getActivity()); mImmersiveModeStickyCheckBox.setText("Enable Immersive Mode (Sticky)"); parentView.addView(mImmersiveModeStickyCheckBox); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.sample_action) { toggleImmersiveMode(); } return true; } /** * Detects and toggles immersive mode (also known as "hidey bar" mode). */ public void toggleImmersiveMode() { // BEGIN_INCLUDE (get_current_ui_flags) // The "Decor View" is the parent view of the Activity. It's also conveniently the easiest // one to find from within a fragment, since there's a handy helper method to pull it, and // we don't have to bother with picking a view somewhere deeper in the hierarchy and calling // "findViewById" on it. View decorView = getActivity().getWindow().getDecorView(); int uiOptions = decorView.getSystemUiVisibility(); int newUiOptions = uiOptions; // END_INCLUDE (get_current_ui_flags) // BEGIN_INCLUDE (toggle_lowprofile_mode) // Low profile mode doesn't resize the screen at all, but it covers the nav & status bar // icons with black so they're less distracting. Unlike "full screen" and "hide nav bar," // this mode doesn't interact with immersive mode at all, but it's instructive when running // this sample to observe the differences in behavior. if (mLowProfileCheckBox.isChecked()) { newUiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE; } else { newUiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; } // END_INCLUDE (toggle_lowprofile_mode) // BEGIN_INCLUDE (toggle_fullscreen_mode) // When enabled, this flag hides non-critical UI, such as the status bar, // which usually shows notification icons, battery life, etc // on phone-sized devices. The bar reappears when the user swipes it down. When immersive // mode is also enabled, the app-drawable area expands, and when the status bar is swiped // down, it appears semi-transparently and slides in over the app, instead of pushing it // down. if (mHideStatusBarCheckBox.isChecked()) { newUiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN; } else { newUiOptions &= ~View.SYSTEM_UI_FLAG_FULLSCREEN; } // END_INCLUDE (toggle_fullscreen_mode) // BEGIN_INCLUDE (toggle_hidenav_mode) // When enabled, this flag hides the black nav bar along the bottom, // where the home/back buttons are. The nav bar normally instantly reappears // when the user touches the screen. When immersive mode is also enabled, the nav bar // stays hidden until the user swipes it back. if (mHideNavCheckbox.isChecked()) { newUiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } else { newUiOptions &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } // END_INCLUDE (toggle_hidenav_mode) // BEGIN_INCLUDE (toggle_immersive_mode) // Immersive mode doesn't do anything without at least one of the previous flags // enabled. When enabled, it allows the user to swipe the status and/or nav bars // off-screen. When the user swipes the bars back onto the screen, the flags are cleared // and immersive mode is automatically disabled. if (mImmersiveModeCheckBox.isChecked()) { newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE; } else { newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE; } // END_INCLUDE (toggle_immersive_mode) // BEGIN_INCLUDE (toggle_immersive_mode_sticky) // There's actually two forms of immersive mode, normal and "sticky". Sticky immersive mode // is different in 2 key ways: // // * Uses semi-transparent bars for the nav and status bars // * This UI flag will *not* be cleared when the user interacts with the UI. // When the user swipes, the bars will temporarily appear for a few seconds and then // disappear again. if (mImmersiveModeStickyCheckBox.isChecked()) { newUiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } else { newUiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } // END_INCLUDE (toggle_immersive_mode_sticky) // BEGIN_INCLUDE (set_ui_flags) //Set the new UI flags. decorView.setSystemUiVisibility(newUiOptions); Log.i(TAG, "Current height: " + decorView.getHeight() + ", width: " + decorView.getWidth()); // END_INCLUDE (set_ui_flags) } }