1 /* 2 * Copyright (C) 2020 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 distributed under the 11 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 12 * KIND, either express or implied. See the License for the specific language governing 13 * permissions and limitations under the License. 14 */ 15 16 package com.android.settings.display.darkmode; 17 18 import android.app.Dialog; 19 import android.app.TimePickerDialog; 20 import android.app.UiModeManager; 21 import android.content.Context; 22 import android.text.TextUtils; 23 import androidx.preference.Preference; 24 import androidx.preference.PreferenceScreen; 25 import com.android.settings.core.BasePreferenceController; 26 import com.android.settings.dashboard.DashboardFragment; 27 28 import java.time.LocalTime; 29 import java.time.format.DateTimeFormatter; 30 31 import static android.app.UiModeManager.MODE_NIGHT_CUSTOM; 32 33 /** 34 * Controller for custom mode night mode time settings 35 */ 36 public class DarkModeCustomPreferenceController extends BasePreferenceController { 37 private static final String START_TIME_KEY = "dark_theme_start_time"; 38 private static final String END_TIME_KEY = "dark_theme_end_time"; 39 public static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a"); 40 private final UiModeManager mUiModeManager; 41 private TimeFormatter mFormat; 42 private DarkModeSettingsFragment mFragmet; 43 DarkModeCustomPreferenceController(Context context, String key)44 public DarkModeCustomPreferenceController(Context context, String key) { 45 super(context, key); 46 mFormat = new TimeFormatter(mContext); 47 mUiModeManager = context.getSystemService(UiModeManager.class); 48 } 49 DarkModeCustomPreferenceController( Context context, String key, DarkModeSettingsFragment fragment)50 public DarkModeCustomPreferenceController( 51 Context context, String key, 52 DarkModeSettingsFragment fragment) { 53 this(context, key); 54 mFragmet = fragment; 55 } 56 DarkModeCustomPreferenceController( Context context, String key, DarkModeSettingsFragment fragment, TimeFormatter format)57 public DarkModeCustomPreferenceController( 58 Context context, String key, 59 DarkModeSettingsFragment fragment, 60 TimeFormatter format) { 61 this(context, key, fragment); 62 mFormat = format; 63 } 64 65 @Override getAvailabilityStatus()66 public int getAvailabilityStatus() { 67 return AVAILABLE; 68 } 69 getDialog()70 public TimePickerDialog getDialog() { 71 final LocalTime initialTime; 72 if (TextUtils.equals(getPreferenceKey(), START_TIME_KEY)) { 73 initialTime = mUiModeManager.getCustomNightModeStart(); 74 } else { 75 initialTime = mUiModeManager.getCustomNightModeEnd(); 76 } 77 return new TimePickerDialog(mContext, (view, hourOfDay, minute) -> { 78 final LocalTime time = LocalTime.of(hourOfDay, minute); 79 if (TextUtils.equals(getPreferenceKey(), START_TIME_KEY)) { 80 mUiModeManager.setCustomNightModeStart(time); 81 } else { 82 mUiModeManager.setCustomNightModeEnd(time); 83 } 84 if (mFragmet != null) { 85 mFragmet.refresh(); 86 } 87 }, initialTime.getHour(), initialTime.getMinute(), mFormat.is24HourFormat()); 88 } 89 90 @Override refreshSummary(Preference preference)91 protected void refreshSummary(Preference preference) { 92 if (mUiModeManager.getNightMode() != MODE_NIGHT_CUSTOM) { 93 preference.setVisible(false); 94 return; 95 } 96 preference.setVisible(true); 97 final LocalTime time; 98 if (TextUtils.equals(getPreferenceKey(), START_TIME_KEY)) { 99 time = mUiModeManager.getCustomNightModeStart(); 100 } else { 101 time = mUiModeManager.getCustomNightModeEnd(); 102 } 103 preference.setSummary(mFormat.of(time)); 104 } 105 } 106