From 90e2f37790afb51f35619f5024976688b98aae5d Mon Sep 17 00:00:00 2001 From: Philip Junker Date: Wed, 5 Oct 2022 16:25:17 +0200 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 Change-Id: Ib8e192c3961390ece721fa473d5c09323c30bafe --- .../display/BrightnessSynchronizer.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/core/java/com/android/internal/display/BrightnessSynchronizer.java b/core/java/com/android/internal/display/BrightnessSynchronizer.java index 627631a376f7f..d503904c2e3ca 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,30 +482,31 @@ 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; } - } }