From cc7e5a7a71ecd3037802668be19935270f9c0216 Mon Sep 17 00:00:00 2001 From: Brandon Maxwell Date: Fri, 29 Jan 2016 17:03:04 -0800 Subject: Refactored dialer Ringtone code in prep for call waiting + Created class that is responsible for determining if a ringtone should be played. + This class will also have the code to play call waiting tones Change-Id: Ie8fb633c8a233cc6b54beeb09b3fd6b62c9cb76c --- .../com/android/incallui/StatusBarNotifier.java | 29 +++------ .../incallui/ringtone/DialerRingtoneManager.java | 60 +++++++++++++++++ .../incallui/ringtone/RingtoneManagerTest.java | 75 ++++++++++++++++++++++ 3 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java create mode 100644 InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java (limited to 'InCallUI') diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java index e0bca4446..48e0b1c34 100644 --- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java +++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java @@ -45,13 +45,13 @@ import android.text.TextUtils; import com.android.contacts.common.ContactsUtils; import com.android.contacts.common.ContactsUtils.UserType; -import com.android.contacts.common.compat.CompatUtils; import com.android.contacts.common.preference.ContactsPreferences; import com.android.contacts.common.util.BitmapUtil; import com.android.contacts.common.util.ContactDisplayUtils; import com.android.incallui.ContactInfoCache.ContactCacheEntry; import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback; import com.android.incallui.InCallPresenter.InCallState; +import com.android.incallui.ringtone.DialerRingtoneManager; import java.util.Objects; @@ -61,11 +61,6 @@ import java.util.Objects; public class StatusBarNotifier implements InCallPresenter.InCallStateListener, CallList.CallUpdateListener { - /* - * Flag used to determine if the Dialer is responsible for playing ringtones for incoming calls. - */ - private static final boolean IS_DIALER_RINGING_ENABLED = false; - // Notification types // Indicates that no notification is currently showing. private static final int NOTIFICATION_NONE = 0; @@ -80,6 +75,7 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, private final ContactsPreferences mContactsPreferences; private final ContactInfoCache mContactInfoCache; private final NotificationManager mNotificationManager; + private final DialerRingtoneManager mDialerRingtoneManager; private int mCurrentNotification = NOTIFICATION_NONE; private int mCallState = Call.State.INVALID; private int mSavedIcon = 0; @@ -97,6 +93,7 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, mContactInfoCache = contactInfoCache; mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + mDialerRingtoneManager = new DialerRingtoneManager(); mCurrentNotification = NOTIFICATION_NONE; } @@ -233,7 +230,7 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, return; } - final int state = call.getState(); + final int callState = call.getState(); // Check if data has changed; if nothing is different, don't issue another notification. final int iconResId = getIconToDisplay(call); @@ -243,13 +240,13 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, final String contentTitle = getContentTitle(contactInfo, call); final int notificationType; - if (state == Call.State.INCOMING || state == Call.State.CALL_WAITING) { + if (callState == Call.State.INCOMING || callState == Call.State.CALL_WAITING) { notificationType = NOTIFICATION_INCOMING_CALL; } else { notificationType = NOTIFICATION_IN_CALL; } - if (!checkForChangeAndSaveData(iconResId, content, largeIcon, contentTitle, state, + if (!checkForChangeAndSaveData(iconResId, content, largeIcon, contentTitle, callState, notificationType, contactInfo.contactRingtoneUri)) { return; } @@ -289,7 +286,7 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, addDismissUpgradeRequestAction(builder); addAcceptUpgradeRequestAction(builder); } else { - createIncomingCallNotification(call, state, builder); + createIncomingCallNotification(call, callState, builder); } addPersonReference(builder, contactInfo, call); @@ -299,7 +296,7 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, */ Notification notification = builder.build(); - if (shouldNotificationPlayRingtone(notificationType, contactInfo.contactRingtoneUri)) { + if (mDialerRingtoneManager.shouldPlayRingtone(callState, contactInfo.contactRingtoneUri)) { notification.flags |= Notification.FLAG_INSISTENT; notification.sound = contactInfo.contactRingtoneUri; AudioAttributes.Builder audioAttributes = new AudioAttributes.Builder(); @@ -318,16 +315,6 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener, mCurrentNotification = notificationType; } - /* - * The Notification should only play the ringtone once it's had a chance to look up the contact. - * Until the lookup is complete, the ringtone Uri is null - */ - private boolean shouldNotificationPlayRingtone(int notificationType, Uri ringtoneUri) { - return CompatUtils.isNCompatible() && IS_DIALER_RINGING_ENABLED - && notificationType == NOTIFICATION_INCOMING_CALL - && ringtoneUri != null; - } - private void createIncomingCallNotification( Call call, int state, Notification.Builder builder) { if (state == Call.State.ACTIVE) { diff --git a/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java new file mode 100644 index 000000000..ad580cb0d --- /dev/null +++ b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.incallui.ringtone; + +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.State; + +/** + * Class that determines when ringtones should be played and can play the call waiting tone when + * necessary. + */ +public class DialerRingtoneManager { + + /* + * Flag used to determine if the Dialer is responsible for playing ringtones for incoming calls. + */ + private static final boolean IS_DIALER_RINGING_ENABLED = false; + private boolean mForceDialerRingingEnabled = false; + + /** + * Determines if a ringtone should be played for the given call state (see {@link State}) and + * {@link Uri}. + * + * @param callState the call state for the call being checked. + * @param ringtoneUri the ringtone to potentially play. + * @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 + && ringtoneUri != null; + } + + private boolean isDialerRingingEnabled() { + return mForceDialerRingingEnabled || IS_DIALER_RINGING_ENABLED; + } + + @NeededForTesting + void forceDialerRingingEnabled() { + mForceDialerRingingEnabled = true; + } +} diff --git a/InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java b/InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java new file mode 100644 index 000000000..768843e1c --- /dev/null +++ b/InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.incallui.ringtone; + +import android.media.RingtoneManager; +import android.test.AndroidTestCase; + +import com.android.contacts.common.compat.CompatUtils; +import com.android.incallui.Call.State; + +public class RingtoneManagerTest extends AndroidTestCase { + + private DialerRingtoneManager mRingtoneManager; + + @Override + public void setUp() { + mRingtoneManager = new DialerRingtoneManager(); + mRingtoneManager.forceDialerRingingEnabled(); + } + + @Override + public void tearDown() { + mRingtoneManager = null; + } + + public void testShouldPlayRingtone_M() { + if (CompatUtils.isNCompatible()) { + return; + } + assertFalse(mRingtoneManager.shouldPlayRingtone(0, null)); + } + + public void testShouldPlayRingtone_N_NullUri() { + if (!CompatUtils.isNCompatible()) { + return; + } + assertFalse(mRingtoneManager.shouldPlayRingtone(State.INCOMING, null)); + } + + public void testShouldPlayRingtone_N_NotIncoming() { + if (!CompatUtils.isNCompatible()) { + return; + } + assertFalse(mRingtoneManager.shouldPlayRingtone(State.ACTIVE, null)); + } + + // Specific case for call waiting since that needs its own sound + public void testShouldPlayRingtone_N_CallWaiting() { + if (!CompatUtils.isNCompatible()) { + return; + } + assertFalse(mRingtoneManager.shouldPlayRingtone(State.CALL_WAITING, null)); + } + + public void testShouldPlayRingtone_N() { + if (!CompatUtils.isNCompatible()) { + return; + } + assertTrue(mRingtoneManager.shouldPlayRingtone(State.INCOMING, + RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE))); + } +} -- cgit v1.2.3