2 * Copyright (C) 2014 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings.dashboard;
19 import android.content.Context;
20 import android.os.AsyncTask;
21 import android.os.Bundle;
22 import android.support.v7.widget.LinearLayoutManager;
23 import android.util.Log;
24 import android.view.LayoutInflater;
25 import android.view.Menu;
26 import android.view.MenuInflater;
27 import android.view.View;
28 import android.view.ViewGroup;
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;
45 import java.util.List;
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";
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(),
63 private static final String SUGGESTIONS = "suggestions";
65 private static final String EXTRA_SCROLL_POSITION = "scroll_position";
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;
76 protected int getMetricsCategory() {
77 return MetricsEvent.DASHBOARD_SUMMARY;
81 public void onCreate(Bundle savedInstanceState) {
82 long startTime = System.currentTimeMillis();
83 super.onCreate(savedInstanceState);
85 List<DashboardCategory> categories =
86 ((SettingsActivity) getActivity()).getDashboardCategories();
87 mSummaryLoader = new SummaryLoader(getActivity(), categories);
88 setHasOptionsMenu(true);
89 Context context = getContext();
90 mConditionManager = ConditionManager.get(context, false);
91 mSuggestionParser = new SuggestionParser(context,
92 context.getSharedPreferences(SUGGESTIONS, 0), R.xml.suggestion_ordering);
93 mSuggestionsChecks = new SuggestionsChecks(getContext());
94 if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
99 public void onDestroy() {
100 mSummaryLoader.release();
105 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
106 super.onCreateOptionsMenu(menu, inflater);
107 if (getActivity() == null) return;
108 HelpUtils.prepareHelpMenuItem(getActivity(), menu, R.string.help_uri_dashboard,
109 getClass().getName());
113 public void onStart() {
114 long startTime = System.currentTimeMillis();
117 ((SettingsDrawerActivity) getActivity()).addCategoryListener(this);
118 mSummaryLoader.setListening(true);
119 for (Condition c : mConditionManager.getConditions()) {
120 if (c.shouldShow()) {
121 MetricsLogger.visible(getContext(), c.getMetricsConstant());
124 if (mAdapter.getSuggestions() != null) {
125 for (Tile suggestion : mAdapter.getSuggestions()) {
126 MetricsLogger.action(getContext(), MetricsEvent.ACTION_SHOW_SETTINGS_SUGGESTION,
127 DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
130 if (DEBUG_TIMING) Log.d(TAG, "onStart took " + (System.currentTimeMillis() - startTime)
135 public void onStop() {
138 ((SettingsDrawerActivity) getActivity()).remCategoryListener(this);
139 mSummaryLoader.setListening(false);
140 for (Condition c : mConditionManager.getConditions()) {
141 if (c.shouldShow()) {
142 MetricsLogger.hidden(getContext(), c.getMetricsConstant());
145 if (mAdapter.getSuggestions() == null) {
148 for (Tile suggestion : mAdapter.getSuggestions()) {
149 MetricsLogger.action(getContext(), MetricsEvent.ACTION_HIDE_SETTINGS_SUGGESTION,
150 DashboardAdapter.getSuggestionIdentifier(getContext(), suggestion));
155 public void onWindowFocusChanged(boolean hasWindowFocus) {
156 long startTime = System.currentTimeMillis();
157 if (hasWindowFocus) {
158 mConditionManager.addListener(this);
159 mConditionManager.refreshAll();
161 mConditionManager.remListener(this);
163 if (DEBUG_TIMING) Log.d(TAG, "onWindowFocusChanged took "
164 + (System.currentTimeMillis() - startTime) + " ms");
168 public View onCreateView(LayoutInflater inflater, ViewGroup container,
169 Bundle savedInstanceState) {
170 return inflater.inflate(R.layout.dashboard, container, false);
174 public void onSaveInstanceState(Bundle outState) {
175 super.onSaveInstanceState(outState);
176 if (mLayoutManager == null) return;
177 outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
181 public void onViewCreated(View view, Bundle bundle) {
182 long startTime = System.currentTimeMillis();
183 mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container);
184 mLayoutManager = new LinearLayoutManager(getContext());
185 mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
186 if (bundle != null) {
187 int scrollPosition = bundle.getInt(EXTRA_SCROLL_POSITION);
188 mLayoutManager.scrollToPosition(scrollPosition);
190 mDashboard.setLayoutManager(mLayoutManager);
191 mDashboard.setHasFixedSize(true);
192 mDashboard.setListener(this);
193 mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
194 mAdapter = new DashboardAdapter(getContext(), mSuggestionParser);
195 mAdapter.setConditions(mConditionManager.getConditions());
196 mDashboard.setAdapter(mAdapter);
197 mSummaryLoader.setAdapter(mAdapter);
198 ConditionAdapterUtils.addDismiss(mDashboard);
199 if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
200 + (System.currentTimeMillis() - startTime) + " ms");
205 private void rebuildUI() {
207 Log.w(TAG, "Cannot build the DashboardSummary UI yet as the Fragment is not added");
211 List<DashboardCategory> categories =
212 ((SettingsActivity) getActivity()).getDashboardCategories();
213 mAdapter.setCategories(categories);
215 // recheck to see if any suggestions have been changed.
216 new SuggestionLoader().execute();
220 public void onCategoriesChanged() {
225 public void onConditionsChanged() {
226 Log.d(TAG, "onConditionsChanged");
227 mAdapter.setConditions(mConditionManager.getConditions());
230 private class SuggestionLoader extends AsyncTask<Void, Void, List<Tile>> {
233 protected List<Tile> doInBackground(Void... params) {
234 List<Tile> suggestions = mSuggestionParser.getSuggestions();
235 for (int i = 0; i < suggestions.size(); i++) {
236 if (mSuggestionsChecks.isSuggestionComplete(suggestions.get(i))) {
237 mAdapter.disableSuggestion(suggestions.get(i));
238 suggestions.remove(i--);
245 protected void onPostExecute(List<Tile> tiles) {
246 mAdapter.setSuggestions(tiles);