Loading flags/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -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", ], } Loading flags/telecom_broadcast_flags.aconfig 0 → 100644 +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 src/com/android/server/telecom/CallIntentProcessor.java +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; Loading Loading @@ -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); } Loading @@ -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 Loading @@ -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) { Loading @@ -90,7 +93,7 @@ public class CallIntentProcessor { processUnknownCallIntent(mCallsManager, intent); } else { processOutgoingCallIntent(mContext, mCallsManager, intent, callingPackage, mDefaultDialerCache); mDefaultDialerCache, mFeatureFlags); } Trace.endSection(); } Loading @@ -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(); Loading Loading @@ -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(); Loading src/com/android/server/telecom/CallsManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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); Loading src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java +43 −22 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -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; Loading @@ -109,6 +112,7 @@ public class NewOutgoingCallIntentBroadcaster { mLock = mCallsManager.getLock(); mDefaultDialerCache = defaultDialerCache; mMmiUtils = mmiUtils; mFeatureFlags = featureFlags; } /** Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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( Loading Loading @@ -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); } Loading @@ -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, Loading @@ -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 Loading
flags/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -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", ], } Loading
flags/telecom_broadcast_flags.aconfig 0 → 100644 +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
src/com/android/server/telecom/CallIntentProcessor.java +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; Loading Loading @@ -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); } Loading @@ -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 Loading @@ -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) { Loading @@ -90,7 +93,7 @@ public class CallIntentProcessor { processUnknownCallIntent(mCallsManager, intent); } else { processOutgoingCallIntent(mContext, mCallsManager, intent, callingPackage, mDefaultDialerCache); mDefaultDialerCache, mFeatureFlags); } Trace.endSection(); } Loading @@ -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(); Loading Loading @@ -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(); Loading
src/com/android/server/telecom/CallsManager.java +2 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading Loading @@ -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); Loading
src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java +43 −22 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -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; Loading @@ -109,6 +112,7 @@ public class NewOutgoingCallIntentBroadcaster { mLock = mCallsManager.getLock(); mDefaultDialerCache = defaultDialerCache; mMmiUtils = mmiUtils; mFeatureFlags = featureFlags; } /** Loading @@ -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; Loading Loading @@ -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; } Loading Loading @@ -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( Loading Loading @@ -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); } Loading @@ -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, Loading @@ -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