BT keeps on asking me if I want to allow car to do stuff

We can remember it as a non persist global value when user click no.
This value won't be saved when power down.
We will restore the permission choice
when we are disconnected with the remote device.
So the "no" choice selected by user will only take effect
until we are disconnected with the remote device.

bug:11176511
Change-Id: Ic0c0829587cf7a812b5fa96fbd381921f67c186f
This commit is contained in:
Zhihai Xu
2013-10-11 12:15:19 -07:00
parent 6e96aff554
commit 9998639a65
2 changed files with 30 additions and 3 deletions

View File

@@ -197,7 +197,7 @@ public class BluetoothPermissionActivity extends AlertActivity implements
private void onNegative() { private void onNegative() {
if (DEBUG) Log.d(TAG, "onNegative"); if (DEBUG) Log.d(TAG, "onNegative");
savePermissionChoice(mRequestType, CachedBluetoothDevice.ACCESS_UNKNOWN); savePermissionChoice(mRequestType, CachedBluetoothDevice.ACCESS_REJECTED);
sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, false, sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, false,
null, false // dummy value, no effect since last param is null null, false // dummy value, no effect since last param is null
); );

View File

@@ -130,6 +130,23 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
return; return;
} }
mProfileConnectionState.put(profile, newProfileState); mProfileConnectionState.put(profile, newProfileState);
if (newProfileState == BluetoothProfile.STATE_DISCONNECTED) {
// check whether we are disconnected with this device completely
boolean isDisconnected = true;
for (LocalBluetoothProfile pf: mProfileConnectionState.keySet()) {
if (mProfileConnectionState.get(pf) != BluetoothProfile.STATE_DISCONNECTED) {
isDisconnected = false;
break;
}
}
// if disconnected, restore permission choice.
// So ACCESS_REJECTED will take effect until we are disconnected with this device.
if (isDisconnected) {
fetchPhonebookPermissionChoice();
fetchMessagePermissionChoice();
}
}
if (newProfileState == BluetoothProfile.STATE_CONNECTED) { if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
if (!mProfiles.contains(profile)) { if (!mProfiles.contains(profile)) {
mRemovedProfiles.remove(profile); mRemovedProfiles.remove(profile);
@@ -358,6 +375,8 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
for (LocalBluetoothProfile profile :getProfiles()) { for (LocalBluetoothProfile profile :getProfiles()) {
mProfileConnectionState.put(profile, BluetoothProfile.STATE_DISCONNECTED); mProfileConnectionState.put(profile, BluetoothProfile.STATE_DISCONNECTED);
} }
fetchPhonebookPermissionChoice();
fetchMessagePermissionChoice();
} }
// TODO: do any of these need to run async on a background thread? // TODO: do any of these need to run async on a background thread?
@@ -649,6 +668,11 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
} }
void setPhonebookPermissionChoice(int permissionChoice) { void setPhonebookPermissionChoice(int permissionChoice) {
mPhonebookPermissionChoice = permissionChoice;
// if user reject it, don't save it to editor.
if (permissionChoice == ACCESS_REJECTED) return;
SharedPreferences.Editor editor = SharedPreferences.Editor editor =
mContext.getSharedPreferences(PHONEBOOK_PREFS_NAME, Context.MODE_PRIVATE).edit(); mContext.getSharedPreferences(PHONEBOOK_PREFS_NAME, Context.MODE_PRIVATE).edit();
if (permissionChoice == ACCESS_UNKNOWN) { if (permissionChoice == ACCESS_UNKNOWN) {
@@ -657,7 +681,6 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
editor.putInt(mDevice.getAddress(), permissionChoice); editor.putInt(mDevice.getAddress(), permissionChoice);
} }
editor.commit(); editor.commit();
mPhonebookPermissionChoice = permissionChoice;
} }
private void fetchPhonebookPermissionChoice() { private void fetchPhonebookPermissionChoice() {
@@ -673,6 +696,11 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
} }
void setMessagePermissionChoice(int permissionChoice) { void setMessagePermissionChoice(int permissionChoice) {
mMessagePermissionChoice = permissionChoice;
// if user reject it, don't save it to editor.
if (permissionChoice == ACCESS_REJECTED) return;
SharedPreferences.Editor editor = SharedPreferences.Editor editor =
mContext.getSharedPreferences(MESSAGE_PREFS_NAME, Context.MODE_PRIVATE).edit(); mContext.getSharedPreferences(MESSAGE_PREFS_NAME, Context.MODE_PRIVATE).edit();
if (permissionChoice == ACCESS_UNKNOWN) { if (permissionChoice == ACCESS_UNKNOWN) {
@@ -681,7 +709,6 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
editor.putInt(mDevice.getAddress(), permissionChoice); editor.putInt(mDevice.getAddress(), permissionChoice);
} }
editor.commit(); editor.commit();
mMessagePermissionChoice = permissionChoice;
} }
private void fetchMessagePermissionChoice() { private void fetchMessagePermissionChoice() {