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