103 lines
4.1 KiB
Java
103 lines
4.1 KiB
Java
/*
|
|
* Copyright (C) 2020 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.server.wifi;
|
|
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import android.database.ContentObserver;
|
|
import android.os.Handler;
|
|
import android.provider.Settings;
|
|
import android.util.Log;
|
|
|
|
import com.android.internal.annotations.VisibleForTesting;
|
|
|
|
/**
|
|
* Note: This is a hack to provide backward compatibility with the
|
|
* {@link Settings.Global#WIFI_SCAN_ALWAYS_AVAILABLE} @hide settings usage. We migrated storage
|
|
* of the scan always available state from this setting to our internal storage, but need to support
|
|
* the existing @hide users.
|
|
* TODO(b/149954910): We should find a path to stop supporting this!
|
|
*/
|
|
public class WifiScanAlwaysAvailableSettingsCompatibility {
|
|
private static final String TAG = "WifiScanAlwaysAvailableSettingsCompatibility";
|
|
|
|
/**
|
|
* Copy of the settings string. Can't directly use the constant because it is @hide.
|
|
*/
|
|
@VisibleForTesting
|
|
public static final String SETTINGS_GLOBAL_WIFI_SCAN_ALWAYS_AVAILABLE =
|
|
"wifi_scan_always_enabled";
|
|
|
|
private final Context mContext;
|
|
private final ContentResolver mContentResolver;
|
|
private final Handler mHandler;
|
|
private final WifiSettingsStore mWifiSettingsStore;
|
|
private final ActiveModeWarden mActiveModeWarden;
|
|
private final FrameworkFacade mFrameworkFacade;
|
|
|
|
public WifiScanAlwaysAvailableSettingsCompatibility(Context context,
|
|
Handler handler, WifiSettingsStore wifiSettingsStore,
|
|
ActiveModeWarden activeModeWarden, FrameworkFacade frameworkFacade) {
|
|
mContext = context;
|
|
mHandler = handler;
|
|
mWifiSettingsStore = wifiSettingsStore;
|
|
mActiveModeWarden = activeModeWarden;
|
|
mFrameworkFacade = frameworkFacade;
|
|
|
|
// Cache the content resolver to ensure that we can detect self changes.
|
|
mContentResolver = context.getContentResolver();
|
|
}
|
|
|
|
/**
|
|
* Register settings change observer.
|
|
*/
|
|
public void initialize() {
|
|
ContentObserver contentObserver = new ContentObserver(mHandler) {
|
|
@Override
|
|
public void onChange(boolean selfChange) {
|
|
// Ignore any changes we triggered to avoid causing a loop.
|
|
if (selfChange) return;
|
|
|
|
boolean settingsIsAvailable =
|
|
mFrameworkFacade.getIntegerSetting(
|
|
mContentResolver, SETTINGS_GLOBAL_WIFI_SCAN_ALWAYS_AVAILABLE, 0)
|
|
== 1;
|
|
// Check if the new state is different from our current state.
|
|
if (mWifiSettingsStore.isScanAlwaysAvailableToggleEnabled()
|
|
!= settingsIsAvailable) {
|
|
Log.i(TAG, "settings changed, new value: " + settingsIsAvailable
|
|
+ ", triggering update");
|
|
mWifiSettingsStore.handleWifiScanAlwaysAvailableToggled(settingsIsAvailable);
|
|
mActiveModeWarden.scanAlwaysModeChanged();
|
|
}
|
|
}
|
|
};
|
|
mContentResolver.registerContentObserver(
|
|
Settings.Global.getUriFor(SETTINGS_GLOBAL_WIFI_SCAN_ALWAYS_AVAILABLE),
|
|
false, contentObserver);
|
|
}
|
|
|
|
/**
|
|
* Handle scan always available toggle from {@link android.net.wifi.WifiManager#
|
|
* setScanAlwaysAvailable(boolean)}
|
|
*/
|
|
public void handleWifiScanAlwaysAvailableToggled(boolean isAvailable) {
|
|
mFrameworkFacade.setIntegerSetting(
|
|
mContentResolver, SETTINGS_GLOBAL_WIFI_SCAN_ALWAYS_AVAILABLE, isAvailable ? 1 : 0);
|
|
}
|
|
}
|