18956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler/* 28956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * Copyright (C) 2008 The Android Open Source Project 38956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * 48956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 58956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * you may not use this file except in compliance with the License. 68956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * You may obtain a copy of the License at 78956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * 88956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 98956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * 108956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * Unless required by applicable law or agreed to in writing, software 118956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 128956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * See the License for the specific language governing permissions and 148956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler * limitations under the License. 158956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler */ 168956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 178956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerpackage com.android.systemui.statusbar.phone; 188956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 191d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandlerimport android.animation.Animator; 201d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandlerimport android.animation.AnimatorListenerAdapter; 211bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlockimport android.animation.LayoutTransition; 22328310c6fac6066d338926bb43d359862cae36d2Daniel Sandlerimport android.app.StatusBarManager; 238956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.content.Context; 2460ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandlerimport android.content.res.Resources; 25a8b9defade5b937d4ad64f9aff4bca792298f43cJeff Brownimport android.graphics.Point; 26488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandlerimport android.graphics.Rect; 272c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandlerimport android.graphics.drawable.Drawable; 280b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandlerimport android.os.Handler; 290b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandlerimport android.os.Message; 301d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandlerimport android.os.ServiceManager; 318956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.util.AttributeSet; 3260ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandlerimport android.util.Slog; 33e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandlerimport android.view.animation.AccelerateInterpolator; 348956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.view.Display; 351d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandlerimport android.view.MotionEvent; 368956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.view.View; 378956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.view.Surface; 381bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlockimport android.view.ViewGroup; 398956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.view.WindowManager; 40328310c6fac6066d338926bb43d359862cae36d2Daniel Sandlerimport android.widget.ImageView; 418956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport android.widget.LinearLayout; 428956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 43488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandlerimport java.io.FileDescriptor; 44488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandlerimport java.io.PrintWriter; 45488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 461d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandlerimport com.android.internal.statusbar.IStatusBarService; 478956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerimport com.android.systemui.R; 48e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerimport com.android.systemui.statusbar.BaseStatusBar; 49e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Millerimport com.android.systemui.statusbar.DelegateViewHelper; 50c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandlerimport com.android.systemui.statusbar.policy.DeadZone; 518956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 528956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandlerpublic class NavigationBarView extends LinearLayout { 5360ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler final static boolean DEBUG = false; 546da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler final static String TAG = "PhoneStatusBar/NavigationBarView"; 5560ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 56f86f898f8afe73d81b34543dcb2c30d8bf7da563Daniel Sandler final static boolean NAVBAR_ALWAYS_AT_RIGHT = true; 57f86f898f8afe73d81b34543dcb2c30d8bf7da563Daniel Sandler 58c3fc32228679e6d32f3194e676508c67e6332d92Daniel Sandler // slippery nav bar when everything is disabled, e.g. during setup 59c3fc32228679e6d32f3194e676508c67e6332d92Daniel Sandler final static boolean SLIPPERY_WHEN_DISABLED= true; 60c3fc32228679e6d32f3194e676508c67e6332d92Daniel Sandler 61e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler final static boolean ANIMATE_HIDE_TRANSITION = false; // turned off because it introduces unsightly delay when videos goes to full screen 62e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 631d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler protected IStatusBarService mBarService; 648956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler final Display mDisplay; 655c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler View mCurrentView = null; 668956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler View[] mRotatedViews = new View[4]; 6760ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 6860ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler int mBarSize; 6960ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler boolean mVertical; 701bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock boolean mScreenOn; 7160ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 7256598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler boolean mHidden, mLowProfile, mShowMenu; 736da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler int mDisabledFlags = 0; 74328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler int mNavigationIconHints = 0; 758956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 762c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler private Drawable mBackIcon, mBackLandIcon, mBackAltIcon, mBackAltLandIcon; 77e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler 78e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller private DelegateViewHelper mDelegateHelper; 79c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler private DeadZone mDeadZone; 80e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller 810b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler // workaround for LayoutTransitions leaving the nav buttons in a weird state (bug 5549288) 820b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final static boolean WORKAROUND_INVALID_LAYOUT = true; 830b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final static int MSG_CHECK_INVALID_LAYOUT = 8686; 840b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 850b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler private class H extends Handler { 860b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler public void handleMessage(Message m) { 870b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler switch (m.what) { 880b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler case MSG_CHECK_INVALID_LAYOUT: 890b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final String how = "" + m.obj; 900b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final int w = getWidth(); 910b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final int h = getHeight(); 920b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final int vw = mCurrentView.getWidth(); 930b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler final int vh = mCurrentView.getHeight(); 940b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 950b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler if (h != vh || w != vw) { 960b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler Slog.w(TAG, String.format( 970b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler "*** Invalid layout in navigation bar (%s this=%dx%d cur=%dx%d)", 980b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler how, w, h, vw, vh)); 990b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler if (WORKAROUND_INVALID_LAYOUT) { 1000b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler requestLayout(); 1010b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 1020b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 1030b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler break; 1040b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 1050b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 1060b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 1070b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 108e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller public void setDelegateView(View view) { 109e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller mDelegateHelper.setDelegateView(view); 110e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller } 111e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller 112e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller public void setBar(BaseStatusBar phoneStatusBar) { 113e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller mDelegateHelper.setBar(phoneStatusBar); 114e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller } 115e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller 116e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller @Override 117960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller public boolean onTouchEvent(MotionEvent event) { 118c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler if (mDeadZone != null && event.getAction() == MotionEvent.ACTION_OUTSIDE) { 119c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler mDeadZone.poke(event); 120c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler } 121960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller if (mDelegateHelper != null) { 122c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler boolean ret = mDelegateHelper.onInterceptTouchEvent(event); 123c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler if (ret) return true; 124960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller } 125c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler return super.onTouchEvent(event); 126960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller } 127960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller 128960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller @Override 129e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller public boolean onInterceptTouchEvent(MotionEvent event) { 130e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller return mDelegateHelper.onInterceptTouchEvent(event); 131e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller } 132e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller 1330b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler private H mHandler = new H(); 1340b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 1355c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler public View getRecentsButton() { 1365c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler return mCurrentView.findViewById(R.id.recent_apps); 1375c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler } 1385c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler 1395c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler public View getMenuButton() { 1405c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler return mCurrentView.findViewById(R.id.menu); 1415c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler } 1425c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler 143e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood public View getBackButton() { 144e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood return mCurrentView.findViewById(R.id.back); 145e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood } 146e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood 147e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood public View getHomeButton() { 148e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood return mCurrentView.findViewById(R.id.home); 149e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood } 150e3646dd8d96fb9756c8a7a4757ad5277e3801aedMike Lockwood 151d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler // for when home is disabled, but search isn't 152d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler public View getSearchLight() { 153d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler return mCurrentView.findViewById(R.id.search_light); 154d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler } 155d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler 1568956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler public NavigationBarView(Context context, AttributeSet attrs) { 1578956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler super(context, attrs); 15896f4818ef41141649337d4dee09f837594e93d09Daniel Sandler 15960ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler mHidden = false; 16060ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 1618956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler mDisplay = ((WindowManager)context.getSystemService( 1628956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler Context.WINDOW_SERVICE)).getDefaultDisplay(); 1631d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler mBarService = IStatusBarService.Stub.asInterface( 1641d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler ServiceManager.getService(Context.STATUS_BAR_SERVICE)); 1651d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler 16660ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler final Resources res = mContext.getResources(); 16760ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size); 16860ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler mVertical = false; 16956598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler mShowMenu = false; 170e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller mDelegateHelper = new DelegateViewHelper(this); 1712c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler 1722c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back); 1732c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler mBackLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_land); 1742c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler mBackAltIcon = res.getDrawable(R.drawable.ic_sysbar_back_ime); 1752c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler mBackAltLandIcon = res.getDrawable(R.drawable.ic_sysbar_back_ime); 1761d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler } 1771d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler 1781bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock public void notifyScreenOn(boolean screenOn) { 1791bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock mScreenOn = screenOn; 1801bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock setDisabledFlags(mDisabledFlags, true); 1811bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock } 1821bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock 183e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler View.OnTouchListener mLightsOutListener = new View.OnTouchListener() { 184e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler @Override 185e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler public boolean onTouch(View v, MotionEvent ev) { 186e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler if (ev.getAction() == MotionEvent.ACTION_DOWN) { 187e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler // even though setting the systemUI visibility below will turn these views 188e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler // on, we need them to come up faster so that they can catch this motion 189e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler // event 1906da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler setLowProfile(false, false, false); 191e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 192e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler try { 1933a3a6cfd8ec12208ca75c0d0d871d19d76c34194Dianne Hackborn mBarService.setSystemUiVisibility(0, View.SYSTEM_UI_FLAG_LOW_PROFILE); 194e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } catch (android.os.RemoteException ex) { 195e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 196e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 197e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler return false; 198e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 199e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler }; 200e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 201328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler public void setNavigationIconHints(int hints) { 202328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler setNavigationIconHints(hints, false); 203328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler } 204328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 205328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler public void setNavigationIconHints(int hints, boolean force) { 206328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler if (!force && hints == mNavigationIconHints) return; 207328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 208328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler if (DEBUG) { 209328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler android.widget.Toast.makeText(mContext, 210328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler "Navigation icon hints = " + hints, 211328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 500).show(); 212328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler } 213328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 214328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler mNavigationIconHints = hints; 215328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 216328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler getBackButton().setAlpha( 217328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_NOP)) ? 0.5f : 1.0f); 218328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler getHomeButton().setAlpha( 219328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler (0 != (hints & StatusBarManager.NAVIGATION_HINT_HOME_NOP)) ? 0.5f : 1.0f); 220328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler getRecentsButton().setAlpha( 221328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler (0 != (hints & StatusBarManager.NAVIGATION_HINT_RECENT_NOP)) ? 0.5f : 1.0f); 222328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 2232c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler ((ImageView)getBackButton()).setImageDrawable( 224328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler (0 != (hints & StatusBarManager.NAVIGATION_HINT_BACK_ALT)) 2252c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler ? (mVertical ? mBackAltLandIcon : mBackAltIcon) 2262c9ae7538819b77c8814217b93a6ef0bf417854aDaniel Sandler : (mVertical ? mBackLandIcon : mBackIcon)); 227a9b468248dde3e9b6b1971e7c580b82a308820bdJohn Spurlock 228a9b468248dde3e9b6b1971e7c580b82a308820bdJohn Spurlock setDisabledFlags(mDisabledFlags, true); 229328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler } 230328310c6fac6066d338926bb43d359862cae36d2Daniel Sandler 2316da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler public void setDisabledFlags(int disabledFlags) { 2326da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler setDisabledFlags(disabledFlags, false); 2336da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler } 2346da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler 2356da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler public void setDisabledFlags(int disabledFlags, boolean force) { 2366da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler if (!force && mDisabledFlags == disabledFlags) return; 2376da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler 2386da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler mDisabledFlags = disabledFlags; 2396da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler 240dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0); 241dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0); 242a9b468248dde3e9b6b1971e7c580b82a308820bdJohn Spurlock final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0) 243a9b468248dde3e9b6b1971e7c580b82a308820bdJohn Spurlock && ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0); 244d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0); 245029d5877b0c19af09c6a1cb7d1c3d3507e88430cDaniel Sandler 246c3fc32228679e6d32f3194e676508c67e6332d92Daniel Sandler if (SLIPPERY_WHEN_DISABLED) { 247c3fc32228679e6d32f3194e676508c67e6332d92Daniel Sandler setSlippery(disableHome && disableRecent && disableBack && disableSearch); 248c3fc32228679e6d32f3194e676508c67e6332d92Daniel Sandler } 249d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock 2501bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock if (!mScreenOn && mCurrentView != null) { 2511bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock ViewGroup navButtons = (ViewGroup) mCurrentView.findViewById(R.id.nav_buttons); 2521bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock LayoutTransition lt = navButtons == null ? null : navButtons.getLayoutTransition(); 2531bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock if (lt != null) { 2541bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock lt.disableTransitionType( 2551bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock LayoutTransition.CHANGE_APPEARING | LayoutTransition.CHANGE_DISAPPEARING | 2561bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock LayoutTransition.APPEARING | LayoutTransition.DISAPPEARING); 2571bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock } 2581bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock } 2591bbd49d72eee001137b6d6e6ab3f353fe2c0433cJohn Spurlock 260029d5877b0c19af09c6a1cb7d1c3d3507e88430cDaniel Sandler getBackButton() .setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE); 261dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler getHomeButton() .setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); 262dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler getRecentsButton().setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE); 263d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler 264d5483c3157a28e2ebc05a0c918df8a2be0a7fc89Daniel Sandler getSearchLight().setVisibility((disableHome && !disableSearch) ? View.VISIBLE : View.GONE); 26556598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler } 26656598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler 267d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock public void setSlippery(boolean newSlippery) { 268d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams(); 269d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock if (lp != null) { 270d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock boolean oldSlippery = (lp.flags & WindowManager.LayoutParams.FLAG_SLIPPERY) != 0; 271d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock if (!oldSlippery && newSlippery) { 272d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock lp.flags |= WindowManager.LayoutParams.FLAG_SLIPPERY; 273d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock } else if (oldSlippery && !newSlippery) { 274d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock lp.flags &= ~WindowManager.LayoutParams.FLAG_SLIPPERY; 275d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock } else { 276d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock return; 277d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock } 27898365d7663cbd82979a5700faf0050220b01084dJeff Brown WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE); 27998365d7663cbd82979a5700faf0050220b01084dJeff Brown wm.updateViewLayout(this, lp); 280d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock } 281d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock } 282d5ef54658ba7f869b1558df656772eebc3fb7328John Spurlock 28356598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler public void setMenuVisibility(final boolean show) { 28456598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler setMenuVisibility(show, false); 28556598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler } 28656598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler 28756598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler public void setMenuVisibility(final boolean show, final boolean force) { 28856598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler if (!force && mShowMenu == show) return; 28956598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler 29056598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler mShowMenu = show; 29156598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler 292dba935659024a9ca83cb6bd3f1a9970e277f7658Daniel Sandler getMenuButton().setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE); 293029d5877b0c19af09c6a1cb7d1c3d3507e88430cDaniel Sandler } 294029d5877b0c19af09c6a1cb7d1c3d3507e88430cDaniel Sandler 295e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler public void setLowProfile(final boolean lightsOut) { 2966da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler setLowProfile(lightsOut, true, false); 297e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 298e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 2996da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler public void setLowProfile(final boolean lightsOut, final boolean animate, final boolean force) { 3006da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler if (!force && lightsOut == mLowProfile) return; 301e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 302e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler mLowProfile = lightsOut; 303e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 304e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler if (DEBUG) Slog.d(TAG, "setting lights " + (lightsOut?"out":"on")); 305e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 306e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler final View navButtons = mCurrentView.findViewById(R.id.nav_buttons); 307e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler final View lowLights = mCurrentView.findViewById(R.id.lights_out); 308e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 309f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler // ok, everyone, stop it right there 310f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler navButtons.animate().cancel(); 311f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler lowLights.animate().cancel(); 312f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler 313e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler if (!animate) { 314f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler navButtons.setAlpha(lightsOut ? 0f : 1f); 315f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler 316f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler lowLights.setAlpha(lightsOut ? 1f : 0f); 317f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler lowLights.setVisibility(lightsOut ? View.VISIBLE : View.GONE); 318e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } else { 319e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler navButtons.animate() 320e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler .alpha(lightsOut ? 0f : 1f) 321d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler .setDuration(lightsOut ? 750 : 250) 322e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler .start(); 323e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 324e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler lowLights.setOnTouchListener(mLightsOutListener); 325f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler if (lowLights.getVisibility() == View.GONE) { 326f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler lowLights.setAlpha(0f); 327f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler lowLights.setVisibility(View.VISIBLE); 328f0e8daa405f24e23c9cb0254af79d55f5353aaecDaniel Sandler } 329e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler lowLights.animate() 330e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler .alpha(lightsOut ? 1f : 0f) 331d7e96866568cc94305db1455f4e9a9b8ada70618Daniel Sandler .setDuration(lightsOut ? 750 : 250) 332e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler .setInterpolator(new AccelerateInterpolator(2.0f)) 333e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler .setListener(lightsOut ? null : new AnimatorListenerAdapter() { 334e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler @Override 335e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler public void onAnimationEnd(Animator _a) { 336e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler lowLights.setVisibility(View.GONE); 337e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 338e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler }) 339e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler .start(); 340e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 341e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler } 342e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler 34360ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler public void setHidden(final boolean hide) { 34460ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler if (hide == mHidden) return; 34560ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 34660ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler mHidden = hide; 34760ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler Slog.d(TAG, 34860ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler (hide ? "HIDING" : "SHOWING") + " navigation bar"); 34960ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 350e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler // bring up the lights no matter what 351e137a1ea997036248c86e8fc0a94711020721f19Daniel Sandler setLowProfile(false); 3528956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler } 3538956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 354960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller @Override 3558956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler public void onFinishInflate() { 3568956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler mRotatedViews[Surface.ROTATION_0] = 3578956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0); 3588956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 3598956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90); 3608956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 361f86f898f8afe73d81b34543dcb2c30d8bf7da563Daniel Sandler mRotatedViews[Surface.ROTATION_270] = NAVBAR_ALWAYS_AT_RIGHT 362f86f898f8afe73d81b34543dcb2c30d8bf7da563Daniel Sandler ? findViewById(R.id.rot90) 363f86f898f8afe73d81b34543dcb2c30d8bf7da563Daniel Sandler : findViewById(R.id.rot270); 3645c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler 3655c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler mCurrentView = mRotatedViews[Surface.ROTATION_0]; 3668956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler } 3678956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 3688956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler public void reorient() { 3698956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler final int rot = mDisplay.getRotation(); 3708956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler for (int i=0; i<4; i++) { 3718956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler mRotatedViews[i].setVisibility(View.GONE); 3728956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler } 3735c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler mCurrentView = mRotatedViews[rot]; 3745c8da949804ed4b55dcebae63796714e0028b488Daniel Sandler mCurrentView.setVisibility(View.VISIBLE); 3758956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler 376c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone); 377c26185bb7b30508a1940eb452af64b6d8661915fDaniel Sandler 3786da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler // force the low profile & disabled states into compliance 3796da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler setLowProfile(mLowProfile, false, true /* force */); 3806da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler setDisabledFlags(mDisabledFlags, true /* force */); 38156598cd4d3712ea451f8e19e363ae86a51158d3bDaniel Sandler setMenuVisibility(mShowMenu, true /* force */); 3826da2b76ea496129da5370bfafd667ee94907a356Daniel Sandler 38360ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler if (DEBUG) { 38460ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler Slog.d(TAG, "reorient(): rot=" + mDisplay.getRotation()); 38560ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler } 386a5d0ddba60ff9877c0251ea9cf79af82d1eeb349Michael Jurka 387a5d0ddba60ff9877c0251ea9cf79af82d1eeb349Michael Jurka setNavigationIconHints(mNavigationIconHints, true); 3888956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler } 389488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 3900b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler @Override 391960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller protected void onLayout(boolean changed, int l, int t, int r, int b) { 392960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller super.onLayout(changed, l, t, r, b); 393960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller mDelegateHelper.setInitialTouchRegion(getHomeButton(), getBackButton(), getRecentsButton()); 394960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller } 395960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller 396960892c0afa7f2b91236928e29e3987ed35b2077Jim Miller @Override 3970b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler protected void onSizeChanged(int w, int h, int oldw, int oldh) { 3980b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler if (DEBUG) Slog.d(TAG, String.format( 3990b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler "onSizeChanged: (%dx%d) old: (%dx%d)", w, h, oldw, oldh)); 400e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler 401e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler final boolean newVertical = w > 0 && h > w; 402e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler if (newVertical != mVertical) { 403e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler mVertical = newVertical; 404e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler //Slog.v(TAG, String.format("onSizeChanged: h=%d, w=%d, vert=%s", h, w, mVertical?"y":"n")); 405e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler reorient(); 406e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler } 407e03bc95f06d1eee723695d14d8d884317a04bb5aDaniel Sandler 4080b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler postCheckForInvalidLayout("sizeChanged"); 4090b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler super.onSizeChanged(w, h, oldw, oldh); 4100b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 4110b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 4120b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler /* 4130b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler @Override 4140b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler protected void onLayout (boolean changed, int left, int top, int right, int bottom) { 4150b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler if (DEBUG) Slog.d(TAG, String.format( 4160b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler "onLayout: %s (%d,%d,%d,%d)", 4170b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler changed?"changed":"notchanged", left, top, right, bottom)); 4180b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler super.onLayout(changed, left, top, right, bottom); 4190b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 4200b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 4210b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler // uncomment this for extra defensiveness in WORKAROUND_INVALID_LAYOUT situations: if all else 4220b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler // fails, any touch on the display will fix the layout. 4230b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler @Override 4240b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler public boolean onInterceptTouchEvent(MotionEvent ev) { 4250b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler if (DEBUG) Slog.d(TAG, "onInterceptTouchEvent: " + ev.toString()); 4260b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler if (ev.getAction() == MotionEvent.ACTION_DOWN) { 4270b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler postCheckForInvalidLayout("touch"); 4280b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 4290b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler return super.onInterceptTouchEvent(ev); 4300b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 4310b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler */ 4320b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 4330b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 434488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler private String getResourceName(int resId) { 435488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler if (resId != 0) { 436488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler final android.content.res.Resources res = mContext.getResources(); 437488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler try { 438488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler return res.getResourceName(resId); 439488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } catch (android.content.res.Resources.NotFoundException ex) { 440488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler return "(unknown)"; 441488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } 442488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } else { 443488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler return "(null)"; 444488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } 445488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } 446488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 4470b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler private void postCheckForInvalidLayout(final String how) { 4480b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler mHandler.obtainMessage(MSG_CHECK_INVALID_LAYOUT, 0, 0, how).sendToTarget(); 4490b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler } 4500b69b59877896e4cab448cef9e12ff4c29a4252eDaniel Sandler 451488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler private static String visibilityToString(int vis) { 452488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler switch (vis) { 453488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler case View.INVISIBLE: 454488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler return "INVISIBLE"; 455488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler case View.GONE: 456488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler return "GONE"; 457488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler default: 458488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler return "VISIBLE"; 459488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } 460488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } 461488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 462488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 463488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println("NavigationBarView {"); 464488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler final Rect r = new Rect(); 465a8b9defade5b937d4ad64f9aff4bca792298f43cJeff Brown final Point size = new Point(); 466a8b9defade5b937d4ad64f9aff4bca792298f43cJeff Brown mDisplay.getRealSize(size); 467488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 468488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(String.format(" this: " + PhoneStatusBar.viewInfo(this) 469488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + " " + visibilityToString(getVisibility()))); 470488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 471488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler getWindowVisibleDisplayFrame(r); 472a8b9defade5b937d4ad64f9aff4bca792298f43cJeff Brown final boolean offscreen = r.right > size.x || r.bottom > size.y; 473488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(" window: " 474488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + r.toShortString() 475488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + " " + visibilityToString(getWindowVisibility()) 476488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + (offscreen ? " OFFSCREEN!" : "")); 477488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 478488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(String.format(" mCurrentView: id=%s (%dx%d) %s", 479488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler getResourceName(mCurrentView.getId()), 480488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler mCurrentView.getWidth(), mCurrentView.getHeight(), 481488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler visibilityToString(mCurrentView.getVisibility()))); 482488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 483488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(String.format(" disabled=0x%08x vertical=%s hidden=%s low=%s menu=%s", 484488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler mDisabledFlags, 485488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler mVertical ? "true" : "false", 486488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler mHidden ? "true" : "false", 487488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler mLowProfile ? "true" : "false", 488488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler mShowMenu ? "true" : "false")); 489488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 490488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler final View back = getBackButton(); 491488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler final View home = getHomeButton(); 492488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler final View recent = getRecentsButton(); 493488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler final View menu = getMenuButton(); 494488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler 495488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(" back: " 496488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + PhoneStatusBar.viewInfo(back) 497488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + " " + visibilityToString(back.getVisibility()) 498488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler ); 499488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(" home: " 500488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + PhoneStatusBar.viewInfo(home) 501488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + " " + visibilityToString(home.getVisibility()) 502488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler ); 503488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(" rcnt: " 504488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + PhoneStatusBar.viewInfo(recent) 505488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + " " + visibilityToString(recent.getVisibility()) 506488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler ); 507488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(" menu: " 508488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + PhoneStatusBar.viewInfo(menu) 509488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler + " " + visibilityToString(menu.getVisibility()) 510488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler ); 511488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler pw.println(" }"); 512488529506f2b767aec0c6e122e7227a9ebe067a2Daniel Sandler } 513e898ac59db04d8ab0762180ca8ec7cea1347aa09Jim Miller 5148956dbbc5f292d8b79072ae73b25f2114c8c7479Daniel Sandler} 515