OSDN Git Service

Add c2c and chat support when there is eligible account.
authorFan Zhang <zhfan@google.com>
Wed, 20 Apr 2016 23:20:17 +0000 (16:20 -0700)
committerFan Zhang <zhfan@google.com>
Wed, 27 Apr 2016 16:06:17 +0000 (09:06 -0700)
Bug: 28141203
Bug: 28316618
Bug: 28316343

- Replaced hardcoded fragment layout with a RecyclerView. The old layout
  was essentially building a list manually.
- Tweaked layout to look better.
- Hide escalation cards when there is no account. Show cards when
  there is at least 1 account.
- Request an intent to start specified support type when card is
  clicked.
- Monitor account changes so we can hide/show escalation cards when
  add/remove account.

Change-Id: Ie48158b85ade1363a41817cc88b1193e0aef87ae

15 files changed:
res/drawable/ic_call_24dp.xml [new file with mode: 0644]
res/drawable/ic_chat_24dp.xml [new file with mode: 0644]
res/drawable/ic_mail_24dp.xml [new file with mode: 0644]
res/layout/support_escalation_card.xml
res/layout/support_fragment.xml
res/layout/support_item_subtitle.xml [new file with mode: 0644]
res/layout/support_item_title.xml [new file with mode: 0644]
res/values/strings.xml
res/values/styles.xml
src/com/android/settings/dashboard/DashboardContainerFragment.java
src/com/android/settings/dashboard/SupportFragment.java
src/com/android/settings/dashboard/SupportItemAdapter.java [new file with mode: 0644]
src/com/android/settings/overlay/FeatureFactory.java
src/com/android/settings/overlay/FeatureFactoryImpl.java
src/com/android/settings/overlay/SupportFeatureProvider.java

diff --git a/res/drawable/ic_call_24dp.xml b/res/drawable/ic_call_24dp.xml
new file mode 100644 (file)
index 0000000..950547a
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorAccent">
+    <path
+        android:fillColor="#FFFFFF"
+        android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27
+         0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55
+          -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1
+          0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_chat_24dp.xml b/res/drawable/ic_chat_24dp.xml
new file mode 100644 (file)
index 0000000..2df12b3
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorAccent">
+    <path
+        android:fillColor="#FFFFFF"
+        android:pathData="M20,2H4c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2V4c0,-1.1
+         -0.9,-2 -2,-2zM6,9h12v2H6V9zm8,5H6v-2h8v2zm4,-6H6V6h12v2z"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_mail_24dp.xml b/res/drawable/ic_mail_24dp.xml
new file mode 100644 (file)
index 0000000..46f4584
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<vector
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorAccent">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M20,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9
+        2,-2V6c0,-1.1 -0.9,-2 -2,-2zm0,4l-8,5 -8,-5V6l8,5 8,-5v2z"/>
+</vector>
\ No newline at end of file
index 3ca7562..e2f9fe4 100644 (file)
 
 <android.support.v7.widget.CardView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="0dp"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:layout_weight="1"
-    android:layout_marginBottom="16dp"
+    android:layout_marginBottom="4dp"
     android:layout_marginEnd="8dp"
     android:layout_marginStart="8dp"
-    android:layout_marginTop="16dp"
-    android:background="?android:attr/selectableItemBackground">
+    android:layout_marginTop="4dp"
+    android:clickable="true"
+    android:foreground="?android:attr/selectableItemBackground">
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:padding="16dp"
-        android:orientation="vertical">
+        android:orientation="horizontal">
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="@dimen/dashboard_tile_image_size"
+            android:layout_height="@dimen/dashboard_tile_image_size"
+            android:layout_marginStart="@dimen/dashboard_tile_image_margin_start"
+            android:layout_marginEnd="@dimen/dashboard_tile_image_margin_end"
+            android:scaleType="centerInside"/>
         <TextView
-            android:id="@+id/title"
+            android:id="@android:id/title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textAppearance="@style/TextAppearance.TileTitle"/>
-        <TextView
-            android:id="@+id/summary"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:textAppearance="@style/TextAppearance.Small"
-            android:textColor="?android:attr/textColorSecondary"/>
     </LinearLayout>
 </android.support.v7.widget.CardView>
\ No newline at end of file
index d81849d..481a548 100644 (file)
      limitations under the License.
 -->
 
-<ScrollView
+<android.support.v7.widget.RecyclerView
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/support_items"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
-        <TextView
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingEnd="16dp"
-            android:paddingStart="16dp"
-            android:paddingTop="16dp"
-            android:text="@string/support_escalation_title"
-            android:textColor="@color/material_grey_900"
-            android:textSize="16sp"/>
-        <LinearLayout
-            android:id="@+id/escalation_options"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:paddingEnd="8dp"
-            android:paddingStart="8dp">
-            <include
-                android:id="@+id/escalation_by_phone"
-                layout="@layout/support_escalation_card"/>
-            <include
-                android:id="@+id/escalation_by_email"
-                layout="@layout/support_escalation_card"/>
-        </LinearLayout>
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:background="?android:attr/listDivider"/>
-        <include
-            android:id="@+id/forum_tile"
-            layout="@layout/support_tile"/>
-        <include
-            android:id="@+id/article_tile"
-            layout="@layout/support_tile"/>
-        <View
-            android:layout_width="match_parent"
-            android:layout_height="1dp"
-            android:background="?android:attr/listDivider"/>
-        <include
-            android:id="@+id/feedback_tile"
-            layout="@layout/support_tile"/>
-    </LinearLayout>
-</ScrollView>
\ No newline at end of file
+    android:layout_height="match_parent"/>
\ No newline at end of file
diff --git a/res/layout/support_item_subtitle.xml b/res/layout/support_item_subtitle.xml
new file mode 100644 (file)
index 0000000..62b2fc1
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@android:id/title"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingBottom="16dp"
+    android:paddingEnd="8dp"
+    android:paddingStart="8dp"
+    android:paddingTop="8dp"
+    android:textAppearance="@style/TextAppearance.CategoryTitle"/>
\ No newline at end of file
diff --git a/res/layout/support_item_title.xml b/res/layout/support_item_title.xml
new file mode 100644 (file)
index 0000000..eff3f7f
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+    <TextView
+        android:id="@android:id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingEnd="8dp"
+        android:paddingStart="8dp"
+        android:paddingTop="8dp"
+        android:textAppearance="@style/TextAppearance.SupportTitle"/>
+    <TextView
+        android:id="@android:id/summary"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="16dp"
+        android:paddingEnd="8dp"
+        android:paddingStart="8dp"
+        android:paddingTop="8dp"
+        android:textAppearance="@style/TextAppearance.CategoryTitle"/>
+</LinearLayout>
\ No newline at end of file
index b7fc2c2..388f90d 100644 (file)
     <!-- Button which clears out storage in the deletion helper. [CHAR LIMIT=60]-->
     <string name="deletion_helper_free_button">Free up <xliff:g id="freeable" example="1.2GB">%1$s</xliff:g></string>
 
-    <!-- Title text for calling or emailing customer support [CHAR LIMIT=80]-->
-    <string name="support_escalation_title">24/7 support</string>
+    <!-- Title text for connecting to customer support [CHAR LIMIT=80]-->
+    <string name="support_escalation_title">Around the clock help</string>
+
+    <!-- Summary text for connecting to customer support [CHAR LIMIT=NONE]-->
+    <string name="support_escalation_summary">Call or email us and we\'ll get your issue solved right away. No muss, no fuss.</string>
+
+    <!-- Title text for showing a list of help options [CHAR LIMIT=80]-->
+    <string name="support_more_help_title">More help</string>
 
     <!-- Button label for contacting customer support by phone [CHAR LIMIT=20]-->
     <string name="support_escalation_by_phone">Phone</string>
     <!-- Button label for contacting customer support by email [CHAR LIMIT=20]-->
     <string name="support_escalation_by_email">Email</string>
 
+    <!-- Button label for contacting customer support by chat [CHAR LIMIT=20]-->
+    <string name="support_escalation_by_chat">Chat</string>
+
     <!-- Button label for visiting help forum [CHAR LIMIT=60]-->
     <string name="support_forum_title">Help forum</string>
 
index 45d2c11..764cc58 100644 (file)
         <item name="android:textColor">@color/warning</item>
     </style>
 
+    <style name="TextAppearance.SupportTitle"
+           parent="@android:style/TextAppearance.Material.Subhead">
+        <item name="android:textColor">?android:attr/colorAccent</item>
+        <item name="android:textSize">24sp</item>
+    </style>
+
+    <style name="TextAppearance.SupportSummary" parent="TextAppearance.CategoryTitle"/>
+
     <style name="FingerprintLayoutTheme">
         <item name="suwBackground">@drawable/fp_enrollment_header</item>
         <item name="suwIllustrationAspectRatio">@dimen/fingerprint_illustration_aspect_ratio</item>
index 831ac50..b75cef2 100644 (file)
@@ -99,7 +99,7 @@ public final class DashboardContainerFragment extends InstrumentedFragment {
             super(fragmentManager);
             mContext = context;
             mSupportFeatureProvider =
-                    FeatureFactory.getFactory(context).getSupportFeatureProvider();
+                    FeatureFactory.getFactory(context).getSupportFeatureProvider(context);
         }
 
         @Override
index c4d74ef..eb85fef 100644 (file)
 
 package com.android.settings.dashboard;
 
-import android.annotation.DrawableRes;
-import android.annotation.IdRes;
-import android.annotation.StringRes;
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.OnAccountsUpdateListener;
 import android.app.Activity;
 import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
 
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
@@ -35,10 +35,14 @@ import com.android.settings.overlay.SupportFeatureProvider;
 /**
  * Fragment for support tab in SettingsGoogle.
  */
-public final class SupportFragment extends InstrumentedFragment implements View.OnClickListener {
+public final class SupportFragment extends InstrumentedFragment implements View.OnClickListener,
+        OnAccountsUpdateListener {
 
     private Activity mActivity;
     private View mContent;
+    private RecyclerView mRecyclerView;
+    private SupportItemAdapter mSupportItemAdapter;
+    private AccountManager mAccountManager;
     private SupportFeatureProvider mSupportFeatureProvider;
 
     @Override
@@ -50,45 +54,49 @@ public final class SupportFragment extends InstrumentedFragment implements View.
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mActivity = getActivity();
+        mAccountManager = AccountManager.get(mActivity);
         mSupportFeatureProvider =
-                FeatureFactory.getFactory(getContext()).getSupportFeatureProvider();
+                FeatureFactory.getFactory(mActivity).getSupportFeatureProvider(mActivity);
+        mSupportItemAdapter = new SupportItemAdapter(mActivity, mSupportFeatureProvider,
+                this /* itemClickListener */);
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         mContent = inflater.inflate(R.layout.support_fragment, container, false);
-        // Update escalation items.
-        updateEscalationCard(R.id.escalation_by_phone, R.string.support_escalation_by_phone);
-        updateEscalationCard(R.id.escalation_by_email, R.string.support_escalation_by_email);
-        // Update other support items.
-        updateSupportTile(R.id.forum_tile, R.drawable.ic_forum_24dp, R.string.support_forum_title);
-        updateSupportTile(R.id.article_tile, R.drawable.ic_help_24dp,
-                R.string.support_articles_title);
-        // Update feedback item.
-        updateSupportTile(R.id.feedback_tile, R.drawable.ic_feedback_24dp,
-                R.string.support_feedback_title);
+        mRecyclerView = (RecyclerView) mContent.findViewById(R.id.support_items);
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(
+                getActivity(), LinearLayoutManager.VERTICAL, false /* reverseLayout */));
+        mRecyclerView.setAdapter(mSupportItemAdapter);
         return mContent;
     }
 
-    private void updateEscalationCard(@IdRes int cardId, @StringRes int title) {
-        final View card = mContent.findViewById(cardId);
-        ((TextView) card.findViewById(R.id.title)).setText(title);
+    @Override
+    public void onResume() {
+        super.onResume();
+        // Monitor account change.
+        mAccountManager.addOnAccountsUpdatedListener(
+                this /* listener */, null /* handler */, true /* updateImmediately */);
     }
 
-    private void updateSupportTile(@IdRes int tileId, @DrawableRes int icon, @StringRes int title) {
-        final View tile = mContent.findViewById(tileId);
-        ((ImageView) tile.findViewById(android.R.id.icon)).setImageResource(icon);
-        ((TextView) tile.findViewById(android.R.id.title)).setText(title);
-        tile.setOnClickListener(this);
+    @Override
+    public void onPause() {
+        super.onPause();
+        // Stop monitor account change.
+        mAccountManager.removeOnAccountsUpdatedListener(this /* listener */);
+    }
+
+    @Override
+    public void onAccountsUpdated(Account[] accounts) {
+        // Account changed, update support items.
+        mSupportItemAdapter.refreshData();
     }
 
     @Override
     public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.forum_tile:
-                mActivity.startActivity(mSupportFeatureProvider.getForumIntent());
-                break;
-        }
+        final SupportItemAdapter.ViewHolder vh =
+                (SupportItemAdapter.ViewHolder) mRecyclerView.getChildViewHolder(v);
+        mSupportItemAdapter.onItemClicked(vh.getAdapterPosition());
     }
 }
diff --git a/src/com/android/settings/dashboard/SupportItemAdapter.java b/src/com/android/settings/dashboard/SupportItemAdapter.java
new file mode 100644 (file)
index 0000000..867b38c
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.dashboard;
+
+import android.accounts.Account;
+import android.annotation.DrawableRes;
+import android.annotation.LayoutRes;
+import android.annotation.StringRes;
+import android.app.Activity;
+import android.content.Intent;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settings.overlay.SupportFeatureProvider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static com.android.settings.overlay.SupportFeatureProvider.SupportType.CHAT;
+import static com.android.settings.overlay.SupportFeatureProvider.SupportType.EMAIL;
+import static com.android.settings.overlay.SupportFeatureProvider.SupportType.PHONE;
+
+/**
+ * Item adapter for support tiles.
+ */
+public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAdapter.ViewHolder> {
+
+    private static final int TYPE_TITLE = R.layout.support_item_title;
+    private static final int TYPE_SUBTITLE = R.layout.support_item_subtitle;
+    private static final int TYPE_ESCALATION_CARD = R.layout.support_escalation_card;
+    private static final int TYPE_SUPPORT_TILE = R.layout.support_tile;
+
+    private final Activity mActivity;
+    private final SupportFeatureProvider mSupportFeatureProvider;
+    private final View.OnClickListener mItemClickListener;
+    private final List<SupportData> mSupportData;
+
+    public SupportItemAdapter(Activity activity, SupportFeatureProvider supportFeatureProvider,
+            View.OnClickListener itemClickListener) {
+        mActivity = activity;
+        mSupportFeatureProvider = supportFeatureProvider;
+        mItemClickListener = itemClickListener;
+        mSupportData = new ArrayList<>();
+        setHasStableIds(true);
+        refreshData();
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(
+                viewType, parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, int position) {
+        final SupportData data = mSupportData.get(position);
+        if (holder.iconView != null) {
+            holder.iconView.setImageResource(data.icon);
+        }
+        if (holder.titleView != null) {
+            holder.titleView.setText(data.title);
+        }
+        if (holder.summaryView != null) {
+            holder.summaryView.setText(data.summary);
+        }
+        holder.itemView.setOnClickListener(mItemClickListener);
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        return mSupportData.get(position).type;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mSupportData.size();
+    }
+
+    /**
+     * Called when a support item is clicked.
+     */
+    public void onItemClicked(int position) {
+        if (position >= 0 && position < mSupportData.size()) {
+            final SupportData data = mSupportData.get(position);
+            if (data.intent != null) {
+                mActivity.startActivityForResult(data.intent, 0);
+            }
+        }
+    }
+
+    /**
+     * Create data for the adapter. If there is already data in the adapter, they will be
+     * destroyed and recreated.
+     */
+    public void refreshData() {
+        mSupportData.clear();
+        final Account[] accounts = mSupportFeatureProvider.getSupportEligibleAccounts(mActivity);
+        if (accounts.length > 0) {
+            addEscalationCards(accounts[0]);
+        }
+        addMoreHelpItems();
+        notifyDataSetChanged();
+    }
+
+    private void addEscalationCards(Account account) {
+        mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
+                R.string.support_escalation_title, R.string.support_escalation_summary,
+                null /* intent */));
+        if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, PHONE)) {
+            mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_call_24dp,
+                    R.string.support_escalation_by_phone, 0 /* summary */,
+                    mSupportFeatureProvider.getSupportIntent(mActivity, account, PHONE)));
+        }
+        if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, EMAIL)) {
+            mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_mail_24dp,
+                    R.string.support_escalation_by_email, 0 /* summary */,
+                    mSupportFeatureProvider.getSupportIntent(mActivity, account, EMAIL)));
+        }
+        if (mSupportFeatureProvider.isSupportTypeEnabled(mActivity, CHAT)) {
+            mSupportData.add(new SupportData(TYPE_ESCALATION_CARD, R.drawable.ic_chat_24dp,
+                    R.string.support_escalation_by_chat, 0 /* summary */,
+                    mSupportFeatureProvider.getSupportIntent(mActivity, account, CHAT)));
+        }
+    }
+
+    private void addMoreHelpItems() {
+        mSupportData.add(new SupportData(TYPE_SUBTITLE, 0 /* icon */,
+                R.string.support_more_help_title, 0 /* summary */, null /* intent */));
+        mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_forum_24dp,
+                R.string.support_forum_title, 0 /* summary */,
+                mSupportFeatureProvider.getForumIntent()));
+        mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_help_24dp,
+                R.string.support_articles_title, 0 /* summary */, null /*intent */));
+        mSupportData.add(new SupportData(TYPE_SUPPORT_TILE, R.drawable.ic_feedback_24dp,
+                R.string.support_feedback_title, 0 /* summary */, null /*intent */));
+    }
+
+    /**
+     * {@link RecyclerView.ViewHolder} for support items.
+     */
+    static final class ViewHolder extends RecyclerView.ViewHolder {
+
+        final ImageView iconView;
+        final TextView titleView;
+        final TextView summaryView;
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            iconView = (ImageView) itemView.findViewById(android.R.id.icon);
+            titleView = (TextView) itemView.findViewById(android.R.id.title);
+            summaryView = (TextView) itemView.findViewById(android.R.id.summary);
+        }
+    }
+
+    /**
+     * Data for a single support item.
+     */
+    private static final class SupportData {
+
+        final Intent intent;
+        @LayoutRes final int type;
+        @DrawableRes final int icon;
+        @StringRes final int title;
+        @StringRes final int summary;
+
+        SupportData(@LayoutRes int type, @DrawableRes int icon, @StringRes int title,
+                @StringRes int summary, Intent intent) {
+            this.type = type;
+            this.icon = icon;
+            this.title = title;
+            this.summary = summary;
+            this.intent = intent;
+        }
+    }
+}
index 4dc9ba2..1bffc2b 100644 (file)
@@ -59,7 +59,7 @@ public abstract class FeatureFactory {
         return sFactory;
     }
 
-    public abstract SupportFeatureProvider getSupportFeatureProvider();
+    public abstract SupportFeatureProvider getSupportFeatureProvider(Context context);
 
     public static final class FactoryNotFoundException extends RuntimeException {
         public FactoryNotFoundException(Throwable throwable) {
index d884080..ce561f3 100644 (file)
 
 package com.android.settings.overlay;
 
+import android.content.Context;
+
 /**
  * {@link FeatureFactory} implementation for AOSP Settings.
  */
 public final class FeatureFactoryImpl extends FeatureFactory {
 
     @Override
-    public SupportFeatureProvider getSupportFeatureProvider() {
+    public SupportFeatureProvider getSupportFeatureProvider(Context context) {
         return null;
     }
 
index 71f0876..299eaad 100644 (file)
 
 package com.android.settings.overlay;
 
+import android.accounts.Account;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.content.Context;
 import android.content.Intent;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
  * Feature provider for support tab.
  */
 public interface SupportFeatureProvider {
 
+    @IntDef({SupportType.EMAIL, SupportType.PHONE, SupportType.CHAT})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface SupportType {
+        int EMAIL = 1;
+        int PHONE = 2;
+        int CHAT = 3;
+    }
+
     /**
      * Returns a intent that will open help forum.
      */
     Intent getForumIntent();
 
+    /**
+     * Whether or not a support type is enabled.
+     */
+    boolean isSupportTypeEnabled(Context context, @SupportType int type);
+
+    /**
+     * Returns an {@link Account} that's eligible for support options.
+     */
+    @NonNull
+    Account[] getSupportEligibleAccounts(Context context);
+
+    /**
+     * Returns an {@link Intent} that opens email support for specified account.
+     *
+     * @param context A UI Context
+     * @param account A account returned by {@link #getSupportEligibleAccounts}
+     * @param type The type of support account needs.
+     */
+    Intent getSupportIntent(Context context, Account account, @SupportType int type);
+
 }