diff --git a/res/layout/manage_applications_apps.xml b/res/layout/manage_applications_apps.xml index c2f58c3394b..021a61ef9a0 100644 --- a/res/layout/manage_applications_apps.xml +++ b/res/layout/manage_applications_apps.xml @@ -28,9 +28,9 @@ settings:layout_behavior="com.android.settings.widget.FloatingAppBarScrollingViewBehavior"> + android:layout_height="match_parent"> 1 ? View.VISIBLE : View.GONE); + updateFilterView(mFilterOptions.size() > 1); notifyDataSetChanged(); if (mFilterOptions.size() == 1) { if (DEBUG) { @@ -826,14 +830,13 @@ public class ManageApplications extends InstrumentedFragment filter.getTitle())); } Collections.sort(mFilterOptions); - mManageApplications.mSpinnerHeader.setVisibility( - mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE); + updateFilterView(mFilterOptions.size() > 1); notifyDataSetChanged(); if (mManageApplications.mFilter == filter) { if (mFilterOptions.size() > 0) { if (DEBUG) { Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0) - + mContext.getText(mFilterOptions.get(0).getTitle())); + + mContext.getText(mFilterOptions.get(0).getTitle())); } mManageApplications.mFilterSpinner.setSelection(0); mManageApplications.onItemSelected(null, null, 0, 0); @@ -850,6 +853,26 @@ public class ManageApplications extends InstrumentedFragment public CharSequence getItem(int position) { return mContext.getText(mFilterOptions.get(position).getTitle()); } + + @VisibleForTesting + void updateFilterView(boolean hasFilter) { + // If we need to add a floating filter in this screen, we should have an extra top + // padding for putting floating filter view. Otherwise, the content of list will be + // overlapped by floating filter. + if (hasFilter) { + mManageApplications.mSpinnerHeader.setVisibility(View.VISIBLE); + mManageApplications.mContentContainer.setPadding(0 /* left */, + mContext.getResources().getDimensionPixelSize( + R.dimen.app_bar_height) /* top */, + 0 /* right */, + 0 /* bottom */); + } else { + mManageApplications.mSpinnerHeader.setVisibility(View.GONE); + mManageApplications.mContentContainer.setPadding(0 /* left */, 0 /* top */, + 0 /* right */, + 0 /* bottom */); + } + } } static class ApplicationsAdapter extends RecyclerView.Adapter 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 3dc0bc453ff..27aeccc933d 100644 --- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java +++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java @@ -91,6 +91,8 @@ public class ManageApplicationsTest { private UserManager mUserManager; @Mock private PackageManager mPackageManager; + + private Context mContext; private MenuItem mAppReset; private MenuItem mSortRecent; private MenuItem mSortFrequent; @@ -99,6 +101,7 @@ public class ManageApplicationsTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; mAppReset = new RoboMenuItem(R.id.reset_app_preferences); mSortRecent = new RoboMenuItem(R.id.sort_order_recent_notification); mSortFrequent = new RoboMenuItem(R.id.sort_order_frequent_notification); @@ -107,6 +110,7 @@ public class ManageApplicationsTest { when(mState.getBackgroundLooper()).thenReturn(Looper.myLooper()); mFragment = spy(new ManageApplications()); + when(mFragment.getContext()).thenReturn(mContext); when(mFragment.getActivity()).thenReturn(mActivity); when(mActivity.getResources()).thenReturn(mResources); when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); @@ -460,6 +464,31 @@ public class ManageApplicationsTest { assertThat(mFragment.mSortOrder).isEqualTo(mSortFrequent.getItemId()); } + @Test + public void updateFilterView_hasFilterSet_shouldShowFilterAndHavePaddingTop() { + mFragment.mContentContainer = new View(mContext); + mFragment.mSpinnerHeader = new View(mContext); + mFragment.mFilterAdapter = new ManageApplications.FilterSpinnerAdapter(mFragment); + + mFragment.mFilterAdapter.updateFilterView(true); + + assertThat(mFragment.mSpinnerHeader.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mFragment.mContentContainer.getPaddingTop()).isEqualTo( + mContext.getResources().getDimensionPixelSize(R.dimen.app_bar_height)); + } + + @Test + public void updateFilterView_noFilterSet_shouldHideFilterAndNoPaddingTop() { + mFragment.mContentContainer = new View(mContext); + mFragment.mSpinnerHeader = new View(mContext); + mFragment.mFilterAdapter = new ManageApplications.FilterSpinnerAdapter(mFragment); + + mFragment.mFilterAdapter.updateFilterView(false); + + assertThat(mFragment.mSpinnerHeader.getVisibility()).isEqualTo(View.GONE); + assertThat(mFragment.mContentContainer.getPaddingTop()).isEqualTo(0); + } + private void setUpOptionMenus() { when(mMenu.findItem(anyInt())).thenAnswer(invocation -> { final Object[] args = invocation.getArguments();