diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2013-12-31 04:42:51 -0700 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2013-12-31 04:42:51 -0700 |
commit | e3fcb0e301c83e059b4d8109c4e116319fb667ad (patch) | |
tree | c5aeb4ee0530310f420a1f9c9d49762ba04a7b30 | |
parent | 951f4f839d7e05419d8fd5908d0e6616d0166a36 (diff) | |
parent | 02834059ce3c2850034c6ec5b9acf3827979d4e4 (diff) | |
download | android_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.java | 85 | ||||
-rw-r--r-- | src/org/codeaurora/bluetooth/sap/BluetoothSapService.java | 20 |
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!"); |