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 fcbf888f865..00000000000 --- 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 e01a2469d74..72529603334 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.content.res.Resources; 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 @@ public class TetherService extends Service { private TetherServiceWrapper mWrapper; private ArrayList mCurrentTethers; private ArrayMap> mPendingCallbacks; - private HotspotOffReceiver mHotspotReceiver; @Override public IBinder onBind(Intent intent) { @@ -97,7 +93,6 @@ public class TetherService extends Service { mPendingCallbacks.put(ConnectivityManager.TETHERING_USB, new ArrayList()); mPendingCallbacks.put( ConnectivityManager.TETHERING_BLUETOOTH, new ArrayList()); - mHotspotReceiver = new HotspotOffReceiver(this); } @Override @@ -146,20 +141,11 @@ public class TetherService extends Service { 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 @@ public class TetherService extends Service { 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 @@ public class TetherService extends Service { } } - @VisibleForTesting - void setHotspotOffReceiver(HotspotOffReceiver receiver) { - mHotspotReceiver = receiver; - } - private ArrayList stringToTethers(String tethersStr) { ArrayList ret = new ArrayList(); if (TextUtils.isEmpty(tethersStr)) return ret; @@ -304,48 +280,6 @@ public class TetherService extends Service { } } - @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 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 61b9b5bf9a5..00000000000 --- 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 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 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 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 68914415bba..514755beb3b 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 @@ package com.android.settings.wifi.tether; 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.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED; 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 @@ public class TetherServiceTest extends ServiceTestCase { 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 @@ public class TetherServiceTest extends ServiceTestCase { 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 @@ public class TetherServiceTest extends ServiceTestCase { 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 @@ public class TetherServiceTest extends ServiceTestCase { 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 @@ public class TetherServiceTest extends ServiceTestCase { @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;