[go: nahoru, domu]

blob: 0b0c7364c6ae5c3db03150ef37f28f58345e8261 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v4.app;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.support.fragment.test.R;
import android.support.v4.app.test.FragmentTestActivity;
import android.support.v4.app.test.FragmentTestActivity.TestFragment;
import android.support.v4.view.ViewCompat;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
@MediumTest
public class FragmentTransitionTest extends
ActivityInstrumentationTestCase2<FragmentTestActivity> {
private TestFragment mStartFragment;
private TestFragment mMidFragment;
private TestFragment mEndFragment;
private FragmentTestActivity mActivity;
public FragmentTransitionTest() {
super(FragmentTestActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mStartFragment = null;
mMidFragment = null;
mEndFragment = null;
mActivity = getActivity();
}
public void testFragmentTransition() throws Throwable {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return;
}
launchStartFragment();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
final View sharedElement = mActivity.findViewById(R.id.hello);
assertEquals("source", ViewCompat.getTransitionName(sharedElement));
mEndFragment = TestFragment.create(R.layout.fragment_end);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mEndFragment)
.addSharedElement(sharedElement, "destination")
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForEnd(mEndFragment, TestFragment.ENTER);
assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
assertTrue(mEndFragment.wasEndCalled(TestFragment.SHARED_ELEMENT_ENTER));
runTestOnUiThread(new Runnable() {
@Override
public void run() {
final View textView = mActivity.findViewById(R.id.hello);
assertEquals("destination", ViewCompat.getTransitionName(textView));
mActivity.getSupportFragmentManager().popBackStack();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForEnd(mStartFragment, TestFragment.REENTER);
assertTrue(mStartFragment.wasEndCalled(TestFragment.REENTER));
assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
}
public void testFirstOutLastInTransition() throws Throwable {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return;
}
launchStartFragment();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mMidFragment = TestFragment.create(R.layout.fragment_middle);
mEndFragment = TestFragment.create(R.layout.fragment_end);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mMidFragment)
.replace(R.id.content, mEndFragment)
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForEnd(mEndFragment, TestFragment.ENTER);
assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
mStartFragment.clearNotifications();
mEndFragment.clearNotifications();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mActivity.getSupportFragmentManager().popBackStack();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForEnd(mEndFragment, TestFragment.RETURN);
assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
}
public void testPopTwo() throws Throwable {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return;
}
launchStartFragment();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mMidFragment = TestFragment.create(R.layout.fragment_middle);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mMidFragment)
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForEnd(mMidFragment, TestFragment.ENTER);
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mEndFragment = TestFragment.create(R.layout.fragment_end);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mEndFragment)
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForEnd(mEndFragment, TestFragment.ENTER);
assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
assertTrue(mMidFragment.wasStartCalled(TestFragment.ENTER));
assertTrue(mMidFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
mStartFragment.clearNotifications();
mMidFragment.clearNotifications();
mEndFragment.clearNotifications();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
FragmentManager fm = mActivity.getSupportFragmentManager();
int id = fm.getBackStackEntryAt(0).getId();
fm.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fm.executePendingTransactions();
}
});
waitForEnd(mEndFragment, TestFragment.RETURN);
assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
}
public void testNullTransition() throws Throwable {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return;
}
getInstrumentation().waitForIdleSync();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mStartFragment = TestFragment.create(R.layout.fragment_start);
mStartFragment.clearTransitions();
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mStartFragment)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForStart(mStartFragment, TestFragment.ENTER);
// No transitions
assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mMidFragment = TestFragment.create(R.layout.fragment_middle);
mEndFragment = TestFragment.create(R.layout.fragment_end);
mEndFragment.clearTransitions();
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mMidFragment)
.replace(R.id.content, mEndFragment)
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForStart(mEndFragment, TestFragment.ENTER);
assertFalse(mEndFragment.wasEndCalled(TestFragment.ENTER));
assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
assertFalse(mStartFragment.wasEndCalled(TestFragment.EXIT));
assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mActivity.getSupportFragmentManager().popBackStack();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForStart(mEndFragment, TestFragment.RETURN);
assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
}
public void testRemoveAdded() throws Throwable {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return;
}
launchStartFragment();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mEndFragment = TestFragment.create(R.layout.fragment_end);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mEndFragment)
.replace(R.id.content, mStartFragment)
.replace(R.id.content, mEndFragment)
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
assertTrue(waitForEnd(mEndFragment, TestFragment.ENTER));
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mActivity.getSupportFragmentManager().popBackStack();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
assertTrue(waitForEnd(mStartFragment, TestFragment.REENTER));
}
public void testAddRemoved() throws Throwable {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return;
}
launchStartFragment();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mEndFragment = TestFragment.create(R.layout.fragment_end);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mEndFragment)
.replace(R.id.content, mStartFragment)
.addToBackStack(null)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForStart(mStartFragment, TestFragment.ENTER);
assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
assertFalse(mEndFragment.wasStartCalled(TestFragment.ENTER));
assertFalse(mEndFragment.wasStartCalled(TestFragment.EXIT));
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mActivity.getSupportFragmentManager().popBackStack();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
waitForStart(mStartFragment, TestFragment.REENTER);
assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
assertFalse(mEndFragment.wasStartCalled(TestFragment.REENTER));
assertFalse(mEndFragment.wasStartCalled(TestFragment.RETURN));
}
private void launchStartFragment() throws Throwable {
getInstrumentation().waitForIdleSync();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mStartFragment = TestFragment.create(R.layout.fragment_start);
mActivity.getSupportFragmentManager().beginTransaction()
.replace(R.id.content, mStartFragment)
.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
});
assertTrue(waitForEnd(mStartFragment, TestFragment.ENTER));
mStartFragment.clearNotifications();
}
private boolean waitForStart(TestFragment fragment, int key) throws InterruptedException {
boolean started = fragment.waitForStart(key);
getInstrumentation().waitForIdleSync();
return started;
}
private boolean waitForEnd(TestFragment fragment, int key) throws InterruptedException {
if (!waitForStart(fragment, key)) {
return false;
}
final boolean ended = fragment.waitForEnd(key);
getInstrumentation().waitForIdleSync();
return ended;
}
}