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
This commit is contained in:
Philip Junker
2022-10-05 16:25:17 +02:00
parent 6bf944b758
commit 90e2f37790

View File

@@ -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;
}
}
}