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

Commit d8c6f1d8 authored by Yifei Zhang's avatar Yifei Zhang
Browse files

contexthub: create HubServiceInfo and associated with EndpointSession

- Create HubServiceInfo Parcelable that describes a service
- Add @Nullable argument to open session request/callback for
  HubServiceInfo
- Add HubEndpointSession.getServiceInfo -> HubServiceInfo
- Documentation adjustments

Test: build
API-Coverage-Bug: 377554469
Bug: 375487784
Flag: android.chre.flags.offload_api
Change-Id: I4b6dc1ff82fc2f3146a94080a092a30669842972
parent c74b4ff4
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -5225,6 +5225,7 @@ package android.hardware.contexthub {
  @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();
  }
@@ -5235,6 +5236,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);
  }
@@ -5242,6 +5244,7 @@ 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<android.hardware.contexthub.HubServiceInfo> getServiceInfoCollection();
    method @Nullable public String getTag();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.hardware.contexthub.HubEndpointInfo> CREATOR;
@@ -5254,6 +5257,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);
  }
@@ -5280,9 +5284,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
@@ -6295,6 +6320,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);
+45 −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) {
@@ -412,6 +428,11 @@ public class HubEndpoint {
        return mPendingHubEndpointInfo.getTag();
    }

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

    @Nullable
    public IHubEndpointLifecycleCallback getLifecycleCallback() {
        return mLifecycleCallback;
@@ -435,6 +456,8 @@ public class HubEndpoint {

        @Nullable private String mTag;

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

        /** Create a builder for {@link HubEndpoint} */
        public Builder(@NonNull Context context) {
            mPackageName = context.getPackageName();
@@ -493,11 +516,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, mTag, mServiceInfos),
                    mLifecycleCallback,
                    mLifecycleCallbackExecutor,
                    mMessageCallback,
+32 −4
Original line number Diff line number Diff line
@@ -24,6 +24,10 @@ import android.chre.flags.Flags;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
@@ -106,6 +110,8 @@ public final class HubEndpointInfo implements Parcelable {
    private final String mName;
    @Nullable private final String mTag;

    @NonNull private final List<HubServiceInfo> mHubServiceInfos;

    // TODO(b/375487784): Add Service/version and other information to this object

    /** @hide */
@@ -113,28 +119,39 @@ public final class HubEndpointInfo implements Parcelable {
        mId = new HubEndpointIdentifier(endpointInfo.id.hubId, endpointInfo.id.id);
        mName = endpointInfo.name;
        mTag = endpointInfo.tag;
        mHubServiceInfos = new ArrayList<>(endpointInfo.services.length);
        for (int i = 0; i < endpointInfo.services.length; i++) {
            mHubServiceInfos.set(i, new HubServiceInfo(endpointInfo.services[i]));
        }
    }

    /** @hide */
    public HubEndpointInfo(String name, @Nullable String tag) {
    public HubEndpointInfo(
            String name, @Nullable String tag, @NonNull List<HubServiceInfo> hubServiceInfos) {
        mId = HubEndpointIdentifier.invalid();
        mName = name;
        mTag = tag;
        mHubServiceInfos = hubServiceInfos;
    }

    private HubEndpointInfo(Parcel in) {
        long hubId = in.readLong();
        long endpointId = in.readLong();
        mId = new HubEndpointIdentifier(hubId, endpointId);
        mName = in.readString();
        mTag = in.readString();

        mId = new HubEndpointIdentifier(hubId, endpointId);
        mHubServiceInfos = new ArrayList<>();
        in.readTypedList(mHubServiceInfos, HubServiceInfo.CREATOR);
    }

    /** Parcel implementation details */
    @Override
    public int describeContents() {
        return 0;
        int flags = 0;
        for (HubServiceInfo serviceInfo : mHubServiceInfos) {
            flags |= serviceInfo.describeContents();
        }
        return flags;
    }

    /** Parcel implementation details */
@@ -144,6 +161,7 @@ public final class HubEndpointInfo implements Parcelable {
        dest.writeLong(mId.getEndpoint());
        dest.writeString(mName);
        dest.writeString(mTag);
        dest.writeTypedList(mHubServiceInfos, flags);
    }

    /** Get a unique identifier for this endpoint. */
@@ -169,6 +187,16 @@ public final class HubEndpointInfo implements Parcelable {
        return mTag;
    }

    /**
     * Get the list of services provided by this endpoint.
     *
     * <p>See {@link HubServiceInfo} for more information.
     */
    @NonNull
    public Collection<HubServiceInfo> getServiceInfoCollection() {
        return Collections.unmodifiableList(mHubServiceInfos);
    }

    @Override
    public String toString() {
        StringBuilder out = new StringBuilder();
+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();
+22 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024 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.hardware.contexthub;

/**
 * @hide
 */
parcelable HubServiceInfo;
Loading