GuidedStepFragment transition and new features

This is a re-iterate of use cases of GuidedStepFragment, new
features including allowing app to add GuidedStepFragment
on top of other content with a covering background fragment;
using activity return transition to slide out content.

Switched from fragment animation to fragment transition. Using
transition will allow us to clone a support version of
GuidedStepFragment that is impossible under fragment animation.

Clearly defined three use cases:
1. When GuidedStepFragment is launched in empty activity.
2. When GuidedStepFragment is launched on top of other content.
3. When GuidedStepFragment is replacing exisitng GuidedStepFragment.

For case 2, we need background to cover bottom content.
Three cases has different transitions settings.  Case 1 does not
need Fragment enter transition because that's handled by activity
transition.

Bug 21504593
Bug 23976865

Change-Id: Id7a49d8706fb4b6d21f5f93db5ba9b21238b2c5e
diff --git a/v17/leanback/api/current.txt b/v17/leanback/api/current.txt
index 840be78..52239c8 100644
--- a/v17/leanback/api/current.txt
+++ b/v17/leanback/api/current.txt
@@ -177,13 +177,16 @@
   public class GuidedStepFragment extends android.app.Fragment {
     ctor public GuidedStepFragment();
     method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
     method public android.view.View getActionItemView(int);
     method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method protected int getContainerIdForBackground();
     method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
     method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
     method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
     method public int getSelectedActionPosition();
-    method protected boolean isEntryTransitionEnabled();
+    method public int getUiStyle();
     method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
     method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
     method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
@@ -191,10 +194,21 @@
     method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
     method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
     method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected android.app.Fragment onProvideBackgroundFragment();
+    method protected void onProvideFragmentTransitions();
     method public int onProvideTheme();
     method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method protected void setEntryTransitionEnabled(boolean);
     method public void setSelectedActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+  }
+
+  public static class GuidedStepFragment.GuidedStepBackgroundFragment extends android.app.Fragment {
+    ctor public GuidedStepFragment.GuidedStepBackgroundFragment();
+    method protected void onProvideFragmentTransitions();
   }
 
   public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
@@ -725,12 +739,6 @@
   }
 
   public abstract interface FragmentAnimationProvider {
-    method public abstract void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onActivityExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReturn(java.util.List<android.animation.Animator>);
     method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
     method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
   }
@@ -803,13 +811,7 @@
     method public android.widget.TextView getDescriptionView();
     method public android.widget.ImageView getIconView();
     method public android.widget.TextView getTitleView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
     method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
     method public void onImeAppearing(java.util.List<android.animation.Animator>);
     method public void onImeDisappearing(java.util.List<android.animation.Animator>);
     method public int onProvideLayoutId();
@@ -870,18 +872,12 @@
   public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
     ctor public GuidedActionsStylist();
     method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
     method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
     method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
     method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
     method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
     method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
     method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
     method public void onImeAppearing(java.util.List<android.animation.Animator>);
     method public void onImeDisappearing(java.util.List<android.animation.Animator>);
     method public int onProvideItemLayoutId();
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java b/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
index 00ebf4c..a3b1bfc 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
@@ -14,8 +14,10 @@
 package android.support.v17.leanback.transition;
 
 import android.R;
+import android.app.Fragment;
 import android.content.Context;
 import android.transition.ChangeTransform;
+import android.transition.Transition;
 import android.view.Window;
 import android.view.animation.AnimationUtils;
 
@@ -24,6 +26,14 @@
     TransitionHelperApi21() {
     }
 
+    public static void setEnterTransition(android.app.Fragment fragment, Object transition) {
+        fragment.setEnterTransition((Transition)transition);
+    }
+
+    public static void setExitTransition(android.app.Fragment fragment, Object transition) {
+       fragment.setExitTransition((Transition)transition);
+    }
+
     public static Object getSharedElementEnterTransition(Window window) {
         return window.getSharedElementEnterTransition();
     }
@@ -63,4 +73,8 @@
     public static Object createDefaultInterpolator(Context context) {
         return AnimationUtils.loadInterpolator(context, R.interpolator.fast_out_linear_in);
     }
+
+    public static Object createFadeAndShortSlide(int edge) {
+        return new FadeAndShortSlide(edge);
+    }
 }
diff --git a/v17/leanback/res/animator/lb_guidance_entry.xml b/v17/leanback/res/animator/lb_guidance_entry.xml
deleted file mode 100644
index e10d2ef..0000000
--- a/v17/leanback/res/animator/lb_guidance_entry.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="sequentially">
-
-    <set android:ordering="together">
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_delay"
-            android:propertyName="translationX"
-            android:valueFrom="@dimen/lb_guidance_entry_translationX"
-            android:valueTo="@dimen/lb_guidance_entry_translationX"
-            android:valueType="floatType" />
-
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_delay"
-            android:propertyName="alpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType" />
-    </set>
-
-    <set android:ordering="together">
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_duration"
-            android:interpolator="@android:interpolator/decelerate_quad"
-            android:propertyName="translationX"
-            android:valueFrom="@dimen/lb_guidance_entry_translationX"
-            android:valueTo="0.0"
-            android:valueType="floatType" />
-
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_duration"
-            android:interpolator="@android:interpolator/decelerate_quad"
-            android:propertyName="alpha"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType" />
-    </set>
-
-</set>
diff --git a/v17/leanback/res/animator/lb_guidedactions_entry.xml b/v17/leanback/res/animator/lb_guidedactions_entry.xml
deleted file mode 100644
index ec6c655..0000000
--- a/v17/leanback/res/animator/lb_guidedactions_entry.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="sequentially">
-
-    <set android:ordering="together">
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_delay"
-            android:propertyName="translationX"
-            android:valueFrom="@dimen/lb_guidedactions_entry_translationX"
-            android:valueTo="@dimen/lb_guidedactions_entry_translationX"
-            android:valueType="floatType" />
-
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_delay"
-            android:propertyName="alpha"
-            android:valueFrom="0.0"
-            android:valueTo="0.0"
-            android:valueType="floatType" />
-    </set>
-
-    <set android:ordering="together">
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_duration"
-            android:interpolator="@android:interpolator/decelerate_quad"
-            android:propertyName="translationX"
-            android:valueFrom="@dimen/lb_guidedactions_entry_translationX"
-            android:valueTo="0.0"
-            android:valueType="floatType" />
-
-        <objectAnimator
-            android:duration="@integer/lb_guidedstep_entry_animation_duration"
-            android:interpolator="@android:interpolator/decelerate_quad"
-            android:propertyName="alpha"
-            android:valueFrom="0.0"
-            android:valueTo="1.0"
-            android:valueType="floatType" />
-    </set>
-</set>
\ No newline at end of file
diff --git a/v17/leanback/res/animator/lb_guidedstep_slide_in_from_end.xml b/v17/leanback/res/animator/lb_guidedstep_slide_in_from_end.xml
deleted file mode 100644
index 1dacdbc..0000000
--- a/v17/leanback/res/animator/lb_guidedstep_slide_in_from_end.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together" >
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="translationX"
-        android:valueFrom="@dimen/lb_guidedstep_slide_end_distance"
-        android:valueTo="0.0"
-        android:valueType="floatType" />
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="alpha"
-        android:valueFrom="0.0"
-        android:valueTo="1.0"
-        android:valueType="floatType" />
-
-</set>
diff --git a/v17/leanback/res/animator/lb_guidedstep_slide_in_from_start.xml b/v17/leanback/res/animator/lb_guidedstep_slide_in_from_start.xml
deleted file mode 100644
index 3c01324..0000000
--- a/v17/leanback/res/animator/lb_guidedstep_slide_in_from_start.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together" >
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="translationX"
-        android:valueFrom="@dimen/lb_guidedstep_slide_start_distance"
-        android:valueTo="0.0"
-        android:valueType="floatType" />
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="alpha"
-        android:valueFrom="0.0"
-        android:valueTo="1.0"
-        android:valueType="floatType" />
-
-</set>
diff --git a/v17/leanback/res/animator/lb_guidedstep_slide_out_to_end.xml b/v17/leanback/res/animator/lb_guidedstep_slide_out_to_end.xml
deleted file mode 100644
index 879a0cf..0000000
--- a/v17/leanback/res/animator/lb_guidedstep_slide_out_to_end.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together" >
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="translationX"
-        android:valueFrom="0.0"
-        android:valueTo="@dimen/lb_guidedstep_slide_end_distance"
-        android:valueType="floatType" />
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="alpha"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType" />
-
-</set>
diff --git a/v17/leanback/res/animator/lb_guidedstep_slide_out_to_start.xml b/v17/leanback/res/animator/lb_guidedstep_slide_out_to_start.xml
deleted file mode 100644
index 4c9af82..0000000
--- a/v17/leanback/res/animator/lb_guidedstep_slide_out_to_start.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     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.
--->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
-    android:ordering="together" >
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="translationX"
-        android:valueFrom="0.0"
-        android:valueTo="@dimen/lb_guidedstep_slide_start_distance"
-        android:valueType="floatType" />
-
-    <objectAnimator
-        android:duration="@android:integer/config_longAnimTime"
-        android:propertyName="alpha"
-        android:valueFrom="1.0"
-        android:valueTo="0.0"
-        android:valueType="floatType" />
-
-</set>
diff --git a/v17/leanback/res/layout/lb_guidedactions.xml b/v17/leanback/res/layout/lb_guidedactions.xml
index 43617c9..f1a4d2a 100644
--- a/v17/leanback/res/layout/lb_guidedactions.xml
+++ b/v17/leanback/res/layout/lb_guidedactions.xml
@@ -17,19 +17,21 @@
 <!-- Layout for the settings list fragment -->
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent" >
+    android:layout_height="match_parent">
 
-    <RelativeLayout
-        style="?attr/guidedActionsContainerStyle" >
+    <android.support.v17.leanback.widget.NonOverlappingRelativeLayout
+        android:id="@+id/guidedactions_background"
+        android:transitionGroup="true"
+        style="?attr/guidedActionsContainerStyle" />
 
-        <FrameLayout
-            android:id="@+id/guidedactions_selector"
-            style="?attr/guidedActionsSelectorStyle" />
+    <android.support.v17.leanback.widget.NonOverlappingFrameLayout
+        android:id="@+id/guidedactions_selector"
+        android:transitionGroup="true"
+        style="?attr/guidedActionsSelectorStyle" />
 
-        <android.support.v17.leanback.widget.VerticalGridView
-            android:id="@+id/guidedactions_list"
-            style="?attr/guidedActionsListStyle" />
-
-    </RelativeLayout>
+    <android.support.v17.leanback.widget.VerticalGridView
+        android:transitionGroup="true"
+        android:id="@+id/guidedactions_list"
+        style="?attr/guidedActionsListStyle" />
 
 </RelativeLayout>
diff --git a/v17/leanback/res/layout/lb_guidedstep_background.xml b/v17/leanback/res/layout/lb_guidedstep_background.xml
new file mode 100644
index 0000000..66b68c4
--- /dev/null
+++ b/v17/leanback/res/layout/lb_guidedstep_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     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.
+-->
+<android.support.v17.leanback.widget.NonOverlappingView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/guidedstep_background"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="?attr/guidedStepBackground" />
+
diff --git a/v17/leanback/res/layout/lb_guidedstep_fragment.xml b/v17/leanback/res/layout/lb_guidedstep_fragment.xml
index 6e0b7ad..5e23c80 100644
--- a/v17/leanback/res/layout/lb_guidedstep_fragment.xml
+++ b/v17/leanback/res/layout/lb_guidedstep_fragment.xml
@@ -28,7 +28,11 @@
 
     <FrameLayout
         android:id="@+id/action_fragment"
-        android:layout_width="@dimen/lb_guidedactions_section_width_with_shadow"
+        android:layout_toEndOf="@+id/content_fragment"
+        android:clipToPadding="false"
+        android:clipChildren="false"
+        android:paddingLeft="@dimen/lb_guidedactions_section_shadow_width"
+        android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_alignParentEnd="true" />
 
diff --git a/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml b/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
new file mode 100644
index 0000000..d2d7afa
--- /dev/null
+++ b/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" >
+  <slide
+      android:interpolator="@android:interpolator/fast_out_linear_in"
+      android:duration="350"
+      android:slideEdge="left">
+        <targets>
+            <target android:targetId="@id/guidance_icon" />
+            <target android:targetId="@id/guidance_title" />
+            <target android:targetId="@id/guidance_breadcrumb" />
+            <target android:targetId="@id/guidance_description" />
+        </targets>
+  </slide>
+  <slide
+      android:interpolator="@android:interpolator/fast_out_linear_in"
+      android:duration="350"
+      android:slideEdge="right">
+        <targets>
+            <target android:targetId="@id/guidedactions_background" />
+            <target android:targetId="@id/guidedactions_selector" />
+            <target android:targetId="@id/guidedactions_list" />
+        </targets>
+  </slide>
+</transitionSet>
\ No newline at end of file
diff --git a/v17/leanback/res/values/attrs.xml b/v17/leanback/res/values/attrs.xml
index 10ee282..551e3f4 100644
--- a/v17/leanback/res/values/attrs.xml
+++ b/v17/leanback/res/values/attrs.xml
@@ -312,22 +312,9 @@
              Theme attribute used to inspect theme inheritance. -->
         <attr name="guidedStepThemeFlag" format="boolean" />
 
-        <!-- Theme attribute for the animation used when a guided step element is animated in on
-             fragment stack push. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedstep_slide_in_from_end}. -->
-        <attr name="guidedStepEntryAnimation" format="reference" />
-        <!-- Theme attribute for the animation used when a guided step element is animated out on
-             fragment stack push. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedstep_slide_out_to_start}. -->
-        <attr name="guidedStepExitAnimation" format="reference" />
-        <!-- Theme attribute for the animation used when a guided step element is animated in on
-             fragment stack pop. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedstep_slide_in_from_start}. -->
-        <attr name="guidedStepReentryAnimation" format="reference" />
-        <!-- Theme attribute for the animation used when a guided step element is animated out on
-             fragment stack pop. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedstep_slide_out_to_end}. -->
-        <attr name="guidedStepReturnAnimation" format="reference" />
+        <!-- Theme attribute of background drawable used by GuidedStepFragment. -->
+        <attr name="guidedStepBackground" format="reference|color" />
+
         <!-- Theme attribute for the animation used when a guided step element is animated in
              response to the IME appearing. Default is {@link
              android.support.v17.leanback.R.animator#lb_guidedstep_slide_up}. -->
@@ -337,10 +324,6 @@
              android.support.v17.leanback.R.animator#lb_guidedstep_slide_down}. -->
         <attr name="guidedStepImeDisappearingAnimation" format="reference" />
 
-        <!-- Theme attribute for the animation used when the guidance is animated in at activity
-             start. Default is {@link android.support.v17.leanback.R.animator#lb_guidance_entry}.
-             -->
-        <attr name="guidanceEntryAnimation" format="reference" />
         <!-- Theme attribute for the style of the main container in a GuidanceStylist. Default is
              {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidanceContainerStyle}.-->
         <attr name="guidanceContainerStyle" format="reference" />
@@ -357,10 +340,6 @@
              {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidanceIconStyle}. -->
         <attr name="guidanceIconStyle" format="reference" />
 
-        <!-- Theme attribute for the animation used in a GuidedActionsPresenter when the actions
-             list is animated in at activity start. Default is {@link
-             android.support.v17.leanback.R.animator#lb_guidedactions_entry}. -->
-        <attr name="guidedActionsEntryAnimation" format="reference" />
         <!-- Theme attribute for the animation used in a GuidedActionsPresenter when the action
              selector is animated in at activity start. Default is {@link
              android.support.v17.leanback.R.animator#lb_guidedactions_selector_show}. -->
diff --git a/v17/leanback/res/values/dimens.xml b/v17/leanback/res/values/dimens.xml
index a05a6fc..8b10d5d 100644
--- a/v17/leanback/res/values/dimens.xml
+++ b/v17/leanback/res/values/dimens.xml
@@ -233,7 +233,7 @@
 
     <dimen name="lb_guidedactions_entry_translationX">384dp</dimen>
     <dimen name="lb_guidedactions_section_width">384dp</dimen>
-    <dimen name="lb_guidedactions_section_width_with_shadow">400dp</dimen>
+    <dimen name="lb_guidedactions_section_shadow_width">16dp</dimen>
     <dimen name="lb_guidedactions_elevation">12dp</dimen>
     <dimen name="lb_guidedactions_selector_min_height">8dp</dimen>
     <dimen name="lb_guidedactions_vertical_padding">12dp</dimen>
diff --git a/v17/leanback/res/values/ids.xml b/v17/leanback/res/values/ids.xml
index 8bc7324..b9da732 100644
--- a/v17/leanback/res/values/ids.xml
+++ b/v17/leanback/res/values/ids.xml
@@ -20,6 +20,8 @@
      <item type="id" name="lb_slide_transition_value" />
      <item type="id" name="transitionPosition" />
 
+     <item type="id" name="lb_guidedstep_background" />
+
      <item type="id" name="lb_control_play_pause" />
      <item type="id" name="lb_control_fast_forward" />
      <item type="id" name="lb_control_fast_rewind" />
diff --git a/v17/leanback/res/values/styles.xml b/v17/leanback/res/values/styles.xml
index 31b44e0..447ad22 100644
--- a/v17/leanback/res/values/styles.xml
+++ b/v17/leanback/res/values/styles.xml
@@ -424,15 +424,16 @@
 
     <!-- Style for the container view in a GuidedActionsStylist's default layout. -->
     <style name="Widget.Leanback.GuidedActionsContainerStyle">
+        <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
         <item name="android:layout_width">@dimen/lb_guidedactions_section_width</item>
         <item name="android:layout_height">match_parent</item>
         <item name="android:layout_alignParentEnd">true</item>
         <item name="android:background">@color/lb_guidedactions_background</item>
-        <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
     </style>
 
     <!-- Style for the selector view in a GuidedActionsStylist's default layout. -->
     <style name="Widget.Leanback.GuidedActionsSelectorStyle">
+        <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">@dimen/lb_guidedactions_selector_min_height</item>
         <item name="android:layout_centerVertical">true</item>
@@ -442,6 +443,7 @@
 
     <!-- Style for the vertical grid of actions in a GuidedActionsStylist's default layout. -->
     <style name="Widget.Leanback.GuidedActionsListStyle">
+        <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">match_parent</item>
         <item name="android:focusable">true</item>
diff --git a/v17/leanback/res/values/themes.xml b/v17/leanback/res/values/themes.xml
index d994b3f..2e47e56 100644
--- a/v17/leanback/res/values/themes.xml
+++ b/v17/leanback/res/values/themes.xml
@@ -116,14 +116,12 @@
     <style name="Theme.Leanback.GuidedStep" parent="Theme.LeanbackBase">
         <item name="guidedStepThemeFlag">true</item>
 
-        <item name="guidedStepEntryAnimation">@animator/lb_guidedstep_slide_in_from_end</item>
-        <item name="guidedStepExitAnimation">@animator/lb_guidedstep_slide_out_to_start</item>
-        <item name="guidedStepReentryAnimation">@animator/lb_guidedstep_slide_in_from_start</item>
-        <item name="guidedStepReturnAnimation">@animator/lb_guidedstep_slide_out_to_end</item>
+        <item name="android:windowEnterTransition">@transition/lb_guidedstep_activity_enter</item>
+
+        <item name="guidedStepBackground">?android:attr/windowBackground</item>
+
         <item name="guidedStepImeAppearingAnimation">@animator/lb_guidedstep_slide_up</item>
         <item name="guidedStepImeDisappearingAnimation">@animator/lb_guidedstep_slide_down</item>
-        <item name="guidanceEntryAnimation">@animator/lb_guidance_entry</item>
-        <item name="guidedActionsEntryAnimation">@animator/lb_guidedactions_entry</item>
 
         <item name="guidanceContainerStyle">@style/Widget.Leanback.GuidanceContainerStyle</item>
         <item name="guidanceIconStyle">@style/Widget.Leanback.GuidanceIconStyle</item>
diff --git a/v17/leanback/src/android/support/v17/leanback/animation/UntargetableAnimatorSet.java b/v17/leanback/src/android/support/v17/leanback/animation/UntargetableAnimatorSet.java
deleted file mode 100644
index 9cdbc0c..0000000
--- a/v17/leanback/src/android/support/v17/leanback/animation/UntargetableAnimatorSet.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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.v17.leanback.animation;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.TimeInterpolator;
-
-import java.util.ArrayList;
-
-/**
- * Custom fragment animations supplied by Fragment.onCreateAnimator have their targets set to the
- * fragment's main view by the fragment manager.  Sometimes, this isn't what you want; you may be
- * supplying a heterogeneous collection of animations that already have targets. This class helps
- * you return such a collection of animations from onCreateAnimator without having their targets
- * reset.
- *
- * Note that one does not simply subclass AnimatorSet and override setTarget() because AnimatorSet
- * is final.
- * @hide
- */
-public class UntargetableAnimatorSet extends Animator {
-
-    private final AnimatorSet mAnimatorSet;
-
-    public UntargetableAnimatorSet(AnimatorSet animatorSet) {
-        mAnimatorSet = animatorSet;
-    }
-
-    @Override
-    public void addListener(Animator.AnimatorListener listener) {
-        mAnimatorSet.addListener(listener);
-    }
-
-    @Override
-    public void cancel() {
-        mAnimatorSet.cancel();
-    }
-
-    @Override
-    public Animator clone() {
-        return mAnimatorSet.clone();
-    }
-
-    @Override
-    public void end() {
-        mAnimatorSet.end();
-    }
-
-    @Override
-    public long getDuration() {
-        return mAnimatorSet.getDuration();
-    }
-
-    @Override
-    public ArrayList<Animator.AnimatorListener> getListeners() {
-        return mAnimatorSet.getListeners();
-    }
-
-    @Override
-    public long getStartDelay() {
-        return mAnimatorSet.getStartDelay();
-    }
-
-    @Override
-    public boolean isRunning() {
-        return mAnimatorSet.isRunning();
-    }
-
-    @Override
-    public boolean isStarted() {
-        return mAnimatorSet.isStarted();
-    }
-
-    @Override
-    public void removeAllListeners() {
-        mAnimatorSet.removeAllListeners();
-    }
-
-    @Override
-    public void removeListener(Animator.AnimatorListener listener) {
-        mAnimatorSet.removeListener(listener);
-    }
-
-    @Override
-    public Animator setDuration(long duration) {
-        return mAnimatorSet.setDuration(duration);
-    }
-
-    @Override
-    public void setInterpolator(TimeInterpolator value) {
-        mAnimatorSet.setInterpolator(value);
-    }
-
-    @Override
-    public void setStartDelay(long startDelay) {
-        mAnimatorSet.setStartDelay(startDelay);
-    }
-
-    @Override
-    public void setTarget(Object target) {
-        // ignore
-    }
-
-    @Override
-    public void setupEndValues() {
-        mAnimatorSet.setupEndValues();
-    }
-
-    @Override
-    public void setupStartValues() {
-        mAnimatorSet.setupStartValues();
-    }
-
-    @Override
-    public void start() {
-        mAnimatorSet.start();
-    }
-}
-
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
index 170aa63..416d418 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
@@ -21,9 +21,10 @@
 import android.app.FragmentTransaction;
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
-import android.support.v17.leanback.animation.UntargetableAnimatorSet;
+import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.widget.GuidanceStylist;
 import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
@@ -34,6 +35,7 @@
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.ContextThemeWrapper;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -52,7 +54,7 @@
  * <p>
  * <h3>Basic Usage</h3>
  * <p>
- * Clients of GuidedStepFragment typically create a custom subclass to attach to their Activities.
+ * Clients of GuidedStepFragment must create a custom subclass to attach to their Activities.
  * This custom subclass provides the information necessary to construct the user interface and
  * respond to user actions. At a minimum, subclasses should override:
  * <ul>
@@ -61,6 +63,14 @@
  * <li>{@link #onGuidedActionClicked}, to respond to those actions</li>
  * </ul>
  * <p>
+ * Clients use following helper functions to add GuidedStepFragment to Activity or FragmentManager:
+ * <ul>
+ * <li>{@link #addAsRoot(Activity, GuidedStepFragment, int)}, to be called during Activity onCreate,
+ * adds GuidedStepFragment as the first Fragment in activity.</li>
+ * <li>{@link #add(FragmentManager, GuidedStepFragment)} or {@link #add(FragmentManager,
+ * GuidedStepFragment, int)}, to add GuidedStepFragment on top of existing Fragments or
+ * replacing existing GuidedStepFragment when moving forward to next step.</li>
+ * </ul>
  * <h3>Theming and Stylists</h3>
  * <p>
  * GuidedStepFragment delegates its visual styling to classes called stylists. The {@link
@@ -106,8 +116,9 @@
  * <p>
  * <i>Note: Currently GuidedStepFragments grouped in this way must all be defined programmatically,
  * rather than in XML. This restriction may be removed in the future.</i>
- * <p>
+ *
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepTheme
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepBackground
  * @see GuidanceStylist
  * @see GuidanceStylist.Guidance
  * @see GuidedAction
@@ -118,24 +129,77 @@
 
     private static final String TAG_LEAN_BACK_ACTIONS_FRAGMENT = "leanBackGuidedStepFragment";
     private static final String EXTRA_ACTION_SELECTED_INDEX = "selectedIndex";
-    private static final String EXTRA_ACTION_ENTRY_TRANSITION_ENABLED = "entryTransitionEnabled";
-    private static final String EXTRA_ENTRY_TRANSITION_PERFORMED = "entryTransitionPerformed";
+
+    /**
+     * Fragment argument name for UI style.  The argument value is persisted in fragment state.
+     * The value is initially {@link #UI_STYLE_DEFAULT} and might be changed in one of the three
+     * helper functions:
+     * <ul>
+     * <li>{@link #addAsRoot(Activity, GuidedStepFragment, int)}</li>
+     * <li>{@link #add(FragmentManager, GuidedStepFragment)} or {@link #add(FragmentManager,
+     * GuidedStepFragment, int)}</li>
+     * </ul>
+     * <p>
+     * Argument value can be either:
+     * <ul>
+     * <li>{@link #UI_STYLE_DEFAULT}</li>
+     * <li>{@link #UI_STYLE_ENTRANCE}</li>
+     * <li>{@link #UI_STYLE_ACTIVITY_ROOT}</li>
+     * </ul>
+     */
+    public static final String EXTRA_UI_STYLE = "uiStyle";
+
+    /**
+     * Default argument value for argument {@link #EXTRA_UI_STYLE}.  This the default value assigned
+     * in GuidedStepFragment constructor.  This is the case that we use GuidedStepFragment to
+     * replace another existing GuidedStepFragment when moving forward to next step. Default
+     * behavior of this style is:
+     * <ul>
+     * <li> Enter transition slides in from END(right), exit transition slide out to START(left).
+     * </li>
+     * <li> No background, see {@link #onProvideBackgroundFragment()}.</li>
+     * </ul>
+     */
+    public static final int UI_STYLE_DEFAULT = 0;
+
+    /**
+     * Argument value for argument {@link #EXTRA_UI_STYLE}.  This is the case that we show
+     * GuidedStepFragment on top of other content.  The default behavior of this style:
+     * <ul>
+     * <li>Enter transition slides in from two sides, exit transition is inherited from
+     * {@link #UI_STYLE_DEFAULT}.  Note: Changing exit transition by uiStyle is not working because
+     * fragment transition asks for exit transition before uiStyle is restored in Fragment
+     * .onCreate().</li>
+     * <li> {@link #onProvideBackgroundFragment()} will create {@link GuidedStepBackgroundFragment}
+     * to covering underneath content.</li>
+     * </ul>
+     */
+    public static final int UI_STYLE_ENTRANCE = 1;
+
+    /**
+     * Argument value for argument {@link #EXTRA_UI_STYLE}.  This is the case that we show first
+     * GuidedStepFragment in a separate activity.  The default behavior of this style:
+     * <ul>
+     * <li> Enter transition is assigned null (will rely on activity transition), exit transition is
+     * same as {@link #UI_STYLE_DEFAULT}.  Note: Changing exit transition by ui style is not working
+     * because fragment transition asks for exit transition before uiStyle is restored in
+     * Fragment.onCreate().</li>
+     * <li> No background, see {@link #onProvideBackgroundFragment()}.
+     * </ul>
+     */
+    public static final int UI_STYLE_ACTIVITY_ROOT = 2;
+
     private static final String TAG = "GuidedStepFragment";
-    private static final boolean DEBUG = true;
-    private static final int ANIMATION_FRAGMENT_ENTER = 1;
-    private static final int ANIMATION_FRAGMENT_EXIT = 2;
-    private static final int ANIMATION_FRAGMENT_ENTER_POP = 3;
-    private static final int ANIMATION_FRAGMENT_EXIT_POP = 4;
+    private static final boolean DEBUG = false;
 
     private int mTheme;
+    private ContextThemeWrapper mThemeWrapper;
     private GuidanceStylist mGuidanceStylist;
     private GuidedActionsStylist mActionsStylist;
     private GuidedActionAdapter mAdapter;
     private VerticalGridView mListView;
     private List<GuidedAction> mActions = new ArrayList<GuidedAction>();
     private int mSelectedIndex = -1;
-    private boolean mEntryTransitionPerformed;
-    private boolean mEntryTransitionEnabled = true;
 
     public GuidedStepFragment() {
         // We need to supply the theme before any potential call to onInflate in order
@@ -143,6 +207,7 @@
         mTheme = onProvideTheme();
         mGuidanceStylist = onCreateGuidanceStylist();
         mActionsStylist = onCreateActionsStylist();
+        onProvideFragmentTransitions();
     }
 
     /**
@@ -218,7 +283,10 @@
 
     /**
      * Adds the specified GuidedStepFragment to the fragment stack, replacing any existing
-     * GuidedStepFragments in the stack, and configuring the fragment-to-fragment custom animations.
+     * GuidedStepFragments in the stack, and configuring the fragment-to-fragment custom
+     * transitions.
+     * <li>If current fragment on stack is GuidedStepFragment: assign {@link #UI_STYLE_DEFAULT}
+     * <li>If current fragment on stack is not GuidedStepFragment: assign {@link #UI_STYLE_ENTRANCE}
      * <p>
      * Note: currently fragments added using this method must be created programmatically rather
      * than via XML.
@@ -230,19 +298,61 @@
         return add(fragmentManager, fragment, android.R.id.content);
     }
 
-    // Note, this method used to be public, but I haven't found a good way for a client
-    // to specify an id.
-    private static int add(FragmentManager fm, GuidedStepFragment f, int id) {
-        boolean inGuidedStep = getCurrentGuidedStepFragment(fm) != null;
-        FragmentTransaction ft = fm.beginTransaction();
+    /**
+     * Adds the specified GuidedStepFragment to the fragment stack, replacing any existing
+     * GuidedStepFragments in the stack, and configuring the fragment-to-fragment custom
+     * transitions.
+     * <li>If current fragment on stack is GuidedStepFragment: assign {@link #UI_STYLE_DEFAULT}
+     * <li>If current fragment on stack is not GuidedStepFragment: assign {@link #UI_STYLE_ENTRANCE}
+     * <p>
+     * Note: currently fragments added using this method must be created programmatically rather
+     * than via XML.
+     * @param fragmentManager The FragmentManager to be used in the transaction.
+     * @param fragment The GuidedStepFragment to be inserted into the fragment stack.
+     * @param id The id of container to add GuidedStepFragment, can be android.R.id.content.
+     * @return The ID returned by the call FragmentTransaction.replace.
+     */
+    public static int add(FragmentManager fragmentManager, GuidedStepFragment fragment, int id) {
+        boolean inGuidedStep = getCurrentGuidedStepFragment(fragmentManager) != null;
+        FragmentTransaction ft = fragmentManager.beginTransaction();
 
-        if (inGuidedStep) {
-            ft.setCustomAnimations(ANIMATION_FRAGMENT_ENTER,
-                    ANIMATION_FRAGMENT_EXIT, ANIMATION_FRAGMENT_ENTER_POP,
-                    ANIMATION_FRAGMENT_EXIT_POP);
-            ft.addToBackStack(null);
+        ft.addToBackStack(null);
+        fragment.setUiStyle(inGuidedStep ? UI_STYLE_DEFAULT : UI_STYLE_ENTRANCE);
+        initialBackground(fragment, id, ft);
+        return ft.replace(id, fragment, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
+    }
+
+    /**
+     * Adds the specified GuidedStepFragment as content of Activity.
+     * {@link #UI_STYLE_ACTIVITY_ROOT} is assigned.
+     *
+     * Note: currently fragments added using this method must be created programmatically rather
+     * than via XML.
+     * @param activity The Activity to be used to insert GuidedstepFragment.
+     * @param fragment The GuidedStepFragment to be inserted into the fragment stack.
+     * @param id The id of container to add GuidedStepFragment, can be android.R.id.content.
+     * @return The ID returned by the call FragmentTransaction.replace.
+     */
+    public static int addAsRoot(Activity activity, GuidedStepFragment fragment, int id) {
+        // Workaround b/23764120: call getDecorView() to force requestFeature of ActivityTransition.
+        activity.getWindow().getDecorView();
+
+        FragmentManager fragmentManager = activity.getFragmentManager();
+        FragmentTransaction ft = fragmentManager.beginTransaction();
+        fragment.setUiStyle(UI_STYLE_ACTIVITY_ROOT);
+        initialBackground(fragment, id, ft);
+        return ft.replace(id, fragment, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
+    }
+
+    static void initialBackground(GuidedStepFragment fragment, int id, FragmentTransaction ft) {
+        Fragment backgroundFragment = fragment.onProvideBackgroundFragment();
+        if (backgroundFragment != null) {
+            if (Build.VERSION.SDK_INT < 23) {
+                // workaround b/22631964
+                ft.replace(id, new DummyFragment());
+            }
+            ft.replace(fragment.getContainerIdForBackground(), backgroundFragment);
         }
-        return ft.replace(id, f, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
     }
 
     /**
@@ -258,6 +368,20 @@
     }
 
     /**
+     * @hide
+     */
+    public static class DummyFragment extends Fragment {
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            final View v = new View(inflater.getContext());
+            v.setVisibility(View.GONE);
+            return v;
+        }
+    }
+
+    /**
      * Returns the GuidanceStylist that displays guidance information for the user.
      * @return The GuidanceStylist for this fragment.
      */
@@ -320,19 +444,171 @@
     }
 
     /**
+     * Called by Constructor to provide fragment transitions.  Default implementation creates
+     * a short slide and fade transition in code for {@link #UI_STYLE_DEFAULT} for both enter and
+     * exit transition.  When using style {@link #UI_STYLE_ENTRANCE}, enter transition is set
+     * to slide from both sides.  When using style {@link #UI_STYLE_ACTIVITY_ROOT}, enter
+     * transition is set to null and you should rely on activity transition.
+     * <p>
+     * Subclass may override and set its own fragment transition.  Note that because Context is not
+     * available when onProvideFragmentTransitions() is called, subclass will need use a cached
+     * static application context to load transition from xml.  Because the fragment view is
+     * removed during fragment transition, in general app cannot use two Visibility transition
+     * together.  Workaround is to create your own Visibility transition that controls multiple
+     * animators (e.g. slide and fade animation in one Transition class).
+     */
+    protected void onProvideFragmentTransitions() {
+        if (Build.VERSION.SDK_INT >= 21) {
+            TransitionHelper helper = TransitionHelper.getInstance();
+            if (getUiStyle() == UI_STYLE_DEFAULT) {
+                Object enterTransition = helper.createFadeAndShortSlide(Gravity.END);
+                helper.exclude(enterTransition, R.id.guidedactions_background, true);
+                helper.exclude(enterTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+                Object exitTransition = helper.createFadeAndShortSlide(Gravity.START);
+                helper.exclude(exitTransition, R.id.guidedactions_background, true);
+                helper.exclude(exitTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.getInstance().setExitTransition(this, exitTransition);
+            } else if (getUiStyle() == UI_STYLE_ENTRANCE) {
+                // TODO implement slide from/to two sides
+                Object enterTransition = helper.createFadeAndShortSlide(Gravity.END);
+                helper.exclude(enterTransition, R.id.guidedactions_background, true);
+                helper.exclude(enterTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+                // exit transition is unchanged, same as UI_STYLE_DEFAULT
+            } else if (getUiStyle() == UI_STYLE_ACTIVITY_ROOT) {
+                // for Activity root, we dont need enter transition, use activity transition
+                TransitionHelper.getInstance().setEnterTransition(this, null);
+                // exit transition is unchanged, same as UI_STYLE_DEFAULT
+            }
+        }
+    }
+
+    /**
+     * Default implementation of background for covering content bellow GuidedStepFragment.
+     * It uses current theme attribute guidedStepBackground which by default is read from
+     * android:windowBackground.
+     */
+    public static class GuidedStepBackgroundFragment extends Fragment {
+        public GuidedStepBackgroundFragment() {
+            onProvideFragmentTransitions();
+        }
+
+        /**
+         * Sets fragment transitions for GuidedStepBackgroundFragment.  Can be overridden.
+         */
+        protected void onProvideFragmentTransitions() {
+            if (Build.VERSION.SDK_INT >= 21) {
+                TransitionHelper helper = TransitionHelper.getInstance();
+                Object enterTransition = helper.createFadeTransition(
+                        TransitionHelper.FADE_IN|TransitionHelper.FADE_OUT);
+                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+            }
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            Activity activity = getActivity();
+            Context themedContext = null;
+            if (!isGuidedStepTheme(activity)) {
+                // Look up the guidedStepTheme in the activity's currently specified theme.  If it
+                // exists, replace the theme with its value.
+                int resId = R.attr.guidedStepTheme;
+                TypedValue typedValue = new TypedValue();
+                boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
+                if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);
+                if (found) {
+                    ContextThemeWrapper themeWrapper =
+                            new ContextThemeWrapper(activity, typedValue.resourceId);
+                    if (isGuidedStepTheme(themeWrapper)) {
+                        themedContext = themeWrapper;
+                    }
+                }
+                if (!found) {
+                    Log.e(TAG, "GuidedStepFragment does not have an appropriate theme set.");
+                }
+            }
+
+            if (themedContext != null) {
+                inflater = inflater.cloneInContext(themedContext);
+            }
+
+            return inflater.inflate(R.layout.lb_guidedstep_background, container, false);
+        }
+    }
+
+    /**
+     * Creates a background fragment for {@link #UI_STYLE_ENTRANCE}, returns null for other cases.
+     * Subclass may override the default behavior, e.g. provide different backgrounds
+     * for {@link #UI_STYLE_DEFAULT}.  Background fragment will be inserted in {@link
+     * #getContainerIdForBackground()}.
+     *
+     * @return fragment that will be inserted bellow GuidedStepFragment.
+     */
+    protected Fragment onProvideBackgroundFragment() {
+        if (getUiStyle() == UI_STYLE_ENTRANCE) {
+            return new GuidedStepBackgroundFragment();
+        }
+        return null;
+    }
+
+    /**
+     * Returns container id for inserting {@link #onProvideBackgroundFragment()}.  The id should be
+     * different than container id for inserting GuidedStepFragment.
+     * Default value is {@link R.id#lb_guidedstep_background}.  Subclass may override.
+     * @return container id for inserting {@link #onProvideBackgroundFragment()}
+     */
+    protected int getContainerIdForBackground() {
+        return R.id.lb_guidedstep_background;
+    }
+
+
+    /**
+     * Set UI style to fragment arguments,  UI style cannot be changed after initialization.
+     * @param style {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_DEFAULT} or
+     * {@link #UI_STYLE_ENTRANCE}.
+     */
+    public void setUiStyle(int style) {
+        int oldStyle = getUiStyle();
+        Bundle arguments = getArguments();
+        if (arguments == null) {
+            arguments = new Bundle();
+        }
+        arguments.putInt(EXTRA_UI_STYLE, style);
+        // call setArgument() will validate if the fragment is already added.
+        setArguments(arguments);
+        if (style != oldStyle) {
+            onProvideFragmentTransitions();
+        }
+    }
+
+    /**
+     * Read UI style from fragment arguments.
+     *
+     * @return {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_DEFAULT} or
+     * {@link #UI_STYLE_ENTRANCE}.
+     */
+    public int getUiStyle() {
+        Bundle b = getArguments();
+        if (b == null) return UI_STYLE_DEFAULT;
+        return b.getInt(EXTRA_UI_STYLE, UI_STYLE_DEFAULT);
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         if (DEBUG) Log.v(TAG, "onCreate");
+        // Set correct transition from saved arguments.
+        onProvideFragmentTransitions();
         Bundle state = (savedInstanceState != null) ? savedInstanceState : getArguments();
         if (state != null) {
             if (mSelectedIndex == -1) {
                 mSelectedIndex = state.getInt(EXTRA_ACTION_SELECTED_INDEX, -1);
             }
-            mEntryTransitionEnabled = state.getBoolean(EXTRA_ACTION_ENTRY_TRANSITION_ENABLED, true);
-            mEntryTransitionPerformed = state.getBoolean(EXTRA_ENTRY_TRANSITION_PERFORMED, false);
         }
         mActions.clear();
         onCreateActions(mActions, savedInstanceState);
@@ -389,74 +665,9 @@
         super.onSaveInstanceState(outState);
         outState.putInt(EXTRA_ACTION_SELECTED_INDEX,
                 (mListView != null) ? getSelectedActionPosition() : mSelectedIndex);
-        outState.putBoolean(EXTRA_ACTION_ENTRY_TRANSITION_ENABLED, mEntryTransitionEnabled);
-        outState.putBoolean(EXTRA_ENTRY_TRANSITION_PERFORMED, mEntryTransitionPerformed);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onStart() {
-        if (DEBUG) Log.v(TAG, "onStart");
-        super.onStart();
-        if (isEntryTransitionEnabled() && !mEntryTransitionPerformed) {
-            mEntryTransitionPerformed = true;
-            performEntryTransition();
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
-        if (DEBUG) Log.v(TAG, "onCreateAnimator: " + transit + " " + enter + " " + nextAnim);
-        View mainView = getView();
-
-        ArrayList<Animator> animators = new ArrayList<Animator>();
-        switch (nextAnim) {
-            case ANIMATION_FRAGMENT_ENTER:
-                mGuidanceStylist.onFragmentEnter(animators);
-                mActionsStylist.onFragmentEnter(animators);
-                break;
-            case ANIMATION_FRAGMENT_EXIT:
-                mGuidanceStylist.onFragmentExit(animators);
-                mActionsStylist.onFragmentExit(animators);
-                break;
-            case ANIMATION_FRAGMENT_ENTER_POP:
-                mGuidanceStylist.onFragmentReenter(animators);
-                mActionsStylist.onFragmentReenter(animators);
-                break;
-            case ANIMATION_FRAGMENT_EXIT_POP:
-                mGuidanceStylist.onFragmentReturn(animators);
-                mActionsStylist.onFragmentReturn(animators);
-                break;
-            default:
-                return super.onCreateAnimator(transit, enter, nextAnim);
-        }
-
-        mEntryTransitionPerformed = true;
-        return createDummyAnimator(mainView, animators);
-    }
-
-    /**
-     * Returns whether entry transitions are enabled for this fragment.
-     * @return Whether entry transitions are enabled for this fragment.
-     */
-    protected boolean isEntryTransitionEnabled() {
-        return mEntryTransitionEnabled;
-    }
-
-    /**
-     * Sets whether entry transitions are enabled for this fragment.
-     * @param enabled Whether to enable entry transitions for this fragment.
-     */
-    protected void setEntryTransitionEnabled(boolean enabled) {
-        mEntryTransitionEnabled = enabled;
-    }
-
-    private boolean isGuidedStepTheme(Context context) {
+    private static boolean isGuidedStepTheme(Context context) {
         int resId = R.attr.guidedStepThemeFlag;
         TypedValue typedValue = new TypedValue();
         boolean found = context.getTheme().resolveAttribute(resId, typedValue, true);
@@ -465,7 +676,6 @@
     }
 
     private void resolveTheme() {
-        boolean hasThemeReference = true;
         // Look up the guidedStepTheme in the currently specified theme.  If it exists,
         // replace the theme with its value.
         Activity activity = getActivity();
@@ -477,15 +687,21 @@
             boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
             if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);
             if (found) {
-                if (isGuidedStepTheme(new ContextThemeWrapper(activity, typedValue.resourceId))) {
+                ContextThemeWrapper themeWrapper =
+                        new ContextThemeWrapper(activity, typedValue.resourceId);
+                if (isGuidedStepTheme(themeWrapper)) {
                     mTheme = typedValue.resourceId;
+                    mThemeWrapper = themeWrapper;
                 } else {
                     found = false;
+                    mThemeWrapper = null;
                 }
             }
             if (!found) {
                 Log.e(TAG, "GuidedStepFragment does not have an appropriate theme set.");
             }
+        } else if (mTheme != -1) {
+            mThemeWrapper = new ContextThemeWrapper(activity, mTheme);
         }
     }
 
@@ -493,8 +709,7 @@
         if (mTheme == -1) {
             return inflater;
         } else {
-            Context ctw = new ContextThemeWrapper(getActivity(), mTheme);
-            return inflater.cloneInContext(ctw);
+            return inflater.cloneInContext(mThemeWrapper);
         }
     }
 
@@ -507,37 +722,6 @@
         return 0;
     }
 
-    private void performEntryTransition() {
-        if (DEBUG) Log.v(TAG, "performEntryTransition");
-        final View mainView = getView();
-
-        mainView.setVisibility(View.INVISIBLE);
-
-        ArrayList<Animator> animators = new ArrayList<Animator>();
-        mGuidanceStylist.onActivityEnter(animators);
-        mActionsStylist.onActivityEnter(animators);
-
-        final Animator animator = createDummyAnimator(mainView, animators);
-
-        // We need to defer the animation until the first layout has occurred, as we don't yet
-        // know the final locations of views.
-        mainView.getViewTreeObserver().addOnGlobalLayoutListener(
-                new ViewTreeObserver.OnGlobalLayoutListener() {
-                    @Override
-                    public void onGlobalLayout() {
-                        mainView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
-                        if (!isAdded()) {
-                            // We have been detached before this could run,
-                            // so just bail
-                            return;
-                        }
-
-                        mainView.setVisibility(View.VISIBLE);
-                        animator.start();
-                    }
-                });
-    }
-
     private void runImeAnimations(boolean entering) {
         ArrayList<Animator> animators = new ArrayList<Animator>();
         if (entering) {
@@ -552,10 +736,4 @@
         set.start();
     }
 
-    private Animator createDummyAnimator(final View v, ArrayList<Animator> animators) {
-        final AnimatorSet animatorSet = new AnimatorSet();
-        animatorSet.playTogether(animators);
-        return new UntargetableAnimatorSet(animatorSet);
-    }
-
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
index 1c66d03..25ba30a 100644
--- a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
@@ -62,6 +62,10 @@
      */
     static interface TransitionHelperVersionImpl {
 
+        public void setEnterTransition(android.app.Fragment fragment, Object transition);
+
+        public void setExitTransition(android.app.Fragment fragment, Object transition);
+
         public Object getSharedElementEnterTransition(Window window);
 
         public Object getSharedElementReturnTransition(Window window);
@@ -90,6 +94,8 @@
 
         public Object createChangeBounds(boolean reparent);
 
+        public Object createFadeAndShortSlide(int edge);
+
         public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay);
 
         public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay);
@@ -135,12 +141,18 @@
     /**
      * Interface used when we do not support Transition animations.
      */
-    private static final class TransitionHelperStubImpl implements TransitionHelperVersionImpl {
+    static class TransitionHelperStubImpl implements TransitionHelperVersionImpl {
 
         private static class TransitionStub {
             TransitionListener mTransitionListener;
         }
 
+        public void setEnterTransition(android.app.Fragment fragment, Object transition) {
+        }
+
+        public void setExitTransition(android.app.Fragment fragment, Object transition) {
+        }
+
         @Override
         public Object getSharedElementEnterTransition(Window window) {
             return null;
@@ -202,6 +214,11 @@
         }
 
         @Override
+        public Object createFadeAndShortSlide(int edge) {
+            return new TransitionStub();
+        }
+
+        @Override
         public Object createSlide(int slideEdge) {
             return new TransitionStub();
         }
@@ -311,47 +328,7 @@
     /**
      * Implementation used on KitKat (and above).
      */
-    private static class TransitionHelperKitkatImpl implements TransitionHelperVersionImpl {
-
-        @Override
-        public Object getSharedElementEnterTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getSharedElementReturnTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getSharedElementExitTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getSharedElementReenterTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getEnterTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getReturnTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getExitTransition(Window window) {
-            return null;
-        }
-
-        @Override
-        public Object getReenterTransition(Window window) {
-            return null;
-        }
+    static class TransitionHelperKitkatImpl extends TransitionHelperStubImpl {
 
         @Override
         public Object createScene(ViewGroup sceneRoot, Runnable r) {
@@ -485,7 +462,15 @@
         }
     }
 
-    private static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl {
+    static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl {
+
+        public void setEnterTransition(android.app.Fragment fragment, Object transition) {
+            TransitionHelperApi21.setEnterTransition(fragment, transition);
+        }
+
+        public void setExitTransition(android.app.Fragment fragment, Object transition) {
+            TransitionHelperApi21.setExitTransition(fragment, transition);
+        }
 
         @Override
         public Object getSharedElementEnterTransition(Window window) {
@@ -508,6 +493,11 @@
         }
 
         @Override
+        public Object createFadeAndShortSlide(int edge) {
+            return TransitionHelperApi21.createFadeAndShortSlide(edge);
+        }
+
+        @Override
         public Object getEnterTransition(Window window) {
             return TransitionHelperApi21.getEnterTransition(window);
         }
@@ -691,4 +681,24 @@
     public Object loadTransition(Context context, int resId) {
         return mImpl.loadTransition(context, resId);
     }
+
+    public void setEnterTransition(android.app.Fragment fragment, Object transition) {
+        mImpl.setEnterTransition(fragment, transition);
+    }
+
+    public void setExitTransition(android.app.Fragment fragment, Object transition) {
+        mImpl.setExitTransition(fragment, transition);
+    }
+
+    public void setEnterTransition(android.support.v4.app.Fragment fragment, Object transition) {
+        fragment.setEnterTransition(transition);
+    }
+
+    public void setExitTransition(android.support.v4.app.Fragment fragment, Object transition) {
+        fragment.setExitTransition(transition);
+    }
+
+    public Object createFadeAndShortSlide(int edge) {
+        return mImpl.createFadeAndShortSlide(edge);
+    }
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/FragmentAnimationProvider.java b/v17/leanback/src/android/support/v17/leanback/widget/FragmentAnimationProvider.java
index b1f6169..1c5dcb5 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/FragmentAnimationProvider.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/FragmentAnimationProvider.java
@@ -26,50 +26,6 @@
 public interface FragmentAnimationProvider {
 
     /**
-     * Animates the entry of the fragment in the case where the activity is first being presented.
-     * @param animators A list of animations to which this provider's animations should be added.
-     */
-    public abstract void onActivityEnter(@NonNull List<Animator> animators);
-
-    /**
-     * Animates the exit of the fragment in the case where the activity is about to pause.
-     * @param animators A list of animations to which this provider's animations should be added.
-     */
-    public abstract void onActivityExit(@NonNull List<Animator> animators);
-
-    /**
-     * Animates the entry of the fragment in the case where there is a previous step fragment
-     * participating in the animation. Entry occurs when the fragment is preparing to be shown
-     * as it is pushed onto the back stack.
-     * @param animators A list of animations to which this provider's animations should be added.
-     */
-    public abstract void onFragmentEnter(@NonNull List<Animator> animators);
-
-    /**
-     * Animates the exit of the fragment in the case where there is a previous step fragment
-     * participating in the animation. Exit occurs when the fragment is preparing to be removed,
-     * hidden, or detached due to pushing another fragment onto the back stack.
-     * @param animators A list of animations to which this provider's animations should be added.
-     */
-    public abstract void onFragmentExit(@NonNull List<Animator> animators);
-
-    /**
-     * Animates the re-entry of the fragment in the case where there is a previous step fragment
-     * participating in the animation. Re-entry occurs when the fragment is preparing to be shown
-     * due to popping the back stack.
-     * @param animators A list of animations to which this provider's animations should be added.
-     */
-    public abstract void onFragmentReenter(@NonNull List<Animator> animators);
-
-    /**
-     * Animates the return of the fragment in the case where there is a previous step fragment
-     * participating in the animation. Return occurs when the fragment is preparing to be removed,
-     * hidden, or detached due to popping the back stack.
-     * @param animators A list of animations to which this provider's animations should be added.
-     */
-    public abstract void onFragmentReturn(@NonNull List<Animator> animators);
-
-    /**
      * Animates the fragment in response to the IME appearing.
      * @param animators A list of animations to which this provider's animations should be added.
      */
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java
index b95c114..fd05b8e 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java
@@ -54,11 +54,6 @@
  * </ul><p>
  * View IDs are allowed to be missing, in which case the corresponding views will be null.
  *
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceEntryAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepEntryAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepExitAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepReentryAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepReturnAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeAppearingAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeDisappearingAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidanceContainerStyle
@@ -225,67 +220,6 @@
      * {@inheritDoc}
      */
     @Override
-    public void onActivityEnter(@NonNull List<Animator> animators) {
-        addAnimator(animators, mTitleView, R.attr.guidanceEntryAnimation);
-        addAnimator(animators, mBreadcrumbView, R.attr.guidanceEntryAnimation);
-        addAnimator(animators, mDescriptionView, R.attr.guidanceEntryAnimation);
-        addAnimator(animators, mIconView, R.attr.guidanceEntryAnimation);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onActivityExit(@NonNull List<Animator> animators) {}
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentEnter(@NonNull List<Animator> animators) {
-        addAnimator(animators, mTitleView, R.attr.guidedStepEntryAnimation);
-        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepEntryAnimation);
-        addAnimator(animators, mDescriptionView, R.attr.guidedStepEntryAnimation);
-        addAnimator(animators, mIconView, R.attr.guidedStepEntryAnimation);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentExit(@NonNull List<Animator> animators) {
-        addAnimator(animators, mTitleView, R.attr.guidedStepExitAnimation);
-        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepExitAnimation);
-        addAnimator(animators, mDescriptionView, R.attr.guidedStepExitAnimation);
-        addAnimator(animators, mIconView, R.attr.guidedStepExitAnimation);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentReenter(@NonNull List<Animator> animators) {
-        addAnimator(animators, mTitleView, R.attr.guidedStepReentryAnimation);
-        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepReentryAnimation);
-        addAnimator(animators, mDescriptionView, R.attr.guidedStepReentryAnimation);
-        addAnimator(animators, mIconView, R.attr.guidedStepReentryAnimation);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentReturn(@NonNull List<Animator> animators) {
-        addAnimator(animators, mTitleView, R.attr.guidedStepReturnAnimation);
-        addAnimator(animators, mBreadcrumbView, R.attr.guidedStepReturnAnimation);
-        addAnimator(animators, mDescriptionView, R.attr.guidedStepReturnAnimation);
-        addAnimator(animators, mIconView, R.attr.guidedStepReturnAnimation);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public void onImeAppearing(@NonNull List<Animator> animators) {
         addAnimator(animators, mTitleView, R.attr.guidedStepImeAppearingAnimation);
         addAnimator(animators, mBreadcrumbView, R.attr.guidedStepImeAppearingAnimation);
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
index 07dd4c9..ae281b8 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
@@ -87,13 +87,8 @@
  * be a subclass of {@link android.widget.EditText}, and should satisfy the {@link
  * ImeKeyMonitor} interface.
  *
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepEntryAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepExitAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepReentryAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepReturnAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeAppearingAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeDisappearingAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsEntryAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorShowAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorHideAnimation
  * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsContainerStyle
@@ -459,56 +454,6 @@
      * {@inheritDoc}
      */
     @Override
-    public void onActivityEnter(@NonNull List<Animator> animators) {
-        animators.add(createAnimator(mMainView, R.attr.guidedActionsEntryAnimation));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onActivityExit(@NonNull List<Animator> animators) {}
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentEnter(@NonNull List<Animator> animators) {
-        animators.add(createAnimator(mActionsGridView, R.attr.guidedStepEntryAnimation));
-        animators.add(createAnimator(mSelectorView, R.attr.guidedStepEntryAnimation));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentExit(@NonNull List<Animator> animators) {
-        animators.add(createAnimator(mActionsGridView, R.attr.guidedStepExitAnimation));
-        animators.add(createAnimator(mSelectorView, R.attr.guidedStepExitAnimation));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentReenter(@NonNull List<Animator> animators) {
-        animators.add(createAnimator(mActionsGridView, R.attr.guidedStepReentryAnimation));
-        animators.add(createAnimator(mSelectorView, R.attr.guidedStepReentryAnimation));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void onFragmentReturn(@NonNull List<Animator> animators) {
-        animators.add(createAnimator(mActionsGridView, R.attr.guidedStepReturnAnimation));
-        animators.add(createAnimator(mSelectorView, R.attr.guidedStepReturnAnimation));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public void onImeAppearing(@NonNull List<Animator> animators) {
         animators.add(createAnimator(mActionsGridView, R.attr.guidedStepImeAppearingAnimation));
         animators.add(createAnimator(mSelectorView, R.attr.guidedStepImeAppearingAnimation));