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.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_OPTIONS = R.layout.support_escalation_options;
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 EscalationClickListener mEscalationClickListener;
54 private final SupportFeatureProvider mSupportFeatureProvider;
55 private final View.OnClickListener mItemClickListener;
56 private final List<SupportData> mSupportData;
58 private boolean mHasInternet;
59 private Account mAccount;
61 public SupportItemAdapter(Activity activity, SupportFeatureProvider supportFeatureProvider,
62 View.OnClickListener itemClickListener) {
64 mSupportFeatureProvider = supportFeatureProvider;
65 mItemClickListener = itemClickListener;
66 mEscalationClickListener = new EscalationClickListener();
67 mSupportData = new ArrayList<>();
68 // Optimistically assume we have Internet access. It will be updated later to correct value.
70 setAccount(mSupportFeatureProvider.getSupportEligibleAccount(mActivity));
75 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
76 return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
77 viewType, parent, false));
81 public void onBindViewHolder(ViewHolder holder, int position) {
82 final SupportData data = mSupportData.get(position);
83 switch (holder.getItemViewType()) {
84 case TYPE_SIGN_IN_BUTTON:
85 bindSignInPromoTile(holder, data);
87 case TYPE_ESCALATION_OPTIONS:
88 bindEscalationOptions(holder, data);
91 bindSupportTile(holder, data);
97 public int getItemViewType(int position) {
98 return mSupportData.get(position).type;
102 public int getItemCount() {
103 return mSupportData.size();
107 * Called when a support item is clicked.
109 public void onItemClicked(int position) {
110 if (position >= 0 && position < mSupportData.size()) {
111 final SupportData data = mSupportData.get(position);
112 if (data.intent != null) {
113 mActivity.startActivityForResult(data.intent, 0);
118 public void setHasInternet(boolean hasInternet) {
119 if (mHasInternet != hasInternet) {
120 mHasInternet = hasInternet;
125 public void setAccount(Account account) {
126 if (!Objects.equals(mAccount, account)) {
133 * Create data for the adapter. If there is already data in the adapter, they will be
134 * destroyed and recreated.
136 private void refreshData() {
137 mSupportData.clear();
138 if (mAccount == null) {
141 addEscalationCards();
144 notifyDataSetChanged();
147 private void addEscalationCards() {
149 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
150 R.string.support_escalation_title, R.string.support_escalation_summary,
153 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
154 R.string.support_offline_title, R.string.support_offline_summary,
157 final int phoneSupportText = mSupportFeatureProvider.isSupportTypeEnabled(mActivity, PHONE)
158 ? R.string.support_escalation_by_phone : 0;
159 final int chatSupportText = mSupportFeatureProvider.isSupportTypeEnabled(mActivity, CHAT)
160 ? R.string.support_escalation_by_chat : 0;
161 mSupportData.add(new SupportData(TYPE_ESCALATION_OPTIONS, 0 /* icon */,
162 phoneSupportText, chatSupportText, null /* intent */));
165 private void addSignInPromo() {
166 mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
167 R.string.support_sign_in_required_title, R.string.support_sign_in_required_summary,
169 mSupportData.add(new SupportData(TYPE_SIGN_IN_BUTTON, 0 /* icon */,
170 R.string.support_sign_in_button_text, R.string.support_sign_in_required_help,
175 private void addMoreHelpItems() {
176 mSupportData.add(new SupportData(TYPE_SUBTITLE, 0 /* icon */,
177 R.string.support_more_help_title, 0 /* summary */, null /* intent */));
178 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_forum_24dp,
179 R.string.support_forum_title, 0 /* summary */,
180 mSupportFeatureProvider.getForumIntent()));
181 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_help_24dp,
182 R.string.support_articles_title, 0 /* summary */, null /*intent */));
183 mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_feedback_24dp,
184 R.string.support_feedback_title, 0 /* summary */, null /*intent */));
187 private void bindEscalationOptions(ViewHolder holder, SupportData data) {
188 if (data.text1 == 0) {
189 holder.text1View.setVisibility(View.GONE);
191 holder.text1View.setText(data.text1);
192 holder.text1View.setOnClickListener(mEscalationClickListener);
193 holder.text1View.setEnabled(mHasInternet);
194 holder.text1View.setVisibility(View.VISIBLE);
196 if (data.text2 == 0) {
197 holder.text2View.setVisibility(View.GONE);
199 holder.text2View.setText(data.text2);
200 holder.text2View.setOnClickListener(mEscalationClickListener);
201 holder.text2View.setEnabled(mHasInternet);
202 holder.text2View.setVisibility(View.VISIBLE);
206 private void bindSignInPromoTile(ViewHolder holder, SupportData data) {
207 holder.text1View.setText(data.text1);
208 holder.text2View.setText(data.text2);
209 holder.text1View.setOnClickListener(mEscalationClickListener);
210 holder.text2View.setOnClickListener(mEscalationClickListener);
213 private void bindSupportTile(ViewHolder holder, SupportData data) {
214 if (holder.iconView != null) {
215 holder.iconView.setImageResource(data.icon);
217 if (holder.text1View != null) {
218 holder.text1View.setText(data.text1);
220 if (holder.text2View != null) {
221 holder.text2View.setText(data.text2);
223 holder.itemView.setOnClickListener(mItemClickListener);
227 * Click handler for starting escalation options.
229 private final class EscalationClickListener implements View.OnClickListener {
231 public void onClick(View v) {
233 case android.R.id.text1: {
234 final Intent intent = mAccount == null
235 ? mSupportFeatureProvider.getAccountLoginIntent()
236 : mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, PHONE);
237 mActivity.startActivityForResult(intent, 0 /* requestCode */);
240 case android.R.id.text2: {
241 final Intent intent = mAccount == null
242 ? mSupportFeatureProvider.getSignInHelpIntent(mActivity)
243 : mSupportFeatureProvider.getSupportIntent(mActivity, mAccount, CHAT);
244 mActivity.startActivityForResult(intent, 0 /* requestCode */);
252 * {@link RecyclerView.ViewHolder} for support items.
254 static final class ViewHolder extends RecyclerView.ViewHolder {
256 final ImageView iconView;
257 final TextView text1View;
258 final TextView text2View;
260 ViewHolder(View itemView) {
262 iconView = (ImageView) itemView.findViewById(android.R.id.icon);
263 text1View = (TextView) itemView.findViewById(android.R.id.text1);
264 text2View = (TextView) itemView.findViewById(android.R.id.text2);
269 * Data for a single support item.
271 private static final class SupportData {
283 SupportData(@LayoutRes int type, @DrawableRes int icon, @StringRes int text1,
284 @StringRes int text2, Intent intent) {
289 this.intent = intent;