Fix app headers in settings

Use SettingsPreferenceFragment's method for pinned headers where
possible, and add a frame within the fragment for them to live in
otherwise so that this view doesn't end up on the activity.

Bug: 20886475
Change-Id: I985eb1497744ea50bfabed862e5088eb89df5b61
diff --git a/src/com/android/settings/AppHeader.java b/src/com/android/settings/AppHeader.java
index 2f3678b..71c2255 100644
--- a/src/com/android/settings/AppHeader.java
+++ b/src/com/android/settings/AppHeader.java
@@ -28,18 +28,27 @@
 
 public class AppHeader {
 
-    public static void createAppHeader(final Activity activity, Drawable icon, CharSequence label,
-            final Intent settingsIntent) {
-        createAppHeader(activity, icon, label, settingsIntent, 0);
+    public static void createAppHeader(SettingsPreferenceFragment fragment, Drawable icon,
+            CharSequence label, final Intent settingsIntent) {
+        createAppHeader(fragment, icon, label, settingsIntent, 0);
     }
 
-    public static void createAppHeader(final Activity activity, Drawable icon, CharSequence label,
-            final Intent settingsIntent, int tintColorRes) {
-        final View content = activity.findViewById(R.id.main_content);
-        final ViewGroup contentParent = (ViewGroup) content.getParent();
+    public static void createAppHeader(Activity activity, Drawable icon, CharSequence label,
+            final Intent settingsIntent, ViewGroup pinnedHeader) {
         final View bar = activity.getLayoutInflater().inflate(R.layout.app_header,
-                contentParent, false);
+                pinnedHeader, false);
+        setupHeaderView(activity, icon, label, settingsIntent, 0, bar);
+        pinnedHeader.addView(bar);
+    }
 
+    public static void createAppHeader(SettingsPreferenceFragment fragment, Drawable icon,
+            CharSequence label, Intent settingsIntent, int tintColorRes) {
+        View bar = fragment.setPinnedHeaderView(R.layout.app_header);
+        setupHeaderView(fragment.getActivity(), icon, label, settingsIntent, tintColorRes, bar);
+    }
+
+    private static View setupHeaderView(final Activity activity, Drawable icon, CharSequence label,
+            final Intent settingsIntent, int tintColorRes, View bar) {
         final ImageView appIcon = (ImageView) bar.findViewById(R.id.app_icon);
         appIcon.setImageDrawable(icon);
         if (tintColorRes != 0) {
@@ -61,7 +70,8 @@
                 }
             });
         }
-        contentParent.addView(bar, 0);
+
+        return bar;
     }
 
 }
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 27a486c..7eec3df 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -112,6 +112,7 @@
 import android.widget.ArrayAdapter;
 import android.widget.BaseAdapter;
 import android.widget.Button;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListView;
@@ -120,12 +121,12 @@
 import android.widget.Spinner;
 import android.widget.Switch;
 import android.widget.TabHost;
-import android.widget.Toast;
 import android.widget.TabHost.OnTabChangeListener;
 import android.widget.TabHost.TabContentFactory;
 import android.widget.TabHost.TabSpec;
 import android.widget.TabWidget;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.telephony.PhoneConstants;
@@ -464,12 +465,12 @@
         mListView.setOnItemClickListener(mListListener);
         mListView.setAdapter(mAdapter);
 
-        showRequestedAppIfNeeded();
+        showRequestedAppIfNeeded(view);
 
         return view;
     }
 
-    private void showRequestedAppIfNeeded() {
+    private void showRequestedAppIfNeeded(View rootView) {
         if (mShowAppImmediatePkg == null) {
             return;
         }
@@ -482,7 +483,8 @@
             final UidDetail detail = mUidDetailProvider.getUidDetail(app.key, true);
             // When we are going straight to an app then we are coming from App Info and want
             // a header at the top.
-            AppHeader.createAppHeader(getActivity(), detail.icon, detail.label, null);
+            FrameLayout pinnedHeader = (FrameLayout) rootView.findViewById(R.id.pinned_header);
+            AppHeader.createAppHeader(getActivity(), detail.icon, detail.label, null, pinnedHeader);
             AppDetailsFragment.show(DataUsageSummary.this, app, detail.label, false);
         } catch (NameNotFoundException e) {
             Log.w(TAG, "Could not find " + mShowAppImmediatePkg, e);
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 2d402e5..e42f246 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -37,12 +37,13 @@
 
 import com.android.settings.InstrumentedPreferenceFragment;
 import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 
 import java.util.ArrayList;
 
-public abstract class AppInfoBase extends InstrumentedPreferenceFragment
+public abstract class AppInfoBase extends SettingsPreferenceFragment
         implements ApplicationsState.Callbacks {
 
     public static final String ARG_PACKAGE_NAME = "package";
diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java
index f7546f2..f8feaf1 100644
--- a/src/com/android/settings/applications/AppInfoWithHeader.java
+++ b/src/com/android/settings/applications/AppInfoWithHeader.java
@@ -34,7 +34,7 @@
         }
         mCreated = true;
         if (mPackageInfo == null) return;
-        AppHeader.createAppHeader(getActivity(), mPackageInfo.applicationInfo.loadIcon(mPm),
-                mPackageInfo.applicationInfo.loadLabel(mPm), null);
+        AppHeader.createAppHeader(this, mPackageInfo.applicationInfo.loadIcon(mPm),
+                mPackageInfo.applicationInfo.loadLabel(mPm), null, 0);
     }
 }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index b55cc44..3107efd 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -45,6 +45,7 @@
 import android.widget.BaseAdapter;
 import android.widget.Filter;
 import android.widget.Filterable;
+import android.widget.FrameLayout;
 import android.widget.ListView;
 import android.widget.Spinner;
 
@@ -298,15 +299,14 @@
 
     private void createHeader() {
         Activity activity = getActivity();
-        View content = activity.findViewById(R.id.main_content);
-        ViewGroup contentParent = (ViewGroup) content.getParent();
+        FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header);
         mSpinnerHeader = (ViewGroup) activity.getLayoutInflater()
-                .inflate(R.layout.apps_filter_spinner, contentParent, false);
+                .inflate(R.layout.apps_filter_spinner, pinnedHeader, false);
         mFilterSpinner = (Spinner) mSpinnerHeader.findViewById(R.id.filter_spinner);
         mFilterAdapter = new FilterSpinnerAdapter(this);
         mFilterSpinner.setAdapter(mFilterAdapter);
         mFilterSpinner.setOnItemSelectedListener(this);
-        contentParent.addView(mSpinnerHeader, 0);
+        pinnedHeader.addView(mSpinnerHeader, 0);
 
         mFilterAdapter.enableFilter(getDefaultFilter());
         if (mListType == LIST_TYPE_MAIN || mListType == LIST_TYPE_NOTIFICATION) {
@@ -333,7 +333,8 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         if (mListType == LIST_TYPE_STORAGE) {
-            AppHeader.createAppHeader(getActivity(), null, mVolumeName, null);
+            FrameLayout pinnedHeader = (FrameLayout) mRootView.findViewById(R.id.pinned_header);
+            AppHeader.createAppHeader(getActivity(), null, mVolumeName, null, pinnedHeader);
         }
     }
 
diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java
index 191e7e9..55538bc 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -112,7 +112,7 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        AppHeader.createAppHeader(getActivity(),
+        AppHeader.createAppHeader(this,
                 mApp.mUiTargetApp != null ? mApp.mUiTargetApp.loadIcon(mPm) : new ColorDrawable(0),
                 mApp.mUiLabel, null);
     }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageDetail.java b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
index 4aa935a..bac8202 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageDetail.java
@@ -464,7 +464,7 @@
             appIcon = getActivity().getPackageManager().getDefaultActivityIcon();
         }
 
-        AppHeader.createAppHeader(getActivity(), appIcon, title, null,
+        AppHeader.createAppHeader(this, appIcon, title, null,
                 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 883975a..28245c8 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -84,7 +84,7 @@
         }
         mCreated = true;
         if (mAppRow == null) return;
-        AppHeader.createAppHeader(getActivity(), mAppRow.icon, mAppRow.label,
+        AppHeader.createAppHeader(this, mAppRow.icon, mAppRow.label,
                 mAppRow.settingsIntent);
     }