Layout refinement for app lists

Make all app lists (or at least all current app lists) use the same
base layout for icon, label, and sizing/padding.  This way they
should look the same.

Bug: 21727125
Bug: 21726922
Bug: 21853632
Change-Id: I3cffadb9e7b5184d4209deacd4ea70ec1d4f71b4
diff --git a/src/com/android/settings/AppPicker.java b/src/com/android/settings/AppPicker.java
index 2447bcb..04e48ff 100644
--- a/src/com/android/settings/AppPicker.java
+++ b/src/com/android/settings/AppPicker.java
@@ -164,7 +164,6 @@
                 holder.summary.setText("");
             }
             holder.disabled.setVisibility(View.GONE);
-            holder.checkBox.setVisibility(View.GONE);
             return convertView;
         }
     }
diff --git a/src/com/android/settings/AppProgressPreference.java b/src/com/android/settings/AppProgressPreference.java
new file mode 100644
index 0000000..cd157d1
--- /dev/null
+++ b/src/com/android/settings/AppProgressPreference.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ProgressBar;
+
+public class AppProgressPreference extends TintablePreference {
+
+    private int mProgress;
+
+    public AppProgressPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setLayoutResource(R.layout.preference_app);
+        setWidgetLayoutResource(R.layout.widget_progress_bar);
+    }
+
+    public void setProgress(int amount) {
+        mProgress = amount;
+        notifyChanged();
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+
+        final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
+        progress.setProgress(mProgress);
+    }
+}
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 744ed3f..a4ee9616 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -1882,10 +1882,10 @@
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             final AppItem item = mItems.get(position);
+            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
             if (getItemViewType(position) == 1) {
                 if (convertView == null) {
-                    convertView = Utils.inflateCategoryHeader(LayoutInflater.from(
-                            parent.getContext()), parent);
+                    convertView = Utils.inflateCategoryHeader(inflater, parent);
                 }
 
                 final TextView title = (TextView) convertView.findViewById(android.R.id.title);
@@ -1893,8 +1893,9 @@
 
             } else {
                 if (convertView == null) {
-                    convertView = LayoutInflater.from(parent.getContext()).inflate(
-                            R.layout.data_usage_item, parent, false);
+                    convertView = inflater.inflate(R.layout.data_usage_item, parent, false);
+                    inflater.inflate(R.layout.widget_progress_bar,
+                            (ViewGroup) convertView.findViewById(android.R.id.widget_frame));
 
                     if (mInsetSide > 0) {
                         convertView.setPaddingRelative(mInsetSide, 0, mInsetSide, 0);
@@ -1903,7 +1904,7 @@
 
                 final Context context = parent.getContext();
 
-                final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
+                final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
                 final ProgressBar progress = (ProgressBar) convertView.findViewById(
                         android.R.id.progress);
 
@@ -1911,10 +1912,10 @@
                 UidDetailTask.bindView(mProvider, item, convertView);
 
                 if (item.restricted && item.total <= 0) {
-                    text1.setText(R.string.data_usage_app_restricted);
+                    summary.setText(R.string.data_usage_app_restricted);
                     progress.setVisibility(View.GONE);
                 } else {
-                    text1.setText(Formatter.formatFileSize(context, item.total));
+                    summary.setText(Formatter.formatFileSize(context, item.total));
                     progress.setVisibility(View.VISIBLE);
                 }
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index f376644..226ea0e 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -73,6 +73,7 @@
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.applications.ManageAssist;
+import com.android.settings.applications.ProcessStatsSummary;
 import com.android.settings.applications.ProcessStatsUi;
 import com.android.settings.applications.UsageAccessDetails;
 import com.android.settings.bluetooth.BluetoothSettings;
@@ -346,6 +347,7 @@
             ZenModeExternalRuleSettings.class.getName(),
             ProcessStatsUi.class.getName(),
             PowerUsageDetail.class.getName(),
+            ProcessStatsSummary.class.getName(),
     };
 
 
diff --git a/src/com/android/settings/applications/AppOpsDetails.java b/src/com/android/settings/applications/AppOpsDetails.java
index 0643b56..a8320b1 100644
--- a/src/com/android/settings/applications/AppOpsDetails.java
+++ b/src/com/android/settings/applications/AppOpsDetails.java
@@ -27,6 +27,7 @@
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
 import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -57,29 +58,15 @@
     private PackageInfo mPackageInfo;
     private LayoutInflater mInflater;
     private View mRootView;
-    private TextView mAppVersion;
     private LinearLayout mOperationsSection;
 
     // Utility method to set application label and icon.
     private void setAppLabelAndIcon(PackageInfo pkgInfo) {
         final View appSnippet = mRootView.findViewById(R.id.app_snippet);
-        appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0, appSnippet.getPaddingBottom());
-
-        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
-        icon.setImageDrawable(mPm.getApplicationIcon(pkgInfo.applicationInfo));
-        // Set application name.
-        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
-        label.setText(mPm.getApplicationLabel(pkgInfo.applicationInfo));
-        // Version number of application
-        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_summary);
-
-        if (pkgInfo.versionName != null) {
-            mAppVersion.setVisibility(View.VISIBLE);
-            mAppVersion.setText(getActivity().getString(R.string.version_text,
-                    String.valueOf(pkgInfo.versionName)));
-        } else {
-            mAppVersion.setVisibility(View.INVISIBLE);
-        }
+        CharSequence label = mPm.getApplicationLabel(pkgInfo.applicationInfo);
+        Drawable icon = mPm.getApplicationIcon(pkgInfo.applicationInfo);
+        InstalledAppDetails.setupAppSnippet(appSnippet, label, icon,
+                pkgInfo != null ? pkgInfo.versionName : null);
     }
 
     private String retrieveAppEntry() {
diff --git a/src/com/android/settings/applications/AppViewHolder.java b/src/com/android/settings/applications/AppViewHolder.java
index f58cf06..9771427 100644
--- a/src/com/android/settings/applications/AppViewHolder.java
+++ b/src/com/android/settings/applications/AppViewHolder.java
@@ -19,6 +19,7 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.CheckBox;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -34,21 +35,21 @@
     public ImageView appIcon;
     public TextView summary;
     public TextView disabled;
-    public CheckBox checkBox;
 
     static public AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView) {
         if (convertView == null) {
-            convertView = inflater.inflate(R.layout.manage_applications_item, null);
+            convertView = inflater.inflate(R.layout.preference_app, null);
+            inflater.inflate(R.layout.widget_text_views,
+                    (ViewGroup) convertView.findViewById(android.R.id.widget_frame));
 
             // Creates a ViewHolder and store references to the two children views
             // we want to bind data to.
             AppViewHolder holder = new AppViewHolder();
             holder.rootView = convertView;
-            holder.appName = (TextView) convertView.findViewById(R.id.app_name);
-            holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
-            holder.summary = (TextView) convertView.findViewById(R.id.app_summary);
-            holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
-            holder.checkBox = (CheckBox) convertView.findViewById(R.id.app_on_sdcard);
+            holder.appName = (TextView) convertView.findViewById(android.R.id.title);
+            holder.appIcon = (ImageView) convertView.findViewById(android.R.id.icon);
+            holder.summary = (TextView) convertView.findViewById(R.id.widget_text1);
+            holder.disabled = (TextView) convertView.findViewById(R.id.widget_text2);
             convertView.setTag(holder);
             return holder;
         } else {
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 9649d27..b344644 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -36,6 +36,7 @@
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.icu.text.ListFormatter;
+import android.graphics.drawable.Drawable;
 import android.net.INetworkStatsService;
 import android.net.INetworkStatsSession;
 import android.net.NetworkTemplate;
@@ -49,13 +50,16 @@
 import android.os.UserHandle;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
+import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -130,7 +134,6 @@
     private LayoutPreference mHeader;
     private Button mUninstallButton;
     private boolean mUpdatedSysApp = false;
-    private TextView mAppVersion;
     private Button mForceStopButton;
     private Preference mNotificationPreference;
     private Preference mStoragePreference;
@@ -424,25 +427,9 @@
     // Utility method to set application label and icon.
     private void setAppLabelAndIcon(PackageInfo pkgInfo) {
         final View appSnippet = mHeader.findViewById(R.id.app_snippet);
-        appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0,
-                appSnippet.getPaddingBottom());
-
-        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
         mState.ensureIcon(mAppEntry);
-        icon.setImageDrawable(mAppEntry.icon);
-        // Set application name.
-        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
-        label.setText(mAppEntry.label);
-        // Version number of application
-        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_summary);
-
-        if (pkgInfo != null && pkgInfo.versionName != null) {
-            mAppVersion.setVisibility(View.VISIBLE);
-            mAppVersion.setText(getActivity().getString(R.string.version_text,
-                    String.valueOf(pkgInfo.versionName)));
-        } else {
-            mAppVersion.setVisibility(View.INVISIBLE);
-        }
+        setupAppSnippet(appSnippet, mAppEntry.label, mAppEntry.icon,
+                pkgInfo != null ? pkgInfo.versionName : null);
     }
 
     private boolean signaturesMatch(String pkg1, String pkg2) {
@@ -757,6 +744,28 @@
         return true;
     }
 
+    public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon,
+            CharSequence versionName) {
+        LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views,
+                (ViewGroup) appSnippet.findViewById(android.R.id.widget_frame));
+
+        ImageView iconView = (ImageView) appSnippet.findViewById(android.R.id.icon);
+        iconView.setImageDrawable(icon);
+        // Set application name.
+        TextView labelView = (TextView) appSnippet.findViewById(android.R.id.title);
+        labelView.setText(label);
+        // Version number of application
+        TextView appVersion = (TextView) appSnippet.findViewById(R.id.widget_text1);
+
+        if (!TextUtils.isEmpty(versionName)) {
+            appVersion.setVisibility(View.VISIBLE);
+            appVersion.setText(appSnippet.getContext().getString(R.string.version_text,
+                    String.valueOf(versionName)));
+        } else {
+            appVersion.setVisibility(View.INVISIBLE);
+        }
+    }
+
     private static NetworkTemplate getTemplate(Context context) {
         if (DataUsageSummary.hasReadyMobileRadio(context)) {
             return NetworkTemplate.buildTemplateMobileWildcard();
diff --git a/src/com/android/settings/applications/LayoutPreference.java b/src/com/android/settings/applications/LayoutPreference.java
index 75387d3..f0c7e4a 100644
--- a/src/com/android/settings/applications/LayoutPreference.java
+++ b/src/com/android/settings/applications/LayoutPreference.java
@@ -58,6 +58,11 @@
         return mRootView;
     }
 
+    @Override
+    protected void onBindView(View view) {
+        // Do nothing.
+    }
+
     public View findViewById(int id) {
         return mRootView.findViewById(id);
     }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 8281885..11f35c8 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -984,7 +984,6 @@
                 } else {
                     holder.disabled.setVisibility(View.GONE);
                 }
-                holder.checkBox.setVisibility(View.GONE);
             }
             mActive.remove(convertView);
             mActive.add(convertView);
diff --git a/src/com/android/settings/applications/ProcessStatsMemDetail.java b/src/com/android/settings/applications/ProcessStatsMemDetail.java
index 7ae2824..6a4f470 100644
--- a/src/com/android/settings/applications/ProcessStatsMemDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsMemDetail.java
@@ -105,8 +105,9 @@
     private void addDetailsItem(ViewGroup parent, CharSequence title,
             float level, CharSequence value) {
         LayoutInflater inflater = getActivity().getLayoutInflater();
-        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.app_percentage_item,
-                null);
+        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.app_item, null);
+        inflater.inflate(R.layout.widget_progress_bar,
+                (ViewGroup) item.findViewById(android.R.id.widget_frame));
         parent.addView(item);
         item.findViewById(android.R.id.icon).setVisibility(View.GONE);
         TextView titleView = (TextView) item.findViewById(android.R.id.title);
diff --git a/src/com/android/settings/applications/ProcessStatsPreference.java b/src/com/android/settings/applications/ProcessStatsPreference.java
index 48c6a9f..996ed15 100644
--- a/src/com/android/settings/applications/ProcessStatsPreference.java
+++ b/src/com/android/settings/applications/ProcessStatsPreference.java
@@ -19,40 +19,17 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.ColorDrawable;
-import android.preference.Preference;
 import android.text.TextUtils;
 import android.text.format.Formatter;
-import android.util.AttributeSet;
-import android.view.View;
 
-import com.android.settings.R;
+import com.android.settings.AppProgressPreference;
 
-public class ProcessStatsPreference extends Preference {
+public class ProcessStatsPreference extends AppProgressPreference {
 
     private ProcStatsPackageEntry mEntry;
-    private final int mColor;
-    private final int mRemainingColor;
-    private float mRatio;
-    private float mRemainingRatio;
 
     public ProcessStatsPreference(Context context) {
-        this(context, null);
-    }
-
-    public ProcessStatsPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ProcessStatsPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public ProcessStatsPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        setLayoutResource(R.layout.app_item_linear_color);
-        mColor = context.getColor(R.color.memory_max_use);
-        mRemainingColor = context.getColor(R.color.memory_remaining);
+        super(context, null);
     }
 
     public void init(ProcStatsPackageEntry entry, PackageManager pm, double maxMemory,
@@ -68,20 +45,10 @@
         double amount = avg ? (statsForeground ? entry.mRunWeight : entry.mBgWeight) * weightToRam
                 : (statsForeground ? entry.mMaxRunMem : entry.mMaxBgMem) * totalScale * 1024;
         setSummary(Formatter.formatShortFileSize(getContext(), (long) amount));
-        mRatio = (float) (amount / maxMemory);
-        mRemainingRatio = 1 - mRatio;
+        setProgress((int) (100 * amount / maxMemory));
     }
 
     public ProcStatsPackageEntry getEntry() {
         return mEntry;
     }
-
-    @Override
-    protected void onBindView(View view) {
-        super.onBindView(view);
-
-        LinearColorBar linearColorBar = (LinearColorBar) view.findViewById(R.id.linear_color_bar);
-        linearColorBar.setColors(mColor, mColor, mRemainingColor);
-        linearColorBar.setRatios(mRatio, 0, mRemainingRatio);
-    }
 }
diff --git a/src/com/android/settings/fuelgauge/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
index e80f492..0be73d8 100644
--- a/src/com/android/settings/fuelgauge/PowerGaugePreference.java
+++ b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
@@ -19,38 +19,31 @@
 import android.content.Context;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.preference.Preference;
 import android.view.View;
-import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import com.android.settings.R;
-import com.android.settings.TintablePreference;
+import com.android.settings.AppProgressPreference;
 import com.android.settings.Utils;
 
 /**
  * Custom preference for displaying power consumption as a bar and an icon on
  * the left for the subsystem/app type.
  */
-public class PowerGaugePreference extends TintablePreference {
+public class PowerGaugePreference extends AppProgressPreference {
     private BatteryEntry mInfo;
-    private int mProgress;
-    private CharSequence mProgressText;
     private final CharSequence mContentDescription;
 
     public PowerGaugePreference(Context context, Drawable icon, CharSequence contentDescription,
             BatteryEntry info) {
         super(context, null);
-        setLayoutResource(R.layout.preference_app_percentage);
         setIcon(icon != null ? icon : new ColorDrawable(0));
         mInfo = info;
         mContentDescription = contentDescription;
     }
 
     public void setPercent(double percentOfMax, double percentOfTotal) {
-        mProgress = (int) Math.ceil(percentOfMax);
-        mProgressText = Utils.formatPercentage((int) (percentOfTotal + 0.5));
-        notifyChanged();
+        setProgress((int) Math.ceil(percentOfMax));
+        setSummary(Utils.formatPercentage((int) (percentOfTotal + 0.5)));
     }
 
     BatteryEntry getInfo() {
@@ -61,12 +54,6 @@
     protected void onBindView(View view) {
         super.onBindView(view);
 
-        final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
-        progress.setProgress(mProgress);
-
-        final TextView text1 = (TextView) view.findViewById(android.R.id.text1);
-        text1.setText(mProgressText);
-
         if (mContentDescription != null) {
             final TextView titleView = (TextView) view.findViewById(android.R.id.title);
             titleView.setContentDescription(mContentDescription);