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

Commit 9ddbe809 authored by qing's avatar qing Committed by Qing Zhong
Browse files

Apply Dnd filter only calls with dnd only filter extra

1. Still apply Dnd call filter even if phone account has EXTRA_SKIP_CALL_FILTERING
, this is to make sure BluetoothInCallService works as intended when Dnd is on.

2. Create a provider interface for InComingCallFilterGraph for uni testing purpose.

Test: manual test works, dialer can receive this boolean in extra
Bug: 222333869
Change-Id: I9e65555d0524b213cb1ab2e9b89316f9638f80e9
parent 8b5d3451
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ aconfig_declarations {
      "telecom_broadcast_flags.aconfig",
      "telecom_ringer_flag_declarations.aconfig",
      "telecom_api_flags.aconfig",
      "telecom_call_filtering_flags.aconfig",
      "telecom_incallservice_flags.aconfig"
    ],
}
+8 −0
Original line number Diff line number Diff line
package: "com.android.server.telecom.flags"

flag {
  name: "skip_filter_phone_account_perform_dnd_filter"
  namespace: "telecom"
  description: "Gates whether to still perform Dnd filter when phone account has skip_filter call extra."
  bug: "222333869"
}
 No newline at end of file
+24 −3
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ import com.android.server.telecom.callfiltering.CallScreeningServiceFilter;
import com.android.server.telecom.callfiltering.DirectToVoicemailFilter;
import com.android.server.telecom.callfiltering.DndCallFilter;
import com.android.server.telecom.callfiltering.IncomingCallFilterGraph;
import com.android.server.telecom.callfiltering.IncomingCallFilterGraphProvider;
import com.android.server.telecom.callredirection.CallRedirectionProcessor;
import com.android.server.telecom.components.ErrorDialogActivity;
import com.android.server.telecom.components.TelecomBroadcastReceiver;
@@ -466,6 +467,8 @@ public class CallsManager extends Call.ListenerBase
    private final CallStreamingNotification mCallStreamingNotification;
    private final FeatureFlags mFeatureFlags;

    private final IncomingCallFilterGraphProvider mIncomingCallFilterGraphProvider;

    private final ConnectionServiceFocusManager.CallsManagerRequester mRequester =
            new ConnectionServiceFocusManager.CallsManagerRequester() {
                @Override
@@ -580,7 +583,8 @@ public class CallsManager extends Call.ListenerBase
            EmergencyCallDiagnosticLogger emergencyCallDiagnosticLogger,
            CallAudioCommunicationDeviceTracker communicationDeviceTracker,
            CallStreamingNotification callStreamingNotification,
            FeatureFlags featureFlags) {
            FeatureFlags featureFlags,
            IncomingCallFilterGraphProvider incomingCallFilterGraphProvider) {

        mContext = context;
        mLock = lock;
@@ -599,6 +603,7 @@ public class CallsManager extends Call.ListenerBase
        mEmergencyCallHelper = emergencyCallHelper;
        mCallerInfoLookupHelper = callerInfoLookupHelper;
        mEmergencyCallDiagnosticLogger = emergencyCallDiagnosticLogger;
        mIncomingCallFilterGraphProvider = incomingCallFilterGraphProvider;

        mDtmfLocalTonePlayer =
                new DtmfLocalTonePlayer(new DtmfLocalTonePlayer.ToneGeneratorProxy());
@@ -793,11 +798,12 @@ public class CallsManager extends Call.ListenerBase
                ? new Bundle()
                : phoneAccount.getExtras();
        TelephonyManager telephonyManager = getTelephonyManager();
        boolean performDndFilter = mFeatureFlags.skipFilterPhoneAccountPerformDndFilter();
        if (incomingCall.hasProperty(Connection.PROPERTY_EMERGENCY_CALLBACK_MODE) ||
                incomingCall.hasProperty(Connection.PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL) ||
                telephonyManager.isInEmergencySmsMode() ||
                incomingCall.isSelfManaged() ||
                extras.getBoolean(PhoneAccount.EXTRA_SKIP_CALL_FILTERING)) {
                (!performDndFilter && extras.getBoolean(PhoneAccount.EXTRA_SKIP_CALL_FILTERING))) {
            Log.i(this, "Skipping call filtering for %s (ecm=%b, "
                            + "networkIdentifiedEmergencyCall = %b, emergencySmsMode = %b, "
                            + "selfMgd=%b, skipExtra=%b)",
@@ -815,12 +821,27 @@ public class CallsManager extends Call.ListenerBase
                    .build(), false);
            incomingCall.setIsUsingCallFiltering(false);
            return;
        } else if (performDndFilter && extras.getBoolean(PhoneAccount.EXTRA_SKIP_CALL_FILTERING)) {
            IncomingCallFilterGraph graph = setupDndFilterOnlyGraph(incomingCall);
            graph.performFiltering();
            return;
        }

        IncomingCallFilterGraph graph = setUpCallFilterGraph(incomingCall);
        graph.performFiltering();
    }

    private IncomingCallFilterGraph setupDndFilterOnlyGraph(Call incomingHfpCall) {
        incomingHfpCall.setIsUsingCallFiltering(true);
        DndCallFilter dndCallFilter = new DndCallFilter(incomingHfpCall, mRinger);
        IncomingCallFilterGraph graph = mIncomingCallFilterGraphProvider.createGraph(
                incomingHfpCall,
                this::onCallFilteringComplete, mContext, mTimeoutsAdapter, mLock);
        graph.addFilter(dndCallFilter);
        mGraphHandlerThreads.add(graph.getHandlerThread());
        return graph;
    }

    private IncomingCallFilterGraph setUpCallFilterGraph(Call incomingCall) {
        incomingCall.setIsUsingCallFiltering(true);
        String carrierPackageName = getCarrierPackageName();
@@ -833,7 +854,7 @@ public class CallsManager extends Call.ListenerBase
                mContext.getPackageManager(), packageName);
        ParcelableCallUtils.Converter converter = new ParcelableCallUtils.Converter();

        IncomingCallFilterGraph graph = new IncomingCallFilterGraph(incomingCall,
        IncomingCallFilterGraph graph = mIncomingCallFilterGraphProvider.createGraph(incomingCall,
                this::onCallFilteringComplete, mContext, mTimeoutsAdapter, mLock);
        DirectToVoicemailFilter voicemailFilter = new DirectToVoicemailFilter(incomingCall,
                mCallerInfoLookupHelper);
+5 −1
Original line number Diff line number Diff line
@@ -45,6 +45,9 @@ import com.android.server.telecom.bluetooth.BluetoothDeviceManager;
import com.android.server.telecom.bluetooth.BluetoothRouteManager;
import com.android.server.telecom.bluetooth.BluetoothStateReceiver;
import com.android.server.telecom.callfiltering.BlockedNumbersAdapter;
import com.android.server.telecom.callfiltering.CallFilterResultCallback;
import com.android.server.telecom.callfiltering.IncomingCallFilterGraph;
import com.android.server.telecom.callfiltering.IncomingCallFilterGraphProvider;
import com.android.server.telecom.components.UserCallIntentProcessor;
import com.android.server.telecom.components.UserCallIntentProcessorFactory;
import com.android.server.telecom.flags.FeatureFlags;
@@ -409,7 +412,8 @@ public class TelecomSystem {
                    emergencyCallDiagnosticLogger,
                    communicationDeviceTracker,
                    callStreamingNotification,
                    featureFlags);
                    featureFlags,
                    IncomingCallFilterGraph::new);

            mIncomingCallNotifier = incomingCallNotifier;
            incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
+44 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.telecom.callfiltering;

import android.content.Context;

import com.android.server.telecom.Call;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;

/**
 * Interface to provide a {@link IncomingCallFilterGraph}. This class serve for unit test purpose
 * to mock an incoming call filter graph in test code.
 */
public interface IncomingCallFilterGraphProvider {


    /**
     * Provide a {@link  IncomingCallFilterGraph}
     * @param call The call for the filters.
     * @param listener Callback object to trigger when filtering is done.
     * @param context An android context.
     * @param timeoutsAdapter Adapter to provide timeout value for call filtering.
     * @param lock Telecom lock.
     * @return
     */
    IncomingCallFilterGraph createGraph(Call call, CallFilterResultCallback listener,
            Context context,
            Timeouts.Adapter timeoutsAdapter, TelecomSystem.SyncRoot lock);
}
Loading