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

Commit 61ae7ed2 authored by Alex Salo's avatar Alex Salo Committed by Android (Google) Code Review
Browse files

Merge "Add skeleton implementation for Attention API"

parents 612e6386 b81472f7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -358,6 +358,8 @@ java_defaults {
        "core/java/android/service/textclassifier/ITextLanguageCallback.aidl",
        "core/java/android/service/textclassifier/ITextLinksCallback.aidl",
        "core/java/android/service/textclassifier/ITextSelectionCallback.aidl",
        "core/java/android/service/attention/IAttentionService.aidl",
        "core/java/android/service/attention/IAttentionCallback.aidl",
        "core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl",
        "core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl",
        "core/java/android/view/accessibility/IAccessibilityManager.aidl",
+23 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android {
    field public static final java.lang.String ALLOW_ANY_CODEC_FOR_PLAYBACK = "android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK";
    field public static final java.lang.String AMBIENT_WALLPAPER = "android.permission.AMBIENT_WALLPAPER";
    field public static final java.lang.String BACKUP = "android.permission.BACKUP";
    field public static final java.lang.String BIND_ATTENTION_SERVICE = "android.permission.BIND_ATTENTION_SERVICE";
    field public static final java.lang.String BIND_AUGMENTED_AUTOFILL_SERVICE = "android.permission.BIND_AUGMENTED_AUTOFILL_SERVICE";
    field public static final deprecated java.lang.String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE";
    field public static final java.lang.String BIND_CONTENT_CAPTURE_SERVICE = "android.permission.BIND_CONTENT_CAPTURE_SERVICE";
@@ -5491,6 +5492,28 @@ package android.service.appprediction {
}
package android.service.attention {
  public abstract class AttentionService extends android.app.Service {
    ctor public AttentionService();
    method public final android.os.IBinder onBind(android.content.Intent);
    method public abstract void onCancelAttentionCheck(int);
    method public abstract void onCheckAttention(int, android.service.attention.AttentionService.AttentionCallback);
    field public static final int ATTENTION_FAILURE_PREEMPTED = 2; // 0x2
    field public static final int ATTENTION_FAILURE_TIMED_OUT = 3; // 0x3
    field public static final int ATTENTION_FAILURE_UNKNOWN = 4; // 0x4
    field public static final int ATTENTION_SUCCESS_ABSENT = 0; // 0x0
    field public static final int ATTENTION_SUCCESS_PRESENT = 1; // 0x1
    field public static final java.lang.String SERVICE_INTERFACE = "android.service.attention.AttentionService";
  }
  public static final class AttentionService.AttentionCallback {
    method public void onFailure(int, int);
    method public void onSuccess(int, int, long);
  }
}
package android.service.autofill {
  public abstract class AutofillFieldClassificationService extends android.app.Service {
+73 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.attention;

/**
 * Attention manager local system server interface.
 *
 * @hide Only for use within the system server.
 */
public abstract class AttentionManagerInternal {
    /**
     * Returns {@code true} if attention service is supported on this device.
     */
    public abstract boolean isAttentionServiceSupported();

    /**
     * Checks whether user attention is at the screen and calls in the provided callback.
     *
     * @param requestCode   a code associated with the attention check request; this code would be
     *                      used to call back in {@link AttentionCallbackInternal#onSuccess} and
     *                      {@link AttentionCallbackInternal#onFailure}
     * @param timeoutMillis a budget for the attention check; if it takes longer - {@link
     *                      AttentionCallbackInternal#onFailure} would be called with the {@link
     *                      android.service.attention.AttentionService#ATTENTION_FAILURE_TIMED_OUT}
     *                      code
     * @param callback      a callback for when the attention check has completed
     * @return {@code true} if the attention check should succeed; {@false} otherwise.
     */
    public abstract boolean checkAttention(int requestCode,
            long timeoutMillis, AttentionCallbackInternal callback);

    /**
     * Cancels the specified attention check in case it's no longer needed.
     *
     * @param requestCode a code provided during {@link #checkAttention}
     */
    public abstract void cancelAttentionCheck(int requestCode);

    /** Internal interface for attention callback. */
    public abstract static class AttentionCallbackInternal {
        /**
         * Provides the result of the attention check, if the check was successful.
         *
         * @param requestCode a code provided in {@link #checkAttention}
         * @param result      an int with the result of the check
         * @param timestamp   a {@code SystemClock.uptimeMillis()} timestamp associated with the
         *                    attention check
         */
        public abstract void onSuccess(int requestCode, int result, long timestamp);

        /**
         * Provides the explanation for why the attention check had failed.
         *
         * @param requestCode a code provided in {@link #checkAttention}
         * @param error       an int with the reason for failure
         */
        public abstract void onFailure(int requestCode, int error);
    }
}
+160 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.attention;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

import com.android.internal.util.Preconditions;

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


/**
 * Abstract base class for Attention service.
 *
 * <p> An attention service provides attention estimation related features to the system.
 * The system's default AttentionService implementation is configured in
 * {@code config_AttentionComponent}. If this config has no value, a stub is returned.
 *
 * See: {@link AttentionManagerService}.
 *
 * <pre>
 * {@literal
 * <service android:name=".YourAttentionService"
 *          android:permission="android.permission.BIND_ATTENTION_SERVICE">
 * </service>}
 * </pre>
 *
 * @hide
 */
@SystemApi
public abstract class AttentionService extends Service {
    /**
     * The {@link Intent} that must be declared as handled by the service. To be supported, the
     * service must also require the {@link android.Manifest.permission#BIND_ATTENTION_SERVICE}
     * permission so that other applications can not abuse it.
     */
    public static final String SERVICE_INTERFACE =
            "android.service.attention.AttentionService";

    /** Attention is absent. */
    public static final int ATTENTION_SUCCESS_ABSENT = 0;

    /** Attention is present. */
    public static final int ATTENTION_SUCCESS_PRESENT = 1;

    /** Preempted by other camera user. */
    public static final int ATTENTION_FAILURE_PREEMPTED = 2;

    /** Preempted by other camera user. */
    public static final int ATTENTION_FAILURE_TIMED_OUT = 3;

    /** Unknown reasons for failing to determine the attention. */
    public static final int ATTENTION_FAILURE_UNKNOWN = 4;

    /**
     * Result codes for when attention check was successful.
     *
     * @hide
     */
    @IntDef(prefix = {"ATTENTION_SUCCESS_"}, value = {ATTENTION_SUCCESS_ABSENT,
            ATTENTION_SUCCESS_PRESENT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AttentionSuccessCodes {
    }

    /**
     * Result codes explaining why attention check was not successful.
     *
     * @hide
     */
    @IntDef(prefix = {"ATTENTION_FAILURE_"}, value = {ATTENTION_FAILURE_PREEMPTED,
            ATTENTION_FAILURE_TIMED_OUT, ATTENTION_FAILURE_UNKNOWN})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AttentionFailureCodes {
    }

    private final IAttentionService.Stub mBinder = new IAttentionService.Stub() {

        /** {@inheritDoc} */
        @Override
        public void checkAttention(int requestCode, IAttentionCallback callback) {
            Preconditions.checkNotNull(callback);
            AttentionService.this.onCheckAttention(requestCode, new AttentionCallback(callback));
        }

        /** {@inheritDoc} */
        @Override
        public void cancelAttentionCheck(int requestCode) {
            AttentionService.this.onCancelAttentionCheck(requestCode);
        }
    };

    @Override
    public final IBinder onBind(Intent intent) {
        if (SERVICE_INTERFACE.equals(intent.getAction())) {
            return mBinder;
        }
        return null;
    }

    /**
     * Checks the user attention and calls into the provided callback.
     *
     * @param requestCode an identifier that could be used to cancel the request
     * @param callback    the callback to return the result to
     */
    public abstract void onCheckAttention(int requestCode, @NonNull AttentionCallback callback);

    /** Cancels the attention check for a given request code. */
    public abstract void onCancelAttentionCheck(int requestCode);


    /** Callbacks for AttentionService results. */
    public static final class AttentionCallback {
        private final IAttentionCallback mCallback;

        private AttentionCallback(IAttentionCallback callback) {
            mCallback = callback;
        }

        /** Returns the result. */
        public void onSuccess(int requestCode, @AttentionSuccessCodes int result, long timestamp) {
            try {
                mCallback.onSuccess(requestCode, result, timestamp);
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
        }

        /** Signals a failure. */
        public void onFailure(int requestCode, @AttentionFailureCodes int error) {
            try {
                mCallback.onFailure(requestCode, error);
            } catch (RemoteException e) {
                e.rethrowFromSystemServer();
            }
        }
    }
}
+27 −0
Original line number Diff line number Diff line
 /*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.service.attention;

/**
 * Callback for onCheckAttention request.
 *
 * @hide
 */
oneway interface IAttentionCallback {
    void onSuccess(int requestCode, int result, long timestamp);
    void onFailure(int requestCode, int error);
}
Loading