• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 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.app.Activity;
20 import android.content.Context;
21 import android.os.AsyncTask;
22 import android.os.Bundle;
23 import android.support.v7.widget.LinearLayoutManager;
24 import android.util.Log;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 
29 import com.android.internal.logging.MetricsLogger;
30 import com.android.internal.logging.MetricsProto.MetricsEvent;
31 import com.android.settings.InstrumentedFragment;
32 import com.android.settings.R;
33 import com.android.settings.Settings;
34 import com.android.settings.SettingsActivity;
35 import com.android.settings.dashboard.conditional.Condition;
36 import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
37 import com.android.settings.dashboard.conditional.ConditionManager;
38 import com.android.settings.dashboard.conditional.FocusRecyclerView;
39 import com.android.settingslib.HelpUtils;
40 import com.android.settingslib.SuggestionParser;
41 import com.android.settingslib.drawer.DashboardCategory;
42 import com.android.settingslib.drawer.SettingsDrawerActivity;
43 import com.android.settingslib.drawer.Tile;
44 
45 import java.util.List;
46 
47 public class DashboardSummary extends InstrumentedFragment
48         implements SettingsDrawerActivity.CategoryListener, ConditionManager.ConditionListener,
49         FocusRecyclerView.FocusListener {
50     public static final boolean DEBUG = false;
51     private static final boolean DEBUG_TIMING = false;
52     private static final String TAG = "DashboardSummary";
53 
54     public static final String[] INITIAL_ITEMS = new String[] {
55             Settings.WifiSettingsActivity.class.getName(),
56             Settings.BluetoothSettingsActivity.class.getName(),
57             Settings.DataUsageSummaryActivity.class.getName(),
58             Settings.PowerUsageSummaryActivity.class.getName(),
59             Settings.ManageApplicationsActivity.class.getName(),
60             Settings.StorageSettingsActivity.class.getName(),
61     };
62 
63     private static final String SUGGESTIONS = "suggestions";
64 
65     private static final String EXTRA_SCROLL_POSITION = "scroll_position";
66 
67     private FocusRecyclerView mDashboard;
68     private DashboardAdapter mAdapter;
69     private SummaryLoader mSummaryLoader;
70     private ConditionManager mConditionManager;
71     private SuggestionParser mSuggestionParser;
72     private LinearLayoutManager mLayoutManager;
73     private SuggestionsChecks mSuggestionsChecks;
74 
75     @Override
getMetricsCategory()76     protected int getMetricsCategory() {
77         return MetricsEvent.DASHBOARD_SUMMARY;
78     }
79 
80     @Override
onCreate(Bundle savedInstanceState)81     public void onCreate(Bundle savedInstanceState) {
82         long startTime = System.currentTimeMillis();
83         super.onCreate(savedInstanceState);
84 
85         List<DashboardCategory> categories =
86                 ((SettingsActivity) getActivity()).getDashboardCategories();
87         mSummaryLoader = new SummaryLoader(getActivity(), categories);
88         Context context = getContext();
89         mConditionManager = ConditionManager.get(context, false);
90         mSuggestionParser = new SuggestionParser(context,
91                 context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
92         mSuggestionsChecks = new SuggestionsChecks(getContext());
93         if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
94                 + " ms");
95     }
96 
97     @Override
onDestroy()98     public void onDestroy() {
99         mSummaryLoader.release();
100         super.onDestroy();
101     }
102 
103     @Override
onStart()104     public void onStart() {
105         long startTime = System.currentTimeMillis();
106         super.onStart();
107 
108         ((SettingsDrawerActivity) getActivity()).addCategoryListener(this);
109         mSummaryLoader.setListening(true);
110         for (Condition c : mConditionManager.getConditions()) {
111             if (c.shouldShow()) {
112                 MetricsLogger.visible(getContext(), c.getMetricsConstant());
113             }
114         }
115         if (mAdapter.getSuggestions() != null) {
116             for (Tile suggestion : mAdapter.getSuggestions()) {
117                 MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
118                         DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
119             }
120         }
121         if (DEBUG_TIMING) Log.d(TAG, "onStart took " + (System.currentTimeMillis() - startTime)
122                 + " ms");
123     }
124 
125     @Override
onStop()126     public void onStop() {
127         super.onStop();
128 
129         ((SettingsDrawerActivity) getActivity()).remCategoryListener(this);
130         mSummaryLoader.setListening(false);
131         for (Condition c : mConditionManager.getConditions()) {
132             if (c.shouldShow()) {
133                 MetricsLogger.hidden(getContext(), c.getMetricsConstant());
134             }
135         }
136         if (mAdapter.getSuggestions() == null) {
137             return;
138         }
139         for (Tile suggestion : mAdapter.getSuggestions()) {
140             MetricsLogger.action(getContext(), MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION,
141                     DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
142         }
143     }
144 
145     @Override
onWindowFocusChanged(boolean hasWindowFocus)146     public void onWindowFocusChanged(boolean hasWindowFocus) {
147         long startTime = System.currentTimeMillis();
148         if (hasWindowFocus) {
149             mConditionManager.addListener(this);
150             mConditionManager.refreshAll();
151         } else {
152             mConditionManager.remListener(this);
153         }
154         if (DEBUG_TIMING) Log.d(TAG, "onWindowFocusChanged took "
155                 + (System.currentTimeMillis() - startTime) + " ms");
156     }
157 
158     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)159     public View onCreateView(LayoutInflater inflater, ViewGroup container,
160                              Bundle savedInstanceState) {
161         return inflater.inflate(R.layout.dashboard, container, false);
162     }
163 
164     @Override
onSaveInstanceState(Bundle outState)165     public void onSaveInstanceState(Bundle outState) {
166         super.onSaveInstanceState(outState);
167         if (mLayoutManager == null) return;
168         outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
169         if (mAdapter != null) {
170             mAdapter.onSaveInstanceState(outState);
171         }
172     }
173 
174     @Override
onViewCreated(View view, Bundle bundle)175     public void onViewCreated(View view, Bundle bundle) {
176         long startTime = System.currentTimeMillis();
177         mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container);
178         mLayoutManager = new LinearLayoutManager(getContext());
179         mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
180         if (bundle != null) {
181             int scrollPosition = bundle.getInt(EXTRA_SCROLL_POSITION);
182             mLayoutManager.scrollToPosition(scrollPosition);
183         }
184         mDashboard.setLayoutManager(mLayoutManager);
185         mDashboard.setHasFixedSize(true);
186         mDashboard.setListener(this);
187         mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
188         mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, bundle,
189                 mConditionManager.getConditions());
190         mDashboard.setAdapter(mAdapter);
191         mSummaryLoader.setAdapter(mAdapter);
192         ConditionAdapterUtils.addDismiss(mDashboard);
193         if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
194                 + (System.currentTimeMillis() - startTime) + " ms");
195         rebuildUI();
196     }
197 
rebuildUI()198     private void rebuildUI() {
199         if (!isAdded()) {
200             Log.w(TAG, "Cannot build the DashboardSummary UI yet as the Fragment is not added");
201             return;
202         }
203 
204         // recheck to see if any suggestions have been changed.
205         new SuggestionLoader().execute();
206     }
207 
208     @Override
onCategoriesChanged()209     public void onCategoriesChanged() {
210         rebuildUI();
211     }
212 
213     @Override
onConditionsChanged()214     public void onConditionsChanged() {
215         Log.d(TAG, "onConditionsChanged");
216         mAdapter.setConditions(mConditionManager.getConditions());
217     }
218 
219     private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
220 
221         @Override
doInBackground(Void... params)222         protected List<Tile> doInBackground(Void... params) {
223             List<Tile> suggestions = mSuggestionParser.getSuggestions();
224             for (int i = 0; i < suggestions.size(); i++) {
225                 if (mSuggestionsChecks.isSuggestionComplete(suggestions.get(i))) {
226                     mAdapter.disableSuggestion(suggestions.get(i));
227                     suggestions.remove(i--);
228                 }
229             }
230             return suggestions;
231         }
232 
233         @Override
onPostExecute(List<Tile> tiles)234         protected void onPostExecute(List<Tile> tiles) {
235             final Activity activity = getActivity();
236             if (activity == null) {
237                 return;
238             }
239             List<DashboardCategory> categories =
240                     ((SettingsActivity) activity).getDashboardCategories();
241             mAdapter.setCategoriesAndSuggestions(categories, tiles);
242         }
243     }
244 }
245