diff options
4 files changed, 82 insertions, 24 deletions
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 542b06b13605..e1a2a2f45a83 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -448,6 +448,30 @@ public final class BluetoothAdapter { "android.bluetooth.adapter.action.BLE_STATE_CHANGED"; /** + * Intent used to broadcast the change in the Bluetooth address + * of the local Bluetooth adapter. + * <p>Always contains the extra field {@link + * #EXTRA_BLUETOOTH_ADDRESS} containing the Bluetooth address. + * + * Note: only system level processes are allowed to send this + * defined broadcast. + * + * @hide + */ + public static final String ACTION_BLUETOOTH_ADDRESS_CHANGED = + "android.bluetooth.adapter.action.BLUETOOTH_ADDRESS_CHANGED"; + + /** + * Used as a String extra field in {@link + * #ACTION_BLUETOOTH_ADDRESS_CHANGED} intent to store the local + * Bluetooth address. + * + * @hide + */ + public static final String EXTRA_BLUETOOTH_ADDRESS = + "android.bluetooth.adapter.extra.BLUETOOTH_ADDRESS"; + + /** * Broadcast Action: The notifys Bluetooth ACL connected event. This will be * by BLE Always on enabled application to know the ACL_CONNECTED event * when Bluetooth state in STATE_BLE_ON. This denotes GATT connection diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index c1c436da5938..3fc7ab76ef5f 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -121,6 +121,7 @@ <protected-broadcast android:name="android.bluetooth.adapter.action.DISCOVERY_STARTED" /> <protected-broadcast android:name="android.bluetooth.adapter.action.DISCOVERY_FINISHED" /> <protected-broadcast android:name="android.bluetooth.adapter.action.LOCAL_NAME_CHANGED" /> + <protected-broadcast android:name="android.bluetooth.adapter.action.BLUETOOTH_ADDRESS_CHANGED" /> <protected-broadcast android:name="android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.device.action.UUID" /> <protected-broadcast android:name="android.bluetooth.device.action.MAS_INSTANCE" /> diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index d767c462c6db..97437c9579d4 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -187,6 +187,14 @@ class BluetoothManagerService extends IBluetoothManager.Stub { if (newName != null) { storeNameAndAddress(newName, null); } + } else if (BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED.equals(action)) { + String newAddress = intent.getStringExtra(BluetoothAdapter.EXTRA_BLUETOOTH_ADDRESS); + if (newAddress != null) { + if (DBG) Slog.d(TAG, "Bluetooth Adapter address changed to " + newAddress); + storeNameAndAddress(null, newAddress); + } else { + if (DBG) Slog.e(TAG, "No Bluetooth Adapter address parameter found"); + } } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) { synchronized(mReceiver) { if (isBluetoothPersistedStateOn()) { @@ -275,6 +283,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { registerForAirplaneMode(filter); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); mContext.registerReceiver(mReceiver, filter); + filter = new IntentFilter(BluetoothAdapter.ACTION_BLUETOOTH_ADDRESS_CHANGED); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + mContext.registerReceiver(mReceiver, filter); loadStoredNameAndAddress(); if (isBluetoothPersistedStateOn()) { if (DBG) Slog.d(TAG, "Startup: Bluetooth persisted state is ON."); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 614a94fa1e20..a0707d5ce156 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -373,11 +373,6 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_SET_ACCEPT_UNVALIDATED = 28; /** - * used to specify whether a network should not be penalized when it becomes unvalidated. - */ - private static final int EVENT_SET_AVOID_UNVALIDATED = 35; - - /** * used to ask the user to confirm a connection to an unvalidated network. * obj = network */ @@ -404,6 +399,16 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int EVENT_REQUEST_LINKPROPERTIES = 32; private static final int EVENT_REQUEST_NETCAPABILITIES = 33; + /* + * used to specify whether a network should not be penalized when it becomes unvalidated. + */ + private static final int EVENT_SET_AVOID_UNVALIDATED = 35; + + /** + * used to trigger revalidation of a network. + */ + private static final int EVENT_REVALIDATE_NETWORK = 36; + /** Handler thread used for both of the handlers below. */ @VisibleForTesting protected final HandlerThread mHandlerThread; @@ -1327,13 +1332,16 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public LinkProperties getLinkProperties(Network network) { enforceAccessPermission(); - NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network); - if (nai != null) { - synchronized (nai) { - return new LinkProperties(nai.linkProperties); - } + return getLinkProperties(getNetworkAgentInfoForNetwork(network)); + } + + private LinkProperties getLinkProperties(NetworkAgentInfo nai) { + if (nai == null) { + return null; + } + synchronized (nai) { + return new LinkProperties(nai.linkProperties); } - return null; } private NetworkCapabilities getNetworkCapabilitiesInternal(NetworkAgentInfo nai) { @@ -2996,6 +3004,11 @@ public class ConnectivityService extends IConnectivityManager.Stub } break; } + case EVENT_REVALIDATE_NETWORK: { + boolean hasConnectivity = (msg.arg2 == 1); + handleReportNetworkConnectivity((Network) msg.obj, msg.arg1, hasConnectivity); + break; + } } } } @@ -3168,8 +3181,15 @@ public class ConnectivityService extends IConnectivityManager.Stub public void reportNetworkConnectivity(Network network, boolean hasConnectivity) { enforceAccessPermission(); enforceInternetPermission(); + final int uid = Binder.getCallingUid(); + final int connectivityInfo = hasConnectivity ? 1 : 0; + mHandler.sendMessage( + mHandler.obtainMessage(EVENT_REVALIDATE_NETWORK, uid, connectivityInfo, network)); + } - NetworkAgentInfo nai; + private void handleReportNetworkConnectivity( + Network network, int uid, boolean hasConnectivity) { + final NetworkAgentInfo nai; if (network == null) { nai = getDefaultNetwork(); } else { @@ -3180,21 +3200,23 @@ public class ConnectivityService extends IConnectivityManager.Stub return; } // Revalidate if the app report does not match our current validated state. - if (hasConnectivity == nai.lastValidated) return; - final int uid = Binder.getCallingUid(); + if (hasConnectivity == nai.lastValidated) { + return; + } if (DBG) { - log("reportNetworkConnectivity(" + nai.network.netId + ", " + hasConnectivity + - ") by " + uid); + int netid = nai.network.netId; + log("reportNetworkConnectivity(" + netid + ", " + hasConnectivity + ") by " + uid); } - synchronized (nai) { - // Validating a network that has not yet connected could result in a call to - // rematchNetworkAndRequests() which is not meant to work on such networks. - if (!nai.everConnected) return; - - if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, false)) return; - - nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid); + // Validating a network that has not yet connected could result in a call to + // rematchNetworkAndRequests() which is not meant to work on such networks. + if (!nai.everConnected) { + return; + } + LinkProperties lp = getLinkProperties(nai); + if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) { + return; } + nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid); } private ProxyInfo getDefaultProxy() { |