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