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