diff --git a/Android.bp b/Android.bp index c2024084d95d0..38d864923f515 100644 --- a/Android.bp +++ b/Android.bp @@ -357,6 +357,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 276be9dd746d0..bbc4dfad4e987 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"; @@ -5401,6 +5402,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 2f3a4910bf83f..11fc9a455c767 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3045,6 +3045,15 @@ + + + + - + + + +