Add provisioning checks for BT and USB

Bug: 5568752
Change-Id: Ide4f3c0eb19f8e70e301a13d81b76dd6a0516c3a
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 23fe2c0..e27c96e 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -72,7 +72,6 @@
 
     private WifiApEnabler mWifiApEnabler;
     private CheckBoxPreference mEnableWifiAp;
-    private static final int MHS_REQUEST = 0;
 
     private CheckBoxPreference mBluetoothTether;
 
@@ -102,6 +101,18 @@
 
     private boolean mBluetoothEnableForTether;
 
+    private static final int INVALID             = -1;
+    private static final int WIFI_TETHERING      = 0;
+    private static final int USB_TETHERING       = 1;
+    private static final int BLUETOOTH_TETHERING = 2;
+
+    /* One of INVALID, WIFI_TETHERING, USB_TETHERING or BLUETOOTH_TETHERING */
+    private int mTetherChoice = INVALID;
+
+    /* Stores the package name and the class name of the provisioning app */
+    private String[] mProvisionApp;
+    private static final int PROVISION_REQUEST = 0;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -154,6 +165,9 @@
             }
         }
 
+        mProvisionApp = getResources().getStringArray(
+                com.android.internal.R.array.config_mobile_hotspot_provision_app);
+
         mView = new WebView(activity);
     }
 
@@ -454,50 +468,55 @@
         boolean enable = (Boolean) value;
 
         if (enable) {
-            //Check if provisioning is needed
-            String[] appDetails = getResources().getStringArray(
-                    com.android.internal.R.array.config_mobile_hotspot_provision_app);
-
-            if (appDetails.length != 2) {
-                mWifiApEnabler.setSoftapEnabled(true);
-            } else {
-                Intent intent = new Intent(Intent.ACTION_MAIN);
-                intent.setClassName(appDetails[0], appDetails[1]);
-                startActivityForResult(intent, MHS_REQUEST);
-            }
+            startProvisioningIfNecessary(WIFI_TETHERING);
         } else {
             mWifiApEnabler.setSoftapEnabled(false);
         }
         return false;
     }
 
+    boolean isProvisioningNeeded() {
+        return mProvisionApp.length == 2;
+    }
+
+    private void startProvisioningIfNecessary(int choice) {
+        mTetherChoice = choice;
+        if (isProvisioningNeeded()) {
+            Intent intent = new Intent(Intent.ACTION_MAIN);
+            intent.setClassName(mProvisionApp[0], mProvisionApp[1]);
+            startActivityForResult(intent, PROVISION_REQUEST);
+        } else {
+            startTethering();
+        }
+    }
+
     public void onActivityResult(int requestCode, int resultCode, Intent intent) {
         super.onActivityResult(requestCode, resultCode, intent);
-        if (requestCode == MHS_REQUEST) {
+        if (requestCode == PROVISION_REQUEST) {
             if (resultCode == Activity.RESULT_OK) {
-                mWifiApEnabler.setSoftapEnabled(true);
+                startTethering();
+            } else {
+                //BT and USB need checkbox turned off on failure
+                //Wifi tethering is never turned on until afterwards
+                switch (mTetherChoice) {
+                    case BLUETOOTH_TETHERING:
+                        mBluetoothTether.setChecked(false);
+                        break;
+                    case USB_TETHERING:
+                        mUsbTether.setChecked(false);
+                        break;
+                }
+                mTetherChoice = INVALID;
             }
         }
     }
 
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
-        ConnectivityManager cm =
-                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
-
-        if (preference == mUsbTether) {
-            boolean newState = mUsbTether.isChecked();
-
-            if (cm.setUsbTethering(newState) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
-                mUsbTether.setChecked(false);
-                mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
-                return true;
-            }
-            mUsbTether.setSummary("");
-        } else if (preference == mBluetoothTether) {
-            boolean bluetoothTetherState = mBluetoothTether.isChecked();
-
-            if (bluetoothTetherState) {
+    private void startTethering() {
+        switch (mTetherChoice) {
+            case WIFI_TETHERING:
+                mWifiApEnabler.setSoftapEnabled(true);
+                break;
+            case BLUETOOTH_TETHERING:
                 // turn on Bluetooth first
                 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
                 if (adapter.getState() == BluetoothAdapter.STATE_OFF) {
@@ -509,6 +528,45 @@
                     mBluetoothPan.setBluetoothTethering(true);
                     mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
                 }
+                break;
+            case USB_TETHERING:
+                setUsbTethering(true);
+                break;
+            default:
+                //should not happen
+                break;
+        }
+    }
+
+    private void setUsbTethering(boolean enabled) {
+        ConnectivityManager cm =
+            (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (cm.setUsbTethering(enabled) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
+            mUsbTether.setChecked(false);
+            mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
+            return;
+        }
+        mUsbTether.setSummary("");
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
+        ConnectivityManager cm =
+                (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
+
+        if (preference == mUsbTether) {
+            boolean newState = mUsbTether.isChecked();
+
+            if (newState) {
+                startProvisioningIfNecessary(USB_TETHERING);
+            } else {
+                setUsbTethering(newState);
+            }
+        } else if (preference == mBluetoothTether) {
+            boolean bluetoothTetherState = mBluetoothTether.isChecked();
+
+            if (bluetoothTetherState) {
+                startProvisioningIfNecessary(BLUETOOTH_TETHERING);
             } else {
                 boolean errored = false;