1 /* 2 * Copyright 2013 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 17 package com.example.android.immersive; 18 19 import android.app.Activity; 20 import android.os.Bundle; 21 import android.os.Handler; 22 import android.os.Message; 23 import android.view.GestureDetector; 24 import android.view.MotionEvent; 25 import android.view.View; 26 27 public class ImmersiveActivity extends Activity { 28 private static final int INITIAL_HIDE_DELAY = 300; 29 30 private View mDecorView; 31 32 @Override 33 protected void onCreate(Bundle savedInstanceState) { 34 super.onCreate(savedInstanceState); 35 setContentView(R.layout.immersive_activity); 36 37 final View controlsView = findViewById(R.id.fullscreen_content_controls); 38 final View contentView = findViewById(R.id.fullscreen_content); 39 40 mDecorView = getWindow().getDecorView(); 41 mDecorView.setOnSystemUiVisibilityChangeListener( 42 new View.OnSystemUiVisibilityChangeListener() { 43 @Override 44 public void onSystemUiVisibilityChange(int flags) { 45 boolean visible = (flags & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; 46 controlsView.animate() 47 .alpha(visible ? 1 : 0) 48 .translationY(visible ? 0 : controlsView.getHeight()); 49 } 50 }); 51 contentView.setClickable(true); 52 final GestureDetector clickDetector = new GestureDetector(this, 53 new GestureDetector.SimpleOnGestureListener() { 54 @Override 55 public boolean onSingleTapUp(MotionEvent e) { 56 boolean visible = (mDecorView.getSystemUiVisibility() 57 & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; 58 if (visible) { 59 hideSystemUI(); 60 } else { 61 showSystemUI(); 62 } 63 return true; 64 } 65 }); 66 contentView.setOnTouchListener(new View.OnTouchListener() { 67 @Override 68 public boolean onTouch(View view, MotionEvent motionEvent) { 69 return clickDetector.onTouchEvent(motionEvent); 70 } 71 }); 72 73 showSystemUI(); 74 } 75 76 @Override 77 public void onWindowFocusChanged(boolean hasFocus) { 78 super.onWindowFocusChanged(hasFocus); 79 80 // When the window loses focus (e.g. the action overflow is shown), 81 // cancel any pending hide action. When the window gains focus, 82 // hide the system UI. 83 if (hasFocus) { 84 delayedHide(INITIAL_HIDE_DELAY); 85 } else { 86 mHideHandler.removeMessages(0); 87 } 88 } 89 90 private void hideSystemUI() { 91 mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 92 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 93 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 94 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 95 | View.SYSTEM_UI_FLAG_FULLSCREEN 96 | View.SYSTEM_UI_FLAG_LOW_PROFILE 97 | View.SYSTEM_UI_FLAG_IMMERSIVE); 98 } 99 100 private void showSystemUI() { 101 mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 102 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 103 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 104 } 105 106 private final Handler mHideHandler = new Handler() { 107 @Override 108 public void handleMessage(Message msg) { 109 hideSystemUI(); 110 } 111 }; 112 113 private void delayedHide(int delayMillis) { 114 mHideHandler.removeMessages(0); 115 mHideHandler.sendEmptyMessageDelayed(0, delayMillis); 116 } 117 } 118