diff --git a/res/layout/app_header.xml b/res/layout/app_header.xml
deleted file mode 100644
index 2d8a099be75..00000000000
--- a/res/layout/app_header.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/layout/app_item.xml b/res/layout/app_item.xml
deleted file mode 100644
index d53afc965e8..00000000000
--- a/res/layout/app_item.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/layout/data_usage_item.xml b/res/layout/data_usage_item.xml
deleted file mode 100644
index 5e931f92893..00000000000
--- a/res/layout/data_usage_item.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/res/layout/preference_app.xml b/res/layout/preference_app.xml
index 526d5af5031..9ed5c542275 100644
--- a/res/layout/preference_app.xml
+++ b/res/layout/preference_app.xml
@@ -13,13 +13,74 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/com/android/settings/applications/RecentAppsPreferenceController.java b/src/com/android/settings/applications/RecentAppsPreferenceController.java
index b6ae1ee54fc..205fedb1327 100644
--- a/src/com/android/settings/applications/RecentAppsPreferenceController.java
+++ b/src/com/android/settings/applications/RecentAppsPreferenceController.java
@@ -231,6 +231,7 @@ public class RecentAppsPreferenceController extends AbstractPreferenceController
Preference pref = appPreferences.remove(pkgName);
if (pref == null) {
pref = new Preference(prefContext);
+ pref.setLayoutResource(R.layout.preference_app);
rebindPref = false;
}
pref.setKey(pkgName);
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index 9ac2167bfcb..e968b1c38ab 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -22,6 +22,7 @@ import android.graphics.drawable.Drawable;
import android.support.annotation.StringRes;
import android.support.annotation.VisibleForTesting;
import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -38,33 +39,39 @@ public class ApplicationViewHolder extends RecyclerView.ViewHolder {
private final TextView mAppName;
private final ImageView mAppIcon;
+ private final boolean mKeepStableHeight;
+
+ @VisibleForTesting
+ View mSummaryContainer;
@VisibleForTesting
final TextView mSummary;
@VisibleForTesting
final TextView mDisabled;
- ApplicationViewHolder(View itemView) {
+
+ ApplicationViewHolder(View itemView, boolean keepStableHeight) {
super(itemView);
mAppName = itemView.findViewById(android.R.id.title);
mAppIcon = itemView.findViewById(android.R.id.icon);
- mSummary = itemView.findViewById(R.id.widget_text1);
- mDisabled = itemView.findViewById(R.id.widget_text2);
+ mSummaryContainer = itemView.findViewById(R.id.summary_container);
+ mSummary = itemView.findViewById(android.R.id.summary);
+ mDisabled = itemView.findViewById(R.id.appendix);
+ mKeepStableHeight = keepStableHeight;
}
- static View newView(LayoutInflater inflater, ViewGroup parent) {
- final View root = LayoutInflater.from(parent.getContext())
+ static View newView(ViewGroup parent) {
+ return LayoutInflater.from(parent.getContext())
.inflate(R.layout.preference_app, parent, false);
- inflater.inflate(R.layout.widget_text_views,
- root.findViewById(android.R.id.widget_frame));
- return root;
}
void setSummary(CharSequence summary) {
mSummary.setText(summary);
+ updateSummaryContainer();
}
void setSummary(@StringRes int summary) {
mSummary.setText(summary);
+ updateSummaryContainer();
}
void setEnabled(boolean isEnabled) {
@@ -78,6 +85,10 @@ public class ApplicationViewHolder extends RecyclerView.ViewHolder {
mAppName.setText(title);
}
+ void setIcon(int drawableRes) {
+ mAppIcon.setImageResource(drawableRes);
+ }
+
void setIcon(Drawable icon) {
if (icon == null) {
return;
@@ -96,6 +107,17 @@ public class ApplicationViewHolder extends RecyclerView.ViewHolder {
} else {
mDisabled.setVisibility(View.GONE);
}
+ updateSummaryContainer();
+ }
+
+ void updateSummaryContainer() {
+ if (mKeepStableHeight) {
+ mSummaryContainer.setVisibility(View.VISIBLE);
+ return;
+ }
+ final boolean hasContent =
+ !TextUtils.isEmpty(mDisabled.getText()) || !TextUtils.isEmpty(mSummary.getText());
+ mSummaryContainer.setVisibility(hasContent ? View.VISIBLE : View.GONE);
}
void updateSizeText(AppEntry entry, CharSequence invalidSizeStr, int whichSize) {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 33762e4e480..7dc8951ac07 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -412,20 +412,6 @@ public class ManageApplications extends InstrumentedPreferenceFragment
return null;
}
- private boolean isFastScrollEnabled() {
- switch (mListType) {
- case LIST_TYPE_MAIN:
- case LIST_TYPE_NOTIFICATION:
- case LIST_TYPE_STORAGE:
- case LIST_TYPE_GAMES:
- case LIST_TYPE_MOVIES:
- case LIST_TYPE_PHOTOGRAPHY:
- return mSortOrder == R.id.sort_order_alpha;
- default:
- return false;
- }
- }
-
@Override
public int getMetricsCategory() {
switch (mListType) {
@@ -924,9 +910,9 @@ public class ManageApplications extends InstrumentedPreferenceFragment
@Override
public ApplicationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- final View view = ApplicationViewHolder.newView(
- LayoutInflater.from(parent.getContext()), parent);
- return new ApplicationViewHolder(view);
+ final View view = ApplicationViewHolder.newView(parent);
+ return new ApplicationViewHolder(view,
+ shouldUseStableItemHeight(mManageApplications.mListType));
}
@Override
@@ -994,7 +980,21 @@ public class ManageApplications extends InstrumentedPreferenceFragment
});
}
- static private boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) {
+ @VisibleForTesting
+ static boolean shouldUseStableItemHeight(int listType) {
+ switch (listType) {
+ case LIST_TYPE_NOTIFICATION:
+ // Most entries in notification type has no summary. Don't use stable height
+ // so height is short for most entries.
+ return false;
+ default:
+ // Other types have non-empty summary, so keep the height as we expect summary
+ // to fill in.
+ return true;
+ }
+ }
+
+ private static boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) {
if (info1 == null || info2 == null) {
return false;
}
diff --git a/src/com/android/settings/applications/manageapplications/MusicViewHolderController.java b/src/com/android/settings/applications/manageapplications/MusicViewHolderController.java
index 2a2ac3b85e1..14d08aac936 100644
--- a/src/com/android/settings/applications/manageapplications/MusicViewHolderController.java
+++ b/src/com/android/settings/applications/manageapplications/MusicViewHolderController.java
@@ -19,7 +19,6 @@ package com.android.settings.applications.manageapplications;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
-import android.graphics.drawable.InsetDrawable;
import android.os.UserHandle;
import android.provider.DocumentsContract;
import android.support.annotation.WorkerThread;
@@ -39,7 +38,6 @@ public class MusicViewHolderController implements FileViewHolderController {
private static final String TAG = "MusicViewHolderCtrl";
private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
- private static final int INSET_SIZE = 24; // dp
private Context mContext;
private StorageStatsSource mSource;
@@ -73,8 +71,7 @@ public class MusicViewHolderController implements FileViewHolderController {
@Override
public void setupView(ApplicationViewHolder holder) {
- holder.setIcon(
- new InsetDrawable(mContext.getDrawable(R.drawable.ic_headset_24dp), INSET_SIZE));
+ holder.setIcon(R.drawable.ic_headset_24dp);
holder.setTitle(mContext.getText(R.string.audio_files_title));
holder.setSummary(Formatter.formatFileSize(mContext, mMusicSize));
}
diff --git a/src/com/android/settings/applications/manageapplications/PhotosViewHolderController.java b/src/com/android/settings/applications/manageapplications/PhotosViewHolderController.java
index fafa875a31c..73330e987f7 100644
--- a/src/com/android/settings/applications/manageapplications/PhotosViewHolderController.java
+++ b/src/com/android/settings/applications/manageapplications/PhotosViewHolderController.java
@@ -19,7 +19,6 @@ package com.android.settings.applications.manageapplications;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
-import android.graphics.drawable.InsetDrawable;
import android.os.UserHandle;
import android.support.annotation.WorkerThread;
import android.text.format.Formatter;
@@ -36,7 +35,6 @@ public class PhotosViewHolderController implements FileViewHolderController {
private static final String TAG = "PhotosViewHolderCtrl";
private static final String IMAGE_MIME_TYPE = "image/*";
- private static final int INSET_SIZE = 24; // dp
private Context mContext;
private StorageStatsSource mSource;
@@ -72,8 +70,7 @@ public class PhotosViewHolderController implements FileViewHolderController {
@Override
public void setupView(ApplicationViewHolder holder) {
- holder.setIcon(
- new InsetDrawable(mContext.getDrawable(R.drawable.ic_photo_library), INSET_SIZE));
+ holder.setIcon(R.drawable.ic_photo_library);
holder.setTitle(mContext.getText(R.string.storage_detail_images));
holder.setSummary(Formatter.formatFileSize(mContext, mFilesSize));
}
diff --git a/src/com/android/settings/datausage/AppDataUsagePreference.java b/src/com/android/settings/datausage/AppDataUsagePreference.java
index 35f1fe2f2fa..14b057d4dfe 100644
--- a/src/com/android/settings/datausage/AppDataUsagePreference.java
+++ b/src/com/android/settings/datausage/AppDataUsagePreference.java
@@ -38,7 +38,7 @@ public class AppDataUsagePreference extends Preference {
super(context);
mItem = item;
mPercent = percent;
- setLayoutResource(R.layout.data_usage_item);
+ setLayoutResource(R.layout.preference_app);
setWidgetLayoutResource(R.layout.widget_progress_bar);
if (item.restricted && item.total <= 0) {
diff --git a/src/com/android/settings/development/AppViewHolder.java b/src/com/android/settings/development/AppViewHolder.java
index 7a90bcf153c..1082efe38ce 100644
--- a/src/com/android/settings/development/AppViewHolder.java
+++ b/src/com/android/settings/development/AppViewHolder.java
@@ -18,7 +18,6 @@ package com.android.settings.development;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
@@ -37,23 +36,21 @@ public class AppViewHolder {
static public AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView) {
if (convertView == 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(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);
+ holder.appName = convertView.findViewById(android.R.id.title);
+ holder.appIcon = convertView.findViewById(android.R.id.icon);
+ holder.summary = convertView.findViewById(android.R.id.summary);
+ holder.disabled = convertView.findViewById(R.id.appendix);
convertView.setTag(holder);
return holder;
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
- return (AppViewHolder)convertView.getTag();
+ return (AppViewHolder) convertView.getTag();
}
}
}
\ No newline at end of file
diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
index e44634063a7..53bb7d99966 100644
--- a/src/com/android/settings/widget/RadioButtonPickerFragment.java
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -22,6 +22,7 @@ import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
+import android.support.annotation.XmlRes;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
@@ -133,8 +134,13 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr
final String systemDefaultKey = getSystemDefaultKey();
final PreferenceScreen screen = getPreferenceScreen();
screen.removeAll();
+
+ final int customLayoutResId = getRadioButtomPreferenceCustomLayoutResId();
if (shouldShowItemNone()) {
final RadioButtonPreference nonePref = new RadioButtonPreference(getPrefContext());
+ if (customLayoutResId > 0) {
+ nonePref.setLayoutResource(customLayoutResId);
+ }
nonePref.setIcon(R.drawable.ic_remove_circle);
nonePref.setTitle(R.string.app_list_preference_none);
nonePref.setChecked(TextUtils.isEmpty(defaultKey));
@@ -144,6 +150,9 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr
if (candidateList != null) {
for (CandidateInfo info : candidateList) {
RadioButtonPreference pref = new RadioButtonPreference(getPrefContext());
+ if (customLayoutResId > 0) {
+ pref.setLayoutResource(customLayoutResId);
+ }
bindPreference(pref, info.getKey(), info, defaultKey);
bindPreferenceExtra(pref, info.getKey(), info, defaultKey, systemDefaultKey);
screen.addPreference(pref);
@@ -206,6 +215,14 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr
return null;
}
+ /**
+ * Provides a custom layout for each candidate row.
+ */
+ @XmlRes
+ protected int getRadioButtomPreferenceCustomLayoutResId() {
+ return 0;
+ }
+
public static abstract class CandidateInfo {
public final boolean enabled;
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
index cf2403b5b3d..c32b262719d 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
@@ -22,7 +22,6 @@ import static org.mockito.Mockito.mock;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -48,9 +47,8 @@ public class ApplicationViewHolderTest {
@Before
public void seUp() {
mContext = RuntimeEnvironment.application;
- mView = ApplicationViewHolder.newView(LayoutInflater.from(mContext),
- new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(mView);
+ mView = ApplicationViewHolder.newView(new FrameLayout(mContext));
+ mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
}
@Test
@@ -71,6 +69,10 @@ public class ApplicationViewHolderTest {
mHolder.setSummary(R.string.disabled);
assertThat(mHolder.mSummary.getText()).isEqualTo(mContext.getText(R.string.disabled));
+ assertThat(mHolder.mSummaryContainer.getVisibility()).isEqualTo(View.VISIBLE);
+
+ mHolder.setSummary(null);
+ assertThat(mHolder.mSummaryContainer.getVisibility()).isEqualTo(View.GONE);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index 9eb36ef8d30..a0b014693c4 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -18,6 +18,10 @@ package com.android.settings.applications.manageapplications;
import static com.android.settings.applications.manageapplications.AppFilterRegistry
.FILTER_APPS_ALL;
+import static com.android.settings.applications.manageapplications.ManageApplications
+ .LIST_TYPE_MAIN;
+import static com.android.settings.applications.manageapplications.ManageApplications
+ .LIST_TYPE_NOTIFICATION;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
@@ -102,7 +106,7 @@ public class ManageApplicationsTest {
@Test
public void updateMenu_mainListType_showAppReset() {
setUpOptionMenus();
- ReflectionHelpers.setField(mFragment, "mListType", ManageApplications.LIST_TYPE_MAIN);
+ ReflectionHelpers.setField(mFragment, "mListType", LIST_TYPE_MAIN);
ReflectionHelpers.setField(mFragment, "mOptionsMenu", mMenu);
mFragment.updateOptionsMenu();
@@ -182,6 +186,21 @@ public class ManageApplicationsTest {
verify(loadingViewController).showLoadingViewDelayed();
}
+ @Test
+ public void shouldUseStableItemHeight_mainType_yes() {
+ assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight(
+ LIST_TYPE_MAIN))
+ .isTrue();
+ assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight(
+ LIST_TYPE_NOTIFICATION))
+ .isFalse();
+ }
+
+ @Test
+ public void shouldUseStableItemHeight_notificationType_no() {
+
+ }
+
@Test
public void onRebuildComplete_shouldHideLoadingView() {
final Context context = RuntimeEnvironment.application;
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
index 28ac9d97094..fc761ccb253 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
@@ -27,7 +27,6 @@ import android.content.Intent;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;
import android.provider.DocumentsContract;
-import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -68,9 +67,8 @@ public class MusicViewHolderControllerTest {
mController = new MusicViewHolderController(mContext, mSource, mVolume.fsUuid,
new UserHandle(0));
- LayoutInflater inflater = LayoutInflater.from(mContext);
- mView = ApplicationViewHolder.newView(inflater, new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(mView);
+ mView = ApplicationViewHolder.newView(new FrameLayout(mContext));
+ mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
index 2a26e312557..0a147ac32fd 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
@@ -26,7 +26,6 @@ import android.content.Context;
import android.content.Intent;
import android.os.UserHandle;
import android.os.storage.VolumeInfo;
-import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -67,9 +66,8 @@ public class PhotosViewHolderControllerTest {
new PhotosViewHolderController(
mContext, mSource, mVolume.fsUuid, new UserHandle(0));
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- mView = ApplicationViewHolder.newView(inflater, new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(mView);
+ mView = ApplicationViewHolder.newView(new FrameLayout(mContext));
+ mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java
index b737d1f6341..7d47fc26c33 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/AutomaticStorageManagementSwitchPreferenceControllerTest.java
@@ -32,6 +32,7 @@ import android.content.Context;
import android.provider.Settings;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.TestConfig;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
@@ -41,6 +42,8 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
import com.android.settings.widget.MasterSwitchPreference;
+
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -83,6 +86,10 @@ public class AutomaticStorageManagementSwitchPreferenceControllerTest {
mContext, mMetricsFeature, mFragmentManager);
when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
}
+ @After
+ public void tearDown() {
+ SettingsShadowSystemProperties.clear();
+ }
@Test
public void isAvailable_shouldReturnTrue_forHighRamDevice() {
@@ -146,6 +153,9 @@ public class AutomaticStorageManagementSwitchPreferenceControllerTest {
public void togglingOnShouldTriggerWarningFragment() {
FragmentTransaction transaction = mock(FragmentTransaction.class);
when (mFragmentManager.beginTransaction()).thenReturn(transaction);
+ SettingsShadowSystemProperties.set(
+ AutomaticStorageManagementSwitchPreferenceController
+ .STORAGE_MANAGER_ENABLED_BY_DEFAULT_PROPERTY, "false");
mController.onSwitchToggled(true);