package andraus.bluetoothhidemu.view;
import java.util.Comparator;
import andraus.bluetoothhidemu.spoof.Spoof.SpoofMode;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
public class BluetoothDeviceView {
private BluetoothDevice mBluetoothDevice = null;
private SpoofMode mSpoofMode;
private String mOverridenName = null;
/**
* Returns a "null" BluetoothDevice. Used to add a dummy item to the arraylist
*
* @param name
* @return
*/
public static BluetoothDeviceView getNullBluetoothDeviceView(String name) {
BluetoothDeviceView device = new BluetoothDeviceView(name);
return device;
}
/**
* Private constructor to get a dummy null BluetoothDeviceView
* @param name
*/
private BluetoothDeviceView (String name) {
this(null, SpoofMode.HID_GENERIC);
mOverridenName = name;
}
/**
* Note: bluetoothDevice may be a null value. This bean will handle properly such scenario
*
* @param bluetoothDevice
* @param spoofMode
*/
public BluetoothDeviceView(BluetoothDevice bluetoothDevice, SpoofMode spoofMode) {
super();
mBluetoothDevice = bluetoothDevice;
mSpoofMode = spoofMode;
}
public BluetoothDevice getBluetoothDevice() {
return mBluetoothDevice;
}
public SpoofMode getSpoofMode() {
return mSpoofMode;
}
public void setBluetoothDevice(BluetoothDevice bluetoothDevice) {
mBluetoothDevice = bluetoothDevice;
}
public String getAddress() {
return (mBluetoothDevice != null) ? mBluetoothDevice.getAddress() : "";
}
public String getName() {
return (mBluetoothDevice != null) ? mBluetoothDevice.getName() : mOverridenName;
}
@Override
public boolean equals(Object o) {
return mBluetoothDevice != null ? mBluetoothDevice.getAddress().equals(((BluetoothDeviceView)o).getAddress()) : false;
}
@Override
public String toString() {
if (mBluetoothDevice != null) {
String name = mBluetoothDevice.getName();
return name != null && !"".equals(name) ? name : mBluetoothDevice.getAddress();
} else {
return mOverridenName;
}
}
/**
* logString()
*
* @return
*/
public String logString() {
return toString() + " | " + mSpoofMode;
}
/**
* comparator
*
* @return
*/
public static Comparator<BluetoothDeviceView> getComparator() {
Comparator<BluetoothDeviceView> comparator = new Comparator<BluetoothDeviceView>() {
public int compare(BluetoothDeviceView device1, BluetoothDeviceView device2) {
String s1 = device1.isNull() ? "" : device1.getName();
String s2 = device2.isNull() ? "" : device2.getName();
return s1.compareTo(s2);
}
};
return comparator;
}
/**
*
* @return
*/
public boolean isNull() {
return mBluetoothDevice == null;
}
private static final int PS3_MAJOR_MINOR = 0x0108;
private static final int[] PS3_SVC_LIST = { BluetoothClass.Service.RENDER,
BluetoothClass.Service.CAPTURE,
BluetoothClass.Service.AUDIO };
/**
* Checks wether the specified device is a PS3 host. Weirdly enough, the PS3 reports
* a device class of 0x2c0108:
*
* Which means:
* - service (0x2c): Rendering | Capturing | Audio
* - major # (0x01): Computer
* - minor # (0x08): Server-class computer
*
* This setup seems rather generic for the ps3, however it will have to do for now.
* Another option, would be to check the bluetooth MAC prefix, which identifies the
* adapter vendor. CECHGxx units seems to be built with Alps Co. adapters (00:1B:FB)
* But to check it now could refrain this to work on other unchecked units.
*
* So, currently we will only check for service/major/minor.
*
* @param device
* @return
*/
public static boolean isBluetoothDevicePs3(BluetoothDevice device) {
if (device == null) {
return false;
}
BluetoothClass bluetoothClass = device.getBluetoothClass();
boolean isPs3 = PS3_MAJOR_MINOR == bluetoothClass.getDeviceClass();
int i = 0;
while (isPs3 && i < PS3_SVC_LIST.length) {
isPs3 = isPs3 && bluetoothClass.hasService(PS3_SVC_LIST[i]);
i++;
}
return isPs3;
}
/**
* Checks wether if the current device is a PS3
* @return
*/
public boolean isPs3() {
return isBluetoothDevicePs3(mBluetoothDevice);
}
}