Home | History | Annotate | Download | only in suggestions
      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  */
     16 package com.android.settings.dashboard.suggestions;
     17 
     18 import android.content.Context;
     19 import android.support.v7.widget.RecyclerView;
     20 import android.text.TextUtils;
     21 import android.util.Pair;
     22 import android.view.LayoutInflater;
     23 import android.view.View;
     24 import android.view.ViewGroup;
     25 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
     26 import com.android.settings.R;
     27 import com.android.settings.SettingsActivity;
     28 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
     29 import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder;
     30 import com.android.settings.dashboard.DashboardAdapter.IconCache;
     31 import com.android.settings.overlay.FeatureFactory;
     32 import com.android.settingslib.drawer.Tile;
     33 
     34 import java.util.List;
     35 import java.util.Objects;
     36 
     37 public 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