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