Skip to content

Commit 8ccec33

Browse files
committedDec 4, 2023
[Predictive Transitions] Added predictive transition support for fragments and views to the Material motion library, and enabled it in shared axis fragment transition demo.
This allows all MaterialVisibility transitions to be predictive, although each individual transition must be opted-in in order to be predictive/seekable. Resolves #3619 PiperOrigin-RevId: 587108521
1 parent dfa474f commit 8ccec33

File tree

4 files changed

+56
-18
lines changed

4 files changed

+56
-18
lines changed
 

‎build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ ext {
3737
recyclerViewSelection : '1.0.0',
3838
resourceInspectionAnnotation : '1.0.1',
3939
resourceInspectionProcessor : '1.0.1',
40-
transition : '1.2.0',
40+
transition : '1.5.0-alpha04',
4141
vectorDrawable : '1.1.0',
4242
viewpager2 : '1.0.0',
4343
dynamicanimation : '1.0.0',

‎catalog/java/io/material/catalog/transition/TransitionSharedAxisDemoFragment.java

+43-17
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020

2121
import android.os.Bundle;
2222
import androidx.fragment.app.Fragment;
23+
import androidx.fragment.app.FragmentTransaction;
2324
import android.view.LayoutInflater;
2425
import android.view.View;
2526
import android.view.ViewGroup;
26-
import androidx.activity.OnBackPressedCallback;
2727
import androidx.annotation.LayoutRes;
2828
import androidx.annotation.NonNull;
2929
import androidx.annotation.Nullable;
30+
import androidx.transition.Transition;
31+
import androidx.transition.TransitionListenerAdapter;
3032
import com.google.android.material.transition.MaterialSharedAxis;
3133
import io.material.catalog.feature.DemoFragment;
3234

@@ -36,14 +38,6 @@ public class TransitionSharedAxisDemoFragment extends DemoFragment {
3638
private static final int LAYOUT_RES_ID_START = R.layout.cat_transition_shared_axis_start;
3739
private static final int LAYOUT_RES_ID_END = R.layout.cat_transition_shared_axis_end;
3840

39-
private final OnBackPressedCallback onBackPressedCallback =
40-
new OnBackPressedCallback(/* enabled= */ false) {
41-
@Override
42-
public void handleOnBackPressed() {
43-
replaceFragment(LAYOUT_RES_ID_START);
44-
}
45-
};
46-
4741
private SharedAxisHelper sharedAxisHelper;
4842

4943
@Override
@@ -58,12 +52,18 @@ public View onCreateDemoView(
5852
@Override
5953
public void onViewCreated(@NonNull View view, @Nullable Bundle bundle) {
6054
sharedAxisHelper = new SharedAxisHelper(view.findViewById(R.id.controls_layout));
61-
requireActivity().getOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);
6255

63-
replaceFragment(LAYOUT_RES_ID_START);
56+
Fragment fragment = TransitionSimpleLayoutFragment.newInstance(LAYOUT_RES_ID_START);
57+
58+
requireActivity()
59+
.getSupportFragmentManager()
60+
.beginTransaction()
61+
.replace(R.id.fragment_container, fragment)
62+
.commit();
6463

6564
sharedAxisHelper.setBackButtonOnClickListener(v -> replaceFragment(LAYOUT_RES_ID_START));
6665
sharedAxisHelper.setNextButtonOnClickListener(v -> replaceFragment(LAYOUT_RES_ID_END));
66+
sharedAxisHelper.updateButtonsEnabled(true);
6767
}
6868

6969
private void replaceFragment(@LayoutRes int layoutResId) {
@@ -73,14 +73,28 @@ private void replaceFragment(@LayoutRes int layoutResId) {
7373
// Set the transition as the Fragment's enter transition. This will be used when the fragment
7474
// is added to the container and re-used when the fragment is removed from the container.
7575
fragment.setEnterTransition(createTransition(entering));
76+
if (entering) {
77+
fragment.setReturnTransition(createTransition(false));
78+
} else {
79+
// Pop the backstack if manually transitioning to the start fragment to remove the end
80+
// fragment from the back stack without a back event.
81+
requireActivity().getSupportFragmentManager().popBackStack();
82+
}
83+
84+
getFragmentTransaction(fragment, entering).commit();
85+
}
7686

77-
getChildFragmentManager()
78-
.beginTransaction()
79-
.replace(R.id.fragment_container, fragment)
80-
.commit();
87+
private FragmentTransaction getFragmentTransaction(@NonNull Fragment fragment, boolean entering) {
88+
return entering
89+
? getFragmentTransaction(fragment).addToBackStack(/* name= */ null)
90+
: getFragmentTransaction(fragment);
91+
}
8192

82-
sharedAxisHelper.updateButtonsEnabled(!entering);
83-
onBackPressedCallback.setEnabled(entering);
93+
private FragmentTransaction getFragmentTransaction(@NonNull Fragment fragment) {
94+
return requireActivity()
95+
.getSupportFragmentManager()
96+
.beginTransaction()
97+
.replace(R.id.fragment_container, fragment);
8498
}
8599

86100
private MaterialSharedAxis createTransition(boolean entering) {
@@ -92,6 +106,18 @@ private MaterialSharedAxis createTransition(boolean entering) {
92106
// Fragment's layout.
93107
transition.addTarget(R.id.start_root);
94108
transition.addTarget(R.id.end_root);
109+
transition.addListener(
110+
new TransitionListenerAdapter() {
111+
@Override
112+
public void onTransitionStart(@NonNull Transition transition) {
113+
sharedAxisHelper.updateButtonsEnabled(!entering);
114+
}
115+
116+
@Override
117+
public void onTransitionCancel(@NonNull Transition transition) {
118+
sharedAxisHelper.updateButtonsEnabled(entering);
119+
}
120+
});
95121

96122
return transition;
97123
}

‎lib/java/com/google/android/material/transition/MaterialVisibility.java

+6
Original file line numberDiff line numberDiff line change
@@ -176,4 +176,10 @@ int getEasingThemeAttrResId(boolean appearing) {
176176
TimeInterpolator getDefaultEasingInterpolator(boolean appearing) {
177177
return AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR;
178178
}
179+
180+
// STRIP-FROM-PLATFORM-TRANSITIONS-PACKAGE
181+
@Override // STRIP-FROM-PLATFORM-TRANSITIONS-PACKAGE
182+
public boolean isSeekingSupported() { // STRIP-FROM-PLATFORM-TRANSITIONS-PACKAGE
183+
return true; // STRIP-FROM-PLATFORM-TRANSITIONS-PACKAGE
184+
} // STRIP-FROM-PLATFORM-TRANSITIONS-PACKAGE
179185
}

‎lib/java/com/google/android/material/transition/platform/MaterialVisibility.java

+6
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,10 @@ int getEasingThemeAttrResId(boolean appearing) {
181181
TimeInterpolator getDefaultEasingInterpolator(boolean appearing) {
182182
return AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR;
183183
}
184+
185+
186+
187+
188+
189+
184190
}

0 commit comments

Comments
 (0)
Please sign in to comment.