| rev |
line source |
|
kshalle@2
|
1 package com.example.musicplayer;
|
|
kshalle@2
|
2
|
|
kshalle@2
|
3 import com.example.musicplayer.util.SystemUiHider;
|
|
kshalle@2
|
4
|
|
kshalle@2
|
5 import android.annotation.TargetApi;
|
|
kshalle@2
|
6 import android.app.Activity;
|
|
kshalle@2
|
7 import android.os.Build;
|
|
kshalle@2
|
8 import android.os.Bundle;
|
|
kshalle@2
|
9 import android.os.Handler;
|
|
kshalle@2
|
10 import android.view.MotionEvent;
|
|
kshalle@2
|
11 import android.view.View;
|
|
kshalle@2
|
12
|
|
kshalle@2
|
13
|
|
kshalle@2
|
14 /**
|
|
kshalle@2
|
15 * An example full-screen activity that shows and hides the system UI (i.e.
|
|
kshalle@2
|
16 * status bar and navigation/system bar) with user interaction.
|
|
kshalle@2
|
17 *
|
|
kshalle@2
|
18 * @see SystemUiHider
|
|
kshalle@2
|
19 */
|
|
kshalle@2
|
20 public class MainActivity extends Activity {
|
|
kshalle@2
|
21 /**
|
|
kshalle@2
|
22 * Whether or not the system UI should be auto-hidden after
|
|
kshalle@2
|
23 * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
|
|
kshalle@2
|
24 */
|
|
kshalle@2
|
25 private static final boolean AUTO_HIDE = true;
|
|
kshalle@2
|
26
|
|
kshalle@2
|
27 /**
|
|
kshalle@2
|
28 * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
|
|
kshalle@2
|
29 * user interaction before hiding the system UI.
|
|
kshalle@2
|
30 */
|
|
kshalle@2
|
31 private static final int AUTO_HIDE_DELAY_MILLIS = 3000;
|
|
kshalle@2
|
32
|
|
kshalle@2
|
33 /**
|
|
kshalle@2
|
34 * If set, will toggle the system UI visibility upon interaction. Otherwise,
|
|
kshalle@2
|
35 * will show the system UI visibility upon interaction.
|
|
kshalle@2
|
36 */
|
|
kshalle@2
|
37 private static final boolean TOGGLE_ON_CLICK = true;
|
|
kshalle@2
|
38
|
|
kshalle@2
|
39 /**
|
|
kshalle@2
|
40 * The flags to pass to {@link SystemUiHider#getInstance}.
|
|
kshalle@2
|
41 */
|
|
kshalle@2
|
42 private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;
|
|
kshalle@2
|
43
|
|
kshalle@2
|
44 /**
|
|
kshalle@2
|
45 * The instance of the {@link SystemUiHider} for this activity.
|
|
kshalle@2
|
46 */
|
|
kshalle@2
|
47 private SystemUiHider mSystemUiHider;
|
|
kshalle@2
|
48
|
|
kshalle@2
|
49 @Override
|
|
kshalle@2
|
50 protected void onCreate(Bundle savedInstanceState) {
|
|
kshalle@2
|
51 super.onCreate(savedInstanceState);
|
|
kshalle@2
|
52
|
|
kshalle@2
|
53 setContentView(R.layout.activity_main);
|
|
kshalle@2
|
54
|
|
kshalle@2
|
55 final View controlsView = findViewById(R.id.fullscreen_content_controls);
|
|
kshalle@2
|
56 final View contentView = findViewById(R.id.fullscreen_content);
|
|
kshalle@2
|
57
|
|
kshalle@2
|
58 // Set up an instance of SystemUiHider to control the system UI for
|
|
kshalle@2
|
59 // this activity.
|
|
kshalle@2
|
60 mSystemUiHider = SystemUiHider.getInstance(this, contentView, HIDER_FLAGS);
|
|
kshalle@2
|
61 mSystemUiHider.setup();
|
|
kshalle@2
|
62 mSystemUiHider
|
|
kshalle@2
|
63 .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
|
|
kshalle@2
|
64 // Cached values.
|
|
kshalle@2
|
65 int mControlsHeight;
|
|
kshalle@2
|
66 int mShortAnimTime;
|
|
kshalle@2
|
67
|
|
kshalle@2
|
68 @Override
|
|
kshalle@2
|
69 @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
|
|
kshalle@2
|
70 public void onVisibilityChange(boolean visible) {
|
|
kshalle@2
|
71 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
|
|
kshalle@2
|
72 // If the ViewPropertyAnimator API is available
|
|
kshalle@2
|
73 // (Honeycomb MR2 and later), use it to animate the
|
|
kshalle@2
|
74 // in-layout UI controls at the bottom of the
|
|
kshalle@2
|
75 // screen.
|
|
kshalle@2
|
76 if (mControlsHeight == 0) {
|
|
kshalle@2
|
77 mControlsHeight = controlsView.getHeight();
|
|
kshalle@2
|
78 }
|
|
kshalle@2
|
79 if (mShortAnimTime == 0) {
|
|
kshalle@2
|
80 mShortAnimTime = getResources().getInteger(
|
|
kshalle@2
|
81 android.R.integer.config_shortAnimTime);
|
|
kshalle@2
|
82 }
|
|
kshalle@2
|
83 controlsView.animate()
|
|
kshalle@2
|
84 .translationY(visible ? 0 : mControlsHeight)
|
|
kshalle@2
|
85 .setDuration(mShortAnimTime);
|
|
kshalle@2
|
86 } else {
|
|
kshalle@2
|
87 // If the ViewPropertyAnimator APIs aren't
|
|
kshalle@2
|
88 // available, simply show or hide the in-layout UI
|
|
kshalle@2
|
89 // controls.
|
|
kshalle@2
|
90 controlsView.setVisibility(visible ? View.VISIBLE : View.GONE);
|
|
kshalle@2
|
91 }
|
|
kshalle@2
|
92
|
|
kshalle@2
|
93 if (visible && AUTO_HIDE) {
|
|
kshalle@2
|
94 // Schedule a hide().
|
|
kshalle@2
|
95 delayedHide(AUTO_HIDE_DELAY_MILLIS);
|
|
kshalle@2
|
96 }
|
|
kshalle@2
|
97 }
|
|
kshalle@2
|
98 });
|
|
kshalle@2
|
99
|
|
kshalle@2
|
100 // Set up the user interaction to manually show or hide the system UI.
|
|
kshalle@2
|
101 contentView.setOnClickListener(new View.OnClickListener() {
|
|
kshalle@2
|
102 @Override
|
|
kshalle@2
|
103 public void onClick(View view) {
|
|
kshalle@2
|
104 if (TOGGLE_ON_CLICK) {
|
|
kshalle@2
|
105 mSystemUiHider.toggle();
|
|
kshalle@2
|
106 } else {
|
|
kshalle@2
|
107 mSystemUiHider.show();
|
|
kshalle@2
|
108 }
|
|
kshalle@2
|
109 }
|
|
kshalle@2
|
110 });
|
|
kshalle@2
|
111
|
|
kshalle@2
|
112 // Upon interacting with UI controls, delay any scheduled hide()
|
|
kshalle@2
|
113 // operations to prevent the jarring behavior of controls going away
|
|
kshalle@2
|
114 // while interacting with the UI.
|
|
kshalle@2
|
115 findViewById(R.id.dummy_button).setOnTouchListener(mDelayHideTouchListener);
|
|
kshalle@2
|
116 }
|
|
kshalle@2
|
117
|
|
kshalle@2
|
118 @Override
|
|
kshalle@2
|
119 protected void onPostCreate(Bundle savedInstanceState) {
|
|
kshalle@2
|
120 super.onPostCreate(savedInstanceState);
|
|
kshalle@2
|
121
|
|
kshalle@2
|
122 // Trigger the initial hide() shortly after the activity has been
|
|
kshalle@2
|
123 // created, to briefly hint to the user that UI controls
|
|
kshalle@2
|
124 // are available.
|
|
kshalle@2
|
125 delayedHide(100);
|
|
kshalle@2
|
126 }
|
|
kshalle@2
|
127
|
|
kshalle@2
|
128
|
|
kshalle@2
|
129 /**
|
|
kshalle@2
|
130 * Touch listener to use for in-layout UI controls to delay hiding the
|
|
kshalle@2
|
131 * system UI. This is to prevent the jarring behavior of controls going away
|
|
kshalle@2
|
132 * while interacting with activity UI.
|
|
kshalle@2
|
133 */
|
|
kshalle@2
|
134 View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
|
|
kshalle@2
|
135 @Override
|
|
kshalle@2
|
136 public boolean onTouch(View view, MotionEvent motionEvent) {
|
|
kshalle@2
|
137 if (AUTO_HIDE) {
|
|
kshalle@2
|
138 delayedHide(AUTO_HIDE_DELAY_MILLIS);
|
|
kshalle@2
|
139 }
|
|
kshalle@2
|
140 return false;
|
|
kshalle@2
|
141 }
|
|
kshalle@2
|
142 };
|
|
kshalle@2
|
143
|
|
kshalle@2
|
144 Handler mHideHandler = new Handler();
|
|
kshalle@2
|
145 Runnable mHideRunnable = new Runnable() {
|
|
kshalle@2
|
146 @Override
|
|
kshalle@2
|
147 public void run() {
|
|
kshalle@2
|
148 mSystemUiHider.hide();
|
|
kshalle@2
|
149 }
|
|
kshalle@2
|
150 };
|
|
kshalle@2
|
151
|
|
kshalle@2
|
152 /**
|
|
kshalle@2
|
153 * Schedules a call to hide() in [delay] milliseconds, canceling any
|
|
kshalle@2
|
154 * previously scheduled calls.
|
|
kshalle@2
|
155 */
|
|
kshalle@2
|
156 private void delayedHide(int delayMillis) {
|
|
kshalle@2
|
157 mHideHandler.removeCallbacks(mHideRunnable);
|
|
kshalle@2
|
158 mHideHandler.postDelayed(mHideRunnable, delayMillis);
|
|
kshalle@2
|
159 }
|
|
kshalle@2
|
160 }
|