diff --git a/Android.bp b/Android.bp index 54b6619db25eb..aac95cc59b4ed 100644 --- a/Android.bp +++ b/Android.bp @@ -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", diff --git a/api/system-current.txt b/api/system-current.txt index 15d0941519aa9..3c41bac3d645c 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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 { diff --git a/core/java/android/attention/AttentionManagerInternal.java b/core/java/android/attention/AttentionManagerInternal.java new file mode 100644 index 0000000000000..6b7f10e8d4260 --- /dev/null +++ b/core/java/android/attention/AttentionManagerInternal.java @@ -0,0 +1,73 @@ +/* + * 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); + } +} diff --git a/core/java/android/service/attention/AttentionService.java b/core/java/android/service/attention/AttentionService.java new file mode 100644 index 0000000000000..f6e448dc4757c --- /dev/null +++ b/core/java/android/service/attention/AttentionService.java @@ -0,0 +1,160 @@ +/* + * 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. + * + *
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}. + * + *
+ * {@literal
+ *
+ * }
+ *
+ *
+ * @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();
+ }
+ }
+ }
+}
diff --git a/core/java/android/service/attention/IAttentionCallback.aidl b/core/java/android/service/attention/IAttentionCallback.aidl
new file mode 100644
index 0000000000000..0e8a1e75c14b4
--- /dev/null
+++ b/core/java/android/service/attention/IAttentionCallback.aidl
@@ -0,0 +1,27 @@
+ /*
+ * 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);
+}
diff --git a/core/java/android/service/attention/IAttentionService.aidl b/core/java/android/service/attention/IAttentionService.aidl
new file mode 100644
index 0000000000000..c3b6f48a5b2e0
--- /dev/null
+++ b/core/java/android/service/attention/IAttentionService.aidl
@@ -0,0 +1,29 @@
+/*
+ * 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.service.attention.IAttentionCallback;
+
+/**
+ * Interface for a concrete implementation to provide to the AttentionManagerService.
+ *
+ * @hide
+ */
+oneway interface IAttentionService {
+ void checkAttention(int requestCode, IAttentionCallback callback);
+ void cancelAttentionCheck(int requestCode);
+}
\ No newline at end of file
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f3e32414ee263..248c57bedbde5 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -3056,6 +3056,15 @@