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

Commit fe332fb4 authored by Grace Jia's avatar Grace Jia
Browse files

Change the logic of incoming call filter graph to avoid binding same

call screening service twice.

Bug: 147356458
Test: atest TelecomUnitTests:CallScreeningServiceFilterTest
Change-Id: I23fba97b84b1102d4d84352fc89d1951a39bc808
parent b32698e5
Loading
Loading
Loading
Loading
+19 −19
Original line number Original line Diff line number Diff line
@@ -45,8 +45,8 @@ import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.ColorDrawable;
import android.media.AudioManager;
import android.media.AudioManager;
import android.media.AudioSystem;
import android.media.AudioSystem;
import android.media.ToneGenerator;
import android.media.MediaPlayer;
import android.media.MediaPlayer;
import android.media.ToneGenerator;
import android.net.Uri;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Bundle;
@@ -66,6 +66,7 @@ import android.provider.CallLog.Calls;
import android.provider.Settings;
import android.provider.Settings;
import android.sysprop.TelephonyProperties;
import android.sysprop.TelephonyProperties;
import android.telecom.CallAudioState;
import android.telecom.CallAudioState;
import android.telecom.CallerInfo;
import android.telecom.Conference;
import android.telecom.Conference;
import android.telecom.Connection;
import android.telecom.Connection;
import android.telecom.DisconnectCause;
import android.telecom.DisconnectCause;
@@ -85,14 +86,12 @@ import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Pair;
import android.util.Pair;

import com.android.internal.annotations.VisibleForTesting;
import android.telecom.CallerInfo;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Button;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.telecom.bluetooth.BluetoothRouteManager;
import com.android.server.telecom.bluetooth.BluetoothRouteManager;
import com.android.server.telecom.bluetooth.BluetoothStateReceiver;
import com.android.server.telecom.bluetooth.BluetoothStateReceiver;
@@ -101,10 +100,10 @@ import com.android.server.telecom.callfiltering.BlockCheckerFilter;
import com.android.server.telecom.callfiltering.CallFilterResultCallback;
import com.android.server.telecom.callfiltering.CallFilterResultCallback;
import com.android.server.telecom.callfiltering.CallFilteringResult;
import com.android.server.telecom.callfiltering.CallFilteringResult;
import com.android.server.telecom.callfiltering.CallFilteringResult.Builder;
import com.android.server.telecom.callfiltering.CallFilteringResult.Builder;
import com.android.server.telecom.callfiltering.CallScreeningServiceFilter;
import com.android.server.telecom.callfiltering.DirectToVoicemailFilter;
import com.android.server.telecom.callfiltering.DirectToVoicemailFilter;
import com.android.server.telecom.callfiltering.IncomingCallFilter;
import com.android.server.telecom.callfiltering.IncomingCallFilter;
import com.android.server.telecom.callfiltering.IncomingCallFilterGraph;
import com.android.server.telecom.callfiltering.IncomingCallFilterGraph;
import com.android.server.telecom.callfiltering.CallScreeningServiceFilter;
import com.android.server.telecom.callredirection.CallRedirectionProcessor;
import com.android.server.telecom.callredirection.CallRedirectionProcessor;
import com.android.server.telecom.components.ErrorDialogActivity;
import com.android.server.telecom.components.ErrorDialogActivity;
import com.android.server.telecom.components.TelecomBroadcastReceiver;
import com.android.server.telecom.components.TelecomBroadcastReceiver;
@@ -116,8 +115,8 @@ import com.android.server.telecom.ui.DisconnectedCallNotifier;
import com.android.server.telecom.ui.IncomingCallNotifier;
import com.android.server.telecom.ui.IncomingCallNotifier;
import com.android.server.telecom.ui.ToastFactory;
import com.android.server.telecom.ui.ToastFactory;


import java.util.Arrays;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collection;
import java.util.Collections;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashMap;
@@ -696,25 +695,26 @@ public class CallsManager extends Call.ListenerBase
                new CallScreeningServiceFilter(incomingCall, carrierPackageName,
                new CallScreeningServiceFilter(incomingCall, carrierPackageName,
                        CallScreeningServiceFilter.PACKAGE_TYPE_CARRIER, mContext, this,
                        CallScreeningServiceFilter.PACKAGE_TYPE_CARRIER, mContext, this,
                        appLabelProxy, converter);
                        appLabelProxy, converter);
        CallScreeningServiceFilter defaultDialerCallScreeningServiceFilter =
        CallScreeningServiceFilter callScreeningServiceFilter;
                new CallScreeningServiceFilter(incomingCall, defaultDialerPackageName,
        if ((userChosenPackageName != null)
                        CallScreeningServiceFilter.PACKAGE_TYPE_DEFAULT_DIALER, mContext, this,
                && (!userChosenPackageName.equals(defaultDialerPackageName))) {
                        appLabelProxy, converter);
            callScreeningServiceFilter = new CallScreeningServiceFilter(incomingCall,
        CallScreeningServiceFilter userChosenCallScreeningServiceFilter =
                    userChosenPackageName, CallScreeningServiceFilter.PACKAGE_TYPE_USER_CHOSEN,
                new CallScreeningServiceFilter(incomingCall, userChosenPackageName,
                    mContext, this, appLabelProxy, converter);
                        CallScreeningServiceFilter.PACKAGE_TYPE_USER_CHOSEN, mContext, this,
        } else {
                        appLabelProxy, converter);
            callScreeningServiceFilter = new CallScreeningServiceFilter(incomingCall,
                    defaultDialerPackageName,
                    CallScreeningServiceFilter.PACKAGE_TYPE_DEFAULT_DIALER,
                    mContext, this, appLabelProxy, converter);
        }
        graph.addFilter(voicemailFilter);
        graph.addFilter(voicemailFilter);
        graph.addFilter(blockCheckerFilter);
        graph.addFilter(blockCheckerFilter);
        graph.addFilter(carrierCallScreeningServiceFilter);
        graph.addFilter(carrierCallScreeningServiceFilter);
        graph.addFilter(defaultDialerCallScreeningServiceFilter);
        graph.addFilter(callScreeningServiceFilter);
        graph.addFilter(userChosenCallScreeningServiceFilter);
        IncomingCallFilterGraph.addEdge(voicemailFilter, carrierCallScreeningServiceFilter);
        IncomingCallFilterGraph.addEdge(voicemailFilter, carrierCallScreeningServiceFilter);
        IncomingCallFilterGraph.addEdge(blockCheckerFilter, carrierCallScreeningServiceFilter);
        IncomingCallFilterGraph.addEdge(blockCheckerFilter, carrierCallScreeningServiceFilter);
        IncomingCallFilterGraph.addEdge(carrierCallScreeningServiceFilter,
        IncomingCallFilterGraph.addEdge(carrierCallScreeningServiceFilter,
                defaultDialerCallScreeningServiceFilter);
                callScreeningServiceFilter);
        IncomingCallFilterGraph.addEdge(carrierCallScreeningServiceFilter,
                userChosenCallScreeningServiceFilter);
        mGraphHandlerThreads.add(graph.getHandlerThread());
        mGraphHandlerThreads.add(graph.getHandlerThread());
        return graph;
        return graph;
    }
    }
+9 −3
Original line number Original line Diff line number Diff line
@@ -176,7 +176,6 @@ public class CallScreeningServiceFilter extends CallFilter {
        public void onServiceConnected(ComponentName componentName, IBinder service) {
        public void onServiceConnected(ComponentName componentName, IBinder service) {
            ICallScreeningService callScreeningService =
            ICallScreeningService callScreeningService =
                    ICallScreeningService.Stub.asInterface(service);
                    ICallScreeningService.Stub.asInterface(service);

            try {
            try {
                callScreeningService.screenCall(new CallScreeningAdapter(mResultFuture),
                callScreeningService.screenCall(new CallScreeningAdapter(mResultFuture),
                        mParcelableCallUtilsConverter.
                        mParcelableCallUtilsConverter.
@@ -204,6 +203,7 @@ public class CallScreeningServiceFilter extends CallFilter {
        public void onNullBinding(ComponentName name) {
        public void onNullBinding(ComponentName name) {
            mResultFuture.complete(mPriorStageResult);
            mResultFuture.complete(mPriorStageResult);
            Log.i(this, "Null binding.");
            Log.i(this, "Null binding.");
            unbindCallScreeningService();
        }
        }
    }
    }


@@ -251,6 +251,11 @@ public class CallScreeningServiceFilter extends CallFilter {
        return resultFuture;
        return resultFuture;
    }
    }


    @Override
    public String toString() {
        return super.toString() + ": " + mPackageName;
    }

    private boolean hasReadContactsPermission() {
    private boolean hasReadContactsPermission() {
        int permission = PackageManager.PERMISSION_DENIED;
        int permission = PackageManager.PERMISSION_DENIED;
        if (mPackagetype == PACKAGE_TYPE_CARRIER || mPackagetype == PACKAGE_TYPE_DEFAULT_DIALER) {
        if (mPackagetype == PACKAGE_TYPE_CARRIER || mPackagetype == PACKAGE_TYPE_DEFAULT_DIALER) {
@@ -272,7 +277,7 @@ public class CallScreeningServiceFilter extends CallFilter {
        }
        }
    }
    }


    private void unbindCallScreeningService() {
    public void unbindCallScreeningService() {
        if (mConnection != null) {
        if (mConnection != null) {
            mContext.unbindService(mConnection);
            mContext.unbindService(mConnection);
        }
        }
@@ -283,7 +288,8 @@ public class CallScreeningServiceFilter extends CallFilter {
        if (mPackagetype != PACKAGE_TYPE_DEFAULT_DIALER) {
        if (mPackagetype != PACKAGE_TYPE_DEFAULT_DIALER) {
            return false;
            return false;
        } else {
        } else {
            return mPackageName.equals(TelecomManager.from(mContext).getSystemDialerPackage());
            return mPackageName.equals(
                    TelecomManager.from(mContext).getSystemDialerPackage());
        }
        }
    }
    }


+6 −0
Original line number Original line Diff line number Diff line
@@ -126,6 +126,12 @@ public class IncomingCallFilterGraph {
                    mFinished = true;
                    mFinished = true;
                    mHandlerThread.quit();
                    mHandlerThread.quit();
                }
                }
                for (CallFilter filter : mFiltersList) {
                    // unbind timed out call screening service
                    if (filter instanceof CallScreeningServiceFilter) {
                        ((CallScreeningServiceFilter) filter).unbindCallScreeningService();
                    }
                }
            }
            }
        }.prepare(), mTimeoutsAdapter.getCallScreeningTimeoutMillis(mContext.getContentResolver()));
        }.prepare(), mTimeoutsAdapter.getCallScreeningTimeoutMillis(mContext.getContentResolver()));
    }
    }
+1 −2
Original line number Original line Diff line number Diff line
@@ -111,8 +111,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
        when(mCallsManager.getCurrentUserHandle()).thenReturn(UserHandle.CURRENT);
        when(mCallsManager.getCurrentUserHandle()).thenReturn(UserHandle.CURRENT);
        when(mCall.getId()).thenReturn(CALL_ID);
        when(mCall.getId()).thenReturn(CALL_ID);
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
        when(mContext.getPackageManager()).thenReturn(mPackageManager);
        when(mAppLabelProxy.getAppLabel(eq(PKG_NAME)))
        when(mAppLabelProxy.getAppLabel(PKG_NAME)).thenReturn(APP_NAME);
                .thenReturn(APP_NAME);
        when(mParcelableCallUtilsConverter.toParcelableCall(
        when(mParcelableCallUtilsConverter.toParcelableCall(
                eq(mCall), anyBoolean(), eq(mPhoneAccountRegistrar))).thenReturn(null);
                eq(mCall), anyBoolean(), eq(mPhoneAccountRegistrar))).thenReturn(null);
        when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class),
        when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class),