1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 *      http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.settings.datausage;
16
17import android.content.Context;
18import android.os.AsyncTask;
19import android.support.v7.preference.Preference;
20import android.support.v7.preference.PreferenceViewHolder;
21import android.text.format.Formatter;
22import android.view.View;
23import android.widget.ProgressBar;
24import com.android.settingslib.AppItem;
25import com.android.settingslib.net.UidDetail;
26import com.android.settingslib.net.UidDetailProvider;
27
28import static com.android.internal.util.Preconditions.checkNotNull;
29
30public class AppDataUsagePreference extends Preference {
31
32    private final AppItem mItem;
33    private final int mPercent;
34
35    public AppDataUsagePreference(Context context, AppItem item, int percent,
36            UidDetailProvider provider) {
37        super(context);
38        mItem = item;
39        mPercent = percent;
40        setLayoutResource(com.android.settings.R.layout.data_usage_item);
41        setWidgetLayoutResource(com.android.settings.R.layout.widget_progress_bar);
42        if (item.restricted && item.total <= 0) {
43            setSummary(com.android.settings.R.string.data_usage_app_restricted);
44        } else {
45            setSummary(Formatter.formatFileSize(context, item.total));
46        }
47
48        // kick off async load of app details
49        UidDetailTask.bindView(provider, item, this);
50    }
51
52    @Override
53    public void onBindViewHolder(PreferenceViewHolder holder) {
54        super.onBindViewHolder(holder);
55
56        final ProgressBar progress = (ProgressBar) holder.findViewById(
57                android.R.id.progress);
58
59        if (mItem.restricted && mItem.total <= 0) {
60            progress.setVisibility(View.GONE);
61        } else {
62            progress.setVisibility(View.VISIBLE);
63        }
64        progress.setProgress(mPercent);
65    }
66
67    public AppItem getItem() {
68        return mItem;
69    }
70
71    /**
72     * Background task that loads {@link UidDetail}, binding to
73     * {@link DataUsageAdapter} row item when finished.
74     */
75    private static class UidDetailTask extends AsyncTask<Void, Void, UidDetail> {
76        private final UidDetailProvider mProvider;
77        private final AppItem mItem;
78        private final AppDataUsagePreference mTarget;
79
80        private UidDetailTask(UidDetailProvider provider, AppItem item,
81                AppDataUsagePreference target) {
82            mProvider = checkNotNull(provider);
83            mItem = checkNotNull(item);
84            mTarget = checkNotNull(target);
85        }
86
87        public static void bindView(UidDetailProvider provider, AppItem item,
88                AppDataUsagePreference target) {
89            final UidDetail cachedDetail = provider.getUidDetail(item.key, false);
90            if (cachedDetail != null) {
91                bindView(cachedDetail, target);
92            } else {
93                new UidDetailTask(provider, item, target).executeOnExecutor(
94                        AsyncTask.THREAD_POOL_EXECUTOR);
95            }
96        }
97
98        private static void bindView(UidDetail detail, Preference target) {
99            if (detail != null) {
100                target.setIcon(detail.icon);
101                target.setTitle(detail.label);
102            } else {
103                target.setIcon(null);
104                target.setTitle(null);
105            }
106        }
107
108        @Override
109        protected void onPreExecute() {
110            bindView(null, mTarget);
111        }
112
113        @Override
114        protected UidDetail doInBackground(Void... params) {
115            return mProvider.getUidDetail(mItem.key, true);
116        }
117
118        @Override
119        protected void onPostExecute(UidDetail result) {
120            bindView(result, mTarget);
121        }
122    }
123}
124