1af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/*
2af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Copyright (C) 2014 The Android Open Source Project
3af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
4af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Licensed under the Apache License, Version 2.0 (the "License");
5af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * you may not use this file except in compliance with the License.
6af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * You may obtain a copy of the License at
7af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
8af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *      http://www.apache.org/licenses/LICENSE-2.0
9af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock *
10af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * Unless required by applicable law or agreed to in writing, software
11af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * distributed under the License is distributed on an "AS IS" BASIS,
12af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * See the License for the specific language governing permissions and
14af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock * limitations under the License.
15af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock */
16af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
17af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpackage com.android.systemui.qs.tiles;
18af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
19af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Context;
20af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.Intent;
21af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.content.res.Resources;
22af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport android.provider.Settings;
23ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlockimport android.util.Log;
247f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlockimport android.view.View;
257f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlockimport android.view.ViewGroup;
26af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
27457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wrenimport com.android.internal.logging.MetricsLogger;
28d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monkimport com.android.settingslib.wifi.AccessPoint;
29af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.R;
30486b78e42652466f6241eb87d5bed60040db7a25John Spurlockimport com.android.systemui.qs.QSDetailItems;
31486b78e42652466f6241eb87d5bed60040db7a25John Spurlockimport com.android.systemui.qs.QSDetailItems.Item;
32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTile;
33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTileView;
34af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.SignalTileView;
35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkController;
36d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monkimport com.android.systemui.statusbar.policy.NetworkController.AccessPointController;
3707b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport com.android.systemui.statusbar.policy.NetworkController.IconState;
3807b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport com.android.systemui.statusbar.policy.SignalCallbackAdapter;
3907b75fe65dcb5b8add8246654c65f95f1191933eJason Monk
4007b75fe65dcb5b8add8246654c65f95f1191933eJason Monkimport java.util.List;
41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
42af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Quick settings tile: Wifi **/
43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class WifiTile extends QSTile<QSTile.SignalState> {
44af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS);
45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final NetworkController mController;
47d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk    private final AccessPointController mWifiController;
487f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    private final WifiDetailAdapter mDetailAdapter;
494fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    private final QSTile.SignalState mStateBeforeClick = newTileState();
50af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
51878c093336b324962f1b659aa29c79caed75ef2fJason Monk    private final WifiSignalCallback mSignalCallback = new WifiSignalCallback();
52878c093336b324962f1b659aa29c79caed75ef2fJason Monk
53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public WifiTile(Host host) {
54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        super(host);
55af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mController = host.getNetworkController();
56d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk        mWifiController = mController.getAccessPointController();
577f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mDetailAdapter = new WifiDetailAdapter();
58ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    }
59ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock
60ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    @Override
61ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    public boolean supportsDualTargets() {
62ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        return true;
63af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
64af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
65af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
66af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected SignalState newTileState() {
67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return new SignalState();
68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
70af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
71ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    public void setListening(boolean listening) {
72ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        if (listening) {
7307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            mController.addSignalCallback(mSignalCallback);
74ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        } else {
7507b75fe65dcb5b8add8246654c65f95f1191933eJason Monk            mController.removeSignalCallback(mSignalCallback);
760d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk        }
770d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk    }
780d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk
790d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk    @Override
800d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk    public void setDetailListening(boolean listening) {
810d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk        if (listening) {
820d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk            mWifiController.addAccessPointCallback(mDetailAdapter);
830d6a1c445c98f67b4fd314b58d703ec1c28e5658Jason Monk        } else {
84d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk            mWifiController.removeAccessPointCallback(mDetailAdapter);
85ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        }
86af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
87af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
88af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
897f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    public DetailAdapter getDetailAdapter() {
907f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        return mDetailAdapter;
917f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    }
927f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
937f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    @Override
94af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public QSTileView createTileView(Context context) {
95af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return new SignalTileView(context);
96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
98af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
99af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleClick() {
1004fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek        mState.copyTo(mStateBeforeClick);
1019e7283f6a31bc2beb75c84c6173968a46582c563Chris Wren        MetricsLogger.action(mContext, getMetricsCategory(), !mState.enabled);
102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mController.setWifiEnabled(!mState.enabled);
103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
104af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
105af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
106af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleSecondaryClick() {
107d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk        if (!mWifiController.canConfigWifi()) {
108ee43cdfa43b09a79e66d81f6673a79bc26427343Jason Monk            mHost.startActivityDismissingKeyguard(new Intent(Settings.ACTION_WIFI_SETTINGS));
1095d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk            return;
1105d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk        }
1115d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk        if (!mState.enabled) {
1125d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk            mController.setWifiEnabled(true);
1135d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk            mState.enabled = true;
1145d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk        }
1155d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk        showDetail(true);
116af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
117af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
119af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleUpdateState(SignalState state, Object arg) {
120af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.visible = true;
121ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg);
122af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        CallbackInfo cb = (CallbackInfo) arg;
123878c093336b324962f1b659aa29c79caed75ef2fJason Monk        if (cb == null) {
124878c093336b324962f1b659aa29c79caed75ef2fJason Monk            cb = mSignalCallback.mInfo;
125878c093336b324962f1b659aa29c79caed75ef2fJason Monk        }
126af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
127af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.enabledDesc != null);
128af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiNotConnected = (cb.wifiSignalIconId > 0) && (cb.enabledDesc == null);
1297f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        boolean enabledChanging = state.enabled != cb.enabled;
1307f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        if (enabledChanging) {
131486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mDetailAdapter.setItemsVisible(cb.enabled);
1327f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            fireToggleStateChanged(cb.enabled);
1337f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
1343d09bbd04fc5ee028316f6cd38178c8095faa653John Spurlock        state.enabled = cb.enabled;
135af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.connected = wifiConnected;
136af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.activityIn = cb.enabled && cb.activityIn;
137af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.activityOut = cb.enabled && cb.activityOut;
138899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock        state.filter = true;
139af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final String signalContentDescription;
140af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final Resources r = mContext.getResources();
141c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock        if (!state.enabled) {
1422d695813b44690ca146f95939acb00f0c14dac29John Spurlock            state.icon = ResourceIcon.get(R.drawable.ic_qs_wifi_disabled);
143c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock            state.label = r.getString(R.string.quick_settings_wifi_label);
144c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock            signalContentDescription = r.getString(R.string.accessibility_wifi_off);
145c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock        } else if (wifiConnected) {
1462d695813b44690ca146f95939acb00f0c14dac29John Spurlock            state.icon = ResourceIcon.get(cb.wifiSignalIconId);
147af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.label = removeDoubleQuotes(cb.enabledDesc);
148af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            signalContentDescription = cb.wifiSignalContentDescription;
149af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (wifiNotConnected) {
1507d0e5985def78d672885a768ea32272a0bbe88f4Jason Monk            state.icon = ResourceIcon.get(R.drawable.ic_qs_wifi_full_0);
151af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.label = r.getString(R.string.quick_settings_wifi_label);
152af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            signalContentDescription = r.getString(R.string.accessibility_no_wifi);
153af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
1542d695813b44690ca146f95939acb00f0c14dac29John Spurlock            state.icon = ResourceIcon.get(R.drawable.ic_qs_wifi_no_network);
155012d4a229c2373519b5ebc3e19d8b27d6ce55843John Spurlock            state.label = r.getString(R.string.quick_settings_wifi_label);
156af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            signalContentDescription = r.getString(R.string.accessibility_wifi_off);
157af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
158af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.contentDescription = mContext.getString(
159af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                R.string.accessibility_quick_settings_wifi,
160e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek                signalContentDescription);
161e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        String wifiName = state.label;
162e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        if (state.connected) {
163e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek            wifiName = r.getString(R.string.accessibility_wifi_name, state.label);
164e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        }
165e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        state.dualLabelContentDescription = wifiName;
166af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
167af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
1684fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    @Override
169457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren    public int getMetricsCategory() {
170457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren        return MetricsLogger.QS_WIFI;
171457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren    }
172457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren
173457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren    @Override
1744fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    protected boolean shouldAnnouncementBeDelayed() {
1754fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek        return mStateBeforeClick.enabled == mState.enabled;
1764fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    }
1774fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek
1784fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    @Override
1794fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    protected String composeChangeAnnouncement() {
1804fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek        if (mState.enabled) {
1814fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek            return mContext.getString(R.string.accessibility_quick_settings_wifi_changed_on);
1824fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek        } else {
1834fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek            return mContext.getString(R.string.accessibility_quick_settings_wifi_changed_off);
1844fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek        }
1854fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek    }
1864fda7b2d97c77c64bac0b44dc7a44597ad2c48b0Selim Cinek
187af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static String removeDoubleQuotes(String string) {
188af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (string == null) return null;
189af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final int length = string.length();
190af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
191af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            return string.substring(1, length - 1);
192af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
193af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return string;
194af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
195af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
196af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static final class CallbackInfo {
197af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean enabled;
198d5cd2fd15b8f2c9df9a3659cc294bf475e5aab13John Spurlock        boolean connected;
199af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        int wifiSignalIconId;
200af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String enabledDesc;
201af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean activityIn;
202af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean activityOut;
203af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String wifiSignalContentDescription;
204ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock
205ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        @Override
206ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        public String toString() {
207ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            return new StringBuilder("CallbackInfo[")
208ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append("enabled=").append(enabled)
209d5cd2fd15b8f2c9df9a3659cc294bf475e5aab13John Spurlock                .append(",connected=").append(connected)
210ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",wifiSignalIconId=").append(wifiSignalIconId)
211ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",enabledDesc=").append(enabledDesc)
212ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",activityIn=").append(activityIn)
213ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",activityOut=").append(activityOut)
214ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",wifiSignalContentDescription=").append(wifiSignalContentDescription)
215ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(']').toString();
216ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        }
217af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
218af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
219878c093336b324962f1b659aa29c79caed75ef2fJason Monk    private final class WifiSignalCallback extends SignalCallbackAdapter {
220878c093336b324962f1b659aa29c79caed75ef2fJason Monk        final CallbackInfo mInfo = new CallbackInfo();
221878c093336b324962f1b659aa29c79caed75ef2fJason Monk
222af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
22307b75fe65dcb5b8add8246654c65f95f1191933eJason Monk        public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
22407b75fe65dcb5b8add8246654c65f95f1191933eJason Monk                boolean activityIn, boolean activityOut, String description) {
225ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled);
226878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.enabled = enabled;
227878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.connected = qsIcon.visible;
228878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.wifiSignalIconId = qsIcon.icon;
229878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.enabledDesc = description;
230878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.activityIn = activityIn;
231878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.activityOut = activityOut;
232878c093336b324962f1b659aa29c79caed75ef2fJason Monk            mInfo.wifiSignalContentDescription = qsIcon.contentDescription;
233878c093336b324962f1b659aa29c79caed75ef2fJason Monk            refreshState(mInfo);
234af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
235af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    };
2367f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2377f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    private final class WifiDetailAdapter implements DetailAdapter,
238d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk            NetworkController.AccessPointController.AccessPointCallback, QSDetailItems.Callback {
2397f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
240486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        private QSDetailItems mItems;
2417f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        private AccessPoint[] mAccessPoints;
2427f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2437f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2447f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public int getTitle() {
2457f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return R.string.quick_settings_wifi_label;
2467f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2477f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2487f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public Intent getSettingsIntent() {
2497f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return WIFI_SETTINGS;
2507f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2517f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2527f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2537f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public Boolean getToggleState() {
2547f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return mState.enabled;
2557f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2567f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2577f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2587f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public void setToggleState(boolean state) {
2597f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            if (DEBUG) Log.d(TAG, "setToggleState " + state);
2609e7283f6a31bc2beb75c84c6173968a46582c563Chris Wren            MetricsLogger.action(mContext, MetricsLogger.QS_WIFI_TOGGLE, state);
2617f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            mController.setWifiEnabled(state);
2627f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            showDetail(false);
2637f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2647f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2657f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
266457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren        public int getMetricsCategory() {
267457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren            return MetricsLogger.QS_WIFI_DETAILS;
268457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren        }
269457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren
270457a21cdeac04565a0c40ad8c43a928c1182ddd1Chris Wren        @Override
2717f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public View createDetailView(Context context, View convertView, ViewGroup parent) {
272486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (DEBUG) Log.d(TAG, "createDetailView convertView=" + (convertView != null));
273486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mAccessPoints = null;
274d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk            mWifiController.scanForAccessPoints();
275486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            fireScanStateChanged(true);
276486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems = QSDetailItems.convertOrInflate(context, convertView, parent);
277486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setTagSuffix("Wifi");
278486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setCallback(this);
279486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
280486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    R.string.quick_settings_wifi_detail_empty_text);
2817f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            updateItems();
282486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            setItemsVisible(mState.enabled);
2837f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return mItems;
2847f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2857f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2867f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
287d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk        public void onAccessPointsChanged(final List<AccessPoint> accessPoints) {
288d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk            mAccessPoints = accessPoints.toArray(new AccessPoint[accessPoints.size()]);
289486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            updateItems();
290d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk            if (accessPoints != null && accessPoints.size() > 0) {
291486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                fireScanStateChanged(false);
292486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            }
2937f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2947f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
295486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        @Override
29617f3c3f4fb3845cf933fe82495b914112e819fb4Jason Monk        public void onSettingsActivityTriggered(Intent settingsIntent) {
297ee43cdfa43b09a79e66d81f6673a79bc26427343Jason Monk            mHost.startActivityDismissingKeyguard(settingsIntent);
29817f3c3f4fb3845cf933fe82495b914112e819fb4Jason Monk        }
29917f3c3f4fb3845cf933fe82495b914112e819fb4Jason Monk
30017f3c3f4fb3845cf933fe82495b914112e819fb4Jason Monk        @Override
301486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        public void onDetailItemClick(Item item) {
302486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (item == null || item.tag == null) return;
303486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            final AccessPoint ap = (AccessPoint) item.tag;
304d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk            if (!ap.isActive()) {
305d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk                if (mWifiController.connect(ap)) {
3065d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk                    mHost.collapsePanels();
3075d325074b14e102a90c211a8d7b65316158ac0e4Jason Monk                }
308486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            }
309486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            showDetail(false);
310486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        }
311486b78e42652466f6241eb87d5bed60040db7a25John Spurlock
312486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        @Override
313486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        public void onDetailItemDisconnect(Item item) {
314486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            // noop
315486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        }
316486b78e42652466f6241eb87d5bed60040db7a25John Spurlock
317486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        public void setItemsVisible(boolean visible) {
318486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (mItems == null) return;
319486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setItemsVisible(visible);
3207f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
3217f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
3227f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        private void updateItems() {
3237f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            if (mItems == null) return;
324486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            Item[] items = null;
325486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (mAccessPoints != null) {
326486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                items = new Item[mAccessPoints.length];
327486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                for (int i = 0; i < mAccessPoints.length; i++) {
328486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    final AccessPoint ap = mAccessPoints[i];
329486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    final Item item = new Item();
330486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    item.tag = ap;
331d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk                    item.icon = mWifiController.getIcon(ap);
332d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk                    item.line1 = ap.getSsid();
333283c8b72aa6f72431d0684972782bac667e19617Jason Monk                    item.line2 = ap.isActive() ? ap.getSummary() : null;
334d52356aa5e82c7c5db61672bbe8d0f44861f3e59Jason Monk                    item.overlay = ap.getSecurity() != AccessPoint.SECURITY_NONE
335b27ec6d37d277fe54cb8b85590758a7ad1767ff0Jason Monk                            ? mContext.getDrawable(R.drawable.qs_ic_wifi_lock)
336b27ec6d37d277fe54cb8b85590758a7ad1767ff0Jason Monk                            : null;
337486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    items[i] = item;
338486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                }
3397f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            }
340486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setItems(items);
3417f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
3427f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    };
343af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock}
344