diff --git a/res/layout/location_list_no_item.xml b/res/layout/location_list_no_item.xml new file mode 100644 index 00000000000..864b2e4c307 --- /dev/null +++ b/res/layout/location_list_no_item.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index b49d9292019..71cedef9e75 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2377,8 +2377,8 @@ Location off Recent location requests - - No recent apps + + No apps have requested location in the last 15 minutes. Location services diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index e646cab3acb..83b80b1baee 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -16,10 +16,7 @@ - - diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 4970d37fa80..4e541074d43 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -52,9 +52,7 @@ public class LocationSettings extends LocationSettingsBase private Switch mSwitch; private boolean mValidListener; - private PreferenceScreen mLocationMode; - private PreferenceCategory mRecentLocationRequests; - private PreferenceCategory mLocationServices; + private Preference mLocationMode; private BatteryStatsHelper mStatsHelper; @@ -125,7 +123,7 @@ public class LocationSettings extends LocationSettingsBase addPreferencesFromResource(R.xml.location_settings); root = getPreferenceScreen(); - mLocationMode = (PreferenceScreen) root.findPreference(KEY_LOCATION_MODE); + mLocationMode = root.findPreference(KEY_LOCATION_MODE); mLocationMode.setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { @Override @@ -140,25 +138,31 @@ public class LocationSettings extends LocationSettingsBase final PreferenceManager preferenceManager = getPreferenceManager(); - mRecentLocationRequests = + PreferenceCategory categoryRecentLocationRequests = (PreferenceCategory) root.findPreference(KEY_RECENT_LOCATION_REQUESTS); RecentLocationApps recentApps = new RecentLocationApps(activity, mStatsHelper); - List recentLocationRequests = recentApps.getAppList(preferenceManager); + List recentLocationRequests = recentApps.getAppList(); if (recentLocationRequests.size() > 0) { - addPreferencesSorted(recentLocationRequests, mRecentLocationRequests); + addPreferencesSorted(recentLocationRequests, categoryRecentLocationRequests); } else { // If there's no item to display, add a "No recent apps" item. - PreferenceScreen screen = preferenceManager.createPreferenceScreen(activity); - screen.setTitle(R.string.location_no_recent_apps); - screen.setSelectable(false); - screen.setEnabled(false); - mRecentLocationRequests.addPreference(screen); + Preference banner = new Preference(activity); + banner.setLayoutResource(R.layout.location_list_no_item); + banner.setTitle(R.string.location_no_recent_apps); + banner.setSelectable(false); + banner.setEnabled(false); + categoryRecentLocationRequests.addPreference(banner); } - mLocationServices = (PreferenceCategory) root.findPreference(KEY_LOCATION_SERVICES); - List locationServices = SettingsInjector.getInjectedSettings( - activity, preferenceManager); - addPreferencesSorted(locationServices, mLocationServices); + PreferenceCategory categoryLocationServices = + (PreferenceCategory) root.findPreference(KEY_LOCATION_SERVICES); + List locationServices = SettingsInjector.getInjectedSettings(activity); + if (locationServices.size() > 0) { + addPreferencesSorted(locationServices, categoryLocationServices); + } else { + // If there's no item to display, remove the whole category. + root.removePreference(categoryLocationServices); + } // Only show the master switch when we're not in multi-pane mode, and not being used as // Setup Wizard. @@ -206,7 +210,6 @@ public class LocationSettings extends LocationSettingsBase boolean enabled = (mode != Settings.Secure.LOCATION_MODE_OFF); mLocationMode.setEnabled(enabled); - mLocationServices.setEnabled(enabled); if (enabled != mSwitch.isChecked()) { // set listener to null so that that code below doesn't trigger onCheckedChanged() diff --git a/src/com/android/settings/location/RecentLocationApps.java b/src/com/android/settings/location/RecentLocationApps.java index cbf8351dc60..23e6dcffd0d 100644 --- a/src/com/android/settings/location/RecentLocationApps.java +++ b/src/com/android/settings/location/RecentLocationApps.java @@ -24,8 +24,6 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; import android.util.Log; import com.android.settings.R; @@ -93,22 +91,21 @@ public class RecentLocationApps { } } - private PreferenceScreen createRecentLocationEntry( - PreferenceManager preferenceManager, + private Preference createRecentLocationEntry( Drawable icon, CharSequence label, boolean isHighBattery, Preference.OnPreferenceClickListener listener) { - PreferenceScreen screen = preferenceManager.createPreferenceScreen(mActivity); - screen.setIcon(icon); - screen.setTitle(label); + Preference pref = new Preference(mActivity); + pref.setIcon(icon); + pref.setTitle(label); if (isHighBattery) { - screen.setSummary(R.string.location_high_battery_use); + pref.setSummary(R.string.location_high_battery_use); } else { - screen.setSummary(R.string.location_low_battery_use); + pref.setSummary(R.string.location_low_battery_use); } - screen.setOnPreferenceClickListener(listener); - return screen; + pref.setOnPreferenceClickListener(listener); + return pref; } /** @@ -140,7 +137,7 @@ public class RecentLocationApps { * Fills a list of applications which queried location recently within * specified time. */ - public List getAppList(PreferenceManager preferenceManager) { + public List getAppList() { // Retrieve Uid-based battery blaming info and generate a package to BatterySipper HashMap // for later faster looking up. mStatsHelper.refreshStats(); @@ -169,9 +166,9 @@ public class RecentLocationApps { long now = System.currentTimeMillis(); for (AppOpsManager.PackageOps ops : appOps) { BatterySipperWrapper wrapper = sipperMap.get(ops.getUid()); - PreferenceScreen screen = getScreenFromOps(preferenceManager, now, ops, wrapper); - if (screen != null) { - prefs.add(screen); + Preference pref = getPreferenceFromOps(now, ops, wrapper); + if (pref != null) { + prefs.add(pref); } } @@ -179,19 +176,17 @@ public class RecentLocationApps { } /** - * Creates a PreferenceScreen entry for the given PackageOps. + * Creates a Preference entry for the given PackageOps. * * This method examines the time interval of the PackageOps first. If the PackageOps is older * than the designated interval, this method ignores the PackageOps object and returns null. * * When the PackageOps is fresh enough, if the package has a corresponding battery blaming entry - * in the Uid-based battery sipper list, this method returns a PreferenceScreen pointing to the - * Uid battery blaming page. If the package doesn't have a battery sipper entry (typically - * shouldn't happen), this method returns a PreferenceScreen pointing to the App Info page for - * that package. + * in the Uid-based battery sipper list, this method returns a Preference pointing to the Uid + * battery blaming page. If the package doesn't have a battery sipper entry (typically shouldn't + * happen), this method returns a Preference pointing to the App Info page for that package. */ - private PreferenceScreen getScreenFromOps( - PreferenceManager preferenceManager, + private Preference getPreferenceFromOps( long now, AppOpsManager.PackageOps ops, BatterySipperWrapper wrapper) { @@ -224,7 +219,7 @@ public class RecentLocationApps { // The package is fresh enough, continue. - PreferenceScreen screen = null; + Preference pref = null; if (wrapper != null) { // Contains sipper. Link to Battery Blaming page. @@ -233,8 +228,7 @@ public class RecentLocationApps { if (!wrapper.used()) { BatterySipper sipper = wrapper.batterySipper(); sipper.loadNameAndIcon(); - screen = createRecentLocationEntry( - preferenceManager, + pref = createRecentLocationEntry( sipper.getIcon(), sipper.getLabel(), highBattery, @@ -249,8 +243,7 @@ public class RecentLocationApps { try { ApplicationInfo appInfo = mPackageManager.getApplicationInfo( packageName, PackageManager.GET_META_DATA); - screen = createRecentLocationEntry( - preferenceManager, + pref = createRecentLocationEntry( mPackageManager.getApplicationIcon(appInfo), mPackageManager.getApplicationLabel(appInfo), highBattery, @@ -260,6 +253,6 @@ public class RecentLocationApps { } } - return screen; + return pref; } } diff --git a/src/com/android/settings/location/SettingsInjector.java b/src/com/android/settings/location/SettingsInjector.java index 0b7c172b299..41cd8694b59 100644 --- a/src/com/android/settings/location/SettingsInjector.java +++ b/src/com/android/settings/location/SettingsInjector.java @@ -31,8 +31,6 @@ import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.preference.Preference; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -240,14 +238,13 @@ class SettingsInjector { * TODO: extract InjectedLocationSettingGetter that returns an iterable over * InjectedSetting objects, so that this class can focus on UI */ - public static List getInjectedSettings(Context context, - PreferenceManager preferenceManager) { + public static List getInjectedSettings(Context context) { Iterable settings = getSettings(context); ArrayList prefs = new ArrayList(); StatusLoader loader = null; for (InjectedSetting setting : settings) { - Preference pref = addServiceSetting(context, prefs, setting, preferenceManager); + Preference pref = addServiceSetting(context, prefs, setting); Intent intent = createUpdatingIntent(context, pref, setting, loader); loader = new StatusLoader(context, intent, loader); } @@ -263,22 +260,21 @@ class SettingsInjector { /** * Adds an injected setting to the root with status "Loading...". */ - private static PreferenceScreen addServiceSetting(Context context, - List prefs, InjectedSetting info, PreferenceManager preferenceManager) { - - PreferenceScreen screen = preferenceManager.createPreferenceScreen(context); - screen.setTitle(info.title); - screen.setSummary(R.string.location_loading_injected_setting); + private static Preference addServiceSetting( + Context context, List prefs, InjectedSetting info) { + Preference pref = new Preference(context); + pref.setTitle(info.title); + pref.setSummary(R.string.location_loading_injected_setting); PackageManager pm = context.getPackageManager(); Drawable icon = pm.getDrawable(info.packageName, info.iconId, null); - screen.setIcon(icon); + pref.setIcon(icon); Intent settingIntent = new Intent(); settingIntent.setClassName(info.packageName, info.settingsActivity); - screen.setIntent(settingIntent); + pref.setIntent(settingIntent); - prefs.add(screen); - return screen; + prefs.add(pref); + return pref; } /**