Protect self from async change of BluetoothPan

bug:6945678
Change-Id: I627a55aea9170f889823a38c8e2bb08a06faa841
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index f6c1734..1564803 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -48,6 +48,7 @@
 
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.Locale;
 
 /*
@@ -78,7 +79,7 @@
     private String[] mWifiRegexs;
 
     private String[] mBluetoothRegexs;
-    private BluetoothPan mBluetoothPan;
+    private AtomicReference<BluetoothPan> mBluetoothPan;
 
     private static final String WIFI_AP_SSID_AND_SECURITY = "wifi_ap_ssid_and_security";
     private static final int CONFIG_SUBTEXT = R.string.wifi_tether_configure_subtext;
@@ -151,7 +152,8 @@
         if (!bluetoothAvailable) {
             getPreferenceScreen().removePreference(mBluetoothTether);
         } else {
-            if (mBluetoothPan != null && mBluetoothPan.isTetheringOn()) {
+            BluetoothPan pan = mBluetoothPan.get();
+            if (pan != null && pan.isTetheringOn()) {
                 mBluetoothTether.setChecked(true);
             } else {
                 mBluetoothTether.setChecked(false);
@@ -188,10 +190,10 @@
     private BluetoothProfile.ServiceListener mProfileServiceListener =
         new BluetoothProfile.ServiceListener() {
         public void onServiceConnected(int profile, BluetoothProfile proxy) {
-            mBluetoothPan = (BluetoothPan) proxy;
+            mBluetoothPan.set((BluetoothPan) proxy);
         }
         public void onServiceDisconnected(int profile) {
-            mBluetoothPan = null;
+            mBluetoothPan.set(null);
         }
     };
 
@@ -235,8 +237,9 @@
                     switch (intent
                             .getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
                         case BluetoothAdapter.STATE_ON:
-                            if(mBluetoothPan != null) {
-                                mBluetoothPan.setBluetoothTethering(true);
+                            BluetoothPan bluetoothPan = mBluetoothPan.get();
+                            if (bluetoothPan != null) {
+                                bluetoothPan.setBluetoothTethering(true);
                                 mBluetoothEnableForTether = false;
                             }
                             break;
@@ -389,26 +392,31 @@
         } else if (btState == BluetoothAdapter.STATE_TURNING_ON) {
             mBluetoothTether.setEnabled(false);
             mBluetoothTether.setSummary(R.string.bluetooth_turning_on);
-        } else if (btState == BluetoothAdapter.STATE_ON &&
-                    mBluetoothPan != null && mBluetoothPan.isTetheringOn()) {
-            mBluetoothTether.setChecked(true);
-            mBluetoothTether.setEnabled(true);
-            int bluetoothTethered = mBluetoothPan.getConnectedDevices().size();
-            if (bluetoothTethered > 1) {
-                String summary = getString(
-                        R.string.bluetooth_tethering_devices_connected_subtext, bluetoothTethered);
-                mBluetoothTether.setSummary(summary);
-            } else if (bluetoothTethered == 1) {
-                mBluetoothTether.setSummary(R.string.bluetooth_tethering_device_connected_subtext);
-            } else if (bluetoothErrored) {
-                mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
-            } else {
-                mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
-            }
         } else {
-            mBluetoothTether.setEnabled(true);
-            mBluetoothTether.setChecked(false);
-            mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
+            BluetoothPan bluetoothPan = mBluetoothPan.get();
+            if (btState == BluetoothAdapter.STATE_ON && bluetoothPan != null &&
+                    bluetoothPan.isTetheringOn()) {
+                mBluetoothTether.setChecked(true);
+                mBluetoothTether.setEnabled(true);
+                int bluetoothTethered = bluetoothPan.getConnectedDevices().size();
+                if (bluetoothTethered > 1) {
+                    String summary = getString(
+                            R.string.bluetooth_tethering_devices_connected_subtext,
+                            bluetoothTethered);
+                    mBluetoothTether.setSummary(summary);
+                } else if (bluetoothTethered == 1) {
+                    mBluetoothTether.setSummary(
+                            R.string.bluetooth_tethering_device_connected_subtext);
+                } else if (bluetoothErrored) {
+                    mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
+                } else {
+                    mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
+                }
+            } else {
+                mBluetoothTether.setEnabled(true);
+                mBluetoothTether.setChecked(false);
+                mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
+            }
         }
     }
 
@@ -476,7 +484,8 @@
                     mBluetoothTether.setSummary(R.string.bluetooth_turning_on);
                     mBluetoothTether.setEnabled(false);
                 } else {
-                    mBluetoothPan.setBluetoothTethering(true);
+                    BluetoothPan bluetoothPan = mBluetoothPan.get();
+                    if (bluetoothPan != null) bluetoothPan.setBluetoothTethering(true);
                     mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
                 }
                 break;
@@ -528,7 +537,8 @@
                     errored = true;
                 }
 
-                mBluetoothPan.setBluetoothTethering(false);
+                BluetoothPan bluetoothPan = mBluetoothPan.get();
+                if (bluetoothPan != null) bluetoothPan.setBluetoothTethering(false);
                 if (errored) {
                     mBluetoothTether.setSummary(R.string.bluetooth_tethering_errored_subtext);
                 } else {