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