1 /* 2 * Copyright (C) 2015 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 package com.android.settings.applications; 17 18 import android.app.Activity; 19 import android.app.settings.SettingsEnums; 20 import android.content.Context; 21 import android.os.Bundle; 22 import android.text.format.Formatter; 23 import android.text.format.Formatter.BytesResult; 24 25 import androidx.preference.Preference; 26 import androidx.preference.Preference.OnPreferenceClickListener; 27 28 import com.android.settings.R; 29 import com.android.settings.SummaryPreference; 30 import com.android.settings.Utils; 31 import com.android.settings.applications.ProcStatsData.MemInfo; 32 import com.android.settings.core.SubSettingLauncher; 33 import com.android.settings.dashboard.SummaryLoader; 34 35 public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener { 36 37 private static final String KEY_STATUS_HEADER = "status_header"; 38 39 private static final String KEY_PERFORMANCE = "performance"; 40 private static final String KEY_TOTAL_MEMORY = "total_memory"; 41 private static final String KEY_AVERAGY_USED = "average_used"; 42 private static final String KEY_FREE = "free"; 43 private static final String KEY_APP_LIST = "apps_list"; 44 45 private SummaryPreference mSummaryPref; 46 47 private Preference mPerformance; 48 private Preference mTotalMemory; 49 private Preference mAverageUsed; 50 private Preference mFree; 51 private Preference mAppListPreference; 52 53 @Override onCreate(Bundle icicle)54 public void onCreate(Bundle icicle) { 55 super.onCreate(icicle); 56 57 addPreferencesFromResource(R.xml.process_stats_summary); 58 mSummaryPref = (SummaryPreference) findPreference(KEY_STATUS_HEADER); 59 mPerformance = findPreference(KEY_PERFORMANCE); 60 mTotalMemory = findPreference(KEY_TOTAL_MEMORY); 61 mAverageUsed = findPreference(KEY_AVERAGY_USED); 62 mFree = findPreference(KEY_FREE); 63 mAppListPreference = findPreference(KEY_APP_LIST); 64 mAppListPreference.setOnPreferenceClickListener(this); 65 } 66 67 @Override refreshUi()68 public void refreshUi() { 69 Context context = getContext(); 70 71 MemInfo memInfo = mStatsManager.getMemInfo(); 72 73 double usedRam = memInfo.realUsedRam; 74 double totalRam = memInfo.realTotalRam; 75 double freeRam = memInfo.realFreeRam; 76 BytesResult usedResult = Formatter.formatBytes(context.getResources(), (long) usedRam, 77 Formatter.FLAG_SHORTER); 78 String totalString = Formatter.formatShortFileSize(context, (long) totalRam); 79 String freeString = Formatter.formatShortFileSize(context, (long) freeRam); 80 CharSequence memString; 81 CharSequence[] memStatesStr = getResources().getTextArray(R.array.ram_states); 82 int memState = mStatsManager.getMemState(); 83 if (memState >= 0 && memState < memStatesStr.length - 1) { 84 memString = memStatesStr[memState]; 85 } else { 86 memString = memStatesStr[memStatesStr.length - 1]; 87 } 88 mSummaryPref.setAmount(usedResult.value); 89 mSummaryPref.setUnits(usedResult.units); 90 float usedRatio = (float)(usedRam / (freeRam + usedRam)); 91 mSummaryPref.setRatios(usedRatio, 0, 1 - usedRatio); 92 93 mPerformance.setSummary(memString); 94 mTotalMemory.setSummary(totalString); 95 mAverageUsed.setSummary(Utils.formatPercentage((long) usedRam, (long) totalRam)); 96 mFree.setSummary(freeString); 97 String durationString = getString(sDurationLabels[mDurationIndex]); 98 int numApps = mStatsManager.getEntries().size(); 99 mAppListPreference.setSummary(getResources().getQuantityString( 100 R.plurals.memory_usage_apps_summary, numApps, numApps, durationString)); 101 } 102 103 @Override getMetricsCategory()104 public int getMetricsCategory() { 105 return SettingsEnums.PROCESS_STATS_SUMMARY; 106 } 107 108 @Override getHelpResource()109 public int getHelpResource() { 110 return R.string.help_uri_process_stats_summary; 111 } 112 113 @Override onPreferenceClick(Preference preference)114 public boolean onPreferenceClick(Preference preference) { 115 if (preference == mAppListPreference) { 116 final Bundle args = new Bundle(); 117 args.putBoolean(ARG_TRANSFER_STATS, true); 118 args.putInt(ARG_DURATION_INDEX, mDurationIndex); 119 mStatsManager.xferStats(); 120 new SubSettingLauncher(getContext()) 121 .setDestination(ProcessStatsUi.class.getName()) 122 .setTitleRes(R.string.memory_usage_apps) 123 .setArguments(args) 124 .setSourceMetricsCategory(getMetricsCategory()) 125 .launch(); 126 return true; 127 } 128 return false; 129 } 130 131 private static class SummaryProvider implements SummaryLoader.SummaryProvider { 132 133 private final Context mContext; 134 private final SummaryLoader mSummaryLoader; 135 SummaryProvider(Context context, SummaryLoader summaryLoader)136 public SummaryProvider(Context context, SummaryLoader summaryLoader) { 137 mContext = context; 138 mSummaryLoader = summaryLoader; 139 } 140 141 @Override setListening(boolean listening)142 public void setListening(boolean listening) { 143 if (listening) { 144 ProcStatsData statsManager = new ProcStatsData(mContext, false); 145 statsManager.setDuration(sDurations[0]); 146 MemInfo memInfo = statsManager.getMemInfo(); 147 String usedResult = Formatter.formatShortFileSize(mContext, 148 (long) memInfo.realUsedRam); 149 String totalResult = Formatter.formatShortFileSize(mContext, 150 (long) memInfo.realTotalRam); 151 mSummaryLoader.setSummary(this, mContext.getString(R.string.memory_summary, 152 usedResult, totalResult)); 153 } 154 } 155 } 156 157 public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY 158 = new SummaryLoader.SummaryProviderFactory() { 159 @Override 160 public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, 161 SummaryLoader summaryLoader) { 162 return new SummaryProvider(activity, summaryLoader); 163 } 164 }; 165 166 } 167