This change updates several of the data classes in
`android.net.lowpan` to be parcelable. This allows them to be used
directly for inter-process communication.
Bug: b/63707448 b/63708348
Change-Id: Ib5e8cad153534948ff4b43a2fda82f3db250839e
Test: Confirmed with unit tests from change id
I41d590b1e77dc41873c4b9e9bf1b7f1bf859f74e
235 lines
6.4 KiB
Java
235 lines
6.4 KiB
Java
/*
|
|
* Copyright (C) 2017 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.net.lowpan;
|
|
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
import com.android.internal.util.HexDump;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.Objects;
|
|
import java.util.TreeSet;
|
|
|
|
/**
|
|
* Describes a LoWPAN Beacon
|
|
*
|
|
* @hide
|
|
*/
|
|
// @SystemApi
|
|
public class LowpanBeaconInfo implements Parcelable {
|
|
public static final int UNKNOWN_RSSI = Integer.MAX_VALUE;
|
|
public static final int UNKNOWN_LQI = 0;
|
|
|
|
private LowpanIdentity mIdentity;
|
|
private int mRssi = UNKNOWN_RSSI;
|
|
private int mLqi = UNKNOWN_LQI;
|
|
private byte[] mBeaconAddress = null;
|
|
private final TreeSet<Integer> mFlags = new TreeSet<>();
|
|
|
|
public static final int FLAG_CAN_ASSIST = 1;
|
|
|
|
/** @hide */
|
|
public static class Builder {
|
|
final LowpanIdentity.Builder mIdentityBuilder = new LowpanIdentity.Builder();
|
|
final LowpanBeaconInfo mBeaconInfo = new LowpanBeaconInfo();
|
|
|
|
public Builder setLowpanIdentity(LowpanIdentity x) {
|
|
mIdentityBuilder.setLowpanIdentity(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setName(String x) {
|
|
mIdentityBuilder.setName(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setXpanid(byte x[]) {
|
|
mIdentityBuilder.setXpanid(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setPanid(int x) {
|
|
mIdentityBuilder.setPanid(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setChannel(int x) {
|
|
mIdentityBuilder.setChannel(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setType(String x) {
|
|
mIdentityBuilder.setType(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setRssi(int x) {
|
|
mBeaconInfo.mRssi = x;
|
|
return this;
|
|
}
|
|
|
|
public Builder setLqi(int x) {
|
|
mBeaconInfo.mLqi = x;
|
|
return this;
|
|
}
|
|
|
|
public Builder setBeaconAddress(byte x[]) {
|
|
mBeaconInfo.mBeaconAddress = (x != null ? x.clone() : null);
|
|
return this;
|
|
}
|
|
|
|
public Builder setFlag(int x) {
|
|
mBeaconInfo.mFlags.add(x);
|
|
return this;
|
|
}
|
|
|
|
public Builder setFlags(Collection<Integer> x) {
|
|
mBeaconInfo.mFlags.addAll(x);
|
|
return this;
|
|
}
|
|
|
|
public LowpanBeaconInfo build() {
|
|
mBeaconInfo.mIdentity = mIdentityBuilder.build();
|
|
if (mBeaconInfo.mBeaconAddress == null) {
|
|
mBeaconInfo.mBeaconAddress = new byte[0];
|
|
}
|
|
return mBeaconInfo;
|
|
}
|
|
}
|
|
|
|
private LowpanBeaconInfo() {}
|
|
|
|
public LowpanIdentity getLowpanIdentity() {
|
|
return mIdentity;
|
|
}
|
|
|
|
public int getRssi() {
|
|
return mRssi;
|
|
}
|
|
|
|
public int getLqi() {
|
|
return mLqi;
|
|
}
|
|
|
|
public byte[] getBeaconAddress() {
|
|
return mBeaconAddress.clone();
|
|
}
|
|
|
|
public Collection<Integer> getFlags() {
|
|
return (Collection<Integer>) mFlags.clone();
|
|
}
|
|
|
|
public boolean isFlagSet(int flag) {
|
|
return mFlags.contains(flag);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
sb.append(mIdentity.toString());
|
|
|
|
if (mRssi != UNKNOWN_RSSI) {
|
|
sb.append(", RSSI:").append(mRssi).append("dBm");
|
|
}
|
|
|
|
if (mLqi != UNKNOWN_LQI) {
|
|
sb.append(", LQI:").append(mLqi);
|
|
}
|
|
|
|
if (mBeaconAddress.length > 0) {
|
|
sb.append(", BeaconAddress:").append(HexDump.toHexString(mBeaconAddress));
|
|
}
|
|
|
|
for (Integer flag : mFlags) {
|
|
switch (flag.intValue()) {
|
|
case FLAG_CAN_ASSIST:
|
|
sb.append(", CAN_ASSIST");
|
|
break;
|
|
default:
|
|
sb.append(", FLAG_").append(Integer.toHexString(flag));
|
|
break;
|
|
}
|
|
}
|
|
|
|
return sb.toString();
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return Objects.hash(mIdentity, mRssi, mLqi, Arrays.hashCode(mBeaconAddress), mFlags);
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object obj) {
|
|
if (!(obj instanceof LowpanBeaconInfo)) {
|
|
return false;
|
|
}
|
|
LowpanBeaconInfo rhs = (LowpanBeaconInfo) obj;
|
|
return mIdentity.equals(rhs.mIdentity)
|
|
&& Arrays.equals(mBeaconAddress, rhs.mBeaconAddress)
|
|
&& mRssi == rhs.mRssi
|
|
&& mLqi == rhs.mLqi
|
|
&& mFlags.equals(rhs.mFlags);
|
|
}
|
|
|
|
/** Implement the Parcelable interface. */
|
|
@Override
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
/** Implement the Parcelable interface. */
|
|
@Override
|
|
public void writeToParcel(Parcel dest, int flags) {
|
|
mIdentity.writeToParcel(dest, flags);
|
|
dest.writeInt(mRssi);
|
|
dest.writeInt(mLqi);
|
|
dest.writeByteArray(mBeaconAddress);
|
|
|
|
dest.writeInt(mFlags.size());
|
|
for (Integer val : mFlags) {
|
|
dest.writeInt(val);
|
|
}
|
|
}
|
|
|
|
/** Implement the Parcelable interface. */
|
|
public static final Creator<LowpanBeaconInfo> CREATOR =
|
|
new Creator<LowpanBeaconInfo>() {
|
|
public LowpanBeaconInfo createFromParcel(Parcel in) {
|
|
Builder builder = new Builder();
|
|
|
|
builder.setLowpanIdentity(LowpanIdentity.CREATOR.createFromParcel(in));
|
|
|
|
builder.setRssi(in.readInt());
|
|
builder.setLqi(in.readInt());
|
|
|
|
builder.setBeaconAddress(in.createByteArray());
|
|
|
|
for (int i = in.readInt(); i > 0; i--) {
|
|
builder.setFlag(in.readInt());
|
|
}
|
|
|
|
return builder.build();
|
|
}
|
|
|
|
public LowpanBeaconInfo[] newArray(int size) {
|
|
return new LowpanBeaconInfo[size];
|
|
}
|
|
};
|
|
}
|