Loading AndroidManifest.xml +0 −7 Original line number Diff line number Diff line Loading @@ -440,13 +440,6 @@ </intent-filter> </activity> <receiver android:name=".HotspotOffReceiver" > <intent-filter> <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> </intent-filter> </receiver> <activity android:name="Settings$TetherSettingsActivity" android:label="@string/tether_settings_title_all" android:icon="@drawable/ic_settings_wireless" Loading src/com/android/settings/HotspotOffReceiver.java +23 −2 Original line number Diff line number Diff line Loading @@ -4,12 +4,11 @@ package com.android.settings; 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; import com.android.settingslib.TetherUtil; /** * 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. Loading @@ -19,6 +18,13 @@ 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())) { Loading @@ -31,4 +37,19 @@ public class HotspotOffReceiver extends BroadcastReceiver { } } } 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; } } } src/com/android/settings/TetherService.java +13 −3 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.TetherUtil; import java.util.ArrayList; import java.util.List; Loading Loading @@ -69,6 +68,7 @@ public class TetherService extends Service { private UsageStatsManagerWrapper mUsageManagerWrapper; private ArrayList<Integer> mCurrentTethers; private ArrayMap<Integer, List<ResultReceiver>> mPendingCallbacks; private HotspotOffReceiver mHotspotReceiver; @Override public IBinder onBind(Intent intent) { Loading @@ -94,6 +94,7 @@ public class TetherService extends Service { if (mUsageManagerWrapper == null) { mUsageManagerWrapper = new UsageStatsManagerWrapper(this); } mHotspotReceiver = new HotspotOffReceiver(this); } @Override Loading Loading @@ -181,6 +182,11 @@ public class TetherService extends Service { } } @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; Loading Loading @@ -276,7 +282,8 @@ public class TetherService extends Service { } } private void scheduleAlarm() { @VisibleForTesting void scheduleAlarm() { Intent intent = new Intent(this, TetherService.class); intent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true); Loading @@ -289,6 +296,7 @@ public class TetherService extends Service { if (DEBUG) Log.d(TAG, "Scheduling alarm at interval " + periodMs); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, periodMs, pendingIntent); mHotspotReceiver.register(); } /** Loading @@ -302,7 +310,8 @@ public class TetherService extends Service { context.startService(intent); } private void cancelAlarmIfNecessary() { @VisibleForTesting void cancelAlarmIfNecessary() { if (mCurrentTethers.size() != 0) { if (DEBUG) Log.d(TAG, "Tethering still active, not cancelling alarm"); return; Loading @@ -312,6 +321,7 @@ public class TetherService extends Service { 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) { Loading tests/robotests/src/com/android/settings/TetherServiceTest.java 0 → 100644 +87 −0 Original line number Diff line number Diff line /* * 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; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import java.util.ArrayList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class TetherServiceTest { @Mock private Context mContext; private ShadowApplication mShadowApplication; private Context mAppContext; private TetherService mService; @Before public void setUp() { MockitoAnnotations.initMocks(this); mShadowApplication = ShadowApplication.getInstance(); mAppContext = mShadowApplication.getApplicationContext(); mService = new TetherService(); ReflectionHelpers.setField(mService, "mBase", mAppContext); mService.setHotspotOffReceiver(new HotspotOffReceiver(mContext)); } @Test public void scheduleAlarm_shouldRegisterReceiver() { mService.setHotspotOffReceiver(new HotspotOffReceiver(mAppContext)); mService.scheduleAlarm(); assertThat(mShadowApplication.hasReceiverForIntent( new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION))).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)); } } Loading
AndroidManifest.xml +0 −7 Original line number Diff line number Diff line Loading @@ -440,13 +440,6 @@ </intent-filter> </activity> <receiver android:name=".HotspotOffReceiver" > <intent-filter> <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" /> </intent-filter> </receiver> <activity android:name="Settings$TetherSettingsActivity" android:label="@string/tether_settings_title_all" android:icon="@drawable/ic_settings_wireless" Loading
src/com/android/settings/HotspotOffReceiver.java +23 −2 Original line number Diff line number Diff line Loading @@ -4,12 +4,11 @@ package com.android.settings; 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; import com.android.settingslib.TetherUtil; /** * 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. Loading @@ -19,6 +18,13 @@ 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())) { Loading @@ -31,4 +37,19 @@ public class HotspotOffReceiver extends BroadcastReceiver { } } } 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; } } }
src/com/android/settings/TetherService.java +13 −3 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.TetherUtil; import java.util.ArrayList; import java.util.List; Loading Loading @@ -69,6 +68,7 @@ public class TetherService extends Service { private UsageStatsManagerWrapper mUsageManagerWrapper; private ArrayList<Integer> mCurrentTethers; private ArrayMap<Integer, List<ResultReceiver>> mPendingCallbacks; private HotspotOffReceiver mHotspotReceiver; @Override public IBinder onBind(Intent intent) { Loading @@ -94,6 +94,7 @@ public class TetherService extends Service { if (mUsageManagerWrapper == null) { mUsageManagerWrapper = new UsageStatsManagerWrapper(this); } mHotspotReceiver = new HotspotOffReceiver(this); } @Override Loading Loading @@ -181,6 +182,11 @@ public class TetherService extends Service { } } @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; Loading Loading @@ -276,7 +282,8 @@ public class TetherService extends Service { } } private void scheduleAlarm() { @VisibleForTesting void scheduleAlarm() { Intent intent = new Intent(this, TetherService.class); intent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true); Loading @@ -289,6 +296,7 @@ public class TetherService extends Service { if (DEBUG) Log.d(TAG, "Scheduling alarm at interval " + periodMs); alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, periodMs, pendingIntent); mHotspotReceiver.register(); } /** Loading @@ -302,7 +310,8 @@ public class TetherService extends Service { context.startService(intent); } private void cancelAlarmIfNecessary() { @VisibleForTesting void cancelAlarmIfNecessary() { if (mCurrentTethers.size() != 0) { if (DEBUG) Log.d(TAG, "Tethering still active, not cancelling alarm"); return; Loading @@ -312,6 +321,7 @@ public class TetherService extends Service { 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) { Loading
tests/robotests/src/com/android/settings/TetherServiceTest.java 0 → 100644 +87 −0 Original line number Diff line number Diff line /* * 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; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import java.util.ArrayList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class TetherServiceTest { @Mock private Context mContext; private ShadowApplication mShadowApplication; private Context mAppContext; private TetherService mService; @Before public void setUp() { MockitoAnnotations.initMocks(this); mShadowApplication = ShadowApplication.getInstance(); mAppContext = mShadowApplication.getApplicationContext(); mService = new TetherService(); ReflectionHelpers.setField(mService, "mBase", mAppContext); mService.setHotspotOffReceiver(new HotspotOffReceiver(mContext)); } @Test public void scheduleAlarm_shouldRegisterReceiver() { mService.setHotspotOffReceiver(new HotspotOffReceiver(mAppContext)); mService.scheduleAlarm(); assertThat(mShadowApplication.hasReceiverForIntent( new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION))).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)); } }