2 * Copyright (C) 2016 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.android.settings.dashboard;
18 import android.accounts.Account;
19 import android.annotation.DrawableRes;
20 import android.annotation.LayoutRes;
21 import android.annotation.StringRes;
22 import android.app.Activity;
23 import android.content.Intent;
24 import android.support.v7.widget.RecyclerView;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.ImageView;
29 import android.widget.TextView;
31 import com.android.settings.R;
32 import com.android.settings.overlay.SupportFeatureProvider;
34 import java.util.ArrayList;
35 import java.util.List;
36 import java.util.Objects;
38 import static com.android.settings.overlay.SupportFeatureProvider.SupportType.CHAT;
39 import static com.android.settings.overlay.SupportFeatureProvider.SupportType.EMAIL;
40 import static com.android.settings.overlay.SupportFeatureProvider.SupportType.PHONE;
43 * Item adapter for support tiles.
45 public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAdapter.ViewHolder> {
47 private static final int TYPE_TITLE = R.layout.support_item_title;
48 private static final int TYPE_SUBTITLE = R.layout.support_item_subtitle;
49 private static final int TYPE_ESCALATION_CARD = R.layout.support_escalation_card;
50 private static final int TYPE_SUPPORT_TILE = R.layout.support_tile;
51 private static final int TYPE_SIGN_IN_BUTTON = R.layout.support_sign_in_button;
53 private final Activity mActivity;
54 private final SignInPromoClickListener mSignInPromoClickListener;
55 private final SupportFeatureProvider mSupportFeatureProvider;
56 private final View.OnClickListener mItemClickListener;
57 private final List<SupportData> mSupportData;
59 private boolean mHasInternet;
60 private Account mAccount;
62 public SupportItemAdapter(Activity activity, SupportFeatureProvider supportFeatureProvider,
63 View.OnClickListener itemClickListener) {
65 mSupportFeatureProvider = supportFeatureProvider;
66 mItemClickListener = itemClickListener;
67 mSignInPromoClickListener = new SignInPromoClickListener();
68 mSupportData = new ArrayList<>();
69 // Optimistically assume we have Internet access. It will be updated later to correct value.
71 setAccount(mSupportFeatureProvider.getSupportEligibleAccount(mActivity));
76 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
77 return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
78 viewType, parent, false));
82 public void onBindViewHolder(ViewHolder holder, int position) {
83 final SupportData data = mSupportData.get(position);
84 switch (holder.getItemViewType()) {
85 case TYPE_SIGN_IN_BUTTON:
86 bindSignInPromoTile(holder, data);
89 bindSupportTile(holder, data);
95 public int getItemViewType(int position) {
96 return mSupportData.get(position).type;
100 public int getItemCount() {
101 return mSupportData.size();
105 * Called when a support item is clicked.
107 public void onItemClicked(int position) {
108 if (position >= 0 && position < mSupportData.size()) {
109 final SupportData data = mSupportData.get(position);
110 if (data.intent != null) {
111 mActivity.startActivityForResult(data.intent, 0);
116 public void setHasInternet(boolean hasInternet) {
117 if (mHasInternet != hasInternet) {
118 mHasInternet = hasInternet;
123 public void setAccount(Account account) {
124 if (!Objects.equals(mAccount, account)) {
131 * Create data for the adapter. If there is already data in the adapter, they will be
132 * destroyed and recreated.
134 private void refreshData() {
135 mSupportData.clear();
136 if (mAccount == null) {
139 addEscalationCards();
142 notifyDataSetChanged();
145 private void addEscalationCards() {
147 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
148 R.string.support_escalation_title, R.string.support_escalation_summary,
151 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
152 R.string.support_offline_title, R.string.support_offline_summary,
155 if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, PHONE)) {
156 mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_call_24dp,
157 R.string.support_escalation_by_phone, 0 /* summary */,
158 mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, PHONE)));
160 if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, EMAIL)) {
161 mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_mail_24dp,
162 R.string.support_escalation_by_email, 0 /* summary */,
163 mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, EMAIL)));
165 if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, CHAT)) {
166 mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_chat_24dp,
167 R.string.support_escalation_by_chat, 0 /* summary */,
168 mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, CHAT)));
172 private void addSignInPromo() {
173 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
174 R.string.support_sign_in_required_title, R.string.support_sign_in_required_summary,
176 mSupportData.add(new SupportData(TYPE_SIGN_IN_BUTTON, 0 /* icon */,
177 R.string.support_sign_in_button_text, R.string.support_sign_in_required_help,
182 private void addMoreHelpItems() {
183 mSupportData.add(new SupportData(TYPE_SUBTITLE, 0 /* icon */,
184 R.string.support_more_help_title, 0 /* summary */, null /* intent */));
185 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_forum_24dp,
186 R.string.support_forum_title, 0 /* summary */,
187 mSupportFeatureProvider.getForumIntent()));
188 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_help_24dp,
189 R.string.support_articles_title, 0 /* summary */, null /*intent */));
190 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_feedback_24dp,
191 R.string.support_feedback_title, 0 /* summary */, null /*intent */));
194 private void bindSignInPromoTile(ViewHolder holder, SupportData data) {
195 holder.text1View.setText(data.text1);
196 holder.text2View.setText(data.text2);
197 holder.text1View.setOnClickListener(mSignInPromoClickListener);
198 holder.text2View.setOnClickListener(mSignInPromoClickListener);
201 private void bindSupportTile(ViewHolder holder, SupportData data) {
202 if (holder.iconView != null) {
203 holder.iconView.setImageResource(data.icon);
205 if (holder.text1View != null) {
206 holder.text1View.setText(data.text1);
208 if (holder.text2View != null) {
209 holder.text2View.setText(data.text2);
211 holder.itemView.setOnClickListener(mItemClickListener);
215 * Click handler for sign-in promo.
217 private final class SignInPromoClickListener implements View.OnClickListener {
219 public void onClick(View v) {
221 case android.R.id.text1:
222 mActivity.startActivityForResult(
223 mSupportFeatureProvider.getAccountLoginIntent(), 0 /* requestCode */);
225 case android.R.id.text2:
226 mActivity.startActivityForResult(
227 mSupportFeatureProvider.getSignInHelpIntent(mActivity),
228 0 /* requestCode */);
235 * {@link RecyclerView.ViewHolder} for support items.
237 static final class ViewHolder extends RecyclerView.ViewHolder {
239 final ImageView iconView;
240 final TextView text1View;
241 final TextView text2View;
243 ViewHolder(View itemView) {
245 iconView = (ImageView) itemView.findViewById(android.R.id.icon);
246 text1View = (TextView) itemView.findViewById(android.R.id.text1);
247 text2View = (TextView) itemView.findViewById(android.R.id.text2);
252 * Data for a single support item.
254 private static final class SupportData {
266 SupportData(@LayoutRes int type, @DrawableRes int icon, @StringRes int text1,
267 @StringRes int text2, Intent intent) {
272 this.intent = intent;