Loading flags/telecom_call_filtering_flags.aconfig +12 −1 Original line number Diff line number Diff line Loading @@ -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 } } src/com/android/server/telecom/CallsManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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, Loading src/com/android/server/telecom/callfiltering/IncomingCallFilterGraph.java +31 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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(); Loading @@ -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) Loading @@ -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; Loading src/com/android/server/telecom/callfiltering/IncomingCallFilterGraphProvider.java +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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); } tests/src/com/android/server/telecom/tests/CallsManagerTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
flags/telecom_call_filtering_flags.aconfig +12 −1 Original line number Diff line number Diff line Loading @@ -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 } }
src/com/android/server/telecom/CallsManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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, Loading
src/com/android/server/telecom/callfiltering/IncomingCallFilterGraph.java +31 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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()); Loading Loading @@ -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(); Loading @@ -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) Loading @@ -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; Loading
src/com/android/server/telecom/callfiltering/IncomingCallFilterGraphProvider.java +5 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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); }
tests/src/com/android/server/telecom/tests/CallsManagerTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -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