From 00656b8e46e187e5fa63b8a80cd4f42367c1c924 Mon Sep 17 00:00:00 2001 From: PauloftheWest Date: Wed, 24 Sep 2014 15:21:30 -0700 Subject: [PATCH] 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 --- .../bluetooth/CachedBluetoothDevice.java | 11 +++------ .../bluetooth/DeviceProfilesSettings.java | 24 +++++++++++++++++-- .../LocalBluetoothProfileManager.java | 4 ++++ .../settings/bluetooth/MapProfile.java | 2 +- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java index bcb803bca0b..e61b3fde538 100755 --- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java +++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java @@ -133,7 +133,9 @@ final class CachedBluetoothDevice implements Comparable { } mProfileConnectionState.put(profile, newProfileState); 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); mProfiles.add(profile); if (profile instanceof PanProfile && @@ -142,15 +144,8 @@ final class CachedBluetoothDevice implements Comparable { mLocalNapRoleConnected = true; } } - if (profile instanceof MapProfile) { - profile.setPreferred(mDevice, true); - } } else if (profile instanceof MapProfile && newProfileState == BluetoothProfile.STATE_DISCONNECTED) { - if (mProfiles.contains(profile)) { - mRemovedProfiles.add(profile); - mProfiles.remove(profile); - } profile.setPreferred(mDevice, false); } else if (mLocalNapRoleConnected && profile instanceof PanProfile && ((PanProfile) profile).isLocalRoleNap(mDevice) && diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java index c94c2cfc093..757535a7c0e 100755 --- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java +++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java @@ -154,6 +154,13 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment 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(); } @@ -225,9 +232,13 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment boolean isConnected = status == BluetoothProfile.STATE_CONNECTED; - if (isConnected) { + if (profilePref.isChecked()) { askDisconnect(mManager.getForegroundActivity(), profile); } else { + if (profile instanceof MapProfile) { + mCachedDevice.setMessagePermissionChoice(BluetoothDevice.ACCESS_ALLOWED); + refreshProfilePreference(profilePref, profile); + } if (profile.isPreferred(device)) { // profile is preferred but not connected: disable auto-connect profile.setPreferred(device, false); @@ -259,6 +270,11 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment public void onClick(DialogInterface dialog, int which) { device.disconnect(profile); 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); } } + showOrHideProfileGroup(); } @@ -307,7 +324,10 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment // Gray out checkbox while connecting and disconnecting. 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. profilePref.setChecked(mCachedDevice.getPhonebookPermissionChoice() == CachedBluetoothDevice.ACCESS_ALLOWED); diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java index 8fff964878d..2a6a7592607 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java @@ -309,6 +309,10 @@ final class LocalBluetoothProfileManager { return mPbapProfile; } + MapProfile getMapProfile(){ + return mMapProfile; + } + /** * Fill in a list of LocalBluetoothProfile objects that are supported by * the local device and the remote device. diff --git a/src/com/android/settings/bluetooth/MapProfile.java b/src/com/android/settings/bluetooth/MapProfile.java index fb1b18092df..f47e24fedab 100644 --- a/src/com/android/settings/bluetooth/MapProfile.java +++ b/src/com/android/settings/bluetooth/MapProfile.java @@ -113,7 +113,7 @@ final class MapProfile implements LocalBluetoothProfile { public boolean connect(BluetoothDevice device) { 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) {