OSDN Git Service

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