Fix for incoming and outgoing call not starting as top app
By not starting the service as a top app it caused it to grab default
scheduling priority (non RT) for a good part of the initial flow until
an activity is created by dialer which adds signficant latency per the
linux scheduler behavior. By adding this flag we make the service
start as a top app and ensure RT scheduling is set when service is
bound.
Bug: 240343304
Test: Manual and trace analysis
Change-Id: I1ad4f4352ef99571227899b00b3ae1d7ffa219f9
Merged-In: I1ad4f4352ef99571227899b00b3ae1d7ffa219f9
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index ec87555..9a53575 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -322,7 +322,8 @@
mInCallServiceInfo.setBindingStartTime(mClockProxy.elapsedRealtime());
if (!mContext.bindServiceAsUser(intent, mServiceConnection,
Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS,
+ | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS
+ | Context.BIND_SCHEDULE_LIKE_TOP_APP,
UserHandle.CURRENT)) {
Log.w(this, "Failed to connect.");
mIsConnected = false;
diff --git a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
index ddacf43..3d387a8 100644
--- a/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
+++ b/tests/src/com/android/server/telecom/tests/InCallControllerTests.java
@@ -181,6 +181,10 @@
private SystemStateHelper.SystemStateListener mSystemStateListener;
private CarModeTracker mCarModeTracker = spy(new CarModeTracker());
+ private final int serviceBindingFlags = Context.BIND_AUTO_CREATE
+ | Context.BIND_FOREGROUND_SERVICE | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS
+ | Context.BIND_SCHEDULE_LIKE_TOP_APP;
+
@Override
@Before
public void setUp() throws Exception {
@@ -354,8 +358,7 @@
verify(mMockContext).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -389,8 +392,7 @@
verify(mMockContext).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -442,8 +444,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -473,8 +474,7 @@
when(mDefaultDialerCache.getDefaultDialerApplication(CURRENT_USER_ID))
.thenReturn(DEF_PKG);
when(mMockContext.bindServiceAsUser(any(Intent.class), any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT))).thenReturn(true);
when(mTimeoutsAdapter.getEmergencyCallbackWindowMillis(any(ContentResolver.class)))
.thenReturn(300_000L);
@@ -502,8 +502,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -552,8 +551,7 @@
ArgumentCaptor<ServiceConnection> serviceConnectionCaptor =
ArgumentCaptor.forClass(ServiceConnection.class);
when(mMockContext.bindServiceAsUser(any(Intent.class), serviceConnectionCaptor.capture(),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT))).thenReturn(true);
when(mTimeoutsAdapter.getEmergencyCallbackWindowMillis(any(ContentResolver.class)))
.thenReturn(300_000L);
@@ -581,8 +579,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -611,8 +608,7 @@
verify(mMockContext, times(2)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify we were re-granted the runtime permission.
@@ -666,8 +662,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
serviceConnectionCaptor.capture(),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -699,8 +694,7 @@
verify(mMockContext, times(2)).bindServiceAsUser(
bindIntentCaptor2.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
bindIntent = bindIntentCaptor2.getValue();
@@ -756,8 +750,7 @@
verify(mMockContext, times(2)).bindServiceAsUser(
bindIntentCaptor2.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
assertEquals(sysDialerComponentName, bindIntentCaptor2.getValue().getComponent());
}
@@ -791,8 +784,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
Intent bindIntent = bindIntentCaptor.getValue();
@@ -830,8 +822,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
serviceConnectionCaptor.capture(),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Pretend that the call has gone away.
@@ -879,8 +870,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify bind car mode ui
assertEquals(1, bindIntentCaptor.getAllValues().size());
@@ -908,8 +898,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify bind to default package, instead of the invalid car mode ui.
assertEquals(1, bindIntentCaptor.getAllValues().size());
@@ -952,8 +941,7 @@
verify(mMockContext, times(2)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify bind
@@ -997,8 +985,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify bind
@@ -1031,8 +1018,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
serviceConnectionCaptor.capture(),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
assertEquals(1, bindIntentCaptor.getAllValues().size());
verifyBinding(bindIntentCaptor, 0, DEF_PKG, DEF_CLASS);
@@ -1070,8 +1056,7 @@
verify(mMockContext).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
}
@@ -1102,8 +1087,7 @@
verify(mMockContext, times(4)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify bind car mode ui
assertEquals(4, bindIntentCaptor.getAllValues().size());
@@ -1160,8 +1144,7 @@
verify(mMockContext, times(2)).bindServiceAsUser(
bindIntentCaptor.capture(),
serviceConnectionCaptor.capture(),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
CompletableFuture<Boolean> bindTimeout = mInCallController.getBindingFuture();
@@ -1229,8 +1212,7 @@
verify(mMockContext, never()).bindServiceAsUser(
any(Intent.class),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Now switch to car mode.
@@ -1242,8 +1224,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Verify bind car mode ui
assertEquals(1, bindIntentCaptor.getAllValues().size());
@@ -1269,8 +1250,7 @@
verify(mMockContext, never()).bindServiceAsUser(
any(Intent.class),
any(ServiceConnection.class),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
// Now switch to car mode.
@@ -1287,8 +1267,7 @@
verify(mMockContext, times(1)).bindServiceAsUser(
any(Intent.class),
serviceConnectionCaptor.capture(),
- eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
- | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
+ eq(serviceBindingFlags),
eq(UserHandle.CURRENT));
ServiceConnection serviceConnection = serviceConnectionCaptor.getValue();