summaryrefslogtreecommitdiff
path: root/core/java/android/app/ActivityThread.java
diff options
context:
space:
mode:
authorHongwei Wang <hwwang@google.com>2020-04-30 23:38:56 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-04-30 23:38:56 +0000
commit28c136e1cb243730b86f94aa8237137d4f6d8ff9 (patch)
treed1f115253c3d25046c27ed67759d9962076a0f84 /core/java/android/app/ActivityThread.java
parent6ff27423b86b9f6b05859f9f5e0390992fe41be1 (diff)
parent5711b8fdaf2d99414c8167d142c140c02301c64c (diff)
Merge "Move PIP/MW mode callbacks to be on the client side" into rvc-dev
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
-rw-r--r--core/java/android/app/ActivityThread.java73
1 files changed, 47 insertions, 26 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index e19d5ecdd7d2..e97ebd7eee06 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -17,6 +17,8 @@
package android.app;
import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN;
+import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.servertransaction.ActivityLifecycleItem.ON_CREATE;
import static android.app.servertransaction.ActivityLifecycleItem.ON_DESTROY;
import static android.app.servertransaction.ActivityLifecycleItem.ON_PAUSE;
@@ -407,6 +409,9 @@ public final class ActivityThread extends ClientTransactionHandler {
@GuardedBy("this")
private @Nullable Map<SafeCancellationTransport, CancellationSignal> mRemoteCancellations;
+ private final Map<IBinder, Integer> mLastReportedWindowingMode = Collections.synchronizedMap(
+ new ArrayMap<>());
+
private static final class ProviderKey {
final String authority;
final int userId;
@@ -3329,6 +3334,8 @@ public final class ActivityThread extends ClientTransactionHandler {
" did not call through to super.onCreate()");
}
r.activity = activity;
+ mLastReportedWindowingMode.put(activity.getActivityToken(),
+ config.windowConfiguration.getWindowingMode());
}
r.setState(ON_CREATE);
@@ -3752,32 +3759,6 @@ public final class ActivityThread extends ClientTransactionHandler {
}
@Override
- public void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode,
- Configuration overrideConfig) {
- final ActivityClientRecord r = mActivities.get(token);
- if (r != null) {
- final Configuration newConfig = new Configuration(mConfiguration);
- if (overrideConfig != null) {
- newConfig.updateFrom(overrideConfig);
- }
- r.activity.dispatchMultiWindowModeChanged(isInMultiWindowMode, newConfig);
- }
- }
-
- @Override
- public void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode,
- Configuration overrideConfig) {
- final ActivityClientRecord r = mActivities.get(token);
- if (r != null) {
- final Configuration newConfig = new Configuration(mConfiguration);
- if (overrideConfig != null) {
- newConfig.updateFrom(overrideConfig);
- }
- r.activity.dispatchPictureInPictureModeChanged(isInPipMode, newConfig);
- }
- }
-
- @Override
public void handlePictureInPictureRequested(IBinder token) {
final ActivityClientRecord r = mActivities.get(token);
if (r == null) {
@@ -5274,8 +5255,15 @@ public final class ActivityThread extends ClientTransactionHandler {
throw e.rethrowFromSystemServer();
}
+ // Save the current windowing mode to be restored and compared to the new configuration's
+ // windowing mode (needed because we update the last reported windowing mode when launching
+ // an activity and we can't tell inside performLaunchActivity whether we are relaunching)
+ final int oldWindowingMode = mLastReportedWindowingMode.getOrDefault(
+ r.activity.getActivityToken(), WINDOWING_MODE_UNDEFINED);
handleRelaunchActivityInner(r, configChanges, tmp.pendingResults, tmp.pendingIntents,
pendingActions, tmp.startsNotResumed, tmp.overrideConfig, "handleRelaunchActivity");
+ mLastReportedWindowingMode.put(r.activity.getActivityToken(), oldWindowingMode);
+ handleWindowingModeChangeIfNeeded(r.activity, r.activity.mCurrentConfig);
if (pendingActions != null) {
// Only report a successful relaunch to WindowManager.
@@ -5558,6 +5546,10 @@ public final class ActivityThread extends ClientTransactionHandler {
throw new IllegalArgumentException("Activity token not set. Is the activity attached?");
}
+ // multi-window / pip mode changes, if any, should be sent before the configuration change
+ // callback, see also PinnedStackTests#testConfigurationChangeOrderDuringTransition
+ handleWindowingModeChangeIfNeeded(activity, newConfig);
+
boolean shouldChangeConfig = false;
if (activity.mCurrentConfig == null) {
shouldChangeConfig = true;
@@ -5752,6 +5744,35 @@ public final class ActivityThread extends ClientTransactionHandler {
}
/**
+ * Sends windowing mode change callbacks to {@link Activity} if applicable.
+ *
+ * See also {@link Activity#onMultiWindowModeChanged(boolean, Configuration)} and
+ * {@link Activity#onPictureInPictureModeChanged(boolean, Configuration)}
+ */
+ private void handleWindowingModeChangeIfNeeded(Activity activity,
+ Configuration newConfiguration) {
+ final int newWindowingMode = newConfiguration.windowConfiguration.getWindowingMode();
+ final IBinder token = activity.getActivityToken();
+ final int oldWindowingMode = mLastReportedWindowingMode.getOrDefault(token,
+ WINDOWING_MODE_UNDEFINED);
+ if (oldWindowingMode == newWindowingMode) return;
+ // PiP callback is sent before the MW one.
+ if (newWindowingMode == WINDOWING_MODE_PINNED) {
+ activity.dispatchPictureInPictureModeChanged(true, newConfiguration);
+ } else if (oldWindowingMode == WINDOWING_MODE_PINNED) {
+ activity.dispatchPictureInPictureModeChanged(false, newConfiguration);
+ }
+ final boolean wasInMultiWindowMode = WindowConfiguration.inMultiWindowMode(
+ oldWindowingMode);
+ final boolean nowInMultiWindowMode = WindowConfiguration.inMultiWindowMode(
+ newWindowingMode);
+ if (wasInMultiWindowMode != nowInMultiWindowMode) {
+ activity.dispatchMultiWindowModeChanged(nowInMultiWindowMode, newConfiguration);
+ }
+ mLastReportedWindowingMode.put(token, newWindowingMode);
+ }
+
+ /**
* Updates the application info.
*
* This only works in the system process. Must be called on the main thread.