CallButtonPresenter.java revision dab149c9b2185be82cbca63cc3980e41444900c0
1241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng/* 2241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * Copyright (C) 2013 The Android Open Source Project 3241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * 4241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * you may not use this file except in compliance with the License. 6241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * You may obtain a copy of the License at 7241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * 8241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 9241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * 10241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * Unless required by applicable law or agreed to in writing, software 11241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * See the License for the specific language governing permissions and 14241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * limitations under the License 15241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng */ 16241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 17241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Chengpackage com.android.incallui; 18241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 19671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordonimport com.google.common.base.Preconditions; 20671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon 21241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Chengimport android.media.AudioManager; 22241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 23dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordonimport com.android.incallui.AudioModeProvider.AudioModeListener; 24671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordonimport com.android.incallui.InCallPresenter.InCallState; 25671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordonimport com.android.incallui.InCallPresenter.InCallStateListener; 26dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordonimport com.android.services.telephony.common.AudioMode; 27671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordonimport com.android.services.telephony.common.Call; 28671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon 29241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng/** 30241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng * Logic for call buttons. 31241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng */ 32150a5c58c67f230c8fd7293b180bbf50aa761480Santos Cordonpublic class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButtonUi> 33dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon implements InCallStateListener, AudioModeListener { 34241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 35671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon private Call mCall; 36dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon private final AudioModeProvider mAudioModeProvider; 37241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 38dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public CallButtonPresenter(AudioModeProvider audioModeProvider) { 39dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 40dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // AudioModeProvider works effectively as a pass through. However, if we 41dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // had this presenter listen for changes directly, it would have to live forever 42dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // or risk missing important updates. 43dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon mAudioModeProvider = audioModeProvider; 44dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon mAudioModeProvider.addListener(this); 45241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng } 46241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 47241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng @Override 48241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng public void onUiReady(CallButtonUi ui) { 49241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng super.onUiReady(ui); 50dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 51dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 52dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon @Override 53dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public void onUiUnready(CallButtonUi ui) { 54dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon mAudioModeProvider.removeListener(this); 55241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng } 56241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 57150a5c58c67f230c8fd7293b180bbf50aa761480Santos Cordon @Override 58671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon public void onStateChange(InCallState state, CallList callList) { 59671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon getUi().setVisible(state == InCallState.INCALL); 60671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon 61671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon if (state == InCallState.INCALL) { 62efd4282ec4221ec5eefd4155a4ad915adcedca70Santos Cordon mCall = callList.getActiveOrBackgroundCall(); 63671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon } else { 64671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon mCall = null; 65671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon } 66241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng } 67241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 68dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon @Override 69dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public void onAudioMode(int mode) { 70dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon getUi().setAudio(mode); 71dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 72dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 73dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon @Override 74dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public void onSupportedAudioMode(int mask) { 75dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon getUi().setSupportedAudio(mask); 76dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 77dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 78dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public int getAudioMode() { 79dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon return mAudioModeProvider.getAudioMode(); 80dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 81dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 82dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public int getSupportedAudio() { 83dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon return mAudioModeProvider.getSupportedModes(); 84dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 85dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 86dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public void setAudioMode(int mode) { 87dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 88dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // TODO: Set a intermediate state in this presenter until we get 89dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // an update for onAudioMode(). This will make UI response immediate 90dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // if it turns out to be slow 91dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 92dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon Logger.d(this, "Sending new Audio Mode: " + AudioMode.toString(mode)); 93dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon CallCommandClient.getInstance().setAudioMode(mode); 94dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 95dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 96dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon /** 97dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon * Function assumes that bluetooth is not supported. 98dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon */ 99dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon public void toggleSpeakerphone() { 100dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // this function should not be called if bluetooth is available 101dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon if (0 != (AudioMode.BLUETOOTH & mAudioModeProvider.getSupportedModes())) { 102dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 103dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // It's clear the UI is off, so update the supported mode once again. 104dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon Logger.e(this, "toggling speakerphone not allowed when bluetooth supported."); 105dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon getUi().setSupportedAudio(mAudioModeProvider.getSupportedModes()); 106dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon return; 107dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 108dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 109dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon int newMode = AudioMode.SPEAKER; 110dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 111dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon // if speakerphone is already on, change to wired/earpiece 112dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon if (mAudioModeProvider.getAudioMode() == AudioMode.SPEAKER) { 113dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon newMode = AudioMode.WIRED_OR_EARPIECE; 114dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 115dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 116dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon setAudioMode(newMode); 117dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon } 118dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon 119b94803e83573734d21a32047b21f348cb2305155Chiao Cheng public void endCallClicked() { 120671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon Preconditions.checkNotNull(mCall); 121671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon 122b94803e83573734d21a32047b21f348cb2305155Chiao Cheng // TODO(klp): hook up call id. 123671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon CallCommandClient.getInstance().disconnectCall(mCall.getCallId()); 124b94803e83573734d21a32047b21f348cb2305155Chiao Cheng } 125b94803e83573734d21a32047b21f348cb2305155Chiao Cheng 126241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng public void muteClicked(boolean checked) { 127efd4282ec4221ec5eefd4155a4ad915adcedca70Santos Cordon Logger.d(this, "turning on mute: " + checked); 128efd4282ec4221ec5eefd4155a4ad915adcedca70Santos Cordon 1293552ee4b7111b995735d330b2e89bfabc2fd9b61Chiao Cheng CallCommandClient.getInstance().mute(checked); 130241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng getUi().setMute(checked); 131241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng } 132241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng 1338193bc3df6b0726d36a5b7b889ec91c4d59f40c1Santos Cordon public void holdClicked(boolean checked) { 134671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon Preconditions.checkNotNull(mCall); 135671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon 136efd4282ec4221ec5eefd4155a4ad915adcedca70Santos Cordon Logger.d(this, "holding: " + mCall.getCallId()); 137efd4282ec4221ec5eefd4155a4ad915adcedca70Santos Cordon 1388193bc3df6b0726d36a5b7b889ec91c4d59f40c1Santos Cordon // TODO(klp): use appropriate hold callId. 139671b221ccadea34fb9327ef5342b26419eb5ca99Santos Cordon CallCommandClient.getInstance().hold(mCall.getCallId(), checked); 1408193bc3df6b0726d36a5b7b889ec91c4d59f40c1Santos Cordon getUi().setHold(checked); 1418193bc3df6b0726d36a5b7b889ec91c4d59f40c1Santos Cordon } 1428193bc3df6b0726d36a5b7b889ec91c4d59f40c1Santos Cordon 1435b9034b5b1b48a4339dd2f893a851cc64d6279dfChristine Chen public void showDialpadClicked(boolean checked) { 1445b9034b5b1b48a4339dd2f893a851cc64d6279dfChristine Chen Logger.v(this, "Show dialpad " + String.valueOf(checked)); 1455b9034b5b1b48a4339dd2f893a851cc64d6279dfChristine Chen getUi().displayDialpad(checked); 1465b9034b5b1b48a4339dd2f893a851cc64d6279dfChristine Chen } 1475b9034b5b1b48a4339dd2f893a851cc64d6279dfChristine Chen 148241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng public interface CallButtonUi extends Ui { 1494df10e20c8a4a5c2b6b1e9d0c895cf205929e8ddChiao Cheng void setVisible(boolean on); 150241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng void setMute(boolean on); 1518193bc3df6b0726d36a5b7b889ec91c4d59f40c1Santos Cordon void setHold(boolean on); 1525b9034b5b1b48a4339dd2f893a851cc64d6279dfChristine Chen void displayDialpad(boolean on); 153dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon void setAudio(int mode); 154dab149c9b2185be82cbca63cc3980e41444900c0Santos Cordon void setSupportedAudio(int mask); 155241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng } 156241d50d5f523eb0b644d8a9c1cf7fd2eb418ab88Chiao Cheng} 157