Merge "b/2335780 Fixed race conditions which causes BT to not be in the correct state in respect to the dock state. DO NOT MERGE" into eclair
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.bluetooth;
|
package com.android.settings.bluetooth;
|
||||||
|
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -35,9 +36,11 @@ public class DockEventReceiver extends BroadcastReceiver {
|
|||||||
|
|
||||||
private static final int EXTRA_INVALID = -1234;
|
private static final int EXTRA_INVALID = -1234;
|
||||||
|
|
||||||
static final Object mStartingServiceSync = new Object();
|
private static final Object mStartingServiceSync = new Object();
|
||||||
|
|
||||||
static PowerManager.WakeLock mStartingService;
|
private static final long WAKELOCK_TIMEOUT = 5000;
|
||||||
|
|
||||||
|
private static PowerManager.WakeLock mStartingService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@@ -84,14 +87,12 @@ public class DockEventReceiver extends BroadcastReceiver {
|
|||||||
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||||
mStartingService = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
mStartingService = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
||||||
"StartingDockService");
|
"StartingDockService");
|
||||||
mStartingService.setReferenceCounted(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mStartingService.acquire();
|
mStartingService.acquire(WAKELOCK_TIMEOUT);
|
||||||
|
|
||||||
if (context.startService(intent) == null) {
|
if (context.startService(intent) == null) {
|
||||||
Log.e(TAG, "Can't start DockService");
|
Log.e(TAG, "Can't start DockService");
|
||||||
mStartingService.release();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,9 +105,7 @@ public class DockEventReceiver extends BroadcastReceiver {
|
|||||||
synchronized (mStartingServiceSync) {
|
synchronized (mStartingServiceSync) {
|
||||||
if (mStartingService != null) {
|
if (mStartingService != null) {
|
||||||
if (DEBUG) Log.d(TAG, "stopSelf id = "+ startId);
|
if (DEBUG) Log.d(TAG, "stopSelf id = "+ startId);
|
||||||
if (service.stopSelfResult(startId)) {
|
service.stopSelfResult(startId);
|
||||||
mStartingService.release();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,12 +16,8 @@
|
|||||||
|
|
||||||
package com.android.settings.bluetooth;
|
package com.android.settings.bluetooth;
|
||||||
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
@@ -42,13 +38,15 @@ import android.view.WindowManager;
|
|||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
|
||||||
|
|
||||||
public class DockService extends Service implements AlertDialog.OnMultiChoiceClickListener,
|
public class DockService extends Service implements AlertDialog.OnMultiChoiceClickListener,
|
||||||
DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
|
DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
|
||||||
CompoundButton.OnCheckedChangeListener {
|
CompoundButton.OnCheckedChangeListener {
|
||||||
|
|
||||||
private static final String TAG = "DockService";
|
private static final String TAG = "DockService";
|
||||||
|
|
||||||
// TODO clean up logs. Disable DEBUG flag for this file and receiver's too
|
|
||||||
private static final boolean DEBUG = false;
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
// Time allowed for the device to be undocked and redocked without severing
|
// Time allowed for the device to be undocked and redocked without severing
|
||||||
@@ -166,7 +164,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This method gets messages from both onStartCommand and mServiceHandler/mServiceLooper
|
// This method gets messages from both onStartCommand and mServiceHandler/mServiceLooper
|
||||||
void processMessage(Message msg) {
|
private synchronized void processMessage(Message msg) {
|
||||||
int msgType = msg.what;
|
int msgType = msg.what;
|
||||||
int state = msg.arg1;
|
int state = msg.arg1;
|
||||||
int startId = msg.arg2;
|
int startId = msg.arg2;
|
||||||
@@ -424,7 +422,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private void applyBtSettings(final BluetoothDevice device, int startId) {
|
private synchronized void applyBtSettings(final BluetoothDevice device, int startId) {
|
||||||
if (device == null || mProfiles == null || mCheckedItems == null)
|
if (device == null || mProfiles == null || mCheckedItems == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -465,14 +463,13 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
for (int i = 0; i < mProfiles.length; i++) {
|
for (int i = 0; i < mProfiles.length; i++) {
|
||||||
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
|
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
|
||||||
.getProfileManager(mBtManager, mProfiles[i]);
|
.getProfileManager(mBtManager, mProfiles[i]);
|
||||||
boolean isConnected = profileManager.isConnected(device);
|
|
||||||
|
|
||||||
if (DEBUG) Log.d(TAG, mProfiles[i].toString() + " = " + mCheckedItems[i]);
|
if (DEBUG) Log.d(TAG, mProfiles[i].toString() + " = " + mCheckedItems[i]);
|
||||||
|
|
||||||
if (mCheckedItems[i] && !isConnected) {
|
if (mCheckedItems[i]) {
|
||||||
// Checked but not connected
|
// Checked but not connected
|
||||||
callConnect = true;
|
callConnect = true;
|
||||||
} else if (!mCheckedItems[i] && isConnected) {
|
} else if (!mCheckedItems[i]) {
|
||||||
// Unchecked but connected
|
// Unchecked but connected
|
||||||
if (DEBUG) Log.d(TAG, "applyBtSettings - Disconnecting");
|
if (DEBUG) Log.d(TAG, "applyBtSettings - Disconnecting");
|
||||||
cachedDevice.disconnect(mProfiles[i]);
|
cachedDevice.disconnect(mProfiles[i]);
|
||||||
@@ -491,7 +488,7 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleUndocked(Context context, LocalBluetoothManager localManager,
|
private synchronized void handleUndocked(Context context, LocalBluetoothManager localManager,
|
||||||
BluetoothDevice device) {
|
BluetoothDevice device) {
|
||||||
if (mDialog != null) {
|
if (mDialog != null) {
|
||||||
mDialog.dismiss();
|
mDialog.dismiss();
|
||||||
@@ -513,20 +510,4 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
|
|||||||
}
|
}
|
||||||
return cachedBluetoothDevice;
|
return cachedBluetoothDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO Delete this method if not needed.
|
|
||||||
private Notification getNotification(Service service) {
|
|
||||||
CharSequence title = service.getString(R.string.dock_settings_title);
|
|
||||||
|
|
||||||
Notification n = new Notification(R.drawable.ic_bt_headphones_a2dp, title, System
|
|
||||||
.currentTimeMillis());
|
|
||||||
|
|
||||||
CharSequence contentText = service.getString(R.string.dock_settings_summary);
|
|
||||||
Intent notificationIntent = new Intent(service, DockEventReceiver.class);
|
|
||||||
notificationIntent.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
|
|
||||||
PendingIntent pendingIntent = PendingIntent.getActivity(service, 0, notificationIntent, 0);
|
|
||||||
|
|
||||||
n.setLatestEventInfo(service, title, contentText, pendingIntent);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user