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