Fix DMD setting IUdfpsHbmListener before SysUI is ready

Bug: 190573336
Bug: 181682258
Test: atest DisplayModeDirectorTest
Test: Behaves correctly when delaying SysUI boot by 20 sec
Change-Id: Ib9ba4f5266acad37fd42f9505a8bf477d97023ff
This commit is contained in:
Ilya Matyukhin
2021-06-15 00:00:35 -07:00
parent 0edd421d42
commit eb37efb8ef
4 changed files with 35 additions and 2 deletions

View File

@@ -43,6 +43,7 @@ import android.hardware.face.FaceSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
import android.hardware.fingerprint.IUdfpsHbmListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -100,6 +101,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
@Nullable
private UdfpsController mUdfpsController;
@Nullable
private IUdfpsHbmListener mUdfpsHbmListener;
@Nullable
private SidefpsController mSidefpsController;
@VisibleForTesting
TaskStackListener mTaskStackListener;
@@ -470,6 +473,24 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks,
mActivityTaskManager.registerTaskStackListener(mTaskStackListener);
}
/**
* Stores the listener received from {@link com.android.server.display.DisplayModeDirector}.
*
* DisplayModeDirector implements {@link IUdfpsHbmListener} and registers it with this class by
* calling {@link CommandQueue#setUdfpsHbmListener(IUdfpsHbmListener)}.
*/
@Override
public void setUdfpsHbmListener(IUdfpsHbmListener listener) {
mUdfpsHbmListener = listener;
}
/**
* @return IUdfpsHbmListener that can be set by DisplayModeDirector.
*/
@Nullable public IUdfpsHbmListener getUdfpsHbmListener() {
return mUdfpsHbmListener;
}
@Override
public void showAuthenticationDialog(PromptInfo promptInfo, IBiometricSysuiReceiver receiver,
int[] sensorIds, boolean credentialAllowed, boolean requireConfirmation,

View File

@@ -512,6 +512,8 @@ public final class DisplayManagerService extends SystemService {
}
}
}
} else if (phase == PHASE_BOOT_COMPLETED) {
mDisplayModeDirector.onBootCompleted();
}
}

View File

@@ -155,7 +155,6 @@ public class DisplayModeDirector {
mSettingsObserver.observe();
mDisplayObserver.observe();
mBrightnessObserver.observe(sensorManager);
mUdfpsObserver.observe();
synchronized (mLock) {
// We may have a listener already registered before the call to start, so go ahead and
// notify them to pick up our newly initialized state.
@@ -163,6 +162,16 @@ public class DisplayModeDirector {
}
}
/**
* Same as {@link #start(SensorManager)}, but for observers that need to be delayed even more,
* for example until SystemUI is ready.
*/
public void onBootCompleted() {
// UDFPS observer registers a listener with SystemUI which might not be ready until the
// system is fully booted.
mUdfpsObserver.observe();
}
public void setLoggingEnabled(boolean loggingEnabled) {
if (mLoggingEnabled == loggingEnabled) {
return;

View File

@@ -854,7 +854,7 @@ public class DisplayModeDirectorTest {
createDirectorFromRefreshRateArray(new float[] {60.f, 90.f, 110.f}, 0);
verify(mStatusBarMock, never()).setUdfpsHbmListener(any());
director.start(createMockSensorManager());
director.onBootCompleted();
verify(mStatusBarMock).setUdfpsHbmListener(eq(director.getUdpfsObserver()));
}
@@ -863,6 +863,7 @@ public class DisplayModeDirectorTest {
DisplayModeDirector director =
createDirectorFromRefreshRateArray(new float[] {60.f, 90.f, 110.f}, 0);
director.start(createMockSensorManager());
director.onBootCompleted();
ArgumentCaptor<IUdfpsHbmListener> captor =
ArgumentCaptor.forClass(IUdfpsHbmListener.class);
verify(mStatusBarMock).setUdfpsHbmListener(captor.capture());