diff --git a/res/drawable/search_panel_list_background.xml b/res/drawable/search_panel_list_background.xml deleted file mode 100644 index 7f7b5604e6b..00000000000 --- a/res/drawable/search_panel_list_background.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/res/layout/search_panel.xml b/res/layout/search_panel.xml index d097cfe3c57..7461374444b 100644 --- a/res/layout/search_panel.xml +++ b/res/layout/search_panel.xml @@ -13,19 +13,50 @@ See the License for the specific language governing permissions and limitations under the License. --> - + android:orientation="vertical"> + + + + + + + + @@ -68,27 +99,8 @@ - - - - - - - + diff --git a/src/com/android/settings/search/HeaderDecorator.java b/src/com/android/settings/search/HeaderDecorator.java deleted file mode 100644 index bff344b7b87..00000000000 --- a/src/com/android/settings/search/HeaderDecorator.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 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.search; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Rect; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.android.settings.R; - -public class HeaderDecorator extends RecyclerView.ItemDecoration { - @Override - public void getItemOffsets(Rect outRect, View view, RecyclerView parent, - RecyclerView.State state) { - super.getItemOffsets(outRect, view, parent, state); - if (parent.getChildAdapterPosition(view) > 0) { - return; - } - - Context context = view.getContext(); - TypedArray ta = context.obtainStyledAttributes(new int[]{android.R.attr.actionBarSize}); - outRect.top = ta.getDimensionPixelSize(0, 0); - ta.recycle(); - - outRect.top += 2 * context.getResources().getDimensionPixelSize(R.dimen.search_bar_margin); - } -} diff --git a/src/com/android/settings/search/SearchFragment.java b/src/com/android/settings/search/SearchFragment.java index 90b46af89f1..a4d34c78353 100644 --- a/src/com/android/settings/search/SearchFragment.java +++ b/src/com/android/settings/search/SearchFragment.java @@ -36,6 +36,8 @@ import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.LinearLayout; import android.widget.SearchView; +import android.widget.TextView; +import android.widget.Toolbar; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; @@ -168,14 +170,32 @@ public class SearchFragment extends InstrumentedFragment implements SearchView.O mResultsRecyclerView.setAdapter(mSearchAdapter); mResultsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); mResultsRecyclerView.addOnScrollListener(mScrollListener); - mResultsRecyclerView.addItemDecoration(new HeaderDecorator()); mNoResultsView = view.findViewById(R.id.no_results_layout); - mSearchView = view.findViewById(R.id.search_view); + Toolbar toolbar = view.findViewById(R.id.search_toolbar); + getActivity().setActionBar(toolbar); + getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); + + mSearchView = toolbar.findViewById(R.id.search_view); mSearchView.setQuery(mQuery, false /* submitQuery */); mSearchView.setOnQueryTextListener(this); mSearchView.requestFocus(); + + // Updating internal views inside SearchView was the easiest way to get this too look right. + // We null-check here so that tests pass since the robotests can't find the internal views. + TextView searchText = mSearchView.findViewById(com.android.internal.R.id.search_src_text); + if (searchText != null) { + searchText.setTextColor(getContext().getColorStateList( + com.android.internal.R.color.text_color_primary)); + } + View editFrame = mSearchView.findViewById(com.android.internal.R.id.search_edit_frame); + if (editFrame != null) { + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) editFrame.getLayoutParams(); + params.setMarginStart(0); + editFrame.setLayoutParams(params); + } return view; } diff --git a/tests/robotests/src/com/android/settings/search/HeaderDecoratorTest.java b/tests/robotests/src/com/android/settings/search/HeaderDecoratorTest.java deleted file mode 100644 index 61536b71d46..00000000000 --- a/tests/robotests/src/com/android/settings/search/HeaderDecoratorTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2017 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.search; - -import android.graphics.Rect; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.android.settings.R; -import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.TestConfig; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Answers; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.Config; - -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.when; - -@RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) -public class HeaderDecoratorTest { - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private View mView; - @Mock - private RecyclerView mRecyclerView; - @Mock - private RecyclerView.LayoutParams mLayoutParams; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - when(mView.getLayoutParams()).thenReturn(mLayoutParams); - } - - @Test - public void testgetItemOffsets_positionZero_headerAdded() { - HeaderDecorator decorator = new HeaderDecorator(); - Rect outRect = new Rect(); - when(mRecyclerView.getChildAdapterPosition(any(View.class))).thenReturn(0); - when(mView.getContext().obtainStyledAttributes(any(int[].class)) - .getDimensionPixelSize(0, 0)).thenReturn(20); - when(mView.getContext().getResources().getDimensionPixelSize(R.dimen.search_bar_margin)) - .thenReturn(5); - - decorator.getItemOffsets(outRect, mView, mRecyclerView, null); - - assertThat(outRect).isEqualTo(new Rect(0, 30, 0, 0)); - } - - @Test - public void testgetItemOffsets_positionGreaterThanZero_noDecoration() { - HeaderDecorator decorator = new HeaderDecorator(); - Rect outRect = new Rect(); - when(mRecyclerView.getChildAdapterPosition(any(View.class))).thenReturn(1); - - decorator.getItemOffsets(outRect, mView, mRecyclerView, null); - - assertThat(outRect).isEqualTo(new Rect(0, 0, 0, 0)); - } -} diff --git a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java index e53c01d40e3..77a8cdf80a0 100644 --- a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java +++ b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java @@ -32,6 +32,7 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.SettingsShadowResources; import org.junit.After; import org.junit.Before; @@ -66,7 +67,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +@Config(manifest = TestConfig.MANIFEST_PATH, + sdk = TestConfig.SDK_VERSION, + shadows = { + SettingsShadowResources.class, + SettingsShadowResources.SettingsShadowTheme.class, + }) public class SearchFragmentTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java index d4b0ff76b1d..c56438fcedf 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/SettingsShadowResources.java @@ -7,6 +7,7 @@ import static org.robolectric.Shadows.shadowOf; import static org.robolectric.internal.Shadow.directlyOn; import android.annotation.DimenRes; +import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; import android.content.res.Resources.Theme; @@ -87,6 +88,15 @@ public class SettingsShadowResources extends ShadowResources { return directlyOn(realResources, Resources.class).getColor(id, theme); } + @Implementation + public ColorStateList getColorStateList(@ColorRes int id, @Nullable Theme theme) + throws NotFoundException { + if (id == com.android.internal.R.color.text_color_primary) { + return ColorStateList.valueOf(Color.WHITE); + } + return directlyOn(realResources, Resources.class).getColorStateList(id, theme); + } + @Implementation public Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException {