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

Commit 41aa3fa1 authored by Tyler Gunn's avatar Tyler Gunn Committed by android-build-merger
Browse files

Merge "Add nuisance call reporting API to Telecom."

am: d6471064

Change-Id: I73211b3de4d06db13cf19c540965839f1404ffce
parents aa36e0d7 d6471064
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -41285,6 +41285,15 @@ package android.telecom {
    method public abstract void onScreenCall(@NonNull android.telecom.Call.Details);
    method public final void provideCallIdentification(@NonNull android.telecom.Call.Details, @NonNull android.telecom.CallIdentification);
    method public final void respondToCall(@NonNull android.telecom.Call.Details, @NonNull android.telecom.CallScreeningService.CallResponse);
    field public static final String ACTION_NUISANCE_CALL_STATUS_CHANGED = "android.telecom.action.NUISANCE_CALL_STATUS_CHANGED";
    field public static final int CALL_DURATION_LONG = 4; // 0x4
    field public static final int CALL_DURATION_MEDIUM = 3; // 0x3
    field public static final int CALL_DURATION_SHORT = 2; // 0x2
    field public static final int CALL_DURATION_VERY_SHORT = 1; // 0x1
    field public static final String EXTRA_CALL_DURATION = "android.telecom.extra.CALL_DURATION";
    field public static final String EXTRA_CALL_HANDLE = "android.telecom.extra.CALL_HANDLE";
    field public static final String EXTRA_CALL_TYPE = "android.telecom.extra.CALL_TYPE";
    field public static final String EXTRA_IS_NUISANCE = "android.telecom.extra.IS_NUISANCE";
    field public static final String SERVICE_INTERFACE = "android.telecom.CallScreeningService";
  }
@@ -41890,6 +41899,7 @@ package android.telecom {
    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, String);
    method @RequiresPermission(anyOf={android.Manifest.permission.CALL_PHONE, android.Manifest.permission.MANAGE_OWN_CALLS}) public void placeCall(android.net.Uri, android.os.Bundle);
    method public void registerPhoneAccount(android.telecom.PhoneAccount);
    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public void reportNuisanceCallStatus(@NonNull android.net.Uri, boolean);
    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public void showInCallScreen(boolean);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void silenceRinger();
    method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
+1 −0
Original line number Diff line number Diff line
@@ -481,6 +481,7 @@
    <protected-broadcast android:name="android.security.action.TRUST_STORE_CHANGED" />
    <protected-broadcast android:name="android.security.action.KEYCHAIN_CHANGED" />
    <protected-broadcast android:name="android.security.action.KEY_ACCESS_CHANGED" />
    <protected-broadcast android:name="android.telecom.action.NUISANCE_CALL_STATUS_CHANGED" />
    <protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_REGISTERED" />
    <protected-broadcast android:name="android.telecom.action.PHONE_ACCOUNT_UNREGISTERED" />
    <protected-broadcast android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
+126 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.telecom;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SdkConstant;
import android.app.Service;
@@ -32,6 +33,9 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.telecom.ICallScreeningAdapter;
import com.android.internal.telecom.ICallScreeningService;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * This service can be implemented by the default dialer (see
 * {@link TelecomManager#getDefaultDialerPackage()}) or a third party app to allow or disallow
@@ -88,6 +92,128 @@ import com.android.internal.telecom.ICallScreeningService;
 * </pre>
 */
public abstract class CallScreeningService extends Service {

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(
            prefix = { "CALL_DURATION_" },
            value = {CALL_DURATION_VERY_SHORT, CALL_DURATION_SHORT, CALL_DURATION_MEDIUM,
                    CALL_DURATION_LONG})
    public @interface CallDuration {}

    /**
     * Call duration reported with {@link #EXTRA_CALL_DURATION} to indicate to the
     * {@link CallScreeningService} the duration of a call for which the user reported the nuisance
     * status (see {@link TelecomManager#reportNuisanceCallStatus(Uri, boolean)}).  The
     * {@link CallScreeningService} can use this as a signal for training nuisance detection
     * algorithms.  The call duration is reported in coarse grained buckets to minimize exposure of
     * identifying call log information to the {@link CallScreeningService}.
     * <p>
     * Indicates the call was < 3 seconds in duration.
     */
    public static final int CALL_DURATION_VERY_SHORT = 1;

    /**
     * Call duration reported with {@link #EXTRA_CALL_DURATION} to indicate to the
     * {@link CallScreeningService} the duration of a call for which the user reported the nuisance
     * status (see {@link TelecomManager#reportNuisanceCallStatus(Uri, boolean)}).  The
     * {@link CallScreeningService} can use this as a signal for training nuisance detection
     * algorithms.  The call duration is reported in coarse grained buckets to minimize exposure of
     * identifying call log information to the {@link CallScreeningService}.
     * <p>
     * Indicates the call was greater than 3 seconds, but less than 60 seconds in duration.
     */
    public static final int CALL_DURATION_SHORT = 2;

    /**
     * Call duration reported with {@link #EXTRA_CALL_DURATION} to indicate to the
     * {@link CallScreeningService} the duration of a call for which the user reported the nuisance
     * status (see {@link TelecomManager#reportNuisanceCallStatus(Uri, boolean)}).  The
     * {@link CallScreeningService} can use this as a signal for training nuisance detection
     * algorithms.  The call duration is reported in coarse grained buckets to minimize exposure of
     * identifying call log information to the {@link CallScreeningService}.
     * <p>
     * Indicates the call was greater than 60 seconds, but less than 120 seconds in duration.
     */
    public static final int CALL_DURATION_MEDIUM = 3;

    /**
     * Call duration reported with {@link #EXTRA_CALL_DURATION} to indicate to the
     * {@link CallScreeningService} the duration of a call for which the user reported the nuisance
     * status (see {@link TelecomManager#reportNuisanceCallStatus(Uri, boolean)}).  The
     * {@link CallScreeningService} can use this as a signal for training nuisance detection
     * algorithms.  The call duration is reported in coarse grained buckets to minimize exposure of
     * identifying call log information to the {@link CallScreeningService}.
     * <p>
     * Indicates the call was greater than 120 seconds.
     */
    public static final int CALL_DURATION_LONG = 4;

    /**
     * Telecom sends this intent to the {@link CallScreeningService} which the user has chosen to
     * fill the call screening role when the user indicates through the default dialer whether a
     * call is a nuisance call or not (see
     * {@link TelecomManager#reportNuisanceCallStatus(Uri, boolean)}).
     * <p>
     * The following extra values are provided for the call:
     * <ol>
     *     <li>{@link #EXTRA_CALL_HANDLE} - the handle of the call.</li>
     *     <li>{@link #EXTRA_IS_NUISANCE} - {@code true} if the user reported the call as a nuisance
     *     call, {@code false} otherwise.</li>
     *     <li>{@link #EXTRA_CALL_TYPE} - reports the type of call (incoming, rejected, missed,
     *     blocked).</li>
     *     <li>{@link #EXTRA_CALL_DURATION} - the duration of the call (see
     *     {@link #EXTRA_CALL_DURATION} for valid values).</li>
     * </ol>
     * <p>
     * {@link CallScreeningService} implementations which want to track whether the user reports
     * calls are nuisance calls should use declare a broadcast receiver in their manifest for this
     * intent.
     * <p>
     * Note: Only {@link CallScreeningService} implementations which have provided
     * {@link CallIdentification} information for calls at some point will receive this intent.
     */
    public static final String ACTION_NUISANCE_CALL_STATUS_CHANGED =
            "android.telecom.action.NUISANCE_CALL_STATUS_CHANGED";

    /**
     * Extra used to provide the handle of the call for
     * {@link #ACTION_NUISANCE_CALL_STATUS_CHANGED}.  The call handle is reported as a
     * {@link Uri}.
     */
    public static final String EXTRA_CALL_HANDLE = "android.telecom.extra.CALL_HANDLE";

    /**
     * Boolean extra used to indicate whether the user reported a call as a nuisance call.
     * When {@code true}, the user reported that a call was a nuisance call, {@code false}
     * otherwise.  Sent with {@link #ACTION_NUISANCE_CALL_STATUS_CHANGED}.
     */
    public static final String EXTRA_IS_NUISANCE = "android.telecom.extra.IS_NUISANCE";

    /**
     * Integer extra used with {@link #ACTION_NUISANCE_CALL_STATUS_CHANGED} to report the type of
     * call. Valid values are:
     * <UL>
     *   <li>{@link android.provider.CallLog.Calls#MISSED_TYPE}</li>
     *   <li>{@link android.provider.CallLog.Calls#INCOMING_TYPE}</li>
     *   <li>{@link android.provider.CallLog.Calls#BLOCKED_TYPE}</li>
     *   <li>{@link android.provider.CallLog.Calls#REJECTED_TYPE}</li>
     * </UL>
     */
    public static final String EXTRA_CALL_TYPE = "android.telecom.extra.CALL_TYPE";

    /**
     * Integer extra used to with {@link #ACTION_NUISANCE_CALL_STATUS_CHANGED} to report how long
     * the call lasted.  Valid values are:
     * <UL>
     *     <LI>{@link #CALL_DURATION_VERY_SHORT}</LI>
     *     <LI>{@link #CALL_DURATION_SHORT}</LI>
     *     <LI>{@link #CALL_DURATION_MEDIUM}</LI>
     *     <LI>{@link #CALL_DURATION_LONG}</LI>
     * </UL>
     */
    public static final String EXTRA_CALL_DURATION = "android.telecom.extra.CALL_DURATION";

    /**
     * The {@link Intent} that must be declared as handled by the service.
     */
+27 −0
Original line number Diff line number Diff line
@@ -1975,6 +1975,33 @@ public class TelecomManager {
        return false;
    }

    /**
     * Called by the default dialer to report to Telecom when the user has marked a previous
     * incoming call as a nuisance call or not.
     * <p>
     * Where the user has chosen a {@link CallScreeningService} to fill the call screening role,
     * Telecom will notify that {@link CallScreeningService} of the user's report.
     * <p>
     * Requires that the caller is the default dialer app.
     *
     * @param handle The phone number of an incoming call which the user is reporting as either a
     *               nuisance of non-nuisance call.
     * @param isNuisanceCall {@code true} if the user is reporting the call as a nuisance call,
     *                       {@code false} if the user is reporting the call as a non-nuisance call.
     */
    @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
    public void reportNuisanceCallStatus(@NonNull Uri handle, boolean isNuisanceCall) {
        ITelecomService service = getTelecomService();
        if (service != null) {
            try {
                service.reportNuisanceCallStatus(handle, isNuisanceCall,
                        mContext.getOpPackageName());
            } catch (RemoteException e) {
                Log.e(TAG, "Error calling ITelecomService#showCallScreen", e);
            }
        }
    }

    /**
     * Handles {@link Intent#ACTION_CALL} intents trampolined from UserCallActivity.
     * @param intent The {@link Intent#ACTION_CALL} intent to handle.
+3 −0
Original line number Diff line number Diff line
@@ -285,6 +285,8 @@ interface ITelecomService {
     */
    boolean isInEmergencyCall();

    oneway void reportNuisanceCallStatus(in Uri address, boolean isNuisance, String callingPackage);

    /**
     * @see TelecomServiceImpl#handleCallIntent
     */
@@ -299,4 +301,5 @@ interface ITelecomService {
    void addOrRemoveTestCallCompanionApp(String packageName, boolean isAdded);

    void setTestAutoModeApp(String packageName);

}