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; 3186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.telephony.TelephonyManager; 32c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Triviimport android.util.Log; 3386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onoratoimport android.util.Slog; 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); 12086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 12186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // launch the VoiceDialer 12286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Intent intent = new Intent(Intent.ACTION_VOICE_COMMAND); 12386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 12486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato try { 12586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato sendCloseSystemWindows(); 12686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mContext.startActivity(intent); 12786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } catch (ActivityNotFoundException e) { 12886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato startCallActivity(); 12986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 13286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 13486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CAMERA: { 13586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode() || dispatcher == null) { 13686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 13786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 13886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.getRepeatCount() == 0) { 13986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.startTracking(event, this); 14086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } else if (event.isLongPress() && dispatcher.isTracking(event)) { 14186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.performedLongPress(event); 14286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 14386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato sendCloseSystemWindows(); 14486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // Broadcast an intent that the Camera button was longpressed 14586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Intent intent = new Intent(Intent.ACTION_CAMERA_BUTTON, null); 14686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato intent.putExtra(Intent.EXTRA_KEY_EVENT, event); 1475ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF, 1485ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn null, null, null, 0, null, null); 14986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 15086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 15186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 15286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 15386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_SEARCH: { 15486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode() || dispatcher == null) { 15586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 15686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 15786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.getRepeatCount() == 0) { 15886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.startTracking(event, this); 15986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } else if (event.isLongPress() && dispatcher.isTracking(event)) { 1609a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik Configuration config = mContext.getResources().getConfiguration(); 16186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (config.keyboard == Configuration.KEYBOARD_NOKEYS 16286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { 16386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // launch the search activity 16486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Intent intent = new Intent(Intent.ACTION_SEARCH_LONG_PRESS); 16586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 16686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato try { 16786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 16886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato sendCloseSystemWindows(); 16986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato getSearchManager().stopSearch(); 17086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mContext.startActivity(intent); 17186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // Only clear this if we successfully start the 17286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // activity; otherwise we will allow the normal short 17386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // press action to be performed. 17486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.performedLongPress(event); 17586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 17686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } catch (ActivityNotFoundException e) { 17786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // Ignore 17886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 17986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 18086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 18186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 18286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 18386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 18486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return false; 18586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 18686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 18786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato boolean onKeyUp(int keyCode, KeyEvent event) { 18847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown if (DEBUG) { 18947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown Slog.d(TAG, "up " + keyCode); 19047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown } 19186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato final KeyEvent.DispatcherState dispatcher = mView.getKeyDispatcherState(); 19286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (dispatcher != null) { 19386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato dispatcher.handleUpEvent(event); 19486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 1959a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 19686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato switch (keyCode) { 19786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_UP: 19886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_DOWN: 19986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_VOLUME_MUTE: { 20086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (!event.isCanceled()) { 2013c45c29109d23981d8b707c809b3b43ce2e20fc3RoboErik MediaSessionLegacyHelper.getHelper(mContext).sendVolumeKeyEvent(event, false); 20286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 20386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 20486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 20586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 20686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_HEADSETHOOK: 20786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MUTE: 20886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PLAY: 20986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PAUSE: 21086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: 21186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_STOP: 21286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_NEXT: 21386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_PREVIOUS: 21486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_REWIND: 21586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_MEDIA_RECORD: 216bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: 217bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: { 218c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi handleMediaKeyEvent(event); 21986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 22086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 22186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 22286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CAMERA: { 22386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode()) { 22486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 22586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 22686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.isTracking() && !event.isCanceled()) { 22786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato // Add short press behavior here if desired 22886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 22986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 23086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 23186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 23286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato case KeyEvent.KEYCODE_CALL: { 23386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (getKeyguardManager().inKeyguardRestrictedInputMode()) { 23486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato break; 23586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 23686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (event.isTracking() && !event.isCanceled()) { 23786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato startCallActivity(); 23886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 23986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return true; 24086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 24186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 24286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return false; 24386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 24486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 24586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato void startCallActivity() { 24686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato sendCloseSystemWindows(); 24786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Intent intent = new Intent(Intent.ACTION_CALL_BUTTON); 24886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 24986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato try { 25086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mContext.startActivity(intent); 25186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } catch (ActivityNotFoundException e) { 25286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Slog.w(TAG, "No activity found for android.intent.action.CALL_BUTTON."); 25386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 25486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 25586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 25686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato SearchManager getSearchManager() { 25786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mSearchManager == null) { 25886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); 25986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 26086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mSearchManager; 26186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 26286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 26386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato TelephonyManager getTelephonyManager() { 26486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mTelephonyManager == null) { 26586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mTelephonyManager = (TelephonyManager)mContext.getSystemService( 26686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato Context.TELEPHONY_SERVICE); 26786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 26886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mTelephonyManager; 26986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 27086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 27186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato KeyguardManager getKeyguardManager() { 27286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mKeyguardManager == null) { 27386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mKeyguardManager = (KeyguardManager)mContext.getSystemService(Context.KEYGUARD_SERVICE); 27486f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 27586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mKeyguardManager; 27686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 2779a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 27886f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato AudioManager getAudioManager() { 27986f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato if (mAudioManager == null) { 28086f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); 28186f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 28286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato return mAudioManager; 28386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 2849a9d0b5f6f4be758ed6c8b837a9dd01a451bc0c0RoboErik 28586f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato void sendCloseSystemWindows() { 28686f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato PhoneWindowManager.sendCloseSystemWindows(mContext, null); 28786f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato } 288c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi 289c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi private void handleMediaKeyEvent(KeyEvent keyEvent) { 290430fc48865e5a371b08f180390946b96d73848feRoboErik MediaSessionLegacyHelper.getHelper(mContext).sendMediaButtonEvent(keyEvent, false); 291c68022258ebd3dd97a5079ba99f4f3cd12b223b0Jean-Michel Trivi } 29286f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato} 29386f6786032b1a0380cf089aeeceef7e9d8982ef8Joe Onorato 294