Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 191ce9c4 authored by Ivan Podogov's avatar Ivan Podogov Committed by Hansong Zhang
Browse files

HIDD: Address API Review concerns

 * Replace bare field usage with getter methods;
 * Remove Builder;
 * Move BluetoothHidDeviceCallback to inner class;
 * Remove toArray() and equals();
 * Throw IllegalArgumentException where applicable;
 * Add an Executor parameter before Callback;

Bug: 72168436, 72168126
Test: make update-api, make, make sl4a.Common
Change-Id: I13095458bf3ded7a376e8d20fd13df12ef426693
(cherry picked from commit f2f5dc35)
parent 20b7c174
Loading
Loading
Loading
Loading
+23 −35
Original line number Diff line number Diff line
@@ -8333,7 +8333,7 @@ package android.bluetooth {
    method public java.util.List<android.bluetooth.BluetoothDevice> getConnectedDevices();
    method public int getConnectionState(android.bluetooth.BluetoothDevice);
    method public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
    method public boolean registerApp(android.bluetooth.BluetoothHidDeviceAppSdpSettings, android.bluetooth.BluetoothHidDeviceAppQosSettings, android.bluetooth.BluetoothHidDeviceAppQosSettings, android.bluetooth.BluetoothHidDeviceCallback);
    method public boolean registerApp(android.bluetooth.BluetoothHidDeviceAppSdpSettings, android.bluetooth.BluetoothHidDeviceAppQosSettings, android.bluetooth.BluetoothHidDeviceAppQosSettings, java.util.concurrent.Executor, android.bluetooth.BluetoothHidDevice.Callback);
    method public boolean replyReport(android.bluetooth.BluetoothDevice, byte, byte, byte[]);
    method public boolean reportError(android.bluetooth.BluetoothDevice, byte);
    method public boolean sendReport(android.bluetooth.BluetoothDevice, int, byte[]);
@@ -8363,56 +8363,44 @@ package android.bluetooth {
    field public static final byte SUBCLASS2_UNCATEGORIZED = 0; // 0x0
  }
  public static abstract class BluetoothHidDevice.Callback {
    ctor public BluetoothHidDevice.Callback();
    method public void onAppStatusChanged(android.bluetooth.BluetoothDevice, boolean);
    method public void onConnectionStateChanged(android.bluetooth.BluetoothDevice, int);
    method public void onGetReport(android.bluetooth.BluetoothDevice, byte, byte, int);
    method public void onInterruptData(android.bluetooth.BluetoothDevice, byte, byte[]);
    method public void onSetProtocol(android.bluetooth.BluetoothDevice, byte);
    method public void onSetReport(android.bluetooth.BluetoothDevice, byte, byte, byte[]);
    method public void onVirtualCableUnplug(android.bluetooth.BluetoothDevice);
  }
  public final class BluetoothHidDeviceAppQosSettings implements android.os.Parcelable {
    ctor public BluetoothHidDeviceAppQosSettings(int, int, int, int, int, int);
    method public int describeContents();
    method public int[] toArray();
    method public int getDelayVariation();
    method public int getLatency();
    method public int getPeakBandwidth();
    method public int getServiceType();
    method public int getTokenBucketSize();
    method public int getTokenRate();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHidDeviceAppQosSettings> CREATOR;
    field public static final int MAX = -1; // 0xffffffff
    field public static final int SERVICE_BEST_EFFORT = 1; // 0x1
    field public static final int SERVICE_GUARANTEED = 2; // 0x2
    field public static final int SERVICE_NO_TRAFFIC = 0; // 0x0
    field public final int delayVariation;
    field public final int latency;
    field public final int peakBandwidth;
    field public final int serviceType;
    field public final int tokenBucketSize;
    field public final int tokenRate;
  }
  public static class BluetoothHidDeviceAppQosSettings.Builder {
    ctor public BluetoothHidDeviceAppQosSettings.Builder();
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings build();
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings.Builder delayVariation(int);
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings.Builder latency(int);
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings.Builder peakBandwidth(int);
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings.Builder serviceType(int);
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings.Builder tokenBucketSize(int);
    method public android.bluetooth.BluetoothHidDeviceAppQosSettings.Builder tokenRate(int);
  }
  public final class BluetoothHidDeviceAppSdpSettings implements android.os.Parcelable {
    ctor public BluetoothHidDeviceAppSdpSettings(java.lang.String, java.lang.String, java.lang.String, byte, byte[]);
    method public int describeContents();
    method public java.lang.String getDescription();
    method public byte[] getDescriptors();
    method public java.lang.String getName();
    method public java.lang.String getProvider();
    method public byte getSubclass();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.bluetooth.BluetoothHidDeviceAppSdpSettings> CREATOR;
    field public final java.lang.String description;
    field public final byte[] descriptors;
    field public final java.lang.String name;
    field public final java.lang.String provider;
    field public final byte subclass;
  }
  public abstract class BluetoothHidDeviceCallback {
    ctor public BluetoothHidDeviceCallback();
    method public void onAppStatusChanged(android.bluetooth.BluetoothDevice, boolean);
    method public void onConnectionStateChanged(android.bluetooth.BluetoothDevice, int);
    method public void onGetReport(android.bluetooth.BluetoothDevice, byte, byte, int);
    method public void onInterruptData(android.bluetooth.BluetoothDevice, byte, byte[]);
    method public void onSetProtocol(android.bluetooth.BluetoothDevice, byte);
    method public void onSetReport(android.bluetooth.BluetoothDevice, byte, byte, byte[]);
    method public void onVirtualCableUnplug(android.bluetooth.BluetoothDevice);
  }
  public final class BluetoothManager {
+281 −77

File changed.

Preview size limit exceeded, changes collapsed.

+55 −133
Original line number Diff line number Diff line
@@ -29,12 +29,12 @@ import android.os.Parcelable;
 */
public final class BluetoothHidDeviceAppQosSettings implements Parcelable {

    public final int serviceType;
    public final int tokenRate;
    public final int tokenBucketSize;
    public final int peakBandwidth;
    public final int latency;
    public final int delayVariation;
    private final int mServiceType;
    private final int mTokenRate;
    private final int mTokenBucketSize;
    private final int mPeakBandwidth;
    private final int mLatency;
    private final int mDelayVariation;

    public static final int SERVICE_NO_TRAFFIC = 0x00;
    public static final int SERVICE_BEST_EFFORT = 0x01;
@@ -44,38 +44,53 @@ public final class BluetoothHidDeviceAppQosSettings implements Parcelable {

    /**
     * Create a BluetoothHidDeviceAppQosSettings object for the Bluetooth L2CAP channel. The QoS
     * Settings is optional. Recommended to use BluetoothHidDeviceAppQosSettings.Builder.
     * Please refer to Bluetooth HID Specfication v1.1.1 Section 5.2 and Appendix D for parameters.
     * Settings is optional. Please refer to Bluetooth HID Specfication v1.1.1 Section 5.2 and
     * Appendix D for parameters.
     *
     * @param serviceType L2CAP service type
     * @param tokenRate L2CAP token rate
     * @param tokenBucketSize L2CAP token bucket size
     * @param peakBandwidth L2CAP peak bandwidth
     * @param latency L2CAP latency
     * @param delayVariation L2CAP delay variation
     * @param serviceType L2CAP service type, default = SERVICE_BEST_EFFORT
     * @param tokenRate L2CAP token rate, default = 0
     * @param tokenBucketSize L2CAP token bucket size, default = 0
     * @param peakBandwidth L2CAP peak bandwidth, default = 0
     * @param latency L2CAP latency, default = MAX
     * @param delayVariation L2CAP delay variation, default = MAX
     */
    public BluetoothHidDeviceAppQosSettings(int serviceType, int tokenRate, int tokenBucketSize,
            int peakBandwidth, int latency, int delayVariation) {
        this.serviceType = serviceType;
        this.tokenRate = tokenRate;
        this.tokenBucketSize = tokenBucketSize;
        this.peakBandwidth = peakBandwidth;
        this.latency = latency;
        this.delayVariation = delayVariation;
    public BluetoothHidDeviceAppQosSettings(
            int serviceType,
            int tokenRate,
            int tokenBucketSize,
            int peakBandwidth,
            int latency,
            int delayVariation) {
        mServiceType = serviceType;
        mTokenRate = tokenRate;
        mTokenBucketSize = tokenBucketSize;
        mPeakBandwidth = peakBandwidth;
        mLatency = latency;
        mDelayVariation = delayVariation;
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof BluetoothHidDeviceAppQosSettings) {
            BluetoothHidDeviceAppQosSettings qos = (BluetoothHidDeviceAppQosSettings) o;
            return this.serviceType == qos.serviceType
                    && this.tokenRate == qos.tokenRate
                    && this.tokenBucketSize == qos.tokenBucketSize
                    && this.peakBandwidth == qos.peakBandwidth
                    && this.latency == qos.latency
                    && this.delayVariation == qos.delayVariation;
    public int getServiceType() {
        return mServiceType;
    }

    public int getTokenRate() {
        return mTokenRate;
    }

    public int getTokenBucketSize() {
        return mTokenBucketSize;
    }

    public int getPeakBandwidth() {
        return mPeakBandwidth;
    }

    public int getLatency() {
        return mLatency;
    }
        return false;

    public int getDelayVariation() {
        return mDelayVariation;
    }

    @Override
@@ -106,104 +121,11 @@ public final class BluetoothHidDeviceAppQosSettings implements Parcelable {

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(serviceType);
        out.writeInt(tokenRate);
        out.writeInt(tokenBucketSize);
        out.writeInt(peakBandwidth);
        out.writeInt(latency);
        out.writeInt(delayVariation);
    }

    /** @return an int array representation of this instance */
    public int[] toArray() {
        return new int[] {
            serviceType, tokenRate, tokenBucketSize, peakBandwidth, latency, delayVariation
        };
    }

    /** A helper to build the BluetoothHidDeviceAppQosSettings object. */
    public static class Builder {
        // Optional parameters - initialized to default values
        private int mServiceType = SERVICE_BEST_EFFORT;
        private int mTokenRate = 0;
        private int mTokenBucketSize = 0;
        private int mPeakBandwidth = 0;
        private int mLatency = MAX;
        private int mDelayVariation = MAX;

        /**
         * Set the service type.
         *
         * @param val service type. Should be one of {SERVICE_NO_TRAFFIC, SERVICE_BEST_EFFORT,
         *     SERVICE_GUARANTEED}, with SERVICE_BEST_EFFORT being the default one.
         * @return BluetoothHidDeviceAppQosSettings Builder with specified service type.
         */
        public Builder serviceType(int val) {
            mServiceType = val;
            return this;
        }
        /**
         * Set the token rate.
         *
         * @param val token rate
         * @return BluetoothHidDeviceAppQosSettings Builder with specified token rate.
         */
        public Builder tokenRate(int val) {
            mTokenRate = val;
            return this;
        }

        /**
         * Set the bucket size.
         *
         * @param val bucket size
         * @return BluetoothHidDeviceAppQosSettings Builder with specified bucket size.
         */
        public Builder tokenBucketSize(int val) {
            mTokenBucketSize = val;
            return this;
        }

        /**
         * Set the peak bandwidth.
         *
         * @param val peak bandwidth
         * @return BluetoothHidDeviceAppQosSettings Builder with specified peak bandwidth.
         */
        public Builder peakBandwidth(int val) {
            mPeakBandwidth = val;
            return this;
        }
        /**
         * Set the latency.
         *
         * @param val latency
         * @return BluetoothHidDeviceAppQosSettings Builder with specified latency.
         */
        public Builder latency(int val) {
            mLatency = val;
            return this;
        }

        /**
         * Set the delay variation.
         *
         * @param val delay variation
         * @return BluetoothHidDeviceAppQosSettings Builder with specified delay variation.
         */
        public Builder delayVariation(int val) {
            mDelayVariation = val;
            return this;
        }

        /**
         * Build the BluetoothHidDeviceAppQosSettings object.
         *
         * @return BluetoothHidDeviceAppQosSettings object with current settings.
         */
        public BluetoothHidDeviceAppQosSettings build() {
            return new BluetoothHidDeviceAppQosSettings(mServiceType, mTokenRate, mTokenBucketSize,
                    mPeakBandwidth, mLatency, mDelayVariation);
        }
        out.writeInt(mServiceType);
        out.writeInt(mTokenRate);
        out.writeInt(mTokenBucketSize);
        out.writeInt(mPeakBandwidth);
        out.writeInt(mLatency);
        out.writeInt(mDelayVariation);
    }
}
+33 −27
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package android.bluetooth;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.Arrays;

/**
 * Represents the Service Discovery Protocol (SDP) settings for a Bluetooth HID Device application.
@@ -31,11 +30,11 @@ import java.util.Arrays;
 */
public final class BluetoothHidDeviceAppSdpSettings implements Parcelable {

    public final String name;
    public final String description;
    public final String provider;
    public final byte subclass;
    public final byte[] descriptors;
    private final String mName;
    private final String mDescription;
    private final String mProvider;
    private final byte mSubclass;
    private final byte[] mDescriptors;

    /**
     * Create a BluetoothHidDeviceAppSdpSettings object for the Bluetooth SDP record.
@@ -52,24 +51,31 @@ public final class BluetoothHidDeviceAppSdpSettings implements Parcelable {
     */
    public BluetoothHidDeviceAppSdpSettings(
            String name, String description, String provider, byte subclass, byte[] descriptors) {
        this.name = name;
        this.description = description;
        this.provider = provider;
        this.subclass = subclass;
        this.descriptors = descriptors.clone();
        mName = name;
        mDescription = description;
        mProvider = provider;
        mSubclass = subclass;
        mDescriptors = descriptors.clone();
    }

    @Override
    public boolean equals(Object o) {
        if (o instanceof BluetoothHidDeviceAppSdpSettings) {
            BluetoothHidDeviceAppSdpSettings sdp = (BluetoothHidDeviceAppSdpSettings) o;
            return this.name.equals(sdp.name)
                    && this.description.equals(sdp.description)
                    && this.provider.equals(sdp.provider)
                    && this.subclass == sdp.subclass
                    && Arrays.equals(this.descriptors, sdp.descriptors);
    public String getName() {
        return mName;
    }

    public String getDescription() {
        return mDescription;
    }

    public String getProvider() {
        return mProvider;
    }

    public byte getSubclass() {
        return mSubclass;
    }
        return false;

    public byte[] getDescriptors() {
        return mDescriptors;
    }

    @Override
@@ -99,10 +105,10 @@ public final class BluetoothHidDeviceAppSdpSettings implements Parcelable {

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(name);
        out.writeString(description);
        out.writeString(provider);
        out.writeByte(subclass);
        out.writeByteArray(descriptors);
        out.writeString(mName);
        out.writeString(mDescription);
        out.writeString(mProvider);
        out.writeByte(mSubclass);
        out.writeByteArray(mDescriptors);
    }
}
+0 −120
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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;

import android.util.Log;

/**
 * The template class that applications use to call callback functions on events from the HID host.
 * Callback functions are wrapped in this class and registered to the Android system during app
 * registration.
 *
 * <p>{@see BluetoothHidDevice}
 */
public abstract class BluetoothHidDeviceCallback {

    private static final String TAG = "BluetoothHidDevCallback";

    /**
     * Callback called when application registration state changes. Usually it's called due to
     * either {@link BluetoothHidDevice#registerApp (String, String, String, byte, byte[],
     * BluetoothHidDeviceCallback)} or {@link BluetoothHidDevice#unregisterApp()} , but can be also
     * unsolicited in case e.g. Bluetooth was turned off in which case application is unregistered
     * automatically.
     *
     * @param pluggedDevice {@link BluetoothDevice} object which represents host that currently has
     *     Virtual Cable established with device. Only valid when application is registered, can be
     *     <code>null</code>.
     * @param registered <code>true</code> if application is registered, <code>false</code>
     *     otherwise.
     */
    public void onAppStatusChanged(BluetoothDevice pluggedDevice, boolean registered) {
        Log.d(TAG,
                "onAppStatusChanged: pluggedDevice=" + pluggedDevice + " registered=" + registered);
    }

    /**
     * Callback called when connection state with remote host was changed. Application can assume
     * than Virtual Cable is established when called with {@link BluetoothProfile#STATE_CONNECTED}
     * <code>state</code>.
     *
     * @param device {@link BluetoothDevice} object representing host device which connection state
     *     was changed.
     * @param state Connection state as defined in {@link BluetoothProfile}.
     */
    public void onConnectionStateChanged(BluetoothDevice device, int state) {
        Log.d(TAG, "onConnectionStateChanged: device=" + device + " state=" + state);
    }

    /**
     * Callback called when GET_REPORT is received from remote host. Should be replied by
     * application using {@link BluetoothHidDevice#replyReport(BluetoothDevice, byte, byte,
     * byte[])}.
     *
     * @param type Requested Report Type.
     * @param id Requested Report Id, can be 0 if no Report Id are defined in descriptor.
     * @param bufferSize Requested buffer size, application shall respond with at least given number
     *     of bytes.
     */
    public void onGetReport(BluetoothDevice device, byte type, byte id, int bufferSize) {
        Log.d(TAG, "onGetReport: device=" + device + " type=" + type + " id=" + id + " bufferSize="
                + bufferSize);
    }

    /**
     * Callback called when SET_REPORT is received from remote host. In case received data are
     * invalid, application shall respond with {@link
     * BluetoothHidDevice#reportError(BluetoothDevice, byte)}.
     *
     * @param type Report Type.
     * @param id Report Id.
     * @param data Report data.
     */
    public void onSetReport(BluetoothDevice device, byte type, byte id, byte[] data) {
        Log.d(TAG, "onSetReport: device=" + device + " type=" + type + " id=" + id);
    }

    /**
     * Callback called when SET_PROTOCOL is received from remote host. Application shall use this
     * information to send only reports valid for given protocol mode. By default, {@link
     * BluetoothHidDevice#PROTOCOL_REPORT_MODE} shall be assumed.
     *
     * @param protocol Protocol Mode.
     */
    public void onSetProtocol(BluetoothDevice device, byte protocol) {
        Log.d(TAG, "onSetProtocol: device=" + device + " protocol=" + protocol);
    }

    /**
     * Callback called when report data is received over interrupt channel. Report Type is assumed
     * to be {@link BluetoothHidDevice#REPORT_TYPE_OUTPUT}.
     *
     * @param reportId Report Id.
     * @param data Report data.
     */
    public void onInterruptData(BluetoothDevice device, byte reportId, byte[] data) {
        Log.d(TAG, "onInterruptData: device=" + device + " reportId=" + reportId);
    }

    /**
     * Callback called when Virtual Cable is removed. After this callback is
     * received connection will be disconnected automatically.
     */
    public void onVirtualCableUnplug(BluetoothDevice device) {
        Log.d(TAG, "onVirtualCableUnplug: device=" + device);
    }
}