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

Commit 588f14a9 authored by Thomas Stuart's avatar Thomas Stuart
Browse files

combine completed filters if a timeout occurs

A user reported that they were woken up from an incoming call even
though their DND settings are set to disallow callers.  Upon inspection,
the DND filter was computed and the caller was silenced BUT another
filter timed out causing the final result to allow the caller.

Now, if the DND filter or any other filter is processed and finished
before the timeout, the fitlers will be combined with the final result.

Flag: com.android.server.telecom.flags.check_completed_filters_on_timeout
Bug:   364871465 (root bug)
Fixes: 364946812 (spun off bug)
Test: com.android.server.telecom.tests.IncomingCallFilterGraphTest
                   #testFilterTimesOutWithDndFilterComputedAlready
Change-Id: I88178b4c5b1e76a2c0108092f52bb6d8ec6884b6
parent 7c417153
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -8,3 +8,14 @@ flag {
  description: "Gates whether to still perform Dnd filter when phone account has skip_filter call extra."
  bug: "222333869"
}

# OWNER=tjstuart TARGET=25Q1
flag {
  name: "check_completed_filters_on_timeout"
  namespace: "telecom"
  description: "If the Filtering Graph times out, combine the finished results"
  bug: "364946812"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}
+2 −2
Original line number Diff line number Diff line
@@ -913,7 +913,7 @@ public class CallsManager extends Call.ListenerBase
        DndCallFilter dndCallFilter = new DndCallFilter(incomingHfpCall, mRinger);
        IncomingCallFilterGraph graph = mIncomingCallFilterGraphProvider.createGraph(
                incomingHfpCall,
                this::onCallFilteringComplete, mContext, mTimeoutsAdapter, mLock);
                this::onCallFilteringComplete, mContext, mTimeoutsAdapter, mFeatureFlags, mLock);
        graph.addFilter(dndCallFilter);
        mGraphHandlerThreads.add(graph.getHandlerThread());
        return graph;
@@ -932,7 +932,7 @@ public class CallsManager extends Call.ListenerBase
        ParcelableCallUtils.Converter converter = new ParcelableCallUtils.Converter();

        IncomingCallFilterGraph graph = mIncomingCallFilterGraphProvider.createGraph(incomingCall,
                this::onCallFilteringComplete, mContext, mTimeoutsAdapter, mLock);
                this::onCallFilteringComplete, mContext, mTimeoutsAdapter, mFeatureFlags, mLock);
        DirectToVoicemailFilter voicemailFilter = new DirectToVoicemailFilter(incomingCall,
                mCallerInfoLookupHelper);
        BlockCheckerFilter blockCheckerFilter = new BlockCheckerFilter(mContext, incomingCall,
+31 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.server.telecom.LoggedHandlerExecutor;
import com.android.server.telecom.LogUtils;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
import com.android.server.telecom.flags.FeatureFlags;

import java.util.ArrayList;
import java.util.List;
@@ -55,6 +56,7 @@ public class IncomingCallFilterGraph {
    private CallFilteringResult mCurrentResult;
    private Context mContext;
    private Timeouts.Adapter mTimeoutsAdapter;
    private final FeatureFlags mFeatureFlags;

    private class PostFilterTask {
        private final CallFilter mFilter;
@@ -84,11 +86,12 @@ public class IncomingCallFilterGraph {
    }

    public IncomingCallFilterGraph(Call call, CallFilterResultCallback listener, Context context,
            Timeouts.Adapter timeoutsAdapter, TelecomSystem.SyncRoot lock) {
            Timeouts.Adapter timeoutsAdapter, FeatureFlags featureFlags,
            TelecomSystem.SyncRoot lock) {
        mListener = listener;
        mCall = call;
        mFiltersList = new ArrayList<>();

        mFeatureFlags = featureFlags;
        mHandlerThread = new HandlerThread(TAG);
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
@@ -121,8 +124,8 @@ public class IncomingCallFilterGraph {
            @Override
            public void loggedRun() {
                if (!mFinished) {
                    Log.i(this, "Graph timed out when performing filtering.");
                    Log.addEvent(mCall, LogUtils.Events.FILTERING_TIMED_OUT);
                    mCurrentResult = onTimeoutCombineFinishedFilters(mFiltersList, mCurrentResult);
                    mListener.onCallFilteringComplete(mCall, mCurrentResult, true);
                    mFinished = true;
                    mHandlerThread.quit();
@@ -137,6 +140,28 @@ public class IncomingCallFilterGraph {
        }.prepare(), mTimeoutsAdapter.getCallScreeningTimeoutMillis(mContext.getContentResolver()));
    }

    /**
     * This helper takes all the call filters that were added to the graph, checks if filters have
     * finished, and combines the results.
     *
     * @param filtersList   all the CallFilters that were added to the call
     * @param currentResult the current call filter result
     * @return CallFilterResult of the combined finished Filters.
     */
    private CallFilteringResult onTimeoutCombineFinishedFilters(
            List<CallFilter> filtersList,
            CallFilteringResult currentResult) {
        if (!mFeatureFlags.checkCompletedFiltersOnTimeout()) {
            return currentResult;
        }
        for (CallFilter filter : filtersList) {
            if (filter.result != null) {
                currentResult = currentResult.combine(filter.result);
            }
        }
        return currentResult;
    }

    private void scheduleFilter(CallFilter filter) {
        CallFilteringResult result = new CallFilteringResult.Builder()
                .setShouldAllowCall(true)
@@ -147,6 +172,9 @@ public class IncomingCallFilterGraph {
                .setDndSuppressed(false)
                .build();
        for (CallFilter dependencyFilter : filter.getDependencies()) {
            // When sequential nodes are completed, they are combined progressively.
            // ex.) node_a --> node_b  --> node_c
            // node_a will combine with node_b before starting node_c
            result = result.combine(dependencyFilter.getResult());
        }
        mCurrentResult = result;
+5 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Context;
import com.android.server.telecom.Call;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
import com.android.server.telecom.flags.FeatureFlags;

/**
 * Interface to provide a {@link IncomingCallFilterGraph}. This class serve for unit test purpose
@@ -35,10 +36,13 @@ public interface IncomingCallFilterGraphProvider {
     * @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 featureFlags Telecom flags
     * @param lock Telecom lock.
     * @return
     */
    IncomingCallFilterGraph createGraph(Call call, CallFilterResultCallback listener,
            Context context,
            Timeouts.Adapter timeoutsAdapter, TelecomSystem.SyncRoot lock);
            Timeouts.Adapter timeoutsAdapter,
            FeatureFlags featureFlags,
            TelecomSystem.SyncRoot lock);
}
+2 −1
Original line number Diff line number Diff line
@@ -392,7 +392,8 @@ public class CallsManagerTest extends TelecomTestCase {
                mBluetoothDeviceManager,
                mFeatureFlags,
                mTelephonyFlags,
                (call, listener, context, timeoutsAdapter, lock) -> mIncomingCallFilterGraph);
                (call, listener, context, timeoutsAdapter,
                        mFeatureFlags, lock) -> mIncomingCallFilterGraph);

        when(mPhoneAccountRegistrar.getPhoneAccount(
                eq(SELF_MANAGED_HANDLE), any())).thenReturn(SELF_MANAGED_ACCOUNT);
Loading