Snap for 8712302 from c0252c3d7d436427b753b8db097361bd0a5bc317 to tm-frc-neuralnetworks-release
Change-Id: I2d2dc3282f0f364cf6cff9230d34ba6993707313
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 4838a60..1def59a 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -70,15 +70,15 @@
<string name="add_blocked_dialog_body" msgid="8599974422407139255">"यावरील कॉल आणि एसएमएस ब्लॉक करा"</string>
<string name="add_blocked_number_hint" msgid="8769422085658041097">"फोन नंबर"</string>
<string name="block_button" msgid="485080149164258770">"ब्लॉक करा"</string>
- <string name="non_primary_user" msgid="315564589279622098">"फक्त डिव्हाइस मालक अवरोधित केलेले नंबर पाहू आणि व्यवस्थापित करू शकतो."</string>
+ <string name="non_primary_user" msgid="315564589279622098">"फक्त डिव्हाइस मालक ब्लॉक केलेले नंबर पाहू आणि व्यवस्थापित करू शकतो."</string>
<string name="delete_icon_description" msgid="5335959254954774373">"ब्लॉक करा"</string>
- <string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"अवरोधित करणे तात्पुरते बंद आहे"</string>
- <string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"तुम्ही एखादा आणीबाणी नंबर डायल केला किंवा त्यावर मजकूर पाठविल्यानंतर, आणीबाणी सेवा आपल्याशी संपर्क साधू शकतात हे सुनिश्चित करण्यासाठी अवरोधित करणे बंद करते."</string>
+ <string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"ब्लॉक करणे तात्पुरते बंद आहे"</string>
+ <string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"तुम्ही एखादा आणीबाणी नंबर डायल केला किंवा त्यावर मेसेज पाठवल्यानंतर, आणीबाणी सेवा तुमच्याशी संपर्क साधू शकतात याची खात्री करण्यासाठी ब्लॉक करणे बंद केले जाते."</string>
<string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"आता पुन्हा-सक्षम करा"</string>
- <string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> अवरोधित केला"</string>
+ <string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> ब्लॉक केला"</string>
<string name="blocked_numbers_number_unblocked_message" msgid="2933071624674945601">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> अनब्लॉक केला"</string>
- <string name="blocked_numbers_block_emergency_number_message" msgid="4198550501500893890">"आणीबाणी नंबर अवरोधित करण्यात अक्षम."</string>
- <string name="blocked_numbers_number_already_blocked_message" msgid="2301270825735665458">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> आधीपासून अवरोधित केला आहे."</string>
+ <string name="blocked_numbers_block_emergency_number_message" msgid="4198550501500893890">"आणीबाणी नंबर ब्लॉक करता आला नाही."</string>
+ <string name="blocked_numbers_number_already_blocked_message" msgid="2301270825735665458">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> आधीपासून ब्लॉक केला आहे."</string>
<string name="toast_personal_call_msg" msgid="5817631570381795610">"कॉल करण्यासाठी वैयक्तिक डायलर वापरणे"</string>
<string name="notification_incoming_call" msgid="1233481138362230894">"<xliff:g id="CALL_FROM">%2$s</xliff:g> कडील <xliff:g id="CALL_VIA">%1$s</xliff:g> मधील कॉल"</string>
<string name="notification_incoming_video_call" msgid="5795968314037063900">"<xliff:g id="CALL_FROM">%2$s</xliff:g> कडील <xliff:g id="CALL_VIA">%1$s</xliff:g> मधील व्हिडिओ कॉल"</string>
diff --git a/src/com/android/server/telecom/CallAudioManager.java b/src/com/android/server/telecom/CallAudioManager.java
index 39111f3..1863cde 100644
--- a/src/com/android/server/telecom/CallAudioManager.java
+++ b/src/com/android/server/telecom/CallAudioManager.java
@@ -468,10 +468,11 @@
@VisibleForTesting
public boolean startRinging() {
synchronized (mCallsManager.getLock()) {
- boolean result = mRinger.startRinging(mForegroundCall,
+ Call localForegroundCall = mForegroundCall;
+ boolean result = mRinger.startRinging(localForegroundCall,
mCallAudioRouteStateMachine.isHfpDeviceAvailable());
if (result) {
- mForegroundCall.setStartRingTime();
+ localForegroundCall.setStartRingTime();
}
return result;
}
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index d4526ad..ef98e5a 100755
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -140,6 +140,7 @@
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -343,10 +344,8 @@
private RespondViaSmsManager mRespondViaSmsManager;
private final Ringer mRinger;
private final InCallWakeLockController mInCallWakeLockController;
- // For this set initial table size to 16 because we add 13 listeners in
- // the CallsManager constructor.
- private final Set<CallsManagerListener> mListeners = Collections.newSetFromMap(
- new ConcurrentHashMap<CallsManagerListener, Boolean>(16, 0.9f, 1));
+ private final CopyOnWriteArrayList<CallsManagerListener> mListeners =
+ new CopyOnWriteArrayList<>();
private final HeadsetMediaButton mHeadsetMediaButton;
private final WiredHeadsetManager mWiredHeadsetManager;
private final SystemStateHelper mSystemStateHelper;
@@ -579,7 +578,6 @@
mListeners.add(mInCallWakeLockController);
mListeners.add(statusBarNotifier);
mListeners.add(mCallLogManager);
- mListeners.add(mPhoneStateBroadcaster);
mListeners.add(mInCallController);
mListeners.add(mCallDiagnosticServiceController);
mListeners.add(mCallAudioManager);
@@ -590,6 +588,9 @@
mListeners.add(mProximitySensorManager);
mListeners.add(audioProcessingNotification);
+ // this needs to be after the mCallAudioManager
+ mListeners.add(mPhoneStateBroadcaster);
+
// There is no USER_SWITCHED broadcast for user 0, handle it here explicitly.
final UserManager userManager = UserManager.get(mContext);
// Don't load missed call if it is run in split user model.
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index 4a13818..4665ec2 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -263,7 +263,6 @@
final int mediaResourceId; // The resourceId of the tone to play. Used for media-based
// tones.
- int stream = STREAM_INVALID;
switch (mToneId) {
case TONE_BUSY:
// TODO: CDMA-specific tones
@@ -331,12 +330,6 @@
toneVolume = RELATIVE_VOLUME_HIPRI;
toneLengthMillis = Integer.MAX_VALUE - TIMEOUT_BUFFER_MILLIS;
mediaResourceId = TONE_RESOURCE_ID_UNDEFINED;
- // When a hearing aid device or a LE audio device is used, ring back tone should
- // use STREAM_VOICE_CALL
- if (mCallAudioRoutePeripheralAdapter.isLeAudioDeviceOn()
- || mCallAudioRoutePeripheralAdapter.isHearingAidDeviceOn()) {
- stream = AudioManager.STREAM_VOICE_CALL;
- }
break;
case TONE_UNOBTAINABLE_NUMBER:
toneType = ToneGenerator.TONE_SUP_ERROR;
@@ -368,15 +361,18 @@
throw new IllegalStateException("Bad toneId: " + mToneId);
}
- // Don't override already valid stream values
- if (stream == STREAM_INVALID) {
- stream = AudioManager.STREAM_VOICE_CALL;
- if (mCallAudioRoutePeripheralAdapter.isBluetoothAudioOn()) {
- stream = AudioManager.STREAM_BLUETOOTH_SCO;
- }
+ int stream = AudioManager.STREAM_VOICE_CALL;
+ if (mCallAudioRoutePeripheralAdapter.isBluetoothAudioOn()) {
+ stream = AudioManager.STREAM_BLUETOOTH_SCO;
}
-
if (toneType != ToneGenerator.TONE_UNKNOWN) {
+ if (stream == AudioManager.STREAM_BLUETOOTH_SCO) {
+ // Override audio stream for BT le device and hearing aid device
+ if (mCallAudioRoutePeripheralAdapter.isLeAudioDeviceOn()
+ || mCallAudioRoutePeripheralAdapter.isHearingAidDeviceOn()) {
+ stream = AudioManager.STREAM_VOICE_CALL;
+ }
+ }
playToneGeneratorTone(stream, toneVolume, toneType, toneLengthMillis);
} else if (mediaResourceId != TONE_RESOURCE_ID_UNDEFINED) {
playMediaTone(stream, mediaResourceId);
diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index 9597403..c566e5a 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -366,11 +366,11 @@
isSimAccount = true;
}
- Log.i(this, "setUserSelectedOutgoingPhoneAccount: %s", accountHandle);
mState.defaultOutgoingAccountHandles
.put(userHandle, new DefaultPhoneAccountHandle(userHandle, accountHandle,
account.getGroupId()));
}
+ Log.i(this, "setUserSelectedOutgoingPhoneAccount: %s", accountHandle);
// Potentially update the default voice subid in SubscriptionManager.
if (!Objects.equals(currentDefaultPhoneAccount, accountHandle)) {
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index f5dd786..06a190b 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -254,6 +254,14 @@
String callingFeatureId) {
try {
Log.startSession("TSI.gOSMPA", Log.getPackageAbbreviation(callingPackage));
+ try {
+ enforceCallingPackage(callingPackage, "getOwnSelfManagedPhoneAccounts");
+ }
+ catch(SecurityException se){
+ EventLog.writeEvent(0x534e4554, "231986341", Binder.getCallingUid(),
+ "getOwnSelfManagedPhoneAccounts: invalid calling package");
+ throw se;
+ }
if (!canReadMangeOwnCalls("Requires MANAGE_OWN_CALLS permission.")) {
throw new SecurityException("Requires MANAGE_OWN_CALLS permission.");
}
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
index 81982c9..5cc54de 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothDeviceManager.java
@@ -429,6 +429,7 @@
if (mAudioManager.getCommunicationDevice() != null
&& mAudioManager.getCommunicationDevice().getType()
== AudioDeviceInfo.TYPE_BLE_HEADSET) {
+ mBluetoothRouteManager.onAudioLost(mAudioManager.getCommunicationDevice().getAddress());
mAudioManager.clearCommunicationDevice();
mLeAudioSetAsCommunicationDevice = false;
}
@@ -493,6 +494,7 @@
Log.w(this, " Could not set bleHeadset device");
} else {
Log.i(this, " bleHeadset device set");
+ mBluetoothRouteManager.onAudioOn(bleHeadset.getAddress());
mLeAudioSetAsCommunicationDevice = true;
}
return result;
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java b/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java
index 1ffcc8a..e5fe971 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothStateReceiver.java
@@ -196,9 +196,10 @@
Log.w(LOG_TAG,
"Device %s cannot be use as hearing aid communication device.",
device);
+ } else {
+ mBluetoothRouteManager.sendMessage(BT_AUDIO_IS_ON, args);
}
}
- mBluetoothRouteManager.sendMessage(BT_AUDIO_IS_ON, args);
}
}
}
diff --git a/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java b/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
index f50a5b0..eadda0d 100644
--- a/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
+++ b/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
@@ -16,15 +16,13 @@
package com.android.server.telecom.tests;
-import static com.android.server.telecom.bluetooth.BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX;
-
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
@@ -37,8 +35,6 @@
import android.media.ToneGenerator;
import android.test.suitebuilder.annotation.SmallTest;
-import androidx.test.filters.FlakyTest;
-
import com.android.server.telecom.CallAudioManager;
import com.android.server.telecom.CallAudioRoutePeripheralAdapter;
import com.android.server.telecom.CallAudioRouteStateMachine;
@@ -55,12 +51,12 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
@RunWith(JUnit4.class)
public class InCallTonePlayerTest extends TelecomTestCase {
+ private static final long TEST_TIMEOUT = 5000L;
private InCallTonePlayer.Factory mFactory;
private CallAudioRoutePeripheralAdapter mCallAudioRoutePeripheralAdapter;
@@ -124,6 +120,7 @@
when(mToneGeneratorFactory.get(anyInt(), anyInt())).thenReturn(mToneGenerator);
when(mMediaPlayerFactory.get(anyInt(), any())).thenReturn(mMediaPlayerAdapter);
+ doNothing().when(mCallAudioManager).setIsTonePlaying(anyBoolean());
mCallAudioRoutePeripheralAdapter = new CallAudioRoutePeripheralAdapter(
mCallAudioRouteStateMachine, mBluetoothRouteManager, mWiredHeadsetManager,
@@ -158,12 +155,12 @@
when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
assertTrue(mInCallTonePlayer.startTone());
// Verify we did play a tone.
- verify(mMediaPlayerFactory, timeout(5000)).get(anyInt(), any());
+ verify(mMediaPlayerFactory, timeout(TEST_TIMEOUT)).get(anyInt(), any());
verify(mCallAudioManager).setIsTonePlaying(eq(true));
mInCallTonePlayer.stopTone();
// Timeouts due to threads!
- verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(false));
+ verify(mCallAudioManager, timeout(TEST_TIMEOUT)).setIsTonePlaying(eq(false));
// Correctness check: ensure we can't start the tone again.
assertFalse(mInCallTonePlayer.startTone());
@@ -175,15 +172,15 @@
mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
assertTrue(mInCallTonePlayer.startTone());
- verify(mToneGenerator, timeout(5000)).startTone(anyInt());
+ verify(mToneGenerator, timeout(TEST_TIMEOUT)).startTone(anyInt());
verify(mCallAudioManager).setIsTonePlaying(eq(true));
mInCallTonePlayer.stopTone();
// Timeouts due to threads!
- verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(false));
+ verify(mCallAudioManager, timeout(TEST_TIMEOUT)).setIsTonePlaying(eq(false));
// Ideally it would be nice to verify this, however release is a native method so appears to
// cause flakiness when testing on Cuttlefish.
- // verify(mToneGenerator, timeout(5000)).release();
+ // verify(mToneGenerator, timeout(TEST_TIMEOUT)).release();
// Correctness check: ensure we can't start the tone again.
assertFalse(mInCallTonePlayer.startTone());
@@ -196,13 +193,13 @@
assertTrue(mInCallTonePlayer.startTone());
// Verify we did play a tone.
- verify(mMediaPlayerFactory, timeout(5000)).get(anyInt(), any());
- verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(true));
+ verify(mMediaPlayerFactory, timeout(TEST_TIMEOUT)).get(anyInt(), any());
+ verify(mCallAudioManager, timeout(TEST_TIMEOUT)).setIsTonePlaying(eq(true));
}
@SmallTest
@Test
- public void testRingbackAudioStreamHeadset() {
+ public void testRingbackToneAudioStreamHeadset() {
when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
@@ -213,14 +210,32 @@
mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
assertTrue(mInCallTonePlayer.startTone());
- verify(mToneGeneratorFactory, timeout(5000))
+ verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
.get(eq(AudioManager.STREAM_BLUETOOTH_SCO), anyInt());
- verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(true));
+ verify(mCallAudioManager).setIsTonePlaying(eq(true));
}
@SmallTest
@Test
- public void testRingbackAudioStreamHearingAid() {
+ public void testCallWaitingToneAudioStreamHeadset() {
+ when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
+ mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
+ when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
+ when(mBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(true);
+
+ when(mBluetoothRouteManager.isCachedLeAudioDevice(mDevice)).thenReturn(false);
+ when(mBluetoothRouteManager.isCachedHearingAidDevice(mDevice)).thenReturn(false);
+
+ mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_CALL_WAITING);
+ assertTrue(mInCallTonePlayer.startTone());
+ verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
+ .get(eq(AudioManager.STREAM_BLUETOOTH_SCO), anyInt());
+ verify(mCallAudioManager).setIsTonePlaying(eq(true));
+ }
+
+ @SmallTest
+ @Test
+ public void testRingbackToneAudioStreamHearingAid() {
when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
@@ -231,8 +246,26 @@
mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_RING_BACK);
assertTrue(mInCallTonePlayer.startTone());
- verify(mToneGeneratorFactory, timeout(5000))
+ verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
.get(eq(AudioManager.STREAM_VOICE_CALL), anyInt());
- verify(mCallAudioManager, timeout(5000)).setIsTonePlaying(eq(true));
+ verify(mCallAudioManager).setIsTonePlaying(eq(true));
+ }
+
+ @SmallTest
+ @Test
+ public void testCallWaitingToneAudioStreamHearingAid() {
+ when(mAudioManagerAdapter.isVolumeOverZero()).thenReturn(true);
+ mBluetoothDeviceManager.setBluetoothRouteManager(mBluetoothRouteManager);
+ when(mBluetoothRouteManager.getBluetoothAudioConnectedDevice()).thenReturn(mDevice);
+ when(mBluetoothRouteManager.isBluetoothAudioConnectedOrPending()).thenReturn(true);
+
+ when(mBluetoothRouteManager.isCachedLeAudioDevice(mDevice)).thenReturn(false);
+ when(mBluetoothRouteManager.isCachedHearingAidDevice(mDevice)).thenReturn(true);
+
+ mInCallTonePlayer = mFactory.createPlayer(InCallTonePlayer.TONE_CALL_WAITING);
+ assertTrue(mInCallTonePlayer.startTone());
+ verify(mToneGeneratorFactory, timeout(TEST_TIMEOUT))
+ .get(eq(AudioManager.STREAM_VOICE_CALL), anyInt());
+ verify(mCallAudioManager).setIsTonePlaying(eq(true));
}
}