WifiTile.java revision e5557a972ca190cb82026a5dd0c53f4d119fa05a
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
27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.R;
28486b78e42652466f6241eb87d5bed60040db7a25John Spurlockimport com.android.systemui.qs.QSDetailItems;
29486b78e42652466f6241eb87d5bed60040db7a25John Spurlockimport com.android.systemui.qs.QSDetailItems.Item;
30af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTile;
31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTileView;
32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.SignalTileView;
33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkController;
347f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlockimport com.android.systemui.statusbar.policy.NetworkController.AccessPoint;
35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Quick settings tile: Wifi **/
38af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class WifiTile extends QSTile<QSTile.SignalState> {
39af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS);
40af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
41af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final NetworkController mController;
427f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    private final WifiDetailAdapter mDetailAdapter;
43af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
44af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public WifiTile(Host host) {
45af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        super(host);
46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mController = host.getNetworkController();
477f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        mDetailAdapter = new WifiDetailAdapter();
48ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    }
49ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock
50ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    @Override
51ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    public boolean supportsDualTargets() {
52ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        return true;
53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
54af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
55af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
56af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected SignalState newTileState() {
57af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return new SignalState();
58af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
59af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
60af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
61ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock    public void setListening(boolean listening) {
62ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        if (listening) {
63ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            mController.addNetworkSignalChangedCallback(mCallback);
647f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            mController.addAccessPointCallback(mDetailAdapter);
65ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        } else {
66ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            mController.removeNetworkSignalChangedCallback(mCallback);
677f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            mController.removeAccessPointCallback(mDetailAdapter);
68ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        }
69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
70af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
71af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
727f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    public DetailAdapter getDetailAdapter() {
737f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        return mDetailAdapter;
747f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    }
757f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
767f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    @Override
77af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    public QSTileView createTileView(Context context) {
78af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return new SignalTileView(context);
79af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
80af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
81af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
82af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleClick() {
83af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        mController.setWifiEnabled(!mState.enabled);
84af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
85af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
86af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
87af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleSecondaryClick() {
88f84a1b87c73ba1500bf337509de6f24166e14493John Spurlock        if (!mState.enabled) {
89f84a1b87c73ba1500bf337509de6f24166e14493John Spurlock            mController.setWifiEnabled(true);
90f84a1b87c73ba1500bf337509de6f24166e14493John Spurlock            mState.enabled = true;
91f84a1b87c73ba1500bf337509de6f24166e14493John Spurlock        }
927f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        showDetail(true);
93af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
94af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
95af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    @Override
96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    protected void handleUpdateState(SignalState state, Object arg) {
97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.visible = true;
98ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg);
99ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        if (arg == null) return;
100af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        CallbackInfo cb = (CallbackInfo) arg;
101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.enabledDesc != null);
103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean wifiNotConnected = (cb.wifiSignalIconId > 0) && (cb.enabledDesc == null);
1047f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        boolean enabledChanging = state.enabled != cb.enabled;
1057f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        if (enabledChanging) {
106486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mDetailAdapter.setItemsVisible(cb.enabled);
1077f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            fireToggleStateChanged(cb.enabled);
1087f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
1093d09bbd04fc5ee028316f6cd38178c8095faa653John Spurlock        state.enabled = cb.enabled;
110af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.connected = wifiConnected;
111af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.activityIn = cb.enabled && cb.activityIn;
112af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.activityOut = cb.enabled && cb.activityOut;
113899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock        state.filter = true;
114af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final String signalContentDescription;
115af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final Resources r = mContext.getResources();
116c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock        if (!state.enabled) {
117c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock            state.iconId = R.drawable.ic_qs_wifi_disabled;
118c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock            state.label = r.getString(R.string.quick_settings_wifi_label);
119c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock            signalContentDescription = r.getString(R.string.accessibility_wifi_off);
120c1d48a5b7174a8599b1a9f34e47635cab83e036cJohn Spurlock        } else if (wifiConnected) {
121af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.iconId = cb.wifiSignalIconId;
122af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.label = removeDoubleQuotes(cb.enabledDesc);
123af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            signalContentDescription = cb.wifiSignalContentDescription;
124af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else if (wifiNotConnected) {
125af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.iconId = R.drawable.ic_qs_wifi_0;
126af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.label = r.getString(R.string.quick_settings_wifi_label);
127af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            signalContentDescription = r.getString(R.string.accessibility_no_wifi);
128af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        } else {
129af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            state.iconId = R.drawable.ic_qs_wifi_no_network;
130012d4a229c2373519b5ebc3e19d8b27d6ce55843John Spurlock            state.label = r.getString(R.string.quick_settings_wifi_label);
131af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            signalContentDescription = r.getString(R.string.accessibility_wifi_off);
132af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
133af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        state.contentDescription = mContext.getString(
134af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                R.string.accessibility_quick_settings_wifi,
135e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek                signalContentDescription);
136e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        String wifiName = state.label;
137e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        if (state.connected) {
138e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek            wifiName = r.getString(R.string.accessibility_wifi_name, state.label);
139e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        }
140e5557a972ca190cb82026a5dd0c53f4d119fa05aSelim Cinek        state.dualLabelContentDescription = wifiName;
141af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
142af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
143af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static String removeDoubleQuotes(String string) {
144af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if (string == null) return null;
145af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        final int length = string.length();
146af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
147af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            return string.substring(1, length - 1);
148af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
149af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        return string;
150af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
151af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
152af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private static final class CallbackInfo {
153af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean enabled;
154d5cd2fd15b8f2c9df9a3659cc294bf475e5aab13John Spurlock        boolean connected;
155af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        int wifiSignalIconId;
156af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String enabledDesc;
157af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean activityIn;
158af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        boolean activityOut;
159af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        String wifiSignalContentDescription;
160ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock
161ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        @Override
162ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        public String toString() {
163ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            return new StringBuilder("CallbackInfo[")
164ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append("enabled=").append(enabled)
165d5cd2fd15b8f2c9df9a3659cc294bf475e5aab13John Spurlock                .append(",connected=").append(connected)
166ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",wifiSignalIconId=").append(wifiSignalIconId)
167ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",enabledDesc=").append(enabledDesc)
168ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",activityIn=").append(activityIn)
169ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",activityOut=").append(activityOut)
170ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(",wifiSignalContentDescription=").append(wifiSignalContentDescription)
171ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock                .append(']').toString();
172ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock        }
173af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    }
174af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
175af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() {
176af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
177d5cd2fd15b8f2c9df9a3659cc294bf475e5aab13John Spurlock        public void onWifiSignalChanged(boolean enabled, boolean connected, int wifiSignalIconId,
178af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                boolean activityIn, boolean activityOut,
179af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                String wifiSignalContentDescriptionId, String description) {
180ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock            if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled);
181af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            final CallbackInfo info = new CallbackInfo();
182af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            info.enabled = enabled;
183d5cd2fd15b8f2c9df9a3659cc294bf475e5aab13John Spurlock            info.connected = connected;
184af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            info.wifiSignalIconId = wifiSignalIconId;
185af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            info.enabledDesc = description;
186af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            info.activityIn = activityIn;
187af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            info.activityOut = activityOut;
188af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            info.wifiSignalContentDescription = wifiSignalContentDescriptionId;
189af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            refreshState(info);
190af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
191af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
192af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
193af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onMobileDataSignalChanged(boolean enabled,
194af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                int mobileSignalIconId,
195af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                String mobileSignalContentDescriptionId, int dataTypeIconId,
196af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock                boolean activityIn, boolean activityOut,
197899f439a29ab1e609e7ba2aea3e9de3afef35c50John Spurlock                String dataTypeContentDescriptionId, String description, boolean noSim) {
198af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // noop
199af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
200af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock
201af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        @Override
202af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        public void onAirplaneModeChanged(boolean enabled) {
203af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock            // noop
204af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock        }
205b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock
206b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        @Override
207b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        public void onMobileDataEnabled(boolean enabled) {
208b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock            // noop
209b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock        }
210af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock    };
2117f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2127f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    private final class WifiDetailAdapter implements DetailAdapter,
213486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            NetworkController.AccessPointCallback, QSDetailItems.Callback {
2147f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
215486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        private QSDetailItems mItems;
2167f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        private AccessPoint[] mAccessPoints;
2177f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2187f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2197f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public int getTitle() {
2207f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return R.string.quick_settings_wifi_label;
2217f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2227f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2237f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public Intent getSettingsIntent() {
2247f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return WIFI_SETTINGS;
2257f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2267f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2277f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2287f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public Boolean getToggleState() {
2297f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return mState.enabled;
2307f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2317f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2327f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2337f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public void setToggleState(boolean state) {
2347f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            if (DEBUG) Log.d(TAG, "setToggleState " + state);
2357f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            mController.setWifiEnabled(state);
2367f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            showDetail(false);
2377f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2387f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2397f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2407f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public View createDetailView(Context context, View convertView, ViewGroup parent) {
241486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (DEBUG) Log.d(TAG, "createDetailView convertView=" + (convertView != null));
242486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mAccessPoints = null;
243486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mController.scanForAccessPoints();
244486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            fireScanStateChanged(true);
245486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems = QSDetailItems.convertOrInflate(context, convertView, parent);
246486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setTagSuffix("Wifi");
247486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setCallback(this);
248486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
249486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    R.string.quick_settings_wifi_detail_empty_text);
2507f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            updateItems();
251486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            setItemsVisible(mState.enabled);
2527f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            return mItems;
2537f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2547f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2557f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        @Override
2567f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        public void onAccessPointsChanged(final AccessPoint[] accessPoints) {
257486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mAccessPoints = accessPoints;
258486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            updateItems();
259486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (accessPoints != null && accessPoints.length > 0) {
260486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                fireScanStateChanged(false);
261486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            }
2627f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2637f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
264486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        @Override
265486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        public void onDetailItemClick(Item item) {
266486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (item == null || item.tag == null) return;
267486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            final AccessPoint ap = (AccessPoint) item.tag;
268486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (!ap.isConnected) {
269486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                mController.connect(ap);
270486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            }
271486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            showDetail(false);
272486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        }
273486b78e42652466f6241eb87d5bed60040db7a25John Spurlock
274486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        @Override
275486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        public void onDetailItemDisconnect(Item item) {
276486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            // noop
277486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        }
278486b78e42652466f6241eb87d5bed60040db7a25John Spurlock
279486b78e42652466f6241eb87d5bed60040db7a25John Spurlock        public void setItemsVisible(boolean visible) {
280486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (mItems == null) return;
281486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setItemsVisible(visible);
2827f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
2837f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock
2847f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        private void updateItems() {
2857f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            if (mItems == null) return;
286486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            Item[] items = null;
287486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            if (mAccessPoints != null) {
288486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                items = new Item[mAccessPoints.length];
289486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                for (int i = 0; i < mAccessPoints.length; i++) {
290486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    final AccessPoint ap = mAccessPoints[i];
291486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    final Item item = new Item();
292486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    item.tag = ap;
293486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    item.icon = ap.iconId;
294486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    item.line1 = ap.ssid;
295486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    if (ap.isConnected) {
296486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                        item.line2 = mContext.getString(R.string.quick_settings_connected);
2977f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock                    }
298486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                    items[i] = item;
299486b78e42652466f6241eb87d5bed60040db7a25John Spurlock                }
3007f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock            }
301486b78e42652466f6241eb87d5bed60040db7a25John Spurlock            mItems.setItems(items);
3027f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock        }
3037f8f22a53005f776c8ee4d299e748e74b077ffd9John Spurlock    };
304af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock}
305