Home | History | Annotate | Download | only in tiles
      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 
     17 package com.android.systemui.qs.tiles;
     18 
     19 import android.content.ComponentName;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.content.res.Resources;
     23 import android.view.LayoutInflater;
     24 import android.view.View;
     25 import android.view.ViewGroup;
     26 
     27 import com.android.systemui.R;
     28 import com.android.systemui.qs.QSTile;
     29 import com.android.systemui.qs.QSTileView;
     30 import com.android.systemui.qs.SignalTileView;
     31 import com.android.systemui.statusbar.policy.NetworkController;
     32 import com.android.systemui.statusbar.policy.NetworkController.DataUsageInfo;
     33 import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
     34 
     35 /** Quick settings tile: Cellular **/
     36 public 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