1 /*
2  * Copyright (C) 2016 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.search2;
17 
18 import android.content.Context;
19 import android.content.pm.PackageManager;
20 import android.graphics.drawable.Drawable;
21 import android.os.UserHandle;
22 import android.support.v7.widget.RecyclerView;
23 import android.text.TextUtils;
24 import android.util.IconDrawableFactory;
25 import android.view.View;
26 import android.widget.ImageView;
27 import android.widget.TextView;
28 
29 import com.android.settings.R;
30 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
31 import com.android.settings.overlay.FeatureFactory;
32 
33 /**
34  * The ViewHolder for the Search RecyclerView.
35  * There are multiple search result types in the same Recycler view with different UI requirements.
36  * Some examples include Intent results, Inline results, and Help articles.
37  */
38 public abstract class SearchViewHolder extends RecyclerView.ViewHolder {
39 
40     private final String DYNAMIC_PLACEHOLDER = "%s";
41 
42     private final String mPlaceholderSummary;
43 
44     public final TextView titleView;
45     public final TextView summaryView;
46     public final TextView breadcrumbView;
47     public final ImageView iconView;
48 
49     protected final MetricsFeatureProvider mMetricsFeatureProvider;
50     private final IconDrawableFactory mIconDrawableFactory;
51 
SearchViewHolder(View view)52     public SearchViewHolder(View view) {
53         super(view);
54         mMetricsFeatureProvider = FeatureFactory.getFactory(view.getContext())
55                 .getMetricsFeatureProvider();
56         titleView = view.findViewById(android.R.id.title);
57         summaryView = view.findViewById(android.R.id.summary);
58         iconView = view.findViewById(android.R.id.icon);
59         breadcrumbView = view.findViewById(R.id.breadcrumb);
60 
61         mPlaceholderSummary = view.getContext().getString(R.string.summary_placeholder);
62         mIconDrawableFactory = IconDrawableFactory.newInstance(view.getContext());
63     }
64 
onBind(SearchFragment fragment, SearchResult result)65     public void onBind(SearchFragment fragment, SearchResult result) {
66         titleView.setText(result.title);
67         // TODO (b/36101902) remove check for DYNAMIC_PLACEHOLDER
68         if (TextUtils.isEmpty(result.summary)
69                 || TextUtils.equals(result.summary, mPlaceholderSummary)
70                 || TextUtils.equals(result.summary, DYNAMIC_PLACEHOLDER)) {
71             summaryView.setVisibility(View.GONE);
72         } else {
73             summaryView.setText(result.summary);
74             summaryView.setVisibility(View.VISIBLE);
75         }
76 
77         if (result instanceof AppSearchResult) {
78             AppSearchResult appResult = (AppSearchResult) result;
79             PackageManager pm = fragment.getActivity().getPackageManager();
80             UserHandle userHandle = appResult.getAppUserHandle();
81             Drawable badgedIcon =
82                     mIconDrawableFactory.getBadgedIcon(appResult.info, userHandle.getIdentifier());
83             iconView.setImageDrawable(badgedIcon);
84             titleView.setContentDescription(
85                     pm.getUserBadgedLabel(appResult.info.loadLabel(pm), userHandle));
86         } else {
87             // Valid even when result.icon is null.
88             iconView.setImageDrawable(result.icon);
89         }
90 
91         bindBreadcrumbView(result);
92     }
93 
bindBreadcrumbView(SearchResult result)94     private void bindBreadcrumbView(SearchResult result) {
95         if (result.breadcrumbs == null || result.breadcrumbs.isEmpty()) {
96             breadcrumbView.setVisibility(View.GONE);
97             return;
98         }
99         final Context context = breadcrumbView.getContext();
100         String breadcrumb = result.breadcrumbs.get(0);
101         final int count = result.breadcrumbs.size();
102         for (int i = 1; i < count; i++) {
103             breadcrumb = context.getString(R.string.search_breadcrumb_connector,
104                     breadcrumb, result.breadcrumbs.get(i));
105         }
106         breadcrumbView.setText(breadcrumb);
107         breadcrumbView.setVisibility(View.VISIBLE);
108     }
109 }