Automated import from //branches/donutburger/...@140897,140897
This commit is contained in:

committed by
The Android Open Source Project
parent
b22cc18118
commit
097ed6c671
@@ -126,36 +126,7 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
|
|||||||
private void queueCommand(BluetoothJob job) {
|
private void queueCommand(BluetoothJob job) {
|
||||||
Log.d(TAG, workQueue.toString());
|
Log.d(TAG, workQueue.toString());
|
||||||
synchronized (workQueue) {
|
synchronized (workQueue) {
|
||||||
boolean processNow = false;
|
boolean processNow = pruneQueue(job);
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
|
|
||||||
Iterator<BluetoothJob> it = workQueue.iterator();
|
|
||||||
while (it.hasNext()) {
|
|
||||||
BluetoothJob existingJob = it.next();
|
|
||||||
|
|
||||||
// Remove any pending CONNECTS when we receive a DISCONNECT
|
|
||||||
if (job.command == BluetoothCommand.DISCONNECT) {
|
|
||||||
if (existingJob.timeSent == 0
|
|
||||||
&& existingJob.command == BluetoothCommand.CONNECT
|
|
||||||
&& existingJob.device.mAddress.equals(job.device.mAddress)
|
|
||||||
&& existingJob.profile == job.profile) {
|
|
||||||
it.remove();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Defensive Code: Remove any job that older than a preset time.
|
|
||||||
// We never got a call back. It is better to have overlapping
|
|
||||||
// calls than to get stuck.
|
|
||||||
Log.d(TAG, "Age:" + (now - existingJob.timeSent));
|
|
||||||
if (existingJob.timeSent != 0
|
|
||||||
&& (now - existingJob.timeSent) >= MAX_WAIT_TIME_FOR_FRAMEWORK) {
|
|
||||||
Log.w(TAG, "Timeout. Removing Job:" + existingJob.toString());
|
|
||||||
it.remove();
|
|
||||||
processNow = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add job to queue
|
// Add job to queue
|
||||||
Log.d(TAG, "Adding: " + job.toString());
|
Log.d(TAG, "Adding: " + job.toString());
|
||||||
@@ -172,6 +143,40 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean pruneQueue(BluetoothJob job) {
|
||||||
|
boolean removedStaleItems = false;
|
||||||
|
long now = System.currentTimeMillis();
|
||||||
|
Iterator<BluetoothJob> it = workQueue.iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
BluetoothJob existingJob = it.next();
|
||||||
|
|
||||||
|
// Remove any pending CONNECTS when we receive a DISCONNECT
|
||||||
|
if (job != null && job.command == BluetoothCommand.DISCONNECT) {
|
||||||
|
if (existingJob.timeSent == 0
|
||||||
|
&& existingJob.command == BluetoothCommand.CONNECT
|
||||||
|
&& existingJob.device.mAddress.equals(job.device.mAddress)
|
||||||
|
&& existingJob.profile == job.profile) {
|
||||||
|
Log.d(TAG, "Removed because of a pending disconnect. " + existingJob);
|
||||||
|
it.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Defensive Code: Remove any job that older than a preset time.
|
||||||
|
// We never got a call back. It is better to have overlapping
|
||||||
|
// calls than to get stuck.
|
||||||
|
Log.d(TAG, "Age:" + (now - existingJob.timeSent));
|
||||||
|
if (existingJob.timeSent != 0
|
||||||
|
&& (now - existingJob.timeSent) >= MAX_WAIT_TIME_FOR_FRAMEWORK) {
|
||||||
|
Log.w(TAG, "Timeout. Removing Job:" + existingJob.toString());
|
||||||
|
it.remove();
|
||||||
|
removedStaleItems = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return removedStaleItems;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean processCommand(BluetoothJob job) {
|
private boolean processCommand(BluetoothJob job) {
|
||||||
boolean successful = false;
|
boolean successful = false;
|
||||||
if (job.timeSent == 0) {
|
if (job.timeSent == 0) {
|
||||||
@@ -199,15 +204,29 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onProfileStateChanged() {
|
public void onProfileStateChanged() {
|
||||||
// Remove the first item and process the next one
|
Log.d(TAG, "onProfileStateChanged:" + workQueue.toString());
|
||||||
BluetoothJob job = workQueue.poll();
|
BluetoothJob job = workQueue.peek();
|
||||||
if (job == null) {
|
if (job == null) {
|
||||||
Log.w(TAG, "Yikes, onProfileStateChanged called but job queue is empty");
|
Log.v(TAG, "Yikes, onProfileStateChanged called but job queue is empty. "
|
||||||
|
+ "(Okay for device initiated actions and BluetoothA2dpService initiated "
|
||||||
|
+ "Auto-connections)");
|
||||||
|
return;
|
||||||
} else if (job.device.mAddress != mAddress) {
|
} else if (job.device.mAddress != mAddress) {
|
||||||
Log.w(TAG, "Yikes, onProfileStateChanged called but the address differ. this.mAddress="
|
// This can happen in 2 cases: 1) BT device initiated pairing and
|
||||||
|
// 2) disconnects of one headset that's triggered by connects of
|
||||||
|
// another.
|
||||||
|
Log.v(TAG, "onProfileStateChanged called. The addresses differ. this.mAddress="
|
||||||
+ mAddress + " workQueue.head=" + job.toString());
|
+ mAddress + " workQueue.head=" + job.toString());
|
||||||
|
|
||||||
|
// Check to see if we need to remove the stale items from the queue
|
||||||
|
if (!pruneQueue(null)) {
|
||||||
|
// nothing in the queue was modify. Just ignore the notification and return.
|
||||||
|
return;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Remove the first item and process the next one
|
||||||
Log.d(TAG, "LocalBluetoothDevice.onProfileStateChanged() called. MAC addr matched");
|
Log.d(TAG, "LocalBluetoothDevice.onProfileStateChanged() called. MAC addr matched");
|
||||||
|
workQueue.poll();
|
||||||
}
|
}
|
||||||
|
|
||||||
processCommands();
|
processCommands();
|
||||||
@@ -221,6 +240,7 @@ public class LocalBluetoothDevice implements Comparable<LocalBluetoothDevice> {
|
|||||||
* notification when it finishes processing a command
|
* notification when it finishes processing a command
|
||||||
*/
|
*/
|
||||||
private void processCommands() {
|
private void processCommands() {
|
||||||
|
Log.d(TAG, "processCommands:" + workQueue.toString());
|
||||||
Iterator<BluetoothJob> it = workQueue.iterator();
|
Iterator<BluetoothJob> it = workQueue.iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
BluetoothJob job = it.next();
|
BluetoothJob job = it.next();
|
||||||
|
Reference in New Issue
Block a user