Fixed
Status Update
Comments
ap...@google.com <ap...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 87f4c988b713e43deef88a0df6a31c507f11b4a8
Author: Jeremy Woods <jbwoods@google.com>
Date: Wed May 27 11:20:32 2020
Use setMaxLifecycle for FragmentScenario moveToState
Current FragmentScenario uses ActivityScenario to for the moveToState
method. That means moving to STARTED does not work prior to API 23. This
also means that tests including DialogFragment cannot be moved to
CREATED, only ACTIVITY_CREATED.
This change uses setMaxLifecycle instead, so that FragmentScenario is
decoupled from ActivityScenario and there are no longer any restrictions
on moving to API 23 and DialogFragment's can be properly moved to
CREATED.
Test: ran tests on API 21 device and they passed
Bug: 156527405
Change-Id: I63d5facfcce9875acf06e39029686cb535cc3ea6
M fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioDialogFragmentTest.kt
M fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioTest.kt
M fragment/fragment-testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.java
https://android-review.googlesource.com/1318600
Branch: androidx-master-dev
commit 87f4c988b713e43deef88a0df6a31c507f11b4a8
Author: Jeremy Woods <jbwoods@google.com>
Date: Wed May 27 11:20:32 2020
Use setMaxLifecycle for FragmentScenario moveToState
Current FragmentScenario uses ActivityScenario to for the moveToState
method. That means moving to STARTED does not work prior to API 23. This
also means that tests including DialogFragment cannot be moved to
CREATED, only ACTIVITY_CREATED.
This change uses setMaxLifecycle instead, so that FragmentScenario is
decoupled from ActivityScenario and there are no longer any restrictions
on moving to API 23 and DialogFragment's can be properly moved to
CREATED.
Test: ran tests on API 21 device and they passed
Bug: 156527405
Change-Id: I63d5facfcce9875acf06e39029686cb535cc3ea6
M fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioDialogFragmentTest.kt
M fragment/fragment-testing/src/androidTest/java/androidx/fragment/app/testing/FragmentScenarioTest.kt
M fragment/fragment-testing/src/main/java/androidx/fragment/app/testing/FragmentScenario.java
an...@google.com <an...@google.com>
an...@google.com <an...@google.com> #3
This has been fixed internally and will be available in Fragment 1.3.0-alpha07
.
Description
I think we have two issues with misleading behaviour in android.transition.TransitionSet class.
1) setInterpolator of TransitionSet would not propagate an interpolator into the children transitions
Current implementation:
public TransitionSet setInterpolator(TimeInterpolator interpolator) {
return (TransitionSet) super.setInterpolator(interpolator);
}
How it should be (in the same style as setDuration method):
public TransitionSet setInterpolator(TimeInterpolator interpolator) {
super.setInterpolator(interpolator);
if (mTransitions != null) {
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
mTransitions.get(i).setInterpolator(mInterpolator);
}
}
return this;
}
And then in addTransition we should propagate current interpolator, not only duration
public TransitionSet addTransition(Transition transition) {
if (transition != null) {
mTransitions.add(transition);
transition.mParent = this;
if (mDuration >= 0) {
transition.setDuration(mDuration);
}
if (mInterpolator != null) {
transition.setInterpolator(mInterpolator);
}
}
return this;
}
2) Imagine situation when you have a set:
TransitionSet set = new TransitionSet().setDuration(300);
Then you add a lot of transitions into it (that why you want to specify duration not one by one but only once for the set via .setDuration(300)).
And then you also want to add one more transition but with a smaller duration:
Fade fadeIn = new Fade(Fade.IN);
set.addTransition(fadeIn);
fadeIn.setDuration(100);
But it not works, fadeIn is animating with duration 300.
Its a real usecase, sometimes we need a set with for example a lot of ChangeBounds with the same duration and one visibility in animation with a smaller duration(and one visibility out animation with smaller duration)
The reason of it is a clone method:
public TransitionSet clone() {
TransitionSet clone = (TransitionSet) super.clone();
clone.mTransitions = new ArrayList<Transition>();
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; ++i) {
clone.addTransition((Transition) mTransitions.get(i).clone());
}
return clone;
}
Here we call addTransition where we would override the duration of the transition again.
To fix it I suggest to change the line
clone.addTransition((Transition) mTransitions.get(i).clone());
to:
Transition transition = (Transition) mTransitions.get(i).clone();
clone.mTransitions.add(transition);
transition.mParent = clone;
Thanks,
Both issues were found during the development of transitions backport library Transitions-Everywhere