am ebf6fc60: Merge "Stops BLE scan when scan only mode is disabled." into mnc-dev

* commit 'ebf6fc60b51ecf27f0a8f2c062a4644a4174b187':
  Stops BLE scan when scan only mode is disabled.
This commit is contained in:
Wei Wang
2015-06-12 17:32:54 +00:00
committed by Android Git Automerger

View File

@@ -21,8 +21,8 @@ import android.app.ActivityManager;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProfile;
import android.bluetooth.IBluetooth; import android.bluetooth.IBluetooth;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothCallback; import android.bluetooth.IBluetoothCallback;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothHeadset; import android.bluetooth.IBluetoothHeadset;
import android.bluetooth.IBluetoothManager; import android.bluetooth.IBluetoothManager;
import android.bluetooth.IBluetoothManagerCallback; import android.bluetooth.IBluetoothManagerCallback;
@@ -37,6 +37,7 @@ import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.os.Binder; import android.os.Binder;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
@@ -56,11 +57,8 @@ import android.util.Log;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.*;
class BluetoothManagerService extends IBluetoothManager.Stub { class BluetoothManagerService extends IBluetoothManager.Stub {
private static final String TAG = "BluetoothManagerService"; private static final String TAG = "BluetoothManagerService";
private static final boolean DBG = true; private static final boolean DBG = true;
@@ -259,6 +257,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
mName = null; mName = null;
mErrorRecoveryRetryCounter = 0; mErrorRecoveryRetryCounter = 0;
mContentResolver = context.getContentResolver(); mContentResolver = context.getContentResolver();
// Observe BLE scan only mode settings change.
registerForBleScanModeChange();
mCallbacks = new RemoteCallbackList<IBluetoothManagerCallback>(); mCallbacks = new RemoteCallbackList<IBluetoothManagerCallback>();
mStateChangeCallbacks = new RemoteCallbackList<IBluetoothStateChangeCallback>(); mStateChangeCallbacks = new RemoteCallbackList<IBluetoothStateChangeCallback>();
IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED); IntentFilter filter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
@@ -458,6 +458,40 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
return false; return false;
} }
// Monitor change of BLE scan only mode settings.
private void registerForBleScanModeChange() {
ContentObserver contentObserver = new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
if (!isBleScanAlwaysAvailable()) {
disableBleScanMode();
clearBleApps();
try {
if (mBluetooth != null) mBluetooth.onBrEdrDown();
} catch (RemoteException e) {
Log.e(TAG, "error when disabling bluetooth", e);
}
}
}
};
mContentResolver.registerContentObserver(
Settings.Global.getUriFor(Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE),
false, contentObserver);
}
// Disable ble scan only mode.
private void disableBleScanMode() {
try {
if (mBluetooth != null && (mBluetooth.getState() != BluetoothAdapter.STATE_ON)) {
if (DBG) Log.d(TAG, "Reseting the mEnable flag for clean disable");
mEnable = false;
}
} catch (RemoteException e) {
Log.e(TAG, "getState()", e);
}
}
public int updateBleAppCount(IBinder token, boolean enable) { public int updateBleAppCount(IBinder token, boolean enable) {
if (enable) { if (enable) {
ClientDeathRecipient r = mBleApps.get(token); ClientDeathRecipient r = mBleApps.get(token);
@@ -478,11 +512,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
} else { } else {
ClientDeathRecipient r = mBleApps.get(token); ClientDeathRecipient r = mBleApps.get(token);
if (r != null) { if (r != null) {
try { // Unregister death recipient as the app goes away.
token.linkToDeath(r, 0); token.unlinkToDeath(r, 0);
} catch (RemoteException ex) {
throw new IllegalArgumentException("Wake lock is already dead.");
}
mBleApps.remove(token); mBleApps.remove(token);
synchronized (this) { synchronized (this) {
if (mBleAppCount > 0) --mBleAppCount; if (mBleAppCount > 0) --mBleAppCount;
@@ -492,18 +523,19 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
} }
if (DBG) Log.d(TAG, "Updated BleAppCount" + mBleAppCount); if (DBG) Log.d(TAG, "Updated BleAppCount" + mBleAppCount);
if (mBleAppCount == 0 && mEnable) { if (mBleAppCount == 0 && mEnable) {
try { disableBleScanMode();
if (mBluetooth != null && (mBluetooth.getState() != BluetoothAdapter.STATE_ON)) {
if (DBG) Log.d(TAG, "Reseting the mEnable flag for clean disable");
mEnable = false;
}
} catch (RemoteException e) {
Log.e(TAG, "getState()", e);
}
} }
return mBleAppCount; return mBleAppCount;
} }
// Clear all apps using BLE scan only mode.
private void clearBleApps() {
synchronized (this) {
mBleApps.clear();
mBleAppCount = 0;
}
}
/** @hide*/ /** @hide*/
public boolean isBleAppPresent() { public boolean isBleAppPresent() {
if (DBG) Log.d(TAG, "isBleAppPresent() count: " + mBleAppCount); if (DBG) Log.d(TAG, "isBleAppPresent() count: " + mBleAppCount);