Merge "Initial search bar implementation." into oc-dev
am: 91fe76263f
Change-Id: I7e6921134a239e136aaf6380ab4d7993e943435a
This commit is contained in:
@@ -22,9 +22,10 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
|
|||||||
LOCAL_STATIC_ANDROID_LIBRARIES := \
|
LOCAL_STATIC_ANDROID_LIBRARIES := \
|
||||||
android-support-v4 \
|
android-support-v4 \
|
||||||
android-support-v13 \
|
android-support-v13 \
|
||||||
android-support-v7-recyclerview \
|
|
||||||
android-support-v7-preference \
|
|
||||||
android-support-v7-appcompat \
|
android-support-v7-appcompat \
|
||||||
|
android-support-v7-cardview \
|
||||||
|
android-support-v7-preference \
|
||||||
|
android-support-v7-recyclerview \
|
||||||
android-support-v14-preference
|
android-support-v14-preference
|
||||||
|
|
||||||
LOCAL_JAVA_LIBRARIES := \
|
LOCAL_JAVA_LIBRARIES := \
|
||||||
|
25
res/layout/dashboard_header_spacer.xml
Normal file
25
res/layout/dashboard_header_spacer.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="@dimen/search_bar_margin">
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?android:attr/actionBarSize"/>
|
||||||
|
</LinearLayout>
|
@@ -18,7 +18,31 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent">
|
||||||
|
<FrameLayout
|
||||||
android:id="@+id/main_content"
|
android:id="@+id/main_content"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent"/>
|
||||||
|
<android.support.v7.widget.CardView
|
||||||
|
android:id="@+id/search_bar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
/>
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/search_bar_margin"
|
||||||
|
app:cardCornerRadius="2dp"
|
||||||
|
app:cardBackgroundColor="?android:attr/colorBackground"
|
||||||
|
app:cardElevation="2dp">
|
||||||
|
<Toolbar
|
||||||
|
android:id="@+id/search_action_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="@dimen/search_bar_negative_margin"
|
||||||
|
android:background="?android:attr/selectableItemBackground"
|
||||||
|
android:navigationIcon="@drawable/ic_search_24dp"
|
||||||
|
android:title="@string/search_menu"
|
||||||
|
android:titleTextAppearance="?android:attr/subtitleTextAppearance"
|
||||||
|
android:titleTextColor="?android:attr/textColorHint"
|
||||||
|
android:theme="?android:attr/actionBarTheme"/>
|
||||||
|
</android.support.v7.widget.CardView>
|
||||||
|
</FrameLayout>
|
||||||
|
@@ -140,6 +140,12 @@
|
|||||||
<dimen name="search_suggestion_item_image_margin_start">32dp</dimen>
|
<dimen name="search_suggestion_item_image_margin_start">32dp</dimen>
|
||||||
<dimen name="search_suggestion_item_image_margin_end">32dp</dimen>
|
<dimen name="search_suggestion_item_image_margin_end">32dp</dimen>
|
||||||
|
|
||||||
|
<!-- The following two margins need to match, with the caveat that
|
||||||
|
the second should be negative. The second one ensures that the icons and text
|
||||||
|
align despite the additional padding caused by the search bar's card background. -->
|
||||||
|
<dimen name="search_bar_margin">8dp</dimen>
|
||||||
|
<dimen name="search_bar_negative_margin">-8dp</dimen>
|
||||||
|
|
||||||
<!-- Dimensions for Wifi Assistant Card -->
|
<!-- Dimensions for Wifi Assistant Card -->
|
||||||
<dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
|
<dimen name="wifi_assistant_padding_top_bottom">16dp</dimen>
|
||||||
<dimen name="wifi_assistant_padding_start_end">16dp</dimen>
|
<dimen name="wifi_assistant_padding_start_end">16dp</dimen>
|
||||||
|
@@ -50,6 +50,7 @@ import android.view.View;
|
|||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.Toolbar;
|
||||||
|
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.settings.Settings.WifiSettingsActivity;
|
import com.android.settings.Settings.WifiSettingsActivity;
|
||||||
@@ -62,6 +63,7 @@ import com.android.settings.dashboard.DashboardSummary;
|
|||||||
import com.android.settings.development.DevelopmentSettings;
|
import com.android.settings.development.DevelopmentSettings;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.search.DynamicIndexableContentMonitor;
|
import com.android.settings.search.DynamicIndexableContentMonitor;
|
||||||
|
import com.android.settings.search2.SearchActivity;
|
||||||
import com.android.settings.search2.SearchFeatureProvider;
|
import com.android.settings.search2.SearchFeatureProvider;
|
||||||
import com.android.settings.wfd.WifiDisplaySettings;
|
import com.android.settings.wfd.WifiDisplaySettings;
|
||||||
import com.android.settings.widget.SwitchBar;
|
import com.android.settings.widget.SwitchBar;
|
||||||
@@ -75,7 +77,7 @@ import java.util.Set;
|
|||||||
public class SettingsActivity extends SettingsDrawerActivity
|
public class SettingsActivity extends SettingsDrawerActivity
|
||||||
implements PreferenceManager.OnPreferenceTreeClickListener,
|
implements PreferenceManager.OnPreferenceTreeClickListener,
|
||||||
PreferenceFragment.OnPreferenceStartFragmentCallback,
|
PreferenceFragment.OnPreferenceStartFragmentCallback,
|
||||||
ButtonBarHandler, FragmentManager.OnBackStackChangedListener {
|
ButtonBarHandler, FragmentManager.OnBackStackChangedListener, OnClickListener {
|
||||||
|
|
||||||
private static final String LOG_TAG = "Settings";
|
private static final String LOG_TAG = "Settings";
|
||||||
|
|
||||||
@@ -345,6 +347,14 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
launchSettingFragment(initialFragmentName, isSubSettings, intent);
|
launchSettingFragment(initialFragmentName, isSubSettings, intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mIsShowingDashboard) {
|
||||||
|
findViewById(R.id.search_bar).setVisibility(View.VISIBLE);
|
||||||
|
findViewById(R.id.action_bar).setVisibility(View.GONE);
|
||||||
|
Toolbar toolbar = findViewById(R.id.search_action_bar);
|
||||||
|
toolbar.setOnClickListener(this);
|
||||||
|
setActionBar(toolbar);
|
||||||
|
}
|
||||||
|
|
||||||
mActionBar = getActionBar();
|
mActionBar = getActionBar();
|
||||||
if (mActionBar != null) {
|
if (mActionBar != null) {
|
||||||
mActionBar.setDisplayHomeAsUpEnabled(mDisplayHomeAsUpEnabled);
|
mActionBar.setDisplayHomeAsUpEnabled(mDisplayHomeAsUpEnabled);
|
||||||
@@ -432,10 +442,10 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
switchToFragment(initialFragmentName, initialArguments, true, false,
|
switchToFragment(initialFragmentName, initialArguments, true, false,
|
||||||
mInitialTitleResId, mInitialTitle, false);
|
mInitialTitleResId, mInitialTitle, false);
|
||||||
} else {
|
} else {
|
||||||
// No UP affordance if we are displaying the main Dashboard
|
// Show search icon as up affordance if we are displaying the main Dashboard
|
||||||
mDisplayHomeAsUpEnabled = false;
|
mDisplayHomeAsUpEnabled = true;
|
||||||
// Show Search affordance
|
// toolbar is search affordance so don't show search
|
||||||
mDisplaySearch = true;
|
mDisplaySearch = false;
|
||||||
mInitialTitleResId = R.string.dashboard_title;
|
mInitialTitleResId = R.string.dashboard_title;
|
||||||
|
|
||||||
switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
|
switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
|
||||||
@@ -939,4 +949,10 @@ public class SettingsActivity extends SettingsDrawerActivity
|
|||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Intent intent = new Intent(this, SearchActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
}
|
}
|
@@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.dashboard;
|
package com.android.settings.dashboard;
|
||||||
|
|
||||||
|
import android.annotation.AttrRes;
|
||||||
|
import android.annotation.ColorInt;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
@@ -55,6 +57,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
|||||||
private static final String STATE_CATEGORY_LIST = "category_list";
|
private static final String STATE_CATEGORY_LIST = "category_list";
|
||||||
private static final String STATE_SUGGESTION_MODE = "suggestion_mode";
|
private static final String STATE_SUGGESTION_MODE = "suggestion_mode";
|
||||||
private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
|
private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
|
||||||
|
private static final int DONT_SET_BACKGROUND_ATTR = -1;
|
||||||
|
|
||||||
private final IconCache mCache;
|
private final IconCache mCache;
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
@@ -222,6 +225,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
|||||||
public void onBindViewHolder(DashboardItemHolder holder, int position) {
|
public void onBindViewHolder(DashboardItemHolder holder, int position) {
|
||||||
final int type = mDashboardData.getItemTypeByPosition(position);
|
final int type = mDashboardData.getItemTypeByPosition(position);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case R.layout.dashboard_header_spacer:
|
||||||
|
onBindHeaderSpacer(holder, position);
|
||||||
|
break;
|
||||||
case R.layout.dashboard_category:
|
case R.layout.dashboard_category:
|
||||||
onBindCategory(holder,
|
onBindCategory(holder,
|
||||||
(DashboardCategory) mDashboardData.getItemEntityByPosition(position));
|
(DashboardCategory) mDashboardData.getItemEntityByPosition(position));
|
||||||
@@ -352,6 +358,33 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
|
|||||||
notifyDashboardDataChanged(prevData);
|
notifyDashboardDataChanged(prevData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onBindHeaderSpacer(DashboardItemHolder holder, int position) {
|
||||||
|
if (mDashboardData.size() > (position + 1)) {
|
||||||
|
// The spacer that goes underneath the search bar needs to match the
|
||||||
|
// background of the first real view. That view is either a condition,
|
||||||
|
// a suggestion, or the dashboard item.
|
||||||
|
//
|
||||||
|
// If it's a dashboard item, set null background so it uses the parent's
|
||||||
|
// background like the other views. Otherwise, match the colors.
|
||||||
|
int nextType = mDashboardData.getItemTypeByPosition(position + 1);
|
||||||
|
int colorAttr = nextType == R.layout.suggestion_header
|
||||||
|
? android.R.attr.colorSecondary
|
||||||
|
: nextType == R.layout.condition_card
|
||||||
|
? android.R.attr.colorAccent
|
||||||
|
: DONT_SET_BACKGROUND_ATTR;
|
||||||
|
|
||||||
|
if (colorAttr != DONT_SET_BACKGROUND_ATTR) {
|
||||||
|
TypedArray array = holder.itemView.getContext()
|
||||||
|
.obtainStyledAttributes(new int[]{colorAttr});
|
||||||
|
@ColorInt int color = array.getColor(0, 0);
|
||||||
|
array.recycle();
|
||||||
|
holder.itemView.setBackgroundColor(color);
|
||||||
|
} else {
|
||||||
|
holder.itemView.setBackground(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void onBindSuggestionHeader(final DashboardItemHolder holder, DashboardData
|
void onBindSuggestionHeader(final DashboardItemHolder holder, DashboardData
|
||||||
.SuggestionHeaderData data) {
|
.SuggestionHeaderData data) {
|
||||||
|
@@ -45,7 +45,8 @@ public class DashboardData {
|
|||||||
public static final int DEFAULT_SUGGESTION_COUNT = 2;
|
public static final int DEFAULT_SUGGESTION_COUNT = 2;
|
||||||
|
|
||||||
// id namespace for different type of items.
|
// id namespace for different type of items.
|
||||||
private static final int NS_SPACER = 0;
|
private static final int NS_HEADER_SPACER = 0;
|
||||||
|
private static final int NS_SPACER = 1000;
|
||||||
private static final int NS_ITEMS = 2000;
|
private static final int NS_ITEMS = 2000;
|
||||||
private static final int NS_CONDITION = 3000;
|
private static final int NS_CONDITION = 3000;
|
||||||
|
|
||||||
@@ -228,6 +229,9 @@ public class DashboardData {
|
|||||||
* and mIsShowingAll, mSuggestionMode flag.
|
* and mIsShowingAll, mSuggestionMode flag.
|
||||||
*/
|
*/
|
||||||
private void buildItemsData() {
|
private void buildItemsData() {
|
||||||
|
// add the view that goes under the search bar
|
||||||
|
countItem(null, R.layout.dashboard_header_spacer, true, NS_HEADER_SPACER);
|
||||||
|
resetCount();
|
||||||
boolean hasConditions = false;
|
boolean hasConditions = false;
|
||||||
for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
|
for (int i = 0; mConditions != null && i < mConditions.size(); i++) {
|
||||||
boolean shouldShow = mConditions.get(i).shouldShow();
|
boolean shouldShow = mConditions.get(i).shouldShow();
|
||||||
|
@@ -54,13 +54,10 @@ public class SearchFeatureProviderImpl implements SearchFeatureProvider {
|
|||||||
String menuTitle = activity.getString(R.string.search_menu);
|
String menuTitle = activity.getString(R.string.search_menu);
|
||||||
MenuItem menuItem = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, menuTitle)
|
MenuItem menuItem = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, menuTitle)
|
||||||
.setIcon(R.drawable.ic_search_24dp)
|
.setIcon(R.drawable.ic_search_24dp)
|
||||||
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
.setOnMenuItemClickListener(item -> {
|
||||||
@Override
|
|
||||||
public boolean onMenuItemClick(MenuItem item) {
|
|
||||||
Intent intent = new Intent(activity, SearchActivity.class);
|
Intent intent = new Intent(activity, SearchActivity.class);
|
||||||
activity.startActivity(intent);
|
activity.startActivity(intent);
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||||
|
@@ -20,12 +20,15 @@ import android.app.Activity;
|
|||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.FragmentManager;
|
import android.app.FragmentManager;
|
||||||
import android.app.FragmentTransaction;
|
import android.app.FragmentTransaction;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
|
||||||
|
import com.android.settings.search2.SearchActivity;
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -35,6 +38,7 @@ import org.mockito.Mock;
|
|||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
import org.robolectric.shadows.ShadowApplication;
|
||||||
import org.robolectric.util.ReflectionHelpers;
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
@@ -138,4 +142,15 @@ public class SettingsActivityTest {
|
|||||||
|
|
||||||
assertThat(mActivity.mDisplaySearch).isTrue();
|
assertThat(mActivity.mDisplaySearch).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnClick() {
|
||||||
|
doReturn("com.android.settings").when(mActivity).getPackageName();
|
||||||
|
|
||||||
|
mActivity.onClick(null);
|
||||||
|
|
||||||
|
Intent intent = ShadowApplication.getInstance().getNextStartedActivity();
|
||||||
|
assertThat(intent.getComponent()).isEqualTo(
|
||||||
|
new ComponentName("com.android.settings", SearchActivity.class.getName()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -19,16 +19,23 @@ import android.content.ComponentName;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
|
import android.graphics.drawable.Icon;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsRobolectricTestRunner;
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.dashboard.conditional.Condition;
|
import com.android.settings.dashboard.conditional.Condition;
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||||
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
|
||||||
|
import com.android.settingslib.drawer.DashboardCategory;
|
||||||
import com.android.settingslib.drawer.Tile;
|
import com.android.settingslib.drawer.Tile;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@@ -47,6 +54,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.mockito.Mockito.any;
|
import static org.mockito.Mockito.any;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
@@ -99,6 +107,53 @@ public class DashboardAdapterTest {
|
|||||||
when(mView.getTag()).thenReturn(mCondition);
|
when(mView.getTag()).thenReturn(mCondition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnBindViewHolder_spacer_noSuggestions_noConditions() {
|
||||||
|
makeCategory();
|
||||||
|
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||||
|
|
||||||
|
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||||
|
|
||||||
|
assertThat(holder.itemView.getBackground()).isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnBindViewHolder_spacer_suggestion_noConditions() {
|
||||||
|
setupSuggestions(makeSuggestions("pkg1"));
|
||||||
|
makeCategory();
|
||||||
|
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||||
|
|
||||||
|
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||||
|
|
||||||
|
assertThat(holder.itemView.getBackground()).isNotNull();
|
||||||
|
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnBindViewHolder_spacer_noSuggestion_condition() {
|
||||||
|
makeCondition();
|
||||||
|
makeCategory();
|
||||||
|
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||||
|
|
||||||
|
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||||
|
|
||||||
|
assertThat(holder.itemView.getBackground()).isNotNull();
|
||||||
|
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnBindViewHolder_spacer_suggestion_condition() {
|
||||||
|
setupSuggestions(makeSuggestions("pkg1"));
|
||||||
|
makeCondition();
|
||||||
|
makeCategory();
|
||||||
|
DashboardAdapter.DashboardItemHolder holder = setupSpacer();
|
||||||
|
|
||||||
|
mDashboardAdapter.onBindViewHolder(holder, 0);
|
||||||
|
|
||||||
|
assertThat(holder.itemView.getBackground()).isNotNull();
|
||||||
|
assertThat(holder.itemView.getBackground()).isInstanceOf(ColorDrawable.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetConditions_AfterSetConditions_ExpandedConditionNull() {
|
public void testSetConditions_AfterSetConditions_ExpandedConditionNull() {
|
||||||
mDashboardAdapter.onExpandClick(mView);
|
mDashboardAdapter.onExpandClick(mView);
|
||||||
@@ -109,7 +164,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_NotExpanded() {
|
public void testSuggestionsLogs_NotExpanded() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||||
verify(mFactory.metricsFeatureProvider, times(2)).action(
|
verify(mFactory.metricsFeatureProvider, times(2)).action(
|
||||||
any(Context.class), mActionCategoryCaptor.capture(),
|
any(Context.class), mActionCategoryCaptor.capture(),
|
||||||
mActionPackageCaptor.capture());
|
mActionPackageCaptor.capture());
|
||||||
@@ -124,7 +179,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_NotExpandedAndPaused() {
|
public void testSuggestionsLogs_NotExpandedAndPaused() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||||
mDashboardAdapter.onPause();
|
mDashboardAdapter.onPause();
|
||||||
verify(mFactory.metricsFeatureProvider, times(4)).action(
|
verify(mFactory.metricsFeatureProvider, times(4)).action(
|
||||||
any(Context.class), mActionCategoryCaptor.capture(),
|
any(Context.class), mActionCategoryCaptor.capture(),
|
||||||
@@ -141,7 +196,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_Expanded() {
|
public void testSuggestionsLogs_Expanded() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
mSuggestionHolder.itemView.callOnClick();
|
mSuggestionHolder.itemView.callOnClick();
|
||||||
@@ -160,7 +215,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedAndPaused() {
|
public void testSuggestionsLogs_ExpandedAndPaused() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
mSuggestionHolder.itemView.callOnClick();
|
mSuggestionHolder.itemView.callOnClick();
|
||||||
@@ -183,7 +238,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedAfterPause() {
|
public void testSuggestionsLogs_ExpandedAfterPause() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||||
mDashboardAdapter.onPause();
|
mDashboardAdapter.onPause();
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
@@ -208,7 +263,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedAfterPauseAndPausedAgain() {
|
public void testSuggestionsLogs_ExpandedAfterPauseAndPausedAgain() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1", "pkg2", "pkg3"}));
|
setupSuggestions(makeSuggestions("pkg1", "pkg2", "pkg3"));
|
||||||
mDashboardAdapter.onPause();
|
mDashboardAdapter.onPause();
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
@@ -237,7 +292,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShown() {
|
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShown() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
setupSuggestions(makeSuggestions("pkg1"));
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
mSuggestionHolder.itemView.callOnClick();
|
mSuggestionHolder.itemView.callOnClick();
|
||||||
@@ -254,7 +309,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAndPaused() {
|
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAndPaused() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
setupSuggestions(makeSuggestions("pkg1"));
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
mSuggestionHolder.itemView.callOnClick();
|
mSuggestionHolder.itemView.callOnClick();
|
||||||
@@ -273,7 +328,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPause() {
|
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPause() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
setupSuggestions(makeSuggestions("pkg1"));
|
||||||
mDashboardAdapter.onPause();
|
mDashboardAdapter.onPause();
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
@@ -293,7 +348,7 @@ public class DashboardAdapterTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPauseAndPausedAgain() {
|
public void testSuggestionsLogs_ExpandedWithLessThanDefaultShownAfterPauseAndPausedAgain() {
|
||||||
setUpSuggestions(makeSuggestions(new String[]{"pkg1"}));
|
setupSuggestions(makeSuggestions("pkg1"));
|
||||||
mDashboardAdapter.onPause();
|
mDashboardAdapter.onPause();
|
||||||
mDashboardAdapter.onBindSuggestionHeader(
|
mDashboardAdapter.onBindSuggestionHeader(
|
||||||
mSuggestionHolder, mSuggestionHeaderData);
|
mSuggestionHolder, mSuggestionHeaderData);
|
||||||
@@ -313,7 +368,7 @@ public class DashboardAdapterTest {
|
|||||||
assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions);
|
assertThat(mActionCategoryCaptor.getAllValues().toArray()).isEqualTo(expectedActions);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Tile> makeSuggestions(String[] pkgNames) {
|
private List<Tile> makeSuggestions(String... pkgNames) {
|
||||||
final List<Tile> suggestions = new ArrayList<>();
|
final List<Tile> suggestions = new ArrayList<>();
|
||||||
for (String pkgName : pkgNames) {
|
for (String pkgName : pkgNames) {
|
||||||
Tile suggestion = new Tile();
|
Tile suggestion = new Tile();
|
||||||
@@ -324,11 +379,31 @@ public class DashboardAdapterTest {
|
|||||||
return suggestions;
|
return suggestions;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpSuggestions(List<Tile> suggestions) {
|
private void setupSuggestions(List<Tile> suggestions) {
|
||||||
mDashboardAdapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions);
|
mDashboardAdapter.setCategoriesAndSuggestions(new ArrayList<>(), suggestions);
|
||||||
mSuggestionHolder = mDashboardAdapter.onCreateViewHolder(
|
mSuggestionHolder = mDashboardAdapter.onCreateViewHolder(
|
||||||
new FrameLayout(RuntimeEnvironment.application),
|
new FrameLayout(RuntimeEnvironment.application),
|
||||||
mDashboardAdapter.getItemViewType(0));
|
mDashboardAdapter.getItemViewType(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void makeCondition() {
|
||||||
|
final List<Condition> conditions = new ArrayList<>();
|
||||||
|
Condition condition = mock(Condition.class);
|
||||||
|
when(condition.shouldShow()).thenReturn(true);
|
||||||
|
conditions.add(condition);
|
||||||
|
mDashboardAdapter.setConditions(conditions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeCategory() {
|
||||||
|
List<DashboardCategory> categories = new ArrayList<>();
|
||||||
|
categories.add(new DashboardCategory());
|
||||||
|
mDashboardAdapter.setCategory(categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DashboardAdapter.DashboardItemHolder setupSpacer() {
|
||||||
|
Context context = RuntimeEnvironment.application;
|
||||||
|
final View view = LayoutInflater.from(context)
|
||||||
|
.inflate(R.layout.dashboard_header_spacer, new LinearLayout(context), false);
|
||||||
|
return new DashboardAdapter.DashboardItemHolder(view);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -112,7 +112,7 @@ public class DashboardDataTest {
|
|||||||
public void testBuildItemsData_containsAllData() {
|
public void testBuildItemsData_containsAllData() {
|
||||||
final DashboardData.SuggestionHeaderData data =
|
final DashboardData.SuggestionHeaderData data =
|
||||||
new DashboardData.SuggestionHeaderData(false, 1, 0);
|
new DashboardData.SuggestionHeaderData(false, 1, 0);
|
||||||
final Object[] expectedObjects = {mTestCondition, null, data, mTestSuggestion,
|
final Object[] expectedObjects = {null, mTestCondition, null, data, mTestSuggestion,
|
||||||
mDashboardCategory, mTestCategoryTile};
|
mDashboardCategory, mTestCategoryTile};
|
||||||
final int expectedSize = expectedObjects.length;
|
final int expectedSize = expectedObjects.length;
|
||||||
|
|
||||||
@@ -180,7 +180,7 @@ public class DashboardDataTest {
|
|||||||
//Build testResultData
|
//Build testResultData
|
||||||
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
||||||
testResultData.add(new ListUpdateResult.ResultData(
|
testResultData.add(new ListUpdateResult.ResultData(
|
||||||
ListUpdateResult.ResultData.TYPE_OPERATION_INSERT, 1, 1));
|
ListUpdateResult.ResultData.TYPE_OPERATION_INSERT, 2, 1));
|
||||||
|
|
||||||
testDiffUtil(mDashboardDataWithOneConditions,
|
testDiffUtil(mDashboardDataWithOneConditions,
|
||||||
mDashboardDataWithTwoConditions, testResultData);
|
mDashboardDataWithTwoConditions, testResultData);
|
||||||
@@ -191,7 +191,7 @@ public class DashboardDataTest {
|
|||||||
//Build testResultData
|
//Build testResultData
|
||||||
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
|
||||||
testResultData.add(new ListUpdateResult.ResultData(
|
testResultData.add(new ListUpdateResult.ResultData(
|
||||||
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 6));
|
ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 1, 6));
|
||||||
|
|
||||||
testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
|
testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
|
||||||
}
|
}
|
||||||
@@ -203,8 +203,8 @@ public class DashboardDataTest {
|
|||||||
mDashboardDataWithOneConditions.getItemList(),
|
mDashboardDataWithOneConditions.getItemList(),
|
||||||
mDashboardDataWithOneConditions.getItemList());
|
mDashboardDataWithOneConditions.getItemList());
|
||||||
|
|
||||||
// Item in position 0 is condition card, which payload should not be null
|
// Item in position 1 is condition card, which payload should not be null
|
||||||
assertThat(callback.getChangePayload(0, 0)).isNotEqualTo(null);
|
assertThat(callback.getChangePayload(1, 1)).isNotNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -214,9 +214,9 @@ public class DashboardDataTest {
|
|||||||
mDashboardDataWithOneConditions.getItemList(),
|
mDashboardDataWithOneConditions.getItemList(),
|
||||||
mDashboardDataWithOneConditions.getItemList());
|
mDashboardDataWithOneConditions.getItemList());
|
||||||
|
|
||||||
// Only item in position 0 is condition card, so others' payload should be null
|
// Position 0 is spacer, 1 is condition card, so others' payload should be null
|
||||||
for (int i = 1; i < mDashboardDataWithOneConditions.getItemList().size(); i++) {
|
for (int i = 2; i < mDashboardDataWithOneConditions.getItemList().size(); i++) {
|
||||||
assertThat(callback.getChangePayload(i, i)).isEqualTo(null);
|
assertThat(callback.getChangePayload(i, i)).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -356,6 +356,11 @@ public class DashboardDataTest {
|
|||||||
|
|
||||||
return arg2 - resultData.arg2;
|
return arg2 - resultData.arg2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "op:" + operation + ",arg1:" + arg1 + ",arg2:" + arg2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user