• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.settings.applications.appinfo;
18 
19 import android.app.LoaderManager;
20 import android.content.Context;
21 import android.content.Loader;
22 import android.net.INetworkStatsService;
23 import android.net.INetworkStatsSession;
24 import android.net.NetworkTemplate;
25 import android.os.Bundle;
26 import android.os.RemoteException;
27 import android.os.ServiceManager;
28 import android.support.annotation.VisibleForTesting;
29 import android.support.v7.preference.Preference;
30 import android.support.v7.preference.PreferenceScreen;
31 import android.text.format.DateUtils;
32 import android.text.format.Formatter;
33 
34 import com.android.settings.R;
35 import com.android.settings.SettingsPreferenceFragment;
36 import com.android.settings.Utils;
37 import com.android.settings.datausage.AppDataUsage;
38 import com.android.settings.datausage.DataUsageList;
39 import com.android.settings.datausage.DataUsageUtils;
40 import com.android.settingslib.AppItem;
41 import com.android.settingslib.core.lifecycle.LifecycleObserver;
42 import com.android.settingslib.core.lifecycle.events.OnPause;
43 import com.android.settingslib.core.lifecycle.events.OnResume;
44 import com.android.settingslib.net.ChartData;
45 import com.android.settingslib.net.ChartDataLoader;
46 
47 public class AppDataUsagePreferenceController extends AppInfoPreferenceControllerBase
48         implements LoaderManager.LoaderCallbacks<ChartData>, LifecycleObserver, OnResume, OnPause {
49 
50     private ChartData mChartData;
51     private INetworkStatsSession mStatsSession;
52 
AppDataUsagePreferenceController(Context context,String key)53     public AppDataUsagePreferenceController(Context context,String key) {
54         super(context, key);
55     }
56 
57     @Override
getAvailabilityStatus()58     public int getAvailabilityStatus() {
59         return isBandwidthControlEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
60     }
61 
62     @Override
displayPreference(PreferenceScreen screen)63     public void displayPreference(PreferenceScreen screen) {
64         super.displayPreference(screen);
65         if (isAvailable()) {
66             final INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
67                     ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
68             try {
69                 mStatsSession = statsService.openSession();
70             } catch (RemoteException e) {
71                 throw new RuntimeException(e);
72             }
73         }
74     }
75 
76     @Override
updateState(Preference preference)77     public void updateState(Preference preference) {
78         preference.setSummary(getDataSummary());
79     }
80 
81     @Override
onResume()82     public void onResume() {
83         if (mStatsSession != null) {
84             final int uid = mParent.getAppEntry().info.uid;
85             final AppItem app = new AppItem(uid);
86             app.addUid(uid);
87             mParent.getLoaderManager().restartLoader(mParent.LOADER_CHART_DATA,
88                     ChartDataLoader.buildArgs(getTemplate(mContext), app),
89                     this);
90         }
91     }
92 
93     @Override
onPause()94     public void onPause() {
95         mParent.getLoaderManager().destroyLoader(mParent.LOADER_CHART_DATA);
96     }
97 
98     @Override
onCreateLoader(int id, Bundle args)99     public Loader<ChartData> onCreateLoader(int id, Bundle args) {
100         return new ChartDataLoader(mContext, mStatsSession, args);
101     }
102 
103     @Override
onLoadFinished(Loader<ChartData> loader, ChartData data)104     public void onLoadFinished(Loader<ChartData> loader, ChartData data) {
105         mChartData = data;
106         updateState(mPreference);
107     }
108 
109     @Override
onLoaderReset(Loader<ChartData> loader)110     public void onLoaderReset(Loader<ChartData> loader) {
111         // Leave last result.
112     }
113 
114     @Override
getDetailFragmentClass()115     protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() {
116         return AppDataUsage.class;
117     }
118 
getDataSummary()119     private CharSequence getDataSummary() {
120         if (mChartData != null) {
121             final long totalBytes = mChartData.detail.getTotalBytes();
122             if (totalBytes == 0) {
123                 return mContext.getString(R.string.no_data_usage);
124             }
125             return mContext.getString(R.string.data_summary_format,
126                     Formatter.formatFileSize(mContext, totalBytes),
127                     DateUtils.formatDateTime(mContext, mChartData.detail.getStart(),
128                             DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH));
129         }
130         return mContext.getString(R.string.computing_size);
131     }
132 
getTemplate(Context context)133     private static NetworkTemplate getTemplate(Context context) {
134         if (DataUsageList.hasReadyMobileRadio(context)) {
135             return NetworkTemplate.buildTemplateMobileWildcard();
136         }
137         if (DataUsageUtils.hasWifiRadio(context)) {
138             return NetworkTemplate.buildTemplateWifiWildcard();
139         }
140         return NetworkTemplate.buildTemplateEthernet();
141     }
142 
143     @VisibleForTesting
isBandwidthControlEnabled()144     boolean isBandwidthControlEnabled() {
145         return Utils.isBandwidthControlEnabled();
146     }
147 
148 }
149