StatusBarKeyguardViewManager.java revision 4222d9a7fb87d73e1443ec1a2de9782b05741af6
15cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/* 25cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project 35cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 45cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 55cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * you may not use this file except in compliance with the License. 65cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * You may obtain a copy of the License at 75cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 85cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 95cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * See the License for the specific language governing permissions and 145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * limitations under the License 155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipackage com.android.systemui.statusbar.phone; 185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 195cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.Context; 205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.Bundle; 215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.RemoteException; 225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.util.Slog; 235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.View; 245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.ViewGroup; 255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.policy.IKeyguardShowCallback; 275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.internal.widget.LockPatternUtils; 285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.ViewMediatorCallback; 295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/** 315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back 325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done, 335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * which is in turn, reported to this class by the current 345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * {@link com.android.keyguard.KeyguardViewBase}. 355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipublic class StatusBarKeyguardViewManager { 375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static String TAG = "StatusBarKeyguardViewManager"; 385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private final Context mContext; 405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private LockPatternUtils mLockPatternUtils; 425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private ViewMediatorCallback mViewMediatorCallback; 435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private PhoneStatusBar mPhoneStatusBar; 445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private ViewGroup mContainer; 465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private StatusBarWindowManager mStatusBarWindowManager; 475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 485cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private boolean mScreenOn = false; 4903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi private KeyguardBouncer mBouncer; 5003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi private boolean mShowing; 51a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi private boolean mOccluded; 525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback, 545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi LockPatternUtils lockPatternUtils) { 555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mContext = context; 565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mViewMediatorCallback = callback; 575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mLockPatternUtils = lockPatternUtils; 585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void registerStatusBar(PhoneStatusBar phoneStatusBar, 615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi ViewGroup container, StatusBarWindowManager statusBarWindowManager) { 625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mPhoneStatusBar = phoneStatusBar; 635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mContainer = container; 645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarWindowManager = statusBarWindowManager; 6503c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mBouncer = new KeyguardBouncer(mContext, mViewMediatorCallback, mLockPatternUtils, 6603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mStatusBarWindowManager, container); 675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi /** 705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Show the keyguard. Will handle creating and attaching to the view manager 715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * lazily. 725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void show(Bundle options) { 7403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mShowing = true; 75cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mStatusBarWindowManager.setKeyguardShowing(true); 76a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi showBouncerOrKeyguard(); 774222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi updateStates(); 785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 80a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi /** 81a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi * Shows the notification keyguard or the bouncer depending on 82a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi * {@link KeyguardBouncer#needsFullscreenBouncer()}. 83a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi */ 84a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi private void showBouncerOrKeyguard() { 85a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi if (mBouncer.needsFullscreenBouncer()) { 86a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi 87a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi // The keyguard might be showing (already). So we need to hide it. 88a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi mPhoneStatusBar.hideKeyguard(); 89a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi mBouncer.show(); 90a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi } else { 91a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi mPhoneStatusBar.showKeyguard(); 92a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi mBouncer.hide(); 93a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi mBouncer.prepare(); 94a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi } 95a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi } 96a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi 974222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi private void showBouncer() { 982e50f28f4154ce289748ef5c5cfdd8bd9c38c682John Spurlock mBouncer.show(); 994222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi updateStates(); 1005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1015cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1025cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi /** 1035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Reset the state of the view. 1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 1055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void reset() { 106a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi showBouncerOrKeyguard(); 1074222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi updateStates(); 1085cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1095cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onScreenTurnedOff() { 1115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mScreenOn = false; 11203c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mBouncer.onScreenTurnedOff(); 1135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onScreenTurnedOn(final IKeyguardShowCallback callback) { 1165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mScreenOn = true; 11703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi if (callback != null) { 11803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi callbackAfterDraw(callback); 1195cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void callbackAfterDraw(final IKeyguardShowCallback callback) { 12303c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mContainer.post(new Runnable() { 1245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi @Override 1255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void run() { 1265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi try { 12703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi callback.onShown(mContainer.getWindowToken()); 1285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } catch (RemoteException e) { 1295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi Slog.w(TAG, "Exception calling onShown():", e); 1305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi }); 1335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void verifyUnlock() { 13603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi dismiss(); 1375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setNeedsInput(boolean needsInput) { 140cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mStatusBarWindowManager.setKeyguardNeedsInput(needsInput); 1415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void updateUserActivityTimeout() { 14403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mStatusBarWindowManager.setKeyguardUserActivityTimeout(mBouncer.getUserActivityTimeout()); 1455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setOccluded(boolean occluded) { 148a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi mOccluded = occluded; 149cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mStatusBarWindowManager.setKeyguardOccluded(occluded); 1504222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi updateStates(); 1515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi /** 1545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Hides the keyguard view 1555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 1565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void hide() { 15703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mShowing = false; 15803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mPhoneStatusBar.hideKeyguard(); 159cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mStatusBarWindowManager.setKeyguardShowing(false); 16003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mBouncer.hide(); 16103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi mViewMediatorCallback.keyguardGone(); 1624222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi updateStates(); 1635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi /** 1665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Dismisses the keyguard by going to the next screen or making it gone. 1675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 1685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void dismiss() { 1695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (mScreenOn) { 1700bed7f258ba1fffc10f986ee043b769f1fd40ad3Jorim Jaggi showBouncer(); 1715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1741568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi public boolean isSecure() { 1751568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi return mBouncer.isSecure(); 1761568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi } 1771568250853d81befcdaef63cc8588435353c3d12Jorim Jaggi 1785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi /** 1795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @return Whether the keyguard is showing 1805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 1815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public boolean isShowing() { 18203c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi return mShowing; 1835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 184e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi 185e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi /** 186e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi * Notifies this manager that the back button has been pressed. 187e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi * 188e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi * @return whether the back press has been handled 189e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi */ 190e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi public boolean onBackPressed() { 191e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi if (mBouncer.isShowing()) { 192e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi mBouncer.hide(); 193e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi mPhoneStatusBar.showKeyguard(); 1944222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi updateStates(); 195e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi return true; 196e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi } 197e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi return false; 198e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi } 199e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi 2004222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi private void updateStates() { 201e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi int vis = mContainer.getSystemUiVisibility(); 202a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi boolean bouncerDismissable = mBouncer.isShowing() && !mBouncer.needsFullscreenBouncer(); 203a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi if (bouncerDismissable || !mShowing) { 204e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK); 205e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi } else { 206e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK); 207e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi } 208a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi if (!(mShowing && !mOccluded) || mBouncer.isShowing()) { 209a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE); 210a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi } else { 211a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE); 212a6310293c5a861cdb54f2c894e90a8d9da87f8d7Jorim Jaggi } 2134222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi mPhoneStatusBar.setBouncerShowing(mBouncer.isShowing()); 214e5c7a894635d72514d6f1e952d0f18ba6035e86dJorim Jaggi } 2158c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi 2168c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi public boolean onMenuPressed() { 2178c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi return mBouncer.onMenuPressed(); 2188c8bcc160aba9a5e93c8df2a99a39a856fafffabJorim Jaggi } 2195cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi} 220