diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java index 89c157587a2..718f7fb196b 100644 --- a/src/com/android/settings/wifi/ConfigureWifiSettings.java +++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java @@ -74,7 +74,8 @@ public class ConfigureWifiSettings extends DashboardFragment { @Override protected List createPreferenceControllers(Context context) { - mWifiWakeupPreferenceController = new WifiWakeupPreferenceController(context, this); + mWifiWakeupPreferenceController = new WifiWakeupPreferenceController(context, this, + getSettingsLifecycle()); mUseOpenWifiPreferenceController = new UseOpenWifiPreferenceController(context, this, getSettingsLifecycle()); final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); diff --git a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java index 15bffd952cf..2726de49df2 100644 --- a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java +++ b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java @@ -19,8 +19,10 @@ package com.android.settings.wifi; import static com.android.settings.wifi.ConfigureWifiSettings.WIFI_WAKEUP_REQUEST_CODE; import android.app.Service; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.location.LocationManager; import android.provider.Settings; import android.text.TextUtils; @@ -36,12 +38,17 @@ import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.utils.AnnotationSpan; import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnPause; +import com.android.settingslib.core.lifecycle.events.OnResume; /** * {@link PreferenceControllerMixin} that controls whether the Wi-Fi Wakeup feature should be * enabled. */ -public class WifiWakeupPreferenceController extends AbstractPreferenceController { +public class WifiWakeupPreferenceController extends AbstractPreferenceController implements + LifecycleObserver, OnPause, OnResume { private static final String TAG = "WifiWakeupPrefController"; private static final String KEY_ENABLE_WIFI_WAKEUP = "enable_wifi_wakeup"; @@ -52,11 +59,21 @@ public class WifiWakeupPreferenceController extends AbstractPreferenceController SwitchPreference mPreference; @VisibleForTesting LocationManager mLocationManager; + private final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + updateState(mPreference); + } + }; + private final IntentFilter mLocationFilter = + new IntentFilter(LocationManager.MODE_CHANGED_ACTION); - public WifiWakeupPreferenceController(Context context, DashboardFragment fragment) { + public WifiWakeupPreferenceController(Context context, DashboardFragment fragment, + Lifecycle lifecycle) { super(context); mFragment = fragment; mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE); + lifecycle.addObserver(this); } @Override @@ -155,4 +172,14 @@ public class WifiWakeupPreferenceController extends AbstractPreferenceController Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED, enabled ? 1 : 0); } + + @Override + public void onResume() { + mContext.registerReceiver(mLocationReceiver, mLocationFilter); + } + + @Override + public void onPause() { + mContext.unregisterReceiver(mLocationReceiver); + } } diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java index 4f3b7fd63b3..86cce1ef1c8 100644 --- a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java +++ b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java @@ -15,10 +15,12 @@ */ package com.android.settings.wifi.p2p; +import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.location.LocationManager; import android.net.wifi.WifiManager; import androidx.annotation.VisibleForTesting; @@ -49,6 +51,17 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController } }; private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); + private final LocationManager mLocationManager; + private final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (mWifiDirectPref != null) { + updateState(mWifiDirectPref); + } + } + }; + private final IntentFilter mLocationFilter = + new IntentFilter(LocationManager.MODE_CHANGED_ACTION); private Preference mWifiDirectPref; @@ -57,6 +70,7 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController super(context); mWifiManager = wifiManager; lifecycle.addObserver(this); + mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE); } @Override @@ -66,14 +80,22 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController togglePreferences(); } + @Override + public void updateState(Preference preference) { + super.updateState(preference); + preference.setEnabled(mLocationManager.isLocationEnabled() && mWifiManager.isWifiEnabled()); + } + @Override public void onResume() { mContext.registerReceiver(mReceiver, mFilter); + mContext.registerReceiver(mLocationReceiver, mLocationFilter); } @Override public void onPause() { mContext.unregisterReceiver(mReceiver); + mContext.unregisterReceiver(mLocationReceiver); } @Override @@ -88,7 +110,9 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController private void togglePreferences() { if (mWifiDirectPref != null) { - mWifiDirectPref.setEnabled(mWifiManager.isWifiEnabled()); + mWifiDirectPref.setEnabled( + mWifiManager.isWifiEnabled() + && mLocationManager.isLocationEnabled()); } } } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java index 166b29b0d59..ab5f4ea42bb 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java @@ -34,6 +34,7 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; +import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,12 +54,14 @@ public class WifiWakeupPreferenceControllerTest { private LocationManager mLocationManager; @Mock private SwitchPreference mPreference; + @Mock + private Lifecycle mLifecycle; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mController = new WifiWakeupPreferenceController(mContext, mFragment); + mController = new WifiWakeupPreferenceController(mContext, mFragment, mLifecycle); mController.mLocationManager = mLocationManager; mController.mPreference = mPreference; diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java index 096880359e2..ec8d16802d2 100644 --- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java @@ -22,20 +22,24 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.location.LocationManager; import android.net.wifi.WifiManager; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; @@ -57,6 +61,8 @@ public class WifiP2PPreferenceControllerTest { private PreferenceScreen mScreen; @Mock private Preference mWifiDirectPreference; + @Mock + private LocationManager mLocationManager; private Lifecycle mLifecycle; private LifecycleOwner mLifecycleOwner; @@ -69,6 +75,7 @@ public class WifiP2PPreferenceControllerTest { mLifecycle = new Lifecycle(mLifecycleOwner); when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mScreen.findPreference(anyString())).thenReturn(mWifiDirectPreference); + when(mContext.getSystemService(eq(Service.LOCATION_SERVICE))).thenReturn(mLocationManager); mController = new WifiP2pPreferenceController(mContext, mLifecycle, mWifiManager); } @@ -80,19 +87,21 @@ public class WifiP2PPreferenceControllerTest { @Test public void testOnResume_shouldRegisterListener() { mLifecycle.handleLifecycleEvent(ON_RESUME); - verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); + verify(mContext, times(2)).registerReceiver( + any(BroadcastReceiver.class), any(IntentFilter.class)); } @Test public void testOnPause_shouldUnregisterListener() { mLifecycle.handleLifecycleEvent(ON_RESUME); mLifecycle.handleLifecycleEvent(ON_PAUSE); - verify(mContext).unregisterReceiver(any(BroadcastReceiver.class)); + verify(mContext, times(2)).unregisterReceiver(any(BroadcastReceiver.class)); } @Test public void testWifiStateChange_shouldToggleEnabledState() { when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mLocationManager.isLocationEnabled()).thenReturn(true); //Sets the preferences. mController.displayPreference(mScreen); @@ -110,11 +119,17 @@ public class WifiP2PPreferenceControllerTest { @Test public void testDisplayPreference_shouldToggleEnabledState() { when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mLocationManager.isLocationEnabled()).thenReturn(true); mController.displayPreference(mScreen); verify(mWifiDirectPreference).setEnabled(true); when(mWifiManager.isWifiEnabled()).thenReturn(false); mController.displayPreference(mScreen); verify(mWifiDirectPreference).setEnabled(false); + + when(mWifiManager.isWifiEnabled()).thenReturn(true); + when(mLocationManager.isLocationEnabled()).thenReturn(false); + mController.displayPreference(mScreen); + verify(mWifiDirectPreference, times(2)).setEnabled(false); } }