Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5565b5cd authored by Hyejin's avatar Hyejin Committed by Vineeta Srivastava
Browse files

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
parent cda53c5d
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ import android.content.BroadcastReceiver;
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 @@ import com.android.settingslib.TetherUtil;
 */
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);
            }
+33 −22
Original line number Diff line number Diff line
@@ -89,21 +89,28 @@ public class TetherService extends Service {
                mCurrentTethers.add(type);
            }
        }

        if (intent.hasExtra(TetherUtil.EXTRA_REM_TETHER_TYPE)) {
            if (!mInProvisionCheck) {
                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 (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");
            }
        }

        // 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,6 +206,7 @@ public class TetherService extends Service {
    }

    private void startProvisioning(int index) {
        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: "
@@ -209,6 +217,7 @@ public class TetherService extends Service {
            sendBroadcast(intent);
            mInProvisionCheck = true;
        }
    }

    public static void scheduleRecheckAlarm(Context context, int type) {
        Intent intent = new Intent(context, TetherService.class);
@@ -261,13 +270,14 @@ public class TetherService extends Service {
            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 @@ public class TetherService extends Service {
                            break;
                    }
                }
                if (++mCurrentTypeIndex == mCurrentTethers.size()) {

                if (++mCurrentTypeIndex >= mCurrentTethers.size()) {
                    // We are done with all checks, time to die.
                    stopSelf();
                } else {