From 5bf5c8ac0460e8b1f1fce9ca711a2927682fbb63 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Wed, 24 May 2017 13:24:23 -0700 Subject: [PATCH] Listener to tether state change on Network & internet page. User can navigates to the page and turn hotspot on or off from the quick settings. Need to listen to the tether state updates to refresh the summary for the Hotspot & tethering preference accordingly. Change-Id: I7c6869b909306b09556e19cf7b7543ce9dcd890e Fix: 38452559 Test: make RunSettingsRoboTests --- .../network/TetherPreferenceController.java | 22 ++++++++++++ .../TetherPreferenceControllerTest.java | 36 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/com/android/settings/network/TetherPreferenceController.java b/src/com/android/settings/network/TetherPreferenceController.java index 19a22ba990f..fab700b0939 100644 --- a/src/com/android/settings/network/TetherPreferenceController.java +++ b/src/com/android/settings/network/TetherPreferenceController.java @@ -18,7 +18,10 @@ package com.android.settings.network; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothProfile; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.database.ContentObserver; import android.net.ConnectivityManager; import android.net.Uri; @@ -67,6 +70,7 @@ public class TetherPreferenceController extends PreferenceController private SettingObserver mAirplaneModeObserver; private Preference mPreference; + private TetherBroadcastReceiver mTetherReceiver; @VisibleForTesting(otherwise = VisibleForTesting.NONE) TetherPreferenceController() { @@ -131,6 +135,11 @@ public class TetherPreferenceController extends PreferenceController if (mAirplaneModeObserver == null) { mAirplaneModeObserver = new SettingObserver(); } + if (mTetherReceiver == null) { + mTetherReceiver = new TetherBroadcastReceiver(); + } + mContext.registerReceiver( + mTetherReceiver, new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); mContext.getContentResolver() .registerContentObserver(mAirplaneModeObserver.uri, false, mAirplaneModeObserver); } @@ -140,6 +149,9 @@ public class TetherPreferenceController extends PreferenceController if (mAirplaneModeObserver != null) { mContext.getContentResolver().unregisterContentObserver(mAirplaneModeObserver); } + if (mTetherReceiver != null) { + mContext.unregisterReceiver(mTetherReceiver); + } } @Override @@ -238,4 +250,14 @@ public class TetherPreferenceController extends PreferenceController } } } + + @VisibleForTesting + class TetherBroadcastReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + updateSummary(); + } + + } } diff --git a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java index 7e92bc5e72c..cecc910b24c 100644 --- a/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/TetherPreferenceControllerTest.java @@ -20,7 +20,10 @@ package com.android.settings.network; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothProfile; +import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.database.ContentObserver; import android.net.ConnectivityManager; import android.provider.Settings; @@ -41,6 +44,7 @@ import org.robolectric.util.ReflectionHelpers; import java.util.concurrent.atomic.AtomicReference; +import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -150,4 +154,36 @@ public class TetherPreferenceControllerTest { verify(mPreference).setSummary(R.string.switch_off_text); } + @Test + public void onResume_shouldRegisterTetherReceiver() { + when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class)); + + mController.onResume(); + + verify(mContext).registerReceiver( + any(TetherPreferenceController.TetherBroadcastReceiver.class), any(IntentFilter.class)); + } + + @Test + public void onPause_shouldUnregisterTetherReceiver() { + when(mContext.getContentResolver()).thenReturn(mock(ContentResolver.class)); + mController.onResume(); + + mController.onPause(); + + verify(mContext).unregisterReceiver( + any(TetherPreferenceController.TetherBroadcastReceiver.class)); + } + + @Test + public void tetherStatesChanged_shouldUpdateSummary() { + final Context context = RuntimeEnvironment.application; + ReflectionHelpers.setField(mController, "mContext", context); + mController.onResume(); + + context.sendBroadcast(new Intent(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)); + + verify(mController).updateSummary(); + } + }