Loading core/java/android/window/TaskFragmentParentInfo.java +28 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,34 @@ public class TaskFragmentParentInfo implements Parcelable { + "}"; + "}"; } } /** * Indicates that whether this {@link TaskFragmentParentInfo} equals to {@code obj}. * Note that {@link #equalsForTaskFragmentOrganizer(TaskFragmentParentInfo)} should be used * for most cases because not all {@link Configuration} properties are interested for * {@link TaskFragmentOrganizer}. */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof TaskFragmentParentInfo)) { return false; } final TaskFragmentParentInfo that = (TaskFragmentParentInfo) obj; return mConfiguration.equals(that.mConfiguration) && mDisplayId == that.mDisplayId && mVisibleRequested == that.mVisibleRequested; } @Override public int hashCode() { int result = mConfiguration.hashCode(); result = 31 * result + mDisplayId; result = 31 * result + (mVisibleRequested ? 1 : 0); return result; } @Override @Override public void writeToParcel(@NonNull Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) { mConfiguration.writeToParcel(dest, flags); mConfiguration.writeToParcel(dest, flags); Loading services/core/java/com/android/server/wm/ActivityRecord.java +15 −3 Original line number Original line Diff line number Diff line Loading @@ -1586,12 +1586,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (oldParent != null) { if (oldParent != null) { oldParent.cleanUpActivityReferences(this); oldParent.cleanUpActivityReferences(this); // Update isVisibleRequested value of parent TaskFragment and send the callback to the // client side if needed. oldParent.onActivityVisibleRequestedChanged(); } } if (newParent != null && isState(RESUMED)) { if (newParent != null) { // Update isVisibleRequested value of parent TaskFragment and send the callback to the // client side if needed. newParent.onActivityVisibleRequestedChanged(); if (isState(RESUMED)) { newParent.setResumedActivity(this, "onParentChanged"); newParent.setResumedActivity(this, "onParentChanged"); mImeInsetsFrozenUntilStartInput = false; mImeInsetsFrozenUntilStartInput = false; } } } if (rootTask != null && rootTask.topRunningActivity() == this) { if (rootTask != null && rootTask.topRunningActivity() == this) { // make ensure the TaskOrganizer still works after re-parenting // make ensure the TaskOrganizer still works after re-parenting Loading Loading @@ -5090,6 +5098,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; return; } } mVisibleRequested = visible; mVisibleRequested = visible; final TaskFragment taskFragment = getTaskFragment(); if (taskFragment != null) { taskFragment.onActivityVisibleRequestedChanged(); } setInsetsFrozen(!visible); setInsetsFrozen(!visible); if (app != null) { if (app != null) { mTaskSupervisor.onProcessActivityStateChanged(app, false /* forceBatch */); mTaskSupervisor.onProcessActivityStateChanged(app, false /* forceBatch */); Loading services/core/java/com/android/server/wm/Task.java +20 −0 Original line number Original line Diff line number Diff line Loading @@ -2685,6 +2685,7 @@ class Task extends TaskFragment { if (isRootTask()) { if (isRootTask()) { updateSurfaceBounds(); updateSurfaceBounds(); } } sendTaskFragmentParentInfoChangedIfNeeded(); } } boolean isResizeable() { boolean isResizeable() { Loading Loading @@ -3527,6 +3528,25 @@ class Task extends TaskFragment { return new TaskFragmentParentInfo(getConfiguration(), getDisplayId(), isVisibleRequested()); return new TaskFragmentParentInfo(getConfiguration(), getDisplayId(), isVisibleRequested()); } } @Override void onActivityVisibleRequestedChanged() { if (mVisibleRequested != isVisibleRequested()) { sendTaskFragmentParentInfoChangedIfNeeded(); } } void sendTaskFragmentParentInfoChangedIfNeeded() { if (!isLeafTask()) { // Only send parent info changed event for leaf task. return; } final TaskFragment childOrganizedTf = getTaskFragment(TaskFragment::isOrganizedTaskFragment); if (childOrganizedTf != null) { childOrganizedTf.sendTaskFragmentParentInfoChanged(); } } boolean isTaskId(int taskId) { boolean isTaskId(int taskId) { return mTaskId == taskId; return mTaskId == taskId; } } Loading services/core/java/com/android/server/wm/TaskFragment.java +24 −1 Original line number Original line Diff line number Diff line Loading @@ -297,6 +297,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { final Point mLastSurfaceSize = new Point(); final Point mLastSurfaceSize = new Point(); /** The latest updated value when there's a child {@link #onActivityVisibleRequestedChanged} */ boolean mVisibleRequested; private final Rect mTmpBounds = new Rect(); private final Rect mTmpBounds = new Rect(); private final Rect mTmpFullBounds = new Rect(); private final Rect mTmpFullBounds = new Rect(); /** For calculating screenWidthDp and screenWidthDp, i.e. the area without the system bars. */ /** For calculating screenWidthDp and screenWidthDp, i.e. the area without the system bars. */ Loading Loading @@ -2381,6 +2384,14 @@ class TaskFragment extends WindowContainer<WindowContainer> { } } } } void sendTaskFragmentParentInfoChanged() { final Task parentTask = getParent().asTask(); if (mTaskFragmentOrganizer != null && parentTask != null) { mTaskFragmentOrganizerController .onTaskFragmentParentInfoChanged(mTaskFragmentOrganizer, parentTask); } } private void sendTaskFragmentAppeared() { private void sendTaskFragmentAppeared() { if (mTaskFragmentOrganizer != null) { if (mTaskFragmentOrganizer != null) { mTaskFragmentOrganizerController.onTaskFragmentAppeared(mTaskFragmentOrganizer, this); mTaskFragmentOrganizerController.onTaskFragmentAppeared(mTaskFragmentOrganizer, this); Loading Loading @@ -2416,7 +2427,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { mRemoteToken.toWindowContainerToken(), mRemoteToken.toWindowContainerToken(), getConfiguration(), getConfiguration(), getNonFinishingActivityCount(), getNonFinishingActivityCount(), isVisible(), isVisibleRequested(), childActivities, childActivities, positionInParent, positionInParent, mClearedTaskForReuse, mClearedTaskForReuse, Loading Loading @@ -2673,6 +2684,18 @@ class TaskFragment extends WindowContainer<WindowContainer> { return getWindowingMode() == WINDOWING_MODE_FULLSCREEN || matchParentBounds(); return getWindowingMode() == WINDOWING_MODE_FULLSCREEN || matchParentBounds(); } } void onActivityVisibleRequestedChanged() { final boolean isVisibleRequested = isVisibleRequested(); if (mVisibleRequested == isVisibleRequested) { return; } mVisibleRequested = isVisibleRequested; final TaskFragment parentTf = getParent().asTaskFragment(); if (parentTf != null) { parentTf.onActivityVisibleRequestedChanged(); } } String toFullString() { String toFullString() { final StringBuilder sb = new StringBuilder(128); final StringBuilder sb = new StringBuilder(128); sb.append(this); sb.append(this); Loading services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +31 −1 Original line number Original line Diff line number Diff line Loading @@ -649,6 +649,34 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr .build()); .build()); } } void onTaskFragmentParentInfoChanged(@NonNull ITaskFragmentOrganizer organizer, @NonNull Task task) { validateAndGetState(organizer); final PendingTaskFragmentEvent pendingEvent = getLastPendingParentInfoChangedEvent( organizer, task); if (pendingEvent == null) { addPendingEvent(new PendingTaskFragmentEvent.Builder( PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED, organizer) .setTask(task) .build()); } } @Nullable private PendingTaskFragmentEvent getLastPendingParentInfoChangedEvent( @NonNull ITaskFragmentOrganizer organizer, @NonNull Task task) { final List<PendingTaskFragmentEvent> events = mPendingTaskFragmentEvents .get(organizer.asBinder()); for (int i = events.size() - 1; i >= 0; i--) { final PendingTaskFragmentEvent event = events.get(i); if (task == event.mTask && event.mEventType == PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED) { return event; } } return null; } private void addPendingEvent(@NonNull PendingTaskFragmentEvent event) { private void addPendingEvent(@NonNull PendingTaskFragmentEvent event) { mPendingTaskFragmentEvents.get(event.mTaskFragmentOrg.asBinder()).add(event); mPendingTaskFragmentEvents.get(event.mTaskFragmentOrg.asBinder()).add(event); } } Loading Loading @@ -851,7 +879,9 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr } } private boolean shouldSendEventWhenTaskInvisible(@NonNull PendingTaskFragmentEvent event) { private boolean shouldSendEventWhenTaskInvisible(@NonNull PendingTaskFragmentEvent event) { if (event.mEventType == PendingTaskFragmentEvent.EVENT_ERROR) { if (event.mEventType == PendingTaskFragmentEvent.EVENT_ERROR // Always send parent info changed to update task visibility || event.mEventType == PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED) { return true; return true; } } Loading Loading
core/java/android/window/TaskFragmentParentInfo.java +28 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,34 @@ public class TaskFragmentParentInfo implements Parcelable { + "}"; + "}"; } } /** * Indicates that whether this {@link TaskFragmentParentInfo} equals to {@code obj}. * Note that {@link #equalsForTaskFragmentOrganizer(TaskFragmentParentInfo)} should be used * for most cases because not all {@link Configuration} properties are interested for * {@link TaskFragmentOrganizer}. */ @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof TaskFragmentParentInfo)) { return false; } final TaskFragmentParentInfo that = (TaskFragmentParentInfo) obj; return mConfiguration.equals(that.mConfiguration) && mDisplayId == that.mDisplayId && mVisibleRequested == that.mVisibleRequested; } @Override public int hashCode() { int result = mConfiguration.hashCode(); result = 31 * result + mDisplayId; result = 31 * result + (mVisibleRequested ? 1 : 0); return result; } @Override @Override public void writeToParcel(@NonNull Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) { mConfiguration.writeToParcel(dest, flags); mConfiguration.writeToParcel(dest, flags); Loading
services/core/java/com/android/server/wm/ActivityRecord.java +15 −3 Original line number Original line Diff line number Diff line Loading @@ -1586,12 +1586,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (oldParent != null) { if (oldParent != null) { oldParent.cleanUpActivityReferences(this); oldParent.cleanUpActivityReferences(this); // Update isVisibleRequested value of parent TaskFragment and send the callback to the // client side if needed. oldParent.onActivityVisibleRequestedChanged(); } } if (newParent != null && isState(RESUMED)) { if (newParent != null) { // Update isVisibleRequested value of parent TaskFragment and send the callback to the // client side if needed. newParent.onActivityVisibleRequestedChanged(); if (isState(RESUMED)) { newParent.setResumedActivity(this, "onParentChanged"); newParent.setResumedActivity(this, "onParentChanged"); mImeInsetsFrozenUntilStartInput = false; mImeInsetsFrozenUntilStartInput = false; } } } if (rootTask != null && rootTask.topRunningActivity() == this) { if (rootTask != null && rootTask.topRunningActivity() == this) { // make ensure the TaskOrganizer still works after re-parenting // make ensure the TaskOrganizer still works after re-parenting Loading Loading @@ -5090,6 +5098,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; return; } } mVisibleRequested = visible; mVisibleRequested = visible; final TaskFragment taskFragment = getTaskFragment(); if (taskFragment != null) { taskFragment.onActivityVisibleRequestedChanged(); } setInsetsFrozen(!visible); setInsetsFrozen(!visible); if (app != null) { if (app != null) { mTaskSupervisor.onProcessActivityStateChanged(app, false /* forceBatch */); mTaskSupervisor.onProcessActivityStateChanged(app, false /* forceBatch */); Loading
services/core/java/com/android/server/wm/Task.java +20 −0 Original line number Original line Diff line number Diff line Loading @@ -2685,6 +2685,7 @@ class Task extends TaskFragment { if (isRootTask()) { if (isRootTask()) { updateSurfaceBounds(); updateSurfaceBounds(); } } sendTaskFragmentParentInfoChangedIfNeeded(); } } boolean isResizeable() { boolean isResizeable() { Loading Loading @@ -3527,6 +3528,25 @@ class Task extends TaskFragment { return new TaskFragmentParentInfo(getConfiguration(), getDisplayId(), isVisibleRequested()); return new TaskFragmentParentInfo(getConfiguration(), getDisplayId(), isVisibleRequested()); } } @Override void onActivityVisibleRequestedChanged() { if (mVisibleRequested != isVisibleRequested()) { sendTaskFragmentParentInfoChangedIfNeeded(); } } void sendTaskFragmentParentInfoChangedIfNeeded() { if (!isLeafTask()) { // Only send parent info changed event for leaf task. return; } final TaskFragment childOrganizedTf = getTaskFragment(TaskFragment::isOrganizedTaskFragment); if (childOrganizedTf != null) { childOrganizedTf.sendTaskFragmentParentInfoChanged(); } } boolean isTaskId(int taskId) { boolean isTaskId(int taskId) { return mTaskId == taskId; return mTaskId == taskId; } } Loading
services/core/java/com/android/server/wm/TaskFragment.java +24 −1 Original line number Original line Diff line number Diff line Loading @@ -297,6 +297,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { final Point mLastSurfaceSize = new Point(); final Point mLastSurfaceSize = new Point(); /** The latest updated value when there's a child {@link #onActivityVisibleRequestedChanged} */ boolean mVisibleRequested; private final Rect mTmpBounds = new Rect(); private final Rect mTmpBounds = new Rect(); private final Rect mTmpFullBounds = new Rect(); private final Rect mTmpFullBounds = new Rect(); /** For calculating screenWidthDp and screenWidthDp, i.e. the area without the system bars. */ /** For calculating screenWidthDp and screenWidthDp, i.e. the area without the system bars. */ Loading Loading @@ -2381,6 +2384,14 @@ class TaskFragment extends WindowContainer<WindowContainer> { } } } } void sendTaskFragmentParentInfoChanged() { final Task parentTask = getParent().asTask(); if (mTaskFragmentOrganizer != null && parentTask != null) { mTaskFragmentOrganizerController .onTaskFragmentParentInfoChanged(mTaskFragmentOrganizer, parentTask); } } private void sendTaskFragmentAppeared() { private void sendTaskFragmentAppeared() { if (mTaskFragmentOrganizer != null) { if (mTaskFragmentOrganizer != null) { mTaskFragmentOrganizerController.onTaskFragmentAppeared(mTaskFragmentOrganizer, this); mTaskFragmentOrganizerController.onTaskFragmentAppeared(mTaskFragmentOrganizer, this); Loading Loading @@ -2416,7 +2427,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { mRemoteToken.toWindowContainerToken(), mRemoteToken.toWindowContainerToken(), getConfiguration(), getConfiguration(), getNonFinishingActivityCount(), getNonFinishingActivityCount(), isVisible(), isVisibleRequested(), childActivities, childActivities, positionInParent, positionInParent, mClearedTaskForReuse, mClearedTaskForReuse, Loading Loading @@ -2673,6 +2684,18 @@ class TaskFragment extends WindowContainer<WindowContainer> { return getWindowingMode() == WINDOWING_MODE_FULLSCREEN || matchParentBounds(); return getWindowingMode() == WINDOWING_MODE_FULLSCREEN || matchParentBounds(); } } void onActivityVisibleRequestedChanged() { final boolean isVisibleRequested = isVisibleRequested(); if (mVisibleRequested == isVisibleRequested) { return; } mVisibleRequested = isVisibleRequested; final TaskFragment parentTf = getParent().asTaskFragment(); if (parentTf != null) { parentTf.onActivityVisibleRequestedChanged(); } } String toFullString() { String toFullString() { final StringBuilder sb = new StringBuilder(128); final StringBuilder sb = new StringBuilder(128); sb.append(this); sb.append(this); Loading
services/core/java/com/android/server/wm/TaskFragmentOrganizerController.java +31 −1 Original line number Original line Diff line number Diff line Loading @@ -649,6 +649,34 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr .build()); .build()); } } void onTaskFragmentParentInfoChanged(@NonNull ITaskFragmentOrganizer organizer, @NonNull Task task) { validateAndGetState(organizer); final PendingTaskFragmentEvent pendingEvent = getLastPendingParentInfoChangedEvent( organizer, task); if (pendingEvent == null) { addPendingEvent(new PendingTaskFragmentEvent.Builder( PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED, organizer) .setTask(task) .build()); } } @Nullable private PendingTaskFragmentEvent getLastPendingParentInfoChangedEvent( @NonNull ITaskFragmentOrganizer organizer, @NonNull Task task) { final List<PendingTaskFragmentEvent> events = mPendingTaskFragmentEvents .get(organizer.asBinder()); for (int i = events.size() - 1; i >= 0; i--) { final PendingTaskFragmentEvent event = events.get(i); if (task == event.mTask && event.mEventType == PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED) { return event; } } return null; } private void addPendingEvent(@NonNull PendingTaskFragmentEvent event) { private void addPendingEvent(@NonNull PendingTaskFragmentEvent event) { mPendingTaskFragmentEvents.get(event.mTaskFragmentOrg.asBinder()).add(event); mPendingTaskFragmentEvents.get(event.mTaskFragmentOrg.asBinder()).add(event); } } Loading Loading @@ -851,7 +879,9 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr } } private boolean shouldSendEventWhenTaskInvisible(@NonNull PendingTaskFragmentEvent event) { private boolean shouldSendEventWhenTaskInvisible(@NonNull PendingTaskFragmentEvent event) { if (event.mEventType == PendingTaskFragmentEvent.EVENT_ERROR) { if (event.mEventType == PendingTaskFragmentEvent.EVENT_ERROR // Always send parent info changed to update task visibility || event.mEventType == PendingTaskFragmentEvent.EVENT_PARENT_INFO_CHANGED) { return true; return true; } } Loading