1e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad/*
2e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * Copyright (C) 2013 The Android Open Source Project
3e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad *
4e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * Licensed under the Apache License, Version 2.0 (the "License");
5e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * you may not use this file except in compliance with the License.
6e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * You may obtain a copy of the License at
7e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad *
8e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad *      http://www.apache.org/licenses/LICENSE-2.0
9e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad *
10e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * Unless required by applicable law or agreed to in writing, software
11e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * distributed under the License is distributed on an "AS IS" BASIS,
12e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * See the License for the specific language governing permissions and
14e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * limitations under the License.
15e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad */
16e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom;
18e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
19b95f169a74a18470cbf619264243015052285e9bGabriel Pealimport android.annotation.SystemApi;
20e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awadimport android.util.ArrayMap;
21e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
22e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awadimport java.util.Collections;
23e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awadimport java.util.List;
24e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awadimport java.util.Map;
25e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awadimport java.util.Objects;
26229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shraunerimport java.util.concurrent.CopyOnWriteArrayList;
27e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
28e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad/**
29e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad * A unified virtual device providing a means of voice (and other) communication on a device.
30b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad *
31b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * {@hide}
32e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad */
33b95f169a74a18470cbf619264243015052285e9bGabriel Peal@SystemApi
34e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awadpublic final class Phone {
35e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
36e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    public abstract static class Listener {
37e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        /**
38e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * Called when the audio state changes.
39e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         *
40e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param phone The {@code Phone} calling this method.
41b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad         * @param audioState The new {@link AudioState}.
42e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         */
43b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        public void onAudioStateChanged(Phone phone, AudioState audioState) { }
44e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
45e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        /**
46e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * Called to bring the in-call screen to the foreground. The in-call experience should
47e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * respond immediately by coming to the foreground to inform the user of the state of
48e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * ongoing {@code Call}s.
49e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         *
50e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param phone The {@code Phone} calling this method.
51e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param showDialpad If true, put up the dialpad when the screen is shown.
52e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         */
53e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        public void onBringToForeground(Phone phone, boolean showDialpad) { }
54e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
55e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        /**
56e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * Called when a {@code Call} has been added to this in-call session. The in-call user
57e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * experience should add necessary state listeners to the specified {@code Call} and
58e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * immediately start to show the user information about the existence
59e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * and nature of this {@code Call}. Subsequent invocations of {@link #getCalls()} will
60e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * include this {@code Call}.
61e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         *
62e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param phone The {@code Phone} calling this method.
63e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param call A newly added {@code Call}.
64e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         */
65e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        public void onCallAdded(Phone phone, Call call) { }
66e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
67e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        /**
68e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * Called when a {@code Call} has been removed from this in-call session. The in-call user
69e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * experience should remove any state listeners from the specified {@code Call} and
70e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * immediately stop displaying any information about this {@code Call}.
71e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * Subsequent invocations of {@link #getCalls()} will no longer include this {@code Call}.
72e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         *
73e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param phone The {@code Phone} calling this method.
74e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         * @param call A newly removed {@code Call}.
75e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         */
76e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        public void onCallRemoved(Phone phone, Call call) { }
776c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon
786c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        /**
796c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         * Called when the {@code Phone} ability to add more calls changes.  If the phone cannot
806c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         * support more calls then {@code canAddCall} is set to {@code false}.  If it can, then it
816c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         * is set to {@code true}.
826c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         *
836c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         * @param phone The {@code Phone} calling this method.
846c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         * @param canAddCall Indicates whether an additional call can be added.
856c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon         */
866c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        public void onCanAddCallChanged(Phone phone, boolean canAddCall) { }
87e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
88e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
89ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn    // A Map allows us to track each Call by its Telecom-specified call ID
90ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn    private final Map<String, Call> mCallByTelecomCallId = new ArrayMap<>();
91e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
92e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    // A List allows us to keep the Calls in a stable iteration order so that casually developed
93e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    // user interface components do not incur any spurious jank
94f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon    private final List<Call> mCalls = new CopyOnWriteArrayList<>();
95e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
96e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    // An unmodifiable view of the above List can be safely shared with subclass implementations
97e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    private final List<Call> mUnmodifiableCalls = Collections.unmodifiableList(mCalls);
98e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
99e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    private final InCallAdapter mInCallAdapter;
100e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
101b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private AudioState mAudioState;
102e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
103229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner    private final List<Listener> mListeners = new CopyOnWriteArrayList<>();
104e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
1056c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    private boolean mCanAddCall = true;
1066c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon
107e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
108e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    Phone(InCallAdapter adapter) {
109e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        mInCallAdapter = adapter;
110e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
111e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
112e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
11388b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon    final void internalAddCall(ParcelableCall parcelableCall) {
11488b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon        Call call = new Call(this, parcelableCall.getId(), mInCallAdapter);
115ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn        mCallByTelecomCallId.put(parcelableCall.getId(), call);
116e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        mCalls.add(call);
11788b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon        checkCallTree(parcelableCall);
118ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn        call.internalUpdate(parcelableCall, mCallByTelecomCallId);
119e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        fireCallAdded(call);
120e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     }
121e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
122e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
123e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    final void internalRemoveCall(Call call) {
124ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn        mCallByTelecomCallId.remove(call.internalGetCallId());
125e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        mCalls.remove(call);
126e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        fireCallRemoved(call);
127e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
128e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
129e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
13088b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon    final void internalUpdateCall(ParcelableCall parcelableCall) {
131ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn         Call call = mCallByTelecomCallId.get(parcelableCall.getId());
132e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         if (call != null) {
13388b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon             checkCallTree(parcelableCall);
134ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn             call.internalUpdate(parcelableCall, mCallByTelecomCallId);
135e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad         }
136e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     }
137e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
138e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
139ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn    final void internalSetPostDialWait(String telecomId, String remaining) {
140ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn        Call call = mCallByTelecomCallId.get(telecomId);
141e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        if (call != null) {
142e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad            call.internalSetPostDialWait(remaining);
143e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
144e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
145e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
146e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
147b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    final void internalAudioStateChanged(AudioState audioState) {
148b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad        if (!Objects.equals(mAudioState, audioState)) {
149b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            mAudioState = audioState;
150b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad            fireAudioStateChanged(audioState);
151e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
152e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
153e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
154e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
155ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn    final Call internalGetCallByTelecomId(String telecomId) {
156ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn        return mCallByTelecomCallId.get(telecomId);
157e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
158e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
159e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /** {@hide} */
160e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    final void internalBringToForeground(boolean showDialpad) {
161e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        fireBringToForeground(showDialpad);
162e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
163e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
1646c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    /** {@hide} */
1656c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    final void internalSetCanAddCall(boolean canAddCall) {
1666c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        if (mCanAddCall != canAddCall) {
1676c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon            mCanAddCall = canAddCall;
1686c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon            fireCanAddCallChanged(canAddCall);
1696c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        }
1706c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    }
1716c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon
172e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /**
173f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon     * Called to destroy the phone and cleanup any lingering calls.
174f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon     * @hide
175f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon     */
176f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon    final void destroy() {
177f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon        for (Call call : mCalls) {
178f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon            if (call.getState() != Call.STATE_DISCONNECTED) {
179f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon                call.internalSetDisconnected();
180f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon            }
181f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon        }
182f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon    }
183f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon
184f30d7e9a8e8fa7e10068139decb0e7665381a686Santos Cordon    /**
185e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * Adds a listener to this {@code Phone}.
186e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     *
187e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * @param listener A {@code Listener} object.
188e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     */
189e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    public final void addListener(Listener listener) {
190e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        mListeners.add(listener);
191e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
192e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
193e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /**
194e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * Removes a listener from this {@code Phone}.
195e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     *
196e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * @param listener A {@code Listener} object.
197e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     */
198e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    public final void removeListener(Listener listener) {
199229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        if (listener != null) {
200229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            mListeners.remove(listener);
201229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        }
202e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
203e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
204e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /**
205e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * Obtains the current list of {@code Call}s to be displayed by this in-call experience.
206e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     *
207e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * @return A list of the relevant {@code Call}s.
208e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     */
209e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    public final List<Call> getCalls() {
210e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        return mUnmodifiableCalls;
211e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
212e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
213e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /**
2146c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon     * Returns if the {@code Phone} can support additional calls.
2156c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon     *
2166c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon     * @return Whether the phone supports adding more calls.
2176c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon     */
2186c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    public final boolean canAddCall() {
2196c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        return mCanAddCall;
2206c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    }
2216c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon
2226c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    /**
223e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * Sets the microphone mute state. When this request is honored, there will be change to
224e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * the {@link #getAudioState()}.
225e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     *
226e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * @param state {@code true} if the microphone should be muted; {@code false} otherwise.
227e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     */
228e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    public final void setMuted(boolean state) {
229e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        mInCallAdapter.mute(state);
230e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
231e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
232e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /**
233e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * Sets the audio route (speaker, bluetooth, etc...).  When this request is honored, there will
234e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * be change to the {@link #getAudioState()}.
235e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     *
236e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * @param route The audio route to use.
237e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     */
238e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    public final void setAudioRoute(int route) {
239e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        mInCallAdapter.setAudioRoute(route);
240e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
241e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
242e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    /**
2430d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * Turns the proximity sensor on. When this request is made, the proximity sensor will
2440d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * become active, and the touch screen and display will be turned off when the user's face
2450d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * is detected to be in close proximity to the screen. This operation is a no-op on devices
2460d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * that do not have a proximity sensor.
2470d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     */
2480d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee    public final void setProximitySensorOn() {
2490d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee        mInCallAdapter.turnProximitySensorOn();
2500d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee    }
2510d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee
2520d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee    /**
2530d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * Turns the proximity sensor off. When this request is made, the proximity sensor will
2540d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * become inactive, and no longer affect the touch screen and display. This operation is a
2550d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * no-op on devices that do not have a proximity sensor.
2560d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     *
2570d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * @param screenOnImmediately If true, the screen will be turned on immediately if it was
2580d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * previously off. Otherwise, the screen will only be turned on after the proximity sensor
2590d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     * is no longer triggered.
2600d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee     */
2610d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee    public final void setProximitySensorOff(boolean screenOnImmediately) {
2620d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee        mInCallAdapter.turnProximitySensorOff(screenOnImmediately);
2630d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee    }
2640d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee
2650d6ea71bcfe44ada319ac9387d9ce1b3761eea58Yorke Lee    /**
266e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * Obtains the current phone call audio state of the {@code Phone}.
267e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     *
268e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     * @return An object encapsulating the audio state.
269e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad     */
270b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    public final AudioState getAudioState() {
271e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        return mAudioState;
272e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
273e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
274e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    private void fireCallAdded(Call call) {
275229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener listener : mListeners) {
276229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            listener.onCallAdded(this, call);
277e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
278e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
279e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
280e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    private void fireCallRemoved(Call call) {
281229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener listener : mListeners) {
282229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            listener.onCallRemoved(this, call);
283e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
284e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
285e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
286b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad    private void fireAudioStateChanged(AudioState audioState) {
287229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener listener : mListeners) {
288229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            listener.onAudioStateChanged(this, audioState);
289e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
290e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
291e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
292e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    private void fireBringToForeground(boolean showDialpad) {
293229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner        for (Listener listener : mListeners) {
294229e3820dce98f64fd4834d5f421faec9a9d7026Jay Shrauner            listener.onBringToForeground(this, showDialpad);
295e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
296e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
297e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad
2986c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    private void fireCanAddCallChanged(boolean canAddCall) {
2996c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        for (Listener listener : mListeners) {
3006c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon            listener.onCanAddCallChanged(this, canAddCall);
3016c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon        }
3026c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon    }
3036c912b7d056c67b41fd46f31de168795e97c2336Santos Cordon
30488b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon    private void checkCallTree(ParcelableCall parcelableCall) {
30588b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon        if (parcelableCall.getParentCallId() != null &&
306ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn                !mCallByTelecomCallId.containsKey(parcelableCall.getParentCallId())) {
30788b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon            Log.wtf(this, "ParcelableCall %s has nonexistent parent %s",
30888b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon                    parcelableCall.getId(), parcelableCall.getParentCallId());
309e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
31088b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon        if (parcelableCall.getChildCallIds() != null) {
31188b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon            for (int i = 0; i < parcelableCall.getChildCallIds().size(); i++) {
312ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn                if (!mCallByTelecomCallId.containsKey(parcelableCall.getChildCallIds().get(i))) {
31388b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon                    Log.wtf(this, "ParcelableCall %s has nonexistent child %s",
31488b771d8cd3f1e5748078c02f3ab571831ace72fSantos Cordon                            parcelableCall.getId(), parcelableCall.getChildCallIds().get(i));
315e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad                }
316e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad            }
317e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad        }
318e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad    }
319e63fadb109ce52f9c357520074379aca0e3cb11dIhab Awad}
320