关于Android8.1的亮度调节的实现:
点击了BrightnessPreference以后会发送广播,对应的SettingsUI类接收广播并创建BrightnessDialog,这是一个关于调节亮度的对话框
BrightnessDialog
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Window window = getWindow();
window.setGravity(Gravity.TOP);
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
window.requestFeature(Window.FEATURE_NO_TITLE);
// Use a dialog theme as the activity theme, but inflate the content as
// the QS content.
ContextThemeWrapper themedContext = new ContextThemeWrapper(this,
com.android.internal.R.style.Theme_DeviceDefault_QuickSettings);
View v = LayoutInflater.from(themedContext).inflate(
R.layout.quick_settings_brightness_dialog, null);
setContentView(v);
final ImageView icon = findViewById(R.id.brightness_icon);
final ToggleSliderView slider = findViewById(R.id.brightness_slider);
//创建了BrightnessController
mBrightnessController = new BrightnessController(this, icon, slider);
}
@Override
protected void onStart() {
super.onStart();
//调用registerCallbacks()
mBrightnessController.registerCallbacks();
MetricsLogger.visible(this, MetricsEvent.BRIGHTNESS_DIALOG);
}
上述BrightnessDialog里面创建并且调用了BrightnessController的registerCallbacks()方法,通过这种方式设置了对进度条改变的监听
BrightnessController
public BrightnessController(Context context, ImageView icon, ToggleSlider control) {
mContext = context;
mIcon = icon;
mControl = control;
mControl.setMax(GAMMA_SPACE_MAX);
mBackgroundHandler = new Handler((Looper) Dependency.get(Dependency.BG_LOOPER));
//创建了CurrentUserTracker,是一个广播处理器,这里面接收到Intent.ACTION_USER_SWITCHED动作的时候,会触发onUserSwitched()
mUserTracker = new CurrentUserTracker(mContext) {
@Override
public void onUserSwitched(int newUserId) {
mBackgroundHandler.post(mUpdateModeRunnable);
mBackgroundHandler.post(mUpdateSliderRunnable);
}
};
//创建了观察者
mBrightnessObserver = new BrightnessObserver(mHandler);
PowerManager pm = context.getSystemService(PowerManager.class);
mMinimumBacklight = pm.getMinimumScreenBrightnessSetting();
mMaximumBacklight = pm.getMaximumScreenBrightnessSetting();
mDefaultBacklight = pm.getDefaultScreenBrightnessSetting();
mMinimumBacklightForVr = pm.getMinimumScreenBrightnessForVrSetting();
mMaximumBacklightForVr = pm.getMaximumScreenBrightnessForVrSetting();
mDefaultBacklightForVr = pm.getDefaultScreenBrightnessForVrSetting();
mAutomaticAvailable = context.getResources().getBoolean(
com.android.internal.R.bool.config_automatic_brightness_available);
mDisplayManager = context.getSystemService(DisplayManager.class);
mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
Context.VR_SERVICE));
}
被BrightnessDialog调用的registerCallbacks
public void registerCallbacks() {
if (mListening) {
return;
}
if (mVrManager != null) {
try {
mVrManager.registerListener(mVrStateCallbacks);
mIsVrModeEnabled = mVrManager.getVrModeState();
} catch (RemoteException e) {
Log.e(TAG, "Failed to register VR mode state listener: ", e);
}
}
mBackgroundHandler.post