am 0de49148: Merge "Fix for BluetoothAdapter.getAddress() when BT is off on some devices" into jb-mr1-dev

* commit '0de49148f07c7f0b3b45cec0ef502db4b9163711':
  Fix for BluetoothAdapter.getAddress() when BT is off on some devices
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0890a18..148560a 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -650,9 +650,9 @@
          speech -->
     <bool name="config_bluetooth_wide_band_speech">true</bool>
 
-    <!-- Boolean indicating if current platform supports quick switch-on/off of
-         Bluetooth Module -->
-    <bool name="config_bluetooth_adapter_quick_switch">true</bool>
+    <!-- Boolean indicating if current platform need do one-time bluetooth address
+         re-validation -->
+    <bool name="config_bluetooth_address_validation">false</bool>
 
     <!-- The default data-use polling period. -->
     <integer name="config_datause_polling_period_sec">600</integer>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 05b3068..05edbcc 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -245,7 +245,7 @@
   <java-symbol type="bool" name="action_bar_embed_tabs_pre_jb" />
   <java-symbol type="bool" name="action_bar_expanded_action_views_exclusive" />
   <java-symbol type="bool" name="config_allowActionMenuItemTextWithIcon" />
-  <java-symbol type="bool" name="config_bluetooth_adapter_quick_switch" />
+  <java-symbol type="bool" name="config_bluetooth_address_validation" />
   <java-symbol type="bool" name="config_bluetooth_sco_off_call" />
   <java-symbol type="bool" name="config_cellBroadcastAppLinks" />
   <java-symbol type="bool" name="config_duplicate_port_omadm_wappush" />
diff --git a/services/java/com/android/server/BluetoothManagerService.java b/services/java/com/android/server/BluetoothManagerService.java
index 6ff33d7..69ccbc7 100755
--- a/services/java/com/android/server/BluetoothManagerService.java
+++ b/services/java/com/android/server/BluetoothManagerService.java
@@ -53,6 +53,7 @@
     private static final String BLUETOOTH_PERM = android.Manifest.permission.BLUETOOTH;
     private static final String ACTION_SERVICE_STATE_CHANGED="com.android.bluetooth.btservice.action.STATE_CHANGED";
     private static final String EXTRA_ACTION="action";
+    private static final String SECURE_SETTINGS_BLUETOOTH_ADDR_VALID="bluetooth_addr_valid";
     private static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS="bluetooth_address";
     private static final String SECURE_SETTINGS_BLUETOOTH_NAME="bluetooth_name";
     private static final int TIMEOUT_BIND_MS = 3000; //Maximum msec to wait for a bind
@@ -174,7 +175,9 @@
             //Enable
             if (DBG) Log.d(TAG, "Auto-enabling Bluetooth.");
             enableHelper();
-        } else if (!isNameAndAddressSet()) {
+        }
+
+        if (!isNameAndAddressSet()) {
             //Sync the Bluetooth name and address from the Bluetooth Adapter
             if (DBG) Log.d(TAG,"Retrieving Bluetooth Adapter name and address...");
             getNameAndAddress();
@@ -222,11 +225,16 @@
      */
     private void loadStoredNameAndAddress() {
         if (DBG) Log.d(TAG, "Loading stored name and address");
+        if (mContext.getResources().getBoolean
+            (com.android.internal.R.bool.config_bluetooth_address_validation) &&
+             Settings.Secure.getInt(mContentResolver, SECURE_SETTINGS_BLUETOOTH_ADDR_VALID, 0) == 0) {
+            // if the valid flag is not set, don't load the address and name
+            if (DBG) Log.d(TAG, "invalid bluetooth name and address stored");
+            return;
+        }
         mName = Settings.Secure.getString(mContentResolver, SECURE_SETTINGS_BLUETOOTH_NAME);
         mAddress = Settings.Secure.getString(mContentResolver, SECURE_SETTINGS_BLUETOOTH_ADDRESS);
-        if (mName == null || mAddress == null) {
-            if (DBG) Log.d(TAG, "Name or address not cached...");
-        }
+        if (DBG) Log.d(TAG, "Stored bluetooth Name=" + mName + ",Address=" + mAddress);
     }
 
     /**
@@ -249,6 +257,10 @@
             if (DBG)  Log.d(TAG,"Stored Bluetoothaddress: " +
                 Settings.Secure.getString(mContentResolver,SECURE_SETTINGS_BLUETOOTH_ADDRESS));
         }
+
+        if ((name != null) && (address != null)) {
+            Settings.Secure.putInt(mContentResolver, SECURE_SETTINGS_BLUETOOTH_ADDR_VALID, 1);
+        }
     }
 
     public IBluetooth registerAdapter(IBluetoothManagerCallback callback){
@@ -560,8 +572,19 @@
                     break;
                 }
                 case MESSAGE_SAVE_NAME_AND_ADDRESS: {
+                    boolean unbind = false;
                     if (DBG) Log.d(TAG,"MESSAGE_SAVE_NAME_AND_ADDRESS");
                     synchronized(mConnection) {
+                        if (!mEnable && mBluetooth != null) {
+                            try {
+                                mBluetooth.enable();
+                            } catch (RemoteException e) {
+                                Log.e(TAG,"Unable to call enable()",e);
+                            }
+                        }
+                    }
+                    if (mBluetooth != null) waitForOnOff(true, false);
+                    synchronized(mConnection) {
                         if (mBluetooth != null) {
                             String name =  null;
                             String address = null;
@@ -575,7 +598,7 @@
                             if (name != null && address != null) {
                                 storeNameAndAddress(name,address);
                                 if (mConnection.isGetNameAddressOnly()) {
-                                    unbindAndFinish();
+                                    unbind = true;
                                 }
                             } else {
                                 if (msg.arg1 < MAX_SAVE_RETRIES) {
@@ -586,10 +609,17 @@
                                 } else {
                                     Log.w(TAG,"Maximum name/address remote retrieval retry exceeded");
                                     if (mConnection.isGetNameAddressOnly()) {
-                                        unbindAndFinish();
+                                        unbind = true;
                                     }
                                 }
                             }
+                            if (!mEnable) {
+                                try {
+                                    mBluetooth.disable();
+                                } catch (RemoteException e) {
+                                    Log.e(TAG,"Unable to call disable()",e);
+                                }
+                            }
                         } else {
                             // rebind service by Request GET NAME AND ADDRESS
                             // if service is unbinded by disable or
@@ -598,6 +628,10 @@
                             mHandler.sendMessage(getMsg);
                         }
                     }
+                    if (!mEnable && mBluetooth != null) waitForOnOff(false, true);
+                    if (unbind) {
+                        unbindAndFinish();
+                    }
                     break;
                 }
                 case MESSAGE_ENABLE:
@@ -677,14 +711,6 @@
                         //Inform BluetoothAdapter instances that service is up
                         sendBluetoothServiceUpCallback();
 
-                        //Check if name and address is loaded if not get it first.
-                        if (!isNameAndAddressSet()) {
-                            try {
-                                storeNameAndAddress(mBluetooth.getName(),
-                                                    mBluetooth.getAddress());
-                            } catch (RemoteException e) {Log.e(TAG, "", e);};
-                        }
-
                         //Do enable request
                         try {
                             if (mQuietEnable == false) {
@@ -873,14 +899,6 @@
                     sendBluetoothServiceUpCallback();
                 }
 
-                //Check if name and address is loaded if not get it first.
-                if (!isNameAndAddressSet()) {
-                    try {
-                        if (DBG) Log.d(TAG,"Getting and storing Bluetooth name and address prior to enable.");
-                        storeNameAndAddress(mBluetooth.getName(),mBluetooth.getAddress());
-                    } catch (RemoteException e) {Log.e(TAG, "", e);};
-                }
-
                 //Enable bluetooth
                 try {
                     if (!mQuietEnable) {