11bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal/*
21bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * Copyright (C) 2016 The Android Open Source Project
31bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *
41bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * Licensed under the Apache License, Version 2.0 (the "License");
51bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * you may not use this file except in compliance with the License.
61bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * You may obtain a copy of the License at
71bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *
81bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *      http://www.apache.org/licenses/LICENSE-2.0
91bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *
101bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * Unless required by applicable law or agreed to in writing, software
111bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * distributed under the License is distributed on an "AS IS" BASIS,
121bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * See the License for the specific language governing permissions and
141bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * limitations under the License
151bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal */
161bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
171bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalpackage android.telecom;
181bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
191bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.annotation.SdkConstant;
201bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.app.Service;
211bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.content.Intent;
221bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.os.Handler;
231bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.os.IBinder;
241bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.os.Looper;
251bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.os.Message;
261bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport android.os.RemoteException;
271bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
281bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport com.android.internal.os.SomeArgs;
291bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport com.android.internal.telecom.ICallScreeningService;
301bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalimport com.android.internal.telecom.ICallScreeningAdapter;
311bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
321bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal/**
331bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * This service can be implemented by the default dialer (see
341bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * {@link TelecomManager#getDefaultDialerPackage()}) to allow or disallow incoming calls before
351bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * they are shown to a user.
361bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * <p>
371bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * Below is an example manifest registration for a {@code CallScreeningService}.
381bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * <pre>
391bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * {@code
401bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * <service android:name="your.package.YourCallScreeningServiceImplementation"
411bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *          android:permission="android.permission.BIND_SCREENING_SERVICE">
421bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *      <intent-filter>
431bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *          <action android:name="android.telecom.CallScreeningService"/>
441bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal *      </intent-filter>
451bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * </service>
461bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * }
471bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal * </pre>
481bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal */
491bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepalpublic abstract class CallScreeningService extends Service {
501bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    /**
511bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * The {@link Intent} that must be declared as handled by the service.
521bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     */
531bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION)
541bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    public static final String SERVICE_INTERFACE = "android.telecom.CallScreeningService";
551bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
561bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    private static final int MSG_SCREEN_CALL = 1;
571bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
581bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    private final Handler mHandler = new Handler(Looper.getMainLooper()) {
591bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        @Override
601bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        public void handleMessage(Message msg) {
611bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            switch (msg.what) {
621bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                case MSG_SCREEN_CALL:
631bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                    SomeArgs args = (SomeArgs) msg.obj;
641bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                    try {
651bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        mCallScreeningAdapter = (ICallScreeningAdapter) args.arg1;
661bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        onScreenCall(
671bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                                Call.Details.createFromParcelableCall((ParcelableCall) args.arg2));
681bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                    } finally {
691bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        args.recycle();
701bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                    }
711bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                    break;
721bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
731bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
741bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    };
751bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
761bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    private final class CallScreeningBinder extends ICallScreeningService.Stub {
771bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        @Override
781bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        public void screenCall(ICallScreeningAdapter adapter, ParcelableCall call) {
791bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            Log.v(this, "screenCall");
801bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            SomeArgs args = SomeArgs.obtain();
811bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            args.arg1 = adapter;
821bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            args.arg2 = call;
831bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            mHandler.obtainMessage(MSG_SCREEN_CALL, args).sendToTarget();
841bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
851bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    }
861bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
871bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    private ICallScreeningAdapter mCallScreeningAdapter;
881bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
891bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    /*
901bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * Information about how to respond to an incoming call.
911bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     */
92f44607142f2793773fb240d73ff0cfc2aba1165bSailesh Nepal    public static class CallResponse {
931bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        private final boolean mShouldDisallowCall;
941bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        private final boolean mShouldRejectCall;
951bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        private final boolean mShouldSkipCallLog;
961bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        private final boolean mShouldSkipNotification;
971bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
981bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        private CallResponse(
991bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                boolean shouldDisallowCall,
1001bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                boolean shouldRejectCall,
1011bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                boolean shouldSkipCallLog,
1021bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                boolean shouldSkipNotification) {
1031bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            if (!shouldDisallowCall
1041bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                    && (shouldRejectCall || shouldSkipCallLog || shouldSkipNotification)) {
1051bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                throw new IllegalStateException("Invalid response state for allowed call.");
1061bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
1071bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1081bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            mShouldDisallowCall = shouldDisallowCall;
1091bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            mShouldRejectCall = shouldRejectCall;
1101bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            mShouldSkipCallLog = shouldSkipCallLog;
1111bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            mShouldSkipNotification = shouldSkipNotification;
1121bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
1131bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1141bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        /*
1151bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         * @return Whether the incoming call should be blocked.
1161bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         */
1171bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        public boolean getDisallowCall() {
1181bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            return mShouldDisallowCall;
1191bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
1201bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1211bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        /*
1221bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         * @return Whether the incoming call should be disconnected as if the user had manually
1231bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         * rejected it.
1241bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         */
1251bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        public boolean getRejectCall() {
1261bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            return mShouldRejectCall;
1271bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
1281bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1291bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        /*
1301bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         * @return Whether the incoming call should not be displayed in the call log.
1311bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         */
1321bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        public boolean getSkipCallLog() {
1331bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            return mShouldSkipCallLog;
1341bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
1351bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1361bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        /*
1371bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         * @return Whether a missed call notification should not be shown for the incoming call.
1381bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal         */
1391bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        public boolean getSkipNotification() {
1401bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            return mShouldSkipNotification;
1411bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
1421bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
143f44607142f2793773fb240d73ff0cfc2aba1165bSailesh Nepal        public static class Builder {
1441bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            private boolean mShouldDisallowCall;
1451bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            private boolean mShouldRejectCall;
1461bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            private boolean mShouldSkipCallLog;
1471bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            private boolean mShouldSkipNotification;
1481bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1491bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            /*
1501bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * Sets whether the incoming call should be blocked.
1511bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             */
1521bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            public Builder setDisallowCall(boolean shouldDisallowCall) {
1531bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                mShouldDisallowCall = shouldDisallowCall;
1541bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                return this;
1551bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
1561bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1571bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            /*
1581bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * Sets whether the incoming call should be disconnected as if the user had manually
1591bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * rejected it. This property should only be set to true if the call is disallowed.
1601bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             */
1611bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            public Builder setRejectCall(boolean shouldRejectCall) {
1621bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                mShouldRejectCall = shouldRejectCall;
1631bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                return this;
1641bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
1651bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1661bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            /*
1671bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * Sets whether the incoming call should not be displayed in the call log. This property
1681bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * should only be set to true if the call is disallowed.
1691bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             */
1701bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            public Builder setSkipCallLog(boolean shouldSkipCallLog) {
1711bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                mShouldSkipCallLog = shouldSkipCallLog;
1721bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                return this;
1731bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
1741bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1751bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            /*
1761bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * Sets whether a missed call notification should not be shown for the incoming call.
1771bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             * This property should only be set to true if the call is disallowed.
1781bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal             */
1791bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            public Builder setSkipNotification(boolean shouldSkipNotification) {
1801bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                mShouldSkipNotification = shouldSkipNotification;
1811bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                return this;
1821bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
1831bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1841bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            public CallResponse build() {
1851bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                return new CallResponse(
1861bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        mShouldDisallowCall,
1871bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        mShouldRejectCall,
1881bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        mShouldSkipCallLog,
1891bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        mShouldSkipNotification);
1901bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
1911bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal       }
1921bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    }
1931bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1941bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    public CallScreeningService() {
1951bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    }
1961bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
1971bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    @Override
1981bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    public IBinder onBind(Intent intent) {
1991bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        Log.v(this, "onBind");
2001bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        return new CallScreeningBinder();
2011bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    }
2021bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
2031bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    @Override
2041bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    public boolean onUnbind(Intent intent) {
2051bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        Log.v(this, "onUnbind");
2061bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        return false;
2071bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    }
2081bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
2091bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    /**
2101bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * Called when a new incoming call is added.
2111bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * {@link CallScreeningService#respondToCall(Call.Details, CallScreeningService.CallResponse)}
2121bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * should be called to allow or disallow the call.
2131bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     *
2141bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * @param callDetails Information about a new incoming call, see {@link Call.Details}.
2151bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     */
2161bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    public abstract void onScreenCall(Call.Details callDetails);
2171bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal
2181bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    /**
2191bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * Responds to the given call, either allowing it or disallowing it.
2201bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     *
2211bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * @param callDetails The call to allow.
2221bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * @param response The {@link CallScreeningService.CallResponse} which contains information
2231bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     * about how to respond to a call.
2241bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal     */
2251bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    public final void respondToCall(Call.Details callDetails, CallResponse response) {
2261bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        try {
2271bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            if (response.getDisallowCall()) {
2281bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                mCallScreeningAdapter.disallowCall(
2291bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        callDetails.getTelecomCallId(),
2301bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        response.getRejectCall(),
2311bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        !response.getSkipCallLog(),
2321bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                        !response.getSkipNotification());
2331bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            } else {
2341bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal                mCallScreeningAdapter.allowCall(callDetails.getTelecomCallId());
2351bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal            }
2361bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        } catch (RemoteException e) {
2371bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal        }
2381bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal    }
2391bef339b88b3f760603dcc08d79a62647fc18296Sailesh Nepal}
240