CellularTile.java revision c737b9bd5a0bc60fd92150d55f8ddb530697b987
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.ComponentName;
20import android.content.Context;
21import android.content.Intent;
22import android.content.res.Resources;
23import android.view.LayoutInflater;
24import android.view.View;
25import android.view.ViewGroup;
26
27import com.android.systemui.R;
28import com.android.systemui.qs.QSTile;
29import com.android.systemui.qs.QSTileView;
30import com.android.systemui.qs.SignalTileView;
31import com.android.systemui.statusbar.policy.NetworkController;
32import com.android.systemui.statusbar.policy.NetworkController.DataUsageInfo;
33import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
34
35/** Quick settings tile: Cellular **/
36public class CellularTile extends QSTile<QSTile.SignalState> {
37    private static final Intent CELLULAR_SETTINGS = new Intent().setComponent(new ComponentName(
38            "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
39
40    private final NetworkController mController;
41    private final CellularDetailAdapter mDetailAdapter;
42
43    public CellularTile(Host host) {
44        super(host);
45        mController = host.getNetworkController();
46        mDetailAdapter = new CellularDetailAdapter();
47    }
48
49    @Override
50    protected SignalState newTileState() {
51        return new SignalState();
52    }
53
54    @Override
55    public DetailAdapter getDetailAdapter() {
56        return mDetailAdapter;
57    }
58
59    @Override
60    public void setListening(boolean listening) {
61        if (listening) {
62            mController.addNetworkSignalChangedCallback(mCallback);
63        } else {
64            mController.removeNetworkSignalChangedCallback(mCallback);
65        }
66    }
67
68    @Override
69    public QSTileView createTileView(Context context) {
70        return new SignalTileView(context);
71    }
72
73    @Override
74    protected void handleClick() {
75        if (mController.isMobileDataSupported()) {
76            showDetail(true);
77        } else {
78            mHost.startSettingsActivity(CELLULAR_SETTINGS);
79        }
80    }
81
82    @Override
83    protected void handleUpdateState(SignalState state, Object arg) {
84        state.visible = mController.hasMobileDataFeature();
85        if (!state.visible) return;
86        final CallbackInfo cb = (CallbackInfo) arg;
87        if (cb == null) return;
88
89        final Resources r = mContext.getResources();
90        state.iconId = cb.noSim ? R.drawable.ic_qs_no_sim
91                : !cb.enabled || cb.airplaneModeEnabled ? R.drawable.ic_qs_signal_disabled
92                : cb.mobileSignalIconId > 0 ? cb.mobileSignalIconId
93                : R.drawable.ic_qs_signal_no_signal;
94        state.isOverlayIconWide = cb.isDataTypeIconWide;
95        state.autoMirrorDrawable = !cb.noSim;
96        state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiConnected
97                ? cb.dataTypeIconId
98                : 0;
99        state.filter = state.iconId != R.drawable.ic_qs_no_sim;
100        state.activityIn = cb.enabled && cb.activityIn;
101        state.activityOut = cb.enabled && cb.activityOut;
102
103        state.label = cb.enabled
104                ? removeTrailingPeriod(cb.enabledDesc)
105                : r.getString(R.string.quick_settings_rssi_emergency_only);
106
107        final String signalContentDesc = cb.enabled && (cb.mobileSignalIconId > 0)
108                ? cb.signalContentDescription
109                : r.getString(R.string.accessibility_no_signal);
110        final String dataContentDesc = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiEnabled
111                ? cb.dataContentDescription
112                : r.getString(R.string.accessibility_no_data);
113        state.contentDescription = r.getString(
114                R.string.accessibility_quick_settings_mobile,
115                signalContentDesc, dataContentDesc,
116                state.label);
117    }
118
119    // Remove the period from the network name
120    public static String removeTrailingPeriod(String string) {
121        if (string == null) return null;
122        final int length = string.length();
123        if (string.endsWith(".")) {
124            return string.substring(0, length - 1);
125        }
126        return string;
127    }
128
129    private static final class CallbackInfo {
130        boolean enabled;
131        boolean wifiEnabled;
132        boolean wifiConnected;
133        boolean airplaneModeEnabled;
134        int mobileSignalIconId;
135        String signalContentDescription;
136        int dataTypeIconId;
137        String dataContentDescription;
138        boolean activityIn;
139        boolean activityOut;
140        String enabledDesc;
141        boolean noSim;
142        boolean isDataTypeIconWide;
143    }
144
145    private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() {
146        private boolean mWifiEnabled;
147        private boolean mWifiConnected;
148        private boolean mAirplaneModeEnabled;
149
150        @Override
151        public void onWifiSignalChanged(boolean enabled, boolean connected, int wifiSignalIconId,
152                boolean activityIn, boolean activityOut,
153                String wifiSignalContentDescriptionId, String description) {
154            mWifiEnabled = enabled;
155            mWifiConnected = connected;
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                boolean isDataTypeIconWide) {
165            final CallbackInfo info = new CallbackInfo();  // TODO pool?
166            info.enabled = enabled;
167            info.wifiEnabled = mWifiEnabled;
168            info.wifiConnected = mWifiConnected;
169            info.airplaneModeEnabled = mAirplaneModeEnabled;
170            info.mobileSignalIconId = mobileSignalIconId;
171            info.signalContentDescription = mobileSignalContentDescriptionId;
172            info.dataTypeIconId = dataTypeIconId;
173            info.dataContentDescription = dataTypeContentDescriptionId;
174            info.activityIn = activityIn;
175            info.activityOut = activityOut;
176            info.enabledDesc = description;
177            info.noSim = noSim;
178            info.isDataTypeIconWide = isDataTypeIconWide;
179            refreshState(info);
180        }
181
182        @Override
183        public void onAirplaneModeChanged(boolean enabled) {
184            mAirplaneModeEnabled = enabled;
185        }
186
187        public void onMobileDataEnabled(boolean enabled) {
188            mDetailAdapter.setMobileDataEnabled(enabled);
189        }
190    };
191
192    private final class CellularDetailAdapter implements DetailAdapter {
193
194        @Override
195        public int getTitle() {
196            return R.string.quick_settings_cellular_detail_title;
197        }
198
199        @Override
200        public Boolean getToggleState() {
201            return mController.isMobileDataSupported() ? mController.isMobileDataEnabled() : null;
202        }
203
204        @Override
205        public Intent getSettingsIntent() {
206            return CELLULAR_SETTINGS;
207        }
208
209        @Override
210        public void setToggleState(boolean state) {
211            mController.setMobileDataEnabled(state);
212        }
213
214        @Override
215        public View createDetailView(Context context, View convertView, ViewGroup parent) {
216            final DataUsageDetailView v = (DataUsageDetailView) (convertView != null
217                    ? convertView
218                    : LayoutInflater.from(mContext).inflate(R.layout.data_usage, parent, false));
219            final DataUsageInfo info = mController.getDataUsageInfo();
220            if (info == null) return v;
221            v.bind(info);
222            return v;
223        }
224
225        public void setMobileDataEnabled(boolean enabled) {
226            fireToggleStateChanged(enabled);
227        }
228    }
229}
230