diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index c06a58f..fff7002 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -94,19 +94,6 @@
         }
     };
 
-    private View.OnClickListener mConditionClickListener = new View.OnClickListener() {
-
-        @Override
-        public void onClick(View v) {
-            Condition condition = (Condition) v.getTag();
-            //TODO: get rid of setTag/getTag
-            mMetricsFeatureProvider.action(mContext,
-                    MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK,
-                    condition.getMetricsConstant());
-            condition.onPrimaryClick();
-        }
-    };
-
     public DashboardAdapter(Context context, Bundle savedInstanceState,
             List<Condition> conditions, SuggestionParser suggestionParser,
             SuggestionDismissController.Callback callback) {
@@ -129,7 +116,7 @@
             suggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
             category = savedInstanceState.getParcelable(STATE_CATEGORY_LIST);
             suggestionConditionMode = savedInstanceState.getInt(
-                STATE_SUGGESTION_CONDITION_MODE, suggestionConditionMode);
+                    STATE_SUGGESTION_CONDITION_MODE, suggestionConditionMode);
             mSuggestionsShownLogged = savedInstanceState.getStringArrayList(
                     STATE_SUGGESTIONS_SHOWN_LOGGED);
         } else {
@@ -249,7 +236,7 @@
                 break;
             case R.layout.suggestion_condition_container:
                 onBindConditionAndSuggestion(
-                    (SuggestionAndConditionContainerHolder) holder, position);
+                        (SuggestionAndConditionContainerHolder) holder, position);
                 break;
             case R.layout.suggestion_condition_header:
                 onBindSuggestionConditionHeader((SuggestionAndConditionHeaderHolder) holder,
@@ -262,7 +249,7 @@
                             MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, false);
                     DashboardData prevData = mDashboardData;
                     mDashboardData = new DashboardData.Builder(prevData).setSuggestionConditionMode(
-                        DashboardData.HEADER_MODE_COLLAPSED).build();
+                            DashboardData.HEADER_MODE_COLLAPSED).build();
                     notifyDashboardDataChanged(prevData);
                     mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
                 });
@@ -335,11 +322,11 @@
         }
         for (Tile suggestion : suggestions) {
             final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier(
-                mContext, suggestion);
+                    mContext, suggestion);
             if (!mSuggestionsShownLogged.contains(suggestionId)) {
                 mMetricsFeatureProvider.action(
-                    mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
-                    suggestionId);
+                        mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
+                        suggestionId);
                 mSuggestionsShownLogged.add(suggestionId);
             }
         }
@@ -350,9 +337,9 @@
             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;
+                && curMode != DashboardData.HEADER_MODE_SUGGESTION_EXPANDED
+                ? DashboardData.HEADER_MODE_SUGGESTION_EXPANDED
+                : DashboardData.HEADER_MODE_FULLY_EXPANDED;
         final boolean moreSuggestions = data.hiddenSuggestionCount > 0;
         final boolean hasConditions = data.conditionCount > 0;
         if (data.conditionCount > 0) {
@@ -377,22 +364,22 @@
             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));
+                            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));
+                            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));
+                            R.string.suggestions_summary, data.hiddenSuggestionCount));
                 } else {
                     holder.title.setText(mContext.getString(
-                        R.string.suggestions_more_title, data.hiddenSuggestionCount));
+                            R.string.suggestions_more_title, data.hiddenSuggestionCount));
                     holder.title.setTextColor(Color.BLACK);
                     holder.summary.setText(null);
                 }
@@ -400,7 +387,7 @@
         } else if (data.conditionCount > 1) {
             holder.summary.setTextColor(Utils.getColorAccent(mContext));
             holder.summary.setText(
-                mContext.getString(R.string.condition_summary, data.conditionCount));
+                    mContext.getString(R.string.condition_summary, data.conditionCount));
         } else {
             holder.summary.setText(null);
         }
@@ -413,16 +400,16 @@
         holder.itemView.setPadding(0, padding, 0, padding);
 
         holder.itemView.setOnClickListener(v -> {
-            if (moreSuggestions ) {
+            if (moreSuggestions) {
                 logSuggestions();
             } else if (hasConditions) {
                 mMetricsFeatureProvider.action(mContext,
-                    MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true);
+                        MetricsEvent.ACTION_SETTINGS_CONDITION_EXPAND, true);
             }
             DashboardData prevData = mDashboardData;
             final boolean wasCollapsed = curMode == DashboardData.HEADER_MODE_COLLAPSED;
             mDashboardData = new DashboardData.Builder(prevData)
-                .setSuggestionConditionMode(nextMode).build();
+                    .setSuggestionConditionMode(nextMode).build();
             notifyDashboardDataChanged(prevData);
             if (wasCollapsed) {
                 mRecyclerView.scrollToPosition(SUGGESTION_CONDITION_HEADER_POSITION);
@@ -439,13 +426,13 @@
         if (position == SUGGESTION_CONDITION_HEADER_POSITION
                 && suggestions != null && suggestions.size() > 0) {
             mSuggestionAdapter = new SuggestionAdapter(mContext, (List<Tile>)
-                mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged);
+                    mDashboardData.getItemEntityByPosition(position), mSuggestionsShownLogged);
             mSuggestionDismissHandler = new SuggestionDismissController(mContext,
-                holder.data, mSuggestionParser, mCallback);
+                    holder.data, mSuggestionParser, mCallback);
             holder.data.setAdapter(mSuggestionAdapter);
         } else {
             ConditionAdapter adapter = new ConditionAdapter(mContext,
-                (List<Condition>) mDashboardData.getItemEntityByPosition(position),
+                    (List<Condition>) mDashboardData.getItemEntityByPosition(position),
                     mDashboardData.getSuggestionConditionMode());
             adapter.addDismissHandling(holder.data);
             holder.data.setAdapter(adapter);
@@ -454,19 +441,13 @@
     }
 
     private void onBindTile(DashboardItemHolder holder, Tile tile) {
-        if (tile.remoteViews != null) {
-            final ViewGroup itemView = (ViewGroup) holder.itemView;
-            itemView.removeAllViews();
-            itemView.addView(tile.remoteViews.apply(itemView.getContext(), itemView));
+        holder.icon.setImageDrawable(mCache.getIcon(tile.icon));
+        holder.title.setText(tile.title);
+        if (!TextUtils.isEmpty(tile.summary)) {
+            holder.summary.setText(tile.summary);
+            holder.summary.setVisibility(View.VISIBLE);
         } else {
-            holder.icon.setImageDrawable(mCache.getIcon(tile.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);
-            }
+            holder.summary.setVisibility(View.GONE);
         }
     }
 
@@ -507,7 +488,7 @@
         }
         outState.putStringArrayList(STATE_SUGGESTIONS_SHOWN_LOGGED, mSuggestionsShownLogged);
         outState.putInt(STATE_SUGGESTION_CONDITION_MODE,
-            mDashboardData.getSuggestionConditionMode());
+                mDashboardData.getSuggestionConditionMode());
     }
 
     private void updateConditionIcons(List<Icon> icons, ViewGroup parent) {
@@ -519,7 +500,7 @@
         parent.removeAllViews();
         for (int i = 1, size = icons.size(); i < size; i++) {
             ImageView icon = (ImageView) inflater.inflate(
-                R.layout.condition_header_icon, parent, false);
+                    R.layout.condition_header_icon, parent, false);
             icon.setImageIcon(icons.get(i));
             parent.addView(icon);
         }
diff --git a/src/com/android/settings/dashboard/DashboardData.java b/src/com/android/settings/dashboard/DashboardData.java
index 0fac0a2..b346ae5 100644
--- a/src/com/android/settings/dashboard/DashboardData.java
+++ b/src/com/android/settings/dashboard/DashboardData.java
@@ -172,30 +172,6 @@
     }
 
     /**
-     * Get the count of suggestions to display
-     *
-     * The displayable count mainly depends on the {@link #mSuggestionConditionMode}
-     * and the size of suggestions list.
-     *
-     * When in default mode, displayable count couldn't be larger than
-     * {@link #DEFAULT_SUGGESTION_COUNT}.
-     *
-     * When in expanded mode, display all the suggestions.
-     *
-     * @return the count of suggestions to display
-     */
-    public int getDisplayableSuggestionCount() {
-        final int suggestionSize = sizeOf(mSuggestions);
-        if (mSuggestionConditionMode == HEADER_MODE_COLLAPSED) {
-            return 0;
-        }
-        if (mSuggestionConditionMode == HEADER_MODE_DEFAULT) {
-            return Math.min(DEFAULT_SUGGESTION_COUNT, suggestionSize);
-        }
-        return suggestionSize;
-    }
-
-    /**
      * Add item into list when {@paramref add} is true.
      *
      * @param item     maybe {@link Condition}, {@link Tile}, {@link DashboardCategory} or null
@@ -280,7 +256,7 @@
         if (conditions == null) {
             return null;
         }
-        List<Condition> result = new ArrayList<Condition>();
+        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);
@@ -482,7 +458,7 @@
             conditionCount = sizeOf(conditions);
             this.hiddenSuggestionCount = hiddenSuggestionCount;
             title = conditionCount > 0 ? conditions.get(0).getTitle() : null;
-            conditionIcons = new ArrayList<Icon>();
+            conditionIcons = new ArrayList<>();
             for (int i = 0; conditions != null && i < conditions.size(); i++) {
                 final Condition condition = conditions.get(i);
                 conditionIcons.add(condition.getIcon());
