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