diff options
Diffstat (limited to 'InCallUI/src/com')
3 files changed, 79 insertions, 18 deletions
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java index 623cbb667..6c00164b9 100644 --- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java +++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java @@ -50,10 +50,14 @@ import com.android.contacts.common.preference.ContactsPreferences; import com.android.contacts.common.testing.NeededForTesting; import com.android.contacts.common.util.BitmapUtil; import com.android.contacts.common.util.ContactDisplayUtils; +import com.android.incallui.Call.State; import com.android.incallui.ContactInfoCache.ContactCacheEntry; import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback; import com.android.incallui.InCallPresenter.InCallState; +import com.android.incallui.async.PausableExecutorImpl; import com.android.incallui.ringtone.DialerRingtoneManager; +import com.android.incallui.ringtone.InCallTonePlayer; +import com.android.incallui.ringtone.ToneGeneratorFactory; import java.util.Objects; @@ -95,7 +99,12 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, mContactInfoCache = contactInfoCache; mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - mDialerRingtoneManager = new DialerRingtoneManager(); + mDialerRingtoneManager = new DialerRingtoneManager( + new InCallTonePlayer( + AudioModeProvider.getInstance(), + new ToneGeneratorFactory(), + new PausableExecutorImpl()), + CallList.getInstance()); mCurrentNotification = NOTIFICATION_NONE; } @@ -308,7 +317,8 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, notification.vibrate = VIBRATE_PATTERN; } if (mDialerRingtoneManager.shouldPlayCallWaitingTone(callState)) { - // TODO (maxwelb) play call waiting + Log.v(this, "Playing call waiting tone"); + mDialerRingtoneManager.playCallWaitingTone(); } if (mCurrentNotification != notificationType && mCurrentNotification != NOTIFICATION_NONE) { Log.i(this, "Previous notification already showing - cancelling " @@ -699,7 +709,9 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, @Override public void onCallChanged(Call call) { - // no-op + if (CallList.getInstance().getIncomingCall() == null) { + mDialerRingtoneManager.stopCallWaitingTone(); + } } /** diff --git a/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java index 8d4d068e1..29d3d9de3 100644 --- a/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java +++ b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java @@ -13,14 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License */ + package com.android.incallui.ringtone; +import com.google.common.base.Preconditions; + import android.net.Uri; import android.support.annotation.Nullable; import com.android.contacts.common.compat.CompatUtils; import com.android.contacts.common.testing.NeededForTesting; +import com.android.incallui.Call; import com.android.incallui.Call.State; +import com.android.incallui.CallList; /** * Class that determines when ringtones should be played and can play the call waiting tone when @@ -30,9 +35,25 @@ public class DialerRingtoneManager { /* * Flag used to determine if the Dialer is responsible for playing ringtones for incoming calls. + * Once we're ready to enable Dialer Ringing, these flags should be removed. */ private static final boolean IS_DIALER_RINGING_ENABLED = false; - private boolean mForceDialerRingingEnabled = false; + private Boolean mIsDialerRingingEnabledForTesting; + + private final InCallTonePlayer mInCallTonePlayer; + private final CallList mCallList; + + /** + * Creates the DialerRingtoneManager with the given {@link InCallTonePlayer}. + * + * @param inCallTonePlayer the tone player used to play in-call tones. + * @param callList the CallList used to check for {@link State#CALL_WAITING} + * @throws NullPointerException if inCallTonePlayer or callList are null + */ + public DialerRingtoneManager(InCallTonePlayer inCallTonePlayer, CallList callList) { + mInCallTonePlayer = Preconditions.checkNotNull(inCallTonePlayer); + mCallList = Preconditions.checkNotNull(callList); + } /** * Determines if a ringtone should be played for the given call state (see {@link State}) and @@ -43,14 +64,27 @@ public class DialerRingtoneManager { * @return {@code true} if the ringtone should be played, {@code false} otherwise. */ public boolean shouldPlayRingtone(int callState, @Nullable Uri ringtoneUri) { - return CompatUtils.isNCompatible() - && isDialerRingingEnabled() - && callState == State.INCOMING + return isDialerRingingEnabled() + && translateCallStateForCallWaiting(callState) == State.INCOMING && ringtoneUri != null; } + /** + * The incoming callState is never set as {@link State#CALL_WAITING} because + * {@link Call#translateState(int)} doesn't account for that case, check for it here + */ + private int translateCallStateForCallWaiting(int callState) { + if (callState != State.INCOMING) { + return callState; + } + return mCallList.getActiveCall() == null ? State.INCOMING : State.CALL_WAITING; + } + private boolean isDialerRingingEnabled() { - return mForceDialerRingingEnabled || IS_DIALER_RINGING_ENABLED; + if (mIsDialerRingingEnabledForTesting != null) { + return mIsDialerRingingEnabledForTesting; + } + return CompatUtils.isNCompatible() && IS_DIALER_RINGING_ENABLED; } /** @@ -61,13 +95,33 @@ public class DialerRingtoneManager { * @return {@code true} if the call waiting tone should be played, {@code false} otherwise. */ public boolean shouldPlayCallWaitingTone(int callState) { - return CompatUtils.isNCompatible() - && isDialerRingingEnabled() - && callState == State.CALL_WAITING; + return isDialerRingingEnabled() + && translateCallStateForCallWaiting(callState) == State.CALL_WAITING + && !mInCallTonePlayer.isPlayingTone(); + } + + /** + * Plays the call waiting tone. + */ + public void playCallWaitingTone() { + if (!isDialerRingingEnabled()) { + return; + } + mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING); + } + + /** + * Stops playing the call waiting tone. + */ + public void stopCallWaitingTone() { + if (!isDialerRingingEnabled()) { + return; + } + mInCallTonePlayer.stop(); } @NeededForTesting - void forceDialerRingingEnabled() { - mForceDialerRingingEnabled = true; + void setDialerRingingEnabledForTesting(boolean status) { + mIsDialerRingingEnabledForTesting = status; } } diff --git a/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java b/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java index 2a94f226f..be7fffbcb 100644 --- a/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java +++ b/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java @@ -39,7 +39,6 @@ import javax.annotation.concurrent.NotThreadSafe; * Class responsible for playing in-call related tones in a background thread. This class only * allows one tone to be played at a time. */ -@NeededForTesting public class InCallTonePlayer { public static final int TONE_CALL_WAITING = 4; @@ -62,7 +61,6 @@ public class InCallTonePlayer { * @throws NullPointerException if audioModeProvider, toneGeneratorFactory, or executor are * {@code null}. */ - @NeededForTesting public InCallTonePlayer(AudioModeProvider audioModeProvider, ToneGeneratorFactory toneGeneratorFactory, PausableExecutor executor) { mAudioModeProvider = Preconditions.checkNotNull(audioModeProvider); @@ -73,7 +71,6 @@ public class InCallTonePlayer { /** * @return {@code true} if a tone is currently playing, {@code false} otherwise */ - @NeededForTesting public boolean isPlayingTone() { return mNumPlayingTones != null && mNumPlayingTones.getCount() > 0; } @@ -85,7 +82,6 @@ public class InCallTonePlayer { * @throws IllegalStateException if a tone is already playing * @throws IllegalArgumentException if the tone is invalid */ - @NeededForTesting public void play(int tone) { if (isPlayingTone()) { throw new IllegalStateException("Tone already playing"); @@ -155,7 +151,6 @@ public class InCallTonePlayer { /** * Stops playback of the current tone. */ - @NeededForTesting public void stop() { if (mNumPlayingTones != null) { mNumPlayingTones.countDown(); |