Merge \"Guard concurrent accesses to BluetoothA2dp service object\" into nyc-mr1-dev

am: 30ec4f2732

Change-Id: Ie9bcb2474c002b8118666c413d864b05eaf0245c
This commit is contained in:
Calvin On
2016-06-22 02:38:11 +00:00
committed by android-build-merger

View File

@@ -30,8 +30,11 @@ import android.os.ParcelUuid;
import android.os.RemoteException;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
@@ -114,7 +117,8 @@ public final class BluetoothA2dp implements BluetoothProfile {
private Context mContext;
private ServiceListener mServiceListener;
private IBluetoothA2dp mService;
private final ReentrantReadWriteLock mServiceLock = new ReentrantReadWriteLock();
@GuardedBy("mServiceLock") private IBluetoothA2dp mService;
private BluetoothAdapter mAdapter;
final private IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
@@ -122,25 +126,27 @@ public final class BluetoothA2dp implements BluetoothProfile {
public void onBluetoothStateChange(boolean up) {
if (DBG) Log.d(TAG, "onBluetoothStateChange: up=" + up);
if (!up) {
if (VDBG) Log.d(TAG,"Unbinding service...");
synchronized (mConnection) {
try {
mService = null;
mContext.unbindService(mConnection);
} catch (Exception re) {
Log.e(TAG,"",re);
}
if (VDBG) Log.d(TAG, "Unbinding service...");
try {
mServiceLock.writeLock().lock();
mService = null;
mContext.unbindService(mConnection);
} catch (Exception re) {
Log.e(TAG, "", re);
} finally {
mServiceLock.writeLock().unlock();
}
} else {
synchronized (mConnection) {
try {
if (mService == null) {
if (VDBG) Log.d(TAG,"Binding service...");
doBind();
}
} catch (Exception re) {
Log.e(TAG,"",re);
try {
mServiceLock.readLock().lock();
if (mService == null) {
if (VDBG) Log.d(TAG,"Binding service...");
doBind();
}
} catch (Exception re) {
Log.e(TAG,"",re);
} finally {
mServiceLock.readLock().unlock();
}
}
}
@@ -189,15 +195,16 @@ public final class BluetoothA2dp implements BluetoothProfile {
}
}
synchronized (mConnection) {
try {
mServiceLock.writeLock().lock();
if (mService != null) {
try {
mService = null;
mContext.unbindService(mConnection);
} catch (Exception re) {
Log.e(TAG,"",re);
}
mService = null;
mContext.unbindService(mConnection);
}
} catch (Exception re) {
Log.e(TAG, "", re);
} finally {
mServiceLock.writeLock().unlock();
}
}
@@ -229,17 +236,20 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
if (mService != null && isEnabled() &&
isValidDevice(device)) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled() &&
isValidDevice(device)) {
return mService.connect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
/**
@@ -270,17 +280,20 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
if (mService != null && isEnabled() &&
isValidDevice(device)) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled() &&
isValidDevice(device)) {
return mService.disconnect(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
/**
@@ -288,16 +301,19 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public List<BluetoothDevice> getConnectedDevices() {
if (VDBG) log("getConnectedDevices()");
if (mService != null && isEnabled()) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()) {
return mService.getConnectedDevices();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
/**
@@ -305,16 +321,19 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
if (VDBG) log("getDevicesMatchingStates()");
if (mService != null && isEnabled()) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()) {
return mService.getDevicesMatchingConnectionStates(states);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return new ArrayList<BluetoothDevice>();
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return new ArrayList<BluetoothDevice>();
}
/**
@@ -322,17 +341,20 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public int getConnectionState(BluetoothDevice device) {
if (VDBG) log("getState(" + device + ")");
if (mService != null && isEnabled()
&& isValidDevice(device)) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()
&& isValidDevice(device)) {
return mService.getConnectionState(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.STATE_DISCONNECTED;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.STATE_DISCONNECTED;
}
/**
@@ -352,21 +374,24 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public boolean setPriority(BluetoothDevice device, int priority) {
if (DBG) log("setPriority(" + device + ", " + priority + ")");
if (mService != null && isEnabled()
&& isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF &&
priority != BluetoothProfile.PRIORITY_ON){
return false;
}
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()
&& isValidDevice(device)) {
if (priority != BluetoothProfile.PRIORITY_OFF &&
priority != BluetoothProfile.PRIORITY_ON) {
return false;
}
return mService.setPriority(device, priority);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
/**
@@ -385,17 +410,20 @@ public final class BluetoothA2dp implements BluetoothProfile {
@RequiresPermission(Manifest.permission.BLUETOOTH)
public int getPriority(BluetoothDevice device) {
if (VDBG) log("getPriority(" + device + ")");
if (mService != null && isEnabled()
&& isValidDevice(device)) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()
&& isValidDevice(device)) {
return mService.getPriority(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.PRIORITY_OFF;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.PRIORITY_OFF;
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return BluetoothProfile.PRIORITY_OFF;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return BluetoothProfile.PRIORITY_OFF;
}
/**
@@ -406,16 +434,19 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public boolean isAvrcpAbsoluteVolumeSupported() {
if (DBG) Log.d(TAG, "isAvrcpAbsoluteVolumeSupported");
if (mService != null && isEnabled()) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()) {
return mService.isAvrcpAbsoluteVolumeSupported();
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in isAvrcpAbsoluteVolumeSupported()", e);
return false;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in isAvrcpAbsoluteVolumeSupported()", e);
return false;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
/**
@@ -433,16 +464,17 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public void adjustAvrcpAbsoluteVolume(int direction) {
if (DBG) Log.d(TAG, "adjustAvrcpAbsoluteVolume");
if (mService != null && isEnabled()) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()) {
mService.adjustAvrcpAbsoluteVolume(direction);
return;
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in adjustAvrcpAbsoluteVolume()", e);
return;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in adjustAvrcpAbsoluteVolume()", e);
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
}
/**
@@ -453,16 +485,17 @@ public final class BluetoothA2dp implements BluetoothProfile {
*/
public void setAvrcpAbsoluteVolume(int volume) {
if (DBG) Log.d(TAG, "setAvrcpAbsoluteVolume");
if (mService != null && isEnabled()) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()) {
mService.setAvrcpAbsoluteVolume(volume);
return;
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in setAvrcpAbsoluteVolume()", e);
return;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
} catch (RemoteException e) {
Log.e(TAG, "Error talking to BT service in setAvrcpAbsoluteVolume()", e);
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
}
/**
@@ -473,17 +506,20 @@ public final class BluetoothA2dp implements BluetoothProfile {
* @param device BluetoothDevice device
*/
public boolean isA2dpPlaying(BluetoothDevice device) {
if (mService != null && isEnabled()
&& isValidDevice(device)) {
try {
try {
mServiceLock.readLock().lock();
if (mService != null && isEnabled()
&& isValidDevice(device)) {
return mService.isA2dpPlaying(device);
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
} catch (RemoteException e) {
Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable()));
return false;
} finally {
mServiceLock.readLock().unlock();
}
if (mService == null) Log.w(TAG, "Proxy not attached to service");
return false;
}
/**
@@ -534,7 +570,12 @@ public final class BluetoothA2dp implements BluetoothProfile {
private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) Log.d(TAG, "Proxy object connected");
mService = IBluetoothA2dp.Stub.asInterface(service);
try {
mServiceLock.writeLock().lock();
mService = IBluetoothA2dp.Stub.asInterface(service);
} finally {
mServiceLock.writeLock().unlock();
}
if (mServiceListener != null) {
mServiceListener.onServiceConnected(BluetoothProfile.A2DP, BluetoothA2dp.this);
@@ -542,7 +583,12 @@ public final class BluetoothA2dp implements BluetoothProfile {
}
public void onServiceDisconnected(ComponentName className) {
if (DBG) Log.d(TAG, "Proxy object disconnected");
mService = null;
try {
mServiceLock.writeLock().lock();
mService = null;
} finally {
mServiceLock.writeLock().unlock();
}
if (mServiceListener != null) {
mServiceListener.onServiceDisconnected(BluetoothProfile.A2DP);
}