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); Slog.i(TAG, "Setting initial brightness to default value of: " + defaultBrightness);
} }
mBrightnessSyncObserver.startObserving(); mBrightnessSyncObserver.startObserving(mHandler);
mHandler.sendEmptyMessageAtTime(MSG_RUN_UPDATE, mClock.uptimeMillis()); mHandler.sendEmptyMessageAtTime(MSG_RUN_UPDATE, mClock.uptimeMillis());
} }
@@ -482,7 +482,8 @@ public class BrightnessSynchronizer {
} }
}; };
private final ContentObserver mContentObserver = new ContentObserver(mHandler) { private ContentObserver createBrightnessContentObserver(Handler handler) {
return new ContentObserver(handler) {
@Override @Override
public void onChange(boolean selfChange, Uri uri) { public void onChange(boolean selfChange, Uri uri) {
if (selfChange) { if (selfChange) {
@@ -493,19 +494,19 @@ public class BrightnessSynchronizer {
} }
} }
}; };
}
boolean isObserving() { boolean isObserving() {
return mIsObserving; return mIsObserving;
} }
void startObserving() { void startObserving(Handler handler) {
final ContentResolver cr = mContext.getContentResolver(); final ContentResolver cr = mContext.getContentResolver();
cr.registerContentObserver(BRIGHTNESS_URI, false, mContentObserver, cr.registerContentObserver(BRIGHTNESS_URI, false,
UserHandle.USER_ALL); createBrightnessContentObserver(handler), UserHandle.USER_ALL);
mDisplayManager.registerDisplayListener(mListener, mHandler, mDisplayManager.registerDisplayListener(mListener, handler,
DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS); DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS);
mIsObserving = true; mIsObserving = true;
} }
} }
} }