1e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi/* 2e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project 3e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * 4e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * you may not use this file except in compliance with the License. 6e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * You may obtain a copy of the License at 7e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * 8e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * 10e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 11e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * See the License for the specific language governing permissions and 14e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * limitations under the License 15e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi */ 16e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 17e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggipackage com.android.systemui.qs.tiles; 18e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 1900ff604aa74bc1baa80ade1deb8ae07d6b4c45dbAndrew Sappersteinimport android.annotation.ColorInt; 20e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.content.Context; 21e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.content.res.Configuration; 22e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.content.res.Resources; 23e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.util.AttributeSet; 24e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.view.View; 25e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.widget.LinearLayout; 26e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport android.widget.TextView; 27c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson 285c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sappersteinimport com.android.settingslib.Utils; 29f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monkimport com.android.settingslib.net.DataUsageController; 30e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport com.android.systemui.FontSizeUtils; 31e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport com.android.systemui.R; 32e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport com.android.systemui.qs.DataUsageGraph; 33e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 34e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggiimport java.text.DecimalFormat; 35e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 36e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi/** 37e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi * Layout for the data usage detail in quick settings. 38e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi */ 39e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggipublic class DataUsageDetailView extends LinearLayout { 40e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 41e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi private static final double KB = 1024; 42e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi private static final double MB = 1024 * KB; 43e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi private static final double GB = 1024 * MB; 44e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 45e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi private final DecimalFormat FORMAT = new DecimalFormat("#.##"); 46e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 47e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi public DataUsageDetailView(Context context, AttributeSet attrs) { 48e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi super(context, attrs); 49e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } 50e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 51e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi @Override 52e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi protected void onConfigurationChanged(Configuration newConfig) { 53e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi super.onConfigurationChanged(newConfig); 54e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi FontSizeUtils.updateFontSize(this, android.R.id.title, R.dimen.qs_data_usage_text_size); 55e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi FontSizeUtils.updateFontSize(this, R.id.usage_text, R.dimen.qs_data_usage_usage_text_size); 56e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi FontSizeUtils.updateFontSize(this, R.id.usage_carrier_text, 57e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi R.dimen.qs_data_usage_text_size); 58e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi FontSizeUtils.updateFontSize(this, R.id.usage_info_top_text, 59e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi R.dimen.qs_data_usage_text_size); 60e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi FontSizeUtils.updateFontSize(this, R.id.usage_period_text, R.dimen.qs_data_usage_text_size); 61e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi FontSizeUtils.updateFontSize(this, R.id.usage_info_bottom_text, 62e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi R.dimen.qs_data_usage_text_size); 63e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } 64e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 65f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk public void bind(DataUsageController.DataUsageInfo info) { 66e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final Resources res = mContext.getResources(); 67e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final int titleId; 68e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final long bytes; 6900ff604aa74bc1baa80ade1deb8ae07d6b4c45dbAndrew Sapperstein @ColorInt int usageColor = 0; 70e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final String top; 71e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi String bottom = null; 72e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi if (info.usageLevel < info.warningLevel || info.limitLevel <= 0) { 73e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi // under warning, or no limit 74e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi titleId = R.string.quick_settings_cellular_detail_data_usage; 75e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi bytes = info.usageLevel; 76e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi top = res.getString(R.string.quick_settings_cellular_detail_data_warning, 77e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi formatBytes(info.warningLevel)); 78e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } else if (info.usageLevel <= info.limitLevel) { 79e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi // over warning, under limit 80e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi titleId = R.string.quick_settings_cellular_detail_remaining_data; 81e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi bytes = info.limitLevel - info.usageLevel; 82e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi top = res.getString(R.string.quick_settings_cellular_detail_data_used, 83e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi formatBytes(info.usageLevel)); 84e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit, 85e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi formatBytes(info.limitLevel)); 86e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } else { 87e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi // over limit 88e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi titleId = R.string.quick_settings_cellular_detail_over_limit; 89e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi bytes = info.usageLevel - info.limitLevel; 90e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi top = res.getString(R.string.quick_settings_cellular_detail_data_used, 91e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi formatBytes(info.usageLevel)); 92e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit, 93e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi formatBytes(info.limitLevel)); 9400ff604aa74bc1baa80ade1deb8ae07d6b4c45dbAndrew Sapperstein usageColor = mContext.getColor(R.color.system_warning_color); 95e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } 96e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 975c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein if (usageColor == 0) { 985c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein usageColor = Utils.getColorAccent(mContext); 995c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein } 1005c3734456e35de1ea56f890537f9eebf5f2ec699Andrew Sapperstein 101e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final TextView title = (TextView) findViewById(android.R.id.title); 102e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi title.setText(titleId); 103e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final TextView usage = (TextView) findViewById(R.id.usage_text); 104e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi usage.setText(formatBytes(bytes)); 10500ff604aa74bc1baa80ade1deb8ae07d6b4c45dbAndrew Sapperstein usage.setTextColor(usageColor); 106e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final DataUsageGraph graph = (DataUsageGraph) findViewById(R.id.usage_graph); 107e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi graph.setLevels(info.limitLevel, info.warningLevel, info.usageLevel); 108e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final TextView carrier = (TextView) findViewById(R.id.usage_carrier_text); 109e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi carrier.setText(info.carrier); 110e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final TextView period = (TextView) findViewById(R.id.usage_period_text); 111e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi period.setText(info.period); 112e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final TextView infoTop = (TextView) findViewById(R.id.usage_info_top_text); 113e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi infoTop.setVisibility(top != null ? View.VISIBLE : View.GONE); 114e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi infoTop.setText(top); 115e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final TextView infoBottom = (TextView) findViewById(R.id.usage_info_bottom_text); 116e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi infoBottom.setVisibility(bottom != null ? View.VISIBLE : View.GONE); 117e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi infoBottom.setText(bottom); 118a03c641c60b41a0ca0220e891eb96bbbebe49856Jason Monk boolean showLevel = info.warningLevel > 0 || info.limitLevel > 0; 119a03c641c60b41a0ca0220e891eb96bbbebe49856Jason Monk graph.setVisibility(showLevel ? View.VISIBLE : View.GONE); 120a03c641c60b41a0ca0220e891eb96bbbebe49856Jason Monk if (!showLevel) { 121a03c641c60b41a0ca0220e891eb96bbbebe49856Jason Monk infoTop.setVisibility(View.GONE); 122a03c641c60b41a0ca0220e891eb96bbbebe49856Jason Monk } 123a03c641c60b41a0ca0220e891eb96bbbebe49856Jason Monk 124e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } 125e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi 126e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi private String formatBytes(long bytes) { 127e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi final long b = Math.abs(bytes); 128e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi double val; 129e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi String suffix; 130e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi if (b > 100 * MB) { 131e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi val = b / GB; 132e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi suffix = "GB"; 133e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } else if (b > 100 * KB) { 134e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi val = b / MB; 135e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi suffix = "MB"; 136e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } else { 137e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi val = b / KB; 138e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi suffix = "KB"; 139e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } 140e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi return FORMAT.format(val * (bytes < 0 ? -1 : 1)) + " " + suffix; 141e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi } 142e17c4b49a41ec9de5c1d7f229273fc4677ec24b1Jorim Jaggi} 143