Fix launcher flicker when unlocking on seascape.

Test: manual

Fixes: 160544577

Launcher flickers if it is locked on portrait, then unlocked on seascape. DisplayController.Info was consistenly being updated late causing launcher to unlock in lanscape then switching to seascape with enough frames in-between for the user to notice. Updated DisplayController to properly update its rotation info and updated DeviceProfile to force an info update when checking if the device is in seascape orientation.

demo: https://drive.google.com/file/d/1JBCvK3brLwOSTC4k56GSxeYozl5x0k7X/view?usp=sharing
Change-Id: Idce139f0e16cb686684c0d3a460c4ec9e5ae466a
This commit is contained in:
Schneider Victor-tulias 2021-01-27 14:03:51 -08:00
parent 14faee73e7
commit 954bb63899
2 changed files with 22 additions and 7 deletions

View File

@ -607,8 +607,9 @@ public class DeviceProfile {
*/
public boolean updateIsSeascape(Context context) {
if (isVerticalBarLayout()) {
boolean isSeascape = DisplayController.getDefaultDisplay(context).getInfo().rotation
== Surface.ROTATION_270;
// Check an up-to-date info.
boolean isSeascape = DisplayController.getDefaultDisplay(context)
.createInfoForContext(context).rotation == Surface.ROTATION_270;
if (mIsSeascape != isSeascape) {
mIsSeascape = isSeascape;
return true;

View File

@ -31,6 +31,8 @@ import android.view.Display;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.Utilities;
import java.util.ArrayList;
/**
@ -179,23 +181,35 @@ public class DisplayController implements DisplayListener {
return mInfo;
}
/** Creates and up-to-date DisplayController.Info for the given context. */
public Info createInfoForContext(Context context) {
Display display = Utilities.ATLEAST_R
? context.getDisplay()
: context
.getSystemService(DisplayManager.class)
.getDisplay(mId);
return display == null
? new Info(context)
: new Info(context, display);
}
protected void handleOnChange() {
Info oldInfo = mInfo;
Info info = new Info(mDisplayContext);
Info newInfo = createInfoForContext(mDisplayContext);
int change = 0;
if (info.hasDifferentSize(oldInfo)) {
if (newInfo.hasDifferentSize(oldInfo)) {
change |= CHANGE_SIZE;
}
if (oldInfo.rotation != info.rotation) {
if (newInfo.rotation != oldInfo.rotation) {
change |= CHANGE_ROTATION;
}
if (info.singleFrameMs != oldInfo.singleFrameMs) {
if (newInfo.singleFrameMs != oldInfo.singleFrameMs) {
change |= CHANGE_FRAME_DELAY;
}
if (change != 0) {
mInfo = info;
mInfo = newInfo;
final int flags = change;
MAIN_EXECUTOR.execute(() -> notifyChange(flags));
}