1 /*
2  * Copyright (C) 2019 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.UiModeManager;
19 import android.content.Context;
20 import android.content.res.Configuration;
21 import android.os.PowerManager;
22 import android.widget.Switch;
23 
24 import androidx.preference.Preference;
25 import androidx.preference.PreferenceScreen;
26 
27 import com.android.settings.R;
28 import com.android.settings.core.BasePreferenceController;
29 import com.android.settings.overlay.FeatureFactory;
30 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
31 import com.android.settingslib.widget.MainSwitchPreference;
32 import com.android.settingslib.widget.OnMainSwitchChangeListener;
33 
34 import java.time.LocalTime;
35 
36 /**
37  * Controller for activate/deactivate night mode button
38  */
39 public class DarkModeActivationPreferenceController extends BasePreferenceController implements
40         OnMainSwitchChangeListener {
41 
42     private final UiModeManager mUiModeManager;
43     private final MetricsFeatureProvider mMetricsFeatureProvider;
44     private PowerManager mPowerManager;
45     private TimeFormatter mFormat;
46     private MainSwitchPreference mPreference;
47 
DarkModeActivationPreferenceController(Context context, String preferenceKey)48     public DarkModeActivationPreferenceController(Context context, String preferenceKey) {
49         super(context, preferenceKey);
50         mPowerManager = context.getSystemService(PowerManager.class);
51         mUiModeManager = context.getSystemService(UiModeManager.class);
52         mFormat = new TimeFormatter(context);
53         mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
54     }
55 
DarkModeActivationPreferenceController(Context context, String preferenceKey, TimeFormatter f)56     public DarkModeActivationPreferenceController(Context context, String preferenceKey,
57             TimeFormatter f) {
58         this(context, preferenceKey);
59         mFormat = f;
60     }
61 
62     @Override
updateState(Preference preference)63     public final void updateState(Preference preference) {
64         final boolean active = (mContext.getResources().getConfiguration().uiMode
65                 & Configuration.UI_MODE_NIGHT_YES) != 0;
66         mPreference.updateStatus(active);
67     }
68 
69     @Override
getSummary()70     public CharSequence getSummary() {
71         final boolean isActivated = (mContext.getResources().getConfiguration().uiMode
72                 & Configuration.UI_MODE_NIGHT_YES) != 0;
73         final int mode = mUiModeManager.getNightMode();
74         if (mode == UiModeManager.MODE_NIGHT_AUTO) {
75             return mContext.getString(isActivated
76                     ? R.string.dark_ui_summary_on_auto_mode_auto
77                     : R.string.dark_ui_summary_off_auto_mode_auto);
78         } else if (mode == UiModeManager.MODE_NIGHT_CUSTOM) {
79             final LocalTime time = isActivated
80                     ? mUiModeManager.getCustomNightModeEnd()
81                     : mUiModeManager.getCustomNightModeStart();
82             final String timeStr = mFormat.of(time);
83 
84             return mContext.getString(isActivated
85                     ? R.string.dark_ui_summary_on_auto_mode_custom
86                     : R.string.dark_ui_summary_off_auto_mode_custom, timeStr);
87         } else {
88             return mContext.getString(isActivated
89                     ? R.string.dark_ui_summary_on_auto_mode_never
90                     : R.string.dark_ui_summary_off_auto_mode_never);
91         }
92     }
93 
94     @Override
onSwitchChanged(Switch switchView, boolean isChecked)95     public void onSwitchChanged(Switch switchView, boolean isChecked) {
96         mMetricsFeatureProvider.logClickedPreference(mPreference, getMetricsCategory());
97         final boolean active = (mContext.getResources().getConfiguration().uiMode
98                 & Configuration.UI_MODE_NIGHT_YES) != 0;
99         mUiModeManager.setNightModeActivated(!active);
100     }
101 
102     @Override
displayPreference(PreferenceScreen screen)103     public void displayPreference(PreferenceScreen screen) {
104         super.displayPreference(screen);
105         mPreference = (MainSwitchPreference) screen.findPreference(getPreferenceKey());
106         mPreference.addOnSwitchChangeListener(this);
107     }
108 
109     @Override
getAvailabilityStatus()110     public int getAvailabilityStatus() {
111         return AVAILABLE_UNSEARCHABLE;
112     }
113 }
114