diff --git a/res/values/strings.xml b/res/values/strings.xml
index 388f90d05c7..93f0e50f506 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7475,12 +7475,21 @@
Call or email us and we\'ll get your issue solved right away. No muss, no fuss.
+
+ You\'re offline
+
+
+ To reach support, first connect to Wi-Fi or data.
+
More help
Phone
+
+ Phone
+
Email
diff --git a/src/com/android/settings/dashboard/SupportFragment.java b/src/com/android/settings/dashboard/SupportFragment.java
index eb85fefe2ed..8a6c5a8aa69 100644
--- a/src/com/android/settings/dashboard/SupportFragment.java
+++ b/src/com/android/settings/dashboard/SupportFragment.java
@@ -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();
+ }
}
diff --git a/src/com/android/settings/dashboard/SupportItemAdapter.java b/src/com/android/settings/dashboard/SupportItemAdapter.java
index 867b38c5b0f..2d8f5ddf6c3 100644
--- a/src/com/android/settings/dashboard/SupportItemAdapter.java
+++ b/src/com/android/settings/dashboard/SupportItemAdapter.java
@@ -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 {
+ 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 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 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