1 /*
2  * Copyright (C) 2023 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.server.display.brightness.clamper;
18 
19 import android.annotation.NonNull;
20 import android.content.ContentResolver;
21 import android.content.Context;
22 import android.database.ContentObserver;
23 import android.os.Handler;
24 import android.os.UserHandle;
25 import android.provider.Settings;
26 
27 import com.android.internal.annotations.VisibleForTesting;
28 
29 public class BrightnessWearBedtimeModeClamper extends
30         BrightnessClamper<BrightnessWearBedtimeModeClamper.WearBedtimeModeData> {
31 
32     public static final int BEDTIME_MODE_OFF = 0;
33     public static final int BEDTIME_MODE_ON = 1;
34 
35     private final Context mContext;
36 
37     private final ContentObserver mSettingsObserver;
38 
BrightnessWearBedtimeModeClamper(Handler handler, Context context, BrightnessClamperController.ClamperChangeListener listener, WearBedtimeModeData data)39     BrightnessWearBedtimeModeClamper(Handler handler, Context context,
40             BrightnessClamperController.ClamperChangeListener listener, WearBedtimeModeData data) {
41         this(new Injector(), handler, context, listener, data);
42     }
43 
44     @VisibleForTesting
BrightnessWearBedtimeModeClamper(Injector injector, Handler handler, Context context, BrightnessClamperController.ClamperChangeListener listener, WearBedtimeModeData data)45     BrightnessWearBedtimeModeClamper(Injector injector, Handler handler, Context context,
46             BrightnessClamperController.ClamperChangeListener listener, WearBedtimeModeData data) {
47         super(handler, listener);
48         mContext = context;
49         mBrightnessCap = data.getBrightnessWearBedtimeModeCap();
50         mSettingsObserver = new ContentObserver(mHandler) {
51             @Override
52             public void onChange(boolean selfChange) {
53                 final int bedtimeModeSetting = Settings.Global.getInt(
54                         mContext.getContentResolver(),
55                         Settings.Global.Wearable.BEDTIME_MODE,
56                         BEDTIME_MODE_OFF);
57                 mIsActive = bedtimeModeSetting == BEDTIME_MODE_ON;
58                 mChangeListener.onChanged();
59             }
60         };
61         injector.registerBedtimeModeObserver(context.getContentResolver(), mSettingsObserver);
62     }
63 
64     @NonNull
65     @Override
getType()66     Type getType() {
67         return Type.WEAR_BEDTIME_MODE;
68     }
69 
70     @Override
onDeviceConfigChanged()71     void onDeviceConfigChanged() {}
72 
73     @Override
onDisplayChanged(WearBedtimeModeData displayData)74     void onDisplayChanged(WearBedtimeModeData displayData) {
75         mHandler.post(() -> {
76             mBrightnessCap = displayData.getBrightnessWearBedtimeModeCap();
77             mChangeListener.onChanged();
78         });
79     }
80 
81     @Override
stop()82     void stop() {
83         mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
84     }
85 
86     interface WearBedtimeModeData {
getBrightnessWearBedtimeModeCap()87         float getBrightnessWearBedtimeModeCap();
88     }
89 
90     @VisibleForTesting
91     static class Injector {
registerBedtimeModeObserver(@onNull ContentResolver cr, @NonNull ContentObserver observer)92         void registerBedtimeModeObserver(@NonNull ContentResolver cr,
93                 @NonNull ContentObserver observer) {
94             cr.registerContentObserver(
95                     Settings.Global.getUriFor(Settings.Global.Wearable.BEDTIME_MODE),
96                     /* notifyForDescendants= */ false, observer, UserHandle.USER_ALL);
97         }
98     }
99 }
100