Use context-specific configuration signal when updating drag layout
- The configuration coming through this window context is not in sync
with the app configuration change (what SysUI uses), so we should
listen for this context callback instead to make sure we read the
resource at the right time
Bug: 270446029
Test: atest WMShellUnitTests
Test: Repeatedly toggle dark mode and verify drag outlines update to
dark/light colors
Change-Id: I2aa8abfd6d3607d0b54a37414db87522688d0dd5
This commit is contained in:
@@ -36,6 +36,7 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_U
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||
|
||||
import android.content.ClipDescription;
|
||||
import android.content.ComponentCallbacks2;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.PixelFormat;
|
||||
@@ -58,9 +59,9 @@ import com.android.launcher3.icons.IconProvider;
|
||||
import com.android.wm.shell.R;
|
||||
import com.android.wm.shell.common.DisplayController;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.common.annotations.ExternalMainThread;
|
||||
import com.android.wm.shell.protolog.ShellProtoLogGroup;
|
||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||
import com.android.wm.shell.sysui.ConfigurationChangeListener;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
@@ -70,7 +71,7 @@ import java.util.ArrayList;
|
||||
* Handles the global drag and drop handling for the Shell.
|
||||
*/
|
||||
public class DragAndDropController implements DisplayController.OnDisplaysChangedListener,
|
||||
View.OnDragListener, ConfigurationChangeListener {
|
||||
View.OnDragListener, ComponentCallbacks2 {
|
||||
|
||||
private static final String TAG = DragAndDropController.class.getSimpleName();
|
||||
|
||||
@@ -119,7 +120,6 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange
|
||||
mMainExecutor.executeDelayed(() -> {
|
||||
mDisplayController.addDisplayWindowListener(this);
|
||||
}, 0);
|
||||
mShellController.addConfigurationChangeListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,6 +180,7 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange
|
||||
try {
|
||||
wm.addView(rootView, layoutParams);
|
||||
addDisplayDropTarget(displayId, context, wm, rootView, dragLayout);
|
||||
context.registerComponentCallbacks(this);
|
||||
} catch (WindowManager.InvalidDisplayException e) {
|
||||
Slog.w(TAG, "Unable to add view for display id: " + displayId);
|
||||
}
|
||||
@@ -209,6 +210,7 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange
|
||||
if (pd == null) {
|
||||
return;
|
||||
}
|
||||
pd.context.unregisterComponentCallbacks(this);
|
||||
pd.wm.removeViewImmediate(pd.rootView);
|
||||
mDisplayDropTargets.remove(displayId);
|
||||
}
|
||||
@@ -328,18 +330,29 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange
|
||||
return mimeTypes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onThemeChanged() {
|
||||
for (int i = 0; i < mDisplayDropTargets.size(); i++) {
|
||||
mDisplayDropTargets.get(i).dragLayout.onThemeChange();
|
||||
}
|
||||
}
|
||||
|
||||
// Note: Component callbacks are always called on the main thread of the process
|
||||
@ExternalMainThread
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
for (int i = 0; i < mDisplayDropTargets.size(); i++) {
|
||||
mDisplayDropTargets.get(i).dragLayout.onConfigChanged(newConfig);
|
||||
}
|
||||
mMainExecutor.execute(() -> {
|
||||
for (int i = 0; i < mDisplayDropTargets.size(); i++) {
|
||||
mDisplayDropTargets.get(i).dragLayout.onConfigChanged(newConfig);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Note: Component callbacks are always called on the main thread of the process
|
||||
@ExternalMainThread
|
||||
@Override
|
||||
public void onTrimMemory(int level) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
// Note: Component callbacks are always called on the main thread of the process
|
||||
@ExternalMainThread
|
||||
@Override
|
||||
public void onLowMemory() {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
private static class PerDisplay {
|
||||
|
||||
@@ -18,6 +18,8 @@ package com.android.wm.shell.draganddrop;
|
||||
|
||||
import static android.app.StatusBarManager.DISABLE_NONE;
|
||||
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
|
||||
import static android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS;
|
||||
import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
|
||||
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
|
||||
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
||||
@@ -72,6 +74,7 @@ public class DragLayout extends LinearLayout {
|
||||
private final SplitScreenController mSplitScreenController;
|
||||
private final IconProvider mIconProvider;
|
||||
private final StatusBarManager mStatusBarManager;
|
||||
private final Configuration mLastConfiguration = new Configuration();
|
||||
|
||||
private DragAndDropPolicy.Target mCurrentTarget = null;
|
||||
private DropZoneView mDropZoneView1;
|
||||
@@ -92,6 +95,7 @@ public class DragLayout extends LinearLayout {
|
||||
mIconProvider = iconProvider;
|
||||
mPolicy = new DragAndDropPolicy(context, splitScreenController);
|
||||
mStatusBarManager = context.getSystemService(StatusBarManager.class);
|
||||
mLastConfiguration.setTo(context.getResources().getConfiguration());
|
||||
|
||||
mDisplayMargin = context.getResources().getDimensionPixelSize(
|
||||
R.dimen.drop_layout_display_margin);
|
||||
@@ -132,11 +136,6 @@ public class DragLayout extends LinearLayout {
|
||||
return super.onApplyWindowInsets(insets);
|
||||
}
|
||||
|
||||
public void onThemeChange() {
|
||||
mDropZoneView1.onThemeChange();
|
||||
mDropZoneView2.onThemeChange();
|
||||
}
|
||||
|
||||
public void onConfigChanged(Configuration newConfig) {
|
||||
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
|
||||
&& getOrientation() != HORIZONTAL) {
|
||||
@@ -147,6 +146,15 @@ public class DragLayout extends LinearLayout {
|
||||
setOrientation(LinearLayout.VERTICAL);
|
||||
updateContainerMargins(newConfig.orientation);
|
||||
}
|
||||
|
||||
final int diff = newConfig.diff(mLastConfiguration);
|
||||
final boolean themeChanged = (diff & CONFIG_ASSETS_PATHS) != 0
|
||||
|| (diff & CONFIG_UI_MODE) != 0;
|
||||
if (themeChanged) {
|
||||
mDropZoneView1.onThemeChange();
|
||||
mDropZoneView2.onThemeChange();
|
||||
}
|
||||
mLastConfiguration.setTo(newConfig);
|
||||
}
|
||||
|
||||
private void updateContainerMarginsForSingleTask() {
|
||||
|
||||
@@ -48,7 +48,6 @@ import com.android.launcher3.icons.IconProvider;
|
||||
import com.android.wm.shell.ShellTestCase;
|
||||
import com.android.wm.shell.common.DisplayController;
|
||||
import com.android.wm.shell.common.ShellExecutor;
|
||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||
import com.android.wm.shell.sysui.ShellController;
|
||||
import com.android.wm.shell.sysui.ShellInit;
|
||||
|
||||
@@ -82,7 +81,7 @@ public class DragAndDropControllerTest extends ShellTestCase {
|
||||
@Mock
|
||||
private ShellExecutor mMainExecutor;
|
||||
@Mock
|
||||
private SplitScreenController mSplitScreenController;
|
||||
private WindowManager mWindowManager;
|
||||
|
||||
private DragAndDropController mController;
|
||||
|
||||
@@ -99,11 +98,6 @@ public class DragAndDropControllerTest extends ShellTestCase {
|
||||
verify(mShellInit, times(1)).addInitCallback(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void instantiateController_registerConfigChangeListener() {
|
||||
verify(mShellController, times(1)).addConfigurationChangeListener(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIgnoreNonDefaultDisplays() {
|
||||
final int nonDefaultDisplayId = 12345;
|
||||
|
||||
Reference in New Issue
Block a user