From 8f600a4fbcddda07e724815c39ba7fa6f9194e1c Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 8 May 2015 15:03:14 -0400 Subject: [PATCH] Button that goes from app info details to app info This info button is shown on the header of all app detail pages. This button is hidden when coming from app info, to avoid allowing users to go in circles. Since app notification details had a settings button where the new info button goes, the app notification settings will move down to be a preference (this matches the usage access screen UX). Also fix a bug in launching app notification settings for managed profiles. Bug: 20633669 Change-Id: Idbb4f7c3326b4c6b0a19559b722ee0406eaba6c0 --- res/drawable/ic_info.xml | 24 +++++++++++++++++ res/layout/app_header.xml | 2 +- res/values/strings.xml | 3 +++ res/xml/app_notification_settings.xml | 7 +++++ .../applications/AppInfoWithHeader.java | 26 ++++++++++++++++++- .../applications/InstalledAppDetails.java | 3 +++ .../applications/ManageApplications.java | 5 ++-- .../applications/ProcessStatsDetail.java | 2 +- .../settings/fuelgauge/PowerUsageDetail.java | 4 ++- .../notification/AppNotificationSettings.java | 18 ++++++++++++- 10 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 res/drawable/ic_info.xml diff --git a/res/drawable/ic_info.xml b/res/drawable/ic_info.xml new file mode 100644 index 00000000000..13d00a41da9 --- /dev/null +++ b/res/drawable/ic_info.xml @@ -0,0 +1,24 @@ + + + + diff --git a/res/layout/app_header.xml b/res/layout/app_header.xml index d9453f49b14..ffc68296309 100644 --- a/res/layout/app_header.xml +++ b/res/layout/app_header.xml @@ -50,7 +50,7 @@ android:minWidth="0dp" android:contentDescription="@string/notification_app_settings_button" android:scaleType="center" - android:src="@drawable/ic_settings_32dp" + android:src="@drawable/ic_info" style="?android:attr/borderlessButtonStyle" /> No battery use since last full charge + + App notification preferences + diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml index 9aebb39c3e7..b7557b27956 100644 --- a/res/xml/app_notification_settings.xml +++ b/res/xml/app_notification_settings.xml @@ -50,4 +50,11 @@ android:order="4" android:persistent="false" /> + + + diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java index f8feaf16bad..5bfd79a4ddd 100644 --- a/src/com/android/settings/applications/AppInfoWithHeader.java +++ b/src/com/android/settings/applications/AppInfoWithHeader.java @@ -16,13 +16,19 @@ package com.android.settings.applications; +import android.app.Fragment; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; +import android.provider.Settings; import android.util.Log; import com.android.settings.AppHeader; public abstract class AppInfoWithHeader extends AppInfoBase { + public static final String EXTRA_HIDE_INFO_BUTTON = "hideInfoButton"; + private boolean mCreated; @Override @@ -35,6 +41,24 @@ public abstract class AppInfoWithHeader extends AppInfoBase { mCreated = true; if (mPackageInfo == null) return; AppHeader.createAppHeader(this, mPackageInfo.applicationInfo.loadIcon(mPm), - mPackageInfo.applicationInfo.loadLabel(mPm), null, 0); + mPackageInfo.applicationInfo.loadLabel(mPm), getInfoIntent(this, mPackageName), 0); + } + + public static Intent getInfoIntent(Fragment fragment, String packageName) { + Bundle args = fragment.getArguments(); + Intent intent = fragment.getActivity().getIntent(); + boolean showInfo = true; + if (args != null && args.getBoolean(EXTRA_HIDE_INFO_BUTTON, false)) { + showInfo = false; + } + if (intent != null && intent.getBooleanExtra(EXTRA_HIDE_INFO_BUTTON, false)) { + showInfo = false; + } + Intent infoIntent = null; + if (showInfo) { + infoIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + infoIntent.setData(Uri.fromParts("package", packageName, null)); + } + return infoIntent; } } diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java index a6fee90a9dc..b9ea5fd2933 100755 --- a/src/com/android/settings/applications/InstalledAppDetails.java +++ b/src/com/android/settings/applications/InstalledAppDetails.java @@ -616,6 +616,7 @@ public class InstalledAppDetails extends AppInfoBase // start new activity to manage app permissions Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); + intent.putExtra(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true); try { startActivity(intent); } catch (ActivityNotFoundException e) { @@ -627,6 +628,7 @@ public class InstalledAppDetails extends AppInfoBase // start new fragment to display extended information Bundle args = new Bundle(); args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mAppEntry.info.packageName); + args.putBoolean(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true); SettingsActivity sa = (SettingsActivity) getActivity(); sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT); @@ -636,6 +638,7 @@ public class InstalledAppDetails extends AppInfoBase // start new fragment to display extended information getActivity().startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + .putExtra(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true) .putExtra(Settings.EXTRA_APP_PACKAGE, mAppEntry.info.packageName) .putExtra(Settings.EXTRA_APP_UID, mAppEntry.info.uid)); } diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index 3107efdfea0..33585be4915 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -429,10 +429,11 @@ public class ManageApplications extends InstrumentedFragment Activity activity = getActivity(); switch (mListType) { case LIST_TYPE_NOTIFICATION: - activity.startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + activity.startActivityAsUser(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .putExtra(Settings.EXTRA_APP_PACKAGE, mCurrentPkgName) - .putExtra(Settings.EXTRA_APP_UID, mCurrentUid)); + .putExtra(Settings.EXTRA_APP_UID, mCurrentUid), + new UserHandle(UserHandle.getUserId(mCurrentUid))); break; case LIST_TYPE_DOMAINS_URLS: startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label); diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java index 55538bc99ae..258a7f2e420 100644 --- a/src/com/android/settings/applications/ProcessStatsDetail.java +++ b/src/com/android/settings/applications/ProcessStatsDetail.java @@ -114,7 +114,7 @@ public class ProcessStatsDetail extends SettingsPreferenceFragment AppHeader.createAppHeader(this, mApp.mUiTargetApp != null ? mApp.mUiTargetApp.loadIcon(mPm) : new ColorDrawable(0), - mApp.mUiLabel, null); + mApp.mUiLabel, AppInfoWithHeader.getInfoIntent(this, mApp.mPackage)); } @Override diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java index bac82022155..63ca1a4a45d 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java @@ -54,6 +54,7 @@ import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.WirelessSettings; import com.android.settings.applications.AppInfoBase; +import com.android.settings.applications.AppInfoWithHeader; import com.android.settings.applications.InstalledAppDetails; import com.android.settings.applications.LayoutPreference; import com.android.settings.bluetooth.BluetoothSettings; @@ -464,7 +465,8 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi appIcon = getActivity().getPackageManager().getDefaultActivityIcon(); } - AppHeader.createAppHeader(this, appIcon, title, null, + AppHeader.createAppHeader(this, appIcon, title, + AppInfoWithHeader.getInfoIntent(this, iconPackage), mDrainType != DrainType.APP ? android.R.color.white : 0); } diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index 28245c8c89d..52c011cc2b6 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -29,6 +29,7 @@ import android.os.Bundle; import android.os.UserHandle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; import android.preference.SwitchPreference; import android.provider.Settings; import android.text.TextUtils; @@ -42,6 +43,7 @@ import com.android.settings.AppHeader; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; +import com.android.settings.applications.AppInfoWithHeader; import com.android.settings.notification.NotificationBackend.AppRow; import java.util.List; @@ -55,6 +57,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment { private static final String KEY_PRIORITY = "priority"; private static final String KEY_PEEKABLE = "peekable"; private static final String KEY_SENSITIVE = "sensitive"; + private static final String KEY_APP_SETTINGS = "app_settings"; static final String EXTRA_HAS_SETTINGS_INTENT = "has_settings_intent"; static final String EXTRA_SETTINGS_INTENT = "settings_intent"; @@ -85,7 +88,7 @@ public class AppNotificationSettings extends SettingsPreferenceFragment { mCreated = true; if (mAppRow == null) return; AppHeader.createAppHeader(this, mAppRow.icon, mAppRow.label, - mAppRow.settingsIntent); + AppInfoWithHeader.getInfoIntent(this, mAppRow.pkg)); } @Override @@ -189,6 +192,19 @@ public class AppNotificationSettings extends SettingsPreferenceFragment { return mBackend.setSensitive(pkg, uid, sensitive); } }); + + if (mAppRow.settingsIntent != null) { + findPreference(KEY_APP_SETTINGS).setOnPreferenceClickListener( + new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + mContext.startActivity(mAppRow.settingsIntent); + return true; + } + }); + } else { + removePreference(KEY_APP_SETTINGS); + } } private void updateDependents(boolean banned) {