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;
37 import static com.android.settings.overlay.SupportFeatureProvider.SupportType.CHAT;
38 import static com.android.settings.overlay.SupportFeatureProvider.SupportType.EMAIL;
39 import static com.android.settings.overlay.SupportFeatureProvider.SupportType.PHONE;
42 * Item adapter for support tiles.
44 public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAdapter.ViewHolder> {
46 private static final int TYPE_TITLE = R.layout.support_item_title;
47 private static final int TYPE_SUBTITLE = R.layout.support_item_subtitle;
48 private static final int TYPE_ESCALATION_CARD = R.layout.support_escalation_card;
49 private static final int TYPE_SUPPORT_TILE = R.layout.support_tile;
50 private static final int TYPE_SIGN_IN_BUTTON = R.layout.support_sign_in_button;
52 private final Activity mActivity;
53 private final SignInPromoClickListener mSignInPromoClickListener;
54 private final SupportFeatureProvider mSupportFeatureProvider;
55 private final View.OnClickListener mItemClickListener;
56 private final List<SupportData> mSupportData;
58 private boolean mHasInternet;
60 public SupportItemAdapter(Activity activity, SupportFeatureProvider supportFeatureProvider,
61 View.OnClickListener itemClickListener) {
63 mSupportFeatureProvider = supportFeatureProvider;
64 mItemClickListener = itemClickListener;
65 mSignInPromoClickListener = new SignInPromoClickListener();
66 mSupportData = new ArrayList<>();
67 // Optimistically assume we have Internet access. It will be updated later to correct value.
69 setHasStableIds(true);
74 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
75 return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
76 viewType, parent, false));
80 public void onBindViewHolder(ViewHolder holder, int position) {
81 final SupportData data = mSupportData.get(position);
82 switch (holder.getItemViewType()) {
83 case TYPE_SIGN_IN_BUTTON:
84 bindSignInPromoTile(holder, data);
87 bindSupportTile(holder, data);
93 public int getItemViewType(int position) {
94 return mSupportData.get(position).type;
98 public int getItemCount() {
99 return mSupportData.size();
103 * Called when a support item is clicked.
105 public void onItemClicked(int position) {
106 if (position >= 0 && position < mSupportData.size()) {
107 final SupportData data = mSupportData.get(position);
108 if (data.intent != null) {
109 mActivity.startActivityForResult(data.intent, 0);
114 public void setHasInternet(boolean hasInternet) {
115 if (mHasInternet != hasInternet) {
116 mHasInternet = hasInternet;
122 * Create data for the adapter. If there is already data in the adapter, they will be
123 * destroyed and recreated.
125 public void refreshData() {
126 mSupportData.clear();
127 final Account[] accounts = mSupportFeatureProvider.getSupportEligibleAccounts(mActivity);
128 if (accounts.length == 0) {
131 addEscalationCards(accounts[0]);
134 notifyDataSetChanged();
137 private void addEscalationCards(Account account) {
139 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
140 R.string.support_escalation_title, R.string.support_escalation_summary,
143 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
144 R.string.support_offline_title, R.string.support_offline_summary,
147 if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, PHONE)) {
148 mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_call_24dp,
149 R.string.support_escalation_by_phone, 0 /* summary */,
150 mSupportFeatureProvider.getSupportIntent(mActivity, account, PHONE)));
152 if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, EMAIL)) {
153 mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_mail_24dp,
154 R.string.support_escalation_by_email, 0 /* summary */,
155 mSupportFeatureProvider.getSupportIntent(mActivity, account, EMAIL)));
157 if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, CHAT)) {
158 mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_chat_24dp,
159 R.string.support_escalation_by_chat, 0 /* summary */,
160 mSupportFeatureProvider.getSupportIntent(mActivity, account, CHAT)));
164 private void addSignInPromo() {
165 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
166 R.string.support_sign_in_required_title, R.string.support_sign_in_required_summary,
168 mSupportData.add(new SupportData(TYPE_SIGN_IN_BUTTON, 0 /* icon */,
169 R.string.support_sign_in_button_text, R.string.support_sign_in_required_help,
174 private void addMoreHelpItems() {
175 mSupportData.add(new SupportData(TYPE_SUBTITLE, 0 /* icon */,
176 R.string.support_more_help_title, 0 /* summary */, null /* intent */));
177 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_forum_24dp,
178 R.string.support_forum_title, 0 /* summary */,
179 mSupportFeatureProvider.getForumIntent()));
180 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_help_24dp,
181 R.string.support_articles_title, 0 /* summary */, null /*intent */));
182 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_feedback_24dp,
183 R.string.support_feedback_title, 0 /* summary */, null /*intent */));
186 private void bindSignInPromoTile(ViewHolder holder, SupportData data) {
187 holder.text1View.setText(data.text1);
188 holder.text2View.setText(data.text2);
189 holder.text1View.setOnClickListener(mSignInPromoClickListener);
190 holder.text2View.setOnClickListener(mSignInPromoClickListener);
193 private void bindSupportTile(ViewHolder holder, SupportData data) {
194 if (holder.iconView != null) {
195 holder.iconView.setImageResource(data.icon);
197 if (holder.text1View != null) {
198 holder.text1View.setText(data.text1);
200 if (holder.text2View != null) {
201 holder.text2View.setText(data.text2);
203 holder.itemView.setOnClickListener(mItemClickListener);
207 * Click handler for sign-in promo.
209 private final class SignInPromoClickListener implements View.OnClickListener {
211 public void onClick(View v) {
213 case android.R.id.text1:
214 mActivity.startActivityForResult(
215 mSupportFeatureProvider.getAccountLoginIntent(), 0 /* requestCode */);
217 case android.R.id.text2:
218 mActivity.startActivityForResult(
219 mSupportFeatureProvider.getSignInHelpIntent(mActivity),
220 0 /* requestCode */);
227 * {@link RecyclerView.ViewHolder} for support items.
229 static final class ViewHolder extends RecyclerView.ViewHolder {
231 final ImageView iconView;
232 final TextView text1View;
233 final TextView text2View;
235 ViewHolder(View itemView) {
237 iconView = (ImageView) itemView.findViewById(android.R.id.icon);
238 text1View = (TextView) itemView.findViewById(android.R.id.text1);
239 text2View = (TextView) itemView.findViewById(android.R.id.text2);
244 * Data for a single support item.
246 private static final class SupportData {
249 @LayoutRes final int type;
250 @DrawableRes final int icon;
251 @StringRes final int text1;
252 @StringRes final int text2;
254 SupportData(@LayoutRes int type, @DrawableRes int icon, @StringRes int text1,
255 @StringRes int text2, Intent intent) {
260 this.intent = intent;