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