Use new app header in more screens.

- This covers app data usage settings, power usage details
- Addded helper method on AppHeaderController to build the header as
  Preference because every fragment needs to do this anyway.

Bug: 32442716
Test: RunSettingsRoboTests

Change-Id: I6d38321b867154f8fb5194b993d118bcdbbfedc9
diff --git a/src/com/android/settings/applications/AppHeaderController.java b/src/com/android/settings/applications/AppHeaderController.java
index f3c85ea..40921b8 100644
--- a/src/com/android/settings/applications/AppHeaderController.java
+++ b/src/com/android/settings/applications/AppHeaderController.java
@@ -27,6 +27,7 @@
 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 @@
         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";
 
@@ -176,6 +178,17 @@
     }
 
     /**
+     * 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.
      */
     public View done() {
diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java
index c482892..910b618 100644
--- a/src/com/android/settings/applications/AppInfoWithHeader.java
+++ b/src/com/android/settings/applications/AppInfoWithHeader.java
@@ -20,7 +20,6 @@
 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 @@
                     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 @@
                     .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 23242c7..7dee5f4 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -31,8 +31,8 @@
 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.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.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 @@
     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 @@
     @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 524b663..7a0760a 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -133,7 +133,7 @@
                             : 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 @@
                             ? 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 afe186b..d8b0849 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.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.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 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 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 915cf74..b42547f 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -37,6 +37,7 @@
 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.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 @@
     }
 
     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 @@
                 // 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 7f9dc4e..fb36c54 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.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.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 @@
             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 ee07525..a405de6 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.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 @@
                     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 f5e678e..229ba45 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.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;
@@ -87,6 +88,14 @@
     }
 
     @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 */);
         mController = new AppHeaderController(mShadowContext, mFragment, inputView);