WakeupController.java revision 04263765dc4bb2a74722d69db56c5b42e7fb1bc9
1a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/* 2a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Copyright 2017 The Android Open Source Project 3a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 4a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Licensed under the Apache License, Version 2.0 (the "License"); 5a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * you may not use this file except in compliance with the License. 6a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * You may obtain a copy of the License at 7a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 8a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * http://www.apache.org/licenses/LICENSE-2.0 9a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 10a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Unless required by applicable law or agreed to in writing, software 11a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * distributed under the License is distributed on an "AS IS" BASIS, 12a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * See the License for the specific language governing permissions and 14a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * limitations under the License. 15a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */ 16a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 17a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpackage com.android.server.wifi; 18a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 19a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.content.Context; 20a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.database.ContentObserver; 21a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.os.Handler; 22a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.os.Looper; 23a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.provider.Settings; 24a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 25a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport com.android.internal.annotations.VisibleForTesting; 26a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 2704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbachimport java.io.FileDescriptor; 2804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbachimport java.io.PrintWriter; 2904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach 30a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/** 31a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * WakeupController is responsible managing Auto Wifi. 32a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 33a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * <p>It determines if and when to re-enable wifi after it has been turned off by the user. 34a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */ 35a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpublic class WakeupController { 36a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 37a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach // TODO(b/69624403) propagate this to Settings 38a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private static final boolean USE_PLATFORM_WIFI_WAKE = false; 39a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 40a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final Context mContext; 41a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final Handler mHandler; 42a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final FrameworkFacade mFrameworkFacade; 43a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final ContentObserver mContentObserver; 44a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private final WakeupLock mWakeupLock; 45a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private final WifiConfigManager mWifiConfigManager; 46a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 47a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach /** Whether this feature is enabled in Settings. */ 48a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private boolean mWifiWakeupEnabled; 49a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 50a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach /** Whether the WakeupController is currently active. */ 51a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private boolean mIsActive = false; 52a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 53a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach public WakeupController( 54a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach Context context, 55a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach Looper looper, 56a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WakeupLock wakeupLock, 57a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WifiConfigManager wifiConfigManager, 58a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WifiConfigStore wifiConfigStore, 59a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach FrameworkFacade frameworkFacade) { 60a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContext = context; 61a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mHandler = new Handler(looper); 62a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mWakeupLock = wakeupLock; 63a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mWifiConfigManager = wifiConfigManager; 64a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mFrameworkFacade = frameworkFacade; 65a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContentObserver = new ContentObserver(mHandler) { 66a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach @Override 67a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach public void onChange(boolean selfChange) { 68a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mWifiWakeupEnabled = mFrameworkFacade.getIntegerSetting( 69a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContext, Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1; 70a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach } 71a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach }; 72a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mFrameworkFacade.registerContentObserver(mContext, Settings.Global.getUriFor( 73a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach Settings.Global.WIFI_WAKEUP_ENABLED), true, mContentObserver); 74a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContentObserver.onChange(false /* selfChange */); 75a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 76a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach // registering the store data here has the effect of reading the persisted value of the 77a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach // data sources after system boot finishes 78a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WakeupConfigStoreData wakeupConfigStoreData = 79a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach new WakeupConfigStoreData(new IsActiveDataSource(), mWakeupLock.getDataSource()); 80a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach wifiConfigStore.registerStoreData(wakeupConfigStoreData); 81a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 82a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 83a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private void setActive(boolean isActive) { 84a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach if (mIsActive != isActive) { 85a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mIsActive = isActive; 86a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mWifiConfigManager.saveToStore(false /* forceWrite */); 87a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 88a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach } 89a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 90a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach /** 91a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Whether the feature is enabled in settings. 92a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 93a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * <p>Note: This method is only used to determine whether or not to actually enable wifi. All 94a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * other aspects of the WakeupController lifecycle operate normally irrespective of this. 95a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */ 96a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach @VisibleForTesting 97a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach boolean isEnabled() { 98a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach return mWifiWakeupEnabled; 99a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach } 100a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 10104263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach /** Dumps wakeup controller state. */ 10204263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 10304263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach pw.println("Dump of WakeupController"); 10404263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach pw.println("mWifiWakeupEnabled: " + mWifiWakeupEnabled); 10504263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach pw.println("USE_PLATFORM_WIFI_WAKE: " + USE_PLATFORM_WIFI_WAKE); 10604263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach pw.println("mIsActive: " + mIsActive); 10704263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach mWakeupLock.dump(fd, pw, args); 10804263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach } 10904263765dc4bb2a74722d69db56c5b42e7fb1bc9Eric Schwarzenbach 110a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private class IsActiveDataSource implements WakeupConfigStoreData.DataSource<Boolean> { 111a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 112a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach @Override 113a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach public Boolean getData() { 114a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach return mIsActive; 115a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 116a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 117a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach @Override 118a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach public void setData(Boolean data) { 119a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mIsActive = data; 120a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 121a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 122a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach} 123