Merge "Fix activity move between displays" into oc-dev
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 4219235..95549d6 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -18,6 +18,7 @@
import android.metrics.LogMaker;
import android.graphics.Rect;
+import android.view.ViewRootImpl.ActivityConfigCallback;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillPopupWindow;
@@ -6835,12 +6836,12 @@
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor,
- Window window) {
+ Window window, ActivityConfigCallback activityConfigCallback) {
attachBaseContext(context);
mFragments.attachHost(null /*parent*/);
- mWindow = new PhoneWindow(this, window);
+ mWindow = new PhoneWindow(this, window, activityConfigCallback);
mWindow.setWindowControllerCallback(this);
mWindow.setCallback(this);
mWindow.setOnWindowDismissedCallback(this);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 182982a..3167ba7 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2748,7 +2748,7 @@
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
- r.referrer, r.voiceInteractor, window);
+ r.referrer, r.voiceInteractor, window, r.configCallback);
if (customIntent != null) {
activity.mIntent = customIntent;
@@ -3783,12 +3783,6 @@
if (r.activity.mVisibleFromClient) {
r.activity.makeVisible();
}
- final ViewRootImpl viewRoot = r.activity.mDecor.getViewRootImpl();
- if (viewRoot != null) {
- // TODO: Figure out the best place to set the callback.
- // This looks like a place where decor view is already initialized.
- viewRoot.setActivityConfigCallback(r.configCallback);
- }
}
if (!r.onlyLocalRequest) {
@@ -5156,13 +5150,8 @@
if (DEBUG_CONFIGURATION) Slog.w(TAG, "Not found target activity to report to: " + r);
return;
}
- final boolean movedToDifferentDisplay = displayId != INVALID_DISPLAY;
- if (movedToDifferentDisplay) {
- if (r.activity.getDisplay().getDisplayId() == displayId) {
- throw new IllegalArgumentException("Activity is already on the target display: "
- + displayId);
- }
- }
+ final boolean movedToDifferentDisplay = displayId != INVALID_DISPLAY
+ && displayId != r.activity.getDisplay().getDisplayId();
// Perform updates.
r.overrideConfig = data.overrideConfig;
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index f9a3ea7..d546f27 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -1146,10 +1146,11 @@
IllegalAccessException {
Activity activity = (Activity)clazz.newInstance();
ActivityThread aThread = null;
- activity.attach(context, aThread, this, token, 0, application, intent,
+ activity.attach(context, aThread, this, token, 0 /* ident */, application, intent,
info, title, parent, id,
(Activity.NonConfigurationInstances)lastNonConfigurationInstance,
- new Configuration(), null, null, null);
+ new Configuration(), null /* referrer */, null /* voiceInteractor */,
+ null /* window */, null /* activityConfigCallback */);
return activity;
}
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 9760f81..7282492 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -1499,6 +1499,7 @@
// renderer about it.
mBackdropFrameRenderer.onConfigurationChange();
}
+ mWindow.onViewRootImplSet(getViewRootImpl());
}
@Override
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 6c9280a..7b966de 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -47,6 +47,7 @@
import android.view.ViewManager;
import android.view.ViewParent;
import android.view.ViewRootImpl;
+import android.view.ViewRootImpl.ActivityConfigCallback;
import android.view.Window;
import android.view.WindowManager;
import com.android.internal.R;
@@ -287,6 +288,9 @@
private boolean mUseDecorContext = false;
+ /** @see ViewRootImpl#mActivityConfigCallback */
+ private ActivityConfigCallback mActivityConfigCallback;
+
static class WindowManagerHolder {
static final IWindowManager sWindowManager = IWindowManager.Stub.asInterface(
ServiceManager.getService("window"));
@@ -302,7 +306,8 @@
/**
* Constructor for main window of an activity.
*/
- public PhoneWindow(Context context, Window preservedWindow) {
+ public PhoneWindow(Context context, Window preservedWindow,
+ ActivityConfigCallback activityConfigCallback) {
this(context);
// Only main activity windows use decor context, all the other windows depend on whatever
// context that was given to them.
@@ -323,6 +328,7 @@
DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
mSupportsPictureInPicture = forceResizable || context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_PICTURE_IN_PICTURE);
+ mActivityConfigCallback = activityConfigCallback;
}
@Override
@@ -2060,6 +2066,11 @@
return mDecor;
}
+ /** Notify when decor view is attached to window and {@link ViewRootImpl} is available. */
+ void onViewRootImplSet(ViewRootImpl viewRoot) {
+ viewRoot.setActivityConfigCallback(mActivityConfigCallback);
+ }
+
static private final String FOCUSED_ID_TAG = "android:focusedViewId";
static private final String VIEWS_TAG = "android:views";
static private final String PANELS_TAG = "android:Panels";
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 51011b5..78887c6 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -489,10 +489,14 @@
void reparent(ActivityStackSupervisor.ActivityDisplay activityDisplay, boolean onTop) {
removeFromDisplay();
mTmpRect2.setEmpty();
- mWindowContainerController.reparent(activityDisplay.mDisplayId, mTmpRect2);
postAddToDisplay(activityDisplay, mTmpRect2.isEmpty() ? null : mTmpRect2, onTop);
adjustFocusToNextFocusableStackLocked("reparent", true /* allowFocusSelf */);
mStackSupervisor.resumeFocusedStackTopActivityLocked();
+ // Update visibility of activities before notifying WM. This way it won't try to resize
+ // windows that are no longer visible.
+ mStackSupervisor.ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */,
+ !PRESERVE_WINDOWS);
+ mWindowContainerController.reparent(activityDisplay.mDisplayId, mTmpRect2, onTop);
}
/**
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index c9bb9e5..68e25c3 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2775,9 +2775,6 @@
throw new IllegalArgumentException("moveStackToDisplayLocked: Unknown stackId="
+ stackId);
}
-
- ensureActivitiesVisibleLocked(null /* starting */, 0 /* configChanges */,
- !PRESERVE_WINDOWS);
// TODO(multi-display): resize stacks properly if moved from split-screen.
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 21be742..23058bd 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1662,7 +1662,7 @@
return stack;
}
- void moveStackToDisplay(TaskStack stack) {
+ void moveStackToDisplay(TaskStack stack, boolean onTop) {
final DisplayContent prevDc = stack.getDisplayContent();
if (prevDc == null) {
throw new IllegalStateException("Trying to move stackId=" + stack.mStackId
@@ -1674,7 +1674,7 @@
}
prevDc.mTaskStackContainers.removeStackFromDisplay(stack);
- mTaskStackContainers.addStackToDisplay(stack, true /* onTop */);
+ mTaskStackContainers.addStackToDisplay(stack, onTop);
}
@Override
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index 5d0384e..bf024cf 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -100,7 +100,7 @@
}
}
- public void reparent(int displayId, Rect outStackBounds) {
+ public void reparent(int displayId, Rect outStackBounds, boolean onTop) {
synchronized (mWindowMap) {
if (mContainer == null) {
throw new IllegalArgumentException("Trying to move unknown stackId=" + mStackId
@@ -113,7 +113,7 @@
+ " to unknown displayId=" + displayId);
}
- targetDc.moveStackToDisplay(mContainer);
+ targetDc.moveStackToDisplay(mContainer, onTop);
getRawBounds(outStackBounds);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index d7d365e..0270bb9 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -181,7 +181,7 @@
assertEquals(dc, token.getDisplayContent());
// Move stack to first display.
- sDisplayContent.moveStackToDisplay(stack);
+ sDisplayContent.moveStackToDisplay(stack, true /* onTop */);
assertEquals(sDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId());
assertEquals(sDisplayContent, stack.getParent().getParent());
assertEquals(sDisplayContent, stack.getDisplayContent());
diff --git a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
index 13098f6..61f7f57 100644
--- a/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/StackWindowControllerTests.java
@@ -103,7 +103,7 @@
final TaskStack stack2 = stack2Controller.mContainer;
// Reparent
- stack1Controller.reparent(dc.getDisplayId(), new Rect());
+ stack1Controller.reparent(dc.getDisplayId(), new Rect(), true /* onTop */);
assertEquals(dc, stack1.getDisplayContent());
final int stack1PositionInParent = stack1.getParent().mChildren.indexOf(stack1);
final int stack2PositionInParent = stack1.getParent().mChildren.indexOf(stack2);