Commit 5c5957c7 authored by Lijin Shen's avatar Lijin Shen Committed by Commit Bot

Merge tabs of multi-instance when display is changed.

On partner foldable phones, when the secondary display is off, there
is only one targetable displays and only #onDisplayChanged is called.
This CL tries to merge tabs #onDisplayChanged as well.

Bug: 1088202
Change-Id: Id21960b40bceb4b04fce7a2718c0e33bee0f4920
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2272131Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Commit-Queue: Lijin Shen <lazzzis@google.com>
Cr-Commit-Position: refs/heads/master@{#786055}
parent ab404555
......@@ -20,6 +20,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.ActivityState;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.CommandLine;
import org.chromium.base.metrics.RecordUserAction;
......@@ -85,6 +86,7 @@ public class MultiInstanceManager
private boolean mShouldMergeOnConfigurationChange;
private boolean mIsRecreating;
private int mDisplayId;
private static List<Integer> sTestDisplayIds;
/**
* Create a new {@link MultiInstanceManager}.
......@@ -220,7 +222,13 @@ public class MultiInstanceManager
@Override
public void onDisplayChanged(int displayId) {
// TODO(crbug.com/824954): try to merge tabs sharing logic w/ onDisplayRemoved
if (displayId == mDisplayId) return;
List<Integer> ids = sTestDisplayIds != null
? sTestDisplayIds
: ApiCompatibilityUtils.getTargetableDisplayIds(mActivity);
if (ids.size() == 1 && ids.get(0).equals(mDisplayId)) {
maybeMergeTabs();
}
}
};
displayManager.registerDisplayListener(mDisplayListener, null);
......@@ -433,4 +441,9 @@ public class MultiInstanceManager
public DisplayManager.DisplayListener getDisplayListenerForTesting() {
return mDisplayListener;
}
@VisibleForTesting
public static void setTestDisplayIds(List<Integer> testDisplayIds) {
sTestDisplayIds = testDisplayIds;
}
}
......@@ -54,6 +54,7 @@ import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.test.util.UiRestriction;
import java.util.Collections;
import java.util.concurrent.TimeoutException;
/**
......@@ -559,4 +560,49 @@ public class TabModelMergingTest {
mActivity1.finishAndRemoveTask();
mActivity2.finishAndRemoveTask();
}
@Test
@LargeTest
@EnableFeatures(ChromeFeatureList.ANDROID_MULTIPLE_DISPLAY)
public void testMergeOnMultiDisplay_OnDisplayChanged() throws TimeoutException {
TestThreadUtils.runOnUiThreadBlocking(() -> {
mActivity1.saveState();
mActivity2.saveState();
});
MultiInstanceManager m1 = mActivity1.getMultiInstanceMangerForTesting();
MultiInstanceManager m2 = mActivity2.getMultiInstanceMangerForTesting();
// Ensure Activity 1 is resumed on the front.
Intent intent = new Intent(mActivity1, mActivity1.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
mActivity1.startActivity(intent);
waitForActivityStateChange(ActivityState.RESUMED, mActivity2, false);
waitForActivityStateChange(ActivityState.RESUMED, mActivity1, true);
MultiInstanceManager.setTestDisplayIds(Collections.singletonList(0));
m1.setCurrentDisplayIdForTesting(0);
m2.setCurrentDisplayIdForTesting(1);
TestThreadUtils.runOnUiThreadBlocking(() -> {
m1.getDisplayListenerForTesting().onDisplayChanged(1);
m2.getDisplayListenerForTesting().onDisplayChanged(1);
});
CriteriaHelper.pollUiThread(new Criteria("Total tab count incorrect.") {
@Override
public boolean isSatisfied() {
return mActivity1.getTabModelSelector().getTotalTabCount() == 7;
}
});
CriteriaHelper.pollUiThread(new Criteria("CTA2 should be destroyed"
+ "CTA state: " + mActivity1State + " - CTA2State: " + mActivity2State) {
@Override
public boolean isSatisfied() {
return mActivity2State == ActivityState.DESTROYED
&& mActivity1State != ActivityState.DESTROYED;
}
});
mActivity1.finishAndRemoveTask();
mActivity2.finishAndRemoveTask();
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment