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