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

Commit 4f6a9944 authored by Sandeep Bandaru's avatar Sandeep Bandaru
Browse files

Make InferenceInfo and getLatestInferenceInfo SystemApis.

Flag: android.app.ondeviceintelligence.flags.enable_on_device_intelligence_module
Test: added CTS in topic
Bug: 372658837
Change-Id: If27a3886fd7ebe7079ed174225cda6b2426e1050
parent 09ba9519
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -2324,6 +2324,24 @@ package android.app.ondeviceintelligence {
    field public static final int FEATURE_STATUS_UNAVAILABLE = 0; // 0x0
  }
  @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence_module") public final class InferenceInfo implements android.os.Parcelable {
    method public int describeContents();
    method public long getEndTimeMillis();
    method public long getStartTimeMillis();
    method public long getSuspendedTimeMillis();
    method public int getUid();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.ondeviceintelligence.InferenceInfo> CREATOR;
  }
  public static final class InferenceInfo.Builder {
    ctor public InferenceInfo.Builder(int);
    method @NonNull public android.app.ondeviceintelligence.InferenceInfo build();
    method @NonNull public android.app.ondeviceintelligence.InferenceInfo.Builder setEndTimeMillis(long);
    method @NonNull public android.app.ondeviceintelligence.InferenceInfo.Builder setStartTimeMillis(long);
    method @NonNull public android.app.ondeviceintelligence.InferenceInfo.Builder setSuspendedTimeMillis(long);
  }
  @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence") public class OnDeviceIntelligenceException extends java.lang.Exception {
    ctor public OnDeviceIntelligenceException(int, @NonNull String, @NonNull android.os.PersistableBundle);
    ctor public OnDeviceIntelligenceException(int, @NonNull android.os.PersistableBundle);
@@ -2353,6 +2371,7 @@ package android.app.ondeviceintelligence {
  @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence") public final class OnDeviceIntelligenceManager {
    method @RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) public void getFeature(int, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.app.ondeviceintelligence.Feature,android.app.ondeviceintelligence.OnDeviceIntelligenceException>);
    method @RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) public void getFeatureDetails(@NonNull android.app.ondeviceintelligence.Feature, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.app.ondeviceintelligence.FeatureDetails,android.app.ondeviceintelligence.OnDeviceIntelligenceException>);
    method @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence_module") @NonNull @RequiresPermission(android.Manifest.permission.DUMP) public java.util.List<android.app.ondeviceintelligence.InferenceInfo> getLatestInferenceInfo(long);
    method @Nullable @RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) public String getRemoteServicePackageName();
    method @RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) public void getVersion(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.LongConsumer);
    method @RequiresPermission(android.Manifest.permission.USE_ON_DEVICE_INTELLIGENCE) public void listFeatures(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.util.List<android.app.ondeviceintelligence.Feature>,android.app.ondeviceintelligence.OnDeviceIntelligenceException>);
+28 −19
Original line number Diff line number Diff line
@@ -16,6 +16,12 @@

package android.app.ondeviceintelligence;

import static android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE;

import android.annotation.CurrentTimeMillisLong;
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;

@@ -25,7 +31,9 @@ import android.os.Parcelable;
 *
 * @hide
 */
public class InferenceInfo implements Parcelable {
@SystemApi
@FlaggedApi(FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE)
public final class InferenceInfo implements Parcelable {

    /**
     * Uid for the caller app.
@@ -55,7 +63,7 @@ public class InferenceInfo implements Parcelable {
     * @param endTimeMs       Inference end time (milliseconds from the epoch time).
     * @param suspendedTimeMs Suspended time in milliseconds.
     */
    public InferenceInfo(int uid, long startTimeMs, long endTimeMs,
    InferenceInfo(int uid, long startTimeMs, long endTimeMs,
            long suspendedTimeMs) {
        this.uid = uid;
        this.startTimeMs = startTimeMs;
@@ -68,7 +76,7 @@ public class InferenceInfo implements Parcelable {
     *
     * @param in The Parcel to read the object's data from.
     */
    protected InferenceInfo(Parcel in) {
    private InferenceInfo(@NonNull Parcel in) {
        uid = in.readInt();
        startTimeMs = in.readLong();
        endTimeMs = in.readLong();
@@ -83,7 +91,7 @@ public class InferenceInfo implements Parcelable {
     * @param flags Additional flags about how the object should be written.
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(uid);
        dest.writeLong(startTimeMs);
        dest.writeLong(endTimeMs);
@@ -104,7 +112,8 @@ public class InferenceInfo implements Parcelable {
     *
     * @return the inference start time in milliseconds from the epoch time.
     */
    public long getStartTimeMs() {
    @CurrentTimeMillisLong
    public long getStartTimeMillis() {
        return startTimeMs;
    }

@@ -113,7 +122,8 @@ public class InferenceInfo implements Parcelable {
     *
     * @return the inference end time in milliseconds from the epoch time.
     */
    public long getEndTimeMs() {
    @CurrentTimeMillisLong
    public long getEndTimeMillis() {
        return endTimeMs;
    }

@@ -122,7 +132,8 @@ public class InferenceInfo implements Parcelable {
     *
     * @return the suspended time in milliseconds.
     */
    public long getSuspendedTimeMs() {
    @CurrentTimeMillisLong
    public long getSuspendedTimeMillis() {
        return suspendedTimeMs;
    }

@@ -148,21 +159,19 @@ public class InferenceInfo implements Parcelable {
    /**
     * Builder class for creating instances of {@link InferenceInfo}.
     */
    public static class Builder {
        private int uid;
    public static final class Builder {
        private final int uid;
        private long startTimeMs;
        private long endTimeMs;
        private long suspendedTimeMs;

        /**
         * Sets the UID for the caller app.
         * Provides a builder instance to create a InferenceInfo for given caller uid.
         *
         * @param uid the UID for the caller app.
         * @return the Builder instance.
         * @param uid the caller uid associated with the inference info.
         */
        public Builder setUid(int uid) {
        public Builder(int uid) {
            this.uid = uid;
            return this;
        }

        /**
@@ -171,7 +180,7 @@ public class InferenceInfo implements Parcelable {
         * @param startTimeMs the inference start time in milliseconds from the epoch time.
         * @return the Builder instance.
         */
        public Builder setStartTimeMs(long startTimeMs) {
        public @NonNull Builder setStartTimeMillis(@CurrentTimeMillisLong long startTimeMs) {
            this.startTimeMs = startTimeMs;
            return this;
        }
@@ -182,7 +191,7 @@ public class InferenceInfo implements Parcelable {
         * @param endTimeMs the inference end time in milliseconds from the epoch time.
         * @return the Builder instance.
         */
        public Builder setEndTimeMs(long endTimeMs) {
        public @NonNull Builder setEndTimeMillis(@CurrentTimeMillisLong long endTimeMs) {
            this.endTimeMs = endTimeMs;
            return this;
        }
@@ -193,7 +202,7 @@ public class InferenceInfo implements Parcelable {
         * @param suspendedTimeMs the suspended time in milliseconds.
         * @return the Builder instance.
         */
        public Builder setSuspendedTimeMs(long suspendedTimeMs) {
        public @NonNull Builder setSuspendedTimeMillis(@CurrentTimeMillisLong long suspendedTimeMs) {
            this.suspendedTimeMs = suspendedTimeMs;
            return this;
        }
@@ -203,7 +212,7 @@ public class InferenceInfo implements Parcelable {
         *
         * @return an instance of {@link InferenceInfo}.
         */
        public InferenceInfo build() {
        public @NonNull InferenceInfo build() {
            return new InferenceInfo(uid, startTimeMs, endTimeMs,
                    suspendedTimeMs);
        }
+4 −3
Original line number Diff line number Diff line
@@ -17,9 +17,11 @@
package android.app.ondeviceintelligence;

import static android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE;
import static android.app.ondeviceintelligence.flags.Flags.FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE;

import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.CurrentTimeMillisLong;
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -502,11 +504,10 @@ public final class OnDeviceIntelligenceManager {
     *
     * @param startTimeEpochMillis epoch millis used to filter the InferenceInfo events.
     * @return InferenceInfo events since the passed in startTimeEpochMillis.
     *
     * @hide
     */
    @RequiresPermission(Manifest.permission.DUMP)
    public List<InferenceInfo> getLatestInferenceInfo(long startTimeEpochMillis) {
    @FlaggedApi(FLAG_ENABLE_ON_DEVICE_INTELLIGENCE_MODULE)
    public @NonNull List<InferenceInfo> getLatestInferenceInfo(@CurrentTimeMillisLong long startTimeEpochMillis) {
        try {
            return mService.getLatestInferenceInfo(startTimeEpochMillis);
        } catch (RemoteException e) {
+6 −6
Original line number Diff line number Diff line
@@ -20,8 +20,8 @@ import android.app.ondeviceintelligence.InferenceInfo;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService;
import android.util.Slog;
import android.util.Base64;
import android.util.Slog;

import java.io.IOException;
import java.util.Comparator;
@@ -36,12 +36,12 @@ public class InferenceInfoStore {
    public InferenceInfoStore(long maxAgeMs) {
        this.maxAgeMs = maxAgeMs;
        this.inferenceInfos = new TreeSet<>(
                Comparator.comparingLong(InferenceInfo::getStartTimeMs));
                Comparator.comparingLong(InferenceInfo::getStartTimeMillis));
    }

    public List<InferenceInfo> getLatestInferenceInfo(long startTimeEpochMillis) {
        return inferenceInfos.stream().filter(
                info -> info.getStartTimeMs() > startTimeEpochMillis).toList();
                info -> info.getStartTimeMillis() > startTimeEpochMillis).toList();
    }

    public void addInferenceInfoFromBundle(PersistableBundle pb) {
@@ -85,7 +85,7 @@ public class InferenceInfoStore {

    private synchronized void add(com.android.server.ondeviceintelligence.nano.InferenceInfo info) {
        while (!inferenceInfos.isEmpty()
                && System.currentTimeMillis() - inferenceInfos.first().getStartTimeMs()
                && System.currentTimeMillis() - inferenceInfos.first().getStartTimeMillis()
                > maxAgeMs) {
            inferenceInfos.pollFirst();
        }
@@ -94,8 +94,8 @@ public class InferenceInfoStore {

    private static InferenceInfo toInferenceInfo(
            com.android.server.ondeviceintelligence.nano.InferenceInfo info) {
        return new InferenceInfo.Builder().setUid(info.uid).setStartTimeMs(
                info.startTimeMs).setEndTimeMs(info.endTimeMs).setSuspendedTimeMs(
        return new InferenceInfo.Builder(info.uid).setStartTimeMillis(
                info.startTimeMs).setEndTimeMillis(info.endTimeMs).setSuspendedTimeMillis(
                info.suspendedTimeMs).build();
    }
}
 No newline at end of file
+7 −8
Original line number Diff line number Diff line
@@ -18,10 +18,10 @@ package com.android.server.ondeviceintelligence;

import static com.google.common.truth.Truth.assertThat;

import android.app.ondeviceintelligence.InferenceInfo;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService;
import android.app.ondeviceintelligence.InferenceInfo;
import android.util.Base64;

import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -32,7 +32,6 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.util.List;

@RunWith(AndroidJUnit4.class)
@@ -53,8 +52,8 @@ public class InferenceInfoStoreTest {
        List<InferenceInfo> inferenceInfos = inferenceInfoStore.getLatestInferenceInfo(0);
        assertThat(inferenceInfos).hasSize(1);
        assertThat(inferenceInfos.get(0).getUid()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getStartTimeMs()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getEndTimeMs()).isEqualTo(100);
        assertThat(inferenceInfos.get(0).getStartTimeMillis()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getEndTimeMillis()).isEqualTo(100);
    }

    @Test
@@ -66,8 +65,8 @@ public class InferenceInfoStoreTest {
        List<InferenceInfo> inferenceInfos = inferenceInfoStore.getLatestInferenceInfo(0);
        assertThat(inferenceInfos).hasSize(1);
        assertThat(inferenceInfos.get(0).getUid()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getStartTimeMs()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getEndTimeMs()).isEqualTo(100);
        assertThat(inferenceInfos.get(0).getStartTimeMillis()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getEndTimeMillis()).isEqualTo(100);
    }


@@ -87,8 +86,8 @@ public class InferenceInfoStoreTest {
        List<InferenceInfo> inferenceInfos = inferenceInfoStore.getLatestInferenceInfo(0);
        assertThat(inferenceInfos).hasSize(2);
        assertThat(inferenceInfos.get(0).getUid()).isEqualTo(1);
        assertThat(inferenceInfos.get(0).getStartTimeMs()).isEqualTo(testStartTime - 10);
        assertThat(inferenceInfos.get(0).getEndTimeMs()).isEqualTo(testStartTime + 100);
        assertThat(inferenceInfos.get(0).getStartTimeMillis()).isEqualTo(testStartTime - 10);
        assertThat(inferenceInfos.get(0).getEndTimeMillis()).isEqualTo(testStartTime + 100);
        inferenceInfoStore.addInferenceInfoFromBundle(bundle);
        List<InferenceInfo> inferenceInfos2 = inferenceInfoStore.getLatestInferenceInfo(0);
        assertThat(inferenceInfos2).hasSize(1); //previous entries should have been evicted