Merge "Reset the preferred top focus stack when task visibility changes" into rvc-dev

This commit is contained in:
Winson Chung
2020-05-04 16:55:57 +00:00
committed by Android (Google) Code Review
3 changed files with 24 additions and 10 deletions

View File

@@ -1010,16 +1010,6 @@ class ActivityStack extends Task {
}
}
boolean isTopActivityFocusable() {
final ActivityRecord r = topRunningActivity();
return r != null ? r.isFocusable()
: (isFocusable() && getWindowConfiguration().canReceiveKeys());
}
boolean isFocusableAndVisible() {
return isTopActivityFocusable() && shouldBeVisible(null /* starting */);
}
// TODO: Should each user have there own stacks?
@Override
void switchUser(int userId) {

View File

@@ -3334,6 +3334,16 @@ class Task extends WindowContainer<WindowContainer> {
});
}
boolean isTopActivityFocusable() {
final ActivityRecord r = topRunningActivity();
return r != null ? r.isFocusable()
: (isFocusable() && getWindowConfiguration().canReceiveKeys());
}
boolean isFocusableAndVisible() {
return isTopActivityFocusable() && shouldBeVisible(null /* starting */);
}
void positionChildAtTop(ActivityRecord child) {
positionChildAt(child, POSITION_TOP);
}
@@ -4552,7 +4562,14 @@ class Task extends WindowContainer<WindowContainer> {
if (mForceHiddenFlags == newFlags) {
return false;
}
final boolean wasHidden = isForceHidden();
mForceHiddenFlags = newFlags;
if (wasHidden && isFocusableAndVisible()) {
// The change in force-hidden state will change visibility without triggering a stack
// order change, so we should reset the preferred top focusable stack to ensure it's not
// used if a new activity is started from this task.
getDisplayArea().resetPreferredTopFocusableStackIfBelow(this);
}
return true;
}

View File

@@ -680,6 +680,13 @@ final class TaskDisplayArea extends DisplayArea<ActivityStack> {
onStackOrderChanged(stack);
}
void resetPreferredTopFocusableStackIfBelow(Task task) {
if (mPreferredTopFocusableStack != null
&& mPreferredTopFocusableStack.compareTo(task) < 0) {
mPreferredTopFocusableStack = null;
}
}
void positionStackAt(int position, ActivityStack child, boolean includingParents) {
positionChildAt(position, child, includingParents);
mDisplayContent.layoutAndAssignWindowLayersIfNeeded();