Fix IndexOutOfBoundsException while silent provisioning check

- If hostpot off, we receive result through HotspotOffReceiver.
  Sometimes, during provisioning, we're used to receive this.
  In this case, we don't care.
  After provisioning, we'll receive the intent again.

- In stress test,
  index is sometimes invalid, equals to mCurrentTethers.size().
  So, when provisioning, We check whether index is valid or not.

BUG=23528220
Change-Id: I70f35e045042c6c81b1db03e2a44cd41d3e7437f
diff --git a/src/com/android/settings/HotspotOffReceiver.java b/src/com/android/settings/HotspotOffReceiver.java
index 06ced1f..f3c3fee 100644
--- a/src/com/android/settings/HotspotOffReceiver.java
+++ b/src/com/android/settings/HotspotOffReceiver.java
@@ -5,6 +5,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.wifi.WifiManager;
+import android.util.Log;
 
 import com.android.settingslib.TetherUtil;
 
@@ -14,11 +15,15 @@
  */
 public class HotspotOffReceiver extends BroadcastReceiver {
 
+    private static final String TAG = "HotspotOffReceiver";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
     @Override
     public void onReceive(Context context, Intent intent) {
         if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {
             WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
             if (wifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED) {
+                if (DEBUG) Log.d(TAG, "TetherService.cancelRecheckAlarmIfNecessary called");
                 // The hotspot has been turned off, we don't need to recheck tethering.
                 TetherService.cancelRecheckAlarmIfNecessary(context, TetherUtil.TETHERING_WIFI);
             }
diff --git a/src/com/android/settings/TetherService.java b/src/com/android/settings/TetherService.java
index b6effad..346a175 100644
--- a/src/com/android/settings/TetherService.java
+++ b/src/com/android/settings/TetherService.java
@@ -89,21 +89,28 @@
                 mCurrentTethers.add(type);
             }
         }
+
         if (intent.hasExtra(TetherUtil.EXTRA_REM_TETHER_TYPE)) {
-            int type = intent.getIntExtra(TetherUtil.EXTRA_REM_TETHER_TYPE,
-                    TetherUtil.TETHERING_INVALID);
-            if (DEBUG) Log.d(TAG, "Removing tether " + type);
-            int index = mCurrentTethers.indexOf(type);
-            if (index >= 0) {
-                mCurrentTethers.remove(index);
-                // If we are currently in the middle of a check, we may need to adjust the
-                // index accordingly.
-                if (index <= mCurrentTypeIndex && mCurrentTypeIndex > 0) {
-                    mCurrentTypeIndex--;
+            if (!mInProvisionCheck) {
+                int type = intent.getIntExtra(TetherUtil.EXTRA_REM_TETHER_TYPE,
+                        TetherUtil.TETHERING_INVALID);
+                int index = mCurrentTethers.indexOf(type);
+                if (DEBUG) Log.d(TAG, "Removing tether " + type + ", index " + index);
+                if (index >= 0) {
+                    mCurrentTethers.remove(index);
+                    // If we are currently in the middle of a check, we may need to adjust the
+                    // index accordingly.
+                    if (DEBUG) Log.d(TAG, "mCurrentTypeIndex: " + mCurrentTypeIndex);
+                    if (index <= mCurrentTypeIndex && mCurrentTypeIndex > 0) {
+                        mCurrentTypeIndex--;
+                    }
                 }
+                cancelAlarmIfNecessary();
+            } else {
+                if (DEBUG) Log.d(TAG, "Don't cancel alarm during provisioning");
             }
-            cancelAlarmIfNecessary();
         }
+
         // Only set the alarm if we have one tether, meaning the one just added,
         // to avoid setting it when it was already set previously for another
         // type.
@@ -199,15 +206,17 @@
     }
 
     private void startProvisioning(int index) {
-        String provisionAction = getResources().getString(
-                com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui);
-        if (DEBUG) Log.d(TAG, "Sending provisioning broadcast: " + provisionAction + " type: "
-                + mCurrentTethers.get(index));
-        Intent intent = new Intent(provisionAction);
-        intent.putExtra(TETHER_CHOICE, mCurrentTethers.get(index));
-        intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        sendBroadcast(intent);
-        mInProvisionCheck = true;
+        if (index < mCurrentTethers.size()) {
+            String provisionAction = getResources().getString(
+                    com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui);
+            if (DEBUG) Log.d(TAG, "Sending provisioning broadcast: " + provisionAction + " type: "
+                    + mCurrentTethers.get(index));
+            Intent intent = new Intent(provisionAction);
+            intent.putExtra(TETHER_CHOICE, mCurrentTethers.get(index));
+            intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+            sendBroadcast(intent);
+            mInProvisionCheck = true;
+        }
     }
 
     public static void scheduleRecheckAlarm(Context context, int type) {
@@ -261,13 +270,14 @@
             if (DEBUG) Log.d(TAG, "Got provision result " + intent);
             String provisionResponse = context.getResources().getString(
                     com.android.internal.R.string.config_mobile_hotspot_provision_response);
+
             if (provisionResponse.equals(intent.getAction())) {
                 if (!mInProvisionCheck) {
                     Log.e(TAG, "Unexpected provision response " + intent);
                     return;
                 }
-                mInProvisionCheck = false;
                 int checkType = mCurrentTethers.get(mCurrentTypeIndex);
+                mInProvisionCheck = false;
                 if (intent.getIntExtra(EXTRA_RESULT, RESULT_DEFAULT) == RESULT_OK) {
                     if (checkType == TetherUtil.TETHERING_WIFI && mEnableWifiAfterCheck) {
                         enableWifiTetheringIfNeeded();
@@ -286,7 +296,8 @@
                             break;
                     }
                 }
-                if (++mCurrentTypeIndex == mCurrentTethers.size()) {
+
+                if (++mCurrentTypeIndex >= mCurrentTethers.size()) {
                     // We are done with all checks, time to die.
                     stopSelf();
                 } else {