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