Remove suggestion UI v1 codes.
- remove the check for feature flag for suggestion UI v2 and switch to
use the v2 codes.
- remove all code related to v1 of suggestion UI
Fixes: 70573674
Test: make RunSettingsRoboTests
Change-Id: I99ab318c1c0192508a9c5e9e708e86319120d55b
diff --git a/res/layout/suggestion_condition_footer.xml b/res/layout/condition_footer.xml
similarity index 100%
rename from res/layout/suggestion_condition_footer.xml
rename to res/layout/condition_footer.xml
diff --git a/res/layout/suggestion_condition_header.xml b/res/layout/condition_header.xml
similarity index 100%
rename from res/layout/suggestion_condition_header.xml
rename to res/layout/condition_header.xml
diff --git a/res/layout/suggestion_condition_container.xml b/res/layout/suggestion_condition_container.xml
deleted file mode 100644
index a4c60ad..0000000
--- a/res/layout/suggestion_condition_container.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- style="@style/SuggestionConditionStyle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="5dp"
- android:paddingEnd="5dp"
- android:paddingBottom="@dimen/dashboard_padding_bottom">
-
- <android.support.v7.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:cardUseCompatPadding="true"
- app:cardElevation="2dp">
-
- <android.support.v7.widget.RecyclerView
- android:id="@+id/data"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/material_grey_300"
- android:scrollbars="none"/>
-
- </android.support.v7.widget.CardView>
-
-</FrameLayout>
diff --git a/res/layout/suggestion_tile.xml b/res/layout/suggestion_tile.xml
index b947452..79f6dca 100644
--- a/res/layout/suggestion_tile.xml
+++ b/res/layout/suggestion_tile.xml
@@ -14,51 +14,69 @@
limitations under the License.
-->
-<LinearLayout
+<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/suggestion_card"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:orientation="vertical">
+ app:cardPreventCornerOverlap="false"
+ app:cardUseCompatPadding="true"
+ app:cardElevation="2dp"
+ app:cardCornerRadius="@dimen/suggestion_card_corner_radius">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@android:color/white"
- android:gravity="center_vertical"
- android:orientation="horizontal"
- android:minHeight="@dimen/dashboard_tile_minimum_height">
+ android:minHeight="112dp"
+ android:orientation="vertical">
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="@dimen/suggestion_card_icon_size"
- android:layout_height="@dimen/suggestion_card_icon_size"
- android:layout_marginStart="14dp"
- android:layout_marginEnd="24dp" />
-
- <LinearLayout
- android:layout_width="wrap_content"
+ <RelativeLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical">
+ android:orientation="horizontal">
- <TextView
- android:id="@android:id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.TileTitle"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal" />
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="@dimen/suggestion_card_icon_size"
+ android:layout_height="@dimen/suggestion_card_icon_size"
+ style="@style/SuggestionCardIcon"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="8dp" />
- <TextView
- android:id="@android:id/summary"
- android:textAppearance="@style/TextAppearance.SuggestionSummary"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ <ImageView
+ android:id="@+id/close_button"
+ android:layout_width="18dp"
+ android:layout_height="18dp"
+ android:alpha="0.54"
+ android:layout_alignParentEnd="true"
+ android:layout_marginTop="8dp"
+ android:layout_marginEnd="8dp"
+ android:src="@drawable/ic_suggestion_close_button"/>
- </LinearLayout>
+ </RelativeLayout>
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/SuggestionCardText"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.SuggestionTitleV2"
+ android:ellipsize="end"
+ android:fadingEdge="horizontal" />
+
+ <TextView
+ android:id="@android:id/summary"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/SuggestionCardText"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
+ android:textAppearance="@style/TextAppearance.SuggestionSummary" />
</LinearLayout>
- <include layout="@layout/horizontal_divider" />
-
-</LinearLayout>
\ No newline at end of file
+</android.support.v7.widget.CardView>
diff --git a/res/layout/suggestion_tile_v2.xml b/res/layout/suggestion_tile_v2.xml
deleted file mode 100644
index a7717b7..0000000
--- a/res/layout/suggestion_tile_v2.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-
-<android.support.v7.widget.CardView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/suggestion_card"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:cardPreventCornerOverlap="false"
- app:cardUseCompatPadding="true"
- app:cardElevation="2dp"
- app:cardCornerRadius="@dimen/suggestion_card_corner_radius">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="112dp"
- android:orientation="vertical">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="@dimen/suggestion_card_icon_size"
- android:layout_height="@dimen/suggestion_card_icon_size"
- style="@style/SuggestionCardIcon"
- android:layout_marginTop="16dp"
- android:layout_marginBottom="8dp" />
-
- <ImageView
- android:id="@+id/close_button"
- android:layout_width="18dp"
- android:layout_height="18dp"
- android:alpha="0.54"
- android:layout_alignParentEnd="true"
- android:layout_marginTop="8dp"
- android:layout_marginEnd="8dp"
- android:src="@drawable/ic_suggestion_close_button"/>
-
- </RelativeLayout>
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/SuggestionCardText"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.SuggestionTitleV2"
- android:ellipsize="end"
- android:fadingEdge="horizontal" />
-
- <TextView
- android:id="@android:id/summary"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/SuggestionCardText"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
- android:textAppearance="@style/TextAppearance.SuggestionSummary" />
-
- </LinearLayout>
-
-</android.support.v7.widget.CardView>
diff --git a/res/layout/suggestion_tile_with_button.xml b/res/layout/suggestion_tile_with_button.xml
index 081df5b..a674bcb 100644
--- a/res/layout/suggestion_tile_with_button.xml
+++ b/res/layout/suggestion_tile_with_button.xml
@@ -14,58 +14,78 @@
limitations under the License.
-->
-<LinearLayout
+<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/suggestion_card"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:background="@android:color/white"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:paddingStart="16dp"
- android:paddingEnd="12dp"
- android:paddingBottom="20dp"
- android:paddingTop="16dp"
- android:orientation="horizontal"
- android:minHeight="@dimen/dashboard_tile_minimum_height">
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="@dimen/dashboard_tile_image_size"
- android:layout_height="@dimen/dashboard_tile_image_size" />
+ app:cardPreventCornerOverlap="false"
+ app:cardUseCompatPadding="true"
+ app:cardElevation="2dp"
+ app:cardCornerRadius="@dimen/suggestion_card_corner_radius">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="start"
- android:layout_marginStart="18dp"
- android:layout_marginTop="2dp"
- android:clipChildren="false"
- android:clipToPadding="false"
+ android:minHeight="112dp"
android:orientation="vertical">
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@android:id/icon"
+ android:layout_width="@dimen/suggestion_card_icon_size"
+ android:layout_height="@dimen/suggestion_card_icon_size"
+ style="@style/SuggestionCardIcon"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="8dp" />
+
+ <ImageView
+ android:id="@+id/close_button"
+ android:layout_width="18dp"
+ android:layout_height="18dp"
+ android:alpha="0.54"
+ android:layout_alignParentEnd="true"
+ android:layout_marginTop="8dp"
+ android:layout_marginEnd="8dp"
+ android:src="@drawable/ic_suggestion_close_button"/>
+
+ </RelativeLayout>
+
<TextView
android:id="@android:id/title"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="6dp"
- android:textAppearance="@style/TextAppearance.TileTitle" />
+ style="@style/SuggestionCardText"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.SuggestionTitleV2"
+ android:ellipsize="end"
+ android:fadingEdge="horizontal" />
<TextView
android:id="@android:id/summary"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="12dp"
- android:layout_marginStart="6dp"
- android:layout_marginEnd="50dp"
+ style="@style/SuggestionCardText"
+ android:layout_marginStart="12dp"
+ android:layout_marginEnd="12dp"
android:textAppearance="@style/TextAppearance.SuggestionSummary" />
<Button
android:id="@android:id/primary"
style="@style/ActionPrimaryButton"
+ android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/suggestion_button_text" />
+
</LinearLayout>
-</LinearLayout>
\ No newline at end of file
+</android.support.v7.widget.CardView>
diff --git a/res/layout/suggestion_tile_with_button_v2.xml b/res/layout/suggestion_tile_with_button_v2.xml
deleted file mode 100644
index 7042341..0000000
--- a/res/layout/suggestion_tile_with_button_v2.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-
-<android.support.v7.widget.CardView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/suggestion_card"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:cardPreventCornerOverlap="false"
- app:cardUseCompatPadding="true"
- app:cardElevation="2dp"
- app:cardCornerRadius="@dimen/suggestion_card_corner_radius">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="112dp"
- android:orientation="vertical">
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="@dimen/suggestion_card_icon_size"
- android:layout_height="@dimen/suggestion_card_icon_size"
- style="@style/SuggestionCardIcon"
- android:layout_marginTop="16dp"
- android:layout_marginBottom="8dp" />
-
- <ImageView
- android:id="@+id/close_button"
- android:layout_width="18dp"
- android:layout_height="18dp"
- android:alpha="0.54"
- android:layout_alignParentEnd="true"
- android:layout_marginTop="8dp"
- android:layout_marginEnd="8dp"
- android:src="@drawable/ic_suggestion_close_button"/>
-
- </RelativeLayout>
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/SuggestionCardText"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.SuggestionTitleV2"
- android:ellipsize="end"
- android:fadingEdge="horizontal" />
-
- <TextView
- android:id="@android:id/summary"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="@style/SuggestionCardText"
- android:layout_marginStart="12dp"
- android:layout_marginEnd="12dp"
- android:textAppearance="@style/TextAppearance.SuggestionSummary" />
-
- <Button
- android:id="@android:id/primary"
- style="@style/ActionPrimaryButton"
- android:layout_gravity="center"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="12dp"
- android:text="@string/suggestion_button_text" />
-
- </LinearLayout>
-
-</android.support.v7.widget.CardView>
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 687442e..8fa1bb3 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -24,7 +24,6 @@
public static final String BATTERY_SETTINGS_V2 = "settings_battery_v2";
public static final String BATTERY_DISPLAY_APP_LIST = "settings_battery_display_app_list";
public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2";
- public static final String SUGGESTION_UI_V2 = "settings_suggestion_ui_v2";
public static final String ABOUT_PHONE_V2 = "settings_about_phone_v2";
public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving";
}
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 9b23417..8646683 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -17,9 +17,6 @@
import android.app.Activity;
import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Bundle;
@@ -41,44 +38,37 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.R.id;
-import com.android.settings.dashboard.DashboardData.SuggestionConditionHeaderData;
+import com.android.settings.dashboard.DashboardData.ConditionHeaderData;
import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapter;
import com.android.settings.dashboard.suggestions.SuggestionAdapter;
-import com.android.settings.dashboard.suggestions.SuggestionDismissController;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.Utils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.suggestions.SuggestionControllerMixin;
-import java.util.ArrayList;
import java.util.List;
public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
- implements SummaryLoader.SummaryConsumer {
+ implements SummaryLoader.SummaryConsumer, SuggestionAdapter.Callback, LifecycleObserver,
+ OnSaveInstanceState {
public static final String TAG = "DashboardAdapter";
- private static final String STATE_SUGGESTION_LIST = "suggestion_list";
private static final String STATE_CATEGORY_LIST = "category_list";
- private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
@VisibleForTesting
- static final String STATE_SUGGESTION_CONDITION_MODE = "suggestion_condition_mode";
- @VisibleForTesting
- static final int SUGGESTION_CONDITION_HEADER_POSITION = 0;
+ static final String STATE_CONDITION_EXPANDED = "condition_expanded";
private final IconCache mCache;
private final Context mContext;
- private final SuggestionControllerMixin mSuggestionControllerMixin;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private final DashboardFeatureProvider mDashboardFeatureProvider;
- private final ArrayList<String> mSuggestionsShownLogged;
private boolean mFirstFrameDrawn;
private RecyclerView mRecyclerView;
private SuggestionAdapter mSuggestionAdapter;
- private SuggestionDismissController mSuggestionDismissHandler;
- private SuggestionDismissController.Callback mCallback;
@VisibleForTesting
DashboardData mDashboardData;
@@ -92,57 +82,54 @@
};
public DashboardAdapter(Context context, Bundle savedInstanceState,
- List<Condition> conditions, SuggestionControllerMixin suggestionControllerMixin,
- SuggestionDismissController.Callback callback) {
+ List<Condition> conditions, SuggestionControllerMixin suggestionControllerMixin,
+ Lifecycle lifecycle) {
- List<Suggestion> suggestions = null;
DashboardCategory category = null;
- int suggestionConditionMode = DashboardData.HEADER_MODE_DEFAULT;
+ boolean conditionExpanded = false;
mContext = context;
final FeatureFactory factory = FeatureFactory.getFactory(context);
- mSuggestionControllerMixin = suggestionControllerMixin;
mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
mDashboardFeatureProvider = factory.getDashboardFeatureProvider(context);
mCache = new IconCache(context);
- mCallback = callback;
+ mSuggestionAdapter = new SuggestionAdapter(mContext, suggestionControllerMixin,
+ savedInstanceState, this /* callback */, lifecycle);
setHasStableIds(true);
if (savedInstanceState != null) {
- suggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
category = savedInstanceState.getParcelable(STATE_CATEGORY_LIST);
- suggestionConditionMode = savedInstanceState.getInt(
- STATE_SUGGESTION_CONDITION_MODE, suggestionConditionMode);
- mSuggestionsShownLogged = savedInstanceState.getStringArrayList(
- STATE_SUGGESTIONS_SHOWN_LOGGED);
- } else {
- mSuggestionsShownLogged = new ArrayList<>();
+ conditionExpanded = savedInstanceState.getBoolean(
+ STATE_CONDITION_EXPANDED, conditionExpanded);
+ }
+
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
}
mDashboardData = new DashboardData.Builder()
- .setConditions(conditions)
- .setSuggestions(suggestions)
- .setCategory(category)
- .setSuggestionConditionMode(suggestionConditionMode)
- .build();
+ .setConditions(conditions)
+ .setSuggestions(mSuggestionAdapter.getSuggestions())
+ .setCategory(category)
+ .setConditionExpanded(conditionExpanded)
+ .build();
}
public void setSuggestions(List<Suggestion> data) {
final DashboardData prevData = mDashboardData;
mDashboardData = new DashboardData.Builder(prevData)
- .setSuggestions(data)
- .build();
+ .setSuggestions(data)
+ .build();
notifyDashboardDataChanged(prevData);
}
public void setCategory(DashboardCategory category) {
- tintIcons(category, null);
final DashboardData prevData = mDashboardData;
Log.d(TAG, "adapter setCategory called");
mDashboardData = new DashboardData.Builder(prevData)
- .setCategory(category)
- .build();
+ .setCategory(category)
+ .build();
notifyDashboardDataChanged(prevData);
}
@@ -150,12 +137,13 @@
final DashboardData prevData = mDashboardData;
Log.d(TAG, "adapter setConditions called");
mDashboardData = new DashboardData.Builder(prevData)
- .setConditions(conditions)
- .build();
+ .setConditions(conditions)
+ .build();
notifyDashboardDataChanged(prevData);
}
- public void onSuggestionDismissed(Suggestion suggestion) {
+ @Override
+ public void onSuggestionClosed(Suggestion suggestion) {
final List<Suggestion> list = mDashboardData.getSuggestions();
if (list == null || list.size() == 0) {
return;
@@ -163,13 +151,10 @@
if (list.size() == 1) {
// The only suggestion is dismissed, and the the empty suggestion container will
// remain as the dashboard item. Need to refresh the dashboard list.
- final DashboardData prevData = mDashboardData;
- mDashboardData = new DashboardData.Builder(prevData)
- .setSuggestions(null)
- .build();
- notifyDashboardDataChanged(prevData);
+ setSuggestions(null);
} else {
mSuggestionAdapter.removeSuggestion(suggestion);
+ notifyItemChanged(0, null);
}
}
@@ -186,11 +171,14 @@
@Override
public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
- if (viewType == R.layout.suggestion_condition_header) {
- return new SuggestionAndConditionHeaderHolder(view);
+ if (viewType == R.layout.condition_header) {
+ return new ConditionHeaderHolder(view);
}
- if (viewType == R.layout.suggestion_condition_container) {
- return new SuggestionAndConditionContainerHolder(view);
+ if (viewType == R.layout.condition_container) {
+ return new ConditionContainerHolder(view);
+ }
+ if (viewType == R.layout.suggestion_container) {
+ return new SuggestionContainerHolder(view);
}
return new DashboardItemHolder(view);
}
@@ -205,24 +193,25 @@
holder.itemView.setTag(tile);
holder.itemView.setOnClickListener(mTileClickListener);
break;
- case R.layout.suggestion_condition_container:
- onBindConditionAndSuggestion(
- (SuggestionAndConditionContainerHolder) holder, position);
+ case R.layout.suggestion_container:
+ onBindSuggestion((SuggestionContainerHolder) holder, position);
break;
- case R.layout.suggestion_condition_header:
- onBindSuggestionConditionHeader((SuggestionAndConditionHeaderHolder) holder,
- (SuggestionConditionHeaderData)
- mDashboardData.getItemEntityByPosition(position));
+ case R.layout.condition_container:
+ onBindCondition((ConditionContainerHolder) holder, position);
break;
- case R.layout.suggestion_condition_footer:
+ case R.layout.condition_header:
+ onBindConditionHeader((ConditionHeaderHolder) holder,
+ (ConditionHeaderData) mDashboardData.getItemEntityByPosition(position));
+ break;
+ case R.layout.condition_footer:
holder.itemView.setOnClickListener(v -> {
mMetricsFeatureProvider.action(mContext,
- MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, false);
+ MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, false);
DashboardData prevData = mDashboardData;
- mDashboardData = new DashboardData.Builder(prevData).setSuggestionConditionMode(
- DashboardData.HEADER_MODE_COLLAPSED).build();
+ mDashboardData = new DashboardData.Builder(prevData).
+ setConditionExpanded(false).build();
notifyDashboardDataChanged(prevData);
- mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
+ scrollToTopOfConditions();
});
break;
}
@@ -263,7 +252,7 @@
void notifyDashboardDataChanged(DashboardData prevData) {
if (mFirstFrameDrawn && prevData != null) {
final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardData
- .ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList()));
+ .ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList()));
diffResult.dispatchUpdatesTo(this);
} else {
mFirstFrameDrawn = true;
@@ -272,120 +261,66 @@
}
@VisibleForTesting
- void onBindSuggestionConditionHeader(final SuggestionAndConditionHeaderHolder holder,
- SuggestionConditionHeaderData data) {
- final int curMode = mDashboardData.getSuggestionConditionMode();
- final int nextMode = data.hiddenSuggestionCount > 0
- && data.conditionCount > 0
- && curMode != DashboardData.HEADER_MODE_SUGGESTION_EXPANDED
- ? DashboardData.HEADER_MODE_SUGGESTION_EXPANDED
- : DashboardData.HEADER_MODE_FULLY_EXPANDED;
-
- final boolean hasConditions = data.conditionCount > 0;
- if (data.conditionCount > 0) {
- holder.icon.setImageIcon(data.conditionIcons.get(0));
- holder.icon.setVisibility(View.VISIBLE);
- if (data.conditionCount == 1) {
- holder.title.setText(data.title);
- holder.title.setTextColor(Utils.getColorAccent(mContext));
- holder.icons.setVisibility(View.INVISIBLE);
- } else {
- holder.title.setText(null);
- updateConditionIcons(data.conditionIcons, holder.icons);
- holder.icons.setVisibility(View.VISIBLE);
- }
- } else {
- holder.icon.setVisibility(View.INVISIBLE);
- holder.icons.setVisibility(View.INVISIBLE);
- }
-
- if (data.hiddenSuggestionCount > 0) {
- holder.summary.setTextColor(Color.BLACK);
- if (curMode == DashboardData.HEADER_MODE_COLLAPSED) {
- if (data.conditionCount > 0) {
- holder.summary.setText(mContext.getResources().getQuantityString(
- R.plurals.suggestions_collapsed_summary,
- data.hiddenSuggestionCount, data.hiddenSuggestionCount));
- } else {
- holder.title.setText(mContext.getResources().getQuantityString(
- R.plurals.suggestions_collapsed_title,
- data.hiddenSuggestionCount, data.hiddenSuggestionCount));
- holder.title.setTextColor(Color.BLACK);
- holder.summary.setText(null);
- }
- } else if (curMode == DashboardData.HEADER_MODE_DEFAULT) {
- if (data.conditionCount > 0) {
- holder.summary.setText(mContext.getString(
- R.string.suggestions_summary, data.hiddenSuggestionCount));
- } else {
- holder.title.setText(mContext.getString(
- R.string.suggestions_more_title, data.hiddenSuggestionCount));
- holder.title.setTextColor(Color.BLACK);
- holder.summary.setText(null);
- }
- }
- } else if (data.conditionCount > 1) {
- holder.summary.setTextColor(Utils.getColorAccent(mContext));
- holder.summary.setText(
- mContext.getString(R.string.condition_summary, data.conditionCount));
- } else {
+ void onBindConditionHeader(final ConditionHeaderHolder holder, ConditionHeaderData data) {
+ holder.icon.setImageIcon(data.conditionIcons.get(0));
+ if (data.conditionCount == 1) {
+ holder.title.setText(data.title);
holder.summary.setText(null);
+ holder.icons.setVisibility(View.INVISIBLE);
+ } else {
+ holder.title.setText(null);
+ holder.summary.setText(
+ mContext.getString(R.string.condition_summary, data.conditionCount));
+ updateConditionIcons(data.conditionIcons, holder.icons);
+ holder.icons.setVisibility(View.VISIBLE);
}
- final Resources res = mContext.getResources();
- final int padding = res.getDimensionPixelOffset(
- curMode == DashboardData.HEADER_MODE_COLLAPSED
- ? R.dimen.suggestion_condition_header_padding_collapsed
- : R.dimen.suggestion_condition_header_padding_expanded);
- holder.itemView.setPadding(0, padding, 0, padding);
-
holder.itemView.setOnClickListener(v -> {
- if (hasConditions) {
- mMetricsFeatureProvider.action(mContext,
- MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true);
- }
- DashboardData prevData = mDashboardData;
- final boolean wasCollapsed = curMode == DashboardData.HEADER_MODE_COLLAPSED;
+ mMetricsFeatureProvider.action(mContext,
+ MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true);
+ final DashboardData prevData = mDashboardData;
mDashboardData = new DashboardData.Builder(prevData)
- .setSuggestionConditionMode(nextMode).build();
+ .setConditionExpanded(true).build();
notifyDashboardDataChanged(prevData);
- if (wasCollapsed) {
- mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
- }
+ scrollToTopOfConditions();
});
}
@VisibleForTesting
- void onBindConditionAndSuggestion(final SuggestionAndConditionContainerHolder holder,
- int position) {
- // If there is suggestions to show, it will be at position 0 as we don't show the suggestion
- // header anymore.
- final List<Suggestion> suggestions = mDashboardData.getSuggestions();
-
- boolean conditionOnly = true;
- if (position == SUGGESTION_CONDITION_HEADER_POSITION) {
- if (suggestions != null && suggestions.size() > 0) {
- conditionOnly = false;
- mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
- (List<Suggestion>) mDashboardData.getItemEntityByPosition(position),
- mSuggestionsShownLogged);
- mSuggestionDismissHandler = new SuggestionDismissController(mContext,
- holder.data, mSuggestionControllerMixin, mCallback);
- holder.data.setAdapter(mSuggestionAdapter);
- }
- }
- if (conditionOnly) {
- ConditionAdapter adapter = new ConditionAdapter(mContext,
- (List<Condition>) mDashboardData.getItemEntityByPosition(position),
- mDashboardData.getSuggestionConditionMode());
- adapter.addDismissHandling(holder.data);
- holder.data.setAdapter(adapter);
- }
+ void onBindCondition(final ConditionContainerHolder holder, int position) {
+ final ConditionAdapter adapter = new ConditionAdapter(mContext,
+ (List<Condition>) mDashboardData.getItemEntityByPosition(position),
+ mDashboardData.isConditionExpanded());
+ adapter.addDismissHandling(holder.data);
+ holder.data.setAdapter(adapter);
holder.data.setLayoutManager(new LinearLayoutManager(mContext));
}
- private void onBindTile(DashboardItemHolder holder, Tile tile) {
- holder.icon.setImageDrawable(mCache.getIcon(tile.icon));
+ @VisibleForTesting
+ void onBindSuggestion(final SuggestionContainerHolder holder, int position) {
+ // If there is suggestions to show, it will be at position 0 as we don't show the suggestion
+ // header anymore.
+ final List<Suggestion> suggestions =
+ (List<Suggestion>) mDashboardData.getItemEntityByPosition(position);
+ final int suggestionCount = suggestions.size();
+ if (suggestions != null && suggestionCount > 0) {
+ holder.summary.setText("" + suggestionCount);
+ mSuggestionAdapter.setSuggestions(suggestions);
+ holder.data.setAdapter(mSuggestionAdapter);
+ }
+ final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
+ layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
+ holder.data.setLayoutManager(layoutManager);
+ }
+
+ @VisibleForTesting
+ void onBindTile(DashboardItemHolder holder, Tile tile) {
+ Drawable icon = mCache.getIcon(tile.icon);
+ if (!TextUtils.equals(tile.icon.getResPackage(), mContext.getPackageName())) {
+ icon = new RoundedHomepageIcon(mContext, icon);
+ mCache.updateIcon(tile.icon, icon);
+ }
+ holder.icon.setImageDrawable(icon);
holder.title.setText(tile.title);
if (!TextUtils.isEmpty(tile.summary)) {
holder.summary.setText(tile.summary);
@@ -395,45 +330,13 @@
}
}
- private void tintIcons(DashboardCategory category, List<Tile> suggestions) {
- if (!mDashboardFeatureProvider.shouldTintIcon()) {
- return;
- }
- // TODO: Better place for tinting?
- final TypedArray a = mContext.obtainStyledAttributes(new int[]{
- android.R.attr.colorControlNormal});
- final int tintColor = a.getColor(0, mContext.getColor(R.color.fallback_tintColor));
- a.recycle();
- if (category != null) {
- for (Tile tile : category.getTiles()) {
- if (tile.isIconTintable) {
- // If this drawable is tintable, tint it to match the color.
- tile.icon.setTint(tintColor);
- }
- }
- }
- if (suggestions != null) {
- for (Tile suggestion : suggestions) {
- if (suggestion.isIconTintable) {
- suggestion.icon.setTint(tintColor);
- }
- }
- }
- }
-
- void onSaveInstanceState(Bundle outState) {
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
final DashboardCategory category = mDashboardData.getCategory();
- final List<Suggestion> suggestions = mDashboardData.getSuggestions();
- if (suggestions != null) {
- outState.putParcelableArrayList(STATE_SUGGESTION_LIST,
- new ArrayList<>(suggestions));
- }
if (category != null) {
outState.putParcelable(STATE_CATEGORY_LIST, category);
}
- outState.putStringArrayList(STATE_SUGGESTIONS_SHOWN_LOGGED, mSuggestionsShownLogged);
- outState.putInt(STATE_SUGGESTION_CONDITION_MODE,
- mDashboardData.getSuggestionConditionMode());
+ outState.putBoolean(STATE_CONDITION_EXPANDED, mDashboardData.isConditionExpanded());
}
private void updateConditionIcons(List<Icon> icons, ViewGroup parent) {
@@ -452,6 +355,10 @@
parent.setVisibility(View.VISIBLE);
}
+ private void scrollToTopOfConditions() {
+ mRecyclerView.scrollToPosition(mDashboardData.hasSuggestion() ? 1 : 0);
+ }
+
public static class IconCache {
private final Context mContext;
private final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
@@ -467,10 +374,14 @@
Drawable drawable = mMap.get(icon);
if (drawable == null) {
drawable = icon.loadDrawable(mContext);
- mMap.put(icon, drawable);
+ updateIcon(icon, drawable);
}
return drawable;
}
+
+ public void updateIcon(Icon icon, Drawable drawable) {
+ mMap.put(icon, drawable);
+ }
}
public static class DashboardItemHolder extends RecyclerView.ViewHolder {
@@ -486,24 +397,33 @@
}
}
- public static class SuggestionAndConditionHeaderHolder extends DashboardItemHolder {
+ public static class ConditionHeaderHolder extends DashboardItemHolder {
public final LinearLayout icons;
public final ImageView expandIndicator;
- public SuggestionAndConditionHeaderHolder(View itemView) {
+ public ConditionHeaderHolder(View itemView) {
super(itemView);
icons = itemView.findViewById(id.additional_icons);
expandIndicator = itemView.findViewById(id.expand_indicator);
}
}
- public static class SuggestionAndConditionContainerHolder extends DashboardItemHolder {
+ public static class ConditionContainerHolder extends DashboardItemHolder {
public final RecyclerView data;
- public SuggestionAndConditionContainerHolder(View itemView) {
+ public ConditionContainerHolder(View itemView) {
super(itemView);
data = itemView.findViewById(id.data);
}
}
+ public static class SuggestionContainerHolder extends DashboardItemHolder {
+ public final RecyclerView data;
+
+ public SuggestionContainerHolder(View itemView) {
+ super(itemView);
+ data = itemView.findViewById(id.suggestion_list);
+ }
+ }
+
}
diff --git a/src/com/android/settings/dashboard/DashboardAdapterV2.java b/src/com/android/settings/dashboard/DashboardAdapterV2.java
deleted file mode 100644
index f98b440..0000000
--- a/src/com/android/settings/dashboard/DashboardAdapterV2.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-import android.service.settings.suggestions.Suggestion;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.util.DiffUtil;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.R.id;
-import com.android.settings.dashboard.DashboardDataV2.ConditionHeaderData;
-import com.android.settings.dashboard.conditional.Condition;
-import com.android.settings.dashboard.conditional.ConditionAdapterV2;
-import com.android.settings.dashboard.suggestions.SuggestionAdapterV2;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
-import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionControllerMixin;
-
-import java.util.List;
-
-public class DashboardAdapterV2 extends RecyclerView.Adapter<DashboardAdapterV2.DashboardItemHolder>
- implements SummaryLoader.SummaryConsumer, SuggestionAdapterV2.Callback, LifecycleObserver,
- OnSaveInstanceState {
- public static final String TAG = "DashboardAdapterV2";
- private static final String STATE_CATEGORY_LIST = "category_list";
-
- @VisibleForTesting
- static final String STATE_CONDITION_EXPANDED = "condition_expanded";
-
- private final IconCache mCache;
- private final Context mContext;
- private final MetricsFeatureProvider mMetricsFeatureProvider;
- private final DashboardFeatureProvider mDashboardFeatureProvider;
- private boolean mFirstFrameDrawn;
- private RecyclerView mRecyclerView;
- private SuggestionAdapterV2 mSuggestionAdapter;
-
- @VisibleForTesting
- DashboardDataV2 mDashboardData;
-
- private View.OnClickListener mTileClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //TODO: get rid of setTag/getTag
- mDashboardFeatureProvider.openTileIntent((Activity) mContext, (Tile) v.getTag());
- }
- };
-
- public DashboardAdapterV2(Context context, Bundle savedInstanceState,
- List<Condition> conditions, SuggestionControllerMixin suggestionControllerMixin,
- Lifecycle lifecycle) {
-
- DashboardCategory category = null;
- boolean conditionExpanded = false;
-
- mContext = context;
- final FeatureFactory factory = FeatureFactory.getFactory(context);
- mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
- mDashboardFeatureProvider = factory.getDashboardFeatureProvider(context);
- mCache = new IconCache(context);
- mSuggestionAdapter = new SuggestionAdapterV2(mContext, suggestionControllerMixin,
- savedInstanceState, this /* callback */, lifecycle);
-
- setHasStableIds(true);
-
- if (savedInstanceState != null) {
- category = savedInstanceState.getParcelable(STATE_CATEGORY_LIST);
- conditionExpanded = savedInstanceState.getBoolean(
- STATE_CONDITION_EXPANDED, conditionExpanded);
- }
-
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
-
- mDashboardData = new DashboardDataV2.Builder()
- .setConditions(conditions)
- .setSuggestions(mSuggestionAdapter.getSuggestions())
- .setCategory(category)
- .setConditionExpanded(conditionExpanded)
- .build();
- }
-
- public void setSuggestions(List<Suggestion> data) {
- final DashboardDataV2 prevData = mDashboardData;
- mDashboardData = new DashboardDataV2.Builder(prevData)
- .setSuggestions(data)
- .build();
- notifyDashboardDataChanged(prevData);
- }
-
- public void setCategory(DashboardCategory category) {
- final DashboardDataV2 prevData = mDashboardData;
- Log.d(TAG, "adapter setCategory called");
- mDashboardData = new DashboardDataV2.Builder(prevData)
- .setCategory(category)
- .build();
- notifyDashboardDataChanged(prevData);
- }
-
- public void setConditions(List<Condition> conditions) {
- final DashboardDataV2 prevData = mDashboardData;
- Log.d(TAG, "adapter setConditions called");
- mDashboardData = new DashboardDataV2.Builder(prevData)
- .setConditions(conditions)
- .build();
- notifyDashboardDataChanged(prevData);
- }
-
- @Override
- public void onSuggestionClosed(Suggestion suggestion) {
- final List<Suggestion> list = mDashboardData.getSuggestions();
- if (list == null || list.size() == 0) {
- return;
- }
- if (list.size() == 1) {
- // The only suggestion is dismissed, and the the empty suggestion container will
- // remain as the dashboard item. Need to refresh the dashboard list.
- setSuggestions(null);
- } else {
- mSuggestionAdapter.removeSuggestion(suggestion);
- notifyItemChanged(0, null);
- }
- }
-
- @Override
- public void notifySummaryChanged(Tile tile) {
- final int position = mDashboardData.getPositionByTile(tile);
- if (position != DashboardDataV2.POSITION_NOT_FOUND) {
- // Since usually tile in parameter and tile in mCategories are same instance,
- // which is hard to be detected by DiffUtil, so we notifyItemChanged directly.
- notifyItemChanged(position, mDashboardData.getItemTypeByPosition(position));
- }
- }
-
- @Override
- public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
- if (viewType == R.layout.suggestion_condition_header) {
- return new ConditionHeaderHolder(view);
- }
- if (viewType == R.layout.condition_container) {
- return new ConditionContainerHolder(view);
- }
- if (viewType == R.layout.suggestion_container) {
- return new SuggestionContainerHolder(view);
- }
- return new DashboardItemHolder(view);
- }
-
- @Override
- public void onBindViewHolder(DashboardItemHolder holder, int position) {
- final int type = mDashboardData.getItemTypeByPosition(position);
- switch (type) {
- case R.layout.dashboard_tile:
- final Tile tile = (Tile) mDashboardData.getItemEntityByPosition(position);
- onBindTile(holder, tile);
- holder.itemView.setTag(tile);
- holder.itemView.setOnClickListener(mTileClickListener);
- break;
- case R.layout.suggestion_container:
- onBindSuggestion((SuggestionContainerHolder) holder, position);
- break;
- case R.layout.condition_container:
- onBindCondition((ConditionContainerHolder) holder, position);
- break;
- case R.layout.suggestion_condition_header:
- onBindConditionHeader((ConditionHeaderHolder) holder,
- (ConditionHeaderData) mDashboardData.getItemEntityByPosition(position));
- break;
- case R.layout.suggestion_condition_footer:
- holder.itemView.setOnClickListener(v -> {
- mMetricsFeatureProvider.action(mContext,
- MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, false);
- DashboardDataV2 prevData = mDashboardData;
- mDashboardData = new DashboardDataV2.Builder(prevData).
- setConditionExpanded(false).build();
- notifyDashboardDataChanged(prevData);
- scrollToTopOfConditions();
- });
- break;
- }
- }
-
- @Override
- public long getItemId(int position) {
- return mDashboardData.getItemIdByPosition(position);
- }
-
- @Override
- public int getItemViewType(int position) {
- return mDashboardData.getItemTypeByPosition(position);
- }
-
- @Override
- public int getItemCount() {
- return mDashboardData.size();
- }
-
- @Override
- public void onAttachedToRecyclerView(RecyclerView recyclerView) {
- super.onAttachedToRecyclerView(recyclerView);
- // save the view so that we can scroll it when expanding/collapsing the suggestion and
- // conditions.
- mRecyclerView = recyclerView;
- }
-
- public Object getItem(long itemId) {
- return mDashboardData.getItemEntityById(itemId);
- }
-
- public Suggestion getSuggestion(int position) {
- return mSuggestionAdapter.getSuggestion(position);
- }
-
- @VisibleForTesting
- void notifyDashboardDataChanged(DashboardDataV2 prevData) {
- if (mFirstFrameDrawn && prevData != null) {
- final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DashboardDataV2
- .ItemsDataDiffCallback(prevData.getItemList(), mDashboardData.getItemList()));
- diffResult.dispatchUpdatesTo(this);
- } else {
- mFirstFrameDrawn = true;
- notifyDataSetChanged();
- }
- }
-
- @VisibleForTesting
- void onBindConditionHeader(final ConditionHeaderHolder holder, ConditionHeaderData data) {
- holder.icon.setImageIcon(data.conditionIcons.get(0));
- if (data.conditionCount == 1) {
- holder.title.setText(data.title);
- holder.summary.setText(null);
- holder.icons.setVisibility(View.INVISIBLE);
- } else {
- holder.title.setText(null);
- holder.summary.setText(
- mContext.getString(R.string.condition_summary, data.conditionCount));
- updateConditionIcons(data.conditionIcons, holder.icons);
- holder.icons.setVisibility(View.VISIBLE);
- }
-
- holder.itemView.setOnClickListener(v -> {
- mMetricsFeatureProvider.action(mContext,
- MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true);
- final DashboardDataV2 prevData = mDashboardData;
- mDashboardData = new DashboardDataV2.Builder(prevData)
- .setConditionExpanded(true).build();
- notifyDashboardDataChanged(prevData);
- scrollToTopOfConditions();
- });
- }
-
- @VisibleForTesting
- void onBindCondition(final ConditionContainerHolder holder, int position) {
- final ConditionAdapterV2 adapter = new ConditionAdapterV2(mContext,
- (List<Condition>) mDashboardData.getItemEntityByPosition(position),
- mDashboardData.isConditionExpanded());
- adapter.addDismissHandling(holder.data);
- holder.data.setAdapter(adapter);
- holder.data.setLayoutManager(new LinearLayoutManager(mContext));
- }
-
- @VisibleForTesting
- void onBindSuggestion(final SuggestionContainerHolder holder, int position) {
- // If there is suggestions to show, it will be at position 0 as we don't show the suggestion
- // header anymore.
- final List<Suggestion> suggestions =
- (List<Suggestion>) mDashboardData.getItemEntityByPosition(position);
- final int suggestionCount = suggestions.size();
- if (suggestions != null && suggestionCount > 0) {
- holder.summary.setText("" + suggestionCount);
- mSuggestionAdapter.setSuggestions(suggestions);
- holder.data.setAdapter(mSuggestionAdapter);
- }
- final LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
- layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
- holder.data.setLayoutManager(layoutManager);
- }
-
- @VisibleForTesting
- void onBindTile(DashboardItemHolder holder, Tile tile) {
- Drawable icon = mCache.getIcon(tile.icon);
- if (!TextUtils.equals(tile.icon.getResPackage(), mContext.getPackageName())) {
- icon = new RoundedHomepageIcon(mContext, icon);
- mCache.updateIcon(tile.icon, icon);
- }
- holder.icon.setImageDrawable(icon);
- holder.title.setText(tile.title);
- if (!TextUtils.isEmpty(tile.summary)) {
- holder.summary.setText(tile.summary);
- holder.summary.setVisibility(View.VISIBLE);
- } else {
- holder.summary.setVisibility(View.GONE);
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- final DashboardCategory category = mDashboardData.getCategory();
- if (category != null) {
- outState.putParcelable(STATE_CATEGORY_LIST, category);
- }
- outState.putBoolean(STATE_CONDITION_EXPANDED, mDashboardData.isConditionExpanded());
- }
-
- private void updateConditionIcons(List<Icon> icons, ViewGroup parent) {
- if (icons == null || icons.size() < 2) {
- parent.setVisibility(View.INVISIBLE);
- return;
- }
- final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
- parent.removeAllViews();
- for (int i = 1, size = icons.size(); i < size; i++) {
- ImageView icon = (ImageView) inflater.inflate(
- R.layout.condition_header_icon, parent, false);
- icon.setImageIcon(icons.get(i));
- parent.addView(icon);
- }
- parent.setVisibility(View.VISIBLE);
- }
-
- private void scrollToTopOfConditions() {
- mRecyclerView.scrollToPosition(mDashboardData.hasSuggestion() ? 1 : 0);
- }
-
- public static class IconCache {
- private final Context mContext;
- private final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
-
- public IconCache(Context context) {
- mContext = context;
- }
-
- public Drawable getIcon(Icon icon) {
- if (icon == null) {
- return null;
- }
- Drawable drawable = mMap.get(icon);
- if (drawable == null) {
- drawable = icon.loadDrawable(mContext);
- updateIcon(icon, drawable);
- }
- return drawable;
- }
-
- public void updateIcon(Icon icon, Drawable drawable) {
- mMap.put(icon, drawable);
- }
- }
-
- public static class DashboardItemHolder extends RecyclerView.ViewHolder {
- public final ImageView icon;
- public final TextView title;
- public final TextView summary;
-
- public DashboardItemHolder(View itemView) {
- super(itemView);
- icon = itemView.findViewById(android.R.id.icon);
- title = itemView.findViewById(android.R.id.title);
- summary = itemView.findViewById(android.R.id.summary);
- }
- }
-
- public static class ConditionHeaderHolder extends DashboardItemHolder {
- public final LinearLayout icons;
- public final ImageView expandIndicator;
-
- public ConditionHeaderHolder(View itemView) {
- super(itemView);
- icons = itemView.findViewById(id.additional_icons);
- expandIndicator = itemView.findViewById(id.expand_indicator);
- }
- }
-
- public static class ConditionContainerHolder extends DashboardItemHolder {
- public final RecyclerView data;
-
- public ConditionContainerHolder(View itemView) {
- super(itemView);
- data = itemView.findViewById(id.data);
- }
- }
-
- public static class SuggestionContainerHolder extends DashboardItemHolder {
- public final RecyclerView data;
-
- public SuggestionContainerHolder(View itemView) {
- super(itemView);
- data = itemView.findViewById(id.suggestion_list);
- }
- }
-
-}
diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java
index da2a526..49de94d 100644
--- a/src/com/android/settings/dashboard/DashboardData.java
+++ b/src/com/android/settings/dashboard/DashboardData.java
@@ -40,29 +40,17 @@
* ItemsData has inner class Item, which represents the Item in data list.
*/
public class DashboardData {
- public static final int HEADER_MODE_DEFAULT = 0;
- public static final int HEADER_MODE_SUGGESTION_EXPANDED = 1;
- public static final int HEADER_MODE_FULLY_EXPANDED = 2;
- public static final int HEADER_MODE_COLLAPSED = 3;
-
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({HEADER_MODE_DEFAULT, HEADER_MODE_SUGGESTION_EXPANDED, HEADER_MODE_FULLY_EXPANDED,
- HEADER_MODE_COLLAPSED})
- public @interface HeaderMode {
- }
-
public static final int POSITION_NOT_FOUND = -1;
- public static final int DEFAULT_SUGGESTION_COUNT = 2;
+ public static final int MAX_SUGGESTION_COUNT = 4;
// stable id for different type of items.
@VisibleForTesting
- static final int STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER = 0;
+ static final int STABLE_ID_SUGGESTION_CONTAINER = 0;
+ static final int STABLE_ID_SUGGESTION_CONDITION_DIVIDER = 1;
@VisibleForTesting
- static final int STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER = 1;
+ static final int STABLE_ID_CONDITION_HEADER = 2;
@VisibleForTesting
- static final int STABLE_ID_SUGGESTION_CONDITION_FOOTER = 2;
- @VisibleForTesting
- static final int STABLE_ID_SUGGESTION_CONTAINER = 3;
+ static final int STABLE_ID_CONDITION_FOOTER = 3;
@VisibleForTesting
static final int STABLE_ID_CONDITION_CONTAINER = 4;
@@ -70,15 +58,13 @@
private final DashboardCategory mCategory;
private final List<Condition> mConditions;
private final List<Suggestion> mSuggestions;
- @HeaderMode
- private final int mSuggestionConditionMode;
+ private final boolean mConditionExpanded;
private DashboardData(Builder builder) {
mCategory = builder.mCategory;
mConditions = builder.mConditions;
- mSuggestions = builder.mSuggestionsV2;
- mSuggestionConditionMode = builder.mSuggestionConditionMode;
-
+ mSuggestions = builder.mSuggestions;
+ mConditionExpanded = builder.mConditionExpanded;
mItems = new ArrayList<>();
buildItemsData();
@@ -125,8 +111,12 @@
return mSuggestions;
}
- public int getSuggestionConditionMode() {
- return mSuggestionConditionMode;
+ public boolean hasSuggestion() {
+ return sizeOf(mSuggestions) > 0;
+ }
+
+ public boolean isConditionExpanded() {
+ return mConditionExpanded;
}
/**
@@ -188,69 +178,42 @@
/**
* Build the mItems list using mConditions, mSuggestions, mCategories data
- * and mIsShowingAll, mSuggestionConditionMode flag.
+ * and mIsShowingAll, mConditionExpanded flag.
*/
private void buildItemsData() {
- final boolean hasSuggestions = sizeOf(mSuggestions) > 0;
final List<Condition> conditions = getConditionsToShow(mConditions);
final boolean hasConditions = sizeOf(conditions) > 0;
final List<Suggestion> suggestions = getSuggestionsToShow(mSuggestions);
+ final boolean hasSuggestions = sizeOf(suggestions) > 0;
- final int hiddenSuggestion = hasSuggestions
- ? sizeOf(mSuggestions) - sizeOf(suggestions)
- : 0;
+ /* Suggestion container. This is the card view that contains the list of suggestions.
+ * This will be added whenever the suggestion list is not empty */
+ addToItemList(suggestions, R.layout.suggestion_container,
+ STABLE_ID_SUGGESTION_CONTAINER, hasSuggestions);
- final boolean hasSuggestionAndCollapsed = hasSuggestions
- && mSuggestionConditionMode == HEADER_MODE_COLLAPSED;
- final boolean onlyHasConditionAndCollapsed = !hasSuggestions
- && hasConditions
- && mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED;
+ /* Divider between suggestion and conditions if both are present. */
+ addToItemList(null /* item */, R.layout.horizontal_divider,
+ STABLE_ID_SUGGESTION_CONDITION_DIVIDER, hasSuggestions && hasConditions);
- /* Top suggestion/condition header. This will be present when there is any suggestion
- * and the mode is collapsed */
- addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
- R.layout.suggestion_condition_header,
- STABLE_ID_SUGGESTION_CONDITION_TOP_HEADER, hasSuggestionAndCollapsed);
+ /* Condition header. This will be present when there is condition and it is collapsed */
+ addToItemList(new ConditionHeaderData(conditions),
+ R.layout.condition_header,
+ STABLE_ID_CONDITION_HEADER, hasConditions && !mConditionExpanded);
- /* Use mid header if there is only condition & it's in collapsed mode */
- addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
- R.layout.suggestion_condition_header,
- STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER, onlyHasConditionAndCollapsed);
+ /* Condition container. This is the card view that contains the list of conditions.
+ * This will be added whenever the condition list is not empty and expanded */
+ addToItemList(conditions, R.layout.condition_container,
+ STABLE_ID_CONDITION_CONTAINER, hasConditions && mConditionExpanded);
- addToItemList(suggestions, R.layout.suggestion_condition_container,
- STABLE_ID_SUGGESTION_CONTAINER, sizeOf(suggestions) > 0);
-
- /* Second suggestion/condition header. This will be added when there is at least one
- * suggestion or condition that is not currently displayed, and the user can expand the
- * section to view more items. */
- addToItemList(new SuggestionConditionHeaderData(conditions, hiddenSuggestion),
- R.layout.suggestion_condition_header,
- STABLE_ID_SUGGESTION_CONDITION_MIDDLE_HEADER,
- mSuggestionConditionMode != HEADER_MODE_COLLAPSED
- && mSuggestionConditionMode != HEADER_MODE_FULLY_EXPANDED
- && (hiddenSuggestion > 0 || hasConditions && hasSuggestions));
-
- /* Condition container. This is the card view that contains the list of conditions.
- * This will be added whenever the condition list is not empty */
- addToItemList(conditions, R.layout.suggestion_condition_container,
- STABLE_ID_CONDITION_CONTAINER,
- hasConditions && mSuggestionConditionMode == HEADER_MODE_FULLY_EXPANDED);
-
- /* Suggestion/condition footer. This will be present when the section is fully expanded
- * or when there is no conditions and no hidden suggestions */
- addToItemList(null /* item */, R.layout.suggestion_condition_footer,
- STABLE_ID_SUGGESTION_CONDITION_FOOTER,
- (hasConditions || hasSuggestions)
- && mSuggestionConditionMode == HEADER_MODE_FULLY_EXPANDED
- || hasSuggestions
- && !hasConditions
- && hiddenSuggestion == 0);
+ /* Condition footer. This will be present when there is condition and it is expanded */
+ addToItemList(null /* item */, R.layout.condition_footer,
+ STABLE_ID_CONDITION_FOOTER, hasConditions && mConditionExpanded);
if (mCategory != null) {
final List<Tile> tiles = mCategory.getTiles();
- for (int j = 0; j < tiles.size(); j++) {
- final Tile tile = tiles.get(j);
+ for (int i = 0; i < tiles.size(); i++) {
+ final Tile tile = tiles.get(i);
addToItemList(tile, R.layout.dashboard_tile, Objects.hash(tile.title),
true /* add */);
}
@@ -277,28 +240,23 @@
}
private List<Suggestion> getSuggestionsToShow(List<Suggestion> suggestions) {
- if (suggestions == null || mSuggestionConditionMode == HEADER_MODE_COLLAPSED) {
+ if (suggestions == null) {
return null;
}
- if (mSuggestionConditionMode != HEADER_MODE_DEFAULT
- || suggestions.size() <= DEFAULT_SUGGESTION_COUNT) {
+ if (suggestions.size() <= MAX_SUGGESTION_COUNT) {
return suggestions;
}
- return suggestions.subList(0, DEFAULT_SUGGESTION_COUNT);
+ return suggestions.subList(0, MAX_SUGGESTION_COUNT);
}
/**
* Builder used to build the ItemsData
- * <p>
- * {@link #mSuggestionConditionMode} have default value while others are not.
*/
public static class Builder {
- @HeaderMode
- private int mSuggestionConditionMode = HEADER_MODE_DEFAULT;
-
private DashboardCategory mCategory;
private List<Condition> mConditions;
- private List<Suggestion> mSuggestionsV2;
+ private List<Suggestion> mSuggestions;
+ private boolean mConditionExpanded;
public Builder() {
}
@@ -306,8 +264,8 @@
public Builder(DashboardData dashboardData) {
mCategory = dashboardData.mCategory;
mConditions = dashboardData.mConditions;
- mSuggestionsV2 = dashboardData.mSuggestions;
- mSuggestionConditionMode = dashboardData.mSuggestionConditionMode;
+ mSuggestions = dashboardData.mSuggestions;
+ mConditionExpanded = dashboardData.mConditionExpanded;
}
public Builder setCategory(DashboardCategory category) {
@@ -321,12 +279,12 @@
}
public Builder setSuggestions(List<Suggestion> suggestions) {
- this.mSuggestionsV2 = suggestions;
+ this.mSuggestions = suggestions;
return this;
}
- public Builder setSuggestionConditionMode(@HeaderMode int mode) {
- this.mSuggestionConditionMode = mode;
+ public Builder setConditionExpanded(boolean expanded) {
+ this.mConditionExpanded = expanded;
return this;
}
@@ -376,17 +334,18 @@
static class Item {
// valid types in field type
private static final int TYPE_DASHBOARD_TILE = R.layout.dashboard_tile;
- private static final int TYPE_SUGGESTION_CONDITION_CONTAINER =
- R.layout.suggestion_condition_container;
- private static final int TYPE_SUGGESTION_CONDITION_HEADER =
- R.layout.suggestion_condition_header;
- private static final int TYPE_SUGGESTION_CONDITION_FOOTER =
- R.layout.suggestion_condition_footer;
- private static final int TYPE_DASHBOARD_SPACER = R.layout.dashboard_spacer;
+ private static final int TYPE_SUGGESTION_CONTAINER =
+ R.layout.suggestion_container;
+ private static final int TYPE_CONDITION_CONTAINER =
+ R.layout.condition_container;
+ private static final int TYPE_CONDITION_HEADER =
+ R.layout.condition_header;
+ private static final int TYPE_CONDITION_FOOTER =
+ R.layout.condition_footer;
+ private static final int TYPE_SUGGESTION_CONDITION_DIVIDER = R.layout.horizontal_divider;
- @IntDef({TYPE_DASHBOARD_TILE, TYPE_SUGGESTION_CONDITION_CONTAINER,
- TYPE_SUGGESTION_CONDITION_HEADER, TYPE_SUGGESTION_CONDITION_FOOTER,
- TYPE_DASHBOARD_SPACER})
+ @IntDef({TYPE_DASHBOARD_TILE, TYPE_SUGGESTION_CONTAINER, TYPE_CONDITION_CONTAINER,
+ TYPE_CONDITION_HEADER, TYPE_CONDITION_FOOTER, TYPE_SUGGESTION_CONDITION_DIVIDER})
@Retention(RetentionPolicy.SOURCE)
public @interface ItemTypes {
}
@@ -444,8 +403,9 @@
// Only check title and summary for dashboard tile
return TextUtils.equals(localTile.title, targetTile.title)
- && TextUtils.equals(localTile.summary, targetTile.summary);
- case TYPE_SUGGESTION_CONDITION_CONTAINER:
+ && TextUtils.equals(localTile.summary, targetTile.summary);
+ case TYPE_SUGGESTION_CONTAINER:
+ case TYPE_CONDITION_CONTAINER:
// If entity is suggestion and contains remote view, force refresh
final List entities = (List) entity;
if (!entities.isEmpty()) {
@@ -467,16 +427,13 @@
* This class contains the data needed to build the suggestion/condition header. The data can
* also be used to check the diff in DiffUtil.Callback
*/
- public static class SuggestionConditionHeaderData {
+ public static class ConditionHeaderData {
public final List<Icon> conditionIcons;
public final CharSequence title;
public final int conditionCount;
- public final int hiddenSuggestionCount;
- public SuggestionConditionHeaderData(List<Condition> conditions,
- int hiddenSuggestionCount) {
+ public ConditionHeaderData(List<Condition> conditions) {
conditionCount = sizeOf(conditions);
- this.hiddenSuggestionCount = hiddenSuggestionCount;
title = conditionCount > 0 ? conditions.get(0).getTitle() : null;
conditionIcons = new ArrayList<>();
for (int i = 0; conditions != null && i < conditions.size(); i++) {
diff --git a/src/com/android/settings/dashboard/DashboardDataV2.java b/src/com/android/settings/dashboard/DashboardDataV2.java
deleted file mode 100644
index e25ee05..0000000
--- a/src/com/android/settings/dashboard/DashboardDataV2.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard;
-
-import android.annotation.IntDef;
-import android.graphics.drawable.Icon;
-import android.service.settings.suggestions.Suggestion;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.util.DiffUtil;
-import android.text.TextUtils;
-
-import com.android.settings.R;
-import com.android.settings.dashboard.conditional.Condition;
-import com.android.settingslib.drawer.DashboardCategory;
-import com.android.settingslib.drawer.Tile;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Description about data list used in the DashboardAdapter. In the data list each item can be
- * Condition, suggestion or category tile.
- * <p>
- * ItemsData has inner class Item, which represents the Item in data list.
- */
-public class DashboardDataV2 {
- public static final int POSITION_NOT_FOUND = -1;
- public static final int MAX_SUGGESTION_COUNT = 4;
-
- // stable id for different type of items.
- @VisibleForTesting
- static final int STABLE_ID_SUGGESTION_CONTAINER = 0;
- static final int STABLE_ID_SUGGESTION_CONDITION_DIVIDER = 1;
- @VisibleForTesting
- static final int STABLE_ID_CONDITION_HEADER = 2;
- @VisibleForTesting
- static final int STABLE_ID_CONDITION_FOOTER = 3;
- @VisibleForTesting
- static final int STABLE_ID_CONDITION_CONTAINER = 4;
-
- private final List<Item> mItems;
- private final DashboardCategory mCategory;
- private final List<Condition> mConditions;
- private final List<Suggestion> mSuggestions;
- private final boolean mConditionExpanded;
-
- private DashboardDataV2(Builder builder) {
- mCategory = builder.mCategory;
- mConditions = builder.mConditions;
- mSuggestions = builder.mSuggestions;
- mConditionExpanded = builder.mConditionExpanded;
- mItems = new ArrayList<>();
-
- buildItemsData();
- }
-
- public int getItemIdByPosition(int position) {
- return mItems.get(position).id;
- }
-
- public int getItemTypeByPosition(int position) {
- return mItems.get(position).type;
- }
-
- public Object getItemEntityByPosition(int position) {
- return mItems.get(position).entity;
- }
-
- public List<Item> getItemList() {
- return mItems;
- }
-
- public int size() {
- return mItems.size();
- }
-
- public Object getItemEntityById(long id) {
- for (final Item item : mItems) {
- if (item.id == id) {
- return item.entity;
- }
- }
- return null;
- }
-
- public DashboardCategory getCategory() {
- return mCategory;
- }
-
- public List<Condition> getConditions() {
- return mConditions;
- }
-
- public List<Suggestion> getSuggestions() {
- return mSuggestions;
- }
-
- public boolean hasSuggestion() {
- return sizeOf(mSuggestions) > 0;
- }
-
- public boolean isConditionExpanded() {
- return mConditionExpanded;
- }
-
- /**
- * Find the position of the object in mItems list, using the equals method to compare
- *
- * @param entity the object that need to be found in list
- * @return position of the object, return POSITION_NOT_FOUND if object isn't in the list
- */
- public int getPositionByEntity(Object entity) {
- if (entity == null) return POSITION_NOT_FOUND;
-
- final int size = mItems.size();
- for (int i = 0; i < size; i++) {
- final Object item = mItems.get(i).entity;
- if (entity.equals(item)) {
- return i;
- }
- }
-
- return POSITION_NOT_FOUND;
- }
-
- /**
- * Find the position of the Tile object.
- * <p>
- * First, try to find the exact identical instance of the tile object, if not found,
- * then try to find a tile has the same title.
- *
- * @param tile tile that need to be found
- * @return position of the object, return INDEX_NOT_FOUND if object isn't in the list
- */
- public int getPositionByTile(Tile tile) {
- final int size = mItems.size();
- for (int i = 0; i < size; i++) {
- final Object entity = mItems.get(i).entity;
- if (entity == tile) {
- return i;
- } else if (entity instanceof Tile && tile.title.equals(((Tile) entity).title)) {
- return i;
- }
- }
-
- return POSITION_NOT_FOUND;
- }
-
- /**
- * Add item into list when {@paramref add} is true.
- *
- * @param item maybe {@link Condition}, {@link Tile}, {@link DashboardCategory} or null
- * @param type type of the item, and value is the layout id
- * @param stableId The stable id for this item
- * @param add flag about whether to add item into list
- */
- private void addToItemList(Object item, int type, int stableId, boolean add) {
- if (add) {
- mItems.add(new Item(item, type, stableId));
- }
- }
-
- /**
- * Build the mItems list using mConditions, mSuggestions, mCategories data
- * and mIsShowingAll, mConditionExpanded flag.
- */
- private void buildItemsData() {
- final List<Condition> conditions = getConditionsToShow(mConditions);
- final boolean hasConditions = sizeOf(conditions) > 0;
-
- final List<Suggestion> suggestions = getSuggestionsToShow(mSuggestions);
- final boolean hasSuggestions = sizeOf(suggestions) > 0;
-
- /* Suggestion container. This is the card view that contains the list of suggestions.
- * This will be added whenever the suggestion list is not empty */
- addToItemList(suggestions, R.layout.suggestion_container,
- STABLE_ID_SUGGESTION_CONTAINER, hasSuggestions);
-
- /* Divider between suggestion and conditions if both are present. */
- addToItemList(suggestions, R.layout.horizontal_divider,
- STABLE_ID_SUGGESTION_CONDITION_DIVIDER, hasSuggestions && hasConditions);
-
- /* Condition header. This will be present when there is condition and it is collapsed */
- addToItemList(new ConditionHeaderData(conditions),
- R.layout.suggestion_condition_header,
- STABLE_ID_CONDITION_HEADER, hasConditions && !mConditionExpanded);
-
- /* Condition container. This is the card view that contains the list of conditions.
- * This will be added whenever the condition list is not empty and expanded */
- addToItemList(conditions, R.layout.condition_container,
- STABLE_ID_CONDITION_CONTAINER, hasConditions && mConditionExpanded);
-
- /* Condition footer. This will be present when there is condition and it is expanded */
- addToItemList(null /* item */, R.layout.suggestion_condition_footer,
- STABLE_ID_CONDITION_FOOTER, hasConditions && mConditionExpanded);
-
- if (mCategory != null) {
- final List<Tile> tiles = mCategory.getTiles();
- for (int i = 0; i < tiles.size(); i++) {
- final Tile tile = tiles.get(i);
- addToItemList(tile, R.layout.dashboard_tile, Objects.hash(tile.title),
- true /* add */);
- }
- }
- }
-
- private static int sizeOf(List<?> list) {
- return list == null ? 0 : list.size();
- }
-
- private List<Condition> getConditionsToShow(List<Condition> conditions) {
- if (conditions == null) {
- return null;
- }
- List<Condition> result = new ArrayList<>();
- final int size = conditions == null ? 0 : conditions.size();
- for (int i = 0; i < size; i++) {
- final Condition condition = conditions.get(i);
- if (condition.shouldShow()) {
- result.add(condition);
- }
- }
- return result;
- }
-
- private List<Suggestion> getSuggestionsToShow(List<Suggestion> suggestions) {
- if (suggestions == null) {
- return null;
- }
- if (suggestions.size() <= MAX_SUGGESTION_COUNT) {
- return suggestions;
- }
- return suggestions.subList(0, MAX_SUGGESTION_COUNT);
- }
-
- /**
- * Builder used to build the ItemsData
- */
- public static class Builder {
- private DashboardCategory mCategory;
- private List<Condition> mConditions;
- private List<Suggestion> mSuggestions;
- private boolean mConditionExpanded;
-
- public Builder() {
- }
-
- public Builder(DashboardDataV2 dashboardData) {
- mCategory = dashboardData.mCategory;
- mConditions = dashboardData.mConditions;
- mSuggestions = dashboardData.mSuggestions;
- mConditionExpanded = dashboardData.mConditionExpanded;
- }
-
- public Builder setCategory(DashboardCategory category) {
- this.mCategory = category;
- return this;
- }
-
- public Builder setConditions(List<Condition> conditions) {
- this.mConditions = conditions;
- return this;
- }
-
- public Builder setSuggestions(List<Suggestion> suggestions) {
- this.mSuggestions = suggestions;
- return this;
- }
-
- public Builder setConditionExpanded(boolean expanded) {
- this.mConditionExpanded = expanded;
- return this;
- }
-
- public DashboardDataV2 build() {
- return new DashboardDataV2(this);
- }
- }
-
- /**
- * A DiffCallback to calculate the difference between old and new Item
- * List in DashboardDataV2
- */
- public static class ItemsDataDiffCallback extends DiffUtil.Callback {
- final private List<Item> mOldItems;
- final private List<Item> mNewItems;
-
- public ItemsDataDiffCallback(List<Item> oldItems, List<Item> newItems) {
- mOldItems = oldItems;
- mNewItems = newItems;
- }
-
- @Override
- public int getOldListSize() {
- return mOldItems.size();
- }
-
- @Override
- public int getNewListSize() {
- return mNewItems.size();
- }
-
- @Override
- public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldItems.get(oldItemPosition).id == mNewItems.get(newItemPosition).id;
- }
-
- @Override
- public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
- return mOldItems.get(oldItemPosition).equals(mNewItems.get(newItemPosition));
- }
-
- }
-
- /**
- * An item contains the data needed in the DashboardDataV2.
- */
- static class Item {
- // valid types in field type
- private static final int TYPE_DASHBOARD_TILE = R.layout.dashboard_tile;
- private static final int TYPE_SUGGESTION_CONTAINER =
- R.layout.suggestion_container;
- private static final int TYPE_CONDITION_CONTAINER =
- R.layout.condition_container;
- private static final int TYPE_CONDITION_HEADER =
- R.layout.suggestion_condition_header;
- private static final int TYPE_CONDITION_FOOTER =
- R.layout.suggestion_condition_footer;
- private static final int TYPE_SUGGESTION_CONDITION_DIVIDER = R.layout.horizontal_divider;
-
- @IntDef({TYPE_DASHBOARD_TILE, TYPE_SUGGESTION_CONTAINER, TYPE_CONDITION_CONTAINER,
- TYPE_CONDITION_HEADER, TYPE_CONDITION_FOOTER, TYPE_SUGGESTION_CONDITION_DIVIDER})
- @Retention(RetentionPolicy.SOURCE)
- public @interface ItemTypes {
- }
-
- /**
- * The main data object in item, usually is a {@link Tile}, {@link Condition}
- * object. This object can also be null when the
- * item is an divider line. Please refer to {@link #buildItemsData()} for
- * detail usage of the Item.
- */
- public final Object entity;
-
- /**
- * The type of item, value inside is the layout id(e.g. R.layout.dashboard_tile)
- */
- @ItemTypes
- public final int type;
-
- /**
- * Id of this item, used in the {@link ItemsDataDiffCallback} to identify the same item.
- */
- public final int id;
-
- public Item(Object entity, @ItemTypes int type, int id) {
- this.entity = entity;
- this.type = type;
- this.id = id;
- }
-
- /**
- * Override it to make comparision in the {@link ItemsDataDiffCallback}
- *
- * @param obj object to compared with
- * @return true if the same object or has equal value.
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (!(obj instanceof Item)) {
- return false;
- }
-
- final Item targetItem = (Item) obj;
- if (type != targetItem.type || id != targetItem.id) {
- return false;
- }
-
- switch (type) {
- case TYPE_DASHBOARD_TILE:
- final Tile localTile = (Tile) entity;
- final Tile targetTile = (Tile) targetItem.entity;
-
- // Only check title and summary for dashboard tile
- return TextUtils.equals(localTile.title, targetTile.title)
- && TextUtils.equals(localTile.summary, targetTile.summary);
- case TYPE_SUGGESTION_CONTAINER:
- case TYPE_CONDITION_CONTAINER:
- // If entity is suggestion and contains remote view, force refresh
- final List entities = (List) entity;
- if (!entities.isEmpty()) {
- Object firstEntity = entities.get(0);
- if (firstEntity instanceof Tile
- && ((Tile) firstEntity).remoteViews != null) {
- return false;
- }
- }
- // Otherwise Fall through to default
- default:
- return entity == null ? targetItem.entity == null
- : entity.equals(targetItem.entity);
- }
- }
- }
-
- /**
- * This class contains the data needed to build the suggestion/condition header. The data can
- * also be used to check the diff in DiffUtil.Callback
- */
- public static class ConditionHeaderData {
- public final List<Icon> conditionIcons;
- public final CharSequence title;
- public final int conditionCount;
-
- public ConditionHeaderData(List<Condition> conditions) {
- conditionCount = sizeOf(conditions);
- title = conditionCount > 0 ? conditions.get(0).getTitle() : null;
- conditionIcons = new ArrayList<>();
- for (int i = 0; conditions != null && i < conditions.size(); i++) {
- final Condition condition = conditions.get(i);
- conditionIcons.add(condition.getIcon());
- }
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
index e0873f5..6c3f9cd 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java
@@ -90,9 +90,4 @@
*/
void openTileIntent(Activity activity, Tile tile);
- /**
- * Whether or not we should use the v2 of suggestions UI.
- */
- boolean useSuggestionUiV2();
-
}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index a14d9e9..086a131 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -217,11 +217,6 @@
launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY);
}
- @Override
- public boolean useSuggestionUiV2() {
- return FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SUGGESTION_UI_V2);
- }
-
private void bindSummary(Preference preference, Tile tile) {
if (tile.summary != null) {
preference.setSummary(tile.summary);
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index f86867b..4f045a2 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -38,7 +38,6 @@
import com.android.settings.dashboard.conditional.ConditionManager.ConditionListener;
import com.android.settings.dashboard.conditional.FocusRecyclerView;
import com.android.settings.dashboard.conditional.FocusRecyclerView.FocusListener;
-import com.android.settings.dashboard.suggestions.SuggestionDismissController;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.ActionBarShadowController;
@@ -53,8 +52,7 @@
public class DashboardSummary extends InstrumentedFragment
implements CategoryListener, ConditionListener,
- FocusListener, SuggestionDismissController.Callback,
- SuggestionControllerMixin.SuggestionControllerHost {
+ FocusListener, SuggestionControllerMixin.SuggestionControllerHost {
public static final boolean DEBUG = false;
private static final boolean DEBUG_TIMING = false;
private static final int MAX_WAIT_MILLIS = 700;
@@ -66,7 +64,6 @@
private FocusRecyclerView mDashboard;
private DashboardAdapter mAdapter;
- private DashboardAdapterV2 mAdapterV2;
private SummaryLoader mSummaryLoader;
private ConditionManager mConditionManager;
private LinearLayoutManager mLayoutManager;
@@ -181,13 +178,10 @@
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- if (mLayoutManager == null) return;
- outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
- if (!mDashboardFeatureProvider.useSuggestionUiV2()) {
- if (mAdapter != null) {
- mAdapter.onSaveInstanceState(outState);
- }
+ if (mLayoutManager == null) {
+ return;
}
+ outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
}
@Override
@@ -205,17 +199,10 @@
mDashboard.setHasFixedSize(true);
mDashboard.setListener(this);
mDashboard.setItemAnimator(new DashboardItemAnimator());
- if (mDashboardFeatureProvider.useSuggestionUiV2()) {
- mAdapterV2 = new DashboardAdapterV2(getContext(), bundle,
- mConditionManager.getConditions(), mSuggestionControllerMixin, getLifecycle());
- mDashboard.setAdapter(mAdapterV2);
- mSummaryLoader.setSummaryConsumer(mAdapterV2);
- } else {
- mAdapter = new DashboardAdapter(getContext(), bundle, mConditionManager.getConditions(),
- mSuggestionControllerMixin, this /* SuggestionDismissController.Callback */);
- mDashboard.setAdapter(mAdapter);
- mSummaryLoader.setSummaryConsumer(mAdapter);
- }
+ mAdapter = new DashboardAdapter(getContext(), bundle,
+ mConditionManager.getConditions(), mSuggestionControllerMixin, getLifecycle());
+ mDashboard.setAdapter(mAdapter);
+ mSummaryLoader.setSummaryConsumer(mAdapter);
ActionBarShadowController.attachToRecyclerView(
getActivity().findViewById(R.id.search_bar_container), getLifecycle(), mDashboard);
rebuildUI();
@@ -254,11 +241,7 @@
if (mOnConditionsChangedCalled) {
final boolean scrollToTop =
mLayoutManager.findFirstCompletelyVisibleItemPosition() <= 1;
- if (mDashboardFeatureProvider.useSuggestionUiV2()) {
- mAdapterV2.setConditions(mConditionManager.getConditions());
- } else {
- mAdapter.setConditions(mConditionManager.getConditions());
- }
+ mAdapter.setConditions(mConditionManager.getConditions());
if (scrollToTop) {
mDashboard.scrollToPosition(0);
}
@@ -268,36 +251,13 @@
}
@Override
- public Suggestion getSuggestionAt(int position) {
- if (mDashboardFeatureProvider.useSuggestionUiV2()) {
- return mAdapterV2.getSuggestion(position);
- } else {
- return mAdapter.getSuggestion(position);
- }
- }
-
- @Override
- public void onSuggestionDismissed(Suggestion suggestion) {
- mAdapter.onSuggestionDismissed(suggestion);
- }
-
- @Override
public void onSuggestionReady(List<Suggestion> suggestions) {
mStagingSuggestions = suggestions;
- if (mDashboardFeatureProvider.useSuggestionUiV2()) {
- mAdapterV2.setSuggestions(suggestions);
- if (mStagingCategory != null) {
- Log.d(TAG, "Category has loaded, setting category from suggestionReady");
- mHandler.removeCallbacksAndMessages(null);
- mAdapterV2.setCategory(mStagingCategory);
- }
- } else {
- mAdapter.setSuggestions(suggestions);
- if (mStagingCategory != null) {
- Log.d(TAG, "Category has loaded, setting category from suggestionReady");
- mHandler.removeCallbacksAndMessages(null);
- mAdapter.setCategory(mStagingCategory);
- }
+ mAdapter.setSuggestions(suggestions);
+ if (mStagingCategory != null) {
+ Log.d(TAG, "Category has loaded, setting category from suggestionReady");
+ mHandler.removeCallbacksAndMessages(null);
+ mAdapter.setCategory(mStagingCategory);
}
}
@@ -313,26 +273,14 @@
if (mSuggestionControllerMixin.isSuggestionLoaded()) {
Log.d(TAG, "Suggestion has loaded, setting suggestion/category");
ThreadUtils.postOnMainThread(() -> {
- if (mDashboardFeatureProvider.useSuggestionUiV2()) {
- if (mStagingSuggestions != null) {
- mAdapterV2.setSuggestions(mStagingSuggestions);
- }
- mAdapterV2.setCategory(mStagingCategory);
- } else {
- if (mStagingSuggestions != null) {
- mAdapter.setSuggestions(mStagingSuggestions);
- }
- mAdapter.setCategory(mStagingCategory);
+ if (mStagingSuggestions != null) {
+ mAdapter.setSuggestions(mStagingSuggestions);
}
+ mAdapter.setCategory(mStagingCategory);
});
} else {
Log.d(TAG, "Suggestion NOT loaded, delaying setCategory by " + MAX_WAIT_MILLIS + "ms");
- if (mDashboardFeatureProvider.useSuggestionUiV2()) {
- mHandler.postDelayed(()
- -> mAdapterV2.setCategory(mStagingCategory), MAX_WAIT_MILLIS);
- } else {
- mHandler.postDelayed(() -> mAdapter.setCategory(mStagingCategory), MAX_WAIT_MILLIS);
- }
+ mHandler.postDelayed(() -> mAdapter.setCategory(mStagingCategory), MAX_WAIT_MILLIS);
}
}
}
diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapter.java b/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
index d84aa7c..a540b3f 100644
--- a/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
+++ b/src/com/android/settings/dashboard/conditional/ConditionAdapter.java
@@ -27,10 +27,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.dashboard.DashboardAdapter;
import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
-import com.android.settings.dashboard.DashboardData;
-import com.android.settings.dashboard.DashboardData.HeaderMode;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.WirelessUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -44,7 +41,7 @@
private final Context mContext;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private List<Condition> mConditions;
- private @HeaderMode int mMode;
+ private boolean mExpanded;
private View.OnClickListener mConditionClickListener = new View.OnClickListener() {
@@ -84,10 +81,10 @@
}
};
- public ConditionAdapter(Context context, List<Condition> conditions, @HeaderMode int mode) {
+ public ConditionAdapter(Context context, List<Condition> conditions, boolean expanded) {
mContext = context;
mConditions = conditions;
- mMode = mode;
+ mExpanded = expanded;
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
setHasStableIds(true);
@@ -126,7 +123,7 @@
@Override
public int getItemCount() {
- if (mMode == DashboardData.HEADER_MODE_FULLY_EXPANDED) {
+ if (mExpanded) {
return mConditions.size();
}
return 0;
@@ -138,7 +135,7 @@
}
private void bindViews(final Condition condition,
- DashboardAdapter.DashboardItemHolder view, boolean isLastItem,
+ DashboardItemHolder view, boolean isLastItem,
View.OnClickListener onClickListener) {
if (condition instanceof AirplaneModeCondition) {
Log.d(TAG, "Airplane mode condition has been bound with "
diff --git a/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java b/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java
deleted file mode 100644
index 8db57f7..0000000
--- a/src/com/android/settings/dashboard/conditional/ConditionAdapterV2.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard.conditional;
-
-import android.content.Context;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.helper.ItemTouchHelper;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardAdapterV2.DashboardItemHolder;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.WirelessUtils;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-
-import java.util.List;
-import java.util.Objects;
-
-public class ConditionAdapterV2 extends RecyclerView.Adapter<DashboardItemHolder> {
- public static final String TAG = "ConditionAdapter";
-
- private final Context mContext;
- private final MetricsFeatureProvider mMetricsFeatureProvider;
- private List<Condition> mConditions;
- private boolean mExpanded;
-
- private View.OnClickListener mConditionClickListener = new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- //TODO: get rid of setTag/getTag
- Condition condition = (Condition) v.getTag();
- mMetricsFeatureProvider.action(mContext,
- MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
- condition.getMetricsConstant());
- condition.onPrimaryClick();
- }
- };
-
- @VisibleForTesting
- ItemTouchHelper.SimpleCallback mSwipeCallback = new ItemTouchHelper.SimpleCallback(0,
- ItemTouchHelper.START | ItemTouchHelper.END) {
- @Override
- public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
- RecyclerView.ViewHolder target) {
- return true;
- }
-
- @Override
- public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
- return viewHolder.getItemViewType() == R.layout.condition_tile
- ? super.getSwipeDirs(recyclerView, viewHolder) : 0;
- }
-
- @Override
- public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
- Object item = getItem(viewHolder.getItemId());
- // item can become null when running monkey
- if (item != null) {
- ((Condition) item).silence();
- }
- }
- };
-
- public ConditionAdapterV2(Context context, List<Condition> conditions, boolean expanded) {
- mContext = context;
- mConditions = conditions;
- mExpanded = expanded;
- mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
-
- setHasStableIds(true);
- }
-
- public Object getItem(long itemId) {
- for (Condition condition : mConditions) {
- if (Objects.hash(condition.getTitle()) == itemId) {
- return condition;
- }
- }
- return null;
- }
-
- @Override
- public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new DashboardItemHolder(LayoutInflater.from(parent.getContext()).inflate(
- viewType, parent, false));
- }
-
- @Override
- public void onBindViewHolder(DashboardItemHolder holder, int position) {
- bindViews(mConditions.get(position), holder,
- position == mConditions.size() - 1, mConditionClickListener);
- }
-
- @Override
- public long getItemId(int position) {
- return Objects.hash(mConditions.get(position).getTitle());
- }
-
- @Override
- public int getItemViewType(int position) {
- return R.layout.condition_tile;
- }
-
- @Override
- public int getItemCount() {
- if (mExpanded) {
- return mConditions.size();
- }
- return 0;
- }
-
- public void addDismissHandling(final RecyclerView recyclerView) {
- final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mSwipeCallback);
- itemTouchHelper.attachToRecyclerView(recyclerView);
- }
-
- private void bindViews(final Condition condition,
- DashboardItemHolder view, boolean isLastItem,
- View.OnClickListener onClickListener) {
- if (condition instanceof AirplaneModeCondition) {
- Log.d(TAG, "Airplane mode condition has been bound with "
- + "isActive=" + condition.isActive() + ". Airplane mode is currently " +
- WirelessUtils.isAirplaneModeOn(condition.mManager.getContext()));
- }
- View card = view.itemView.findViewById(R.id.content);
- card.setTag(condition);
- card.setOnClickListener(onClickListener);
- view.icon.setImageIcon(condition.getIcon());
- view.title.setText(condition.getTitle());
-
- CharSequence[] actions = condition.getActions();
- final boolean hasButtons = actions.length > 0;
- setViewVisibility(view.itemView, R.id.buttonBar, hasButtons);
-
- view.summary.setText(condition.getSummary());
- for (int i = 0; i < 2; i++) {
- Button button = (Button) view.itemView.findViewById(i == 0
- ? R.id.first_action : R.id.second_action);
- if (actions.length > i) {
- button.setVisibility(View.VISIBLE);
- button.setText(actions[i]);
- final int index = i;
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Context context = v.getContext();
- FeatureFactory.getFactory(context).getMetricsFeatureProvider()
- .action(context, MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON,
- condition.getMetricsConstant());
- condition.onActionClick(index);
- }
- });
- } else {
- button.setVisibility(View.GONE);
- }
- }
- setViewVisibility(view.itemView, R.id.divider, !isLastItem);
- }
-
- private void setViewVisibility(View containerView, int viewId, boolean visible) {
- View view = containerView.findViewById(viewId);
- if (view != null) {
- view.setVisibility(visible ? View.VISIBLE : View.GONE);
- }
- }
-}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
index d1d7db2..070e758 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionAdapter.java
@@ -17,6 +17,10 @@
import android.app.PendingIntent;
import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.os.Bundle;
import android.service.settings.suggestions.Suggestion;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
@@ -24,37 +28,71 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
import com.android.settings.dashboard.DashboardAdapter.IconCache;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.Utils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import com.android.settingslib.suggestions.SuggestionControllerMixin;
+import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
-public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder> {
+public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder> implements
+ LifecycleObserver, OnSaveInstanceState {
public static final String TAG = "SuggestionAdapter";
+ private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
+ private static final String STATE_SUGGESTION_LIST = "suggestion_list";
+
private final Context mContext;
private final MetricsFeatureProvider mMetricsFeatureProvider;
- private final List<Suggestion> mSuggestions;
private final IconCache mCache;
- private final List<String> mSuggestionsShownLogged;
+ private final ArrayList<String> mSuggestionsShownLogged;
+ private final SuggestionFeatureProvider mSuggestionFeatureProvider;
private final SuggestionControllerMixin mSuggestionControllerMixin;
+ private final Callback mCallback;
+ private final CardConfig mConfig;
+
+ private List<Suggestion> mSuggestions;
+
+ public interface Callback {
+ /**
+ * Called when the close button of the suggestion card is clicked.
+ */
+ void onSuggestionClosed(Suggestion suggestion);
+ }
public SuggestionAdapter(Context context, SuggestionControllerMixin suggestionControllerMixin,
- List<Suggestion> suggestions, List<String> suggestionsShownLogged) {
+ Bundle savedInstanceState, Callback callback, Lifecycle lifecycle) {
mContext = context;
mSuggestionControllerMixin = suggestionControllerMixin;
- mSuggestions = suggestions;
- mSuggestionsShownLogged = suggestionsShownLogged;
mCache = new IconCache(context);
final FeatureFactory factory = FeatureFactory.getFactory(context);
mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
+ mSuggestionFeatureProvider = factory.getSuggestionFeatureProvider(context);
+ mCallback = callback;
+ if (savedInstanceState != null) {
+ mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
+ mSuggestionsShownLogged = savedInstanceState.getStringArrayList(
+ STATE_SUGGESTIONS_SHOWN_LOGGED);
+ } else {
+ mSuggestionsShownLogged = new ArrayList<>();
+ }
+
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
+ mConfig = CardConfig.get(context);
setHasStableIds(true);
}
@@ -67,31 +105,49 @@
@Override
public void onBindViewHolder(DashboardItemHolder holder, int position) {
- bindSuggestion(holder, position);
- }
-
- private void bindSuggestion(DashboardItemHolder holder, int position) {
final Suggestion suggestion = mSuggestions.get(position);
final String id = suggestion.getId();
+ final int suggestionCount = mSuggestions.size();
if (!mSuggestionsShownLogged.contains(id)) {
mMetricsFeatureProvider.action(
mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, id);
mSuggestionsShownLogged.add(id);
}
-
- holder.icon.setImageDrawable(mCache.getIcon(suggestion.getIcon()));
+ mConfig.setCardLayout(holder, suggestionCount, position);
+ final Icon icon = suggestion.getIcon();
+ final Drawable drawable = mCache.getIcon(icon);
+ if (drawable != null && TextUtils.equals(icon.getResPackage(), mContext.getPackageName())) {
+ drawable.setTint(Utils.getColorAccent(mContext));
+ }
+ holder.icon.setImageDrawable(drawable);
holder.title.setText(suggestion.getTitle());
- final CharSequence summary = suggestion.getSummary();
- if (!TextUtils.isEmpty(summary)) {
- holder.summary.setText(summary);
- holder.summary.setVisibility(View.VISIBLE);
+ holder.title.setSingleLine(suggestionCount == 1);
+
+ if (suggestionCount == 1) {
+ final CharSequence summary = suggestion.getSummary();
+ if (!TextUtils.isEmpty(summary)) {
+ holder.summary.setText(summary);
+ holder.summary.setVisibility(View.VISIBLE);
+ } else {
+ holder.summary.setVisibility(View.GONE);
+ }
} else {
+ // Do not show summary if there are more than 1 suggestions
holder.summary.setVisibility(View.GONE);
+ holder.title.setMaxLines(3);
}
- final View divider = holder.itemView.findViewById(R.id.divider);
- if (divider != null) {
- divider.setVisibility(position < mSuggestions.size() - 1 ? View.VISIBLE : View.GONE);
+
+ final ImageView closeButton = holder.itemView.findViewById(R.id.close_button);
+ if (closeButton != null) {
+ closeButton.setOnClickListener(v -> {
+ mSuggestionFeatureProvider.dismissSuggestion(
+ mContext, mSuggestionControllerMixin, suggestion);
+ if (mCallback != null) {
+ mCallback.onSuggestionClosed(suggestion);
+ }
+ });
}
+
View clickHandler = holder.itemView;
// If a view with @android:id/primary is defined, use that as the click handler
// instead.
@@ -144,7 +200,83 @@
}
public void removeSuggestion(Suggestion suggestion) {
+ final int position = mSuggestions.indexOf(suggestion);
mSuggestions.remove(suggestion);
- notifyDataSetChanged();
+ notifyItemRemoved(position);
}
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ if (mSuggestions != null) {
+ outState.putParcelableArrayList(STATE_SUGGESTION_LIST,
+ new ArrayList<>(mSuggestions));
+ }
+ outState.putStringArrayList(STATE_SUGGESTIONS_SHOWN_LOGGED, mSuggestionsShownLogged);
+ }
+
+ public void setSuggestions(List<Suggestion> suggestions) {
+ mSuggestions = suggestions;
+ }
+
+ public List<Suggestion> getSuggestions() {
+ return mSuggestions;
+ }
+
+ private static class CardConfig {
+ // Card start/end margin
+ private final int mMarginInner;
+ private final int mMarginOuter;
+ // Card width for different numbers of cards
+ private final int mWidthSingleCard;
+ private final int mWidthTwoCards;
+ private final int mWidthMultipleCards;
+ // padding between icon and title
+ private final int mPaddingTitleTopSingleCard;
+ private final int mPaddingTitleTopMultipleCards;
+
+ private static CardConfig sConfig;
+
+ private CardConfig(Context context) {
+ final Resources res = context.getResources();
+ mMarginInner =
+ res.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin);
+ mMarginOuter =
+ res.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin);
+ mWidthSingleCard = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_one_card);
+ mWidthTwoCards = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_two_cards);
+ mWidthMultipleCards =
+ res.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards);
+ mPaddingTitleTopSingleCard =
+ res.getDimensionPixelOffset(R.dimen.suggestion_card_title_padding_bottom_one_card);
+ mPaddingTitleTopMultipleCards = res.getDimensionPixelOffset(
+ R.dimen.suggestion_card_title_padding_bottom_multiple_cards);
+ }
+
+ public static CardConfig get(Context context) {
+ if (sConfig == null) {
+ sConfig = new CardConfig(context);
+ }
+ return sConfig;
+ }
+
+ private void setCardLayout(DashboardItemHolder holder, int suggestionCount,
+ int position) {
+ final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
+ suggestionCount == 1
+ ? mWidthSingleCard : suggestionCount == 2
+ ? mWidthTwoCards : mWidthMultipleCards,
+ LinearLayout.LayoutParams.WRAP_CONTENT);
+ if (suggestionCount == 1) {
+ params.setMarginStart(mMarginOuter);
+ params.setMarginEnd(mMarginOuter);
+ } else {
+ params.setMarginStart(
+ position == 0 ? mMarginOuter : mMarginInner);
+ params.setMarginEnd(position == suggestionCount - 1 ? mMarginOuter : 0);
+ }
+ holder.itemView.setLayoutParams(params);
+ }
+
+ }
+
}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java b/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java
deleted file mode 100644
index e29ca5f..0000000
--- a/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard.suggestions;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.os.Bundle;
-import android.service.settings.suggestions.Suggestion;
-import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardAdapterV2.DashboardItemHolder;
-import com.android.settings.dashboard.DashboardAdapterV2.IconCache;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.Utils;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
-import com.android.settingslib.suggestions.SuggestionControllerMixin;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-public class SuggestionAdapterV2 extends RecyclerView.Adapter<DashboardItemHolder> implements
- LifecycleObserver, OnSaveInstanceState {
- public static final String TAG = "SuggestionAdapterV2";
-
- private static final String STATE_SUGGESTIONS_SHOWN_LOGGED = "suggestions_shown_logged";
- private static final String STATE_SUGGESTION_LIST = "suggestion_list";
-
- private final Context mContext;
- private final MetricsFeatureProvider mMetricsFeatureProvider;
- private final IconCache mCache;
- private final ArrayList<String> mSuggestionsShownLogged;
- private final SuggestionFeatureProvider mSuggestionFeatureProvider;
- private final SuggestionControllerMixin mSuggestionControllerMixin;
- private final Callback mCallback;
- private final CardConfig mConfig;
-
- private List<Suggestion> mSuggestions;
-
- public interface Callback {
- /**
- * Called when the close button of the suggestion card is clicked.
- */
- void onSuggestionClosed(Suggestion suggestion);
- }
-
- public SuggestionAdapterV2(Context context, SuggestionControllerMixin suggestionControllerMixin,
- Bundle savedInstanceState, Callback callback, Lifecycle lifecycle) {
- mContext = context;
- mSuggestionControllerMixin = suggestionControllerMixin;
- mCache = new IconCache(context);
- final FeatureFactory factory = FeatureFactory.getFactory(context);
- mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
- mSuggestionFeatureProvider = factory.getSuggestionFeatureProvider(context);
- mCallback = callback;
- if (savedInstanceState != null) {
- mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
- mSuggestionsShownLogged = savedInstanceState.getStringArrayList(
- STATE_SUGGESTIONS_SHOWN_LOGGED);
- } else {
- mSuggestionsShownLogged = new ArrayList<>();
- }
-
- if (lifecycle != null) {
- lifecycle.addObserver(this);
- }
- mConfig = CardConfig.get(context);
-
- setHasStableIds(true);
- }
-
- @Override
- public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new DashboardItemHolder(LayoutInflater.from(parent.getContext()).inflate(
- viewType, parent, false));
- }
-
- @Override
- public void onBindViewHolder(DashboardItemHolder holder, int position) {
- final Suggestion suggestion = mSuggestions.get(position);
- final String id = suggestion.getId();
- final int suggestionCount = mSuggestions.size();
- if (!mSuggestionsShownLogged.contains(id)) {
- mMetricsFeatureProvider.action(
- mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, id);
- mSuggestionsShownLogged.add(id);
- }
- mConfig.setCardLayout(holder, suggestionCount, position);
- final Icon icon = suggestion.getIcon();
- final Drawable drawable = mCache.getIcon(icon);
- if (drawable != null && TextUtils.equals(icon.getResPackage(), mContext.getPackageName())) {
- drawable.setTint(Utils.getColorAccent(mContext));
- }
- holder.icon.setImageDrawable(drawable);
- holder.title.setText(suggestion.getTitle());
- holder.title.setSingleLine(suggestionCount == 1);
-
- if (suggestionCount == 1) {
- final CharSequence summary = suggestion.getSummary();
- if (!TextUtils.isEmpty(summary)) {
- holder.summary.setText(summary);
- holder.summary.setVisibility(View.VISIBLE);
- } else {
- holder.summary.setVisibility(View.GONE);
- }
- } else {
- // Do not show summary if there are more than 1 suggestions
- holder.summary.setVisibility(View.GONE);
- holder.title.setMaxLines(3);
- }
-
- final ImageView closeButton = holder.itemView.findViewById(R.id.close_button);
- if (closeButton != null) {
- closeButton.setOnClickListener(v -> {
- mSuggestionFeatureProvider.dismissSuggestion(
- mContext, mSuggestionControllerMixin, suggestion);
- if (mCallback != null) {
- mCallback.onSuggestionClosed(suggestion);
- }
- });
- }
-
- View clickHandler = holder.itemView;
- // If a view with @android:id/primary is defined, use that as the click handler
- // instead.
- final View primaryAction = holder.itemView.findViewById(android.R.id.primary);
- if (primaryAction != null) {
- clickHandler = primaryAction;
- }
- clickHandler.setOnClickListener(v -> {
- mMetricsFeatureProvider.action(mContext, MetricsEvent.ACTION_SETTINGS_SUGGESTION, id);
- try {
- suggestion.getPendingIntent().send();
- mSuggestionControllerMixin.launchSuggestion(suggestion);
- } catch (PendingIntent.CanceledException e) {
- Log.w(TAG, "Failed to start suggestion " + suggestion.getTitle());
- }
- });
- }
-
- @Override
- public long getItemId(int position) {
- return Objects.hash(mSuggestions.get(position).getId());
- }
-
- @Override
- public int getItemViewType(int position) {
- final Suggestion suggestion = getSuggestion(position);
- if ((suggestion.getFlags() & Suggestion.FLAG_HAS_BUTTON) != 0) {
- return R.layout.suggestion_tile_with_button_v2;
- } else {
- return R.layout.suggestion_tile_v2;
- }
- }
-
- @Override
- public int getItemCount() {
- return mSuggestions.size();
- }
-
- public Suggestion getSuggestion(int position) {
- final long itemId = getItemId(position);
- if (mSuggestions == null) {
- return null;
- }
- for (Suggestion suggestion : mSuggestions) {
- if (Objects.hash(suggestion.getId()) == itemId) {
- return suggestion;
- }
- }
- return null;
- }
-
- public void removeSuggestion(Suggestion suggestion) {
- final int position = mSuggestions.indexOf(suggestion);
- mSuggestions.remove(suggestion);
- notifyItemRemoved(position);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- if (mSuggestions != null) {
- outState.putParcelableArrayList(STATE_SUGGESTION_LIST,
- new ArrayList<>(mSuggestions));
- }
- outState.putStringArrayList(STATE_SUGGESTIONS_SHOWN_LOGGED, mSuggestionsShownLogged);
- }
-
- public void setSuggestions(List<Suggestion> suggestions) {
- mSuggestions = suggestions;
- }
-
- public List<Suggestion> getSuggestions() {
- return mSuggestions;
- }
-
- private static class CardConfig {
- // Card start/end margin
- private final int mMarginInner;
- private final int mMarginOuter;
- // Card width for different numbers of cards
- private final int mWidthSingleCard;
- private final int mWidthTwoCards;
- private final int mWidthMultipleCards;
- // padding between icon and title
- private final int mPaddingTitleTopSingleCard;
- private final int mPaddingTitleTopMultipleCards;
-
- private static CardConfig sConfig;
-
- private CardConfig(Context context) {
- final Resources res = context.getResources();
- mMarginInner =
- res.getDimensionPixelOffset(R.dimen.suggestion_card_inner_margin);
- mMarginOuter =
- res.getDimensionPixelOffset(R.dimen.suggestion_card_outer_margin);
- mWidthSingleCard = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_one_card);
- mWidthTwoCards = res.getDimensionPixelOffset(R.dimen.suggestion_card_width_two_cards);
- mWidthMultipleCards =
- res.getDimensionPixelOffset(R.dimen.suggestion_card_width_multiple_cards);
- mPaddingTitleTopSingleCard =
- res.getDimensionPixelOffset(R.dimen.suggestion_card_title_padding_bottom_one_card);
- mPaddingTitleTopMultipleCards = res.getDimensionPixelOffset(
- R.dimen.suggestion_card_title_padding_bottom_multiple_cards);
- }
-
- public static CardConfig get(Context context) {
- if (sConfig == null) {
- sConfig = new CardConfig(context);
- }
- return sConfig;
- }
-
- private void setCardLayout(DashboardItemHolder holder, int suggestionCount,
- int position) {
- final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
- suggestionCount == 1
- ? mWidthSingleCard : suggestionCount == 2
- ? mWidthTwoCards : mWidthMultipleCards,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- if (suggestionCount == 1) {
- params.setMarginStart(mMarginOuter);
- params.setMarginEnd(mMarginOuter);
- } else {
- params.setMarginStart(
- position == 0 ? mMarginOuter : mMarginInner);
- params.setMarginEnd(position == suggestionCount - 1 ? mMarginOuter : 0);
- }
- holder.itemView.setLayoutParams(params);
- }
-
- }
-
-}
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java b/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java
deleted file mode 100644
index 6a8db89..0000000
--- a/src/com/android/settings/dashboard/suggestions/SuggestionDismissController.java
+++ /dev/null
@@ -1,90 +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.dashboard.suggestions;
-
-import android.content.Context;
-import android.service.settings.suggestions.Suggestion;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.helper.ItemTouchHelper;
-
-import com.android.settings.R;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.suggestions.SuggestionControllerMixin;
-
-/**
- * Deprecated as a close button is provided to dismiss the suggestion.
- */
-@Deprecated
-public class SuggestionDismissController extends ItemTouchHelper.SimpleCallback {
-
- public interface Callback {
- /**
- * Returns suggestion tile data from the callback
- */
- Suggestion getSuggestionAt(int position);
-
- /**
- * Called when a suggestion is dismissed.
- */
- void onSuggestionDismissed(Suggestion suggestion);
- }
-
- private final Context mContext;
- private final SuggestionFeatureProvider mSuggestionFeatureProvider;
- private final SuggestionControllerMixin mSuggestionMixin;
- private final Callback mCallback;
-
- public SuggestionDismissController(Context context, RecyclerView recyclerView,
- SuggestionControllerMixin suggestionMixin, Callback callback) {
- super(0, ItemTouchHelper.START | ItemTouchHelper.END);
- mSuggestionMixin = suggestionMixin;
- mContext = context;
- mSuggestionFeatureProvider = FeatureFactory.getFactory(context)
- .getSuggestionFeatureProvider(context);
- mCallback = callback;
- final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(this);
- itemTouchHelper.attachToRecyclerView(recyclerView);
- }
-
- @Override
- public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
- RecyclerView.ViewHolder target) {
- return true;
- }
-
- @Override
- public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
- final int layoutId = viewHolder.getItemViewType();
- if (layoutId == R.layout.suggestion_tile
- || layoutId == R.layout.suggestion_tile_with_button) {
- // Only return swipe direction for suggestion tiles. All other types are not swipeable.
- return super.getSwipeDirs(recyclerView, viewHolder);
- }
- return 0;
- }
-
- @Override
- public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
- if (mCallback == null) {
- return;
- }
- final int position = viewHolder.getAdapterPosition();
- final Suggestion suggestionV2 = mCallback.getSuggestionAt(position);
- mSuggestionFeatureProvider.dismissSuggestion(mContext, mSuggestionMixin, suggestionV2);
- mCallback.onSuggestionDismissed(suggestionV2);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index f9ef424..2d22e04 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -16,10 +16,8 @@
package com.android.settings.dashboard;
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
@@ -30,14 +28,14 @@
import android.app.PendingIntent;
import android.content.Context;
import android.content.res.Resources;
-import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.service.settings.suggestions.Suggestion;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
-import android.widget.RelativeLayout;
+import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
@@ -47,7 +45,6 @@
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources;
-import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import org.junit.Before;
@@ -58,6 +55,7 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.List;
@@ -81,8 +79,6 @@
private Resources mResources;
private FakeFeatureFactory mFactory;
private DashboardAdapter mDashboardAdapter;
- private DashboardAdapter.SuggestionAndConditionHeaderHolder mSuggestionHolder;
- private DashboardData.SuggestionConditionHeaderData mSuggestionHeaderData;
private List<Condition> mConditionList;
@Before
@@ -98,30 +94,17 @@
mConditionList = new ArrayList<>();
mConditionList.add(mCondition);
when(mCondition.shouldShow()).thenReturn(true);
- mDashboardAdapter = new DashboardAdapter(mContext, null, mConditionList, null, null);
- mSuggestionHeaderData = new DashboardData.SuggestionConditionHeaderData(mConditionList, 1);
+ mDashboardAdapter = new DashboardAdapter(mContext, null /* savedInstanceState */,
+ mConditionList, null /* suggestionControllerMixin */, null /* lifecycle */);
when(mView.getTag()).thenReturn(mCondition);
}
@Test
- public void testSuggestionsLogs_nullSuggestionsList_shouldNotCrash() {
- setupSuggestions(makeSuggestionsV2("pkg1", "pkg2", "pkg3", "pkg4", "pkg5"));
- mDashboardAdapter.onBindSuggestionConditionHeader(mSuggestionHolder, mSuggestionHeaderData);
-
- // set suggestions to null
- final DashboardData prevData = mDashboardAdapter.mDashboardData;
- mDashboardAdapter.mDashboardData = new DashboardData.Builder(prevData)
- .setSuggestions(null)
- .build();
-
- mSuggestionHolder.itemView.callOnClick();
- // no crash
- }
-
- @Test
public void testSuggestionDismissed_notOnlySuggestion_updateSuggestionOnly() {
final DashboardAdapter adapter =
- spy(new DashboardAdapter(mContext, null, null, null, null));
+ spy(new DashboardAdapter(mContext, null /* savedInstanceState */,
+ null /* conditions */, null /* suggestionControllerMixin */, null /*
+ lifecycle */));
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3");
adapter.setSuggestions(suggestions);
@@ -130,18 +113,18 @@
when(data.getContext()).thenReturn(mContext);
when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.data)).thenReturn(data);
- final DashboardAdapter.SuggestionAndConditionContainerHolder holder =
- new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView);
+ when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
+ when(itemView.findViewById(android.R.id.summary)).thenReturn(mock(TextView.class));
+ final DashboardAdapter.SuggestionContainerHolder holder =
+ new DashboardAdapter.SuggestionContainerHolder(itemView);
- adapter.onBindConditionAndSuggestion(
- holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION);
+ adapter.onBindSuggestion(holder, 0);
final DashboardData dashboardData = adapter.mDashboardData;
reset(adapter); // clear interactions tracking
final Suggestion suggestionToRemove = suggestions.get(1);
- adapter.onSuggestionDismissed(suggestionToRemove);
+ adapter.onSuggestionClosed(suggestionToRemove);
assertThat(adapter.mDashboardData).isEqualTo(dashboardData);
assertThat(suggestions.size()).isEqualTo(2);
@@ -150,25 +133,25 @@
}
@Test
- public void testSuggestionDismissed_moreThanTwoSuggestions_defaultMode_shouldNotCrash() {
+ public void testSuggestionDismissed_moreThanTwoSuggestions_shouldNotCrash() {
final RecyclerView data = new RecyclerView(RuntimeEnvironment.application);
final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.data)).thenReturn(data);
- final DashboardAdapter.SuggestionAndConditionContainerHolder holder =
- new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView);
+ when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
+ when(itemView.findViewById(android.R.id.summary)).thenReturn(mock(TextView.class));
+ final DashboardAdapter.SuggestionContainerHolder holder =
+ new DashboardAdapter.SuggestionContainerHolder(itemView);
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3", "pkg4");
- final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null /*savedInstance */,
- null /* conditions */,
- null /* suggestionControllerMixin */, null /* callback */));
+ final DashboardAdapter adapter = spy(new DashboardAdapter(mContext,
+ null /*savedInstance */, null /* conditions */,
+ null /* suggestionControllerMixin */,
+ null /* lifecycle */));
adapter.setSuggestions(suggestions);
- adapter.onBindConditionAndSuggestion(
- holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION);
- // default mode, only displaying 2 suggestions
+ adapter.onBindSuggestion(holder, 0);
- adapter.onSuggestionDismissed(suggestions.get(1));
+ adapter.onSuggestionClosed(suggestions.get(1));
// verify operations that access the lists will not cause ConcurrentModificationException
- assertThat(holder.data.getAdapter().getItemCount()).isEqualTo(1);
+ assertThat(holder.data.getAdapter().getItemCount()).isEqualTo(3);
adapter.setSuggestions(suggestions);
// should not crash
}
@@ -176,42 +159,25 @@
@Test
public void testSuggestionDismissed_onlySuggestion_updateDashboardData() {
DashboardAdapter adapter =
- spy(new DashboardAdapter(mContext, null, null, null, null));
+ spy(new DashboardAdapter(mContext, null /* savedInstanceState */,
+ null /* conditions */, null /* suggestionControllerMixin */, null /*
+ lifecycle */));
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
adapter.setSuggestions(suggestions);
final DashboardData dashboardData = adapter.mDashboardData;
reset(adapter); // clear interactions tracking
- adapter.onSuggestionDismissed(suggestions.get(0));
+ adapter.onSuggestionClosed(suggestions.get(0));
assertThat(adapter.mDashboardData).isNotEqualTo(dashboardData);
verify(adapter).notifyDashboardDataChanged(any());
}
@Test
- public void testSetCategories_iconTinted() {
- TypedArray mockTypedArray = mock(TypedArray.class);
- doReturn(mockTypedArray).when(mContext).obtainStyledAttributes(any(int[].class));
- doReturn(0x89000000).when(mockTypedArray).getColor(anyInt(), anyInt());
-
- final DashboardCategory category = new DashboardCategory();
- final Icon mockIcon = mock(Icon.class);
- final Tile tile = new Tile();
- tile.isIconTintable = true;
- tile.icon = mockIcon;
- category.addTile(tile);
-
- mDashboardAdapter.setCategory(category);
-
- verify(mockIcon).setTint(eq(0x89000000));
- }
-
- @Test
- public void testBindConditionAndSuggestion_v2_shouldSetSuggestionAdapterAndNoCrash() {
- mDashboardAdapter = new DashboardAdapter(mContext, null, null, null, null);
+ public void testBindSuggestion_shouldSetSuggestionAdapterAndNoCrash() {
+ mDashboardAdapter = new DashboardAdapter(mContext, null /* savedInstanceState */,
+ null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
- final DashboardCategory category = new DashboardCategory();
- category.addTile(mock(Tile.class));
mDashboardAdapter.setSuggestions(suggestions);
@@ -220,17 +186,88 @@
when(data.getContext()).thenReturn(mContext);
when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.data)).thenReturn(data);
- final DashboardAdapter.SuggestionAndConditionContainerHolder holder =
- new DashboardAdapter.SuggestionAndConditionContainerHolder(itemView);
+ when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
+ when(itemView.findViewById(android.R.id.summary)).thenReturn(mock(TextView.class));
+ final DashboardAdapter.SuggestionContainerHolder holder =
+ new DashboardAdapter.SuggestionContainerHolder(itemView);
- mDashboardAdapter.onBindConditionAndSuggestion(
- holder, DashboardAdapter.SUGGESTION_CONDITION_HEADER_POSITION);
+ mDashboardAdapter.onBindSuggestion(holder, 0);
verify(data).setAdapter(any(SuggestionAdapter.class));
// should not crash
}
+ @Test
+ public void testBindSuggestion_shouldSetSummary() {
+ mDashboardAdapter = new DashboardAdapter(mContext, null /* savedInstanceState */,
+ null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
+ final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
+
+ mDashboardAdapter.setSuggestions(suggestions);
+
+ final RecyclerView data = mock(RecyclerView.class);
+ when(data.getResources()).thenReturn(mResources);
+ when(data.getContext()).thenReturn(mContext);
+ when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
+ final View itemView = mock(View.class);
+ when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
+ final TextView summary = mock(TextView.class);
+ when(itemView.findViewById(android.R.id.summary)).thenReturn(summary);
+ final DashboardAdapter.SuggestionContainerHolder holder =
+ new DashboardAdapter.SuggestionContainerHolder(itemView);
+
+ mDashboardAdapter.onBindSuggestion(holder, 0);
+
+ verify(summary).setText("1");
+
+ suggestions.addAll(makeSuggestionsV2("pkg2", "pkg3", "pkg4"));
+ mDashboardAdapter.setSuggestions(suggestions);
+
+ mDashboardAdapter.onBindSuggestion(holder, 0);
+
+ verify(summary).setText("4");
+ }
+
+ @Test
+ public void onBindTile_internalTile_shouldNotUseGenericBackgroundIcon() {
+ final Context context = RuntimeEnvironment.application;
+ final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
+ final DashboardAdapter.DashboardItemHolder holder =
+ new DashboardAdapter.DashboardItemHolder(view);
+ final Tile tile = new Tile();
+ tile.icon = Icon.createWithResource(context, R.drawable.ic_settings);
+ final DashboardAdapter.IconCache iconCache = mock(DashboardAdapter.IconCache.class);
+ when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
+
+ mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
+ null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
+ ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
+ mDashboardAdapter.onBindTile(holder, tile);
+
+ verify(iconCache, never()).updateIcon(any(Icon.class), any(Drawable.class));
+ }
+
+ @Test
+ public void onBindTile_externalTile_shouldNotUseGenericBackgroundIcon() {
+ final Context context = RuntimeEnvironment.application;
+ final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
+ final DashboardAdapter.DashboardItemHolder holder =
+ new DashboardAdapter.DashboardItemHolder(view);
+ final Tile tile = new Tile();
+ tile.icon = mock(Icon.class);
+ when(tile.icon.getResPackage()).thenReturn("another.package");
+
+ final DashboardAdapter.IconCache iconCache = mock(DashboardAdapter.IconCache.class);
+ when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
+
+ mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
+ null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
+ ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
+ mDashboardAdapter.onBindTile(holder, tile);
+
+ verify(iconCache).updateIcon(eq(tile.icon), any(RoundedHomepageIcon.class));
+ }
+
private List<Suggestion> makeSuggestionsV2(String... pkgNames) {
final List<Suggestion> suggestions = new ArrayList<>();
for (String pkgName : pkgNames) {
@@ -245,8 +282,5 @@
private void setupSuggestions(List<Suggestion> suggestions) {
final Context context = RuntimeEnvironment.application;
mDashboardAdapter.setSuggestions(suggestions);
- mSuggestionHolder = new DashboardAdapter.SuggestionAndConditionHeaderHolder(
- LayoutInflater.from(context).inflate(
- R.layout.suggestion_condition_header, new RelativeLayout(context), true));
}
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterV2Test.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterV2Test.java
deleted file mode 100644
index 40150cb..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterV2Test.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.service.settings.suggestions.Suggestion;
-import android.support.v7.widget.RecyclerView;
-import android.util.DisplayMetrics;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.TestConfig;
-import com.android.settings.dashboard.conditional.Condition;
-import com.android.settings.dashboard.suggestions.SuggestionAdapterV2;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.SettingsShadowResources;
-import com.android.settingslib.drawer.Tile;
-
-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.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH,
- sdk = TestConfig.SDK_VERSION,
- shadows = {
- SettingsShadowResources.class,
- SettingsShadowResources.SettingsShadowTheme.class,
- })
-public class DashboardAdapterV2Test {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private SettingsActivity mContext;
- @Mock
- private View mView;
- @Mock
- private Condition mCondition;
- @Mock
- private Resources mResources;
- private FakeFeatureFactory mFactory;
- private DashboardAdapterV2 mDashboardAdapter;
- private List<Condition> mConditionList;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFactory = FakeFeatureFactory.setupForTest();
- when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
-
- when(mContext.getResources()).thenReturn(mResources);
- when(mResources.getQuantityString(any(int.class), any(int.class), any()))
- .thenReturn("");
-
- mConditionList = new ArrayList<>();
- mConditionList.add(mCondition);
- when(mCondition.shouldShow()).thenReturn(true);
- mDashboardAdapter = new DashboardAdapterV2(mContext, null /* savedInstanceState */,
- mConditionList, null /* suggestionControllerMixin */, null /* lifecycle */);
- when(mView.getTag()).thenReturn(mCondition);
- }
-
- @Test
- public void testSuggestionDismissed_notOnlySuggestion_updateSuggestionOnly() {
- final DashboardAdapterV2 adapter =
- spy(new DashboardAdapterV2(mContext, null /* savedInstanceState */,
- null /* conditions */, null /* suggestionControllerMixin */, null /*
- lifecycle */));
- final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3");
- adapter.setSuggestions(suggestions);
-
- final RecyclerView data = mock(RecyclerView.class);
- when(data.getResources()).thenReturn(mResources);
- when(data.getContext()).thenReturn(mContext);
- when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
- final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
- when(itemView.findViewById(android.R.id.summary)).thenReturn(mock(TextView.class));
- final DashboardAdapterV2.SuggestionContainerHolder holder =
- new DashboardAdapterV2.SuggestionContainerHolder(itemView);
-
- adapter.onBindSuggestion(holder, 0);
-
- final DashboardDataV2 dashboardData = adapter.mDashboardData;
- reset(adapter); // clear interactions tracking
-
- final Suggestion suggestionToRemove = suggestions.get(1);
- adapter.onSuggestionClosed(suggestionToRemove);
-
- assertThat(adapter.mDashboardData).isEqualTo(dashboardData);
- assertThat(suggestions.size()).isEqualTo(2);
- assertThat(suggestions.contains(suggestionToRemove)).isFalse();
- verify(adapter, never()).notifyDashboardDataChanged(any());
- }
-
- @Test
- public void testSuggestionDismissed_moreThanTwoSuggestions_shouldNotCrash() {
- final RecyclerView data = new RecyclerView(RuntimeEnvironment.application);
- final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
- when(itemView.findViewById(android.R.id.summary)).thenReturn(mock(TextView.class));
- final DashboardAdapterV2.SuggestionContainerHolder holder =
- new DashboardAdapterV2.SuggestionContainerHolder(itemView);
- final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3", "pkg4");
- final DashboardAdapterV2 adapter = spy(new DashboardAdapterV2(mContext,
- null /*savedInstance */, null /* conditions */,
- null /* suggestionControllerMixin */,
- null /* lifecycle */));
- adapter.setSuggestions(suggestions);
- adapter.onBindSuggestion(holder, 0);
-
- adapter.onSuggestionClosed(suggestions.get(1));
-
- // verify operations that access the lists will not cause ConcurrentModificationException
- assertThat(holder.data.getAdapter().getItemCount()).isEqualTo(3);
- adapter.setSuggestions(suggestions);
- // should not crash
- }
-
- @Test
- public void testSuggestionDismissed_onlySuggestion_updateDashboardData() {
- DashboardAdapterV2 adapter =
- spy(new DashboardAdapterV2(mContext, null /* savedInstanceState */,
- null /* conditions */, null /* suggestionControllerMixin */, null /*
- lifecycle */));
- final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
- adapter.setSuggestions(suggestions);
- final DashboardDataV2 dashboardData = adapter.mDashboardData;
- reset(adapter); // clear interactions tracking
-
- adapter.onSuggestionClosed(suggestions.get(0));
-
- assertThat(adapter.mDashboardData).isNotEqualTo(dashboardData);
- verify(adapter).notifyDashboardDataChanged(any());
- }
-
- @Test
- public void testBindSuggestion_shouldSetSuggestionAdapterAndNoCrash() {
- mDashboardAdapter = new DashboardAdapterV2(mContext, null /* savedInstanceState */,
- null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
- final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
-
- mDashboardAdapter.setSuggestions(suggestions);
-
- final RecyclerView data = mock(RecyclerView.class);
- when(data.getResources()).thenReturn(mResources);
- when(data.getContext()).thenReturn(mContext);
- when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
- final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
- when(itemView.findViewById(android.R.id.summary)).thenReturn(mock(TextView.class));
- final DashboardAdapterV2.SuggestionContainerHolder holder =
- new DashboardAdapterV2.SuggestionContainerHolder(itemView);
-
- mDashboardAdapter.onBindSuggestion(holder, 0);
-
- verify(data).setAdapter(any(SuggestionAdapterV2.class));
- // should not crash
- }
-
- @Test
- public void testBindSuggestion_shouldSetSummary() {
- mDashboardAdapter = new DashboardAdapterV2(mContext, null /* savedInstanceState */,
- null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
- final List<Suggestion> suggestions = makeSuggestionsV2("pkg1");
-
- mDashboardAdapter.setSuggestions(suggestions);
-
- final RecyclerView data = mock(RecyclerView.class);
- when(data.getResources()).thenReturn(mResources);
- when(data.getContext()).thenReturn(mContext);
- when(mResources.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
- final View itemView = mock(View.class);
- when(itemView.findViewById(R.id.suggestion_list)).thenReturn(data);
- final TextView summary = mock(TextView.class);
- when(itemView.findViewById(android.R.id.summary)).thenReturn(summary);
- final DashboardAdapterV2.SuggestionContainerHolder holder =
- new DashboardAdapterV2.SuggestionContainerHolder(itemView);
-
- mDashboardAdapter.onBindSuggestion(holder, 0);
-
- verify(summary).setText("1");
-
- suggestions.addAll(makeSuggestionsV2("pkg2", "pkg3", "pkg4"));
- mDashboardAdapter.setSuggestions(suggestions);
-
- mDashboardAdapter.onBindSuggestion(holder, 0);
-
- verify(summary).setText("4");
- }
-
- @Test
- public void onBindTile_internalTile_shouldNotUseGenericBackgroundIcon() {
- final Context context = RuntimeEnvironment.application;
- final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
- final DashboardAdapterV2.DashboardItemHolder holder =
- new DashboardAdapterV2.DashboardItemHolder(view);
- final Tile tile = new Tile();
- tile.icon = Icon.createWithResource(context, R.drawable.ic_settings);
- final DashboardAdapterV2.IconCache iconCache = mock(DashboardAdapterV2.IconCache.class);
- when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
-
- mDashboardAdapter = new DashboardAdapterV2(context, null /* savedInstanceState */,
- null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
- ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
- mDashboardAdapter.onBindTile(holder, tile);
-
- verify(iconCache, never()).updateIcon(any(Icon.class), any(Drawable.class));
- }
-
- @Test
- public void onBindTile_externalTile_shouldNotUseGenericBackgroundIcon() {
- final Context context = RuntimeEnvironment.application;
- final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
- final DashboardAdapterV2.DashboardItemHolder holder =
- new DashboardAdapterV2.DashboardItemHolder(view);
- final Tile tile = new Tile();
- tile.icon = mock(Icon.class);
- when(tile.icon.getResPackage()).thenReturn("another.package");
-
- final DashboardAdapterV2.IconCache iconCache = mock(DashboardAdapterV2.IconCache.class);
- when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
-
- mDashboardAdapter = new DashboardAdapterV2(context, null /* savedInstanceState */,
- null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
- ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
- mDashboardAdapter.onBindTile(holder, tile);
-
- verify(iconCache).updateIcon(eq(tile.icon), any(RoundedHomepageIcon.class));
- }
-
- private List<Suggestion> makeSuggestionsV2(String... pkgNames) {
- final List<Suggestion> suggestions = new ArrayList<>();
- for (String pkgName : pkgNames) {
- final Suggestion suggestion = new Suggestion.Builder(pkgName)
- .setPendingIntent(mock(PendingIntent.class))
- .build();
- suggestions.add(suggestion);
- }
- return suggestions;
- }
-
- private void setupSuggestions(List<Suggestion> suggestions) {
- final Context context = RuntimeEnvironment.application;
- mDashboardAdapter.setSuggestions(suggestions);
- }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
index 1116d7d..35f525e 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
@@ -17,8 +17,9 @@
package com.android.settings.dashboard;
import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_CONTAINER;
-import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_FOOTER;
+import static com.android.settings.dashboard.DashboardData.STABLE_ID_CONDITION_FOOTER;
import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONTAINER;
+import static com.android.settings.dashboard.DashboardData.STABLE_ID_SUGGESTION_CONDITION_DIVIDER;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -103,14 +104,14 @@
.setConditions(oneItemConditions)
.setCategory(mDashboardCategory)
.setSuggestions(suggestions)
- .setSuggestionConditionMode(DashboardData.HEADER_MODE_FULLY_EXPANDED)
+ .setConditionExpanded(true)
.build();
mDashboardDataWithTwoConditions = new DashboardData.Builder()
.setConditions(twoItemsConditions)
.setCategory(mDashboardCategory)
.setSuggestions(suggestions)
- .setSuggestionConditionMode(DashboardData.HEADER_MODE_FULLY_EXPANDED)
+ .setConditionExpanded(true)
.build();
mDashboardDataWithNoItems = new DashboardData.Builder()
@@ -124,21 +125,23 @@
public void testBuildItemsData_shouldSetstableId() {
final List<DashboardData.Item> items = mDashboardDataWithOneConditions.getItemList();
- // Header, suggestion, condition, footer, 1 tile
- assertThat(items).hasSize(4);
+ // suggestion, seperator, condition, footer, 1 tile
+ assertThat(items).hasSize(5);
assertThat(items.get(0).id).isEqualTo(STABLE_ID_SUGGESTION_CONTAINER);
- assertThat(items.get(1).id).isEqualTo(STABLE_ID_CONDITION_CONTAINER);
- assertThat(items.get(2).id).isEqualTo(STABLE_ID_SUGGESTION_CONDITION_FOOTER);
- assertThat(items.get(3).id).isEqualTo(Objects.hash(mTestCategoryTile.title));
+ assertThat(items.get(1).id).isEqualTo(STABLE_ID_SUGGESTION_CONDITION_DIVIDER);
+ assertThat(items.get(2).id).isEqualTo(STABLE_ID_CONDITION_CONTAINER);
+ assertThat(items.get(3).id).isEqualTo(STABLE_ID_CONDITION_FOOTER);
+ assertThat(items.get(4).id).isEqualTo(Objects.hash(mTestCategoryTile.title));
}
@Test
public void testBuildItemsData_containsAllData() {
final Object[] expectedObjects = {
mDashboardDataWithOneConditions.getSuggestions(),
+ null /* divider */,
mDashboardDataWithOneConditions.getConditions(),
- null, mTestCategoryTile};
+ null /* footer */, mTestCategoryTile};
final int expectedSize = expectedObjects.length;
assertThat(mDashboardDataWithOneConditions.getItemList()).hasSize(expectedSize);
@@ -147,14 +150,13 @@
final Object item = mDashboardDataWithOneConditions.getItemEntityByPosition(i);
if (item instanceof List) {
assertThat(item).isEqualTo(expectedObjects[i]);
- } else if (item instanceof DashboardData.SuggestionConditionHeaderData) {
- DashboardData.SuggestionConditionHeaderData i1 =
- (DashboardData.SuggestionConditionHeaderData) item;
- DashboardData.SuggestionConditionHeaderData i2 =
- (DashboardData.SuggestionConditionHeaderData) expectedObjects[i];
+ } else if (item instanceof DashboardData.ConditionHeaderData) {
+ DashboardData.ConditionHeaderData i1 =
+ (DashboardData.ConditionHeaderData) item;
+ DashboardData.ConditionHeaderData i2 =
+ (DashboardData.ConditionHeaderData) expectedObjects[i];
assertThat(i1.title).isEqualTo(i2.title);
assertThat(i1.conditionCount).isEqualTo(i2.conditionCount);
- assertThat(i1.hiddenSuggestionCount).isEqualTo(i2.hiddenSuggestionCount);
} else {
assertThat(item).isSameAs(expectedObjects[i]);
}
@@ -209,10 +211,10 @@
public void testDiffUtil_InsertOneCondition_ResultDataOneChanged() {
//Build testResultData
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
- // Item in position 2 is the condition container containing the list of conditions, which
+ // Item in position 3 is the condition container containing the list of conditions, which
// gets 1 more item
testResultData.add(new ListUpdateResult.ResultData(
- ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 1, 1));
+ ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 2, 1));
testDiffUtil(mDashboardDataWithOneConditions,
mDashboardDataWithTwoConditions, testResultData);
@@ -222,10 +224,11 @@
public void testDiffUtil_RemoveOneSuggestion_causeItemRemoveAndChange() {
//Build testResultData
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
+ // removed suggestion and the divider
testResultData.add(new ListUpdateResult.ResultData(
- ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 1));
+ ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 2));
testResultData.add(new ListUpdateResult.ResultData(
- ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 1, 1));
+ ListUpdateResult.ResultData.TYPE_OPERATION_CHANGE, 2, 1));
// Build DashboardData
final List<Condition> oneItemConditions = new ArrayList<>();
when(mTestCondition.shouldShow()).thenReturn(true);
@@ -237,13 +240,13 @@
.setConditions(oneItemConditions)
.setCategory(mDashboardCategory)
.setSuggestions(suggestions)
- .setSuggestionConditionMode(DashboardData.HEADER_MODE_DEFAULT)
+ .setConditionExpanded(false)
.build();
final DashboardData newData = new DashboardData.Builder()
.setConditions(oneItemConditions)
.setSuggestions(null)
.setCategory(mDashboardCategory)
- .setSuggestionConditionMode(DashboardData.HEADER_MODE_DEFAULT)
+ .setConditionExpanded(false)
.build();
testDiffUtil(oldData, newData, testResultData);
@@ -254,7 +257,7 @@
//Build testResultData
final List<ListUpdateResult.ResultData> testResultData = new ArrayList<>();
testResultData.add(new ListUpdateResult.ResultData(
- ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 4));
+ ListUpdateResult.ResultData.TYPE_OPERATION_REMOVE, 0, 5));
testDiffUtil(mDashboardDataWithOneConditions, mDashboardDataWithNoItems, testResultData);
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
index 2a7b829..a1c8d67 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardSummaryTest.java
@@ -164,10 +164,4 @@
mSummary.onCategoriesChanged();
verify(mSummary).rebuildUI();
}
-
- @Test
- public void onSuggestionDismissed_shouldNotRebuildUI() {
- mSummary.onSuggestionDismissed(mock(Suggestion.class));
- verify(mSummary, never()).rebuildUI();
- }
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java
index d943fe3..e33db6e 100644
--- a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterTest.java
@@ -15,6 +15,11 @@
*/
package com.android.settings.dashboard.conditional;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@@ -22,13 +27,9 @@
import android.widget.LinearLayout;
import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.DashboardAdapter;
-import com.android.settings.dashboard.DashboardData;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
@@ -38,9 +39,8 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -70,35 +70,23 @@
}
@Test
- public void getItemCount_notFullyExpanded_shouldReturn0() {
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_DEFAULT);
- assertThat(mConditionAdapter.getItemCount()).isEqualTo(0);
-
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED);
- assertThat(mConditionAdapter.getItemCount()).isEqualTo(0);
-
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_COLLAPSED);
+ public void getItemCount_notExpanded_shouldReturn0() {
+ mConditionAdapter = new ConditionAdapter(mContext, mOneCondition, false);
assertThat(mConditionAdapter.getItemCount()).isEqualTo(0);
}
@Test
- public void getItemCount_fullyExpanded_shouldReturnListSize() {
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_FULLY_EXPANDED);
+ public void getItemCount_expanded_shouldReturnListSize() {
+ mConditionAdapter = new ConditionAdapter(mContext, mOneCondition, true);
assertThat(mConditionAdapter.getItemCount()).isEqualTo(1);
- mConditionAdapter = new ConditionAdapter(
- mContext, mTwoConditions, DashboardData.HEADER_MODE_FULLY_EXPANDED);
+ mConditionAdapter = new ConditionAdapter(mContext, mTwoConditions, true);
assertThat(mConditionAdapter.getItemCount()).isEqualTo(2);
}
@Test
public void getItemViewType_shouldReturnConditionTile() {
- mConditionAdapter = new ConditionAdapter(
- mContext, mTwoConditions, DashboardData.HEADER_MODE_FULLY_EXPANDED);
+ mConditionAdapter = new ConditionAdapter(mContext, mTwoConditions, true);
assertThat(mConditionAdapter.getItemViewType(0)).isEqualTo(R.layout.condition_tile);
}
@@ -108,8 +96,7 @@
R.layout.condition_tile, new LinearLayout(mContext), true);
final DashboardAdapter.DashboardItemHolder viewHolder =
new DashboardAdapter.DashboardItemHolder(view);
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED);
+ mConditionAdapter = new ConditionAdapter(mContext, mOneCondition, true);
mConditionAdapter.onBindViewHolder(viewHolder, 0);
final View card = view.findViewById(R.id.content);
@@ -122,8 +109,7 @@
R.layout.condition_tile, new LinearLayout(mContext), true);
final DashboardAdapter.DashboardItemHolder viewHolder =
new DashboardAdapter.DashboardItemHolder(view);
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED);
+ mConditionAdapter = new ConditionAdapter(mContext, mOneCondition, true);
mConditionAdapter.onBindViewHolder(viewHolder, 0);
final View card = view.findViewById(R.id.content);
@@ -137,9 +123,8 @@
final View view = LayoutInflater.from(mContext).inflate(
R.layout.condition_tile, new LinearLayout(mContext), true);
final DashboardAdapter.DashboardItemHolder viewHolder =
- new DashboardAdapter.DashboardItemHolder(view);
- mConditionAdapter = new ConditionAdapter(
- mContext, mOneCondition, DashboardData.HEADER_MODE_SUGGESTION_EXPANDED);
+ new DashboardAdapter.DashboardItemHolder(view);
+ mConditionAdapter = new ConditionAdapter(mContext, mOneCondition, true);
mConditionAdapter.addDismissHandling(recyclerView);
// do not bind viewholder to simulate the null condition scenario
diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterV2Test.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterV2Test.java
deleted file mode 100644
index 5e0ecec..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionAdapterV2Test.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard.conditional;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.dashboard.DashboardAdapterV2;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class ConditionAdapterV2Test {
- @Mock
- private Condition mCondition1;
- @Mock
- private Condition mCondition2;
-
- private Context mContext;
- private ConditionAdapterV2 mConditionAdapter;
- private List<Condition> mOneCondition;
- private List<Condition> mTwoConditions;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- final CharSequence[] actions = new CharSequence[2];
- when(mCondition1.getActions()).thenReturn(actions);
- when(mCondition1.shouldShow()).thenReturn(true);
- mOneCondition = new ArrayList<>();
- mOneCondition.add(mCondition1);
- mTwoConditions = new ArrayList<>();
- mTwoConditions.add(mCondition1);
- mTwoConditions.add(mCondition2);
- }
-
- @Test
- public void getItemCount_notExpanded_shouldReturn0() {
- mConditionAdapter = new ConditionAdapterV2(mContext, mOneCondition, false);
- assertThat(mConditionAdapter.getItemCount()).isEqualTo(0);
- }
-
- @Test
- public void getItemCount_expanded_shouldReturnListSize() {
- mConditionAdapter = new ConditionAdapterV2(mContext, mOneCondition, true);
- assertThat(mConditionAdapter.getItemCount()).isEqualTo(1);
-
- mConditionAdapter = new ConditionAdapterV2(mContext, mTwoConditions, true);
- assertThat(mConditionAdapter.getItemCount()).isEqualTo(2);
- }
-
- @Test
- public void getItemViewType_shouldReturnConditionTile() {
- mConditionAdapter = new ConditionAdapterV2(mContext, mTwoConditions, true);
- assertThat(mConditionAdapter.getItemViewType(0)).isEqualTo(R.layout.condition_tile);
- }
-
- @Test
- public void onBindViewHolder_shouldSetListener() {
- final View view = LayoutInflater.from(mContext).inflate(
- R.layout.condition_tile, new LinearLayout(mContext), true);
- final DashboardAdapterV2.DashboardItemHolder viewHolder =
- new DashboardAdapterV2.DashboardItemHolder(view);
- mConditionAdapter = new ConditionAdapterV2(mContext, mOneCondition, true);
-
- mConditionAdapter.onBindViewHolder(viewHolder, 0);
- final View card = view.findViewById(R.id.content);
- assertThat(card.hasOnClickListeners()).isTrue();
- }
-
- @Test
- public void viewClick_shouldInvokeConditionPrimaryClick() {
- final View view = LayoutInflater.from(mContext).inflate(
- R.layout.condition_tile, new LinearLayout(mContext), true);
- final DashboardAdapterV2.DashboardItemHolder viewHolder =
- new DashboardAdapterV2.DashboardItemHolder(view);
- mConditionAdapter = new ConditionAdapterV2(mContext, mOneCondition, true);
-
- mConditionAdapter.onBindViewHolder(viewHolder, 0);
- final View card = view.findViewById(R.id.content);
- card.performClick();
- verify(mCondition1).onPrimaryClick();
- }
-
- @Test
- public void onSwiped_nullCondition_shouldNotCrash() {
- final RecyclerView recyclerView = new RecyclerView(mContext);
- final View view = LayoutInflater.from(mContext).inflate(
- R.layout.condition_tile, new LinearLayout(mContext), true);
- final DashboardAdapterV2.DashboardItemHolder viewHolder =
- new DashboardAdapterV2.DashboardItemHolder(view);
- mConditionAdapter = new ConditionAdapterV2(mContext, mOneCondition, true);
- mConditionAdapter.addDismissHandling(recyclerView);
-
- // do not bind viewholder to simulate the null condition scenario
- mConditionAdapter.mSwipeCallback.onSwiped(viewHolder, 0);
- // no crash
- }
-
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
index 49e82e4..ebf3dc7 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterTest.java
@@ -16,12 +16,19 @@
package com.android.settings.dashboard.suggestions;
import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.PendingIntent;
import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.service.settings.suggestions.Suggestion;
import android.view.LayoutInflater;
@@ -46,6 +53,7 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
import java.util.ArrayList;
import java.util.List;
@@ -87,20 +95,21 @@
@Test
public void getItemCount_shouldReturnListSize() {
mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
- mOneSuggestion, new ArrayList<>());
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(mOneSuggestion);
assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(1);
- mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
- mTwoSuggestions, new ArrayList<>());
+ mSuggestionAdapter.setSuggestions(mTwoSuggestions);
assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(2);
}
@Test
public void getItemViewType_shouldReturnSuggestionTile() {
mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
- mOneSuggestion, new ArrayList<>());
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(mOneSuggestion);
assertThat(mSuggestionAdapter.getItemViewType(0))
- .isEqualTo(R.layout.suggestion_tile);
+ .isEqualTo(R.layout.suggestion_tile);
}
@Test
@@ -112,19 +121,21 @@
.setSummary("456")
.build());
mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
- suggestions, new ArrayList<>());
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(suggestions);
assertThat(mSuggestionAdapter.getItemViewType(0))
- .isEqualTo(R.layout.suggestion_tile_with_button);
+ .isEqualTo(R.layout.suggestion_tile_with_button);
}
@Test
public void onBindViewHolder_shouldLog() {
final View view = spy(LayoutInflater.from(mContext).inflate(
- R.layout.suggestion_tile, new LinearLayout(mContext), true));
+ R.layout.suggestion_tile, new LinearLayout(mContext), true));
mSuggestionHolder = new DashboardAdapter.DashboardItemHolder(view);
mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
- mOneSuggestion, new ArrayList<>());
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(mOneSuggestion);
// Bind twice
mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
@@ -150,6 +161,31 @@
}
@Test
+ public void onBindViewHolder_hasButton_buttonShouldHandleClick()
+ throws PendingIntent.CanceledException {
+ final List<Suggestion> suggestions = new ArrayList<>();
+ final PendingIntent pendingIntent = mock(PendingIntent.class);
+ suggestions.add(new Suggestion.Builder("id")
+ .setFlags(Suggestion.FLAG_HAS_BUTTON)
+ .setTitle("123")
+ .setSummary("456")
+ .setPendingIntent(pendingIntent)
+ .build());
+ mSuggestionAdapter = new SuggestionAdapter(mContext, mSuggestionControllerMixin,
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(suggestions);
+ mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
+ new FrameLayout(RuntimeEnvironment.application),
+ mSuggestionAdapter.getItemViewType(0));
+
+ mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
+ mSuggestionHolder.itemView.findViewById(android.R.id.primary).performClick();
+
+ verify(mSuggestionControllerMixin).launchSuggestion(suggestions.get(0));
+ verify(pendingIntent).send();
+ }
+
+ @Test
public void getSuggestions_shouldReturnSuggestionWhenMatch() {
final List<Suggestion> suggestions = makeSuggestions("pkg1");
setupSuggestions(mActivity, suggestions);
@@ -157,9 +193,92 @@
assertThat(mSuggestionAdapter.getSuggestion(0)).isNotNull();
}
+ @Test
+ public void onBindViewHolder_closeButtonShouldHandleClick()
+ throws PendingIntent.CanceledException {
+ final List<Suggestion> suggestions = makeSuggestions("pkg1");
+ final SuggestionAdapter.Callback callback = mock(SuggestionAdapter.Callback.class);
+ mSuggestionAdapter = new SuggestionAdapter(mActivity, mSuggestionControllerMixin,
+ null /* savedInstanceState */, callback, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(suggestions);
+ mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
+ new FrameLayout(RuntimeEnvironment.application),
+ mSuggestionAdapter.getItemViewType(0));
+
+ mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
+ mSuggestionHolder.itemView.findViewById(R.id.close_button).performClick();
+
+ final Suggestion suggestion = suggestions.get(0);
+ verify(mFeatureFactory.suggestionsFeatureProvider).dismissSuggestion(
+ mActivity, mSuggestionControllerMixin, suggestion);
+ verify(callback).onSuggestionClosed(suggestion);
+ }
+
+ @Test
+ public void onBindViewHolder_differentPackage_shouldNotTintIcon()
+ throws PendingIntent.CanceledException {
+ final Icon icon = mock(Icon.class);
+ when(icon.getResPackage()).thenReturn("pkg1");
+ when(mActivity.getPackageName()).thenReturn("pkg2");
+ final Suggestion suggestion = new Suggestion.Builder("pkg1")
+ .setPendingIntent(mock(PendingIntent.class))
+ .setIcon(icon)
+ .build();
+ final List<Suggestion> suggestions = new ArrayList<>();
+ suggestions.add(suggestion);
+ mSuggestionAdapter = new SuggestionAdapter(mActivity, mSuggestionControllerMixin,
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(suggestions);
+ mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
+ new FrameLayout(RuntimeEnvironment.application),
+ mSuggestionAdapter.getItemViewType(0));
+ DashboardAdapter.IconCache cache = mock(DashboardAdapter.IconCache.class);
+ final Drawable drawable = mock(Drawable.class);
+ when(cache.getIcon(icon)).thenReturn(drawable);
+ ReflectionHelpers.setField(mSuggestionAdapter, "mCache", cache);
+
+ mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
+
+ verify(drawable, never()).setTint(anyInt());
+ }
+
+ @Test
+ public void onBindViewHolder_samePackage_shouldTintIcon()
+ throws PendingIntent.CanceledException {
+ final Icon icon = mock(Icon.class);
+ final String packageName = "pkg1";
+ when(icon.getResPackage()).thenReturn(packageName);
+ when(mActivity.getPackageName()).thenReturn(packageName);
+ final Suggestion suggestion = new Suggestion.Builder(packageName)
+ .setPendingIntent(mock(PendingIntent.class))
+ .setIcon(icon)
+ .build();
+ final List<Suggestion> suggestions = new ArrayList<>();
+ suggestions.add(suggestion);
+ mSuggestionAdapter = new SuggestionAdapter(mActivity, mSuggestionControllerMixin,
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(suggestions);
+ mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
+ new FrameLayout(RuntimeEnvironment.application),
+ mSuggestionAdapter.getItemViewType(0));
+ DashboardAdapter.IconCache cache = mock(DashboardAdapter.IconCache.class);
+ final Drawable drawable = mock(Drawable.class);
+ when(cache.getIcon(icon)).thenReturn(drawable);
+ ReflectionHelpers.setField(mSuggestionAdapter, "mCache", cache);
+ TypedArray typedArray = mock(TypedArray.class);
+ final int colorAccent = 1234;
+ when(mActivity.obtainStyledAttributes(any())).thenReturn(typedArray);
+ when(typedArray.getColor(anyInt(), anyInt())).thenReturn(colorAccent);
+
+ mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
+
+ verify(drawable).setTint(colorAccent);
+ }
+
private void setupSuggestions(Context context, List<Suggestion> suggestions) {
mSuggestionAdapter = new SuggestionAdapter(context, mSuggestionControllerMixin,
- suggestions, new ArrayList<>());
+ null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
+ mSuggestionAdapter.setSuggestions(suggestions);
mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
new FrameLayout(RuntimeEnvironment.application),
mSuggestionAdapter.getItemViewType(0));
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2Test.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2Test.java
deleted file mode 100644
index 181c878..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionAdapterV2Test.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (C) 2018 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.dashboard.suggestions;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Icon;
-import android.service.settings.suggestions.Suggestion;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.TestConfig;
-import com.android.settings.dashboard.DashboardAdapterV2;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.suggestions.SuggestionControllerMixin;
-
-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.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SuggestionAdapterV2Test {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private SettingsActivity mActivity;
- @Mock
- private SuggestionControllerMixin mSuggestionControllerMixin;
- private FakeFeatureFactory mFeatureFactory;
- private Context mContext;
- private SuggestionAdapterV2 mSuggestionAdapter;
- private DashboardAdapterV2.DashboardItemHolder mSuggestionHolder;
- private List<Suggestion> mOneSuggestion;
- private List<Suggestion> mTwoSuggestions;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = RuntimeEnvironment.application;
- mFeatureFactory = FakeFeatureFactory.setupForTest();
-
- final Suggestion suggestion1 = new Suggestion.Builder("id1")
- .setTitle("Test suggestion 1")
- .build();
- final Suggestion suggestion2 = new Suggestion.Builder("id2")
- .setTitle("Test suggestion 2")
- .build();
- mOneSuggestion = new ArrayList<>();
- mOneSuggestion.add(suggestion1);
- mTwoSuggestions = new ArrayList<>();
- mTwoSuggestions.add(suggestion1);
- mTwoSuggestions.add(suggestion2);
- }
-
- @Test
- public void getItemCount_shouldReturnListSize() {
- mSuggestionAdapter = new SuggestionAdapterV2(mContext, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(mOneSuggestion);
- assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(1);
-
- mSuggestionAdapter.setSuggestions(mTwoSuggestions);
- assertThat(mSuggestionAdapter.getItemCount()).isEqualTo(2);
- }
-
- @Test
- public void getItemViewType_shouldReturnSuggestionTile() {
- mSuggestionAdapter = new SuggestionAdapterV2(mContext, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(mOneSuggestion);
- assertThat(mSuggestionAdapter.getItemViewType(0))
- .isEqualTo(R.layout.suggestion_tile_v2);
- }
-
- @Test
- public void getItemType_hasButton_shouldReturnSuggestionWithButton() {
- final List<Suggestion> suggestions = new ArrayList<>();
- suggestions.add(new Suggestion.Builder("id")
- .setFlags(Suggestion.FLAG_HAS_BUTTON)
- .setTitle("123")
- .setSummary("456")
- .build());
- mSuggestionAdapter = new SuggestionAdapterV2(mContext, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(suggestions);
-
- assertThat(mSuggestionAdapter.getItemViewType(0))
- .isEqualTo(R.layout.suggestion_tile_with_button_v2);
- }
-
- @Test
- public void onBindViewHolder_shouldLog() {
- final View view = spy(LayoutInflater.from(mContext).inflate(
- R.layout.suggestion_tile, new LinearLayout(mContext), true));
- mSuggestionHolder = new DashboardAdapterV2.DashboardItemHolder(view);
- mSuggestionAdapter = new SuggestionAdapterV2(mContext, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(mOneSuggestion);
-
- // Bind twice
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-
- // Log once
- verify(mFeatureFactory.metricsFeatureProvider).action(
- mContext, MetricsProto.MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
- mOneSuggestion.get(0).getId());
- }
-
- @Test
- public void onBindViewHolder_itemViewShouldHandleClick()
- throws PendingIntent.CanceledException {
- final List<Suggestion> suggestions = makeSuggestions("pkg1");
- setupSuggestions(mActivity, suggestions);
-
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
- mSuggestionHolder.itemView.performClick();
-
- verify(mSuggestionControllerMixin).launchSuggestion(suggestions.get(0));
- verify(suggestions.get(0).getPendingIntent()).send();
- }
-
- @Test
- public void onBindViewHolder_hasButton_buttonShouldHandleClick()
- throws PendingIntent.CanceledException {
- final List<Suggestion> suggestions = new ArrayList<>();
- final PendingIntent pendingIntent = mock(PendingIntent.class);
- suggestions.add(new Suggestion.Builder("id")
- .setFlags(Suggestion.FLAG_HAS_BUTTON)
- .setTitle("123")
- .setSummary("456")
- .setPendingIntent(pendingIntent)
- .build());
- mSuggestionAdapter = new SuggestionAdapterV2(mContext, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(suggestions);
- mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
- new FrameLayout(RuntimeEnvironment.application),
- mSuggestionAdapter.getItemViewType(0));
-
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
- mSuggestionHolder.itemView.findViewById(android.R.id.primary).performClick();
-
- verify(mSuggestionControllerMixin).launchSuggestion(suggestions.get(0));
- verify(pendingIntent).send();
- }
-
- @Test
- public void getSuggestions_shouldReturnSuggestionWhenMatch() {
- final List<Suggestion> suggestions = makeSuggestions("pkg1");
- setupSuggestions(mActivity, suggestions);
-
- assertThat(mSuggestionAdapter.getSuggestion(0)).isNotNull();
- }
-
- @Test
- public void onBindViewHolder_closeButtonShouldHandleClick()
- throws PendingIntent.CanceledException {
- final List<Suggestion> suggestions = makeSuggestions("pkg1");
- final SuggestionAdapterV2.Callback callback = mock(SuggestionAdapterV2.Callback.class);
- mSuggestionAdapter = new SuggestionAdapterV2(mActivity, mSuggestionControllerMixin,
- null /* savedInstanceState */, callback, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(suggestions);
- mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
- new FrameLayout(RuntimeEnvironment.application),
- mSuggestionAdapter.getItemViewType(0));
-
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
- mSuggestionHolder.itemView.findViewById(R.id.close_button).performClick();
-
- final Suggestion suggestion = suggestions.get(0);
- verify(mFeatureFactory.suggestionsFeatureProvider).dismissSuggestion(
- mActivity, mSuggestionControllerMixin, suggestion);
- verify(callback).onSuggestionClosed(suggestion);
- }
-
- @Test
- public void onBindViewHolder_differentPackage_shouldNotTintIcon()
- throws PendingIntent.CanceledException {
- final Icon icon = mock(Icon.class);
- when(icon.getResPackage()).thenReturn("pkg1");
- when(mActivity.getPackageName()).thenReturn("pkg2");
- final Suggestion suggestion = new Suggestion.Builder("pkg1")
- .setPendingIntent(mock(PendingIntent.class))
- .setIcon(icon)
- .build();
- final List<Suggestion> suggestions = new ArrayList<>();
- suggestions.add(suggestion);
- mSuggestionAdapter = new SuggestionAdapterV2(mActivity, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(suggestions);
- mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
- new FrameLayout(RuntimeEnvironment.application),
- mSuggestionAdapter.getItemViewType(0));
- DashboardAdapterV2.IconCache cache = mock(DashboardAdapterV2.IconCache.class);
- final Drawable drawable = mock(Drawable.class);
- when(cache.getIcon(icon)).thenReturn(drawable);
- ReflectionHelpers.setField(mSuggestionAdapter, "mCache", cache);
-
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-
- verify(drawable, never()).setTint(anyInt());
- }
-
- @Test
- public void onBindViewHolder_samePackage_shouldTintIcon()
- throws PendingIntent.CanceledException {
- final Icon icon = mock(Icon.class);
- final String packageName = "pkg1";
- when(icon.getResPackage()).thenReturn(packageName);
- when(mActivity.getPackageName()).thenReturn(packageName);
- final Suggestion suggestion = new Suggestion.Builder(packageName)
- .setPendingIntent(mock(PendingIntent.class))
- .setIcon(icon)
- .build();
- final List<Suggestion> suggestions = new ArrayList<>();
- suggestions.add(suggestion);
- mSuggestionAdapter = new SuggestionAdapterV2(mActivity, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(suggestions);
- mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
- new FrameLayout(RuntimeEnvironment.application),
- mSuggestionAdapter.getItemViewType(0));
- DashboardAdapterV2.IconCache cache = mock(DashboardAdapterV2.IconCache.class);
- final Drawable drawable = mock(Drawable.class);
- when(cache.getIcon(icon)).thenReturn(drawable);
- ReflectionHelpers.setField(mSuggestionAdapter, "mCache", cache);
- TypedArray typedArray = mock(TypedArray.class);
- final int colorAccent = 1234;
- when(mActivity.obtainStyledAttributes(any())).thenReturn(typedArray);
- when(typedArray.getColor(anyInt(), anyInt())).thenReturn(colorAccent);
-
- mSuggestionAdapter.onBindViewHolder(mSuggestionHolder, 0);
-
- verify(drawable).setTint(colorAccent);
- }
-
- private void setupSuggestions(Context context, List<Suggestion> suggestions) {
- mSuggestionAdapter = new SuggestionAdapterV2(context, mSuggestionControllerMixin,
- null /* savedInstanceState */, null /* callback */, null /* lifecycle */);
- mSuggestionAdapter.setSuggestions(suggestions);
- mSuggestionHolder = mSuggestionAdapter.onCreateViewHolder(
- new FrameLayout(RuntimeEnvironment.application),
- mSuggestionAdapter.getItemViewType(0));
- }
-
- private List<Suggestion> makeSuggestions(String... pkgNames) {
- final List<Suggestion> suggestions = new ArrayList<>();
- for (String pkgName : pkgNames) {
- final Suggestion suggestion = new Suggestion.Builder(pkgName)
- .setPendingIntent(mock(PendingIntent.class))
- .build();
- suggestions.add(suggestion);
- }
- return suggestions;
- }
-}
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java
deleted file mode 100644
index f10f5ec..0000000
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionDismissControllerTest.java
+++ /dev/null
@@ -1,117 +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.dashboard.suggestions;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.service.settings.suggestions.Suggestion;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.helper.ItemTouchHelper;
-
-import com.android.settings.R;
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.suggestions.SuggestionControllerMixin;
-
-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;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class SuggestionDismissControllerTest {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private RecyclerView mRecyclerView;
- @Mock
- private SuggestionControllerMixin mSuggestionControllerMixin;
- @Mock
- private SuggestionDismissController.Callback mCallback;
-
- private FakeFeatureFactory mFactory;
- private SuggestionDismissController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mFactory = FakeFeatureFactory.setupForTest();
-
- when(mRecyclerView.getResources().getDimension(anyInt())).thenReturn(50F);
-
- mController = new SuggestionDismissController(mContext, mRecyclerView,
- mSuggestionControllerMixin, mCallback);
- }
-
- @Test
- public void onMove_alwaysReturnTrue() {
- assertThat(mController.onMove(null, null, null)).isTrue();
- }
-
- @Test
- public void getSwipeDirs_isSuggestionTile_shouldReturnDirection() {
- final RecyclerView.ViewHolder vh = mock(RecyclerView.ViewHolder.class);
- when(vh.getItemViewType()).thenReturn(R.layout.suggestion_tile);
-
- assertThat(mController.getSwipeDirs(mRecyclerView, vh))
- .isEqualTo(ItemTouchHelper.START | ItemTouchHelper.END);
- }
-
- @Test
- public void getSwipeDirs_isSuggestionTileCard_shouldReturnDirection() {
- final RecyclerView.ViewHolder vh = mock(RecyclerView.ViewHolder.class);
- when(vh.getItemViewType()).thenReturn(R.layout.suggestion_tile_with_button);
-
- assertThat(mController.getSwipeDirs(mRecyclerView, vh))
- .isEqualTo(ItemTouchHelper.START | ItemTouchHelper.END);
- }
-
- @Test
- public void getSwipeDirs_isNotSuggestionTile_shouldReturn0() {
- final RecyclerView.ViewHolder vh = mock(RecyclerView.ViewHolder.class);
- when(vh.getItemViewType()).thenReturn(R.layout.condition_tile);
-
- assertThat(mController.getSwipeDirs(mRecyclerView, vh))
- .isEqualTo(0);
- }
-
- @Test
- public void onSwiped_shouldTriggerDismissSuggestion() {
- final RecyclerView.ViewHolder vh = mock(RecyclerView.ViewHolder.class);
- when(mCallback.getSuggestionAt(anyInt())).thenReturn(
- new Suggestion.Builder("id").build());
-
- mController.onSwiped(vh, ItemTouchHelper.START);
-
- verify(mFactory.suggestionsFeatureProvider).dismissSuggestion(
- eq(mContext), eq(mSuggestionControllerMixin), nullable(Suggestion.class));
- verify(mCallback).onSuggestionDismissed(nullable(Suggestion.class));
- }
-}