diff options
Diffstat (limited to 'InCallUI')
-rw-r--r-- | InCallUI/src/com/android/incallui/AudioModeProvider.java | 30 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/CallList.java | 61 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/InCallPresenter.java | 77 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/InCallServiceImpl.java | 57 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/InCallServiceListener.java (renamed from InCallUI/src/com/android/incallui/InCallPhoneListener.java) | 15 | ||||
-rw-r--r-- | InCallUI/src/com/android/incallui/TelecomAdapter.java | 139 |
6 files changed, 183 insertions, 196 deletions
diff --git a/InCallUI/src/com/android/incallui/AudioModeProvider.java b/InCallUI/src/com/android/incallui/AudioModeProvider.java index 6516e820a..887bc1809 100644 --- a/InCallUI/src/com/android/incallui/AudioModeProvider.java +++ b/InCallUI/src/com/android/incallui/AudioModeProvider.java @@ -16,18 +16,16 @@ package com.android.incallui; -import com.google.common.collect.Lists; - import android.telecom.AudioState; -import android.telecom.Phone; + +import com.google.common.collect.Lists; import java.util.List; /** * Proxy class for getting and setting the audio mode. */ -/* package */ class AudioModeProvider implements InCallPhoneListener { - +public class AudioModeProvider { static final int AUDIO_MODE_INVALID = 0; private static AudioModeProvider sAudioModeProvider = new AudioModeProvider(); @@ -36,30 +34,14 @@ import java.util.List; private int mSupportedModes = AudioState.ROUTE_EARPIECE | AudioState.ROUTE_BLUETOOTH | AudioState.ROUTE_WIRED_HEADSET | AudioState.ROUTE_SPEAKER; private final List<AudioModeListener> mListeners = Lists.newArrayList(); - private Phone mPhone; - - private Phone.Listener mPhoneListener = new Phone.Listener() { - @Override - public void onAudioStateChanged(Phone phone, AudioState audioState) { - onAudioModeChange(audioState.getRoute(), audioState.isMuted()); - onSupportedAudioModeChange(audioState.getSupportedRouteMask()); - } - }; public static AudioModeProvider getInstance() { return sAudioModeProvider; } - @Override - public void setPhone(Phone phone) { - mPhone = phone; - mPhone.addListener(mPhoneListener); - } - - @Override - public void clearPhone() { - mPhone.removeListener(mPhoneListener); - mPhone = null; + public void onAudioStateChanged(AudioState audioState) { + onAudioModeChange(audioState.getRoute(), audioState.isMuted()); + onSupportedAudioModeChange(audioState.getSupportedRouteMask()); } public void onAudioModeChange(int newMode, boolean muted) { diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java index aba83e586..39ada99de 100644 --- a/InCallUI/src/com/android/incallui/CallList.java +++ b/InCallUI/src/com/android/incallui/CallList.java @@ -22,7 +22,11 @@ import com.google.common.base.Preconditions; import android.os.Handler; import android.os.Message; import android.telecom.DisconnectCause; -import android.telecom.Phone; +import android.telecom.PhoneAccount; + +import com.android.contacts.common.testing.NeededForTesting; +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; import java.util.Collections; import java.util.HashMap; @@ -36,7 +40,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * as they are received from the telephony stack. Primary listener of changes to this class is * InCallPresenter. */ -public class CallList implements InCallPhoneListener { +public class CallList { private static final int DISCONNECTED_CALL_SHORT_TIMEOUT_MS = 200; private static final int DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS = 2000; @@ -59,8 +63,6 @@ public class CallList implements InCallPhoneListener { private final HashMap<String, List<CallUpdateListener>> mCallUpdateListenerMap = Maps .newHashMap(); - private Phone mPhone; - /** * Static singleton accessor method. */ @@ -68,46 +70,33 @@ public class CallList implements InCallPhoneListener { return sInstance; } - private Phone.Listener mPhoneListener = new Phone.Listener() { - @Override - public void onCallAdded(Phone phone, android.telecom.Call telecommCall) { - Call call = new Call(telecommCall); - Log.d(this, "onCallAdded: callState=" + call.getState()); - if (call.getState() == Call.State.INCOMING || - call.getState() == Call.State.CALL_WAITING) { - onIncoming(call, call.getCannedSmsResponses()); - } else { - onUpdate(call); - } - } - @Override - public void onCallRemoved(Phone phone, android.telecom.Call telecommCall) { - if (mCallByTelecommCall.containsKey(telecommCall)) { - Call call = mCallByTelecommCall.get(telecommCall); - if (updateCallInMap(call)) { - Log.w(this, "Removing call not previously disconnected " + call.getId()); - } - updateCallTextMap(call, null); - } - } - }; - /** * Private constructor. Instance should only be acquired through getInstance(). */ private CallList() { } - @Override - public void setPhone(Phone phone) { - mPhone = phone; - mPhone.addListener(mPhoneListener); + public void onCallAdded(android.telecom.Call telecommCall) { + Trace.beginSection("onCallAdded"); + Call call = new Call(telecommCall); + Log.d(this, "onCallAdded: callState=" + call.getState()); + if (call.getState() == Call.State.INCOMING || + call.getState() == Call.State.CALL_WAITING) { + onIncoming(call, call.getCannedSmsResponses()); + } else { + onUpdate(call); + } + Trace.endSection(); } - @Override - public void clearPhone() { - mPhone.removeListener(mPhoneListener); - mPhone = null; + public void onCallRemoved(android.telecom.Call telecommCall) { + if (mCallByTelecommCall.containsKey(telecommCall)) { + Call call = mCallByTelecommCall.get(telecommCall); + if (updateCallInMap(call)) { + Log.w(this, "Removing call not previously disconnected " + call.getId()); + } + updateCallTextMap(call, null); + } } /** diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java index 078dd49ce..4225f86fa 100644 --- a/InCallUI/src/com/android/incallui/InCallPresenter.java +++ b/InCallUI/src/com/android/incallui/InCallPresenter.java @@ -27,7 +27,6 @@ import android.os.Bundle; import android.os.Handler; import android.telecom.DisconnectCause; import android.telecom.PhoneAccount; -import android.telecom.Phone; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; import android.telecom.VideoProfile; @@ -38,11 +37,10 @@ import android.view.View; import android.view.Window; import android.view.WindowManager; -import com.google.common.base.Preconditions; - import com.android.contacts.common.interactions.TouchPointManager; import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette; import com.android.incalluibind.ObjectFactory; +import com.google.common.base.Preconditions; import java.util.Collections; import java.util.List; @@ -60,8 +58,8 @@ import java.util.concurrent.CopyOnWriteArrayList; * that want to listen in on the in-call state changes. * TODO: This class has become more of a state machine at this point. Consider renaming. */ -public class InCallPresenter implements CallList.Listener, InCallPhoneListener { - +public class InCallPresenter implements CallList.Listener, + CircularRevealFragment.OnCircularRevealCompleteListener { private static final String EXTRA_FIRST_TIME_SHOWN = "com.android.incallui.intent.extra.FIRST_TIME_SHOWN"; @@ -100,28 +98,6 @@ public class InCallPresenter implements CallList.Listener, InCallPhoneListener { private boolean mAccountSelectionCancelled = false; private InCallCameraManager mInCallCameraManager = null; - private final Phone.Listener mPhoneListener = new Phone.Listener() { - @Override - public void onBringToForeground(Phone phone, boolean showDialpad) { - Log.i(this, "Bringing UI to foreground."); - bringToForeground(showDialpad); - } - @Override - public void onCallAdded(Phone phone, android.telecom.Call call) { - call.addListener(mCallListener); - } - @Override - public void onCallRemoved(Phone phone, android.telecom.Call call) { - call.removeListener(mCallListener); - } - @Override - public void onCanAddCallChanged(Phone phone, boolean canAddCall) { - for (CanAddCallListener listener : mCanAddCallListeners) { - listener.onCanAddCallChanged(canAddCall); - } - } - }; - private final android.telecom.Call.Listener mCallListener = new android.telecom.Call.Listener() { @Override @@ -185,8 +161,6 @@ public class InCallPresenter implements CallList.Listener, InCallPhoneListener { */ private boolean mIsChangingConfigurations = false; - private Phone mPhone; - private Handler mHandler = new Handler(); /** Display colors for the UI. Consists of a primary color and secondary (darker) color */ @@ -201,16 +175,9 @@ public class InCallPresenter implements CallList.Listener, InCallPhoneListener { return sInCallPresenter; } - @Override - public void setPhone(Phone phone) { - mPhone = phone; - mPhone.addListener(mPhoneListener); - } - - @Override - public void clearPhone() { - mPhone.removeListener(mPhoneListener); - mPhone = null; + @NeededForTesting + static synchronized void setInstance(InCallPresenter inCallPresenter) { + sInCallPresenter = inCallPresenter; } public InCallState getInCallState() { @@ -401,6 +368,38 @@ public class InCallPresenter implements CallList.Listener, InCallPhoneListener { } } + private boolean mAwaitingCallListUpdate = false; + + public void onBringToForeground(boolean showDialpad) { + Log.i(this, "Bringing UI to foreground."); + bringToForeground(showDialpad); + } + + /** + * TODO: Consider listening to CallList callbacks to do this instead of receiving a direct + * method invocation from InCallService. + */ + public void onCallAdded(android.telecom.Call call) { + // Since a call has been added we are no longer waiting for Telecom to send us a + // call. + setBoundAndWaitingForOutgoingCall(false, null); + call.addListener(mCallListener); + } + + /** + * TODO: Consider listening to CallList callbacks to do this instead of receiving a direct + * method invocation from InCallService. + */ + public void onCallRemoved(android.telecom.Call call) { + call.removeListener(mCallListener); + } + + public void onCanAddCallChanged(boolean canAddCall) { + for (CanAddCallListener listener : mCanAddCallListeners) { + listener.onCanAddCallChanged(canAddCall); + } + } + /** * Called when there is a change to the call list. * Sets the In-Call state for the entire in-call app based on the information it gets from diff --git a/InCallUI/src/com/android/incallui/InCallServiceImpl.java b/InCallUI/src/com/android/incallui/InCallServiceImpl.java index 17f4e174d..41656a097 100644 --- a/InCallUI/src/com/android/incallui/InCallServiceImpl.java +++ b/InCallUI/src/com/android/incallui/InCallServiceImpl.java @@ -18,8 +18,9 @@ package com.android.incallui; import android.content.Intent; import android.os.IBinder; +import android.telecom.AudioState; +import android.telecom.Call; import android.telecom.InCallService; -import android.telecom.Phone; /** * Used to receive updates about calls from the Telecomm component. This service is bound to @@ -30,25 +31,30 @@ import android.telecom.Phone; public class InCallServiceImpl extends InCallService { @Override - public void onPhoneCreated(Phone phone) { - Log.v(this, "onPhoneCreated"); - CallList.getInstance().setPhone(phone); - AudioModeProvider.getInstance().setPhone(phone); - TelecomAdapter.getInstance().setPhone(phone); - InCallPresenter.getInstance().setPhone(phone); - TelecomAdapter.getInstance().setContext(InCallServiceImpl.this); + public void onAudioStateChanged(AudioState audioState) { + AudioModeProvider.getInstance().onAudioStateChanged(audioState); } @Override - public void onPhoneDestroyed(Phone phone) { - Log.v(this, "onPhoneDestroyed"); - // Tear down the InCall system - CallList.getInstance().clearPhone(); - AudioModeProvider.getInstance().clearPhone(); - TelecomAdapter.getInstance().clearPhone(); - TelecomAdapter.getInstance().setContext(null); - CallList.getInstance().clearOnDisconnect(); - InCallPresenter.getInstance().tearDown(); + public void onBringToForeground(boolean showDialpad) { + InCallPresenter.getInstance().onBringToForeground(showDialpad); + } + + @Override + public void onCallAdded(Call call) { + CallList.getInstance().onCallAdded(call); + InCallPresenter.getInstance().onCallAdded(call); + } + + @Override + public void onCallRemoved(Call call) { + CallList.getInstance().onCallRemoved(call); + InCallPresenter.getInstance().onCallRemoved(call); + } + + @Override + public void onCanAddCallChanged(boolean canAddCall) { + InCallPresenter.getInstance().onCanAddCallChanged(canAddCall); } @Override @@ -59,12 +65,27 @@ public class InCallServiceImpl extends InCallService { AudioModeProvider.getInstance()); InCallPresenter.getInstance().onServiceBind(); InCallPresenter.getInstance().maybeStartRevealAnimation(intent); + TelecomAdapter.getInstance().setInCallService(this); + return super.onBind(intent); } @Override public boolean onUnbind(Intent intent) { + super.onUnbind(intent); + InCallPresenter.getInstance().onServiceUnbind(); - return super.onUnbind(intent); + tearDown(); + + return false; + } + + private void tearDown() { + Log.v(this, "tearDown"); + // Tear down the InCall system + TelecomAdapter.getInstance().clearInCallService(); + CallList.getInstance().clearOnDisconnect(); + InCallPresenter.getInstance().tearDown(); } + } diff --git a/InCallUI/src/com/android/incallui/InCallPhoneListener.java b/InCallUI/src/com/android/incallui/InCallServiceListener.java index 2fd6afe22..295385d8e 100644 --- a/InCallUI/src/com/android/incallui/InCallPhoneListener.java +++ b/InCallUI/src/com/android/incallui/InCallServiceListener.java @@ -16,25 +16,26 @@ package com.android.incallui; -import android.telecom.Phone; +import android.telecom.InCallService; /** * Interface implemented by In-Call components that maintain a reference to the Telecomm API - * {@code Phone} object. Clarifies the expectations associated with the relevant method calls. + * {@code InCallService} object. Clarifies the expectations associated with the relevant method + * calls. */ -public interface InCallPhoneListener { +public interface InCallServiceListener { /** - * Called once at {@code InCallService} startup time with a valid {@code Phone}. At + * Called once at {@code InCallService} startup time with a valid instance. At * that time, there will be no existing {@code Call}s. * - * @param phone The {@code Phone} object. + * @param inCallService The {@code InCallService} object. */ - void setPhone(Phone phone); + void setInCallService(InCallService inCallService); /** * Called once at {@code InCallService} shutdown time. At that time, any {@code Call}s * will have transitioned through the disconnected state and will no longer exist. */ - void clearPhone(); + void clearInCallService(); } diff --git a/InCallUI/src/com/android/incallui/TelecomAdapter.java b/InCallUI/src/com/android/incallui/TelecomAdapter.java index 10c230713..37efdee59 100644 --- a/InCallUI/src/com/android/incallui/TelecomAdapter.java +++ b/InCallUI/src/com/android/incallui/TelecomAdapter.java @@ -17,22 +17,20 @@ package com.android.incallui; import android.content.ActivityNotFoundException; -import android.content.Context; import android.content.Intent; import android.os.Looper; -import android.telecom.Phone; +import android.telecom.InCallService; import android.telecom.PhoneAccountHandle; import com.google.common.base.Preconditions; import java.util.List; -final class TelecomAdapter implements InCallPhoneListener { +final class TelecomAdapter implements InCallServiceListener { private static final String ADD_CALL_MODE_KEY = "add_call_mode"; private static TelecomAdapter sInstance; - private Context mContext; - private Phone mPhone; + private InCallService mInCallService; static TelecomAdapter getInstance() { Preconditions.checkState(Looper.getMainLooper().getThread() == Thread.currentThread()); @@ -45,102 +43,94 @@ final class TelecomAdapter implements InCallPhoneListener { private TelecomAdapter() { } - void setContext(Context context) { - mContext = context; - } - @Override - public void setPhone(Phone phone) { - mPhone = phone; + public void setInCallService(InCallService inCallService) { + mInCallService = inCallService; } @Override - public void clearPhone() { - mPhone = null; + public void clearInCallService() { + mInCallService = null; } private android.telecom.Call getTelecommCallById(String callId) { - final Call call = CallList.getInstance().getCallById(callId); + Call call = CallList.getInstance().getCallById(callId); return call == null ? null : call.getTelecommCall(); } void answerCall(String callId, int videoState) { - if (mPhone != null) { - final android.telecom.Call call = getTelecommCallById(callId); - if (call != null) { - call.answer(videoState); - } else { - Log.e(this, "error answerCall, call not in call list: " + callId); - } + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.answer(videoState); } else { - Log.e(this, "error answerCall, mPhone is null"); + Log.e(this, "error answerCall, call not in call list: " + callId); } } void rejectCall(String callId, boolean rejectWithMessage, String message) { - if (mPhone != null) { - final android.telecom.Call call = getTelecommCallById(callId); - if (call != null) { - call.reject(rejectWithMessage, message); - } else { - Log.e(this, "error rejectCall, call not in call list: " + callId); - } + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.reject(rejectWithMessage, message); } else { - Log.e(this, "error rejectCall, mPhone is null"); + Log.e(this, "error rejectCall, call not in call list: " + callId); } } void disconnectCall(String callId) { - if (mPhone != null) { - getTelecommCallById(callId).disconnect(); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.disconnect(); } else { - Log.e(this, "error disconnectCall, mPhone is null"); + Log.e(this, "error disconnectCall, call not in call list " + callId); } } void holdCall(String callId) { - if (mPhone != null) { - getTelecommCallById(callId).hold(); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.hold(); } else { - Log.e(this, "error holdCall, mPhone is null"); + Log.e(this, "error holdCall, call not in call list " + callId); } } void unholdCall(String callId) { - if (mPhone != null) { - getTelecommCallById(callId).unhold(); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.unhold(); } else { - Log.e(this, "error unholdCall, mPhone is null"); + Log.e(this, "error unholdCall, call not in call list " + callId); } } void mute(boolean shouldMute) { - if (mPhone != null) { - mPhone.setMuted(shouldMute); + if (mInCallService != null) { + mInCallService.setMuted(shouldMute); } else { - Log.e(this, "error mute, mPhone is null"); + Log.e(this, "error mute, mInCallService is null"); } } void setAudioRoute(int route) { - if (mPhone != null) { - mPhone.setAudioRoute(route); + if (mInCallService != null) { + mInCallService.setAudioRoute(route); } else { - Log.e(this, "error setAudioRoute, mPhone is null"); + Log.e(this, "error setAudioRoute, mInCallService is null"); } } void separateCall(String callId) { - if (mPhone != null) { - getTelecommCallById(callId).splitFromConference(); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.splitFromConference(); } else { - Log.e(this, "error separateCall, mPhone is null."); + Log.e(this, "error separateCall, call not in call list " + callId); } } void merge(String callId) { - if (mPhone != null) { - android.telecom.Call call = getTelecommCallById(callId); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { List<android.telecom.Call> conferenceable = call.getConferenceableCalls(); if (!conferenceable.isEmpty()) { call.conference(conferenceable.get(0)); @@ -151,24 +141,24 @@ final class TelecomAdapter implements InCallPhoneListener { } } } else { - Log.e(this, "error merge, mPhone is null."); + Log.e(this, "error merge, call not in call list " + callId); } } void swap(String callId) { - if (mPhone != null) { - android.telecom.Call call = getTelecommCallById(callId); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { if (call.getDetails().can( android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE)) { call.swapConference(); } } else { - Log.e(this, "Error swap, mPhone is null."); + Log.e(this, "error swap, call not in call list " + callId); } } void addCall() { - if (mContext != null) { + if (mInCallService != null) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -178,7 +168,7 @@ final class TelecomAdapter implements InCallPhoneListener { intent.putExtra(ADD_CALL_MODE_KEY, true); try { Log.d(this, "Sending the add Call intent"); - mContext.startActivity(intent); + mInCallService.startActivity(intent); } catch (ActivityNotFoundException e) { // This is rather rare but possible. // Note: this method is used even when the phone is encrypted. At that moment @@ -189,43 +179,48 @@ final class TelecomAdapter implements InCallPhoneListener { } void playDtmfTone(String callId, char digit) { - if (mPhone != null) { - getTelecommCallById(callId).playDtmfTone(digit); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.playDtmfTone(digit); } else { - Log.e(this, "error playDtmfTone, mPhone is null"); + Log.e(this, "error playDtmfTone, call not in call list " + callId); } } void stopDtmfTone(String callId) { - if (mPhone != null) { - getTelecommCallById(callId).stopDtmfTone(); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.stopDtmfTone(); } else { - Log.e(this, "error stopDtmfTone, mPhone is null"); + Log.e(this, "error stopDtmfTone, call not in call list " + callId); } } void postDialContinue(String callId, boolean proceed) { - if (mPhone != null) { - getTelecommCallById(callId).postDialContinue(proceed); + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.postDialContinue(proceed); } else { - Log.e(this, "error postDialContinue, mPhone is null"); + Log.e(this, "error postDialContinue, call not in call list " + callId); } } void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault) { - if (mPhone != null) { - getTelecommCallById(callId).phoneAccountSelected(accountHandle, setDefault); - } else { - Log.e(this, "error phoneAccountSelected, mAdapter is null"); - } - if (accountHandle == null) { Log.e(this, "error phoneAccountSelected, accountHandle is null"); + // TODO: Do we really want to send null accountHandle? + } + + android.telecom.Call call = getTelecommCallById(callId); + if (call != null) { + call.phoneAccountSelected(accountHandle, setDefault); + } else { + Log.e(this, "error phoneAccountSelected, call not in call list " + callId); } } boolean canAddCall() { // Default to true if we are not connected to telecom. - return mPhone == null ? true : mPhone.canAddCall(); + return mInCallService == null ? true : mInCallService.canAddCall(); } } |