/* * Copyright (C) 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.companion; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.ParcelUuid; import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; /** * Event for observing device presence. * * @see CompanionDeviceManager#startObservingDevicePresence(ObservingDevicePresenceRequest) * @see ObservingDevicePresenceRequest.Builder#setUuid(ParcelUuid) * @see ObservingDevicePresenceRequest.Builder#setAssociationId(int) */ @FlaggedApi(Flags.FLAG_DEVICE_PRESENCE) public final class DevicePresenceEvent implements Parcelable { /** @hide */ @IntDef(prefix = {"EVENT"}, value = { EVENT_BLE_APPEARED, EVENT_BLE_DISAPPEARED, EVENT_BT_CONNECTED, EVENT_BT_DISCONNECTED, EVENT_SELF_MANAGED_APPEARED, EVENT_SELF_MANAGED_DISAPPEARED }) @Retention(RetentionPolicy.SOURCE) public @interface Event {} /** * Indicate observing device presence base on the ParcelUuid but not association id. */ public static final int NO_ASSOCIATION = -1; /** * Companion app receives * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} callback * with this event if the device comes into BLE range. */ public static final int EVENT_BLE_APPEARED = 0; /** * Companion app receives * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} callback * with this event if the device is no longer in BLE range. */ public static final int EVENT_BLE_DISAPPEARED = 1; /** * Companion app receives * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} callback * with this event when the bluetooth device is connected. */ public static final int EVENT_BT_CONNECTED = 2; /** * Companion app receives * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} callback * with this event if the bluetooth device is disconnected. */ public static final int EVENT_BT_DISCONNECTED = 3; /** * A companion app for a self-managed device will receive the callback * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} * if it reports that a device has appeared on its * own. */ public static final int EVENT_SELF_MANAGED_APPEARED = 4; /** * A companion app for a self-managed device will receive the callback * {@link CompanionDeviceService#onDevicePresenceEvent(DevicePresenceEvent)} if it reports * that a device has disappeared on its own. */ public static final int EVENT_SELF_MANAGED_DISAPPEARED = 5; private final int mAssociationId; private final int mEvent; @Nullable private final ParcelUuid mUuid; private static final int PARCEL_UUID_NULL = 0; private static final int PARCEL_UUID_NOT_NULL = 1; /** * Create a new DevicePresenceEvent. */ public DevicePresenceEvent( int associationId, @Event int event, @Nullable ParcelUuid uuid) { mAssociationId = associationId; mEvent = event; mUuid = uuid; } /** * @return The association id has been used to observe device presence. * * Caller will receive the valid association id if only if using * {@link ObservingDevicePresenceRequest.Builder#setAssociationId(int)}, otherwise * return {@link #NO_ASSOCIATION}. * * @see ObservingDevicePresenceRequest.Builder#setAssociationId(int) */ public int getAssociationId() { return mAssociationId; } /** * @return Associated companion device's event. */ public int getEvent() { return mEvent; } /** * @return The ParcelUuid has been used to observe device presence. * * Caller will receive the ParcelUuid if only if using * {@link ObservingDevicePresenceRequest.Builder#setUuid(ParcelUuid)}, otherwise return null. * * @see ObservingDevicePresenceRequest.Builder#setUuid(ParcelUuid) */ @Nullable public ParcelUuid getUuid() { return mUuid; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mAssociationId); dest.writeInt(mEvent); if (mUuid == null) { // Write 0 to the parcel to indicate the ParcelUuid is null. dest.writeInt(PARCEL_UUID_NULL); } else { dest.writeInt(PARCEL_UUID_NOT_NULL); mUuid.writeToParcel(dest, flags); } } @Override public boolean equals(@Nullable Object o) { if (this == o) return true; if (!(o instanceof DevicePresenceEvent that)) return false; return Objects.equals(mUuid, that.mUuid) && mAssociationId == that.mAssociationId && mEvent == that.mEvent; } @Override public String toString() { return "ObservingDevicePresenceResult { " + "Association Id= " + mAssociationId + "," + "ParcelUuid= " + mUuid + "," + "Event= " + mEvent + "}"; } @Override public int hashCode() { return Objects.hash(mAssociationId, mEvent, mUuid); } @NonNull public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public DevicePresenceEvent[] newArray(int size) { return new DevicePresenceEvent[size]; } @Override public DevicePresenceEvent createFromParcel(@NonNull Parcel in) { return new DevicePresenceEvent(in); } }; private DevicePresenceEvent(@NonNull Parcel in) { mAssociationId = in.readInt(); mEvent = in.readInt(); if (in.readInt() == PARCEL_UUID_NULL) { mUuid = null; } else { mUuid = ParcelUuid.CREATOR.createFromParcel(in); } } }