Improve Bluetooth tethering UI usability.
- Updated hint text for BT tethering checkbox to "[Sharing|not sharing] this [tablet|phone]'s mobile data connection". - Show correct hint text when user enters tethering screen. - Show correct status after user enables tethering when Bluetooth is off. When BluetoothPan.setBluetoothTethering(true) is called with BT off, BluetoothPanProfileHandler will add a broadcast receiver to enable tethering after BT turns on. This happens too late to show the correct status when TetherSettings gets the adapter state changed event, so set a flag (mBluetoothEnableForTether) instead, and call setBluetoothTethering ourselves after the state changes to ON. Also, clear the flag if the adapter state changes to OFF or ERROR. - Show correct status when user enables tethering, then disables Bluetooth, then returns to the tethering screen. Previously it would show Bluetooth tethering enabled, even though adapter state was OFF. - Show the number of connected devices in tethering preference screen. - Distinguish between PANU and NAP in device profiles screen, and show appropriate text to clarify the direction of tethering. - Remove profiles from device profiles list when the device removes the UUID (e.g. Mac OS X turning NAP on/off) and after a NAP disconnection when the remote device only supports PANU. Bug: 3414575 Change-Id: I2c0830876d5b9bddb293e57c4d3ca74f105911b8
This commit is contained in:
@@ -110,7 +110,9 @@ final class LocalBluetoothProfileManager {
|
||||
BluetoothInputDevice.ACTION_CONNECTION_STATE_CHANGED);
|
||||
|
||||
mPanProfile = new PanProfile(context);
|
||||
addProfile(mPanProfile, PanProfile.NAME, BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
|
||||
addPanProfile(mPanProfile, PanProfile.NAME,
|
||||
BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
|
||||
|
||||
Log.d(TAG, "LocalBluetoothProfileManager construction complete");
|
||||
}
|
||||
|
||||
@@ -173,6 +175,13 @@ final class LocalBluetoothProfileManager {
|
||||
mProfileNameMap.put(profileName, profile);
|
||||
}
|
||||
|
||||
private void addPanProfile(LocalBluetoothProfile profile,
|
||||
String profileName, String stateChangedAction) {
|
||||
mEventManager.addProfileHandler(stateChangedAction,
|
||||
new PanStateChangedHandler(profile));
|
||||
mProfileNameMap.put(profileName, profile);
|
||||
}
|
||||
|
||||
LocalBluetoothProfile getProfileByName(String name) {
|
||||
return mProfileNameMap.get(name);
|
||||
}
|
||||
@@ -190,7 +199,7 @@ final class LocalBluetoothProfileManager {
|
||||
* Generic handler for connection state change events for the specified profile.
|
||||
*/
|
||||
private class StateChangedHandler implements BluetoothEventManager.Handler {
|
||||
private final LocalBluetoothProfile mProfile;
|
||||
final LocalBluetoothProfile mProfile;
|
||||
|
||||
StateChangedHandler(LocalBluetoothProfile profile) {
|
||||
mProfile = profile;
|
||||
@@ -215,6 +224,22 @@ final class LocalBluetoothProfileManager {
|
||||
}
|
||||
}
|
||||
|
||||
/** State change handler for NAP and PANU profiles. */
|
||||
private class PanStateChangedHandler extends StateChangedHandler {
|
||||
|
||||
PanStateChangedHandler(LocalBluetoothProfile profile) {
|
||||
super(profile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent, BluetoothDevice device) {
|
||||
PanProfile panProfile = (PanProfile) mProfile;
|
||||
int role = intent.getIntExtra(BluetoothPan.EXTRA_LOCAL_ROLE, 0);
|
||||
panProfile.setLocalRole(device, role);
|
||||
super.onReceive(context, intent, device);
|
||||
}
|
||||
}
|
||||
|
||||
// called from DockService
|
||||
void addServiceListener(ServiceListener l) {
|
||||
mServiceListeners.add(l);
|
||||
@@ -269,9 +294,14 @@ final class LocalBluetoothProfileManager {
|
||||
* @param uuids of the remote device
|
||||
* @param localUuids UUIDs of the local device
|
||||
* @param profiles The list of profiles to fill
|
||||
* @param removedProfiles list of profiles that were removed
|
||||
*/
|
||||
synchronized void updateProfiles(ParcelUuid[] uuids, ParcelUuid[] localUuids,
|
||||
Collection<LocalBluetoothProfile> profiles) {
|
||||
Collection<LocalBluetoothProfile> profiles,
|
||||
Collection<LocalBluetoothProfile> removedProfiles) {
|
||||
// Copy previous profile list into removedProfiles
|
||||
removedProfiles.clear();
|
||||
removedProfiles.addAll(profiles);
|
||||
profiles.clear();
|
||||
|
||||
if (uuids == null) {
|
||||
@@ -280,31 +310,36 @@ final class LocalBluetoothProfileManager {
|
||||
|
||||
if (mHeadsetProfile != null) {
|
||||
if ((BluetoothUuid.isUuidPresent(localUuids, BluetoothUuid.HSP_AG) &&
|
||||
BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.HSP)) ||
|
||||
(BluetoothUuid.isUuidPresent(localUuids, BluetoothUuid.Handsfree_AG) &&
|
||||
BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Handsfree))) {
|
||||
profiles.add(mHeadsetProfile);
|
||||
BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.HSP)) ||
|
||||
(BluetoothUuid.isUuidPresent(localUuids, BluetoothUuid.Handsfree_AG) &&
|
||||
BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Handsfree))) {
|
||||
profiles.add(mHeadsetProfile);
|
||||
removedProfiles.remove(mHeadsetProfile);
|
||||
}
|
||||
}
|
||||
|
||||
if (BluetoothUuid.containsAnyUuid(uuids, A2dpProfile.SINK_UUIDS) &&
|
||||
mA2dpProfile != null) {
|
||||
profiles.add(mA2dpProfile);
|
||||
removedProfiles.remove(mA2dpProfile);
|
||||
}
|
||||
|
||||
if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.ObexObjectPush) &&
|
||||
mOppProfile != null) {
|
||||
profiles.add(mOppProfile);
|
||||
removedProfiles.remove(mOppProfile);
|
||||
}
|
||||
|
||||
if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Hid) &&
|
||||
mHidProfile != null) {
|
||||
profiles.add(mHidProfile);
|
||||
removedProfiles.remove(mHidProfile);
|
||||
}
|
||||
|
||||
if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.NAP) &&
|
||||
mPanProfile != null) {
|
||||
profiles.add(mPanProfile);
|
||||
removedProfiles.remove(mPanProfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user