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

Commit 821faa54 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Stop sending the new outgoing call broadcast in a blocking manner." into main

parents 4d90427c 08992aa2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ aconfig_declarations {
    name: "telecom_flags",
    package: "com.android.server.telecom.flags",
    srcs: [
      "telecom_broadcast_flags.aconfig",
      "telecom_ringer_flag_declarations.aconfig",
    ],
}
+8 −0
Original line number Diff line number Diff line
package: "com.android.server.telecom.flags"

flag {
  name: "is_new_outgoing_call_broadcast_unblocking"
  namespace: "telecom"
  description: "When set, the ACTION_NEW_OUTGOING_CALL broadcast is unblocking."
  bug: "224550864"
}
 No newline at end of file
+11 −8
Original line number Diff line number Diff line
package com.android.server.telecom;

import com.android.server.telecom.components.ErrorDialogActivity;
import com.android.server.telecom.flags.FeatureFlags;

import android.content.Context;
import android.content.Intent;
@@ -32,7 +33,7 @@ import java.util.concurrent.CompletableFuture;
public class CallIntentProcessor {
    public interface Adapter {
        void processOutgoingCallIntent(Context context, CallsManager callsManager,
                Intent intent, String callingPackage);
                Intent intent, String callingPackage, FeatureFlags featureFlags);
        void processIncomingCallIntent(CallsManager callsManager, Intent intent);
        void processUnknownCallIntent(CallsManager callsManager, Intent intent);
    }
@@ -45,9 +46,9 @@ public class CallIntentProcessor {

        @Override
        public void processOutgoingCallIntent(Context context, CallsManager callsManager,
                Intent intent, String callingPackage) {
                Intent intent, String callingPackage, FeatureFlags featureFlags) {
            CallIntentProcessor.processOutgoingCallIntent(context, callsManager, intent,
                    callingPackage, mDefaultDialerCache);
                    callingPackage, mDefaultDialerCache, featureFlags);
        }

        @Override
@@ -73,12 +74,14 @@ public class CallIntentProcessor {
    private final Context mContext;
    private final CallsManager mCallsManager;
    private final DefaultDialerCache mDefaultDialerCache;
    private final FeatureFlags mFeatureFlags;

    public CallIntentProcessor(Context context, CallsManager callsManager,
            DefaultDialerCache defaultDialerCache) {
            DefaultDialerCache defaultDialerCache, FeatureFlags featureFlags) {
        this.mContext = context;
        this.mCallsManager = callsManager;
        this.mDefaultDialerCache = defaultDialerCache;
        this.mFeatureFlags = featureFlags;
    }

    public void processIntent(Intent intent, String callingPackage) {
@@ -90,7 +93,7 @@ public class CallIntentProcessor {
            processUnknownCallIntent(mCallsManager, intent);
        } else {
            processOutgoingCallIntent(mContext, mCallsManager, intent, callingPackage,
                    mDefaultDialerCache);
                    mDefaultDialerCache, mFeatureFlags);
        }
        Trace.endSection();
    }
@@ -107,7 +110,8 @@ public class CallIntentProcessor {
            CallsManager callsManager,
            Intent intent,
            String callingPackage,
            DefaultDialerCache defaultDialerCache) {
            DefaultDialerCache defaultDialerCache,
            FeatureFlags featureFlags) {

        Uri handle = intent.getData();
        String scheme = handle.getScheme();
@@ -182,10 +186,9 @@ public class CallIntentProcessor {
        boolean isPrivilegedDialer = defaultDialerCache.isDefaultOrSystemDialer(callingPackage,
                initiatingUser.getIdentifier());


        NewOutgoingCallIntentBroadcaster broadcaster = new NewOutgoingCallIntentBroadcaster(
                context, callsManager, intent, callsManager.getPhoneNumberUtilsAdapter(),
                isPrivilegedDialer, defaultDialerCache, new MmiUtils());
                isPrivilegedDialer, defaultDialerCache, new MmiUtils(), featureFlags);

        // If the broadcaster comes back with an immediate error, disconnect and show a dialog.
        NewOutgoingCallIntentBroadcaster.CallDisposition disposition = broadcaster.evaluateCall();
+2 −0
Original line number Diff line number Diff line
@@ -469,6 +469,7 @@ public class CallsManager extends Call.ListenerBase
    private final TransactionManager mTransactionManager;
    private final UserManager mUserManager;
    private final CallStreamingNotification mCallStreamingNotification;
    private final FeatureFlags mFeatureFlags;

    private final ConnectionServiceFocusManager.CallsManagerRequester mRequester =
            new ConnectionServiceFocusManager.CallsManagerRequester() {
@@ -677,6 +678,7 @@ public class CallsManager extends Call.ListenerBase
        mBlockedNumbersAdapter = blockedNumbersAdapter;
        mCallStreamingController = new CallStreamingController(mContext, mLock);
        mCallStreamingNotification = callStreamingNotification;
        mFeatureFlags = featureFlags;

        mListeners.add(mInCallController);
        mListeners.add(mInCallWakeLockController);
+43 −22
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.telecom.flags.FeatureFlags;
import com.android.server.telecom.callredirection.CallRedirectionProcessor;

// TODO: Needed for move to system service: import com.android.internal.R;
@@ -77,6 +78,7 @@ public class NewOutgoingCallIntentBroadcaster {
    private final TelecomSystem.SyncRoot mLock;
    private final DefaultDialerCache mDefaultDialerCache;
    private final MmiUtils mMmiUtils;
    private final FeatureFlags mFeatureFlags;

    /*
     * Whether or not the outgoing call intent originated from the default phone application. If
@@ -100,7 +102,8 @@ public class NewOutgoingCallIntentBroadcaster {
    @VisibleForTesting
    public NewOutgoingCallIntentBroadcaster(Context context, CallsManager callsManager,
            Intent intent, PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
            boolean isDefaultPhoneApp, DefaultDialerCache defaultDialerCache, MmiUtils mmiUtils) {
            boolean isDefaultPhoneApp, DefaultDialerCache defaultDialerCache, MmiUtils mmiUtils,
            FeatureFlags featureFlags) {
        mContext = context;
        mCallsManager = callsManager;
        mIntent = intent;
@@ -109,6 +112,7 @@ public class NewOutgoingCallIntentBroadcaster {
        mLock = mCallsManager.getLock();
        mDefaultDialerCache = defaultDialerCache;
        mMmiUtils = mmiUtils;
        mFeatureFlags = featureFlags;
    }

    /**
@@ -128,7 +132,8 @@ public class NewOutgoingCallIntentBroadcaster {
                    // Once the NEW_OUTGOING_CALL broadcast is finished, the resultData is
                    // used as the actual number to call. (If null, no call will be placed.)
                    String resultNumber = getResultData();
                    Log.i(this, "Received new-outgoing-call-broadcast for %s with data %s", mCall,
                    Log.i(NewOutgoingCallIntentBroadcaster.this,
                            "Received new-outgoing-call-broadcast for %s with data %s", mCall,
                            Log.pii(resultNumber));

                    boolean endEarly = false;
@@ -320,6 +325,7 @@ public class NewOutgoingCallIntentBroadcaster {
        String scheme = mPhoneNumberUtilsAdapter.isUriNumber(number)
                ? PhoneAccount.SCHEME_SIP : PhoneAccount.SCHEME_TEL;
        result.callingAddress = Uri.fromParts(scheme, number, null);

        return result;
    }

@@ -351,7 +357,7 @@ public class NewOutgoingCallIntentBroadcaster {

    public void processCall(Call call, CallDisposition disposition) {
        mCall = call;
        if (disposition.callImmediately) {
        if (disposition.callImmediately || mFeatureFlags.isNewOutgoingCallBroadcastUnblocking()) {
            boolean speakerphoneOn = mIntent.getBooleanExtra(
                    TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false);
            int videoState = mIntent.getIntExtra(
@@ -390,7 +396,6 @@ public class NewOutgoingCallIntentBroadcaster {

        if (disposition.sendBroadcast) {
            UserHandle targetUser = mCall.getAssociatedUser();
            Log.i(this, "Sending NewOutgoingCallBroadcast for %s to %s", mCall, targetUser);
            broadcastIntent(mIntent, disposition.number,
                    !disposition.callImmediately && !callRedirectionWithService, targetUser);
        }
@@ -415,17 +420,31 @@ public class NewOutgoingCallIntentBroadcaster {
        if (number != null) {
            broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);
        }

        // Force receivers of this broadcast intent to run at foreground priority because we
        // want to finish processing the broadcast intent as soon as possible.
        broadcastIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND
                | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
        Log.v(this, "Broadcasting intent: %s.", broadcastIntent);

        checkAndCopyProviderExtras(originalCallIntent, broadcastIntent);

        if (mFeatureFlags.isNewOutgoingCallBroadcastUnblocking()) {
            // Where the new outgoing call broadcast is unblocking, do not give receiver FG priority
            // and do not allow background activity starts.
            broadcastIntent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
            Log.i(this, "broadcastIntent: Sending non-blocking for %s to %s", mCall.getId(),
                    targetUser);
            mContext.sendBroadcastAsUser(
                    broadcastIntent,
                    targetUser,
                    android.Manifest.permission.PROCESS_OUTGOING_CALLS,
                    AppOpsManager.OP_PROCESS_OUTGOING_CALLS);  // initialExtras
        } else {
            Log.i(this, "broadcastIntent: Sending ordered for %s to %s, waitForResult=%b",
                    mCall.getId(), targetUser, receiverRequired);
            final BroadcastOptions options = BroadcastOptions.makeBasic();
            options.setBackgroundActivityStartsAllowed(true);
            // Force receivers of this broadcast intent to run at foreground priority because we
            // want to finish processing the broadcast intent as soon as possible.
            broadcastIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND
                    | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);

            mContext.sendOrderedBroadcastAsUser(
                    broadcastIntent,
                    targetUser,
@@ -435,9 +454,11 @@ public class NewOutgoingCallIntentBroadcaster {
                    receiverRequired ? new NewOutgoingCallBroadcastIntentReceiver() : null,
                    null,  // scheduler
                    Activity.RESULT_OK,  // initialCode
                number,  // initialData: initial value for the result data (number to be modified)
                    number,  // initialData: initial value for the result data (number to be
                             // modified)
                    null);  // initialExtras
        }
    }

    /**
     * Copy all the expected extras set when a 3rd party gateway provider is to be used, from the
Loading