/* * 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.le.ScanSettings; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; /** * Compatible version of ScanSettings */ public class ScanSettingsCompat 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. Scan results are returned at a rate that * provides a good trade-off between scan frequency and power consumption. */ public static final int SCAN_MODE_BALANCED = 1; /** * Scan using highest duty cycle. It's recommended to only use this mode when the application is * running in the foreground. */ public static final int SCAN_MODE_LOW_LATENCY = 2; /** * Trigger a callback for every Bluetooth advertisement found that matches the filter criteria. * If no filter is active, all advertisement packets are reported. */ public static final int CALLBACK_TYPE_ALL_MATCHES = 1; // Bluetooth LE scan mode. private final int mScanMode; // Bluetooth LE scan callback type private final int mCallbackType; // Time of delay for reporting the scan result private final long mReportDelayMillis; public int getScanMode() { return mScanMode; } public int getCallbackType() { return mCallbackType; } /** * Returns report delay timestamp based on the device clock. */ public long getReportDelayMillis() { return mReportDelayMillis; } private ScanSettingsCompat(int scanMode, int callbackType, long reportDelayMillis) { mScanMode = scanMode; mCallbackType = callbackType; mReportDelayMillis = reportDelayMillis; } private ScanSettingsCompat(Parcel in) { mScanMode = in.readInt(); mCallbackType = in.readInt(); mReportDelayMillis = in.readLong(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) ScanSettings toApi21() { return new ScanSettings.Builder() .setReportDelay(getReportDelayMillis()) .setScanMode(getScanMode()) .build(); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mScanMode); dest.writeInt(mCallbackType); dest.writeLong(mReportDelayMillis); } @Override public int describeContents() { return 0; } public static final Creator CREATOR = new Creator() { @Override public ScanSettingsCompat[] newArray(int size) { return new ScanSettingsCompat[size]; } @Override public ScanSettingsCompat createFromParcel(Parcel in) { return new ScanSettingsCompat(in); } }; /** * Builder for {@link ScanSettingsCompat}. */ public static final class Builder { private int mScanMode = SCAN_MODE_LOW_POWER; private final int mCallbackType = CALLBACK_TYPE_ALL_MATCHES; private long mReportDelayMillis = 0; /** * Set scan mode for Bluetooth LE scan. * * @param scanMode The scan mode can be one of {@link ScanSettingsCompat#SCAN_MODE_LOW_POWER}, * {@link ScanSettingsCompat#SCAN_MODE_BALANCED} or * {@link ScanSettingsCompat#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; } // Returns true if the callbackType is valid. private boolean isValidCallbackType(int callbackType) { return callbackType == CALLBACK_TYPE_ALL_MATCHES; } /** * Set report delay timestamp for Bluetooth LE scan. * * @param reportDelayMillis Delay of report in milliseconds. Set to 0 to be notified of * results immediately. Values > 0 causes the scan results to be queued up and * delivered after the requested delay or when the internal buffers fill up. * @throws IllegalArgumentException If {@code reportDelayMillis} < 0. */ public Builder setReportDelay(long reportDelayMillis) { if (reportDelayMillis < 0) { throw new IllegalArgumentException("reportDelay must be > 0"); } mReportDelayMillis = reportDelayMillis; return this; } /** * Build {@link ScanSettingsCompat}. */ public ScanSettingsCompat build() { return new ScanSettingsCompat(mScanMode, mCallbackType, mReportDelayMillis); } } }