blob: 54c466696e6b65ec47e2af9a6e9a36637d99a8e2 [file] [log] [blame]
Daniel Sandler8956dbb2011-04-22 07:55:02 -04001/*
2 * Copyright (C) 2008 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
17package com.android.systemui.statusbar.phone;
18
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040019import android.animation.Animator;
20import android.animation.AnimatorListenerAdapter;
John Spurlock1bbd49d2012-10-19 11:09:32 -040021import android.animation.LayoutTransition;
Daniel Sandler328310c2011-09-23 15:56:52 -040022import android.app.StatusBarManager;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040023import android.content.Context;
Daniel Sandler60ee2562011-07-22 12:34:33 -040024import android.content.res.Resources;
Jeff Browna8b9def2012-07-23 14:22:49 -070025import android.graphics.Point;
Daniel Sandler48852952011-12-01 14:34:23 -050026import android.graphics.Rect;
Daniel Sandler2c9ae752012-04-27 00:14:54 -040027import android.graphics.drawable.Drawable;
Daniel Sandler0b69b592012-01-23 21:08:36 -050028import android.os.Handler;
29import android.os.Message;
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040030import android.os.ServiceManager;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040031import android.util.AttributeSet;
Daniel Sandler60ee2562011-07-22 12:34:33 -040032import android.util.Slog;
Daniel Sandlere137a1e2011-08-17 16:47:19 -040033import android.view.animation.AccelerateInterpolator;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040034import android.view.Display;
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040035import android.view.MotionEvent;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040036import android.view.View;
37import android.view.Surface;
John Spurlock1bbd49d2012-10-19 11:09:32 -040038import android.view.ViewGroup;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040039import android.view.WindowManager;
Daniel Sandler328310c2011-09-23 15:56:52 -040040import android.widget.ImageView;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040041import android.widget.LinearLayout;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040042
Daniel Sandler48852952011-12-01 14:34:23 -050043import java.io.FileDescriptor;
44import java.io.PrintWriter;
Daniel Sandler48852952011-12-01 14:34:23 -050045
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040046import com.android.internal.statusbar.IStatusBarService;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040047import com.android.systemui.R;
Jim Millere898ac52012-04-06 17:10:57 -070048import com.android.systemui.statusbar.BaseStatusBar;
49import com.android.systemui.statusbar.DelegateViewHelper;
Daniel Sandlerc26185b2012-08-29 15:49:53 -040050import com.android.systemui.statusbar.policy.DeadZone;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040051
52public class NavigationBarView extends LinearLayout {
Daniel Sandler60ee2562011-07-22 12:34:33 -040053 final static boolean DEBUG = false;
Daniel Sandler6da2b762011-09-14 16:04:59 -040054 final static String TAG = "PhoneStatusBar/NavigationBarView";
Daniel Sandler60ee2562011-07-22 12:34:33 -040055
Daniel Sandlerf86f8982011-05-31 15:46:13 -040056 final static boolean NAVBAR_ALWAYS_AT_RIGHT = true;
57
Daniel Sandlerc3fc3222012-10-25 13:28:33 -040058 // slippery nav bar when everything is disabled, e.g. during setup
59 final static boolean SLIPPERY_WHEN_DISABLED= true;
60
Daniel Sandlere137a1e2011-08-17 16:47:19 -040061 final static boolean ANIMATE_HIDE_TRANSITION = false; // turned off because it introduces unsightly delay when videos goes to full screen
62
Daniel Sandler1d4d30a2011-04-28 12:35:29 -040063 protected IStatusBarService mBarService;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040064 final Display mDisplay;
Daniel Sandler5c8da942011-06-28 00:29:04 -040065 View mCurrentView = null;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040066 View[] mRotatedViews = new View[4];
Daniel Sandler60ee2562011-07-22 12:34:33 -040067
68 int mBarSize;
69 boolean mVertical;
John Spurlock1bbd49d2012-10-19 11:09:32 -040070 boolean mScreenOn;
Daniel Sandler60ee2562011-07-22 12:34:33 -040071
Daniel Sandler56598cd2011-09-15 16:02:56 -040072 boolean mHidden, mLowProfile, mShowMenu;
Daniel Sandler6da2b762011-09-14 16:04:59 -040073 int mDisabledFlags = 0;
Daniel Sandler328310c2011-09-23 15:56:52 -040074 int mNavigationIconHints = 0;
Daniel Sandler8956dbb2011-04-22 07:55:02 -040075
Daniel Sandler2c9ae752012-04-27 00:14:54 -040076 private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon;
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -070077 private Drawable mRecentIcon;
Fabrice Di Meglio18d98242013-01-17 10:57:40 -080078 private Drawable mRecentLandIcon;
79
Jim Millere898ac52012-04-06 17:10:57 -070080 private DelegateViewHelper mDelegateHelper;
Daniel Sandlerc26185b2012-08-29 15:49:53 -040081 private DeadZone mDeadZone;
Jim Millere898ac52012-04-06 17:10:57 -070082
Daniel Sandler0b69b592012-01-23 21:08:36 -050083 // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288)
84 final static boolean WORKAROUND_INVALID_LAYOUT = true;
85 final static int MSG_CHECK_INVALID_LAYOUT = 8686;
86
87 private class H extends Handler {
88 public void handleMessage(Message m) {
89 switch (m.what) {
90 case MSG_CHECK_INVALID_LAYOUT:
91 final String how = "" + m.obj;
92 final int w = getWidth();
93 final int h = getHeight();
94 final int vw = mCurrentView.getWidth();
95 final int vh = mCurrentView.getHeight();
96
97 if (h != vh || w != vw) {
98 Slog.w(TAG, String.format(
99 "*** Invalid layout in navigation bar (%s this=%dx%d cur=%dx%d)",
100 how, w, h, vw, vh));
101 if (WORKAROUND_INVALID_LAYOUT) {
102 requestLayout();
103 }
104 }
105 break;
106 }
107 }
108 }
109
Jim Millere898ac52012-04-06 17:10:57 -0700110 public void setDelegateView(View view) {
111 mDelegateHelper.setDelegateView(view);
112 }
113
114 public void setBar(BaseStatusBar phoneStatusBar) {
115 mDelegateHelper.setBar(phoneStatusBar);
116 }
117
118 @Override
Jim Miller960892c2012-05-23 15:50:04 -0700119 public boolean onTouchEvent(MotionEvent event) {
Daniel Sandlerc26185b2012-08-29 15:49:53 -0400120 if (mDeadZone != null && event.getAction() == MotionEvent.ACTION_OUTSIDE) {
121 mDeadZone.poke(event);
Jim Miller960892c2012-05-23 15:50:04 -0700122 }
Daniel Sandlerc26185b2012-08-29 15:49:53 -0400123 if (mDelegateHelper != null) {
124 boolean ret = mDelegateHelper.onInterceptTouchEvent(event);
125 if (ret) return true;
126 }
127 return super.onTouchEvent(event);
Jim Miller960892c2012-05-23 15:50:04 -0700128 }
129
130 @Override
Jim Millere898ac52012-04-06 17:10:57 -0700131 public boolean onInterceptTouchEvent(MotionEvent event) {
132 return mDelegateHelper.onInterceptTouchEvent(event);
133 }
134
Daniel Sandler0b69b592012-01-23 21:08:36 -0500135 private H mHandler = new H();
136
Daniel Sandler5c8da942011-06-28 00:29:04 -0400137 public View getRecentsButton() {
138 return mCurrentView.findViewById(R.id.recent_apps);
139 }
140
141 public View getMenuButton() {
142 return mCurrentView.findViewById(R.id.menu);
143 }
144
Mike Lockwoode3646dd2011-09-01 12:46:28 -0400145 public View getBackButton() {
146 return mCurrentView.findViewById(R.id.back);
147 }
148
149 public View getHomeButton() {
150 return mCurrentView.findViewById(R.id.home);
151 }
152
Daniel Sandlerd5483c32012-10-19 16:44:15 -0400153 // for when home is disabled, but search isn't
154 public View getSearchLight() {
155 return mCurrentView.findViewById(R.id.search_light);
156 }
157
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400158 public NavigationBarView(Context context, AttributeSet attrs) {
159 super(context, attrs);
Daniel Sandler96f48182011-08-17 09:50:35 -0400160
Daniel Sandler60ee2562011-07-22 12:34:33 -0400161 mHidden = false;
162
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400163 mDisplay = ((WindowManager)context.getSystemService(
164 Context.WINDOW_SERVICE)).getDefaultDisplay();
Daniel Sandler1d4d30a2011-04-28 12:35:29 -0400165 mBarService = IStatusBarService.Stub.asInterface(
166 ServiceManager.getService(Context.STATUS_BAR_SERVICE));
167
Daniel Sandler60ee2562011-07-22 12:34:33 -0400168 final Resources res = mContext.getResources();
169 mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size);
170 mVertical = false;
Daniel Sandler56598cd2011-09-15 16:02:56 -0400171 mShowMenu = false;
Jim Millere898ac52012-04-06 17:10:57 -0700172 mDelegateHelper = new DelegateViewHelper(this);
Daniel Sandler2c9ae752012-04-27 00:14:54 -0400173
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700174 getIcons(res);
175 }
176
177 private void getIcons(Resources res) {
Daniel Sandler2c9ae752012-04-27 00:14:54 -0400178 mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);
179 mBackLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_land);
180 mBackAltIcon = res.getDrawable(R.drawable.ic_sysbar_back_ime);
181 mBackAltLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_ime);
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700182 mRecentIcon = res.getDrawable(R.drawable.ic_sysbar_recent);
Fabrice Di Meglio18d98242013-01-17 10:57:40 -0800183 mRecentLandIcon = res.getDrawable(R.drawable.ic_sysbar_recent_land);
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700184 }
185
186 @Override
187 public void setLayoutDirection(int layoutDirection) {
188 getIcons(mContext.getResources());
189
190 super.setLayoutDirection(layoutDirection);
Daniel Sandler1d4d30a2011-04-28 12:35:29 -0400191 }
192
John Spurlock1bbd49d2012-10-19 11:09:32 -0400193 public void notifyScreenOn(boolean screenOn) {
194 mScreenOn = screenOn;
195 setDisabledFlags(mDisabledFlags, true);
196 }
197
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400198 View.OnTouchListener mLightsOutListener = new View.OnTouchListener() {
199 @Override
200 public boolean onTouch(View v, MotionEvent ev) {
201 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
202 // even though setting the systemUI visibility below will turn these views
203 // on, we need them to come up faster so that they can catch this motion
204 // event
Daniel Sandler6da2b762011-09-14 16:04:59 -0400205 setLowProfile(false, false, false);
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400206
207 try {
Dianne Hackborn3a3a6cf2012-03-26 10:24:04 -0700208 mBarService.setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE);
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400209 } catch (android.os.RemoteException ex) {
210 }
211 }
212 return false;
213 }
214 };
215
Daniel Sandler328310c2011-09-23 15:56:52 -0400216 public void setNavigationIconHints(int hints) {
217 setNavigationIconHints(hints, false);
218 }
219
220 public void setNavigationIconHints(int hints, boolean force) {
221 if (!force && hints == mNavigationIconHints) return;
222
223 if (DEBUG) {
224 android.widget.Toast.makeText(mContext,
225 "Navigation icon hints = " + hints,
226 500).show();
227 }
228
229 mNavigationIconHints = hints;
230
231 getBackButton().setAlpha(
232 (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP)) ? 0.5f : 1.0f);
233 getHomeButton().setAlpha(
234 (0 != (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP)) ? 0.5f : 1.0f);
235 getRecentsButton().setAlpha(
236 (0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f);
237
Daniel Sandler2c9ae752012-04-27 00:14:54 -0400238 ((ImageView)getBackButton()).setImageDrawable(
Daniel Sandler328310c2011-09-23 15:56:52 -0400239 (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT))
Daniel Sandler2c9ae752012-04-27 00:14:54 -0400240 ? (mVertical ? mBackAltLandIcon : mBackAltIcon)
241 : (mVertical ? mBackLandIcon : mBackIcon));
John Spurlocka9b46822012-11-02 10:42:39 -0400242
Fabrice Di Meglio18d98242013-01-17 10:57:40 -0800243 ((ImageView)getRecentsButton()).setImageDrawable(mVertical ? mRecentLandIcon : mRecentIcon);
Fabrice Di Meglio8afcd142012-07-27 18:27:11 -0700244
John Spurlocka9b46822012-11-02 10:42:39 -0400245 setDisabledFlags(mDisabledFlags, true);
Daniel Sandler328310c2011-09-23 15:56:52 -0400246 }
247
Daniel Sandler6da2b762011-09-14 16:04:59 -0400248 public void setDisabledFlags(int disabledFlags) {
Daniel Sandler6da2b762011-09-14 16:04:59 -0400249 setDisabledFlags(disabledFlags, false);
250 }
251
252 public void setDisabledFlags(int disabledFlags, boolean force) {
253 if (!force && mDisabledFlags == disabledFlags) return;
254
255 mDisabledFlags = disabledFlags;
256
Daniel Sandlerdba93562011-10-06 16:39:58 -0400257 final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
258 final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0);
John Spurlocka9b46822012-11-02 10:42:39 -0400259 final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
260 && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
Daniel Sandlerd5483c32012-10-19 16:44:15 -0400261 final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0);
Daniel Sandler029d5872011-09-12 00:58:58 -0400262
Daniel Sandlerc3fc3222012-10-25 13:28:33 -0400263 if (SLIPPERY_WHEN_DISABLED) {
264 setSlippery(disableHome && disableRecent && disableBack && disableSearch);
265 }
John Spurlockd5ef5462012-06-13 11:19:51 -0400266
John Spurlock1bbd49d2012-10-19 11:09:32 -0400267 if (!mScreenOn && mCurrentView != null) {
268 ViewGroup navButtons = (ViewGroup) mCurrentView.findViewById(R.id.nav_buttons);
269 LayoutTransition lt = navButtons == null ? null : navButtons.getLayoutTransition();
270 if (lt != null) {
271 lt.disableTransitionType(
272 LayoutTransition.CHANGE_APPEARING | LayoutTransition.CHANGE_DISAPPEARING |
273 LayoutTransition.APPEARING | LayoutTransition.DISAPPEARING);
274 }
275 }
276
Daniel Sandler029d5872011-09-12 00:58:58 -0400277 getBackButton() .setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE);
Daniel Sandlerdba93562011-10-06 16:39:58 -0400278 getHomeButton() .setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE);
279 getRecentsButton().setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE);
Daniel Sandlerd5483c32012-10-19 16:44:15 -0400280
281 getSearchLight().setVisibility((disableHome && !disableSearch) ? View.VISIBLE : View.GONE);
Daniel Sandler56598cd2011-09-15 16:02:56 -0400282 }
283
John Spurlockd5ef5462012-06-13 11:19:51 -0400284 public void setSlippery(boolean newSlippery) {
285 WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams();
286 if (lp != null) {
287 boolean oldSlippery = (lp.flags & WindowManager.LayoutParams.FLAG_SLIPPERY) != 0;
288 if (!oldSlippery && newSlippery) {
289 lp.flags |= WindowManager.LayoutParams.FLAG_SLIPPERY;
290 } else if (oldSlippery && !newSlippery) {
291 lp.flags &= ~WindowManager.LayoutParams.FLAG_SLIPPERY;
292 } else {
293 return;
294 }
Jeff Brown98365d72012-08-19 20:30:52 -0700295 WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
296 wm.updateViewLayout(this, lp);
John Spurlockd5ef5462012-06-13 11:19:51 -0400297 }
298 }
299
Daniel Sandler56598cd2011-09-15 16:02:56 -0400300 public void setMenuVisibility(final boolean show) {
301 setMenuVisibility(show, false);
302 }
303
304 public void setMenuVisibility(final boolean show, final boolean force) {
305 if (!force && mShowMenu == show) return;
306
307 mShowMenu = show;
308
Daniel Sandlerdba93562011-10-06 16:39:58 -0400309 getMenuButton().setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE);
Daniel Sandler029d5872011-09-12 00:58:58 -0400310 }
311
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400312 public void setLowProfile(final boolean lightsOut) {
Daniel Sandler6da2b762011-09-14 16:04:59 -0400313 setLowProfile(lightsOut, true, false);
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400314 }
315
Daniel Sandler6da2b762011-09-14 16:04:59 -0400316 public void setLowProfile(final boolean lightsOut, final boolean animate, final boolean force) {
317 if (!force && lightsOut == mLowProfile) return;
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400318
319 mLowProfile = lightsOut;
320
321 if (DEBUG) Slog.d(TAG, "setting lights " + (lightsOut?"out":"on"));
322
323 final View navButtons = mCurrentView.findViewById(R.id.nav_buttons);
324 final View lowLights = mCurrentView.findViewById(R.id.lights_out);
325
Daniel Sandlerf0e8daa2011-09-20 10:44:59 -0400326 // ok, everyone, stop it right there
327 navButtons.animate().cancel();
328 lowLights.animate().cancel();
329
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400330 if (!animate) {
Daniel Sandlerf0e8daa2011-09-20 10:44:59 -0400331 navButtons.setAlpha(lightsOut ? 0f : 1f);
332
333 lowLights.setAlpha(lightsOut ? 1f : 0f);
334 lowLights.setVisibility(lightsOut ? View.VISIBLE : View.GONE);
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400335 } else {
336 navButtons.animate()
337 .alpha(lightsOut ? 0f : 1f)
Daniel Sandlerd7e96862012-04-26 01:10:29 -0400338 .setDuration(lightsOut ? 750 : 250)
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400339 .start();
340
341 lowLights.setOnTouchListener(mLightsOutListener);
Daniel Sandlerf0e8daa2011-09-20 10:44:59 -0400342 if (lowLights.getVisibility() == View.GONE) {
343 lowLights.setAlpha(0f);
344 lowLights.setVisibility(View.VISIBLE);
345 }
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400346 lowLights.animate()
347 .alpha(lightsOut ? 1f : 0f)
Daniel Sandlerd7e96862012-04-26 01:10:29 -0400348 .setDuration(lightsOut ? 750 : 250)
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400349 .setInterpolator(new AccelerateInterpolator(2.0f))
350 .setListener(lightsOut ? null : new AnimatorListenerAdapter() {
351 @Override
352 public void onAnimationEnd(Animator _a) {
353 lowLights.setVisibility(View.GONE);
354 }
355 })
356 .start();
357 }
358 }
359
Daniel Sandler60ee2562011-07-22 12:34:33 -0400360 public void setHidden(final boolean hide) {
361 if (hide == mHidden) return;
362
363 mHidden = hide;
364 Slog.d(TAG,
365 (hide ? "HIDING" : "SHOWING") + " navigation bar");
366
Daniel Sandlere137a1e2011-08-17 16:47:19 -0400367 // bring up the lights no matter what
368 setLowProfile(false);
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400369 }
370
Jim Miller960892c2012-05-23 15:50:04 -0700371 @Override
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400372 public void onFinishInflate() {
373 mRotatedViews[Surface.ROTATION_0] =
374 mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0);
375
376 mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90);
377
Daniel Sandlerf86f8982011-05-31 15:46:13 -0400378 mRotatedViews[Surface.ROTATION_270] = NAVBAR_ALWAYS_AT_RIGHT
379 ? findViewById(R.id.rot90)
380 : findViewById(R.id.rot270);
Daniel Sandler5c8da942011-06-28 00:29:04 -0400381
382 mCurrentView = mRotatedViews[Surface.ROTATION_0];
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400383 }
384
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400385 public void reorient() {
386 final int rot = mDisplay.getRotation();
387 for (int i=0; i<4; i++) {
388 mRotatedViews[i].setVisibility(View.GONE);
389 }
Daniel Sandler5c8da942011-06-28 00:29:04 -0400390 mCurrentView = mRotatedViews[rot];
391 mCurrentView.setVisibility(View.VISIBLE);
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400392
Daniel Sandlerc26185b2012-08-29 15:49:53 -0400393 mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone);
394
Daniel Sandler6da2b762011-09-14 16:04:59 -0400395 // force the low profile & disabled states into compliance
396 setLowProfile(mLowProfile, false, true /* force */);
397 setDisabledFlags(mDisabledFlags, true /* force */);
Daniel Sandler56598cd2011-09-15 16:02:56 -0400398 setMenuVisibility(mShowMenu, true /* force */);
Daniel Sandler6da2b762011-09-14 16:04:59 -0400399
Daniel Sandler60ee2562011-07-22 12:34:33 -0400400 if (DEBUG) {
401 Slog.d(TAG, "reorient(): rot=" + mDisplay.getRotation());
402 }
Michael Jurkaa5d0ddb2012-03-09 17:41:41 -0800403
404 setNavigationIconHints(mNavigationIconHints, true);
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400405 }
Daniel Sandler48852952011-12-01 14:34:23 -0500406
Daniel Sandler0b69b592012-01-23 21:08:36 -0500407 @Override
Jim Miller960892c2012-05-23 15:50:04 -0700408 protected void onLayout(boolean changed, int l, int t, int r, int b) {
409 super.onLayout(changed, l, t, r, b);
410 mDelegateHelper.setInitialTouchRegion(getHomeButton(), getBackButton(), getRecentsButton());
411 }
412
413 @Override
Daniel Sandler0b69b592012-01-23 21:08:36 -0500414 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
415 if (DEBUG) Slog.d(TAG, String.format(
416 "onSizeChanged: (%dx%d) old: (%dx%d)", w, h, oldw, oldh));
Daniel Sandlere03bc952012-04-27 16:11:22 -0400417
418 final boolean newVertical = w > 0 && h > w;
419 if (newVertical != mVertical) {
420 mVertical = newVertical;
421 //Slog.v(TAG, String.format("onSizeChanged: h=%d, w=%d, vert=%s", h, w, mVertical?"y":"n"));
422 reorient();
423 }
424
Daniel Sandler0b69b592012-01-23 21:08:36 -0500425 postCheckForInvalidLayout("sizeChanged");
426 super.onSizeChanged(w, h, oldw, oldh);
427 }
428
429 /*
430 @Override
431 protected void onLayout (boolean changed, int left, int top, int right, int bottom) {
432 if (DEBUG) Slog.d(TAG, String.format(
433 "onLayout: %s (%d,%d,%d,%d)",
434 changed?"changed":"notchanged", left, top, right, bottom));
435 super.onLayout(changed, left, top, right, bottom);
436 }
437
438 // uncomment this for extra defensiveness in WORKAROUND_INVALID_LAYOUT situations: if all else
439 // fails, any touch on the display will fix the layout.
440 @Override
441 public boolean onInterceptTouchEvent(MotionEvent ev) {
442 if (DEBUG) Slog.d(TAG, "onInterceptTouchEvent: " + ev.toString());
443 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
444 postCheckForInvalidLayout("touch");
445 }
446 return super.onInterceptTouchEvent(ev);
447 }
448 */
449
450
Daniel Sandler48852952011-12-01 14:34:23 -0500451 private String getResourceName(int resId) {
452 if (resId != 0) {
453 final android.content.res.Resources res = mContext.getResources();
454 try {
455 return res.getResourceName(resId);
456 } catch (android.content.res.Resources.NotFoundException ex) {
457 return "(unknown)";
458 }
459 } else {
460 return "(null)";
461 }
462 }
463
Daniel Sandler0b69b592012-01-23 21:08:36 -0500464 private void postCheckForInvalidLayout(final String how) {
465 mHandler.obtainMessage(MSG_CHECK_INVALID_LAYOUT, 0, 0, how).sendToTarget();
466 }
467
Daniel Sandler48852952011-12-01 14:34:23 -0500468 private static String visibilityToString(int vis) {
469 switch (vis) {
470 case View.INVISIBLE:
471 return "INVISIBLE";
472 case View.GONE:
473 return "GONE";
474 default:
475 return "VISIBLE";
476 }
477 }
478
479 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
480 pw.println("NavigationBarView {");
481 final Rect r = new Rect();
Jeff Browna8b9def2012-07-23 14:22:49 -0700482 final Point size = new Point();
483 mDisplay.getRealSize(size);
Daniel Sandler48852952011-12-01 14:34:23 -0500484
485 pw.println(String.format(" this: " + PhoneStatusBar.viewInfo(this)
486 + " " + visibilityToString(getVisibility())));
487
488 getWindowVisibleDisplayFrame(r);
Jeff Browna8b9def2012-07-23 14:22:49 -0700489 final boolean offscreen = r.right > size.x || r.bottom > size.y;
Daniel Sandler48852952011-12-01 14:34:23 -0500490 pw.println(" window: "
491 + r.toShortString()
492 + " " + visibilityToString(getWindowVisibility())
493 + (offscreen ? " OFFSCREEN!" : ""));
494
495 pw.println(String.format(" mCurrentView: id=%s (%dx%d) %s",
496 getResourceName(mCurrentView.getId()),
497 mCurrentView.getWidth(), mCurrentView.getHeight(),
498 visibilityToString(mCurrentView.getVisibility())));
499
500 pw.println(String.format(" disabled=0x%08x vertical=%s hidden=%s low=%s menu=%s",
501 mDisabledFlags,
502 mVertical ? "true" : "false",
503 mHidden ? "true" : "false",
504 mLowProfile ? "true" : "false",
505 mShowMenu ? "true" : "false"));
506
507 final View back = getBackButton();
508 final View home = getHomeButton();
509 final View recent = getRecentsButton();
510 final View menu = getMenuButton();
511
512 pw.println(" back: "
513 + PhoneStatusBar.viewInfo(back)
514 + " " + visibilityToString(back.getVisibility())
515 );
516 pw.println(" home: "
517 + PhoneStatusBar.viewInfo(home)
518 + " " + visibilityToString(home.getVisibility())
519 );
520 pw.println(" rcnt: "
521 + PhoneStatusBar.viewInfo(recent)
522 + " " + visibilityToString(recent.getVisibility())
523 );
524 pw.println(" menu: "
525 + PhoneStatusBar.viewInfo(menu)
526 + " " + visibilityToString(menu.getVisibility())
527 );
528 pw.println(" }");
529 }
Jim Millere898ac52012-04-06 17:10:57 -0700530
Daniel Sandler8956dbb2011-04-22 07:55:02 -0400531}