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