From 01f38dc5bce19ddea80eaf5b4118c60cb7b74686 Mon Sep 17 00:00:00 2001 From: Philip Junker Date: Mon, 10 Oct 2022 08:45:18 +0000 Subject: [PATCH] Initialize ContentObserver in startObserving(). This removes a race condition where ContentObserver is initialized while mHandler is null which causes the ContentObserver#onChange() callback to run on a different thread and can cause an NPE. Bug: 246843362 Test: manual Test: atest BrightnessSynchronizerTest Merged-In: Ib8e192c3961390ece721fa473d5c09323c30bafe Change-Id: Ia7443efb9e8020d46b251c7f7100adbf58072345 --- .../display/BrightnessSynchronizer.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/core/java/com/android/internal/display/BrightnessSynchronizer.java b/core/java/com/android/internal/display/BrightnessSynchronizer.java index 627631a376f7f..62c7966bb2d66 100644 --- a/core/java/com/android/internal/display/BrightnessSynchronizer.java +++ b/core/java/com/android/internal/display/BrightnessSynchronizer.java @@ -115,7 +115,7 @@ public class BrightnessSynchronizer { Slog.i(TAG, "Setting initial brightness to default value of: " + defaultBrightness); } - mBrightnessSyncObserver.startObserving(); + mBrightnessSyncObserver.startObserving(mHandler); mHandler.sendEmptyMessageAtTime(MSG_RUN_UPDATE, mClock.uptimeMillis()); } @@ -482,27 +482,29 @@ public class BrightnessSynchronizer { } }; - private final ContentObserver mContentObserver = new ContentObserver(mHandler) { - @Override - public void onChange(boolean selfChange, Uri uri) { - if (selfChange) { - return; + private ContentObserver createBrightnessContentObserver(Handler handler) { + return new ContentObserver(handler) { + @Override + public void onChange(boolean selfChange, Uri uri) { + if (selfChange) { + return; + } + if (BRIGHTNESS_URI.equals(uri)) { + handleBrightnessChangeInt(getScreenBrightnessInt()); + } } - if (BRIGHTNESS_URI.equals(uri)) { - handleBrightnessChangeInt(getScreenBrightnessInt()); - } - } - }; + }; + } boolean isObserving() { return mIsObserving; } - void startObserving() { + void startObserving(Handler handler) { final ContentResolver cr = mContext.getContentResolver(); - cr.registerContentObserver(BRIGHTNESS_URI, false, mContentObserver, - UserHandle.USER_ALL); - mDisplayManager.registerDisplayListener(mListener, mHandler, + cr.registerContentObserver(BRIGHTNESS_URI, false, + createBrightnessContentObserver(handler), UserHandle.USER_ALL); + mDisplayManager.registerDisplayListener(mListener, handler, DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS); mIsObserving = true; }