WifiTile.java revision 899f439a29ab1e609e7ba2aea3e9de3afef35c50
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.qs.tiles;
18
19import android.content.Context;
20import android.content.Intent;
21import android.content.res.Resources;
22import android.provider.Settings;
23import android.util.Log;
24
25import com.android.systemui.R;
26import com.android.systemui.qs.QSTile;
27import com.android.systemui.qs.QSTileView;
28import com.android.systemui.qs.SignalTileView;
29import com.android.systemui.statusbar.policy.NetworkController;
30import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
31
32/** Quick settings tile: Wifi **/
33public class WifiTile extends QSTile<QSTile.SignalState> {
34    private static final Intent WIFI_SETTINGS = new Intent(Settings.ACTION_WIFI_SETTINGS);
35
36    private final NetworkController mController;
37
38    public WifiTile(Host host) {
39        super(host);
40        mController = host.getNetworkController();
41    }
42
43    @Override
44    public boolean supportsDualTargets() {
45        return true;
46    }
47
48    @Override
49    protected SignalState newTileState() {
50        return new SignalState();
51    }
52
53    @Override
54    public void setListening(boolean listening) {
55        if (listening) {
56            mController.addNetworkSignalChangedCallback(mCallback);
57        } else {
58            mController.removeNetworkSignalChangedCallback(mCallback);
59        }
60    }
61
62    @Override
63    public QSTileView createTileView(Context context) {
64        return new SignalTileView(context);
65    }
66
67    @Override
68    protected void handleClick() {
69        mController.setWifiEnabled(!mState.enabled);
70    }
71
72    @Override
73    protected void handleSecondaryClick() {
74        mHost.startSettingsActivity(WIFI_SETTINGS);
75    }
76
77    @Override
78    protected void handleUpdateState(SignalState state, Object arg) {
79        state.visible = true;
80        if (DEBUG) Log.d(TAG, "handleUpdateState arg=" + arg);
81        if (arg == null) return;
82        CallbackInfo cb = (CallbackInfo) arg;
83
84        boolean wifiConnected = cb.enabled && (cb.wifiSignalIconId > 0) && (cb.enabledDesc != null);
85        boolean wifiNotConnected = (cb.wifiSignalIconId > 0) && (cb.enabledDesc == null);
86        state.enabled = cb.enabled;
87        state.connected = wifiConnected;
88        state.activityIn = cb.enabled && cb.activityIn;
89        state.activityOut = cb.enabled && cb.activityOut;
90        state.filter = true;
91        final String signalContentDescription;
92        final Resources r = mContext.getResources();
93        if (wifiConnected) {
94            state.iconId = cb.wifiSignalIconId;
95            state.label = removeDoubleQuotes(cb.enabledDesc);
96            signalContentDescription = cb.wifiSignalContentDescription;
97        } else if (wifiNotConnected) {
98            state.iconId = R.drawable.ic_qs_wifi_0;
99            state.label = r.getString(R.string.quick_settings_wifi_label);
100            signalContentDescription = r.getString(R.string.accessibility_no_wifi);
101        } else {
102            state.iconId = R.drawable.ic_qs_wifi_no_network;
103            state.label = r.getString(R.string.quick_settings_wifi_label);
104            signalContentDescription = r.getString(R.string.accessibility_wifi_off);
105        }
106        state.contentDescription = mContext.getString(
107                R.string.accessibility_quick_settings_wifi,
108                signalContentDescription,
109                state.connected ? state.label : "");
110    }
111
112    private static String removeDoubleQuotes(String string) {
113        if (string == null) return null;
114        final int length = string.length();
115        if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
116            return string.substring(1, length - 1);
117        }
118        return string;
119    }
120
121    private static final class CallbackInfo {
122        boolean enabled;
123        int wifiSignalIconId;
124        String enabledDesc;
125        boolean activityIn;
126        boolean activityOut;
127        String wifiSignalContentDescription;
128
129        @Override
130        public String toString() {
131            return new StringBuilder("CallbackInfo[")
132                .append("enabled=").append(enabled)
133                .append(",wifiSignalIconId=").append(wifiSignalIconId)
134                .append(",enabledDesc=").append(enabledDesc)
135                .append(",activityIn=").append(activityIn)
136                .append(",activityOut=").append(activityOut)
137                .append(",wifiSignalContentDescription=").append(wifiSignalContentDescription)
138                .append(']').toString();
139        }
140    }
141
142    private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() {
143        @Override
144        public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId,
145                boolean activityIn, boolean activityOut,
146                String wifiSignalContentDescriptionId, String description) {
147            if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled);
148            final CallbackInfo info = new CallbackInfo();
149            info.enabled = enabled;
150            info.wifiSignalIconId = wifiSignalIconId;
151            info.enabledDesc = description;
152            info.activityIn = activityIn;
153            info.activityOut = activityOut;
154            info.wifiSignalContentDescription = wifiSignalContentDescriptionId;
155            refreshState(info);
156        }
157
158        @Override
159        public void onMobileDataSignalChanged(boolean enabled,
160                int mobileSignalIconId,
161                String mobileSignalContentDescriptionId, int dataTypeIconId,
162                boolean activityIn, boolean activityOut,
163                String dataTypeContentDescriptionId, String description, boolean noSim) {
164            // noop
165        }
166
167        @Override
168        public void onAirplaneModeChanged(boolean enabled) {
169            // noop
170        }
171    };
172}
173