blob: 0a856756326b533a272e33cc5037a0c3c96f8d42 [file] [log] [blame]
/*
* Copyright (C) 2014 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.bluetooth.le;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Settings for Bluetooth LE scan.
*/
public final class ScanSettings implements Parcelable {
/**
* Perform Bluetooth LE scan in low power mode. This is the default scan mode as it consumes the
* least power.
*/
public static final int SCAN_MODE_LOW_POWER = 0;
/**
* Perform Bluetooth LE scan in balanced power mode.
*/
public static final int SCAN_MODE_BALANCED = 1;
/**
* Scan using highest duty cycle. It's recommended only using this mode when the application is
* running in foreground.
*/
public static final int SCAN_MODE_LOW_LATENCY = 2;
/**
* Callback each time when a bluetooth advertisement is found.
*/
public static final int CALLBACK_TYPE_ON_UPDATE = 0;
/**
* Callback when a bluetooth advertisement is found for the first time.
*
* @hide
*/
public static final int CALLBACK_TYPE_ON_FOUND = 1;
/**
* Callback when a bluetooth advertisement is found for the first time, then lost.
*
* @hide
*/
public static final int CALLBACK_TYPE_ON_LOST = 2;
/**
* Full scan result which contains device mac address, rssi, advertising and scan response and
* scan timestamp.
*/
public static final int SCAN_RESULT_TYPE_FULL = 0;
/**
* Truncated scan result which contains device mac address, rssi and scan timestamp. Note it's
* possible for an app to get more scan results that it asks if there are multiple apps using
* this type. TODO: decide whether we could unhide this setting.
*
* @hide
*/
public static final int SCAN_RESULT_TYPE_TRUNCATED = 1;
// Bluetooth LE scan mode.
private int mScanMode;
// Bluetooth LE scan callback type
private int mCallbackType;
// Bluetooth LE scan result type
private int mScanResultType;
// Time of delay for reporting the scan result
private long mReportDelayNanos;
public int getScanMode() {
return mScanMode;
}
public int getCallbackType() {
return mCallbackType;
}
public int getScanResultType() {
return mScanResultType;
}
/**
* Returns report delay timestamp based on the device clock.
*/
public long getReportDelayNanos() {
return mReportDelayNanos;
}
private ScanSettings(int scanMode, int callbackType, int scanResultType,
long reportDelayNanos) {
mScanMode = scanMode;
mCallbackType = callbackType;
mScanResultType = scanResultType;
mReportDelayNanos = reportDelayNanos;
}
private ScanSettings(Parcel in) {
mScanMode = in.readInt();
mCallbackType = in.readInt();
mScanResultType = in.readInt();
mReportDelayNanos = in.readLong();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mScanMode);
dest.writeInt(mCallbackType);
dest.writeInt(mScanResultType);
dest.writeLong(mReportDelayNanos);
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<ScanSettings>
CREATOR = new Creator<ScanSettings>() {
@Override
public ScanSettings[] newArray(int size) {
return new ScanSettings[size];
}
@Override
public ScanSettings createFromParcel(Parcel in) {
return new ScanSettings(in);
}
};
/**
* Builder for {@link ScanSettings}.
*/
public static final class Builder {
private int mScanMode = SCAN_MODE_LOW_POWER;
private int mCallbackType = CALLBACK_TYPE_ON_UPDATE;
private int mScanResultType = SCAN_RESULT_TYPE_FULL;
private long mReportDelayNanos = 0;
/**
* Set scan mode for Bluetooth LE scan.
*
* @param scanMode The scan mode can be one of
* {@link ScanSettings#SCAN_MODE_LOW_POWER},
* {@link ScanSettings#SCAN_MODE_BALANCED} or
* {@link ScanSettings#SCAN_MODE_LOW_LATENCY}.
* @throws IllegalArgumentException If the {@code scanMode} is invalid.
*/
public Builder setScanMode(int scanMode) {
if (scanMode < SCAN_MODE_LOW_POWER || scanMode > SCAN_MODE_LOW_LATENCY) {
throw new IllegalArgumentException("invalid scan mode " + scanMode);
}
mScanMode = scanMode;
return this;
}
/**
* Set callback type for Bluetooth LE scan.
*
* @param callbackType The callback type for the scan. Can only be
* {@link ScanSettings#CALLBACK_TYPE_ON_UPDATE}.
* @throws IllegalArgumentException If the {@code callbackType} is invalid.
*/
public Builder setCallbackType(int callbackType) {
if (callbackType < CALLBACK_TYPE_ON_UPDATE
|| callbackType > CALLBACK_TYPE_ON_LOST) {
throw new IllegalArgumentException("invalid callback type - " + callbackType);
}
mCallbackType = callbackType;
return this;
}
/**
* Set scan result type for Bluetooth LE scan.
*
* @param scanResultType Type for scan result, could be either
* {@link ScanSettings#SCAN_RESULT_TYPE_FULL} or
* {@link ScanSettings#SCAN_RESULT_TYPE_TRUNCATED}.
* @throws IllegalArgumentException If the {@code scanResultType} is invalid.
* @hide
*/
public Builder setScanResultType(int scanResultType) {
if (scanResultType < SCAN_RESULT_TYPE_FULL
|| scanResultType > SCAN_RESULT_TYPE_TRUNCATED) {
throw new IllegalArgumentException(
"invalid scanResultType - " + scanResultType);
}
mScanResultType = scanResultType;
return this;
}
/**
* Set report delay timestamp for Bluetooth LE scan.
*/
public Builder setReportDelayNanos(long reportDelayNanos) {
mReportDelayNanos = reportDelayNanos;
return this;
}
/**
* Build {@link ScanSettings}.
*/
public ScanSettings build() {
return new ScanSettings(mScanMode, mCallbackType, mScanResultType,
mReportDelayNanos);
}
}
}