diff --git a/src/com/android/launcher3/util/DefaultDisplay.java b/src/com/android/launcher3/util/DefaultDisplay.java index 150fb5b043..35788a54c8 100644 --- a/src/com/android/launcher3/util/DefaultDisplay.java +++ b/src/com/android/launcher3/util/DefaultDisplay.java @@ -49,20 +49,25 @@ public class DefaultDisplay implements DisplayListener { public static final int CHANGE_ALL = CHANGE_SIZE | CHANGE_ROTATION | CHANGE_FRAME_DELAY; - private final Context mContext; + private final Context mDisplayContext; private final int mId; private final ArrayList mListeners = new ArrayList<>(); private final Handler mChangeHandler; private Info mInfo; private DefaultDisplay(Context context) { - mContext = context; - mInfo = new Info(context); + DisplayManager dm = context.getSystemService(DisplayManager.class); + // Use application context to create display context so that it can have its own Resources. + mDisplayContext = context.getApplicationContext().createDisplayContext( + dm.getDisplay(DEFAULT_DISPLAY)); + // Note that the Display object must be obtained from DisplayManager which is associated to + // the display context, so the Display is isolated from Activity and Application to provide + // the actual state of device that excludes the additional adjustment and override. + mInfo = new Info(mDisplayContext); mId = mInfo.id; mChangeHandler = new Handler(this::onChange); - context.getSystemService(DisplayManager.class) - .registerDisplayListener(this, UI_HELPER_EXECUTOR.getHandler()); + dm.registerDisplayListener(this, UI_HELPER_EXECUTOR.getHandler()); } @Override @@ -78,7 +83,7 @@ public class DefaultDisplay implements DisplayListener { } Info oldInfo = mInfo; - Info info = new Info(mContext); + Info info = new Info(mDisplayContext); int change = 0; if (info.hasDifferentSize(oldInfo)) { @@ -162,8 +167,7 @@ public class DefaultDisplay implements DisplayListener { display.getRealSize(realSize); display.getCurrentSizeRange(smallestSize, largestSize); - Context defaultDisplayContext = context.createDisplayContext(display); - metrics = defaultDisplayContext.getResources().getDisplayMetrics(); + metrics = context.getResources().getDisplayMetrics(); } private boolean hasDifferentSize(Info info) {