Pass WindowContext to DisplayInfoChangeListener
- WindowContext (or updated DisplayContext for Pre-S) contains updated Resources to be used for the listener
Fixes: 181215299
Fixes: 176656141
Test: Swap between large/small screen, large sreen UI is seen
Test: Swap between font size, launcher icon text is updated
Test: Start secondary home
Test: Repeat the above tests with Utilities.ATLEAST_S hardcoded to false
Change-Id: Ib33025ac0276c84fe2b3213e9946721e5988e3da
diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java
index cc9f594..4c5f9f2 100644
--- a/src/com/android/launcher3/BaseDraggingActivity.java
+++ b/src/com/android/launcher3/BaseDraggingActivity.java
@@ -21,6 +21,7 @@
import android.app.ActivityOptions;
import android.content.ActivityNotFoundException;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.content.res.Configuration;
@@ -296,7 +297,7 @@
}
@Override
- public void onDisplayInfoChanged(Info info, int flags) {
+ public void onDisplayInfoChanged(Context context, Info info, int flags) {
if ((flags & CHANGE_ROTATION) != 0 && mDeviceProfile.updateIsSeascape(this)) {
reapplyUi();
}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 11dc0c4..1332e14 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -203,9 +203,9 @@
.apply();
DisplayController.INSTANCE.get(context).addChangeListener(
- (info, flags) -> {
+ (displayContext, info, flags) -> {
if ((flags & (CHANGE_SIZE | CHANGE_DENSITY)) != 0) {
- onConfigChanged(context);
+ onConfigChanged(displayContext);
}
});
mOverlayMonitor = new OverlayMonitor(context);
@@ -226,7 +226,7 @@
*/
public InvariantDeviceProfile(Context context, Display display) {
// Ensure that the main device profile is initialized
- InvariantDeviceProfile originalProfile = INSTANCE.get(context);
+ INSTANCE.get(context);
String gridName = getCurrentGridName(context);
// Get the display info based on default display and interpolate it to existing display
diff --git a/src/com/android/launcher3/util/DisplayController.java b/src/com/android/launcher3/util/DisplayController.java
index 07c89b9..75c089e 100644
--- a/src/com/android/launcher3/util/DisplayController.java
+++ b/src/com/android/launcher3/util/DisplayController.java
@@ -87,7 +87,7 @@
new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
}
- mInfo = createInfo(display);
+ mInfo = new Info(getContext(display), display);
mDM.registerDisplayListener(this, UI_HELPER_EXECUTOR.getHandler());
}
@@ -125,7 +125,13 @@
*/
public interface DisplayInfoChangeListener {
- void onDisplayInfoChanged(Info info, int flags);
+ /**
+ * Invoked when display info has changed.
+ * @param context updated context associated with the display.
+ * @param info updated display information.
+ * @param flags bitmask indicating type of change.
+ */
+ void onDisplayInfoChanged(Context context, Info info, int flags);
}
/**
@@ -172,14 +178,15 @@
return mInfo;
}
- private Info createInfo(Display display) {
- return new Info(mContext.createDisplayContext(display), display);
+ private Context getContext(Display display) {
+ return Utilities.ATLEAST_S ? mWindowContext : mContext.createDisplayContext(display);
}
@AnyThread
private void handleInfoChange(Display display) {
Info oldInfo = mInfo;
- Info newInfo = createInfo(display);
+ Context context = getContext(display);
+ Info newInfo = new Info(context, display);
int change = 0;
if (newInfo.hasDifferentSize(oldInfo)) {
change |= CHANGE_SIZE;
@@ -197,13 +204,13 @@
if (change != 0) {
mInfo = newInfo;
final int flags = change;
- MAIN_EXECUTOR.execute(() -> notifyChange(flags));
+ MAIN_EXECUTOR.execute(() -> notifyChange(context, flags));
}
}
- private void notifyChange(int flags) {
+ private void notifyChange(Context context, int flags) {
for (int i = mListeners.size() - 1; i >= 0; i--) {
- mListeners.get(i).onDisplayInfoChanged(mInfo, flags);
+ mListeners.get(i).onDisplayInfoChanged(context, mInfo, flags);
}
}