/* * Copyright 2021 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.location; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; /** * An RPC service published by a nanoapp. * * This class is meant to be informational and allows a nanoapp client to know if a given * nanoapp publishes a service which supports an RPC interface. The implementation of the RPC * interface is not specified by the Android APIs and is built by the platform implementation * over the message payloads transferred through the {@link ContextHubClient}. * * This class is instantiated as a part of {@link NanoAppState}, which is provided as a result * of {@link ContextHubManager.queryNanoApps(ContextHubInfo)}. * * See the chrePublishRpcServices() API for how this service is published by the nanoapp. * * @hide */ @SystemApi public final class NanoAppRpcService implements Parcelable { private long mServiceId; private int mServiceVersion; /** * @param serviceId The unique ID of this service, see {#getId()}. * @param serviceVersion The software version of this service, see {#getVersion()}. */ public NanoAppRpcService(long serviceId, int serviceVersion) { mServiceId = serviceId; mServiceVersion = serviceVersion; } /** * The unique 64-bit ID of an RPC service published by a nanoapp. Note that * the uniqueness is only required within the nanoapp's domain (i.e. the * combination of the nanoapp ID and service id must be unique). * * This ID must remain the same for the given nanoapp RPC service once * published on Android (i.e. must never change). * * @return The service ID. */ public long getId() { return mServiceId; } /** * The software version of this service, which follows the sematic * versioning scheme (see semver.org). It follows the format * major.minor.patch, where major and minor versions take up one byte * each, and the patch version takes up the final 2 (lower) bytes. * I.e. the version is encoded as 0xMMmmpppp, where MM, mm, pppp are * the major, minor, patch versions, respectively. * * @return The service version. */ public int getVersion() { return mServiceVersion; } /** * @return The service's major version. */ private int getMajorVersion() { return (mServiceVersion & 0xFF000000) >>> 24; } /** * @return The service's minor version. */ private int getMinorVersion() { return (mServiceVersion & 0x00FF0000) >>> 16; } /** * @return The service's patch version. */ private int getPatchVersion() { return mServiceVersion & 0x0000FFFF; } private NanoAppRpcService(Parcel in) { mServiceId = in.readLong(); mServiceVersion = in.readInt(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel out, int flags) { out.writeLong(mServiceId); out.writeInt(mServiceVersion); } public static final @NonNull Creator CREATOR = new Creator() { @Override public NanoAppRpcService createFromParcel(Parcel in) { return new NanoAppRpcService(in); } @Override public NanoAppRpcService[] newArray(int size) { return new NanoAppRpcService[size]; } }; @NonNull @Override public String toString() { return "NanoAppRpcService[Id = " + Long.toHexString(mServiceId) + ", version = v" + getMajorVersion() + "." + getMinorVersion() + "." + getPatchVersion() + "]"; } @Override public boolean equals(@Nullable Object object) { if (object == this) { return true; } boolean isEqual = false; if (object instanceof NanoAppRpcService) { NanoAppRpcService other = (NanoAppRpcService) object; isEqual = (other.getId() == mServiceId) && (other.getVersion() == mServiceVersion); } return isEqual; } @Override public int hashCode() { return (int) getId(); } }