Merge "Remove schedule recheck logic from TetherService" into rvc-dev
diff --git a/src/com/android/settings/wifi/tether/HotspotOffReceiver.java b/src/com/android/settings/wifi/tether/HotspotOffReceiver.java
deleted file mode 100644
index fcbf888..0000000
--- a/src/com/android/settings/wifi/tether/HotspotOffReceiver.java
+++ /dev/null
@@ -1,55 +0,0 @@
-
-package com.android.settings.wifi.tether;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiManager;
-import android.util.Log;
-
-/**
- * This receiver catches when quick settings turns off the hotspot, so we can
- * cancel the alarm in that case.  All other cancels are handled in tethersettings.
- */
-public class HotspotOffReceiver extends BroadcastReceiver {
-
-    private static final String TAG = "HotspotOffReceiver";
-    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
-    private Context mContext;
-    private boolean mRegistered;
-
-    public HotspotOffReceiver(Context context) {
-        mContext = context;
-    }
-
-    @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, ConnectivityManager.TETHERING_WIFI);
-            }
-        }
-    }
-
-    public void register() {
-        if (!mRegistered) {
-            mContext.registerReceiver(this,
-                new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION));
-            mRegistered = true;
-        }
-    }
-
-    public void unregister() {
-        if (mRegistered) {
-            mContext.unregisterReceiver(this);
-            mRegistered = false;
-        }
-    }
-}
diff --git a/src/com/android/settings/wifi/tether/TetherService.java b/src/com/android/settings/wifi/tether/TetherService.java
index e01a246..7252960 100644
--- a/src/com/android/settings/wifi/tether/TetherService.java
+++ b/src/com/android/settings/wifi/tether/TetherService.java
@@ -17,8 +17,6 @@
 package com.android.settings.wifi.tether;
 
 import android.app.Activity;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
 import android.app.Service;
 import android.app.usage.UsageStatsManager;
 import android.bluetooth.BluetoothAdapter;
@@ -36,7 +34,6 @@
 import android.net.ConnectivityManager;
 import android.os.IBinder;
 import android.os.ResultReceiver;
-import android.os.SystemClock;
 import android.telephony.SubscriptionManager;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -74,7 +71,6 @@
     private TetherServiceWrapper mWrapper;
     private ArrayList<Integer> mCurrentTethers;
     private ArrayMap<Integer, List<ResultReceiver>> mPendingCallbacks;
-    private HotspotOffReceiver mHotspotReceiver;
 
     @Override
     public IBinder onBind(Intent intent) {
@@ -97,7 +93,6 @@
         mPendingCallbacks.put(ConnectivityManager.TETHERING_USB, new ArrayList<ResultReceiver>());
         mPendingCallbacks.put(
                 ConnectivityManager.TETHERING_BLUETOOTH, new ArrayList<ResultReceiver>());
-        mHotspotReceiver = new HotspotOffReceiver(this);
     }
 
     @Override
@@ -146,20 +141,11 @@
                 if (index >= 0) {
                     removeTypeAtIndex(index);
                 }
-                cancelAlarmIfNecessary();
             } else {
-                if (DEBUG) Log.d(TAG, "Don't cancel alarm during provisioning");
+                if (DEBUG) Log.d(TAG, "Don't remove tether type 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.
-        if (intent.getBooleanExtra(ConnectivityManager.EXTRA_SET_ALARM, false)
-                && mCurrentTethers.size() == 1) {
-            scheduleAlarm();
-        }
-
         if (intent.getBooleanExtra(ConnectivityManager.EXTRA_RUN_PROVISION, false)) {
             startProvisioning(mCurrentTypeIndex);
         } else if (!mInProvisionCheck) {
@@ -182,16 +168,11 @@
         SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
         prefs.edit().putString(KEY_TETHERS, tethersToString(mCurrentTethers)).commit();
 
-        unregisterReceivers();
+        unregisterReceiver(mReceiver);
         if (DEBUG) Log.d(TAG, "Destroying TetherService");
         super.onDestroy();
     }
 
-    private void unregisterReceivers() {
-        unregisterReceiver(mReceiver);
-        mHotspotReceiver.unregister();
-    }
-
     private void removeTypeAtIndex(int index) {
         mCurrentTethers.remove(index);
         // If we are currently in the middle of a check, we may need to adjust the
@@ -202,11 +183,6 @@
         }
     }
 
-    @VisibleForTesting
-    void setHotspotOffReceiver(HotspotOffReceiver receiver) {
-        mHotspotReceiver = receiver;
-    }
-
     private ArrayList<Integer> stringToTethers(String tethersStr) {
         ArrayList<Integer> ret = new ArrayList<Integer>();
         if (TextUtils.isEmpty(tethersStr)) return ret;
@@ -304,48 +280,6 @@
         }
     }
 
-    @VisibleForTesting
-    void scheduleAlarm() {
-        Intent intent = new Intent(this, TetherService.class);
-        intent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
-
-        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
-        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
-        int period = getResourceForActiveDataSubId().getInteger(
-                com.android.internal.R.integer.config_mobile_hotspot_provision_check_period);
-        long periodMs = period * MS_PER_HOUR;
-        long firstTime = SystemClock.elapsedRealtime() + periodMs;
-        if (DEBUG) Log.d(TAG, "Scheduling alarm at interval " + periodMs);
-        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, periodMs,
-                pendingIntent);
-        mHotspotReceiver.register();
-    }
-
-    /**
-     * Cancels the recheck alarm only if no tethering is currently active.
-     *
-     * Runs in the background, to get access to bluetooth service that takes time to bind.
-     */
-    public static void cancelRecheckAlarmIfNecessary(final Context context, int type) {
-        Intent intent = new Intent(context, TetherService.class);
-        intent.putExtra(ConnectivityManager.EXTRA_REM_TETHER_TYPE, type);
-        context.startService(intent);
-    }
-
-    @VisibleForTesting
-    void cancelAlarmIfNecessary() {
-        if (mCurrentTethers.size() != 0) {
-            if (DEBUG) Log.d(TAG, "Tethering still active, not cancelling alarm");
-            return;
-        }
-        Intent intent = new Intent(this, TetherService.class);
-        PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
-        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
-        alarmManager.cancel(pendingIntent);
-        if (DEBUG) Log.d(TAG, "Tethering no longer active, canceling recheck");
-        mHotspotReceiver.unregister();
-    }
-
     private void fireCallbacksForType(int type, int result) {
         List<ResultReceiver> callbacksForType = mPendingCallbacks.get(type);
         if (callbacksForType == null) {
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
deleted file mode 100644
index 61b9b5b..0000000
--- a/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.wifi.tether;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.net.wifi.WifiManager;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.shadows.ShadowApplication.Wrapper;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-
-@RunWith(RobolectricTestRunner.class)
-public class TetherServiceTest {
-
-    private static final int CHECK_PERIOD_HOURS = 24;
-
-    @Mock
-    private Context mContext;
-    @Mock
-    private Resources mResources;
-
-    private Context mAppContext;
-    private TetherService mService;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mAppContext = RuntimeEnvironment.application;
-        mService = spy(new TetherService());
-        ReflectionHelpers.setField(mService, "mBase", mAppContext);
-        mService.setHotspotOffReceiver(new HotspotOffReceiver(mContext));
-        doReturn(CHECK_PERIOD_HOURS).when(mResources).getInteger(
-                com.android.internal.R.integer.config_mobile_hotspot_provision_check_period);
-        doReturn(mResources).when(mService).getResourceForActiveDataSubId();
-    }
-
-    @Test
-    public void scheduleAlarm_shouldRegisterReceiver() {
-        mService.setHotspotOffReceiver(new HotspotOffReceiver(mAppContext));
-
-        mService.scheduleAlarm();
-
-        boolean found = false;
-        for (Wrapper wrapper : ShadowApplication.getInstance().getRegisteredReceivers()) {
-            if (wrapper.intentFilter.matchAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
-                found = true;
-                break;
-            }
-        }
-
-        assertThat(found).isTrue();
-    }
-
-    @Test
-    public void cancelAlarmIfNecessary_hasActiveTethers_shouldNotUnregisterReceiver() {
-        mService.scheduleAlarm();
-        final ArrayList<Integer> tethers = new ArrayList<>();
-        tethers.add(1);
-        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
-
-        mService.cancelAlarmIfNecessary();
-
-        verify(mContext, never()).unregisterReceiver(any(HotspotOffReceiver.class));
-    }
-
-    @Test
-    public void cancelAlarmIfNecessary_noActiveTethers_shouldUnregisterReceiver() {
-        final ArrayList<Integer> tethers = new ArrayList<>();
-        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
-        mService.scheduleAlarm();
-
-        mService.cancelAlarmIfNecessary();
-
-        verify(mContext).unregisterReceiver(any(HotspotOffReceiver.class));
-    }
-
-    @Test
-    public void onDestroy_shouldUnregisterReceiver() {
-        final ArrayList<Integer> tethers = new ArrayList<>();
-        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
-        ReflectionHelpers.setField(mService, "mBase", mContext);
-        final SharedPreferences prefs = mock(SharedPreferences .class);
-        final SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);
-        when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(prefs);
-        when(prefs.edit()).thenReturn(editor);
-        when(editor.putString(anyString(), anyString())).thenReturn(editor);
-        final HotspotOffReceiver hotspotOffReceiver = mock(HotspotOffReceiver.class);
-        mService.setHotspotOffReceiver(hotspotOffReceiver);
-
-        mService.onDestroy();
-
-        verify(hotspotOffReceiver).unregister();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
index 6891441..514755b 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
@@ -18,9 +18,7 @@
 
 import static android.net.ConnectivityManager.EXTRA_ADD_TETHER_TYPE;
 import static android.net.ConnectivityManager.EXTRA_PROVISION_CALLBACK;
-import static android.net.ConnectivityManager.EXTRA_REM_TETHER_TYPE;
 import static android.net.ConnectivityManager.EXTRA_RUN_PROVISION;
-import static android.net.ConnectivityManager.EXTRA_SET_ALARM;
 import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
 import static android.net.ConnectivityManager.TETHERING_INVALID;
 import static android.net.ConnectivityManager.TETHERING_USB;
@@ -30,13 +28,11 @@
 import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
 
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.app.usage.UsageStatsManager;
 import android.content.BroadcastReceiver;
@@ -92,7 +88,6 @@
     private ProvisionReceiver mProvisionReceiver;
     private Receiver mResultReceiver;
 
-    @Mock private AlarmManager mAlarmManager;
     @Mock private ConnectivityManager mConnectivityManager;
     @Mock private PackageManager mPackageManager;
     @Mock private WifiManager mWifiManager;
@@ -158,15 +153,6 @@
         super.tearDown();
     }
 
-    private void cancelAllProvisioning() {
-        int[] types = new int[]{TETHERING_BLUETOOTH, TETHERING_WIFI, TETHERING_USB};
-        for (int type : types) {
-            Intent intent = new Intent();
-            intent.putExtra(EXTRA_REM_TETHER_TYPE, type);
-            startService(intent);
-        }
-    }
-
     public void testStartForProvision() {
         runProvisioningForType(TETHERING_WIFI);
 
@@ -184,19 +170,6 @@
         assertTrue(mWrapper.isAppInactive(FAKE_PACKAGE_NAME));
     }
 
-    public void testScheduleRechecks() {
-        Intent intent = new Intent();
-        intent.putExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_WIFI);
-        intent.putExtra(EXTRA_SET_ALARM, true);
-        startService(intent);
-
-        long period = TEST_CHECK_PERIOD * MS_PER_HOUR;
-        verify(mAlarmManager).setRepeating(eq(AlarmManager.ELAPSED_REALTIME), anyLong(),
-                eq(period), mPiCaptor.capture());
-        PendingIntent pi = mPiCaptor.getValue();
-        assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName());
-    }
-
     public void testStartMultiple() {
         runProvisioningForType(TETHERING_WIFI);
 
@@ -251,21 +224,6 @@
         verify(mConnectivityManager).setUsbTethering(eq(false));
     }
 
-    public void testCancelAlarm() {
-        runProvisioningForType(TETHERING_WIFI);
-
-        assertTrue(waitForProvisionRequest(TETHERING_WIFI));
-        assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR));
-
-        Intent intent = new Intent();
-        intent.putExtra(EXTRA_REM_TETHER_TYPE, TETHERING_WIFI);
-        startService(intent);
-
-        verify(mAlarmManager).cancel(mPiCaptor.capture());
-        PendingIntent pi = mPiCaptor.getValue();
-        assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName());
-    }
-
     public void testIgnoreOutdatedRequest() {
         Intent intent = new Intent();
         intent.putExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_WIFI);
@@ -387,9 +345,7 @@
 
         @Override
         public Object getSystemService(String name) {
-            if (ALARM_SERVICE.equals(name)) {
-                return mAlarmManager;
-            } else if (CONNECTIVITY_SERVICE.equals(name)) {
+            if (CONNECTIVITY_SERVICE.equals(name)) {
                 return mConnectivityManager;
             } else if (WIFI_SERVICE.equals(name)) {
                 return mWifiManager;