Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2018 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.phone;
     18 
     19 import android.content.Context;
     20 import android.graphics.Color;
     21 import android.graphics.drawable.ColorDrawable;
     22 import android.graphics.drawable.Drawable;
     23 import android.graphics.drawable.LayerDrawable;
     24 import android.preference.Preference;
     25 import android.telephony.CellInfo;
     26 import android.telephony.SignalStrength;
     27 import android.telephony.TelephonyManager;
     28 import android.util.Log;
     29 import android.view.Gravity;
     30 
     31 import com.android.settingslib.graph.SignalDrawable;
     32 
     33 import java.util.List;
     34 
     35 /**
     36  * A Preference represents a network operator in the NetworkSelectSetting fragment.
     37  */
     38 public class NetworkOperatorPreference extends Preference {
     39 
     40     private static final String TAG = "NetworkOperatorPref";
     41     private static final boolean DBG = false;
     42     // number of signal strength level
     43     public static final int NUMBER_OF_LEVELS = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
     44     private CellInfo mCellInfo;
     45     private List<String> mForbiddenPlmns;
     46     private int mLevel = -1;
     47 
     48     // The following constants are used to draw signal icon.
     49     private static final Drawable EMPTY_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
     50     private static final int NO_CELL_DATA_CONNECTED_ICON = 0;
     51 
     52     public NetworkOperatorPreference(
     53             CellInfo cellinfo, Context context, List<String> forbiddenPlmns) {
     54         super(context);
     55         mCellInfo = cellinfo;
     56         mForbiddenPlmns = forbiddenPlmns;
     57         refresh();
     58     }
     59 
     60     public CellInfo getCellInfo() {
     61         return mCellInfo;
     62     }
     63 
     64     /**
     65      * Refresh the NetworkOperatorPreference by updating the title and the icon.
     66      */
     67     public void refresh() {
     68         if (DBG) Log.d(TAG, "refresh the network: " + CellInfoUtil.getNetworkTitle(mCellInfo));
     69         String networkTitle = CellInfoUtil.getNetworkTitle(mCellInfo);
     70         if (CellInfoUtil.isForbidden(mCellInfo, mForbiddenPlmns)) {
     71             networkTitle += " " + getContext().getResources().getString(R.string.forbidden_network);
     72         }
     73         setTitle(networkTitle);
     74         int level = CellInfoUtil.getLevel(mCellInfo);
     75         if (DBG) Log.d(TAG, "refresh level: " + String.valueOf(level));
     76         if (mLevel != level) {
     77             mLevel = level;
     78             updateIcon(mLevel);
     79         }
     80     }
     81 
     82     /**
     83      * Update the icon according to the input signal strength level.
     84      */
     85     public void setIcon(int level) {
     86         updateIcon(level);
     87     }
     88 
     89     private int getIconId(int networkType) {
     90         if (networkType == TelephonyManager.NETWORK_TYPE_CDMA) {
     91             return R.drawable.signal_strength_1x;
     92         } else if (networkType == TelephonyManager.NETWORK_TYPE_LTE) {
     93             return R.drawable.signal_strength_lte;
     94         } else if (networkType == TelephonyManager.NETWORK_TYPE_UMTS) {
     95             return R.drawable.signal_strength_3g;
     96         } else if (networkType == TelephonyManager.NETWORK_TYPE_GSM) {
     97             return R.drawable.signal_strength_g;
     98         } else {
     99             return 0;
    100         }
    101     }
    102 
    103     private void updateIcon(int level) {
    104         if (level < 0 || level >= NUMBER_OF_LEVELS) return;
    105         Context context = getContext();
    106         // Make the signal strength drawable
    107         int iconId = 0;
    108         if (DBG) Log.d(TAG, "updateIcon level: " + String.valueOf(level));
    109         iconId = SignalDrawable.getState(level, NUMBER_OF_LEVELS, false /* cutOut */);
    110 
    111         SignalDrawable signalDrawable = new SignalDrawable(getContext());
    112         signalDrawable.setLevel(iconId);
    113         signalDrawable.setDarkIntensity(0);
    114 
    115         // Make the network type drawable
    116         int iconType = getIconId(CellInfoUtil.getNetworkType(mCellInfo));
    117         Drawable networkDrawable =
    118                 iconType == NO_CELL_DATA_CONNECTED_ICON
    119                         ? EMPTY_DRAWABLE
    120                         : getContext()
    121                         .getResources().getDrawable(iconType, getContext().getTheme());
    122 
    123         // Overlay the two drawables
    124         Drawable[] layers = {networkDrawable, signalDrawable};
    125         final int iconSize =
    126                 context.getResources().getDimensionPixelSize(R.dimen.signal_strength_icon_size);
    127 
    128         LayerDrawable icons = new LayerDrawable(layers);
    129         // Set the network type icon at the top left
    130         icons.setLayerGravity(0 /* index of networkDrawable */, Gravity.TOP | Gravity.LEFT);
    131         // Set the signal strength icon at the bottom right
    132         icons.setLayerGravity(1 /* index of SignalDrawable */, Gravity.BOTTOM | Gravity.RIGHT);
    133         icons.setLayerSize(1 /* index of SignalDrawable */, iconSize, iconSize);
    134         setIcon(icons);
    135     }
    136 }
    137