2 * Copyright (C) 2017 The Android Open Source Project
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
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
14 package com.android.settings.display;
16 import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
17 import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
19 import android.content.ContentResolver;
20 import android.content.Context;
21 import android.database.ContentObserver;
22 import android.net.Uri;
23 import android.os.Handler;
24 import android.os.Looper;
25 import android.os.PowerManager;
26 import android.os.RemoteException;
27 import android.os.ServiceManager;
28 import android.provider.Settings;
29 import android.provider.Settings.System;
30 import android.service.vr.IVrManager;
31 import android.support.annotation.VisibleForTesting;
32 import android.support.v7.preference.Preference;
33 import android.support.v7.preference.PreferenceScreen;
34 import android.util.Log;
36 import com.android.settings.core.PreferenceControllerMixin;
37 import com.android.settingslib.core.AbstractPreferenceController;
38 import com.android.settingslib.core.lifecycle.Lifecycle;
39 import com.android.settingslib.core.lifecycle.LifecycleObserver;
40 import com.android.settingslib.core.lifecycle.events.OnStart;
41 import com.android.settingslib.core.lifecycle.events.OnStop;
43 import java.text.NumberFormat;
45 public class BrightnessLevelPreferenceController extends AbstractPreferenceController implements
46 PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop {
48 private static final String TAG = "BrightnessPrefCtrl";
49 private static final String KEY_BRIGHTNESS = "brightness";
50 private static final Uri BRIGHTNESS_URI;
51 private static final Uri BRIGHTNESS_FOR_VR_URI;
52 private static final Uri BRIGHTNESS_ADJ_URI;
54 private final int mMinBrightness;
55 private final int mMaxBrightness;
56 private final int mMinVrBrightness;
57 private final int mMaxVrBrightness;
58 private final ContentResolver mContentResolver;
60 private Preference mPreference;
63 BRIGHTNESS_URI = System.getUriFor(System.SCREEN_BRIGHTNESS);
64 BRIGHTNESS_FOR_VR_URI = System.getUriFor(System.SCREEN_BRIGHTNESS_FOR_VR);
65 BRIGHTNESS_ADJ_URI = System.getUriFor(System.SCREEN_AUTO_BRIGHTNESS_ADJ);
68 private ContentObserver mBrightnessObserver =
69 new ContentObserver(new Handler(Looper.getMainLooper())) {
71 public void onChange(boolean selfChange) {
72 updatedSummary(mPreference);
76 public BrightnessLevelPreferenceController(Context context, Lifecycle lifecycle) {
78 if (lifecycle != null) {
79 lifecycle.addObserver(this);
81 PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
82 mMinBrightness = powerManager.getMinimumScreenBrightnessSetting();
83 mMaxBrightness = powerManager.getMaximumScreenBrightnessSetting();
84 mMinVrBrightness = powerManager.getMinimumScreenBrightnessForVrSetting();
85 mMaxVrBrightness = powerManager.getMaximumScreenBrightnessForVrSetting();
86 mContentResolver = mContext.getContentResolver();
90 public boolean isAvailable() {
95 public String getPreferenceKey() {
96 return KEY_BRIGHTNESS;
100 public void displayPreference(PreferenceScreen screen) {
101 super.displayPreference(screen);
102 mPreference = screen.findPreference(KEY_BRIGHTNESS);
106 public void updateState(Preference preference) {
107 updatedSummary(preference);
111 public void onStart() {
112 mContentResolver.registerContentObserver(BRIGHTNESS_URI, false, mBrightnessObserver);
113 mContentResolver.registerContentObserver(BRIGHTNESS_FOR_VR_URI, false, mBrightnessObserver);
114 mContentResolver.registerContentObserver(BRIGHTNESS_ADJ_URI, false, mBrightnessObserver);
118 public void onStop() {
119 mContentResolver.unregisterContentObserver(mBrightnessObserver);
122 private void updatedSummary(Preference preference) {
123 if (preference != null) {
124 preference.setSummary(NumberFormat.getPercentInstance().format(getCurrentBrightness()));
128 private double getCurrentBrightness() {
131 value = convertLinearToGamma(System.getInt(mContentResolver,
132 System.SCREEN_BRIGHTNESS_FOR_VR, mMaxBrightness),
133 mMinVrBrightness, mMaxVrBrightness);
135 value = convertLinearToGamma(Settings.System.getInt(mContentResolver,
136 System.SCREEN_BRIGHTNESS, mMinBrightness),
137 mMinBrightness, mMaxBrightness);
140 return getPercentage(value, 0, GAMMA_SPACE_MAX);
143 private double getPercentage(double value, int min, int max) {
150 return (value - min) / (max - min);
154 IVrManager safeGetVrManager() {
155 return IVrManager.Stub.asInterface(ServiceManager.getService(
156 Context.VR_SERVICE));
160 boolean isInVrMode() {
161 IVrManager vrManager = safeGetVrManager();
162 if (vrManager != null) {
164 return vrManager.getVrModeState();
165 } catch (RemoteException e) {
166 Log.e(TAG, "Failed to check vr mode!", e);