Fixed multiple MAP issues.

+ Bluetooth Settings properly stores the MAP state as a shared
preference.
+ A Bluetooth's Settings profile will display MAP even if it was
previously denied.

Bug: 17391677
Change-Id: I94dd7d1a75cc4fe09647c85d84d9e3651a07a673
This commit is contained in:
PauloftheWest
2014-09-24 15:21:30 -07:00
parent 3156e38f5e
commit 00656b8e46
4 changed files with 30 additions and 11 deletions

View File

@@ -133,7 +133,9 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
} }
mProfileConnectionState.put(profile, newProfileState); mProfileConnectionState.put(profile, newProfileState);
if (newProfileState == BluetoothProfile.STATE_CONNECTED) { if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
if (!mProfiles.contains(profile)) { if (profile instanceof MapProfile) {
profile.setPreferred(mDevice, true);
} else if (!mProfiles.contains(profile)) {
mRemovedProfiles.remove(profile); mRemovedProfiles.remove(profile);
mProfiles.add(profile); mProfiles.add(profile);
if (profile instanceof PanProfile && if (profile instanceof PanProfile &&
@@ -142,15 +144,8 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
mLocalNapRoleConnected = true; mLocalNapRoleConnected = true;
} }
} }
if (profile instanceof MapProfile) {
profile.setPreferred(mDevice, true);
}
} else if (profile instanceof MapProfile && } else if (profile instanceof MapProfile &&
newProfileState == BluetoothProfile.STATE_DISCONNECTED) { newProfileState == BluetoothProfile.STATE_DISCONNECTED) {
if (mProfiles.contains(profile)) {
mRemovedProfiles.add(profile);
mProfiles.remove(profile);
}
profile.setPreferred(mDevice, false); profile.setPreferred(mDevice, false);
} else if (mLocalNapRoleConnected && profile instanceof PanProfile && } else if (mLocalNapRoleConnected && profile instanceof PanProfile &&
((PanProfile) profile).isLocalRoleNap(mDevice) && ((PanProfile) profile).isLocalRoleNap(mDevice) &&

View File

@@ -154,6 +154,13 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment
mProfileContainer.addPreference(pbapPref); mProfileContainer.addPreference(pbapPref);
} }
final MapProfile mapProfile = mManager.getProfileManager().getMapProfile();
final int mapPermission = mCachedDevice.getMessagePermissionChoice();
if (mapPermission != CachedBluetoothDevice.ACCESS_UNKNOWN) {
CheckBoxPreference mapPreference = createProfilePreference(mapProfile);
mProfileContainer.addPreference(mapPreference);
}
showOrHideProfileGroup(); showOrHideProfileGroup();
} }
@@ -225,9 +232,13 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment
boolean isConnected = boolean isConnected =
status == BluetoothProfile.STATE_CONNECTED; status == BluetoothProfile.STATE_CONNECTED;
if (isConnected) { if (profilePref.isChecked()) {
askDisconnect(mManager.getForegroundActivity(), profile); askDisconnect(mManager.getForegroundActivity(), profile);
} else { } else {
if (profile instanceof MapProfile) {
mCachedDevice.setMessagePermissionChoice(BluetoothDevice.ACCESS_ALLOWED);
refreshProfilePreference(profilePref, profile);
}
if (profile.isPreferred(device)) { if (profile.isPreferred(device)) {
// profile is preferred but not connected: disable auto-connect // profile is preferred but not connected: disable auto-connect
profile.setPreferred(device, false); profile.setPreferred(device, false);
@@ -259,6 +270,11 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
device.disconnect(profile); device.disconnect(profile);
profile.setPreferred(device.getDevice(), false); profile.setPreferred(device.getDevice(), false);
if (profile instanceof MapProfile) {
device.setMessagePermissionChoice(BluetoothDevice.ACCESS_REJECTED);
refreshProfilePreference(
(CheckBoxPreference)findPreference(profile.toString()), profile);
}
} }
}; };
@@ -297,6 +313,7 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment
mProfileContainer.removePreference(profilePref); mProfileContainer.removePreference(profilePref);
} }
} }
showOrHideProfileGroup(); showOrHideProfileGroup();
} }
@@ -307,7 +324,10 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment
// Gray out checkbox while connecting and disconnecting. // Gray out checkbox while connecting and disconnecting.
profilePref.setEnabled(!mCachedDevice.isBusy()); profilePref.setEnabled(!mCachedDevice.isBusy());
if (profile instanceof PbapServerProfile) { if (profile instanceof MapProfile) {
profilePref.setChecked(mCachedDevice.getMessagePermissionChoice()
== CachedBluetoothDevice.ACCESS_ALLOWED);
} else if (profile instanceof PbapServerProfile) {
// Handle PBAP specially. // Handle PBAP specially.
profilePref.setChecked(mCachedDevice.getPhonebookPermissionChoice() profilePref.setChecked(mCachedDevice.getPhonebookPermissionChoice()
== CachedBluetoothDevice.ACCESS_ALLOWED); == CachedBluetoothDevice.ACCESS_ALLOWED);

View File

@@ -309,6 +309,10 @@ final class LocalBluetoothProfileManager {
return mPbapProfile; return mPbapProfile;
} }
MapProfile getMapProfile(){
return mMapProfile;
}
/** /**
* Fill in a list of LocalBluetoothProfile objects that are supported by * Fill in a list of LocalBluetoothProfile objects that are supported by
* the local device and the remote device. * the local device and the remote device.

View File

@@ -113,7 +113,7 @@ final class MapProfile implements LocalBluetoothProfile {
public boolean connect(BluetoothDevice device) { public boolean connect(BluetoothDevice device) {
if(V)Log.d(TAG,"connect() - should not get called"); if(V)Log.d(TAG,"connect() - should not get called");
return true; // MAP never connects out return false; // MAP never connects out
} }
public boolean disconnect(BluetoothDevice device) { public boolean disconnect(BluetoothDevice device) {