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