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

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

Add call screening service binding rule for outgoing call.

Unbind the call screening service after it screening the call.

Test: CTS
Bug: 135929421
Change-Id: Ifa767b2d6c2e28feb9a5b8e866cefb34ff9150f1
parent 482556f2
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -57,25 +57,35 @@ public class CallScreeningServiceHelper {
     * from the call screening service to be handled.
     */
    private class CallScreeningAdapter extends ICallScreeningAdapter.Stub {
        private ServiceConnection mServiceConnection;

        public CallScreeningAdapter(ServiceConnection connection) {
            mServiceConnection = connection;
        }

        @Override
        public void allowCall(String s) throws RemoteException {
            // no-op; we don't allow this on outgoing calls.
            unbindCallScreeningService();
        }

        @Override
        public void silenceCall(String s) throws RemoteException {
            // no-op; we don't allow this on outgoing calls.
            unbindCallScreeningService();
        }

        @Override
        public void screenCallFurther(String callId) throws RemoteException {
            // no-op; we don't allow this on outgoing calls.
            unbindCallScreeningService();
        }

        @Override
        public void disallowCall(String s, boolean b, boolean b1, boolean b2,
                ComponentName componentName) throws RemoteException {
            // no-op; we don't allow this on outgoing calls.
            unbindCallScreeningService();
        }

        private void unbindCallScreeningService() {
            mContext.unbindService(mServiceConnection);
        }
    }

@@ -128,7 +138,7 @@ public class CallScreeningServiceHelper {
                try {
                    try {
                        // Note: for outgoing calls, never include the restricted extras.
                        screeningService.screenCall(new CallScreeningAdapter(),
                        screeningService.screenCall(new CallScreeningAdapter(this),
                                mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall,
                                        false /* areRestrictedExtrasIncluded */));
                    } catch (RemoteException e) {
+11 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.telecom;

import android.Manifest;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.KeyguardManager;
@@ -1581,8 +1582,16 @@ public class CallsManager extends Call.ListenerBase
                                isInContacts);

                        // We only want to provide a CallScreeningService with a call if its not in
                        // contacts.
                        if (!isInContacts) {
                        // contacts or the package has READ_CONTACT permission.
                        PackageManager packageManager = mContext.getPackageManager();
                        int permission = packageManager.checkPermission(
                                Manifest.permission.READ_CONTACTS,
                                mRoleManagerAdapter.getDefaultCallScreeningApp());
                        Log.d(CallsManager.this,
                                "default call screening service package %s has permissions=%s",
                                mRoleManagerAdapter.getDefaultCallScreeningApp(),
                                permission == PackageManager.PERMISSION_GRANTED);
                        if ((!isInContacts) || (permission == PackageManager.PERMISSION_GRANTED)) {
                            bindForOutgoingCallerId(theCall);
                        }
            }, new LoggedHandlerExecutor(outgoingCallHandler, "CM.pCSB", mLock));