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