OSDN Git Service

Monitor connectivity change and display offline promo.
authorFan Zhang <zhfan@google.com>
Fri, 22 Apr 2016 20:43:26 +0000 (13:43 -0700)
committerFan Zhang <zhfan@google.com>
Wed, 27 Apr 2016 19:21:46 +0000 (12:21 -0700)
Bug: 28141203
Change-Id: I2af7cc3071d835092fba961ff59189f1fb295063

res/values/strings.xml
src/com/android/settings/dashboard/SupportFragment.java
src/com/android/settings/dashboard/SupportItemAdapter.java

index 388f90d..93f0e50 100644 (file)
     <!-- 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 that indicates there is not internet connection. [CHAR LIMIT=80]-->
+    <string name="support_offline_title">You\'re offline</string>
+
+    <!-- Summary text telling user to connect to Internet in order to request customer support. [CHAR LIMIT=NONE]-->
+    <string name="support_offline_summary">To reach support, first connect to Wi-Fi or data.</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 phone [CHAR LIMIT=20]-->
+    <string name="support_escalation_by_phone_offline">Phone</string>
+
     <!-- Button label for contacting customer support by email [CHAR LIMIT=20]-->
     <string name="support_escalation_by_email">Email</string>
 
index eb85fef..8a6c5a8 100644 (file)
@@ -20,7 +20,15 @@ import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.OnAccountsUpdateListener;
 import android.app.Activity;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.NetworkRequest;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
@@ -38,12 +46,34 @@ import com.android.settings.overlay.SupportFeatureProvider;
 public final class SupportFragment extends InstrumentedFragment implements View.OnClickListener,
         OnAccountsUpdateListener {
 
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private final ConnectivityManager.NetworkCallback mNetworkCallback =
+            new ConnectivityManager.NetworkCallback() {
+
+                @Override
+                public void onCapabilitiesChanged(Network network,
+                        NetworkCapabilities capabilities) {
+                    postConnectivityChanged();
+                }
+
+                @Override
+                public void onAvailable(Network network) {
+                    postConnectivityChanged();
+                }
+
+                @Override
+                public void onLost(Network network) {
+                    postConnectivityChanged();
+                }
+            };
+
     private Activity mActivity;
     private View mContent;
     private RecyclerView mRecyclerView;
     private SupportItemAdapter mSupportItemAdapter;
     private AccountManager mAccountManager;
     private SupportFeatureProvider mSupportFeatureProvider;
+    private ConnectivityManager mConnectivityManager;
 
     @Override
     protected int getMetricsCategory() {
@@ -59,6 +89,8 @@ public final class SupportFragment extends InstrumentedFragment implements View.
                 FeatureFactory.getFactory(mActivity).getSupportFeatureProvider(mActivity);
         mSupportItemAdapter = new SupportItemAdapter(mActivity, mSupportFeatureProvider,
                 this /* itemClickListener */);
+        mConnectivityManager =
+                (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
     }
 
     @Override
@@ -78,6 +110,12 @@ public final class SupportFragment extends InstrumentedFragment implements View.
         // Monitor account change.
         mAccountManager.addOnAccountsUpdatedListener(
                 this /* listener */, null /* handler */, true /* updateImmediately */);
+        // Monitor connectivity
+        mConnectivityManager.registerNetworkCallback(
+                new NetworkRequest.Builder()
+                        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                        .build(),
+                mNetworkCallback);
     }
 
     @Override
@@ -85,6 +123,8 @@ public final class SupportFragment extends InstrumentedFragment implements View.
         super.onPause();
         // Stop monitor account change.
         mAccountManager.removeOnAccountsUpdatedListener(this /* listener */);
+        // Stop monitor connectivity.
+        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
     }
 
     @Override
@@ -99,4 +139,20 @@ public final class SupportFragment extends InstrumentedFragment implements View.
                 (SupportItemAdapter.ViewHolder) mRecyclerView.getChildViewHolder(v);
         mSupportItemAdapter.onItemClicked(vh.getAdapterPosition());
     }
+
+    private void postConnectivityChanged() {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mSupportItemAdapter != null) {
+                    mSupportItemAdapter.setHasInternet(hasInternet());
+                }
+            }
+        });
+    }
+
+    private boolean hasInternet() {
+        final NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo();
+        return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
+    }
 }
index 867b38c..2d8f5dd 100644 (file)
@@ -22,6 +22,7 @@ import android.annotation.StringRes;
 import android.app.Activity;
 import android.content.Intent;
 import android.support.v7.widget.RecyclerView;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -43,6 +44,8 @@ import static com.android.settings.overlay.SupportFeatureProvider.SupportType.PH
  */
 public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAdapter.ViewHolder> {
 
+    private static final String TAG = "SupportItemAdapter";
+
     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;
@@ -53,12 +56,16 @@ public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAd
     private final View.OnClickListener mItemClickListener;
     private final List<SupportData> mSupportData;
 
+    private boolean mHasInternet;
+
     public SupportItemAdapter(Activity activity, SupportFeatureProvider supportFeatureProvider,
             View.OnClickListener itemClickListener) {
         mActivity = activity;
         mSupportFeatureProvider = supportFeatureProvider;
         mItemClickListener = itemClickListener;
         mSupportData = new ArrayList<>();
+        // Optimistically assume we have Internet access. It will be updated later to correct value.
+        mHasInternet = true;
         setHasStableIds(true);
         refreshData();
     }
@@ -106,6 +113,13 @@ public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAd
         }
     }
 
+    public void setHasInternet(boolean hasInternet) {
+        if (mHasInternet != hasInternet) {
+            mHasInternet = hasInternet;
+            refreshData();
+        }
+    }
+
     /**
      * Create data for the adapter. If there is already data in the adapter, they will be
      * destroyed and recreated.
@@ -113,7 +127,9 @@ public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAd
     public void refreshData() {
         mSupportData.clear();
         final Account[] accounts = mSupportFeatureProvider.getSupportEligibleAccounts(mActivity);
-        if (accounts.length > 0) {
+        if (accounts.length == 0) {
+            Log.d(TAG, "Account unavailable. Skipping");
+        } else {
             addEscalationCards(accounts[0]);
         }
         addMoreHelpItems();
@@ -121,9 +137,15 @@ public final class SupportItemAdapter extends RecyclerView.Adapter<SupportItemAd
     }
 
     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 (mHasInternet) {
+            mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
+                    R.string.support_escalation_title, R.string.support_escalation_summary,
+                    null /* intent */));
+        } else {
+            mSupportData.add(new SupportData(TYPE_TITLE, 0 /* icon */,
+                    R.string.support_offline_title, R.string.support_offline_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 */,