Merge "Update wifi p2p to direct user to enable location" into qt-dev
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index 89c1575..718f7fb 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -74,7 +74,8 @@
 
     @Override
     protected List<AbstractPreferenceController> 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 15bffd9..2726de4 100644
--- a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
@@ -19,8 +19,10 @@
 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.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 @@
     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 @@
         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 4f3b7fd..86cce1e 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 @@
         }
     };
     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 @@
         super(context);
         mWifiManager = wifiManager;
         lifecycle.addObserver(this);
+        mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
     }
 
     @Override
@@ -67,13 +81,21 @@
     }
 
     @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 @@
 
     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 166b29b..ab5f4ea 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 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 @@
     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 0968803..ec8d168 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 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 @@
     private PreferenceScreen mScreen;
     @Mock
     private Preference mWifiDirectPreference;
+    @Mock
+    private LocationManager mLocationManager;
 
     private Lifecycle mLifecycle;
     private LifecycleOwner mLifecycleOwner;
@@ -69,6 +75,7 @@
         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 @@
     @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 @@
     @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);
     }
 }