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