• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.dream;
18 
19 import static com.android.settings.dream.DreamMainSwitchPreferenceController.MAIN_SWITCH_PREF_KEY;
20 
21 import android.app.settings.SettingsEnums;
22 import android.content.Context;
23 import android.os.Bundle;
24 import android.service.dreams.DreamService;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.widget.Button;
29 import android.widget.CompoundButton;
30 import android.widget.CompoundButton.OnCheckedChangeListener;
31 
32 import androidx.annotation.VisibleForTesting;
33 import androidx.preference.Preference;
34 import androidx.recyclerview.widget.RecyclerView;
35 
36 import com.android.settings.R;
37 import com.android.settings.Utils;
38 import com.android.settings.dashboard.DashboardFragment;
39 import com.android.settings.search.BaseSearchIndexProvider;
40 import com.android.settingslib.core.AbstractPreferenceController;
41 import com.android.settingslib.dream.DreamBackend;
42 import com.android.settingslib.dream.DreamBackend.WhenToDream;
43 import com.android.settingslib.search.SearchIndexable;
44 import com.android.settingslib.widget.MainSwitchPreference;
45 
46 import java.util.ArrayList;
47 import java.util.List;
48 
49 @SearchIndexable
50 public class DreamSettings extends DashboardFragment implements OnCheckedChangeListener {
51 
52     private static final String TAG = "DreamSettings";
53     static final String WHILE_CHARGING_ONLY = "while_charging_only";
54     static final String WHILE_DOCKED_ONLY = "while_docked_only";
55     static final String EITHER_CHARGING_OR_DOCKED = "either_charging_or_docked";
56     static final String WHILE_POSTURED_ONLY = "while_postured_only";
57     static final String NEVER_DREAM = "never";
58 
59     private MainSwitchPreference mMainSwitchPreference;
60     private Button mPreviewButton;
61     private Preference mComplicationsTogglePreference;
62     private Preference mHomeControllerTogglePreference;
63     private RecyclerView mRecyclerView;
64 
65     private DreamPickerController mDreamPickerController;
66     private DreamHomeControlsPreferenceController mDreamHomeControlsPreferenceController;
67 
68     private final DreamPickerController.Callback mCallback =
69             this::updateComplicationsToggleVisibility;
70 
71     @WhenToDream
getSettingFromPrefKey(String key)72     static int getSettingFromPrefKey(String key) {
73         switch (key) {
74             case WHILE_CHARGING_ONLY:
75                 return DreamBackend.WHILE_CHARGING;
76             case WHILE_DOCKED_ONLY:
77                 return DreamBackend.WHILE_DOCKED;
78             case EITHER_CHARGING_OR_DOCKED:
79                 return DreamBackend.WHILE_CHARGING_OR_DOCKED;
80             case WHILE_POSTURED_ONLY:
81                 return DreamBackend.WHILE_POSTURED;
82             case NEVER_DREAM:
83             default:
84                 return DreamBackend.NEVER;
85         }
86     }
87 
getKeyFromSetting(@henToDream int dreamSetting)88     static String getKeyFromSetting(@WhenToDream int dreamSetting) {
89         switch (dreamSetting) {
90             case DreamBackend.WHILE_CHARGING:
91                 return WHILE_CHARGING_ONLY;
92             case DreamBackend.WHILE_DOCKED:
93                 return WHILE_DOCKED_ONLY;
94             case DreamBackend.WHILE_CHARGING_OR_DOCKED:
95                 return EITHER_CHARGING_OR_DOCKED;
96             case DreamBackend.WHILE_POSTURED:
97                 return WHILE_POSTURED_ONLY;
98             case DreamBackend.NEVER:
99             default:
100                 return NEVER_DREAM;
101         }
102     }
103 
getDreamSettingDescriptionResId(@henToDream int dreamSetting, boolean enabledOnBattery)104     static int getDreamSettingDescriptionResId(@WhenToDream int dreamSetting,
105             boolean enabledOnBattery) {
106         switch (dreamSetting) {
107             case DreamBackend.WHILE_CHARGING:
108                 return R.string.screensaver_settings_summary_sleep;
109             case DreamBackend.WHILE_DOCKED:
110                 return enabledOnBattery ? R.string.screensaver_settings_summary_dock
111                         : R.string.screensaver_settings_summary_dock_and_charging;
112             case DreamBackend.WHILE_CHARGING_OR_DOCKED:
113                 return R.string.screensaver_settings_summary_either_long;
114             case DreamBackend.WHILE_POSTURED:
115                 return enabledOnBattery ? R.string.screensaver_settings_summary_postured
116                         : R.string.screensaver_settings_summary_postured_and_charging;
117             case DreamBackend.NEVER:
118             default:
119                 return R.string.screensaver_settings_summary_never;
120         }
121     }
122 
123     @Override
getMetricsCategory()124     public int getMetricsCategory() {
125         return SettingsEnums.DREAM;
126     }
127 
128     @Override
getPreferenceScreenResId()129     protected int getPreferenceScreenResId() {
130         return R.xml.dream_fragment_overview;
131     }
132 
133     @Override
getHelpResource()134     public int getHelpResource() {
135         return R.string.help_url_screen_saver;
136     }
137 
138     @Override
getLogTag()139     protected String getLogTag() {
140         return TAG;
141     }
142 
143     @Override
createPreferenceControllers(Context context)144     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
145         final List<AbstractPreferenceController> controllers = new ArrayList<>();
146         if (mDreamPickerController == null) {
147             mDreamPickerController = new DreamPickerController(context);
148         }
149         if (mDreamHomeControlsPreferenceController == null) {
150             mDreamHomeControlsPreferenceController = new DreamHomeControlsPreferenceController(
151                     context, DreamBackend.getInstance(getContext()));
152         }
153         controllers.add(mDreamPickerController);
154         controllers.add(mDreamHomeControlsPreferenceController);
155         controllers.add(new WhenToDreamPreferenceController(context));
156         return controllers;
157     }
158 
getSummaryTextWithDreamName(Context context)159     public static CharSequence getSummaryTextWithDreamName(Context context) {
160         DreamBackend backend = DreamBackend.getInstance(context);
161         return getSummaryTextFromBackend(backend, context);
162     }
163 
164     @VisibleForTesting
getSummaryTextFromBackend(DreamBackend backend, Context context)165     static CharSequence getSummaryTextFromBackend(DreamBackend backend, Context context) {
166         if (backend.isEnabled()) {
167             return context.getString(R.string.screensaver_settings_summary_on,
168                     backend.getActiveDreamName());
169         } else {
170             return context.getString(R.string.screensaver_settings_summary_off);
171         }
172     }
173 
174     @VisibleForTesting
setDreamPickerController(DreamPickerController dreamPickerController)175     void setDreamPickerController(DreamPickerController dreamPickerController) {
176         mDreamPickerController = dreamPickerController;
177     }
178 
179     @VisibleForTesting
setDreamHomeControlsPreferenceController(DreamHomeControlsPreferenceController dreamHomeControlsPreferenceController)180     void setDreamHomeControlsPreferenceController(DreamHomeControlsPreferenceController
181             dreamHomeControlsPreferenceController) {
182         mDreamHomeControlsPreferenceController = dreamHomeControlsPreferenceController;
183     }
184 
setAllPreferencesEnabled(boolean isEnabled)185     private void setAllPreferencesEnabled(boolean isEnabled) {
186         getPreferenceControllers().forEach(controllers -> {
187             controllers.forEach(controller -> {
188                 final String prefKey = controller.getPreferenceKey();
189                 if (prefKey.equals(MAIN_SWITCH_PREF_KEY)) {
190                     return;
191                 }
192                 if (prefKey.equals(DreamHomeControlsPreferenceController.PREF_KEY)) {
193                     return;
194                 }
195                 final Preference pref = findPreference(prefKey);
196                 if (pref != null) {
197                     pref.setEnabled(isEnabled);
198                     controller.updateState(pref);
199                 }
200             });
201         });
202         updateComplicationsToggleVisibility();
203     }
204 
205     @Override
onCreate(Bundle icicle)206     public void onCreate(Bundle icicle) {
207         super.onCreate(icicle);
208 
209         final DreamBackend dreamBackend = DreamBackend.getInstance(getContext());
210 
211         mComplicationsTogglePreference = findPreference(
212                 DreamComplicationPreferenceController.PREF_KEY);
213 
214         mHomeControllerTogglePreference = findPreference(
215                 DreamHomeControlsPreferenceController.PREF_KEY
216         );
217 
218         mMainSwitchPreference = findPreference(MAIN_SWITCH_PREF_KEY);
219         if (mMainSwitchPreference != null) {
220             mMainSwitchPreference.addOnSwitchChangeListener(this);
221         }
222 
223         setAllPreferencesEnabled(dreamBackend.isEnabled());
224 
225         if (mDreamPickerController != null) {
226             mDreamPickerController.addCallback(mCallback);
227         }
228     }
229 
230     @Override
onDestroy()231     public void onDestroy() {
232         if (mDreamPickerController != null) {
233             mDreamPickerController.removeCallback(mCallback);
234         }
235 
236         super.onDestroy();
237     }
238 
239     @Override
onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle bundle)240     public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
241             Bundle bundle) {
242         final DreamBackend dreamBackend = DreamBackend.getInstance(getContext());
243 
244         final ViewGroup root = getActivity().findViewById(android.R.id.content);
245         mPreviewButton = (Button) getActivity().getLayoutInflater().inflate(
246                 R.layout.dream_preview_button, root, false);
247         mPreviewButton.setVisibility(dreamBackend.isEnabled() ? View.VISIBLE : View.GONE);
248         root.addView(mPreviewButton);
249         mPreviewButton.setOnClickListener(v -> dreamBackend.preview(dreamBackend.getActiveDream()));
250 
251         mRecyclerView = super.onCreateRecyclerView(inflater, parent, bundle);
252         mRecyclerView.setFocusable(false);
253         updatePaddingForPreviewButton();
254         return mRecyclerView;
255     }
256 
updateComplicationsToggleVisibility()257     private void updateComplicationsToggleVisibility() {
258         if (mDreamPickerController == null) {
259             return;
260         }
261         final DreamBackend.DreamInfo activeDream = mDreamPickerController.getActiveDreamInfo();
262 
263         final DreamBackend dreamBackend = DreamBackend.getInstance(getContext());
264 
265 
266         if (mComplicationsTogglePreference != null) {
267             mComplicationsTogglePreference.setVisible(
268                     activeDream != null && activeDream.supportsComplications);
269         }
270 
271         if (mHomeControllerTogglePreference != null) {
272             boolean isEnabled = dreamBackend.isEnabled()
273                                 && (activeDream == null
274                                 || (activeDream.dreamCategory
275                                 & DreamService.DREAM_CATEGORY_HOME_PANEL) == 0)
276                                 && mDreamHomeControlsPreferenceController
277                                     .getAvailabilityStatus()
278                                     == mDreamHomeControlsPreferenceController.AVAILABLE;
279             mHomeControllerTogglePreference.setEnabled(isEnabled);
280         }
281     }
282 
updatePaddingForPreviewButton()283     private void updatePaddingForPreviewButton() {
284         mPreviewButton.post(() -> {
285             mRecyclerView.setPadding(0, 0, 0, mPreviewButton.getMeasuredHeight());
286         });
287     }
288 
289     @Override
onCheckedChanged(CompoundButton buttonView, boolean isChecked)290     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
291         setAllPreferencesEnabled(isChecked);
292         mPreviewButton.setVisibility(isChecked ? View.VISIBLE : View.GONE);
293         updatePaddingForPreviewButton();
294     }
295 
296     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
297             new SearchIndexProvider(R.xml.dream_fragment_overview);
298 
299     static class SearchIndexProvider extends BaseSearchIndexProvider {
SearchIndexProvider(int xmlRes)300         SearchIndexProvider(int xmlRes) {
301             super(xmlRes);
302         }
303 
304         @Override
isPageSearchEnabled(Context context)305         protected boolean isPageSearchEnabled(Context context) {
306             return Utils.areDreamsAvailableToCurrentUser(context);
307         }
308     }
309 }
310 
311