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

Commit ed111738 authored by Yifei Zhang's avatar Yifei Zhang Committed by Android (Google) Code Review
Browse files

Merge changes I353bcc3a,I7016caa8,I4b6dc1ff into main

* changes:
  contexthub: add missing pieces of HubEndpointInfo
  contexthub: add findEndpoints(String) for service discovery
  contexthub: create HubServiceInfo and associated with EndpointSession
parents 569f1530 1f53e1e9
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -5242,12 +5242,15 @@ package android.hardware.contexthub {
  @FlaggedApi("android.chre.flags.offload_api") public class HubDiscoveryInfo {
    method @NonNull public android.hardware.contexthub.HubEndpointInfo getHubEndpointInfo();
    method @Nullable public android.hardware.contexthub.HubServiceInfo getHubServiceInfo();
  }
  @FlaggedApi("android.chre.flags.offload_api") public class HubEndpoint {
    method @Nullable public android.hardware.contexthub.IHubEndpointLifecycleCallback getLifecycleCallback();
    method @Nullable public android.hardware.contexthub.IHubEndpointMessageCallback getMessageCallback();
    method @NonNull public java.util.Collection<android.hardware.contexthub.HubServiceInfo> getServiceInfoCollection();
    method @Nullable public String getTag();
    method public int getVersion();
  }
  public static final class HubEndpoint.Builder {
@@ -5257,6 +5260,7 @@ package android.hardware.contexthub {
    method @NonNull public android.hardware.contexthub.HubEndpoint.Builder setLifecycleCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.contexthub.IHubEndpointLifecycleCallback);
    method @NonNull public android.hardware.contexthub.HubEndpoint.Builder setMessageCallback(@NonNull android.hardware.contexthub.IHubEndpointMessageCallback);
    method @NonNull public android.hardware.contexthub.HubEndpoint.Builder setMessageCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.contexthub.IHubEndpointMessageCallback);
    method @NonNull public android.hardware.contexthub.HubEndpoint.Builder setServiceInfoCollection(@NonNull java.util.Collection<android.hardware.contexthub.HubServiceInfo>);
    method @NonNull public android.hardware.contexthub.HubEndpoint.Builder setTag(@NonNull String);
  }
@@ -5264,9 +5268,18 @@ package android.hardware.contexthub {
    method public int describeContents();
    method @NonNull public android.hardware.contexthub.HubEndpointInfo.HubEndpointIdentifier getIdentifier();
    method @NonNull public String getName();
    method @NonNull public java.util.Collection<java.lang.String> getRequiredPermissions();
    method @NonNull public java.util.Collection<android.hardware.contexthub.HubServiceInfo> getServiceInfoCollection();
    method @Nullable public String getTag();
    method public int getType();
    method public int getVersion();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.contexthub.HubEndpointInfo> CREATOR;
    field public static final int TYPE_APP = 2; // 0x2
    field public static final int TYPE_FRAMEWORK = 1; // 0x1
    field public static final int TYPE_HUB_ENDPOINT = 5; // 0x5
    field public static final int TYPE_NANOAPP = 4; // 0x4
    field public static final int TYPE_NATIVE = 3; // 0x3
  }
  public static class HubEndpointInfo.HubEndpointIdentifier {
@@ -5276,6 +5289,7 @@ package android.hardware.contexthub {
  @FlaggedApi("android.chre.flags.offload_api") public class HubEndpointSession implements java.lang.AutoCloseable {
    method public void close();
    method @Nullable public android.hardware.contexthub.HubServiceInfo getServiceInfo();
    method @NonNull public android.hardware.location.ContextHubTransaction<java.lang.Void> sendMessage(@NonNull android.hardware.contexthub.HubMessage);
  }
@@ -5302,9 +5316,30 @@ package android.hardware.contexthub {
    method @NonNull public android.hardware.contexthub.HubMessage.DeliveryParams setResponseRequired(boolean);
  }
  @FlaggedApi("android.chre.flags.offload_api") public final class HubServiceInfo implements android.os.Parcelable {
    ctor public HubServiceInfo(@NonNull String, int, int, int, @NonNull android.os.ParcelableHolder);
    method public int describeContents();
    method @NonNull public android.os.ParcelableHolder getExtendedInfo();
    method public int getFormat();
    method public int getMajorVersion();
    method public int getMinorVersion();
    method @NonNull public String getServiceDescriptor();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.contexthub.HubServiceInfo> CREATOR;
    field public static final int FORMAT_AIDL = 1; // 0x1
    field public static final int FORMAT_CUSTOM = 0; // 0x0
    field public static final int FORMAT_PW_RPC_PROTOBUF = 2; // 0x2
  }
  public static final class HubServiceInfo.Builder {
    ctor public HubServiceInfo.Builder(@NonNull String, int, int, int);
    method @NonNull public android.hardware.contexthub.HubServiceInfo build();
    method @NonNull public android.hardware.contexthub.HubServiceInfo.Builder setExtendedInfo(@Nullable android.os.Parcelable);
  }
  @FlaggedApi("android.chre.flags.offload_api") public interface IHubEndpointLifecycleCallback {
    method public void onSessionClosed(@NonNull android.hardware.contexthub.HubEndpointSession, int);
    method @NonNull public android.hardware.contexthub.HubEndpointSessionResult onSessionOpenRequest(@NonNull android.hardware.contexthub.HubEndpointInfo);
    method @NonNull public android.hardware.contexthub.HubEndpointSessionResult onSessionOpenRequest(@NonNull android.hardware.contexthub.HubEndpointInfo, @Nullable android.hardware.contexthub.HubServiceInfo);
    method public void onSessionOpened(@NonNull android.hardware.contexthub.HubEndpointSession);
    field public static final int REASON_CLOSE_ENDPOINT_SESSION_REQUESTED = 4; // 0x4
    field public static final int REASON_OPEN_ENDPOINT_SESSION_REQUEST_REJECTED = 3; // 0x3
@@ -6310,6 +6345,7 @@ package android.hardware.location {
    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubTransaction<java.lang.Void> disableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubTransaction<java.lang.Void> enableNanoApp(@NonNull android.hardware.location.ContextHubInfo, long);
    method @FlaggedApi("android.chre.flags.offload_api") @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public java.util.List<android.hardware.contexthub.HubDiscoveryInfo> findEndpoints(long);
    method @FlaggedApi("android.chre.flags.offload_api") @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public java.util.List<android.hardware.contexthub.HubDiscoveryInfo> findEndpoints(@NonNull String);
    method @Deprecated @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public int[] findNanoAppOnHub(int, @NonNull android.hardware.location.NanoAppFilter);
    method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public int[] getContextHubHandles();
    method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubInfo getContextHubInfo(int);
@@ -6318,6 +6354,7 @@ package android.hardware.location {
    method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public int loadNanoApp(int, @NonNull android.hardware.location.NanoApp);
    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubTransaction<java.lang.Void> loadNanoApp(@NonNull android.hardware.location.ContextHubInfo, @NonNull android.hardware.location.NanoAppBinary);
    method @FlaggedApi("android.chre.flags.offload_api") @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public void openSession(@NonNull android.hardware.contexthub.HubEndpoint, @NonNull android.hardware.contexthub.HubEndpointInfo);
    method @FlaggedApi("android.chre.flags.offload_api") @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public void openSession(@NonNull android.hardware.contexthub.HubEndpoint, @NonNull android.hardware.contexthub.HubEndpointInfo, @NonNull android.hardware.contexthub.HubServiceInfo);
    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubTransaction<java.util.List<android.hardware.location.NanoAppState>> queryNanoApps(@NonNull android.hardware.location.ContextHubInfo);
    method @Deprecated public int registerCallback(@NonNull android.hardware.location.ContextHubManager.Callback);
    method @Deprecated public int registerCallback(android.hardware.location.ContextHubManager.Callback, android.os.Handler);
+30 −13
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.hardware.contexthub;

import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.chre.flags.Flags;
import android.hardware.location.ContextHubManager;
@@ -26,31 +27,47 @@ import android.hardware.location.ContextHubManager;
 * Class that represents the result of from an hub endpoint discovery.
 *
 * <p>The type is returned from an endpoint discovery query via {@link
 * ContextHubManager#findEndpoints}. Application may use the values {@link #getHubEndpointInfo} to
 * retrieve the {@link HubEndpointInfo} that describes the endpoint that matches the query. The
 * class provides flexibility in returning more information (e.g. service provided by the endpoint)
 * in addition to the information about the endpoint.
 * ContextHubManager#findEndpoints}.
 *
 * <p>Application may use the values {@link #getHubEndpointInfo} to retrieve the {@link
 * HubEndpointInfo} that describes the endpoint that matches the query.
 *
 * <p>Application may use the values {@link #getHubServiceInfo()} to retrieve the {@link
 * HubServiceInfo} that describes the service that matches the query.
 *
 * @hide
 */
@SystemApi
@FlaggedApi(Flags.FLAG_OFFLOAD_API)
public class HubDiscoveryInfo {
    // TODO(b/375487784): Add ServiceInfo to the result.
    android.hardware.contexthub.HubEndpointInfo mEndpointInfo;
    @NonNull private final HubEndpointInfo mEndpointInfo;
    @Nullable private final HubServiceInfo mServiceInfo;

    /**
     * Constructor for internal use.
     *
     * @hide
     */
    public HubDiscoveryInfo(android.hardware.contexthub.HubEndpointInfo endpointInfo) {
    /** @hide */
    public HubDiscoveryInfo(@NonNull HubEndpointInfo endpointInfo) {
        mEndpointInfo = endpointInfo;
        mServiceInfo = null;
    }

    /** Get the {@link android.hardware.contexthub.HubEndpointInfo} for the endpoint found. */
    /** @hide */
    public HubDiscoveryInfo(
            @NonNull HubEndpointInfo endpointInfo, @NonNull HubServiceInfo serviceInfo) {
        mEndpointInfo = endpointInfo;
        mServiceInfo = serviceInfo;
    }

    /** Get the {@link HubEndpointInfo} for the endpoint found. */
    @NonNull
    public HubEndpointInfo getHubEndpointInfo() {
        return mEndpointInfo;
    }

    /**
     * Get the {@link HubServiceInfo} for the endpoint found. The value will be null if there is no
     * service info specified in the query.
     */
    @Nullable
    public HubServiceInfo getHubServiceInfo() {
        return mServiceInfo;
    }
}
+62 −10
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@ import android.util.SparseArray;

import androidx.annotation.GuardedBy;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Executor;

/**
@@ -57,7 +61,10 @@ public class HubEndpoint {
    private final IContextHubEndpointCallback mServiceCallback =
            new IContextHubEndpointCallback.Stub() {
                @Override
                public void onSessionOpenRequest(int sessionId, HubEndpointInfo initiator)
                public void onSessionOpenRequest(
                        int sessionId,
                        HubEndpointInfo initiator,
                        @Nullable HubServiceInfo serviceInfo)
                        throws RemoteException {
                    HubEndpointSession activeSession;
                    synchronized (mLock) {
@@ -78,20 +85,24 @@ public class HubEndpoint {
                                        processSessionOpenRequestResult(
                                                sessionId,
                                                initiator,
                                                serviceInfo,
                                                mLifecycleCallback.onSessionOpenRequest(
                                                        initiator)));
                                                        initiator, serviceInfo)));
                    }
                }

                private void processSessionOpenRequestResult(
                        int sessionId, HubEndpointInfo initiator, HubEndpointSessionResult result) {
                        int sessionId,
                        HubEndpointInfo initiator,
                        @Nullable HubServiceInfo serviceInfo,
                        HubEndpointSessionResult result) {
                    if (result == null) {
                        throw new IllegalArgumentException(
                                "HubEndpointSessionResult shouldn't be null.");
                    }

                    if (result.isAccepted()) {
                        acceptSession(sessionId, initiator);
                        acceptSession(sessionId, initiator, serviceInfo);
                    } else {
                        Log.i(
                                TAG,
@@ -105,7 +116,10 @@ public class HubEndpoint {
                    }
                }

                private void acceptSession(int sessionId, HubEndpointInfo initiator) {
                private void acceptSession(
                        int sessionId,
                        HubEndpointInfo initiator,
                        @Nullable HubServiceInfo serviceInfo) {
                    if (mServiceToken == null || mAssignedHubEndpointInfo == null) {
                        // No longer registered?
                        return;
@@ -129,7 +143,8 @@ public class HubEndpoint {
                                        sessionId,
                                        HubEndpoint.this,
                                        mAssignedHubEndpointInfo,
                                        initiator);
                                        initiator,
                                        serviceInfo);
                        try {
                            // oneway call to notify system service that the request is completed
                            mServiceToken.openSessionRequestComplete(sessionId);
@@ -331,7 +346,7 @@ public class HubEndpoint {
    }

    /** @hide */
    public void openSession(HubEndpointInfo destinationInfo) {
    public void openSession(HubEndpointInfo destinationInfo, @Nullable HubServiceInfo serviceInfo) {
        // TODO(b/378974199): Consider refactor these assertions
        if (mServiceToken == null || mAssignedHubEndpointInfo == null) {
            // No longer registered?
@@ -341,7 +356,7 @@ public class HubEndpoint {
        HubEndpointSession newSession;
        try {
            // Request system service to assign session id.
            int sessionId = mServiceToken.openSession(destinationInfo);
            int sessionId = mServiceToken.openSession(destinationInfo, serviceInfo);

            // Save the newly created session
            synchronized (mLock) {
@@ -350,7 +365,8 @@ public class HubEndpoint {
                                sessionId,
                                HubEndpoint.this,
                                destinationInfo,
                                mAssignedHubEndpointInfo);
                                mAssignedHubEndpointInfo,
                                serviceInfo);
                mActiveSessions.put(sessionId, newSession);
            }
        } catch (RemoteException e) {
@@ -407,11 +423,20 @@ public class HubEndpoint {
        }
    }

    public int getVersion() {
        return mPendingHubEndpointInfo.getVersion();
    }

    @Nullable
    public String getTag() {
        return mPendingHubEndpointInfo.getTag();
    }

    @NonNull
    public Collection<HubServiceInfo> getServiceInfoCollection() {
        return mPendingHubEndpointInfo.getServiceInfoCollection();
    }

    @Nullable
    public IHubEndpointLifecycleCallback getLifecycleCallback() {
        return mLifecycleCallback;
@@ -433,15 +458,30 @@ public class HubEndpoint {
        @Nullable private IHubEndpointMessageCallback mMessageCallback;
        @NonNull private Executor mMessageCallbackExecutor;

        private int mVersion;
        @Nullable private String mTag;

        private List<HubServiceInfo> mServiceInfos = Collections.emptyList();

        /** Create a builder for {@link HubEndpoint} */
        public Builder(@NonNull Context context) {
            mPackageName = context.getPackageName();
            mVersion = (int) context.getApplicationInfo().longVersionCode;
            mLifecycleCallbackExecutor = context.getMainExecutor();
            mMessageCallbackExecutor = context.getMainExecutor();
        }

        /**
         * Set the version for the endpoint. Default is 0.
         *
         * @hide
         */
        @NonNull
        public Builder setVersion(int version) {
            mVersion = version;
            return this;
        }

        /**
         * Set a tag string. The tag can be used to further identify the creator of the endpoint.
         * Endpoints created by the same package share the same name but should have different tags.
@@ -493,11 +533,23 @@ public class HubEndpoint {
            return this;
        }

        /**
         * Add a service to the available services from this endpoint. The {@link HubServiceInfo}
         * object can be built with {@link HubServiceInfo.Builder}.
         */
        @NonNull
        public Builder setServiceInfoCollection(
                @NonNull Collection<HubServiceInfo> hubServiceInfos) {
            // Make a copy first
            mServiceInfos = new ArrayList<>(hubServiceInfos);
            return this;
        }

        /** Build the {@link HubEndpoint} object. */
        @NonNull
        public HubEndpoint build() {
            return new HubEndpoint(
                    new HubEndpointInfo(mPackageName, mTag),
                    new HubEndpointInfo(mPackageName, mVersion, mTag, mServiceInfos),
                    mLifecycleCallback,
                    mLifecycleCallbackExecutor,
                    mMessageCallback,
+139 −5

File changed.

Preview size limit exceeded, changes collapsed.

+20 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.hardware.contexthub;

import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.chre.flags.Flags;
import android.hardware.location.ContextHubTransaction;
@@ -42,6 +43,7 @@ public class HubEndpointSession implements AutoCloseable {
    @NonNull private final HubEndpoint mHubEndpoint;
    @NonNull private final HubEndpointInfo mInitiator;
    @NonNull private final HubEndpointInfo mDestination;
    @Nullable private final HubServiceInfo mServiceInfo;

    private final AtomicBoolean mIsClosed = new AtomicBoolean(true);

@@ -50,11 +52,13 @@ public class HubEndpointSession implements AutoCloseable {
            int id,
            @NonNull HubEndpoint hubEndpoint,
            @NonNull HubEndpointInfo destination,
            @NonNull HubEndpointInfo initiator) {
            @NonNull HubEndpointInfo initiator,
            @Nullable HubServiceInfo serviceInfo) {
        mId = id;
        mHubEndpoint = hubEndpoint;
        mDestination = destination;
        mInitiator = initiator;
        mServiceInfo = serviceInfo;
    }

    /**
@@ -123,6 +127,21 @@ public class HubEndpointSession implements AutoCloseable {
        }
    }

    /**
     * Get the {@link HubServiceInfo} associated with this session. Null value indicates that there
     * is no service associated to this session.
     *
     * <p>For hub initiated sessions, the object was previously used in as an argument for open
     * request in {@link IHubEndpointLifecycleCallback#onSessionOpenRequest}.
     *
     * <p>For app initiated sessions, the object was previously used in an open request in {@link
     * android.hardware.location.ContextHubManager#openSession}
     */
    @Nullable
    public HubServiceInfo getServiceInfo() {
        return mServiceInfo;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
Loading