Merge "Block split Activity in lock task mode" into sc-v2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
06328c7ada
@@ -295,11 +295,12 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
|
||||
@NonNull TaskFragmentContainer primaryContainer, @NonNull Activity primaryActivity,
|
||||
@NonNull TaskFragmentContainer secondaryContainer,
|
||||
@NonNull SplitRule splitRule) {
|
||||
SplitContainer splitContainer = new SplitContainer(primaryContainer, primaryActivity,
|
||||
secondaryContainer, splitRule);
|
||||
// Remove container later to prevent pinning escaping toast showing in lock task mode.
|
||||
if (splitRule instanceof SplitPairRule && ((SplitPairRule) splitRule).shouldClearTop()) {
|
||||
removeExistingSecondaryContainers(wct, primaryContainer);
|
||||
}
|
||||
SplitContainer splitContainer = new SplitContainer(primaryContainer, primaryActivity,
|
||||
secondaryContainer, splitRule);
|
||||
mSplitContainers.add(splitContainer);
|
||||
}
|
||||
|
||||
|
||||
@@ -112,8 +112,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
|
||||
secondaryContainer.setLastRequestedBounds(secondaryRectBounds);
|
||||
|
||||
// Set adjacent to each other so that the containers below will be invisible.
|
||||
setAdjacentTaskFragments(wct, primaryContainer.getTaskFragmentToken(),
|
||||
secondaryContainer.getTaskFragmentToken(), rule);
|
||||
setAdjacentTaskFragments(wct, primaryContainer, secondaryContainer, rule);
|
||||
|
||||
mController.registerSplit(wct, primaryContainer, primaryActivity, secondaryContainer, rule);
|
||||
|
||||
@@ -149,8 +148,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
|
||||
secondaryActivity, secondaryRectBounds, primaryContainer);
|
||||
|
||||
// Set adjacent to each other so that the containers below will be invisible.
|
||||
setAdjacentTaskFragments(wct, primaryContainer.getTaskFragmentToken(),
|
||||
secondaryContainer.getTaskFragmentToken(), rule);
|
||||
setAdjacentTaskFragments(wct, primaryContainer, secondaryContainer, rule);
|
||||
|
||||
mController.registerSplit(wct, primaryContainer, primaryActivity, secondaryContainer, rule);
|
||||
|
||||
@@ -269,8 +267,22 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
|
||||
final TaskFragmentContainer secondaryContainer = splitContainer.getSecondaryContainer();
|
||||
resizeTaskFragmentIfRegistered(wct, secondaryContainer, secondaryRectBounds);
|
||||
|
||||
setAdjacentTaskFragments(wct, primaryContainer.getTaskFragmentToken(),
|
||||
secondaryContainer.getTaskFragmentToken(), rule);
|
||||
setAdjacentTaskFragments(wct, primaryContainer, secondaryContainer, rule);
|
||||
}
|
||||
|
||||
private void setAdjacentTaskFragments(@NonNull WindowContainerTransaction wct,
|
||||
@NonNull TaskFragmentContainer primaryContainer,
|
||||
@NonNull TaskFragmentContainer secondaryContainer, @NonNull SplitRule splitRule) {
|
||||
final Rect parentBounds = getParentContainerBounds(primaryContainer);
|
||||
// Clear adjacent TaskFragments if the container is shown in fullscreen, or the
|
||||
// secondaryContainer could not be finished.
|
||||
if (!shouldShowSideBySide(parentBounds, splitRule)) {
|
||||
setAdjacentTaskFragments(wct, primaryContainer.getTaskFragmentToken(),
|
||||
null /* secondary */, null /* splitRule */);
|
||||
} else {
|
||||
setAdjacentTaskFragments(wct, primaryContainer.getTaskFragmentToken(),
|
||||
secondaryContainer.getTaskFragmentToken(), splitRule);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -251,15 +251,47 @@ public class LockTaskController {
|
||||
*/
|
||||
boolean activityBlockedFromFinish(ActivityRecord activity) {
|
||||
final Task task = activity.getTask();
|
||||
if (activity == task.getRootActivity()
|
||||
&& activity == task.getTopNonFinishingActivity()
|
||||
&& task.mLockTaskAuth != LOCK_TASK_AUTH_LAUNCHABLE_PRIV
|
||||
&& isRootTask(task)) {
|
||||
Slog.i(TAG, "Not finishing task in lock task mode");
|
||||
showLockTaskToast();
|
||||
return true;
|
||||
if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV || !isRootTask(task)) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
||||
final ActivityRecord taskTop = task.getTopNonFinishingActivity();
|
||||
final ActivityRecord taskRoot = task.getRootActivity();
|
||||
// If task has more than one Activity, verify if there's only adjacent TaskFragments that
|
||||
// should be finish together in the Task.
|
||||
if (activity != taskRoot || activity != taskTop) {
|
||||
final TaskFragment taskFragment = activity.getTaskFragment();
|
||||
final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment();
|
||||
if (taskFragment.asTask() != null
|
||||
|| !taskFragment.isDelayLastActivityRemoval()
|
||||
|| adjacentTaskFragment == null) {
|
||||
// Don't block activity from finishing if the TaskFragment don't have any adjacent
|
||||
// TaskFragment, or it won't finish together with its adjacent TaskFragment.
|
||||
return false;
|
||||
}
|
||||
|
||||
final boolean hasOtherActivityInTaskFragment =
|
||||
taskFragment.getActivity(a -> !a.finishing && a != activity) != null;
|
||||
if (hasOtherActivityInTaskFragment) {
|
||||
// Don't block activity from finishing if there's other Activity in the same
|
||||
// TaskFragment.
|
||||
return false;
|
||||
}
|
||||
|
||||
final boolean hasOtherActivityInTask = task.getActivity(a -> !a.finishing
|
||||
&& a != activity && a.getTaskFragment() != adjacentTaskFragment) != null;
|
||||
if (hasOtherActivityInTask) {
|
||||
// Do not block activity from finishing if there are another running activities
|
||||
// after the current and adjacent TaskFragments are removed. Note that we don't
|
||||
// check activities in adjacent TaskFragment because it will be finished together
|
||||
// with TaskFragment regardless of numbers of activities.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Slog.i(TAG, "Not finishing task in lock task mode");
|
||||
showLockTaskToast();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -241,7 +241,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
|
||||
/**
|
||||
* Whether to delay the last activity of TaskFragment being immediately removed while finishing.
|
||||
* This should only be set on a embedded TaskFragment, where the organizer can have the
|
||||
* opportunity to perform other actions or animations.
|
||||
* opportunity to perform animations and finishing the adjacent TaskFragment.
|
||||
*/
|
||||
private boolean mDelayLastActivityRemoval;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user