summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2013-12-31 04:42:51 -0700
committerLinux Build Service Account <lnxbuild@localhost>2013-12-31 04:42:51 -0700
commite3fcb0e301c83e059b4d8109c4e116319fb667ad (patch)
treec5aeb4ee0530310f420a1f9c9d49762ba04a7b30
parent951f4f839d7e05419d8fd5908d0e6616d0166a36 (diff)
parent02834059ce3c2850034c6ec5b9acf3827979d4e4 (diff)
downloadandroid_packages_apps_BluetoothExt-e3fcb0e301c83e059b4d8109c4e116319fb667ad.tar.gz
android_packages_apps_BluetoothExt-e3fcb0e301c83e059b4d8109c4e116319fb667ad.tar.bz2
android_packages_apps_BluetoothExt-e3fcb0e301c83e059b4d8109c4e116319fb667ad.zip
Merge 02834059ce3c2850034c6ec5b9acf3827979d4e4 on remote branch
Change-Id: I41e6c05e3ffd6792fd78dcb997df46fb6fbbc427
-rw-r--r--hiddtestapp/src/org/codeaurora/bluetooth/hiddtestapp/HidWrapperService.java85
-rw-r--r--src/org/codeaurora/bluetooth/sap/BluetoothSapService.java20
2 files changed, 87 insertions, 18 deletions
diff --git a/hiddtestapp/src/org/codeaurora/bluetooth/hiddtestapp/HidWrapperService.java b/hiddtestapp/src/org/codeaurora/bluetooth/hiddtestapp/HidWrapperService.java
index 92ef97c..d88c4c2 100644
--- a/hiddtestapp/src/org/codeaurora/bluetooth/hiddtestapp/HidWrapperService.java
+++ b/hiddtestapp/src/org/codeaurora/bluetooth/hiddtestapp/HidWrapperService.java
@@ -97,6 +97,8 @@ public class HidWrapperService extends Service {
private SparseArray<ReportData> mInputReportCache = new SparseArray<ReportData>();
+ private SparseArray<ReportData> mOutputReportCache = new SparseArray<ReportData>();
+
public interface HidEventListener {
public void onApplicationState(boolean registered);
public void onPluggedDeviceChanged(BluetoothDevice device);
@@ -199,6 +201,29 @@ public class HidWrapperService extends Service {
public void onGetReport(byte type, byte id, int bufferSize) {
if (type == BluetoothHidDevice.REPORT_TYPE_INPUT) {
mHandler.obtainMessage(MESSAGE_GET_REPORT_RECEIVED, id, bufferSize).sendToTarget();
+ } else if (type == BluetoothHidDevice.REPORT_TYPE_OUTPUT) {
+ if (id != mKeyboardWrapper.getReportId(BluetoothHidDevice.REPORT_TYPE_OUTPUT)) {
+ Log.v(TAG, "onGetReport(), output report for invalid id = " + id);
+ mHidDevice.reportError();
+ } else {
+ ReportData rd = mOutputReportCache.get(id);
+ if (rd == null) {
+ /* No output report received with particular report id, report default
+ * values */
+ byte[] mBuffer = new byte[8];
+ Log.v(TAG, "get_report id for keyboard");
+ for (int i = 0; i < 8; i++) {
+ mBuffer[i] = 0x00;
+ }
+ mHidDevice.replyReport(BluetoothHidDevice.REPORT_TYPE_OUTPUT, id, mBuffer);
+ } else {
+ mHidDevice.replyReport(BluetoothHidDevice.REPORT_TYPE_OUTPUT, id, rd.data);
+ }
+ }
+ } else {
+ Log.v(TAG, "onGetReport(), unsupported report type = " + type);
+ /* Unsupported report type */
+ mHidDevice.reportError();
}
}
};
@@ -226,6 +251,8 @@ public class HidWrapperService extends Service {
break;
case MESSAGE_DEV_CONNECTED:
+ mInputReportCache.clear();
+ mOutputReportCache.clear();
mBatteryWrapper.update(mBatteryLevel);
break;
@@ -244,6 +271,33 @@ public class HidWrapperService extends Service {
if (rd != null) {
mHidDevice.replyReport(BluetoothHidDevice.REPORT_TYPE_INPUT, id, rd.data);
+ } else {
+ rd = new ReportData();
+ /* Report id not in cache, send default values if id is valid */
+ if (id == mKeyboardWrapper.getReportId(
+ BluetoothHidDevice.REPORT_TYPE_INPUT)) {
+ byte[] mBuffer = new byte[8];
+ Log.v(TAG, "get_report id for keyboard");
+ for (int i = 0; i < 8; i++) {
+ mBuffer[i] = 0x00;
+ }
+ storeReport(id, mBuffer, true);
+ mHidDevice.replyReport(BluetoothHidDevice.REPORT_TYPE_INPUT,
+ id, mBuffer);
+ } else if (id == mMouseWrapper.getReportId()) {
+ byte[] mBuffer = new byte[4];
+ Log.v(TAG, "get_report id for mouse");
+ for (int i = 0; i < 4; i++) {
+ mBuffer[i] = 0x00;
+ }
+ storeReport(id, mBuffer, true);
+ mHidDevice.replyReport(BluetoothHidDevice.REPORT_TYPE_INPUT,
+ id, mBuffer);
+ } else {
+ /* Invalid Report Id */
+ Log.v(TAG, "Get Report for Invalid report id = " + id);
+ mHidDevice.reportError();
+ }
}
break;
}
@@ -295,7 +349,7 @@ public class HidWrapperService extends Service {
mBuffer[2] = dy;
byte id = getReportId();
- storeInputReport(id, mBuffer);
+ storeReport(id, mBuffer, true);
mHidDevice.sendReport(id, mBuffer);
}
@@ -305,7 +359,7 @@ public class HidWrapperService extends Service {
mBuffer[2] = 0;
byte id = getReportId();
- storeInputReport(id, mBuffer);
+ storeReport(id, mBuffer, true);
mHidDevice.sendReport(id, mBuffer);
}
@@ -315,7 +369,7 @@ public class HidWrapperService extends Service {
mBuffer[2] = 0;
byte id = getReportId();
- storeInputReport(id, mBuffer);
+ storeReport(id, mBuffer, true);
mHidDevice.sendReport(id, mBuffer);
}
@@ -323,7 +377,7 @@ public class HidWrapperService extends Service {
mBuffer[3] = delta;
byte id = getReportId();
- storeInputReport(id, mBuffer);
+ storeReport(id, mBuffer, true);
mHidDevice.sendReport(id, mBuffer);
// reset to 0 after sending so it won't self-repeat in subsequent
@@ -366,7 +420,7 @@ public class HidWrapperService extends Service {
}
byte id = getReportId(BluetoothHidDevice.REPORT_TYPE_INPUT);
- storeInputReport(id, mBuffer);
+ storeReport(id, mBuffer, true);
mHidDevice.sendReport(id, mBuffer);
}
@@ -385,7 +439,7 @@ public class HidWrapperService extends Service {
}
byte id = getReportId(BluetoothHidDevice.REPORT_TYPE_INPUT);
- storeInputReport(id, mBuffer);
+ storeReport(id, mBuffer, true);
mHidDevice.sendReport(id, mBuffer);
}
@@ -394,6 +448,7 @@ public class HidWrapperService extends Service {
return;
byte leds = data[0];
+ storeReport(reportId, data, false);
callback.onKeyboardLedState(
(leds & HidConsts.KEYBOARD_LED_NUM_LOCK) != 0,
@@ -421,7 +476,7 @@ public class HidWrapperService extends Service {
mBuffer[0] = (byte) (val & 0xff);
if (mHidDevice != null) {
- storeInputReport(HidConsts.BATTERY_REPORT_ID, mBuffer);
+ storeReport(HidConsts.BATTERY_REPORT_ID, mBuffer, true);
mHidDevice.sendReport(HidConsts.BATTERY_REPORT_ID, mBuffer);
}
}
@@ -549,12 +604,22 @@ public class HidWrapperService extends Service {
return mPluggedDevice;
}
- private void storeInputReport(byte reportId, byte[] data) {
- ReportData rd = mInputReportCache.get(reportId);
+ private void storeReport(byte reportId, byte[] data, boolean inputReport) {
+ ReportData rd;
+
+ if (inputReport) {
+ rd = mInputReportCache.get(reportId);
+ } else {
+ rd = mOutputReportCache.get(reportId);
+ }
if (rd == null) {
rd = new ReportData();
- mInputReportCache.put(reportId, rd);
+ if (inputReport) {
+ mInputReportCache.put(reportId, rd);
+ } else {
+ mOutputReportCache.put(reportId, rd);
+ }
}
rd.data = data.clone();
diff --git a/src/org/codeaurora/bluetooth/sap/BluetoothSapService.java b/src/org/codeaurora/bluetooth/sap/BluetoothSapService.java
index 7a371cc..ab754e0 100644
--- a/src/org/codeaurora/bluetooth/sap/BluetoothSapService.java
+++ b/src/org/codeaurora/bluetooth/sap/BluetoothSapService.java
@@ -463,18 +463,22 @@ public class BluetoothSapService extends Service {
} else {
removeTimeoutMsg = false;
}
- } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED) &&
- mIsWaitingAuthorization) {
+ } else if (action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) {
if (mRemoteDevice == null) {
- Log.e(TAG, "Unexpected error!");
- return;
+ Log.e(TAG, "Unexpected error!");
+ return;
}
if (mSapHandler != null) {
- /* Let the user timeout handle this case as well */
- mSapHandler.sendMessage(mSapHandler.obtainMessage(MESSAGE_SAP_USER_TIMEOUT));
- removeTimeoutMsg = false;
+ /* Let the user timeout handle this case as well */
+ if (mIsWaitingAuthorization) {
+ mSapHandler.sendMessage(mSapHandler.obtainMessage(MESSAGE_SAP_USER_TIMEOUT));
+ removeTimeoutMsg = false;
+ } else {
+ mSapHandler.sendMessage(mSapHandler.obtainMessage(SAP_CRTL_MSG_DISCONNECT_REQ));
+ closeRfcommSocket();
+ startRfcommListenerThread();
+ }
}
-
} else if (action.equals(SAP_ACCESS_ALLOWED_ACTION)) {
if (mRemoteDevice == null) {
Log.e(TAG, "Unexpected error!");