150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani/* 250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * Copyright (C) 2015 The Android Open Source Project 350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * 450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * you may not use this file except in compliance with the License. 650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * You may obtain a copy of the License at 750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * 850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * 1050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * Unless required by applicable law or agreed to in writing, software 1150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 1250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * See the License for the specific language governing permissions and 1450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani * limitations under the License. 1550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani */ 1650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 1750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasanipackage com.android.settings.fuelgauge; 1850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 1950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport android.app.usage.UsageStatsManager; 2050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport android.content.Context; 2150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport android.content.Intent; 2250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport android.content.pm.PackageManager; 2350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport android.content.pm.ResolveInfo; 2450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport android.os.Bundle; 2539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceClickListener; 2739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceGroup; 2850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 299d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 3050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport com.android.settings.R; 3150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport com.android.settings.SettingsPreferenceFragment; 3250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 3350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasaniimport java.util.List; 3450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 3550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasanipublic class InactiveApps extends SettingsPreferenceFragment implements OnPreferenceClickListener { 3650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 3750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani private UsageStatsManager mUsageStats; 3850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 3950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani @Override 4050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani protected int getMetricsCategory() { 419d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.FUELGAUGE_INACTIVE_APPS; 4250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 4350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 4450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani @Override 4550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani public void onCreate(Bundle icicle) { 4650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani super.onCreate(icicle); 4750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 4850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani mUsageStats = getActivity().getSystemService(UsageStatsManager.class); 4950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani addPreferencesFromResource(R.xml.inactive_apps); 5050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 5150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 5250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani @Override 5350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani public void onResume() { 5450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani super.onResume(); 5550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani init(); 5650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 5750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 5850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani private void init() { 5950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani PreferenceGroup screen = getPreferenceScreen(); 6050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani screen.removeAll(); 6150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani screen.setOrderingAsAdded(false); 6250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani final Context context = getActivity(); 6350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani final PackageManager pm = context.getPackageManager(); 6450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani final UsageStatsManager usm = context.getSystemService(UsageStatsManager.class); 6550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 6650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani Intent launcherIntent = new Intent(Intent.ACTION_MAIN); 6750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); 6850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani List<ResolveInfo> apps = pm.queryIntentActivities(launcherIntent, 0); 6950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani for (ResolveInfo app : apps) { 7050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani String packageName = app.activityInfo.applicationInfo.packageName; 7139b467482d1bf256a111c757e9b7621c6f523271Jason Monk Preference p = new Preference(getPrefContext()); 7250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani p.setTitle(app.loadLabel(pm)); 7350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani p.setIcon(app.loadIcon(pm)); 7450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani p.setKey(packageName); 7550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani updateSummary(p); 7650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani p.setOnPreferenceClickListener(this); 7750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 7850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani screen.addPreference(p); 7950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 8050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 8150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 8250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani private void updateSummary(Preference p) { 8350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani boolean inactive = mUsageStats.isAppInactive(p.getKey()); 8450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani p.setSummary(inactive 8550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani ? R.string.inactive_app_inactive_summary 8650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani : R.string.inactive_app_active_summary); 8750e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 8850e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani 8950e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani @Override 9050e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani public boolean onPreferenceClick(Preference preference) { 9150e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani String packageName = preference.getKey(); 9250e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani mUsageStats.setAppInactive(packageName, !mUsageStats.isAppInactive(packageName)); 9350e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani updateSummary(preference); 9450e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani return false; 9550e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani } 9650e32b0db0589f6aace1928d3228734ad68179e6Amith Yamasani} 97