12869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang/* 22869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * Copyright (C) 2016 The Android Open Source Project 32869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * 42869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 52869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * you may not use this file except in compliance with the License. 62869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * You may obtain a copy of the License at 72869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * 82869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * http://www.apache.org/licenses/LICENSE-2.0 92869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * 102869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * Unless required by applicable law or agreed to in writing, software 112869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 122869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * See the License for the specific language governing permissions and 142869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * limitations under the License. 152869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang */ 162869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 172869157ba9b071f56691a285394500fa4c8a0a79Fan Zhangpackage com.android.settings.dashboard; 182869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 19a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhangimport android.accounts.Account; 20a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhangimport android.accounts.AccountManager; 21a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhangimport android.accounts.OnAccountsUpdateListener; 2235e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhangimport android.app.Activity; 232ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.content.Context; 242ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.net.ConnectivityManager; 252ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.net.Network; 262ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.net.NetworkCapabilities; 272ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.net.NetworkInfo; 282ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.net.NetworkRequest; 292869157ba9b071f56691a285394500fa4c8a0a79Fan Zhangimport android.os.Bundle; 302ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.os.Handler; 312ddde4a9282ea74f570e970a1a26252067032c58Fan Zhangimport android.os.Looper; 32a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhangimport android.support.v7.widget.LinearLayoutManager; 33a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhangimport android.support.v7.widget.RecyclerView; 342869157ba9b071f56691a285394500fa4c8a0a79Fan Zhangimport android.view.LayoutInflater; 352869157ba9b071f56691a285394500fa4c8a0a79Fan Zhangimport android.view.View; 362869157ba9b071f56691a285394500fa4c8a0a79Fan Zhangimport android.view.ViewGroup; 372869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 38265d3c2a0c36251bf8a9f571d7239b6dd404d942Tamas Berghammerimport com.android.internal.logging.nano.MetricsProto; 392869157ba9b071f56691a285394500fa4c8a0a79Fan Zhangimport com.android.settings.R; 40c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhangimport com.android.settings.core.InstrumentedFragment; 4135e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhangimport com.android.settings.overlay.FeatureFactory; 4235e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhangimport com.android.settings.overlay.SupportFeatureProvider; 432869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 442869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang/** 452869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang * Fragment for support tab in SettingsGoogle. 462869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang */ 47a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhangpublic final class SupportFragment extends InstrumentedFragment implements View.OnClickListener, 48a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang OnAccountsUpdateListener { 492869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 502ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang private final Handler mHandler = new Handler(Looper.getMainLooper()); 512ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang private final ConnectivityManager.NetworkCallback mNetworkCallback = 522ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang new ConnectivityManager.NetworkCallback() { 532ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang 542ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang @Override 552ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang public void onCapabilitiesChanged(Network network, 562ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang NetworkCapabilities capabilities) { 572ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang postConnectivityChanged(); 582ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 592ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang 602ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang @Override 612ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang public void onAvailable(Network network) { 622ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang postConnectivityChanged(); 632ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 642ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang 652ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang @Override 662ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang public void onLost(Network network) { 672ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang postConnectivityChanged(); 682ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 692ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang }; 702ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang 7135e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang private Activity mActivity; 722869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang private View mContent; 73a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang private RecyclerView mRecyclerView; 74a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang private SupportItemAdapter mSupportItemAdapter; 75a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang private AccountManager mAccountManager; 7635e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang private SupportFeatureProvider mSupportFeatureProvider; 772ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang private ConnectivityManager mConnectivityManager; 782869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 792869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang @Override 806507613ebcd22e4691c2af92a5c161bd327db336Fan Zhang public int getMetricsCategory() { 8137d4d0c80efcd505ed968d1f47158a8edbe8cb27Fan Zhang return MetricsProto.MetricsEvent.SUPPORT_FRAGMENT; 822869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang } 832869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 842869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang @Override 8535e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang public void onCreate(Bundle savedInstanceState) { 8635e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang super.onCreate(savedInstanceState); 87bcfb262cc3f0068c815209ff58788240b3b93e39Fan Zhang setHasOptionsMenu(true); 8835e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang mActivity = getActivity(); 89a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mAccountManager = AccountManager.get(mActivity); 9035e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang mSupportFeatureProvider = 91a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang FeatureFactory.getFactory(mActivity).getSupportFeatureProvider(mActivity); 92b0060dde637f583a048848b64157653a79ba097fFan Zhang mSupportItemAdapter = new SupportItemAdapter(mActivity, savedInstanceState, 93c93d18e29c4c0c82483d87345dbfc1afae1ed2fcFan Zhang mSupportFeatureProvider, mMetricsFeatureProvider, this /* itemClickListener */); 942ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang mConnectivityManager = 952ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE); 9635e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang } 9735e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang 9835e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang @Override 992869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang public View onCreateView(LayoutInflater inflater, ViewGroup container, 1002869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang Bundle savedInstanceState) { 1012869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang mContent = inflater.inflate(R.layout.support_fragment, container, false); 102a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mRecyclerView = (RecyclerView) mContent.findViewById(R.id.support_items); 103a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mRecyclerView.setLayoutManager(new LinearLayoutManager( 104a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang getActivity(), LinearLayoutManager.VERTICAL, false /* reverseLayout */)); 105a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mRecyclerView.setAdapter(mSupportItemAdapter); 1062869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang return mContent; 1072869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang } 1082869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 109a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang @Override 110a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang public void onResume() { 111a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang super.onResume(); 112a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang // Monitor account change. 113a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mAccountManager.addOnAccountsUpdatedListener( 114a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang this /* listener */, null /* handler */, true /* updateImmediately */); 1152ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang // Monitor connectivity 1162ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang mConnectivityManager.registerNetworkCallback( 1172ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang new NetworkRequest.Builder() 1182ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 1192ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang .build(), 1202ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang mNetworkCallback); 121a8219fb1c1b7d285d4a0a924f2ee5f118b48c9b4Fan Zhang mSupportItemAdapter.setHasInternet(hasInternet()); 1221cea5d199b97aa0056f34ca7bd718b01fa8d360cSalvador Martinez mSupportItemAdapter.refreshData(); 1232869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang } 1242869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang 125a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang @Override 126a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang public void onPause() { 127a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang super.onPause(); 128a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang // Stop monitor account change. 129a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mAccountManager.removeOnAccountsUpdatedListener(this /* listener */); 1302ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang // Stop monitor connectivity. 1312ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang mConnectivityManager.unregisterNetworkCallback(mNetworkCallback); 132a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang } 133a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang 134a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang @Override 135b0060dde637f583a048848b64157653a79ba097fFan Zhang public void onSaveInstanceState(Bundle outState) { 136b0060dde637f583a048848b64157653a79ba097fFan Zhang super.onSaveInstanceState(outState); 137b0060dde637f583a048848b64157653a79ba097fFan Zhang mSupportItemAdapter.onSaveInstanceState(outState); 138b0060dde637f583a048848b64157653a79ba097fFan Zhang } 139b0060dde637f583a048848b64157653a79ba097fFan Zhang 140b0060dde637f583a048848b64157653a79ba097fFan Zhang @Override 141a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang public void onAccountsUpdated(Account[] accounts) { 142a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang // Account changed, update support items. 1435538be509c9659bf5ec9d5775f38c93fe3d5e96cjackqdyulei mSupportItemAdapter.setAccounts( 1445538be509c9659bf5ec9d5775f38c93fe3d5e96cjackqdyulei mSupportFeatureProvider.getSupportEligibleAccounts(mActivity)); 14535e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang } 14635e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang 14735e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang @Override 14835e21cf630c3d45dc9d03555dc740fc333c1e8faFan Zhang public void onClick(View v) { 149a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang final SupportItemAdapter.ViewHolder vh = 150a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang (SupportItemAdapter.ViewHolder) mRecyclerView.getChildViewHolder(v); 151a9fa0059b268f7090f375b481990b89fc84bbb5eFan Zhang mSupportItemAdapter.onItemClicked(vh.getAdapterPosition()); 1522869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang } 1532ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang 1542ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang private void postConnectivityChanged() { 1552ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang mHandler.post(new Runnable() { 1562ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang @Override 1572ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang public void run() { 1582ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang if (mSupportItemAdapter != null) { 1592ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang mSupportItemAdapter.setHasInternet(hasInternet()); 1602ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 1612ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 1622ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang }); 1632ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 1642ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang 1652ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang private boolean hasInternet() { 1662ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang final NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo(); 1672ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 1682ddde4a9282ea74f570e970a1a26252067032c58Fan Zhang } 1692869157ba9b071f56691a285394500fa4c8a0a79Fan Zhang} 170