1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.settings.wifi.p2p;
17 
18 import android.app.Service;
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.location.LocationManager;
24 import android.net.wifi.WifiManager;
25 
26 import androidx.annotation.VisibleForTesting;
27 import androidx.preference.Preference;
28 import androidx.preference.PreferenceScreen;
29 
30 import com.android.settings.core.PreferenceControllerMixin;
31 import com.android.settingslib.core.AbstractPreferenceController;
32 import com.android.settingslib.core.lifecycle.Lifecycle;
33 import com.android.settingslib.core.lifecycle.LifecycleObserver;
34 import com.android.settingslib.core.lifecycle.events.OnPause;
35 import com.android.settingslib.core.lifecycle.events.OnResume;
36 
37 /**
38  * {@link PreferenceControllerMixin} to toggle Wifi Direct preference on Wi-Fi state.
39  */
40 public class WifiP2pPreferenceController extends AbstractPreferenceController
41         implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnResume {
42 
43     private static final String KEY_WIFI_DIRECT = "wifi_direct";
44 
45     private final WifiManager mWifiManager;
46     @VisibleForTesting
47     final BroadcastReceiver mReceiver = new BroadcastReceiver() {
48         @Override
49         public void onReceive(Context context, Intent intent) {
50             togglePreferences();
51         }
52     };
53     private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
54     private final LocationManager mLocationManager;
55     @VisibleForTesting
56     final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() {
57         @Override
58         public void onReceive(Context context, Intent intent) {
59             if (mWifiDirectPref != null) {
60                 updateState(mWifiDirectPref);
61             }
62         }
63     };
64     private final IntentFilter mLocationFilter =
65             new IntentFilter(LocationManager.MODE_CHANGED_ACTION);
66 
67     private Preference mWifiDirectPref;
68 
WifiP2pPreferenceController( Context context, Lifecycle lifecycle, WifiManager wifiManager)69     public WifiP2pPreferenceController(
70             Context context, Lifecycle lifecycle, WifiManager wifiManager) {
71         super(context);
72         mWifiManager = wifiManager;
73         lifecycle.addObserver(this);
74         mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE);
75     }
76 
77     @Override
displayPreference(PreferenceScreen screen)78     public void displayPreference(PreferenceScreen screen) {
79         super.displayPreference(screen);
80         mWifiDirectPref = screen.findPreference(KEY_WIFI_DIRECT);
81         togglePreferences();
82     }
83 
84     @Override
updateState(Preference preference)85     public void updateState(Preference preference) {
86         super.updateState(preference);
87         preference.setEnabled(mLocationManager.isLocationEnabled() && mWifiManager.isWifiEnabled());
88     }
89 
90     @Override
onResume()91     public void onResume() {
92         mContext.registerReceiver(mReceiver, mFilter);
93         mContext.registerReceiver(mLocationReceiver, mLocationFilter);
94     }
95 
96     @Override
onPause()97     public void onPause() {
98         mContext.unregisterReceiver(mReceiver);
99         mContext.unregisterReceiver(mLocationReceiver);
100     }
101 
102     @Override
isAvailable()103     public boolean isAvailable() {
104         // Always show preference.
105         return true;
106     }
107     @Override
getPreferenceKey()108     public String getPreferenceKey() {
109         return KEY_WIFI_DIRECT;
110     }
111 
togglePreferences()112     private void togglePreferences() {
113         if (mWifiDirectPref != null) {
114             mWifiDirectPref.setEnabled(
115                     mWifiManager.isWifiEnabled()
116                     && mLocationManager.isLocationEnabled());
117         }
118     }
119 }
120