• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.settings.fuelgauge;
18 
19 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
20 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
21 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
22 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
23 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
24 import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
25 
26 import android.app.usage.UsageStatsManager;
27 import android.content.Context;
28 import android.content.Intent;
29 import android.content.pm.PackageManager;
30 import android.content.pm.ResolveInfo;
31 import android.content.res.Resources;
32 import android.os.Bundle;
33 import android.support.v7.preference.ListPreference;
34 import android.support.v7.preference.Preference;
35 import android.support.v7.preference.Preference.OnPreferenceClickListener;
36 import android.support.v7.preference.PreferenceGroup;
37 
38 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
39 import com.android.settings.R;
40 import com.android.settings.SettingsPreferenceFragment;
41 import com.android.settings.widget.RadioButtonPreference;
42 
43 import java.util.List;
44 
45 public class InactiveApps extends SettingsPreferenceFragment
46         implements Preference.OnPreferenceChangeListener {
47 
48     private static final CharSequence[] SETTABLE_BUCKETS_NAMES =
49             {"ACTIVE", "WORKING_SET", "FREQUENT", "RARE"};
50 
51     private static final CharSequence[] SETTABLE_BUCKETS_VALUES = {
52             Integer.toString(STANDBY_BUCKET_ACTIVE),
53             Integer.toString(STANDBY_BUCKET_WORKING_SET),
54             Integer.toString(STANDBY_BUCKET_FREQUENT),
55             Integer.toString(STANDBY_BUCKET_RARE)
56     };
57 
58     private UsageStatsManager mUsageStats;
59 
60     @Override
getMetricsCategory()61     public int getMetricsCategory() {
62         return MetricsEvent.FUELGAUGE_INACTIVE_APPS;
63     }
64 
65     @Override
onCreate(Bundle icicle)66     public void onCreate(Bundle icicle) {
67         super.onCreate(icicle);
68 
69         mUsageStats = getActivity().getSystemService(UsageStatsManager.class);
70         addPreferencesFromResource(R.xml.inactive_apps);
71     }
72 
73     @Override
onResume()74     public void onResume() {
75         super.onResume();
76         init();
77     }
78 
init()79     private void init() {
80         PreferenceGroup screen = getPreferenceScreen();
81         screen.removeAll();
82         screen.setOrderingAsAdded(false);
83         final Context context = getActivity();
84         final PackageManager pm = context.getPackageManager();
85         final UsageStatsManager usm = context.getSystemService(UsageStatsManager.class);
86 
87         Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
88         launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
89         List<ResolveInfo> apps = pm.queryIntentActivities(launcherIntent, 0);
90         for (ResolveInfo app : apps) {
91             String packageName = app.activityInfo.applicationInfo.packageName;
92             ListPreference p = new ListPreference(getPrefContext());
93             p.setTitle(app.loadLabel(pm));
94             p.setIcon(app.loadIcon(pm));
95             p.setKey(packageName);
96             p.setEntries(SETTABLE_BUCKETS_NAMES);
97             p.setEntryValues(SETTABLE_BUCKETS_VALUES);
98             updateSummary(p);
99             p.setOnPreferenceChangeListener(this);
100 
101             screen.addPreference(p);
102         }
103     }
104 
bucketToName(int bucket)105     static String bucketToName(int bucket) {
106         switch (bucket) {
107             case STANDBY_BUCKET_EXEMPTED: return "EXEMPTED";
108             case STANDBY_BUCKET_ACTIVE: return "ACTIVE";
109             case STANDBY_BUCKET_WORKING_SET: return "WORKING_SET";
110             case STANDBY_BUCKET_FREQUENT: return "FREQUENT";
111             case STANDBY_BUCKET_RARE: return "RARE";
112             case STANDBY_BUCKET_NEVER: return "NEVER";
113         }
114         return "";
115     }
116 
updateSummary(ListPreference p)117     private void updateSummary(ListPreference p) {
118         final Resources res = getActivity().getResources();
119         final int appBucket = mUsageStats.getAppStandbyBucket(p.getKey());
120         final String bucketName = bucketToName(appBucket);
121         p.setSummary(res.getString(R.string.standby_bucket_summary, bucketName));
122         // Buckets outside of the range of the dynamic ones are only used for special
123         // purposes and can either not be changed out of, or might have undesirable
124         // side-effects in combination with other assumptions.
125         final boolean changeable = appBucket >= STANDBY_BUCKET_ACTIVE
126                 && appBucket <= STANDBY_BUCKET_RARE;
127         if (changeable) {
128             p.setValue(Integer.toString(appBucket));
129         }
130         p.setEnabled(changeable);
131     }
132 
133     @Override
onPreferenceChange(Preference preference, Object newValue)134     public boolean onPreferenceChange(Preference preference, Object newValue) {
135         mUsageStats.setAppStandbyBucket(preference.getKey(), Integer.parseInt((String) newValue));
136         updateSummary((ListPreference) preference);
137         return false;
138     }
139 }
140