• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.dashboard;
18 
19 import android.accounts.Account;
20 import android.accounts.AccountManager;
21 import android.accounts.OnAccountsUpdateListener;
22 import android.app.Activity;
23 import android.content.Context;
24 import android.net.ConnectivityManager;
25 import android.net.Network;
26 import android.net.NetworkCapabilities;
27 import android.net.NetworkInfo;
28 import android.net.NetworkRequest;
29 import android.os.Bundle;
30 import android.os.Handler;
31 import android.os.Looper;
32 import android.support.v7.widget.LinearLayoutManager;
33 import android.support.v7.widget.RecyclerView;
34 import android.view.LayoutInflater;
35 import android.view.View;
36 import android.view.ViewGroup;
37 
38 import com.android.internal.logging.MetricsProto;
39 import com.android.settings.InstrumentedFragment;
40 import com.android.settings.R;
41 import com.android.settings.overlay.FeatureFactory;
42 import com.android.settings.overlay.SupportFeatureProvider;
43 
44 /**
45  * Fragment for support tab in SettingsGoogle.
46  */
47 public final class SupportFragment extends InstrumentedFragment implements View.OnClickListener,
48         OnAccountsUpdateListener {
49 
50     private final Handler mHandler = new Handler(Looper.getMainLooper());
51     private final ConnectivityManager.NetworkCallback mNetworkCallback =
52             new ConnectivityManager.NetworkCallback() {
53 
54                 @Override
55                 public void onCapabilitiesChanged(Network network,
56                         NetworkCapabilities capabilities) {
57                     postConnectivityChanged();
58                 }
59 
60                 @Override
61                 public void onAvailable(Network network) {
62                     postConnectivityChanged();
63                 }
64 
65                 @Override
66                 public void onLost(Network network) {
67                     postConnectivityChanged();
68                 }
69             };
70 
71     private Activity mActivity;
72     private View mContent;
73     private RecyclerView mRecyclerView;
74     private SupportItemAdapter mSupportItemAdapter;
75     private AccountManager mAccountManager;
76     private SupportFeatureProvider mSupportFeatureProvider;
77     private ConnectivityManager mConnectivityManager;
78 
79     @Override
getMetricsCategory()80     protected int getMetricsCategory() {
81         return MetricsProto.MetricsEvent.SUPPORT_FRAGMENT;
82     }
83 
84     @Override
onCreate(Bundle savedInstanceState)85     public void onCreate(Bundle savedInstanceState) {
86         super.onCreate(savedInstanceState);
87         mActivity = getActivity();
88         mAccountManager = AccountManager.get(mActivity);
89         mSupportFeatureProvider =
90                 FeatureFactory.getFactory(mActivity).getSupportFeatureProvider(mActivity);
91         mSupportItemAdapter = new SupportItemAdapter(mActivity, savedInstanceState,
92                 mSupportFeatureProvider, this /* itemClickListener */);
93         mConnectivityManager =
94                 (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
95     }
96 
97     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)98     public View onCreateView(LayoutInflater inflater, ViewGroup container,
99             Bundle savedInstanceState) {
100         mContent = inflater.inflate(R.layout.support_fragment, container, false);
101         mRecyclerView = (RecyclerView) mContent.findViewById(R.id.support_items);
102         mRecyclerView.setLayoutManager(new LinearLayoutManager(
103                 getActivity(), LinearLayoutManager.VERTICAL, false /* reverseLayout */));
104         mRecyclerView.setAdapter(mSupportItemAdapter);
105         return mContent;
106     }
107 
108     @Override
onResume()109     public void onResume() {
110         super.onResume();
111         // Monitor account change.
112         mAccountManager.addOnAccountsUpdatedListener(
113                 this /* listener */, null /* handler */, true /* updateImmediately */);
114         // Monitor connectivity
115         mConnectivityManager.registerNetworkCallback(
116                 new NetworkRequest.Builder()
117                         .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
118                         .build(),
119                 mNetworkCallback);
120         mSupportItemAdapter.setHasInternet(hasInternet());
121     }
122 
123     @Override
onPause()124     public void onPause() {
125         super.onPause();
126         // Stop monitor account change.
127         mAccountManager.removeOnAccountsUpdatedListener(this /* listener */);
128         // Stop monitor connectivity.
129         mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
130     }
131 
132     @Override
onSaveInstanceState(Bundle outState)133     public void onSaveInstanceState(Bundle outState) {
134         super.onSaveInstanceState(outState);
135         mSupportItemAdapter.onSaveInstanceState(outState);
136     }
137 
138     @Override
onAccountsUpdated(Account[] accounts)139     public void onAccountsUpdated(Account[] accounts) {
140         // Account changed, update support items.
141         mSupportItemAdapter.setAccount(
142                 mSupportFeatureProvider.getSupportEligibleAccount(mActivity));
143     }
144 
145     @Override
onClick(View v)146     public void onClick(View v) {
147         final SupportItemAdapter.ViewHolder vh =
148                 (SupportItemAdapter.ViewHolder) mRecyclerView.getChildViewHolder(v);
149         mSupportItemAdapter.onItemClicked(vh.getAdapterPosition());
150     }
151 
postConnectivityChanged()152     private void postConnectivityChanged() {
153         mHandler.post(new Runnable() {
154             @Override
155             public void run() {
156                 if (mSupportItemAdapter != null) {
157                     mSupportItemAdapter.setHasInternet(hasInternet());
158                 }
159             }
160         });
161     }
162 
hasInternet()163     private boolean hasInternet() {
164         final NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo();
165         return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
166     }
167 }
168