1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 package com.android.settings.display; 15 16 import static android.content.Intent.ACTION_SHOW_BRIGHTNESS_DIALOG; 17 18 import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX; 19 import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MIN; 20 import static com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat; 21 22 import android.app.ActivityOptions; 23 import android.content.ContentResolver; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.database.ContentObserver; 27 import android.hardware.display.BrightnessInfo; 28 import android.hardware.display.DisplayManager; 29 import android.hardware.display.DisplayManager.DisplayListener; 30 import android.net.Uri; 31 import android.os.Handler; 32 import android.os.Looper; 33 import android.provider.Settings.System; 34 import android.text.TextUtils; 35 36 import androidx.preference.Preference; 37 import androidx.preference.PreferenceScreen; 38 39 import com.android.settings.core.PreferenceControllerMixin; 40 import com.android.settings.core.SettingsBaseActivity; 41 import com.android.settingslib.core.AbstractPreferenceController; 42 import com.android.settingslib.core.lifecycle.Lifecycle; 43 import com.android.settingslib.core.lifecycle.LifecycleObserver; 44 import com.android.settingslib.core.lifecycle.events.OnStart; 45 import com.android.settingslib.core.lifecycle.events.OnStop; 46 import com.android.settingslib.transition.SettingsTransitionHelper; 47 48 import java.text.NumberFormat; 49 50 public class BrightnessLevelPreferenceController extends AbstractPreferenceController implements 51 PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop { 52 53 private static final String TAG = "BrightnessPrefCtrl"; 54 private static final String KEY_BRIGHTNESS = "brightness"; 55 private static final Uri BRIGHTNESS_ADJ_URI; 56 57 private final ContentResolver mContentResolver; 58 private final Handler mHandler = new Handler(Looper.getMainLooper()); 59 private final DisplayManager mDisplayManager; 60 61 private Preference mPreference; 62 63 static { 64 BRIGHTNESS_ADJ_URI = System.getUriFor(System.SCREEN_AUTO_BRIGHTNESS_ADJ); 65 } 66 67 private ContentObserver mBrightnessObserver = 68 new ContentObserver(mHandler) { 69 @Override 70 public void onChange(boolean selfChange) { 71 updatedSummary(mPreference); 72 } 73 }; 74 75 private final DisplayListener mDisplayListener = new DisplayListener() { 76 @Override 77 public void onDisplayAdded(int displayId) { 78 } 79 80 @Override 81 public void onDisplayRemoved(int displayId) { 82 } 83 84 @Override 85 public void onDisplayChanged(int displayId) { 86 updatedSummary(mPreference); 87 } 88 }; 89 90 BrightnessLevelPreferenceController(Context context, Lifecycle lifecycle)91 public BrightnessLevelPreferenceController(Context context, Lifecycle lifecycle) { 92 super(context); 93 mDisplayManager = context.getSystemService(DisplayManager.class); 94 95 if (lifecycle != null) { 96 lifecycle.addObserver(this); 97 } 98 mContentResolver = mContext.getContentResolver(); 99 } 100 101 @Override isAvailable()102 public boolean isAvailable() { 103 return true; 104 } 105 106 @Override getPreferenceKey()107 public String getPreferenceKey() { 108 return KEY_BRIGHTNESS; 109 } 110 111 @Override displayPreference(PreferenceScreen screen)112 public void displayPreference(PreferenceScreen screen) { 113 super.displayPreference(screen); 114 mPreference = screen.findPreference(KEY_BRIGHTNESS); 115 } 116 117 @Override updateState(Preference preference)118 public void updateState(Preference preference) { 119 updatedSummary(preference); 120 } 121 122 @Override onStart()123 public void onStart() { 124 mContentResolver.registerContentObserver(BRIGHTNESS_ADJ_URI, false, mBrightnessObserver); 125 mDisplayManager.registerDisplayListener(mDisplayListener, mHandler, 126 DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS); 127 updatedSummary(mPreference); 128 } 129 130 @Override onStop()131 public void onStop() { 132 mContentResolver.unregisterContentObserver(mBrightnessObserver); 133 mDisplayManager.unregisterDisplayListener(mDisplayListener); 134 } 135 136 @Override handlePreferenceTreeClick(Preference preference)137 public boolean handlePreferenceTreeClick(Preference preference) { 138 if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { 139 return false; 140 } 141 final Intent intent = new Intent(ACTION_SHOW_BRIGHTNESS_DIALOG); 142 intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, 143 SettingsTransitionHelper.TransitionType.TRANSITION_NONE); 144 145 // Start activity in the same task and pass fade animations 146 final ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 147 android.R.anim.fade_in, android.R.anim.fade_out); 148 mContext.startActivityForResult(preference.getKey(), intent, 0, options.toBundle()); 149 return true; 150 } 151 updatedSummary(Preference preference)152 private void updatedSummary(Preference preference) { 153 if (preference != null) { 154 preference.setSummary(NumberFormat.getPercentInstance().format(getCurrentBrightness())); 155 } 156 } 157 getCurrentBrightness()158 private double getCurrentBrightness() { 159 int value = 0; 160 final BrightnessInfo info = mContext.getDisplay().getBrightnessInfo(); 161 if (info != null) { 162 value = convertLinearToGammaFloat(info.brightness, info.brightnessMinimum, 163 info.brightnessMaximum); 164 } 165 return getPercentage(value, GAMMA_SPACE_MIN, GAMMA_SPACE_MAX); 166 } 167 getPercentage(double value, int min, int max)168 private double getPercentage(double value, int min, int max) { 169 if (value > max) { 170 return 1.0; 171 } 172 if (value < min) { 173 return 0.0; 174 } 175 return (value - min) / (max - min); 176 } 177 } 178