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