1/* 2 * Copyright (C) 2014 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 17package com.android.settings.applications; 18 19import android.os.Bundle; 20import android.text.format.Formatter; 21import android.view.LayoutInflater; 22import android.view.View; 23import android.view.ViewGroup; 24import android.widget.ProgressBar; 25import android.widget.TextView; 26import com.android.internal.app.ProcessStats; 27import com.android.internal.logging.MetricsLogger; 28import com.android.settings.InstrumentedFragment; 29import com.android.settings.R; 30 31import static com.android.settings.Utils.prepareCustomPreferencesList; 32 33public class ProcessStatsMemDetail extends InstrumentedFragment { 34 public static final String EXTRA_MEM_TIMES = "mem_times"; 35 public static final String EXTRA_MEM_STATE_WEIGHTS = "mem_state_weights"; 36 public static final String EXTRA_MEM_CACHED_WEIGHT = "mem_cached_weight"; 37 public static final String EXTRA_MEM_FREE_WEIGHT = "mem_free_weight"; 38 public static final String EXTRA_MEM_ZRAM_WEIGHT = "mem_zram_weight"; 39 public static final String EXTRA_MEM_KERNEL_WEIGHT = "mem_kernel_weight"; 40 public static final String EXTRA_MEM_NATIVE_WEIGHT = "mem_native_weight"; 41 public static final String EXTRA_MEM_TOTAL_WEIGHT = "mem_total_weight"; 42 public static final String EXTRA_USE_USS = "use_uss"; 43 public static final String EXTRA_TOTAL_TIME = "total_time"; 44 45 long[] mMemTimes; 46 double[] mMemStateWeights; 47 double mMemCachedWeight; 48 double mMemFreeWeight; 49 double mMemZRamWeight; 50 double mMemKernelWeight; 51 double mMemNativeWeight; 52 double mMemTotalWeight; 53 boolean mUseUss; 54 long mTotalTime; 55 56 private View mRootView; 57 private ViewGroup mMemStateParent; 58 private ViewGroup mMemUseParent; 59 60 @Override 61 public void onCreate(Bundle icicle) { 62 super.onCreate(icicle); 63 final Bundle args = getArguments(); 64 mMemTimes = args.getLongArray(EXTRA_MEM_TIMES); 65 mMemStateWeights = args.getDoubleArray(EXTRA_MEM_STATE_WEIGHTS); 66 mMemCachedWeight = args.getDouble(EXTRA_MEM_CACHED_WEIGHT); 67 mMemFreeWeight = args.getDouble(EXTRA_MEM_FREE_WEIGHT); 68 mMemZRamWeight = args.getDouble(EXTRA_MEM_ZRAM_WEIGHT); 69 mMemKernelWeight = args.getDouble(EXTRA_MEM_KERNEL_WEIGHT); 70 mMemNativeWeight = args.getDouble(EXTRA_MEM_NATIVE_WEIGHT); 71 mMemTotalWeight = args.getDouble(EXTRA_MEM_TOTAL_WEIGHT); 72 mUseUss = args.getBoolean(EXTRA_USE_USS); 73 mTotalTime = args.getLong(EXTRA_TOTAL_TIME); 74 } 75 76 @Override 77 public View onCreateView( 78 LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 79 final View view = inflater.inflate(R.layout.process_stats_mem_details, container, false); 80 prepareCustomPreferencesList(container, view, view, false); 81 82 mRootView = view; 83 createDetails(); 84 return view; 85 } 86 87 @Override 88 protected int getMetricsCategory() { 89 return MetricsLogger.APPLICATIONS_PROCESS_STATS_MEM_DETAIL; 90 } 91 92 @Override 93 public void onPause() { 94 super.onPause(); 95 } 96 97 private void createDetails() { 98 mMemStateParent = (ViewGroup)mRootView.findViewById(R.id.mem_state); 99 mMemUseParent = (ViewGroup)mRootView.findViewById(R.id.mem_use); 100 101 fillMemStateSection(); 102 fillMemUseSection(); 103 } 104 105 private void addDetailsItem(ViewGroup parent, CharSequence title, 106 float level, CharSequence value) { 107 LayoutInflater inflater = getActivity().getLayoutInflater(); 108 ViewGroup item = (ViewGroup) inflater.inflate(R.layout.app_item, null); 109 inflater.inflate(R.layout.widget_progress_bar, 110 (ViewGroup) item.findViewById(android.R.id.widget_frame)); 111 parent.addView(item); 112 item.findViewById(android.R.id.icon).setVisibility(View.GONE); 113 TextView titleView = (TextView) item.findViewById(android.R.id.title); 114 TextView valueView = (TextView) item.findViewById(android.R.id.text1); 115 titleView.setText(title); 116 valueView.setText(value); 117 ProgressBar progress = (ProgressBar) item.findViewById(android.R.id.progress); 118 progress.setProgress(Math.round(level*100)); 119 } 120 121 private void fillMemStateSection() { 122 CharSequence[] labels = getResources().getTextArray(R.array.proc_stats_memory_states); 123 for (int i=0; i<ProcessStats.ADJ_MEM_FACTOR_COUNT; i++) { 124 if (mMemTimes[i] > 0) { 125 float level = ((float)mMemTimes[i])/mTotalTime; 126 addDetailsItem(mMemStateParent, labels[i], level, 127 Formatter.formatShortElapsedTime(getActivity(), mMemTimes[i])); 128 } 129 } 130 } 131 132 private void addMemUseDetailsItem(ViewGroup parent, CharSequence title, double weight) { 133 if (weight > 0) { 134 float level = (float)(weight/mMemTotalWeight); 135 String value = Formatter.formatShortFileSize(getActivity(), 136 (long)((weight * 1024) / mTotalTime)); 137 addDetailsItem(parent, title, level, value); 138 } 139 } 140 141 private void fillMemUseSection() { 142 CharSequence[] labels = getResources().getTextArray(R.array.proc_stats_process_states); 143 addMemUseDetailsItem(mMemUseParent, 144 getResources().getText(R.string.mem_use_kernel_type), mMemKernelWeight); 145 addMemUseDetailsItem(mMemUseParent, 146 getResources().getText(R.string.mem_use_zram_type), mMemZRamWeight); 147 addMemUseDetailsItem(mMemUseParent, 148 getResources().getText(R.string.mem_use_native_type), mMemNativeWeight); 149 for (int i=0; i<ProcessStats.STATE_COUNT; i++) { 150 addMemUseDetailsItem(mMemUseParent, labels[i], mMemStateWeights[i]); 151 } 152 addMemUseDetailsItem(mMemUseParent, 153 getResources().getText(R.string.mem_use_kernel_cache_type), mMemCachedWeight); 154 addMemUseDetailsItem(mMemUseParent, 155 getResources().getText(R.string.mem_use_free_type), mMemFreeWeight); 156 addMemUseDetailsItem(mMemUseParent, 157 getResources().getText(R.string.mem_use_total), mMemTotalWeight); 158 } 159} 160