/* * Copyright (C) 2014 The Android Open Source Project * Copyright (C) 2015 Joe Rogers * * 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 com.blakequ.bluetooth_manager_lib.scan.bluetoothcompat; import android.annotation.TargetApi; import android.bluetooth.BluetoothDevice; import android.bluetooth.le.ScanResult; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.Nullable; import com.blakequ.bluetooth_manager_lib.device.BluetoothLeDevice; /** * Backwards compatible version of a ScanResult */ public class ScanResultCompat implements Parcelable { // Remote bluetooth device. private BluetoothLeDevice mDevice; // Scan record, including advertising data and scan response data. @Nullable private ScanRecordCompat mScanRecord; // Received signal strength. private int mRssi; // Device timestamp when the result was last seen. private long mTimestampNanos; /** * Constructor of scan result. * * @param device Remote bluetooth device that is found. * @param scanRecord Scan record including both advertising data and scan response data. * @param rssi Received signal strength. * @param timestampNanos Device timestamp when the scan result was observed. */ public ScanResultCompat(BluetoothDevice device, @Nullable ScanRecordCompat scanRecord, int rssi, long timestampNanos) { mDevice = new BluetoothLeDevice(device, rssi, scanRecord.getBytes(), timestampNanos); mScanRecord = scanRecord; mRssi = rssi; mTimestampNanos = timestampNanos; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) ScanResultCompat(ScanResult result) { mDevice = new BluetoothLeDevice(result.getDevice(), result.getRssi(), result.getScanRecord().getBytes(), System.currentTimeMillis());//result.getTimestampNanos() mScanRecord = new ScanRecordCompat(result.getScanRecord()); mRssi = result.getRssi(); mTimestampNanos = System.currentTimeMillis();//result.getTimestampNanos(); } private ScanResultCompat(Parcel in) { readFromParcel(in); } @Override public void writeToParcel(Parcel dest, int flags) { if (mDevice != null) { dest.writeInt(1); mDevice.writeToParcel(dest, flags); } else { dest.writeInt(0); } if (mScanRecord != null) { dest.writeInt(1); dest.writeByteArray(mScanRecord.getBytes()); } else { dest.writeInt(0); } dest.writeInt(mRssi); dest.writeLong(mTimestampNanos); } private void readFromParcel(Parcel in) { if (in.readInt() == 1) { mDevice = BluetoothLeDevice.CREATOR.createFromParcel(in); } if (in.readInt() == 1) { mScanRecord = ScanRecordCompat.parseFromBytes(in.createByteArray()); } mRssi = in.readInt(); mTimestampNanos = in.readLong(); } @Override public int describeContents() { return 0; } /** * Returns the remote bluetooth device identified by the bluetooth device address. */ public BluetoothLeDevice getLeDevice() { return mDevice; } /** * Returns the remote bluetooth device identified by the bluetooth device address. * @return */ public BluetoothDevice getDevice() { if (mDevice != null){ return mDevice.getDevice(); } return null; } /** * Returns the scan record, which is a combination of advertisement and scan response. */ @Nullable public ScanRecordCompat getScanRecord() { return mScanRecord; } /** * Returns the received signal strength in dBm. The valid range is [-127, 127]. */ public int getRssi() { return mRssi; } /** * Returns timestamp since boot when the scan record was observed. */ public long getTimestampNanos() { return mTimestampNanos; } @Override public int hashCode() { return ObjectsCompat.hash(mDevice, mRssi, mScanRecord, mTimestampNanos); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } ScanResultCompat other = (ScanResultCompat) obj; return ObjectsCompat.equals(mDevice, other.mDevice) && (mRssi == other.mRssi) && ObjectsCompat.equals(mScanRecord, other.mScanRecord) && (mTimestampNanos == other.mTimestampNanos); } @Override public String toString() { return "ScanResult{" + "mDevice=" + mDevice + ", mScanRecord=" + ObjectsCompat.toString(mScanRecord) + ", mRssi=" + mRssi + ", mTimestampNanos=" + mTimestampNanos + '}'; } public static final Creator CREATOR = new Creator() { @Override public ScanResultCompat createFromParcel(Parcel source) { return new ScanResultCompat(source); } @Override public ScanResultCompat[] newArray(int size) { return new ScanResultCompat[size]; } }; }