Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e20864c0 authored by Tyler Gunn's avatar Tyler Gunn Committed by Android (Google) Code Review
Browse files

Merge "Correct issue with BT ICS onCallRemoved not being called." into main

parents d892b67c 9b9f5af7
Loading
Loading
Loading
Loading
+48 −16
Original line number Diff line number Diff line
@@ -1571,8 +1571,22 @@ public class InCallController extends CallsManagerListenerBase implements
                    }
                    UserHandle userHandle = getUserFromCall(call);
                    if (mBTInCallServiceConnections.containsKey(userHandle)) {
                        Log.i(this, "onDisconnectedTonePlaying: Unbinding BT service");
                        mBTInCallServiceConnections.get(userHandle).disconnect();
                        Log.i(this, "onDisconnectedTonePlaying: Schedule unbind BT service");
                        final InCallServiceConnection connection =
                                mBTInCallServiceConnections.get(userHandle);

                        // Similar to in onCallRemoved when we unbind from the other ICS, we need to
                        // delay unbinding from the BT ICS because we need to give the ICS a
                        // moment to finish the onCallRemoved signal it got just prior.
                        mHandler.postDelayed(new Runnable("ICC.oDCTP", mLock) {
                            @Override
                            public void loggedRun() {
                                Log.i(this, "onDisconnectedTonePlaying: unbinding");
                                connection.disconnect();
                            }
                        }.prepare(), mTimeoutsAdapter.getCallRemoveUnbindInCallServicesDelay(
                                mContext.getContentResolver()));

                        mBTInCallServiceConnections.remove(userHandle);
                    }
                    // Ensure that BT ICS instance is cleaned up
@@ -2743,21 +2757,39 @@ public class InCallController extends CallsManagerListenerBase implements
                        info.getType() == IN_CALL_SERVICE_TYPE_SYSTEM_UI ||
                        info.getType() == IN_CALL_SERVICE_TYPE_NON_UI);
                IInCallService inCallService = entry.getValue();
                componentsUpdated.add(componentName);

                if (info.getType() == IN_CALL_SERVICE_TYPE_BLUETOOTH
                        && call.getState() == CallState.DISCONNECTED
                        && !mDisconnectedToneBtFutures.containsKey(call.getId())) {
                    CompletableFuture<Void> disconnectedToneFuture = new CompletableFuture<Void>()
                boolean isDisconnectingBtIcs = info.getType() == IN_CALL_SERVICE_TYPE_BLUETOOTH
                        && call.getState() == CallState.DISCONNECTED;

                if (isDisconnectingBtIcs) {
                    // If this is the first we heard about the disconnect for the BT ICS, then we
                    // will setup a future to notify the disconnet later.
                    if (!mDisconnectedToneBtFutures.containsKey(call.getId())) {
                        // Create the base future with timeout, we will chain more operations on to
                        // this.
                        CompletableFuture<Void> disconnectedToneFuture =
                                new CompletableFuture<Void>()
                                        .completeOnTimeout(null, DISCONNECTED_TONE_TIMEOUT,
                                                TimeUnit.MILLISECONDS);
                    mDisconnectedToneBtFutures.put(call.getId(), disconnectedToneFuture);
                    mDisconnectedToneBtFutures.get(call.getId()).thenRunAsync(() -> {
                        Log.i(this, "updateCall: Sending call disconnected update to BT ICS.");
                        // Note: DO NOT chain async work onto this future; using thenRun ensures
                        // when disconnectedToneFuture is completed that the chained work is run
                        // synchronously.
                        disconnectedToneFuture.thenRun(() -> {
                            Log.i(this,
                                    "updateCall: (deferred) Sending call disconnected update "
                                            + "to BT ICS.");
                            updateCallToIcs(inCallService, info, parcelableCall, componentName);
                            mDisconnectedToneBtFutures.remove(call.getId());
                    }, new LoggedHandlerExecutor(mHandler, "ICC.uC", mLock));
                        });
                        mDisconnectedToneBtFutures.put(call.getId(), disconnectedToneFuture);
                    } else {
                        // If we have already cached a disconnect signal for the BT ICS, don't sent
                        // any other updates (ie due to extras or whatnot) to the BT ICS.  If we do
                        // then it will hear about the disconnect in advance and not play the call
                        // end tone.
                        Log.i(this, "updateCall: skip update for disconnected call to BT ICS");
                    }
                } else {
                    componentsUpdated.add(componentName);
                    updateCallToIcs(inCallService, info, parcelableCall, componentName);
                }
            }