/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.qs.tiles; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.QSTileView; import com.android.systemui.qs.SignalTileView; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; /** Quick settings tile: Cellular **/ public class CellularTile extends QSTile { private static final Intent CELLULAR_SETTINGS = new Intent().setComponent(new ComponentName( "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity")); private final NetworkController mController; public CellularTile(Host host) { super(host); mController = host.getNetworkController(); } @Override protected SignalState newTileState() { return new SignalState(); } @Override public void setListening(boolean listening) { if (listening) { mController.addNetworkSignalChangedCallback(mCallback); } else { mController.removeNetworkSignalChangedCallback(mCallback); } } @Override public QSTileView createTileView(Context context) { return new SignalTileView(context); } @Override protected void handleClick() { mHost.startSettingsActivity(CELLULAR_SETTINGS); } @Override protected void handleUpdateState(SignalState state, Object arg) { state.visible = mController.hasMobileDataFeature(); if (!state.visible) return; final CallbackInfo cb = (CallbackInfo) arg; if (cb == null) return; final Resources r = mContext.getResources(); state.iconId = cb.noSim ? R.drawable.stat_sys_no_sim : cb.enabled && (cb.mobileSignalIconId > 0) ? cb.mobileSignalIconId : R.drawable.ic_qs_signal_no_signal; state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiEnabled ? cb.dataTypeIconId : 0; state.filter = state.iconId != R.drawable.stat_sys_no_sim; state.activityIn = cb.enabled && cb.activityIn; state.activityOut = cb.enabled && cb.activityOut; state.label = cb.enabled ? removeTrailingPeriod(cb.enabledDesc) : r.getString(R.string.quick_settings_rssi_emergency_only); final String signalContentDesc = cb.enabled && (cb.mobileSignalIconId > 0) ? cb.signalContentDescription : r.getString(R.string.accessibility_no_signal); final String dataContentDesc = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiEnabled ? cb.dataContentDescription : r.getString(R.string.accessibility_no_data); state.contentDescription = r.getString( R.string.accessibility_quick_settings_mobile, signalContentDesc, dataContentDesc, state.label); } // Remove the period from the network name public static String removeTrailingPeriod(String string) { if (string == null) return null; final int length = string.length(); if (string.endsWith(".")) { return string.substring(0, length - 1); } return string; } private static final class CallbackInfo { boolean enabled; boolean wifiEnabled; int mobileSignalIconId; String signalContentDescription; int dataTypeIconId; String dataContentDescription; boolean activityIn; boolean activityOut; String enabledDesc; boolean noSim; } private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() { private boolean mWifiEnabled; @Override public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId, boolean activityIn, boolean activityOut, String wifiSignalContentDescriptionId, String description) { mWifiEnabled = enabled; } @Override public void onMobileDataSignalChanged(boolean enabled, int mobileSignalIconId, String mobileSignalContentDescriptionId, int dataTypeIconId, boolean activityIn, boolean activityOut, String dataTypeContentDescriptionId, String description, boolean noSim) { final CallbackInfo info = new CallbackInfo(); // TODO pool? info.enabled = enabled; info.wifiEnabled = mWifiEnabled; info.mobileSignalIconId = mobileSignalIconId; info.signalContentDescription = mobileSignalContentDescriptionId; info.dataTypeIconId = dataTypeIconId; info.dataContentDescription = dataTypeContentDescriptionId; info.activityIn = activityIn; info.activityOut = activityOut; info.enabledDesc = description; info.noSim = noSim; refreshState(info); } @Override public void onAirplaneModeChanged(boolean enabled) { // noop } }; }