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

Commit 08992aa2 authored by Tyler Gunn's avatar Tyler Gunn
Browse files

Stop sending the new outgoing call broadcast in a blocking manner.

Also remove foreground priority from receivers as well as remove the
ability to launch activities from the background.

Test: Manual testing with flag overridden on and off.
Test: Added unit test to confirm operation with/without the flag set.
Bug: 224550864
Change-Id: I206a822d1a13c68224fd571e3c2bca4b3e7fec0e
parent 23a939e3
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