@@ -80,6 +80,7 @@ public DisplayPowerState(DisplayBlanker blanker, Light backlight, ColorFade elec
8080 mBacklight = backlight ;
8181 mColorFade = electronBeam ;
8282 mPhotonicModulator = new PhotonicModulator ();
83+ mPhotonicModulator .start ();
8384
8485 // At boot time, we know that the screen is on and the electron beam
8586 // animation is not playing. We don't know the screen's brightness though,
@@ -336,7 +337,7 @@ public void run() {
336337 /**
337338 * Updates the state of the screen and backlight asynchronously on a separate thread.
338339 */
339- private final class PhotonicModulator {
340+ private final class PhotonicModulator extends Thread {
340341 private static final int INITIAL_SCREEN_STATE = Display .STATE_OFF ; // unknown, assume off
341342 private static final int INITIAL_BACKLIGHT = -1 ; // unknown
342343
@@ -361,83 +362,86 @@ public boolean setState(int state, int backlight) {
361362
362363 if (!mChangeInProgress ) {
363364 mChangeInProgress = true ;
364- AsyncTask . THREAD_POOL_EXECUTOR . execute ( mTask );
365+ mLock . notifyAll ( );
365366 }
366367 }
367368 return !mChangeInProgress ;
368369 }
369370 }
370371
371372 public void dump (PrintWriter pw ) {
372- pw .println ();
373- pw .println ("Photonic Modulator State:" );
374- pw .println (" mPendingState=" + Display .stateToString (mPendingState ));
375- pw .println (" mPendingBacklight=" + mPendingBacklight );
376- pw .println (" mActualState=" + Display .stateToString (mActualState ));
377- pw .println (" mActualBacklight=" + mActualBacklight );
378- pw .println (" mChangeInProgress=" + mChangeInProgress );
373+ synchronized (mLock ) {
374+ pw .println ();
375+ pw .println ("Photonic Modulator State:" );
376+ pw .println (" mPendingState=" + Display .stateToString (mPendingState ));
377+ pw .println (" mPendingBacklight=" + mPendingBacklight );
378+ pw .println (" mActualState=" + Display .stateToString (mActualState ));
379+ pw .println (" mActualBacklight=" + mActualBacklight );
380+ pw .println (" mChangeInProgress=" + mChangeInProgress );
381+ }
379382 }
380383
381- private final Runnable mTask = new Runnable () {
382- @ Override
383- public void run () {
384- // Apply pending changes until done.
385- for (;;) {
386- final int state ;
387- final boolean stateChanged ;
388- final int backlight ;
389- final boolean backlightChanged ;
390- synchronized (mLock ) {
391- state = mPendingState ;
392- stateChanged = (state != mActualState );
393- backlight = mPendingBacklight ;
394- backlightChanged = (backlight != mActualBacklight );
395- if (!stateChanged && !backlightChanged ) {
396- mChangeInProgress = false ;
397- break ;
398- }
399- mActualState = state ;
400- mActualBacklight = backlight ;
401- }
402-
403- if (DEBUG ) {
404- Slog .d (TAG , "Updating screen state: state="
405- + Display .stateToString (state ) + ", backlight=" + backlight );
406- }
407- boolean suspending = Display .isSuspendedState (state );
408- if (stateChanged && !suspending ) {
409- requestDisplayState (state );
410- }
411- if (backlightChanged ) {
412- setBrightness (backlight );
413- }
414- if (stateChanged && suspending ) {
415- requestDisplayState (state );
384+ @ Override
385+ public void run () {
386+ for (;;) {
387+ // Get pending change.
388+ final int state ;
389+ final boolean stateChanged ;
390+ final int backlight ;
391+ final boolean backlightChanged ;
392+ synchronized (mLock ) {
393+ state = mPendingState ;
394+ stateChanged = (state != mActualState );
395+ backlight = mPendingBacklight ;
396+ backlightChanged = (backlight != mActualBacklight );
397+ if (!stateChanged && !backlightChanged ) {
398+ // All changed applied, notify outer class and wait for more.
399+ mChangeInProgress = false ;
400+ postScreenUpdateThreadSafe ();
401+ try {
402+ mLock .wait ();
403+ } catch (InterruptedException ex ) { }
404+ continue ;
416405 }
406+ mActualState = state ;
407+ mActualBacklight = backlight ;
417408 }
418409
419- // Let the outer class know that all changes have been applied.
420- postScreenUpdateThreadSafe ();
410+ // Apply pending change.
411+ if (DEBUG ) {
412+ Slog .d (TAG , "Updating screen state: state="
413+ + Display .stateToString (state ) + ", backlight=" + backlight );
414+ }
415+ boolean suspending = Display .isSuspendedState (state );
416+ if (stateChanged && !suspending ) {
417+ requestDisplayState (state );
418+ }
419+ if (backlightChanged ) {
420+ setBrightness (backlight );
421+ }
422+ if (stateChanged && suspending ) {
423+ requestDisplayState (state );
424+ }
421425 }
426+ }
422427
423- private void requestDisplayState (int state ) {
424- Trace .traceBegin (Trace .TRACE_TAG_POWER , "requestDisplayState("
425- + Display .stateToString (state ) + ")" );
426- try {
427- mBlanker .requestDisplayState (state );
428- } finally {
429- Trace .traceEnd (Trace .TRACE_TAG_POWER );
430- }
428+ private void requestDisplayState (int state ) {
429+ Trace .traceBegin (Trace .TRACE_TAG_POWER , "requestDisplayState("
430+ + Display .stateToString (state ) + ")" );
431+ try {
432+ mBlanker .requestDisplayState (state );
433+ } finally {
434+ Trace .traceEnd (Trace .TRACE_TAG_POWER );
431435 }
436+ }
432437
433- private void setBrightness (int backlight ) {
434- Trace .traceBegin (Trace .TRACE_TAG_POWER , "setBrightness(" + backlight + ")" );
435- try {
436- mBacklight .setBrightness (backlight );
437- } finally {
438- Trace .traceEnd (Trace .TRACE_TAG_POWER );
439- }
438+ private void setBrightness (int backlight ) {
439+ Trace .traceBegin (Trace .TRACE_TAG_POWER , "setBrightness(" + backlight + ")" );
440+ try {
441+ mBacklight .setBrightness (backlight );
442+ } finally {
443+ Trace .traceEnd (Trace .TRACE_TAG_POWER );
440444 }
441- };
445+ }
442446 }
443447}
0 commit comments