diff --git a/src/com/android/settings/applications/AppHeaderController.java b/src/com/android/settings/applications/AppHeaderController.java index f3c85ea443f..40921b8f5ec 100644 --- a/src/com/android/settings/applications/AppHeaderController.java +++ b/src/com/android/settings/applications/AppHeaderController.java @@ -27,6 +27,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.support.annotation.IntDef; +import android.support.v7.preference.Preference; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -58,6 +59,7 @@ public class AppHeaderController { int ACTION_APP_PREFERENCE = 3; int ACTION_NOTIF_PREFERENCE = 4; } + public static final String PREF_KEY_APP_HEADER = "pref_app_header"; private static final String TAG = "AppDetailFeature"; @@ -175,6 +177,17 @@ public class AppHeaderController { } } + /** + * Done mutating appheader, rebinds everything and return a new {@link LayoutPreference}. + */ + public LayoutPreference done(Context context) { + final LayoutPreference pref = new LayoutPreference(context, done()); + // Makes sure it's the first preference onscreen. + pref.setOrder(-1000); + pref.setKey(PREF_KEY_APP_HEADER); + return pref; + } + /** * Done mutating appheader, rebinds everything. */ diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java index c482892f4a5..910b618b04f 100644 --- a/src/com/android/settings/applications/AppInfoWithHeader.java +++ b/src/com/android/settings/applications/AppInfoWithHeader.java @@ -20,7 +20,6 @@ import android.app.Activity; import android.os.Bundle; import android.support.v7.preference.Preference; import android.util.Log; -import android.view.View; import com.android.settings.AppHeader; import com.android.settings.overlay.FeatureFactory; @@ -47,7 +46,7 @@ public abstract class AppInfoWithHeader extends AppInfoBase { mPackageInfo.applicationInfo.loadLabel(mPm), mPackageName, mPackageInfo.applicationInfo.uid, 0); } else { - final View appHeader = FeatureFactory.getFactory(activity) + final Preference pref = FeatureFactory.getFactory(activity) .getApplicationFeatureProvider(activity) .newAppHeaderController(this, null /* appHeader */) .setIcon(mPackageInfo.applicationInfo.loadIcon(mPm)) @@ -56,11 +55,8 @@ public abstract class AppInfoWithHeader extends AppInfoBase { .setPackageName(mPackageName) .setUid(mPackageInfo.applicationInfo.uid) .setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE) - .done(); - final Preference appHeaderPref = new LayoutPreference(getPrefContext(), appHeader); - // Makes sure it's the first preference onscreen. - appHeaderPref.setOrder(-1000); - getPreferenceScreen().addPreference(appHeaderPref); + .done(getPrefContext()); + getPreferenceScreen().addPreference(pref); } } } diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index 23242c716d2..7dee5f41489 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -31,8 +31,8 @@ import android.os.LocaleList; import android.os.UserHandle; import android.os.UserManager; import android.preference.PreferenceFrameLayout; +import android.support.v7.preference.Preference; import android.text.TextUtils; -import android.util.ArraySet; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -52,9 +52,9 @@ import android.widget.FrameLayout; import android.widget.ListView; import android.widget.SectionIndexer; import android.widget.Spinner; + import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.AppHeader; -import com.android.settings.core.InstrumentedFragment; import com.android.settings.R; import com.android.settings.Settings.AllApplicationsActivity; import com.android.settings.Settings.HighPowerApplicationsActivity; @@ -67,6 +67,7 @@ import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.applications.AppStateAppOpsBridge.PermissionState; import com.android.settings.applications.AppStateUsageBridge.UsageState; +import com.android.settings.core.InstrumentedFragment; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.fuelgauge.HighPowerDetail; import com.android.settings.fuelgauge.PowerWhitelistBackend; @@ -338,7 +339,7 @@ public class ManageApplications extends InstrumentedFragment private void createHeader() { Activity activity = getActivity(); FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header); - mSpinnerHeader = (ViewGroup) activity.getLayoutInflater() + mSpinnerHeader = activity.getLayoutInflater() .inflate(R.layout.apps_filter_spinner, pinnedHeader, false); mFilterSpinner = (Spinner) mSpinnerHeader.findViewById(R.id.filter_spinner); mFilterAdapter = new FilterSpinnerAdapter(this); @@ -371,9 +372,23 @@ public class ManageApplications extends InstrumentedFragment @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + if (mListType == LIST_TYPE_STORAGE) { - FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header); - AppHeader.createAppHeader(getActivity(), null, mVolumeName, null, -1, pinnedHeader); + final Activity activity = getActivity(); + final boolean isNewIAEnabled = FeatureFactory.getFactory(activity) + .getDashboardFeatureProvider(activity) + .isEnabled(); + if (!isNewIAEnabled) { + FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header); + AppHeader.createAppHeader(getActivity(), null, mVolumeName, null, -1, pinnedHeader); + } else { + final View appHeader = FeatureFactory.getFactory(activity) + .getApplicationFeatureProvider(activity) + .newAppHeaderController(this, null /* appHeaderView */) + .setLabel(mVolumeName) + .done(); + mListView.addHeaderView(appHeader); + } } } diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java index 524b66383c7..7a0760a7cca 100644 --- a/src/com/android/settings/applications/ProcessStatsDetail.java +++ b/src/com/android/settings/applications/ProcessStatsDetail.java @@ -133,7 +133,7 @@ public class ProcessStatsDetail extends SettingsPreferenceFragment { : new ColorDrawable(0), mApp.mUiLabel, mApp.mPackage, mApp.mUiTargetApp.uid); } else { - final View appHeader = FeatureFactory.getFactory(activity) + final Preference pref = FeatureFactory.getFactory(activity) .getApplicationFeatureProvider(activity) .newAppHeaderController(this, null /* appHeader */) .setIcon(mApp.mUiTargetApp != null @@ -145,11 +145,8 @@ public class ProcessStatsDetail extends SettingsPreferenceFragment { ? mApp.mUiTargetApp.uid : UserHandle.USER_NULL) .setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE) - .done(); - final Preference appHeaderPref = new LayoutPreference(getPrefContext(), appHeader); - // Makes sure it's the first preference onscreen. - appHeaderPref.setOrder(-1000); - getPreferenceScreen().addPreference(appHeaderPref); + .done(getPrefContext()); + getPreferenceScreen().addPreference(pref); } } diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index afe186bb700..d8b08491566 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -14,6 +14,7 @@ package com.android.settings.datausage; +import android.app.Activity; import android.app.LoaderManager; import android.content.Context; import android.content.Intent; @@ -29,7 +30,6 @@ import android.net.NetworkTemplate; import android.net.TrafficStats; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; @@ -38,13 +38,15 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; import android.text.format.Formatter; import android.util.ArraySet; -import android.util.Log; import android.view.View; import android.widget.AdapterView; + import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.AppHeader; import com.android.settings.R; +import com.android.settings.applications.AppHeaderController; import com.android.settings.applications.AppInfoBase; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.AppItem; import com.android.settingslib.Utils; import com.android.settingslib.net.ChartData; @@ -53,7 +55,6 @@ import com.android.settingslib.net.UidDetailProvider; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -345,15 +346,32 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - View header = setPinnedHeaderView(R.layout.app_header); String pkg = mPackages.size() != 0 ? mPackages.valueAt(0) : null; int uid = 0; try { uid = pkg != null ? getPackageManager().getPackageUid(pkg, 0) : 0; } catch (PackageManager.NameNotFoundException e) { } - AppHeader.setupHeaderView(getActivity(), mIcon, mLabel, - pkg, uid, AppHeader.includeAppInfo(this), 0, header, null); + + final Activity activity = getActivity(); + if (!FeatureFactory.getFactory(activity) + .getDashboardFeatureProvider(activity).isEnabled()) { + View header = setPinnedHeaderView(R.layout.app_header); + AppHeader.setupHeaderView(getActivity(), mIcon, mLabel, + pkg, uid, AppHeader.includeAppInfo(this), 0, header, null); + } else { + final Preference pref = FeatureFactory.getFactory(activity) + .getApplicationFeatureProvider(activity) + .newAppHeaderController(this, null /* appHeader */) + .setIcon(mIcon) + .setLabel(mLabel) + .setPackageName(pkg) + .setUid(uid) + .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO, + AppHeaderController.ActionType.ACTION_NONE) + .done(getPrefContext()); + getPreferenceScreen().addPreference(pref); + } } @Override diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java index 915cf745e2a..b42547f1399 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java @@ -37,6 +37,7 @@ import android.os.UserHandle; import android.support.v7.preference.Preference; import android.support.v7.preference.Preference.OnPreferenceClickListener; import android.support.v7.preference.PreferenceCategory; +import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -53,6 +54,7 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.WirelessSettings; +import com.android.settings.applications.AppHeaderController; import com.android.settings.applications.InstalledAppDetails; import com.android.settings.applications.LayoutPreference; import com.android.settings.bluetooth.BluetoothSettings; @@ -462,13 +464,14 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi } private void setupHeader() { + final Activity activity = getActivity(); final Bundle args = getArguments(); - String title = args.getString(EXTRA_TITLE); + final String title = args.getString(EXTRA_TITLE); + final int iconId = args.getInt(EXTRA_ICON_ID, 0); String pkg = args.getString(EXTRA_ICON_PACKAGE); - int iconId = args.getInt(EXTRA_ICON_ID, 0); Drawable appIcon = null; int uid = -1; - final PackageManager pm = getActivity().getPackageManager(); + final PackageManager pm = activity.getPackageManager(); if (!TextUtils.isEmpty(pkg)) { try { @@ -481,17 +484,38 @@ public class PowerUsageDetail extends PowerUsageBase implements Button.OnClickLi // Use default icon } } else if (iconId != 0) { - appIcon = getActivity().getDrawable(iconId); + appIcon = activity.getDrawable(iconId); } if (appIcon == null) { - appIcon = getActivity().getPackageManager().getDefaultActivityIcon(); + appIcon = activity.getPackageManager().getDefaultActivityIcon(); } if (pkg == null && mPackages != null) { pkg = mPackages[0]; } - AppHeader.createAppHeader(this, appIcon, title, pkg, uid, - mDrainType != DrainType.APP ? android.R.color.white : 0); + if (!FeatureFactory.getFactory(activity) + .getDashboardFeatureProvider(activity).isEnabled()) { + AppHeader.createAppHeader(this, appIcon, title, pkg, uid, + mDrainType != DrainType.APP ? android.R.color.white : 0); + } else { + final PreferenceScreen screen = getPreferenceScreen(); + final Preference appHeaderPref = + findPreference(AppHeaderController.PREF_KEY_APP_HEADER); + if (appHeaderPref != null) { + return; + } + final Preference pref = FeatureFactory.getFactory(activity) + .getApplicationFeatureProvider(activity) + .newAppHeaderController(this, null /* appHeader */) + .setIcon(appIcon) + .setLabel(title) + .setPackageName(pkg) + .setUid(uid) + .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO, + AppHeaderController.ActionType.ACTION_NONE) + .done(getPrefContext()); + screen.addPreference(pref); + } } public void onClick(View v) { diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java index 7f9dc4e91a6..fb36c54e2a9 100644 --- a/src/com/android/settings/notification/AppNotificationSettings.java +++ b/src/com/android/settings/notification/AppNotificationSettings.java @@ -29,7 +29,6 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; import android.util.ArrayMap; import android.util.Log; -import android.view.View; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.AppHeader; @@ -37,7 +36,6 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.AppHeaderController; import com.android.settings.applications.AppInfoBase; -import com.android.settings.applications.LayoutPreference; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.notification.NotificationBackend.AppRow; import com.android.settings.overlay.FeatureFactory; @@ -134,20 +132,18 @@ public class AppNotificationSettings extends NotificationSettingsBase { updateDependents(mAppRow.appImportance); } if (mDashboardFeatureProvider.isEnabled()) { - final AppHeaderController appHeaderController = FeatureFactory.getFactory(activity) + final Preference pref = FeatureFactory.getFactory(activity) .getApplicationFeatureProvider(activity) - .newAppHeaderController(this /* fragment */, null /* appHeader */); - final View appHeader = appHeaderController.setIcon(mAppRow.icon) + .newAppHeaderController(this /* fragment */, null /* appHeader */) + .setIcon(mAppRow.icon) .setLabel(mAppRow.label) .setPackageName(mAppRow.pkg) .setUid(mAppRow.uid) .setAppNotifPrefIntent(mAppRow.settingsIntent) .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO, AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE) - .done(); - final Preference appHeaderPref = new LayoutPreference(getPrefContext(), appHeader); - appHeaderPref.setOrder(0); - getPreferenceScreen().addPreference(appHeaderPref); + .done(getPrefContext()); + getPreferenceScreen().addPreference(pref); } } diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java index ee075253883..a405de6fcd4 100644 --- a/src/com/android/settings/notification/ChannelNotificationSettings.java +++ b/src/com/android/settings/notification/ChannelNotificationSettings.java @@ -16,17 +16,6 @@ package com.android.settings.notification; -import com.android.internal.logging.MetricsProto.MetricsEvent; -import com.android.settings.AppHeader; -import com.android.settings.R; -import com.android.settings.RingtonePreference; -import com.android.settings.applications.AppHeaderController; -import com.android.settings.applications.LayoutPreference; -import com.android.settings.dashboard.DashboardFeatureProvider; -import com.android.settings.overlay.FeatureFactory; -import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.RestrictedSwitchPreference; - import android.app.Activity; import android.app.NotificationManager; import android.content.Intent; @@ -35,7 +24,16 @@ import android.os.Bundle; import android.provider.Settings; import android.service.notification.NotificationListenerService.Ranking; import android.support.v7.preference.Preference; -import android.view.View; + +import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.settings.AppHeader; +import com.android.settings.R; +import com.android.settings.RingtonePreference; +import com.android.settings.applications.AppHeaderController; +import com.android.settings.dashboard.DashboardFeatureProvider; +import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedSwitchPreference; public class ChannelNotificationSettings extends NotificationSettingsBase { protected static final String KEY_LIGHTS = "lights"; @@ -102,20 +100,18 @@ public class ChannelNotificationSettings extends NotificationSettingsBase { mMaxImportance); } if (mDashboardFeatureProvider.isEnabled()) { - final AppHeaderController appHeaderController = FeatureFactory.getFactory(activity) + final Preference pref = FeatureFactory.getFactory(activity) .getApplicationFeatureProvider(activity) - .newAppHeaderController(this /* fragment */, null /* appHeader */); - final View appHeader = appHeaderController.setIcon(mAppRow.icon) + .newAppHeaderController(this /* fragment */, null /* appHeader */) + .setIcon(mAppRow.icon) .setLabel(mAppRow.label) .setSummary(mChannel.getName()) .setPackageName(mAppRow.pkg) .setUid(mAppRow.uid) .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO, AppHeaderController.ActionType.ACTION_NONE) - .done(); - final Preference appHeaderPref = new LayoutPreference(getPrefContext(), appHeader); - appHeaderPref.setOrder(0); - getPreferenceScreen().addPreference(appHeaderPref); + .done(getPrefContext()); + getPreferenceScreen().addPreference(pref); } } diff --git a/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java index f5e678eb45b..229ba456d3f 100644 --- a/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java @@ -25,6 +25,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.os.UserHandle; +import android.support.v7.preference.Preference; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; @@ -86,6 +87,14 @@ public class AppHeaderControllerTest { assertThat(view).isNotNull(); } + @Test + public void testBuildView_withContext_shouldBuildPreference() { + mController = new AppHeaderController(mShadowContext, mFragment, null); + Preference preference = mController.done(mShadowContext); + + assertThat(preference instanceof LayoutPreference).isTrue(); + } + @Test public void testBuildView_constructedWithView_shouldReturnSameView() { View inputView = mLayoutInflater.inflate(R.layout.app_details, null /* root */);