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.Context; 20 import android.content.res.ColorStateList; 21 import android.content.res.Configuration; 22 import android.content.res.Resources; 23 import android.util.AttributeSet; 24 import android.view.View; 25 import android.widget.LinearLayout; 26 import android.widget.TextView; 27 28 import com.android.settingslib.Utils; 29 import com.android.settingslib.net.DataUsageController; 30 import com.android.systemui.FontSizeUtils; 31 import com.android.systemui.R; 32 import com.android.systemui.qs.DataUsageGraph; 33 34 import java.text.DecimalFormat; 35 36 /** 37 * Layout for the data usage detail in quick settings. 38 */ 39 public class DataUsageDetailView extends LinearLayout { 40 41 private static final double KB = 1024; 42 private static final double MB = 1024 * KB; 43 private static final double GB = 1024 * MB; 44 45 private final DecimalFormat FORMAT = new DecimalFormat("#.##"); 46 DataUsageDetailView(Context context, AttributeSet attrs)47 public DataUsageDetailView(Context context, AttributeSet attrs) { 48 super(context, attrs); 49 } 50 51 @Override onConfigurationChanged(Configuration newConfig)52 protected void onConfigurationChanged(Configuration newConfig) { 53 super.onConfigurationChanged(newConfig); 54 FontSizeUtils.updateFontSize(this, android.R.id.title, R.dimen.qs_data_usage_text_size); 55 FontSizeUtils.updateFontSize(this, R.id.usage_text, R.dimen.qs_data_usage_usage_text_size); 56 FontSizeUtils.updateFontSize(this, R.id.usage_carrier_text, 57 R.dimen.qs_data_usage_text_size); 58 FontSizeUtils.updateFontSize(this, R.id.usage_info_top_text, 59 R.dimen.qs_data_usage_text_size); 60 FontSizeUtils.updateFontSize(this, R.id.usage_period_text, R.dimen.qs_data_usage_text_size); 61 FontSizeUtils.updateFontSize(this, R.id.usage_info_bottom_text, 62 R.dimen.qs_data_usage_text_size); 63 } 64 bind(DataUsageController.DataUsageInfo info)65 public void bind(DataUsageController.DataUsageInfo info) { 66 final Resources res = mContext.getResources(); 67 final int titleId; 68 final long bytes; 69 ColorStateList usageColorState = null; 70 final String top; 71 String bottom = null; 72 if (info.usageLevel < info.warningLevel || info.limitLevel <= 0) { 73 // under warning, or no limit 74 titleId = R.string.quick_settings_cellular_detail_data_usage; 75 bytes = info.usageLevel; 76 top = res.getString(R.string.quick_settings_cellular_detail_data_warning, 77 formatBytes(info.warningLevel)); 78 } else if (info.usageLevel <= info.limitLevel) { 79 // over warning, under limit 80 titleId = R.string.quick_settings_cellular_detail_remaining_data; 81 bytes = info.limitLevel - info.usageLevel; 82 top = res.getString(R.string.quick_settings_cellular_detail_data_used, 83 formatBytes(info.usageLevel)); 84 bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit, 85 formatBytes(info.limitLevel)); 86 } else { 87 // over limit 88 titleId = R.string.quick_settings_cellular_detail_over_limit; 89 bytes = info.usageLevel - info.limitLevel; 90 top = res.getString(R.string.quick_settings_cellular_detail_data_used, 91 formatBytes(info.usageLevel)); 92 bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit, 93 formatBytes(info.limitLevel)); 94 usageColorState = Utils.getColorError(mContext); 95 } 96 97 if (usageColorState == null) { 98 usageColorState = Utils.getColorAccent(mContext); 99 } 100 101 final TextView title = findViewById(android.R.id.title); 102 title.setText(titleId); 103 final TextView usage = findViewById(R.id.usage_text); 104 usage.setText(formatBytes(bytes)); 105 usage.setTextColor(usageColorState); 106 final DataUsageGraph graph = findViewById(R.id.usage_graph); 107 graph.setLevels(info.limitLevel, info.warningLevel, info.usageLevel); 108 final TextView carrier = findViewById(R.id.usage_carrier_text); 109 carrier.setText(info.carrier); 110 final TextView period = findViewById(R.id.usage_period_text); 111 period.setText(info.period); 112 final TextView infoTop = findViewById(R.id.usage_info_top_text); 113 infoTop.setVisibility(top != null ? View.VISIBLE : View.GONE); 114 infoTop.setText(top); 115 final TextView infoBottom = findViewById(R.id.usage_info_bottom_text); 116 infoBottom.setVisibility(bottom != null ? View.VISIBLE : View.GONE); 117 infoBottom.setText(bottom); 118 boolean showLevel = info.warningLevel > 0 || info.limitLevel > 0; 119 graph.setVisibility(showLevel ? View.VISIBLE : View.GONE); 120 if (!showLevel) { 121 infoTop.setVisibility(View.GONE); 122 } 123 124 } 125 formatBytes(long bytes)126 private String formatBytes(long bytes) { 127 final long b = Math.abs(bytes); 128 double val; 129 String suffix; 130 if (b > 100 * MB) { 131 val = b / GB; 132 suffix = "GB"; 133 } else if (b > 100 * KB) { 134 val = b / MB; 135 suffix = "MB"; 136 } else { 137 val = b / KB; 138 suffix = "KB"; 139 } 140 return FORMAT.format(val * (bytes < 0 ? -1 : 1)) + " " + suffix; 141 } 142 } 143