1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.settings.dashboard.suggestions; 17 18import android.content.Context; 19import android.support.v7.widget.RecyclerView; 20import android.text.TextUtils; 21import android.util.Pair; 22import android.view.LayoutInflater; 23import android.view.View; 24import android.view.ViewGroup; 25import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 26import com.android.settings.R; 27import com.android.settings.SettingsActivity; 28import com.android.settings.core.instrumentation.MetricsFeatureProvider; 29import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder; 30import com.android.settings.dashboard.DashboardAdapter.IconCache; 31import com.android.settings.overlay.FeatureFactory; 32import com.android.settingslib.drawer.Tile; 33 34import java.util.List; 35import java.util.Objects; 36 37public class SuggestionAdapter extends RecyclerView.Adapter<DashboardItemHolder> { 38 public static final String TAG = "SuggestionAdapter"; 39 40 private final Context mContext; 41 private final MetricsFeatureProvider mMetricsFeatureProvider; 42 private final SuggestionFeatureProvider mSuggestionFeatureProvider; 43 private List<Tile> mSuggestions; 44 private final IconCache mCache; 45 private final List<String> mSuggestionsShownLogged; 46 47 public SuggestionAdapter(Context context, List<Tile> suggestions, 48 List<String> suggestionsShownLogged) { 49 mContext = context; 50 mSuggestions = suggestions; 51 mSuggestionsShownLogged = suggestionsShownLogged; 52 mCache = new IconCache(context); 53 final FeatureFactory factory = FeatureFactory.getFactory(context); 54 mMetricsFeatureProvider = factory.getMetricsFeatureProvider(); 55 mSuggestionFeatureProvider = factory.getSuggestionFeatureProvider(context); 56 57 setHasStableIds(true); 58 } 59 60 @Override 61 public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 62 return new DashboardItemHolder(LayoutInflater.from(parent.getContext()).inflate( 63 viewType, parent, false)); 64 } 65 66 @Override 67 public void onBindViewHolder(DashboardItemHolder holder, int position) { 68 final Tile suggestion = (Tile) mSuggestions.get(position); 69 final String suggestionId = mSuggestionFeatureProvider.getSuggestionIdentifier( 70 mContext, suggestion); 71 // This is for cases when a suggestion is dismissed and the next one comes to view 72 if (!mSuggestionsShownLogged.contains(suggestionId)) { 73 mMetricsFeatureProvider.action( 74 mContext, MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION, suggestionId, 75 getSuggestionTaggedData()); 76 mSuggestionsShownLogged.add(suggestionId); 77 } 78 if (suggestion.remoteViews != null) { 79 final ViewGroup itemView = (ViewGroup) holder.itemView; 80 itemView.removeAllViews(); 81 itemView.addView(suggestion.remoteViews.apply(itemView.getContext(), itemView)); 82 } else { 83 holder.icon.setImageDrawable(mCache.getIcon(suggestion.icon)); 84 holder.title.setText(suggestion.title); 85 if (!TextUtils.isEmpty(suggestion.summary)) { 86 holder.summary.setText(suggestion.summary); 87 holder.summary.setVisibility(View.VISIBLE); 88 } else { 89 holder.summary.setVisibility(View.GONE); 90 } 91 } 92 final View divider = holder.itemView.findViewById(R.id.divider); 93 if (divider != null) { 94 divider.setVisibility(position < mSuggestions.size() - 1 ? View.VISIBLE : View.GONE); 95 } 96 View clickHandler = holder.itemView; 97 // If a view with @android:id/primary is defined, use that as the click handler 98 // instead. 99 final View primaryAction = holder.itemView.findViewById(android.R.id.primary); 100 if (primaryAction != null) { 101 clickHandler = primaryAction; 102 } 103 104 clickHandler.setOnClickListener(v -> { 105 mMetricsFeatureProvider.action(mContext, 106 MetricsEvent.ACTION_SETTINGS_SUGGESTION, suggestionId, 107 getSuggestionTaggedData()); 108 ((SettingsActivity) mContext).startSuggestion(suggestion.intent); 109 }); 110 } 111 112 @Override 113 public long getItemId(int position) { 114 return Objects.hash(mSuggestions.get(position).title); 115 } 116 117 @Override 118 public int getItemViewType(int position) { 119 Tile suggestion = getSuggestion(position); 120 return suggestion.remoteViews != null 121 ? R.layout.suggestion_tile_remote_container 122 : R.layout.suggestion_tile; 123 } 124 125 @Override 126 public int getItemCount() { 127 return mSuggestions.size(); 128 } 129 130 public Tile getSuggestion(int position) { 131 final long itemId = getItemId(position); 132 for (Tile tile : mSuggestions) { 133 if (Objects.hash(tile.title) == itemId) { 134 return tile; 135 } 136 } 137 return null; 138 } 139 140 public void removeSuggestion(Tile suggestion) { 141 mSuggestions.remove(suggestion); 142 notifyDataSetChanged(); 143 } 144 145 private Pair<Integer, Object>[] getSuggestionTaggedData() { 146 return SuggestionLogHelper.getSuggestionTaggedData( 147 mSuggestionFeatureProvider.isSmartSuggestionEnabled(mContext)); 148 } 149 150} 151