WifiTile.java revision 3d09bbd04fc5ee028316f6cd38178c8095faa653
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; 24af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 25af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.R; 26af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTile; 27af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.QSTileView; 28af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.qs.SignalTileView; 29af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkController; 30af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockimport com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; 31af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 32af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock/** Quick settings tile: Wifi **/ 33af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlockpublic class WifiTile extends QSTile<QSTile.SignalState> { 34af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS); 35af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 36af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final NetworkController mController; 37af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 38af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public WifiTile(Host host) { 39af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock super(host); 40af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mController = host.getNetworkController(); 41ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } 42ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock 43ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock @Override 44ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock public boolean supportsDualTargets() { 45ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock return true; 46af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 47af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 48af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 49af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected SignalState newTileState() { 50af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock return new SignalState(); 51af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 52af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 53af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 54ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock public void setListening(boolean listening) { 55ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock if (listening) { 56ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock mController.addNetworkSignalChangedCallback(mCallback); 57ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } else { 58ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock mController.removeNetworkSignalChangedCallback(mCallback); 59ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } 60af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 61af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 62af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 63af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public QSTileView createTileView(Context context) { 64af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock return new SignalTileView(context); 65af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 66af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 67af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 68af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected void handleClick() { 69af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mController.setWifiEnabled(!mState.enabled); 70af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 71af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 72af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 73af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected void handleSecondaryClick() { 74af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock mHost.startSettingsActivity(WIFI_SETTINGS); 75af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 76af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 77af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 78af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock protected void handleUpdateState(SignalState state, Object arg) { 79af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.visible = true; 80ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg); 81ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock if (arg == null) return; 82af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock CallbackInfo cb = (CallbackInfo) arg; 83af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 84af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.enabledDesc != null); 85af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean wifiNotConnected = (cb.wifiSignalIconId > 0) && (cb.enabledDesc == null); 863d09bbd04fc5ee028316f6cd38178c8095faa653John Spurlock state.enabled = cb.enabled; 87af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.connected = wifiConnected; 88af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.activityIn = cb.enabled && cb.activityIn; 89af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.activityOut = cb.enabled && cb.activityOut; 90af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock final String signalContentDescription; 91af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock final Resources r = mContext.getResources(); 92af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock if (wifiConnected) { 93af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.iconId = cb.wifiSignalIconId; 94af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.label = removeDoubleQuotes(cb.enabledDesc); 95af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock signalContentDescription = cb.wifiSignalContentDescription; 96af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } else if (wifiNotConnected) { 97af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.iconId = R.drawable.ic_qs_wifi_0; 98af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.label = r.getString(R.string.quick_settings_wifi_label); 99af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock signalContentDescription = r.getString(R.string.accessibility_no_wifi); 100af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } else { 101af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.iconId = R.drawable.ic_qs_wifi_no_network; 102af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.label = r.getString(R.string.quick_settings_wifi_off_label); 103af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock signalContentDescription = r.getString(R.string.accessibility_wifi_off); 104af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 105af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.contentDescription = mContext.getString( 106af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock R.string.accessibility_quick_settings_wifi, 107af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock signalContentDescription, 108af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock state.connected ? state.label : ""); 109af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 110af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 111af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private static String removeDoubleQuotes(String string) { 112af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock if (string == null) return null; 113af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock final int length = string.length(); 114af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) { 115af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock return string.substring(1, length - 1); 116af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 117af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock return string; 118af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 119af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 120af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private static final class CallbackInfo { 121af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean enabled; 122af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock int wifiSignalIconId; 123af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock String enabledDesc; 124af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean activityIn; 125af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean activityOut; 126af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock String wifiSignalContentDescription; 127ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock 128ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock @Override 129ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock public String toString() { 130ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock return new StringBuilder("CallbackInfo[") 131ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append("enabled=").append(enabled) 132ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append(",wifiSignalIconId=").append(wifiSignalIconId) 133ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append(",enabledDesc=").append(enabledDesc) 134ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append(",activityIn=").append(activityIn) 135ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append(",activityOut=").append(activityOut) 136ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append(",wifiSignalContentDescription=").append(wifiSignalContentDescription) 137ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock .append(']').toString(); 138ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock } 139af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 140af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 141af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() { 142af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 143af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId, 144af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean activityIn, boolean activityOut, 145af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock String wifiSignalContentDescriptionId, String description) { 146ccb6b9a90f228cc4e31a9442ed28756ff474c080John Spurlock if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled); 147af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock final CallbackInfo info = new CallbackInfo(); 148af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock info.enabled = enabled; 149af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock info.wifiSignalIconId = wifiSignalIconId; 150af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock info.enabledDesc = description; 151af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock info.activityIn = activityIn; 152af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock info.activityOut = activityOut; 153af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock info.wifiSignalContentDescription = wifiSignalContentDescriptionId; 154af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock refreshState(info); 155af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 156af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 157af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 158af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void onMobileDataSignalChanged(boolean enabled, 159af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock int mobileSignalIconId, 160af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock String mobileSignalContentDescriptionId, int dataTypeIconId, 161af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock boolean activityIn, boolean activityOut, 162af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock String dataTypeContentDescriptionId, String description) { 163af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock // noop 164af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 165af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock 166af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock @Override 167af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock public void onAirplaneModeChanged(boolean enabled) { 168af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock // noop 169af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock } 170af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock }; 171af8d6c44f06d2f8baac2c5774a9efdae3fc36797John Spurlock} 172