186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato/* 286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Copyright (C) 2008 The Android Open Source Project 386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * 486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * you may not use this file except in compliance with the License. 686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * You may obtain a copy of the License at 786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * 886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * 1086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * Unless required by applicable law or agreed to in writing, software 1186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 1286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * See the License for the specific language governing permissions and 1486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * limitations under the License. 1586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato */ 1686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 1786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratopackage com.android.internal.policy.impl; 1886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 1986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.app.KeyguardManager; 2086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.app.SearchManager; 2186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.content.ActivityNotFoundException; 2286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.content.Context; 2386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.content.Intent; 2486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.content.res.Configuration; 2586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.media.AudioManager; 26c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Triviimport android.media.IAudioService; 279a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErikimport android.media.session.MediaSessionLegacyHelper; 28c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Triviimport android.os.RemoteException; 29c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Triviimport android.os.ServiceManager; 305ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 31a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brownimport android.provider.Settings; 3286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.telephony.TelephonyManager; 33c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Triviimport android.util.Log; 3486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.view.View; 3586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.view.HapticFeedbackConstants; 3686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.view.FallbackEventHandler; 3786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.view.KeyEvent; 3886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 3986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratopublic class PhoneFallbackEventHandler implements FallbackEventHandler { 4047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown private static String TAG = "PhoneFallbackEventHandler"; 4147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown private static final boolean DEBUG = false; 4286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 4386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Context mContext; 4486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato View mView; 4586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 4686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato AudioManager mAudioManager; 4786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato KeyguardManager mKeyguardManager; 4886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato SearchManager mSearchManager; 4986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato TelephonyManager mTelephonyManager; 5086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 5186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato public PhoneFallbackEventHandler(Context context) { 5286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mContext = context; 5386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 5486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 5586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato public void setView(View v) { 5686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mView = v; 5786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 5886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 5986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato public void preDispatchKeyEvent(KeyEvent event) { 60ce952c8e13c535bedde77bcdb94dfcc7508475aaMike Lockwood getAudioManager().preDispatchKeyEvent(event, AudioManager.USE_DEFAULT_STREAM_TYPE); 6186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 6286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 6386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato public boolean dispatchKeyEvent(KeyEvent event) { 6486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 6586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato final int action = event.getAction(); 6686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato final int keyCode = event.getKeyCode(); 6786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 6886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (action == KeyEvent.ACTION_DOWN) { 6986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return onKeyDown(keyCode, event); 7086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } else { 7186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return onKeyUp(keyCode, event); 7286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 7386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 749a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 7586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato boolean onKeyDown(int keyCode, KeyEvent event) { 7686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* **************************************************************************** 7786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * HOW TO DECIDE WHERE YOUR KEY HANDLING GOES. 7886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * See the comment in PhoneWindow.onKeyDown 7986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * ****************************************************************************/ 8086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato final KeyEvent.DispatcherState dispatcher = mView.getKeyDispatcherState(); 819a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 8286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 8386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 8486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 8586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_MUTE: { 863c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(event, false); 8786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 8886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 8986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 9086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 9186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PLAY: 9286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PAUSE: 9386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 9486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato /* Suppress PLAY/PAUSE toggle when phone is ringing or in-call 9586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato * to avoid music playback */ 9686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getTelephonyManager().getCallState() != TelephonyManager.CALL_STATE_IDLE) { 9786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; // suppress key event 9886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 9986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MUTE: 10086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_HEADSETHOOK: 10186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_STOP: 10286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_NEXT: 10386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 10486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_REWIND: 10586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_RECORD: 106bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 107bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: { 108c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi handleMediaKeyEvent(event); 10986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 11086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 11186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 11286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CALL: { 11386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode() || dispatcher == null) { 11486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 11586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 11686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.getRepeatCount() == 0) { 11786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.startTracking(event, this); 11886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } else if (event.isLongPress() && dispatcher.isTracking(event)) { 11986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.performedLongPress(event); 120a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown if (isUserSetupComplete()) { 121a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 122a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // launch the VoiceDialer 123a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Intent intent = new Intent(Intent.ACTION_VOICE_COMMAND); 124a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 125a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown try { 126a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown sendCloseSystemWindows(); 127a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown mContext.startActivity(intent); 128a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } catch (ActivityNotFoundException e) { 129a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown startCallActivity(); 130a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } 131a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } else { 132a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Log.i(TAG, "Not starting call activity because user " 133a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown + "setup is in progress."); 13486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 13786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 13986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CAMERA: { 14086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode() || dispatcher == null) { 14186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 14286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 14386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.getRepeatCount() == 0) { 14486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.startTracking(event, this); 14586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } else if (event.isLongPress() && dispatcher.isTracking(event)) { 14686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.performedLongPress(event); 147a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown if (isUserSetupComplete()) { 148a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 149a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown sendCloseSystemWindows(); 150a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // Broadcast an intent that the Camera button was longpressed 151a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Intent intent = new Intent(Intent.ACTION_CAMERA_BUTTON, null); 152a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown intent.putExtra(Intent.EXTRA_KEY_EVENT, event); 153a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF, 154a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown null, null, null, 0, null, null); 155a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } else { 156a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Log.i(TAG, "Not dispatching CAMERA long press because user " 157a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown + "setup is in progress."); 158a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } 15986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 16086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 16186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 16286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 16386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_SEARCH: { 16486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode() || dispatcher == null) { 16586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 16686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 16786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.getRepeatCount() == 0) { 16886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.startTracking(event, this); 16986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } else if (event.isLongPress() && dispatcher.isTracking(event)) { 1709a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik Configuration config = mContext.getResources().getConfiguration(); 17186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (config.keyboard == Configuration.KEYBOARD_NOKEYS 17286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { 173a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown if (isUserSetupComplete()) { 174a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // launch the search activity 175a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Intent intent = new Intent(Intent.ACTION_SEARCH_LONG_PRESS); 176a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 177a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown try { 178a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 179a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown sendCloseSystemWindows(); 180a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown getSearchManager().stopSearch(); 181a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown mContext.startActivity(intent); 182a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // Only clear this if we successfully start the 183a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // activity; otherwise we will allow the normal short 184a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // press action to be performed. 185a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown dispatcher.performedLongPress(event); 186a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown return true; 187a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } catch (ActivityNotFoundException e) { 188a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown // Ignore 189a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } 190a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } else { 191a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Log.i(TAG, "Not dispatching SEARCH long press because user " 192a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown + "setup is in progress."); 19386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 19486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 19586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 19686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 19786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 19886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 19986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return false; 20086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 20186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 20286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato boolean onKeyUp(int keyCode, KeyEvent event) { 20347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown if (DEBUG) { 204a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Log.d(TAG, "up " + keyCode); 20547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 20686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato final KeyEvent.DispatcherState dispatcher = mView.getKeyDispatcherState(); 20786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (dispatcher != null) { 20886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.handleUpEvent(event); 20986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 2109a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 21186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 21286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 21386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 21486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_MUTE: { 21586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (!event.isCanceled()) { 2163c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(event, false); 21786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 21886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 21986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 22086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 22186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_HEADSETHOOK: 22286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MUTE: 22386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PLAY: 22486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PAUSE: 22586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 22686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_STOP: 22786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_NEXT: 22886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 22986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_REWIND: 23086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_RECORD: 231bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 232bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: { 233c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi handleMediaKeyEvent(event); 23486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 23586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 23686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 23786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CAMERA: { 23886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode()) { 23986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 24086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 24186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.isTracking() && !event.isCanceled()) { 24286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // Add short press behavior here if desired 24386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 24486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 24586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 24686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 24786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CALL: { 24886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode()) { 24986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 25086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 25186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.isTracking() && !event.isCanceled()) { 252a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown if (isUserSetupComplete()) { 253a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown startCallActivity(); 254a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } else { 255a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Log.i(TAG, "Not starting call activity because user " 256a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown + "setup is in progress."); 257a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } 25886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 25986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 26086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 26186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 26286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return false; 26386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 26486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 26586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato void startCallActivity() { 26686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato sendCloseSystemWindows(); 26786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Intent intent = new Intent(Intent.ACTION_CALL_BUTTON); 26886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 26986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato try { 27086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mContext.startActivity(intent); 27186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } catch (ActivityNotFoundException e) { 272a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Log.w(TAG, "No activity found for android.intent.action.CALL_BUTTON."); 27386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 27486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 27586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 27686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato SearchManager getSearchManager() { 27786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mSearchManager == null) { 27886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); 27986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 28086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mSearchManager; 28186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 28286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 28386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato TelephonyManager getTelephonyManager() { 28486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mTelephonyManager == null) { 28586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mTelephonyManager = (TelephonyManager)mContext.getSystemService( 28686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Context.TELEPHONY_SERVICE); 28786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 28886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mTelephonyManager; 28986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 29086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 29186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato KeyguardManager getKeyguardManager() { 29286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mKeyguardManager == null) { 29386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mKeyguardManager = (KeyguardManager)mContext.getSystemService(Context.KEYGUARD_SERVICE); 29486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 29586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mKeyguardManager; 29686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 2979a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 29886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato AudioManager getAudioManager() { 29986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mAudioManager == null) { 30086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 30186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 30286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mAudioManager; 30386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 3049a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 30586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato void sendCloseSystemWindows() { 30686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato PhoneWindowManager.sendCloseSystemWindows(mContext, null); 30786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 308c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi 309c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi private void handleMediaKeyEvent(KeyEvent keyEvent) { 310430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper.getHelper(mContext).sendMediaButtonEvent(keyEvent, false); 311c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi } 312a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown 313a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown private boolean isUserSetupComplete() { 314a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown return Settings.Secure.getInt(mContext.getContentResolver(), 315a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown Settings.Secure.USER_SETUP_COMPLETE, 0) != 0; 316a6f3009942a8d004b30a55dca5b3f7291bb09e38Jeff Brown } 31786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato} 31886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 319