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

Commit 973d1994 authored by Thomas Stuart's avatar Thomas Stuart Committed by Android (Google) Code Review
Browse files

Merge "combine completed filters if a timeout occurs" into main

parents c62bf0d2 588f14a9
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