leanback: fix NPE of transition listener and clean up

We actually can not support setListener(null) because transition
class only provides addListener() and removeListener().  Details fragment
adds a transition listener with null callback to the sharedelemententer
transition.  The bug was not discovered because leanback theme always
specifies the sharedElementReturn transition.  When sharedElementReturn
transition is not specified. When pressing back,  the null callback listener
of sharedElementEnter transition are cloned into sharedElementReturn transition.

Now we switch to use addListener/removeListener and change
TransitionHelper methods to static.

Bug 24202013

Change-Id: I7cc918013e4a357a59987ea9727bc03c15cb0097
diff --git a/v17/leanback/common/android/support/v17/leanback/transition/TransitionListener.java b/v17/leanback/common/android/support/v17/leanback/transition/TransitionListener.java
index 80f05ed..6a4056e 100644
--- a/v17/leanback/common/android/support/v17/leanback/transition/TransitionListener.java
+++ b/v17/leanback/common/android/support/v17/leanback/transition/TransitionListener.java
@@ -19,10 +19,20 @@
  */
 public class TransitionListener {
 
+    protected Object mImpl;
+
     public void onTransitionStart(Object transition) {
     }
 
     public void onTransitionEnd(Object transition) {
     }
 
+    public void onTransitionCancel(Object transition) {
+    }
+
+    public void onTransitionPause(Object transition) {
+    }
+
+    public void onTransitionResume(Object transition) {
+    }
 }
diff --git a/v17/leanback/kitkat/android/support/v17/leanback/transition/TransitionHelperKitkat.java b/v17/leanback/kitkat/android/support/v17/leanback/transition/TransitionHelperKitkat.java
index b4b6abe..221b84a 100644
--- a/v17/leanback/kitkat/android/support/v17/leanback/transition/TransitionHelperKitkat.java
+++ b/v17/leanback/kitkat/android/support/v17/leanback/transition/TransitionHelperKitkat.java
@@ -185,9 +185,12 @@
         ((Transition) transition).addTarget(targetView);
     }
 
-    static void setTransitionListener(Object transition, final TransitionListener listener) {
+    static void addTransitionListener(Object transition, final TransitionListener listener) {
+        if (listener == null) {
+            return;
+        }
         Transition t = (Transition) transition;
-        t.addListener(new Transition.TransitionListener() {
+        listener.mImpl = new Transition.TransitionListener() {
 
             @Override
             public void onTransitionStart(Transition transition) {
@@ -196,10 +199,12 @@
 
             @Override
             public void onTransitionResume(Transition transition) {
+                listener.onTransitionResume(transition);
             }
 
             @Override
             public void onTransitionPause(Transition transition) {
+                listener.onTransitionPause(transition);
             }
 
             @Override
@@ -209,8 +214,19 @@
 
             @Override
             public void onTransitionCancel(Transition transition) {
+                listener.onTransitionCancel(transition);
             }
-        });
+        };
+        t.addListener((Transition.TransitionListener) listener.mImpl);
+    }
+
+    static void removeTransitionListener(Object transition, final TransitionListener listener) {
+        if (listener == null || listener.mImpl == null) {
+            return;
+        }
+        Transition t = (Transition) transition;
+        t.removeListener((Transition.TransitionListener) listener.mImpl);
+        listener.mImpl = null;
     }
 
     static void runTransition(Object scene, Object transition) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
index 5b2deac..c878a86 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseFragment.java
@@ -30,8 +30,6 @@
     private boolean mEntranceTransitionPreparePending = false;
     private Object mEntranceTransition;
 
-    static TransitionHelper sTransitionHelper = TransitionHelper.getInstance();
-
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
@@ -176,7 +174,7 @@
         if (mEntranceTransition == null) {
             return;
         }
-        sTransitionHelper.setTransitionListener(mEntranceTransition, new TransitionListener() {
+        TransitionHelper.addTransitionListener(mEntranceTransition, new TransitionListener() {
             @Override
             public void onTransitionEnd(Object transition) {
                 mEntranceTransition = null;
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
index a72bb5b..b9c7d58 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseSupportFragment.java
@@ -32,8 +32,6 @@
     private boolean mEntranceTransitionPreparePending = false;
     private Object mEntranceTransition;
 
-    static TransitionHelper sTransitionHelper = TransitionHelper.getInstance();
-
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
@@ -178,7 +176,7 @@
         if (mEntranceTransition == null) {
             return;
         }
-        sTransitionHelper.setTransitionListener(mEntranceTransition, new TransitionListener() {
+        TransitionHelper.addTransitionListener(mEntranceTransition, new TransitionListener() {
             @Override
             public void onTransitionEnd(Object transition) {
                 mEntranceTransition = null;
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
index 7e8f02f..8c417a4 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
@@ -425,7 +425,7 @@
                 if (mBrowseTransitionListener != null) {
                     mBrowseTransitionListener.onHeadersTransitionStart(withHeaders);
                 }
-                sTransitionHelper.runTransition(withHeaders ? mSceneWithHeaders : mSceneWithoutHeaders,
+                TransitionHelper.runTransition(withHeaders ? mSceneWithHeaders : mSceneWithoutHeaders,
                         mHeadersTransition);
                 if (mHeadersBackStackEnabled) {
                     if (!withHeaders) {
@@ -622,19 +622,19 @@
             mHeadersFragment.setBackgroundColor(mBrandColor);
         }
 
-        mSceneWithHeaders = sTransitionHelper.createScene(mBrowseFrame, new Runnable() {
+        mSceneWithHeaders = TransitionHelper.createScene(mBrowseFrame, new Runnable() {
             @Override
             public void run() {
                 showHeaders(true);
             }
         });
-        mSceneWithoutHeaders =  sTransitionHelper.createScene(mBrowseFrame, new Runnable() {
+        mSceneWithoutHeaders =  TransitionHelper.createScene(mBrowseFrame, new Runnable() {
             @Override
             public void run() {
                 showHeaders(false);
             }
         });
-        mSceneAfterEntranceTransition = sTransitionHelper.createScene(mBrowseFrame, new Runnable() {
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(mBrowseFrame, new Runnable() {
             @Override
             public void run() {
                 setEntranceTransitionEndState();
@@ -644,11 +644,11 @@
     }
 
     private void createHeadersTransition() {
-        mHeadersTransition = sTransitionHelper.loadTransition(getActivity(),
+        mHeadersTransition = TransitionHelper.loadTransition(getActivity(),
                 mShowingHeaders ?
                 R.transition.lb_browse_headers_in : R.transition.lb_browse_headers_out);
 
-        sTransitionHelper.setTransitionListener(mHeadersTransition, new TransitionListener() {
+        TransitionHelper.addTransitionListener(mHeadersTransition, new TransitionListener() {
             @Override
             public void onTransitionStart(Object transition) {
             }
@@ -891,14 +891,13 @@
 
     @Override
     protected Object createEntranceTransition() {
-        return sTransitionHelper.loadTransition(getActivity(),
+        return TransitionHelper.loadTransition(getActivity(),
                 R.transition.lb_browse_entrance_transition);
     }
 
     @Override
     protected void runEntranceTransition(Object entranceTransition) {
-        sTransitionHelper.runTransition(mSceneAfterEntranceTransition,
-                entranceTransition);
+        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
     }
 
     @Override
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
index 44deec4..fa7f61e 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
@@ -427,7 +427,7 @@
                 if (mBrowseTransitionListener != null) {
                     mBrowseTransitionListener.onHeadersTransitionStart(withHeaders);
                 }
-                sTransitionHelper.runTransition(withHeaders ? mSceneWithHeaders : mSceneWithoutHeaders,
+                TransitionHelper.runTransition(withHeaders ? mSceneWithHeaders : mSceneWithoutHeaders,
                         mHeadersTransition);
                 if (mHeadersBackStackEnabled) {
                     if (!withHeaders) {
@@ -624,19 +624,19 @@
             mHeadersSupportFragment.setBackgroundColor(mBrandColor);
         }
 
-        mSceneWithHeaders = sTransitionHelper.createScene(mBrowseFrame, new Runnable() {
+        mSceneWithHeaders = TransitionHelper.createScene(mBrowseFrame, new Runnable() {
             @Override
             public void run() {
                 showHeaders(true);
             }
         });
-        mSceneWithoutHeaders =  sTransitionHelper.createScene(mBrowseFrame, new Runnable() {
+        mSceneWithoutHeaders =  TransitionHelper.createScene(mBrowseFrame, new Runnable() {
             @Override
             public void run() {
                 showHeaders(false);
             }
         });
-        mSceneAfterEntranceTransition = sTransitionHelper.createScene(mBrowseFrame, new Runnable() {
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(mBrowseFrame, new Runnable() {
             @Override
             public void run() {
                 setEntranceTransitionEndState();
@@ -646,11 +646,11 @@
     }
 
     private void createHeadersTransition() {
-        mHeadersTransition = sTransitionHelper.loadTransition(getActivity(),
+        mHeadersTransition = TransitionHelper.loadTransition(getActivity(),
                 mShowingHeaders ?
                 R.transition.lb_browse_headers_in : R.transition.lb_browse_headers_out);
 
-        sTransitionHelper.setTransitionListener(mHeadersTransition, new TransitionListener() {
+        TransitionHelper.addTransitionListener(mHeadersTransition, new TransitionListener() {
             @Override
             public void onTransitionStart(Object transition) {
             }
@@ -893,14 +893,13 @@
 
     @Override
     protected Object createEntranceTransition() {
-        return sTransitionHelper.loadTransition(getActivity(),
+        return TransitionHelper.loadTransition(getActivity(),
                 R.transition.lb_browse_entrance_transition);
     }
 
     @Override
     protected void runEntranceTransition(Object entranceTransition) {
-        sTransitionHelper.runTransition(mSceneAfterEntranceTransition,
-                entranceTransition);
+        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
     }
 
     @Override
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
index c786040..ddafd5f 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
@@ -14,6 +14,7 @@
 package android.support.v17.leanback.app;
 
 import android.support.v17.leanback.R;
+import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.widget.BrowseFrameLayout;
 import android.support.v17.leanback.widget.DetailsOverviewRow;
 import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
@@ -200,7 +201,7 @@
             }
         }
 
-        mSceneAfterEntranceTransition = sTransitionHelper.createScene(
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(
                 (ViewGroup) view, new Runnable() {
             @Override
             public void run() {
@@ -401,14 +402,13 @@
 
     @Override
     protected Object createEntranceTransition() {
-        return sTransitionHelper.loadTransition(getActivity(),
+        return TransitionHelper.loadTransition(getActivity(),
                 R.transition.lb_details_enter_transition);
     }
 
     @Override
     protected void runEntranceTransition(Object entranceTransition) {
-        sTransitionHelper.runTransition(mSceneAfterEntranceTransition,
-                entranceTransition);
+        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
     }
 
     @Override
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
index fbce207..7532d79 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
@@ -16,6 +16,7 @@
 package android.support.v17.leanback.app;
 
 import android.support.v17.leanback.R;
+import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.widget.BrowseFrameLayout;
 import android.support.v17.leanback.widget.DetailsOverviewRow;
 import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
@@ -202,7 +203,7 @@
             }
         }
 
-        mSceneAfterEntranceTransition = sTransitionHelper.createScene(
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(
                 (ViewGroup) view, new Runnable() {
             @Override
             public void run() {
@@ -403,14 +404,13 @@
 
     @Override
     protected Object createEntranceTransition() {
-        return sTransitionHelper.loadTransition(getActivity(),
+        return TransitionHelper.loadTransition(getActivity(),
                 R.transition.lb_details_enter_transition);
     }
 
     @Override
     protected void runEntranceTransition(Object entranceTransition) {
-        sTransitionHelper.runTransition(mSceneAfterEntranceTransition,
-                entranceTransition);
+        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
     }
 
     @Override
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 daab9ac..f985d55 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
@@ -471,26 +471,25 @@
      */
     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);
+                Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END);
+                TransitionHelper.exclude(enterTransition, R.id.guidedactions_background, true);
+                TransitionHelper.exclude(enterTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.setEnterTransition(this, enterTransition);
+                Object exitTransition = TransitionHelper.createFadeAndShortSlide(Gravity.START);
+                TransitionHelper.exclude(exitTransition, R.id.guidedactions_background, true);
+                TransitionHelper.exclude(exitTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.setExitTransition(this, exitTransition);
             } else if (getUiStyle() == UI_STYLE_ENTRANCE) {
-                Object enterTransition = helper.createFadeAndShortSlide(Gravity.END |
+                Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END |
                         Gravity.START);
-                helper.include(enterTransition, R.id.content_fragment);
-                helper.include(enterTransition, R.id.action_fragment);
-                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+                TransitionHelper.include(enterTransition, R.id.content_fragment);
+                TransitionHelper.include(enterTransition, R.id.action_fragment);
+                TransitionHelper.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);
+                TransitionHelper.setEnterTransition(this, null);
                 // exit transition is unchanged, same as UI_STYLE_DEFAULT
             }
         }
@@ -511,10 +510,9 @@
          */
         protected void onProvideFragmentTransitions() {
             if (Build.VERSION.SDK_INT >= 21) {
-                TransitionHelper helper = TransitionHelper.getInstance();
-                Object enterTransition = helper.createFadeTransition(
+                Object enterTransition = TransitionHelper.createFadeTransition(
                         TransitionHelper.FADE_IN|TransitionHelper.FADE_OUT);
-                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+                TransitionHelper.setEnterTransition(this, enterTransition);
             }
         }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
index 577133d..10c8a72 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
@@ -473,26 +473,25 @@
      */
     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);
+                Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END);
+                TransitionHelper.exclude(enterTransition, R.id.guidedactions_background, true);
+                TransitionHelper.exclude(enterTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.setEnterTransition(this, enterTransition);
+                Object exitTransition = TransitionHelper.createFadeAndShortSlide(Gravity.START);
+                TransitionHelper.exclude(exitTransition, R.id.guidedactions_background, true);
+                TransitionHelper.exclude(exitTransition, R.id.guidedactions_selector, true);
+                TransitionHelper.setExitTransition(this, exitTransition);
             } else if (getUiStyle() == UI_STYLE_ENTRANCE) {
-                Object enterTransition = helper.createFadeAndShortSlide(Gravity.END |
+                Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END |
                         Gravity.START);
-                helper.include(enterTransition, R.id.content_fragment);
-                helper.include(enterTransition, R.id.action_fragment);
-                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+                TransitionHelper.include(enterTransition, R.id.content_fragment);
+                TransitionHelper.include(enterTransition, R.id.action_fragment);
+                TransitionHelper.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);
+                TransitionHelper.setEnterTransition(this, null);
                 // exit transition is unchanged, same as UI_STYLE_DEFAULT
             }
         }
@@ -513,10 +512,9 @@
          */
         protected void onProvideFragmentTransitions() {
             if (Build.VERSION.SDK_INT >= 21) {
-                TransitionHelper helper = TransitionHelper.getInstance();
-                Object enterTransition = helper.createFadeTransition(
+                Object enterTransition = TransitionHelper.createFadeTransition(
                         TransitionHelper.FADE_IN|TransitionHelper.FADE_OUT);
-                TransitionHelper.getInstance().setEnterTransition(this, enterTransition);
+                TransitionHelper.setEnterTransition(this, enterTransition);
             }
         }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java
index c7d55b9..3e51989 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridFragment.java
@@ -15,6 +15,7 @@
 
 import android.support.annotation.ColorInt;
 import android.support.v17.leanback.R;
+import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.widget.BrowseFrameLayout;
 import android.support.v17.leanback.widget.OnChildLaidOutListener;
 import android.support.v17.leanback.widget.OnItemViewClickedListener;
@@ -171,7 +172,7 @@
         gridDock.addView(mGridViewHolder.view);
         mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
 
-        mSceneAfterEntranceTransition = sTransitionHelper.createScene(gridDock, new Runnable() {
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() {
             @Override
             public void run() {
                 setEntranceTransitionState(true);
@@ -223,14 +224,13 @@
 
     @Override
     protected Object createEntranceTransition() {
-        return sTransitionHelper.loadTransition(getActivity(),
+        return TransitionHelper.loadTransition(getActivity(),
                 R.transition.lb_vertical_grid_entrance_transition);
     }
 
     @Override
     protected void runEntranceTransition(Object entranceTransition) {
-        sTransitionHelper.runTransition(mSceneAfterEntranceTransition,
-                entranceTransition);
+        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
     }
 
     void setEntranceTransitionState(boolean afterTransition) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java
index 33fe6fc..eb0b337 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/VerticalGridSupportFragment.java
@@ -17,6 +17,7 @@
 
 import android.support.annotation.ColorInt;
 import android.support.v17.leanback.R;
+import android.support.v17.leanback.transition.TransitionHelper;
 import android.support.v17.leanback.widget.BrowseFrameLayout;
 import android.support.v17.leanback.widget.OnChildLaidOutListener;
 import android.support.v17.leanback.widget.OnItemViewClickedListener;
@@ -173,7 +174,7 @@
         gridDock.addView(mGridViewHolder.view);
         mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
 
-        mSceneAfterEntranceTransition = sTransitionHelper.createScene(gridDock, new Runnable() {
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() {
             @Override
             public void run() {
                 setEntranceTransitionState(true);
@@ -225,14 +226,13 @@
 
     @Override
     protected Object createEntranceTransition() {
-        return sTransitionHelper.loadTransition(getActivity(),
+        return TransitionHelper.loadTransition(getActivity(),
                 R.transition.lb_vertical_grid_entrance_transition);
     }
 
     @Override
     protected void runEntranceTransition(Object entranceTransition) {
-        sTransitionHelper.runTransition(mSceneAfterEntranceTransition,
-                entranceTransition);
+        TransitionHelper.runTransition(mSceneAfterEntranceTransition, entranceTransition);
     }
 
     void setEntranceTransitionState(boolean afterTransition) {
diff --git a/v17/leanback/src/android/support/v17/leanback/transition/LeanbackTransitionHelper.java b/v17/leanback/src/android/support/v17/leanback/transition/LeanbackTransitionHelper.java
index f7451d4..47495cb 100644
--- a/v17/leanback/src/android/support/v17/leanback/transition/LeanbackTransitionHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/transition/LeanbackTransitionHelper.java
@@ -30,9 +30,9 @@
 
     static interface LeanbackTransitionHelperVersion {
 
-        public Object loadTitleInTransition(Context context, TransitionHelper helper);
+        public Object loadTitleInTransition(Context context);
 
-        public Object loadTitleOutTransition(Context context, TransitionHelper helper);
+        public Object loadTitleOutTransition(Context context);
     }
 
     /*
@@ -42,12 +42,12 @@
     static class LeanbackTransitionHelperKitKatImpl implements LeanbackTransitionHelperVersion {
 
         @Override
-        public Object loadTitleInTransition(Context context, TransitionHelper helper) {
+        public Object loadTitleInTransition(Context context) {
             return LeanbackTransitionHelperKitKat.loadTitleInTransition(context);
         }
 
         @Override
-        public Object loadTitleOutTransition(Context context, TransitionHelper helper) {
+        public Object loadTitleOutTransition(Context context) {
             return LeanbackTransitionHelperKitKat.loadTitleOutTransition(context);
         }
     }
@@ -58,13 +58,13 @@
     static class LeanbackTransitionHelperDefault implements LeanbackTransitionHelperVersion {
 
         @Override
-        public Object loadTitleInTransition(Context context, TransitionHelper helper) {
-            return helper.loadTransition(context, R.transition.lb_title_in);
+        public Object loadTitleInTransition(Context context) {
+            return TransitionHelper.loadTransition(context, R.transition.lb_title_in);
         }
 
         @Override
-        public Object loadTitleOutTransition(Context context, TransitionHelper helper) {
-            return helper.loadTransition(context, R.transition.lb_title_out);
+        public Object loadTitleOutTransition(Context context) {
+            return TransitionHelper.loadTransition(context, R.transition.lb_title_out);
         }
     }
 
@@ -81,11 +81,11 @@
         }
     }
 
-    static public Object loadTitleInTransition(Context context, TransitionHelper helper) {
-        return sImpl.loadTitleInTransition(context, helper);
+    static public Object loadTitleInTransition(Context context) {
+        return sImpl.loadTitleInTransition(context);
     }
 
-    static public Object loadTitleOutTransition(Context context, TransitionHelper helper) {
-        return sImpl.loadTitleOutTransition(context, helper);
+    static public Object loadTitleOutTransition(Context context) {
+        return sImpl.loadTitleOutTransition(context);
     }
 }
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 941616a..98fb06f 100644
--- a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
@@ -20,6 +20,8 @@
 import android.view.ViewGroup;
 import android.view.Window;
 
+import java.util.ArrayList;
+
 /**
  * Helper for view transitions.
  * @hide
@@ -34,8 +36,7 @@
     public static final int SLIDE_RIGHT = Gravity.RIGHT;
     public static final int SLIDE_BOTTOM = Gravity.BOTTOM;
 
-    private final static TransitionHelper sHelper = new TransitionHelper();
-    TransitionHelperVersionImpl mImpl;
+    private static TransitionHelperVersionImpl sImpl;
 
     /**
      * Gets whether the system supports Transition animations.
@@ -109,7 +110,9 @@
 
         public void addTransition(Object transitionSet, Object transition);
 
-        public void setTransitionListener(Object transition, TransitionListener listener);
+        public void addTransitionListener(Object transition, TransitionListener listener);
+
+        public void removeTransitionListener(Object transition, TransitionListener listener);
 
         public void runTransition(Object scene, Object transition);
 
@@ -146,7 +149,7 @@
     static class TransitionHelperStubImpl implements TransitionHelperVersionImpl {
 
         private static class TransitionStub {
-            TransitionListener mTransitionListener;
+            ArrayList<TransitionListener> mTransitionListeners;
         }
 
         public void setEnterTransition(android.app.Fragment fragment, Object transition) {
@@ -289,22 +292,38 @@
         }
 
         @Override
-        public void setTransitionListener(Object transition, TransitionListener listener) {
-            ((TransitionStub) transition).mTransitionListener = listener;
+        public void addTransitionListener(Object transition, TransitionListener listener) {
+            TransitionStub stub = (TransitionStub) transition;
+            if (stub.mTransitionListeners == null) {
+                stub.mTransitionListeners = new ArrayList<TransitionListener>();
+            }
+            stub.mTransitionListeners.add(listener);
+        }
+
+        @Override
+        public void removeTransitionListener(Object transition, TransitionListener listener) {
+            TransitionStub stub = (TransitionStub) transition;
+            if (stub.mTransitionListeners != null) {
+                stub.mTransitionListeners.remove(listener);
+            }
         }
 
         @Override
         public void runTransition(Object scene, Object transition) {
             TransitionStub transitionStub = (TransitionStub) transition;
-            if (transitionStub != null && transitionStub.mTransitionListener != null) {
-                transitionStub.mTransitionListener.onTransitionStart(transition);
+            if (transitionStub != null && transitionStub.mTransitionListeners != null) {
+                for (int i = 0, size = transitionStub.mTransitionListeners.size(); i < size; i++) {
+                    transitionStub.mTransitionListeners.get(i).onTransitionStart(transition);
+                }
             }
             Runnable r = ((Runnable) scene);
             if (r != null) {
                 r.run();
             }
-            if (transitionStub != null && transitionStub.mTransitionListener != null) {
-                transitionStub.mTransitionListener.onTransitionEnd(transition);
+            if (transitionStub != null && transitionStub.mTransitionListeners != null) {
+                for (int i = 0, size = transitionStub.mTransitionListeners.size(); i < size; i++) {
+                    transitionStub.mTransitionListeners.get(i).onTransitionEnd(transition);
+                }
             }
         }
 
@@ -438,8 +457,13 @@
         }
 
         @Override
-        public void setTransitionListener(Object transition, TransitionListener listener) {
-            TransitionHelperKitkat.setTransitionListener(transition, listener);
+        public void addTransitionListener(Object transition, TransitionListener listener) {
+            TransitionHelperKitkat.addTransitionListener(transition, listener);
+        }
+
+        @Override
+        public void removeTransitionListener(Object transition, TransitionListener listener) {
+            TransitionHelperKitkat.removeTransitionListener(transition, listener);
         }
 
         @Override
@@ -539,181 +563,180 @@
         }
     }
 
-    /**
-     * Returns the TransitionHelper that can be used to perform Transition
-     * animations.
-     */
-    public static TransitionHelper getInstance() {
-        return sHelper;
-    }
-
-    private TransitionHelper() {
+    static {
         if (Build.VERSION.SDK_INT >= 21) {
-            mImpl = new TransitionHelperApi21Impl();
+            sImpl = new TransitionHelperApi21Impl();
         } else  if (systemSupportsTransitions()) {
-            mImpl = new TransitionHelperKitkatImpl();
+            sImpl = new TransitionHelperKitkatImpl();
         } else {
-            mImpl = new TransitionHelperStubImpl();
+            sImpl = new TransitionHelperStubImpl();
         }
     }
 
-    public Object getSharedElementEnterTransition(Window window) {
-        return mImpl.getSharedElementEnterTransition(window);
+    public static Object getSharedElementEnterTransition(Window window) {
+        return sImpl.getSharedElementEnterTransition(window);
     }
 
-    public Object getSharedElementReturnTransition(Window window) {
-        return mImpl.getSharedElementReturnTransition(window);
+    public static Object getSharedElementReturnTransition(Window window) {
+        return sImpl.getSharedElementReturnTransition(window);
     }
 
-    public Object getSharedElementExitTransition(Window window) {
-        return mImpl.getSharedElementExitTransition(window);
+    public static Object getSharedElementExitTransition(Window window) {
+        return sImpl.getSharedElementExitTransition(window);
     }
 
-    public Object getSharedElementReenterTransition(Window window) {
-        return mImpl.getSharedElementReenterTransition(window);
+    public static Object getSharedElementReenterTransition(Window window) {
+        return sImpl.getSharedElementReenterTransition(window);
     }
 
-    public Object getEnterTransition(Window window) {
-        return mImpl.getEnterTransition(window);
+    public static Object getEnterTransition(Window window) {
+        return sImpl.getEnterTransition(window);
     }
 
-    public Object getReturnTransition(Window window) {
-        return mImpl.getReturnTransition(window);
+    public static Object getReturnTransition(Window window) {
+        return sImpl.getReturnTransition(window);
     }
 
-    public Object getExitTransition(Window window) {
-        return mImpl.getExitTransition(window);
+    public static Object getExitTransition(Window window) {
+        return sImpl.getExitTransition(window);
     }
 
-    public Object getReenterTransition(Window window) {
-        return mImpl.getReenterTransition(window);
+    public static Object getReenterTransition(Window window) {
+        return sImpl.getReenterTransition(window);
     }
 
-    public Object createScene(ViewGroup sceneRoot, Runnable r) {
-        return mImpl.createScene(sceneRoot, r);
+    public static Object createScene(ViewGroup sceneRoot, Runnable r) {
+        return sImpl.createScene(sceneRoot, r);
     }
 
-    public Object createChangeBounds(boolean reparent) {
-        return mImpl.createChangeBounds(reparent);
+    public static Object createChangeBounds(boolean reparent) {
+        return sImpl.createChangeBounds(reparent);
     }
 
-    public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
-        mImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay);
+    public static void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
+        sImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay);
     }
 
-    public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
-        mImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay);
+    public static void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
+        sImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay);
     }
 
-    public void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) {
-        mImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay);
+    public static void setChangeBoundsStartDelay(Object changeBounds, String className,
+            int startDelay) {
+        sImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay);
     }
 
-    public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
-        mImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay);
+    public static void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
+        sImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay);
     }
 
-    public Object createTransitionSet(boolean sequential) {
-        return mImpl.createTransitionSet(sequential);
+    public static Object createTransitionSet(boolean sequential) {
+        return sImpl.createTransitionSet(sequential);
     }
 
-    public Object createSlide(int slideEdge) {
-        return mImpl.createSlide(slideEdge);
+    public static Object createSlide(int slideEdge) {
+        return sImpl.createSlide(slideEdge);
     }
 
-    public Object createScale() {
-        return mImpl.createScale();
+    public static Object createScale() {
+        return sImpl.createScale();
     }
 
-    public void addTransition(Object transitionSet, Object transition) {
-        mImpl.addTransition(transitionSet, transition);
+    public static void addTransition(Object transitionSet, Object transition) {
+        sImpl.addTransition(transitionSet, transition);
     }
 
-    public void exclude(Object transition, int targetId, boolean exclude) {
-        mImpl.exclude(transition, targetId, exclude);
+    public static void exclude(Object transition, int targetId, boolean exclude) {
+        sImpl.exclude(transition, targetId, exclude);
     }
 
-    public void exclude(Object transition, View targetView, boolean exclude) {
-        mImpl.exclude(transition, targetView, exclude);
+    public static void exclude(Object transition, View targetView, boolean exclude) {
+        sImpl.exclude(transition, targetView, exclude);
     }
 
-    public void excludeChildren(Object transition, int targetId, boolean exclude) {
-        mImpl.excludeChildren(transition, targetId, exclude);
+    public static void excludeChildren(Object transition, int targetId, boolean exclude) {
+        sImpl.excludeChildren(transition, targetId, exclude);
     }
 
-    public void excludeChildren(Object transition, View targetView, boolean exclude) {
-        mImpl.excludeChildren(transition, targetView, exclude);
+    public static void excludeChildren(Object transition, View targetView, boolean exclude) {
+        sImpl.excludeChildren(transition, targetView, exclude);
     }
 
-    public void include(Object transition, int targetId) {
-        mImpl.include(transition, targetId);
+    public static void include(Object transition, int targetId) {
+        sImpl.include(transition, targetId);
     }
 
-    public void include(Object transition, View targetView) {
-        mImpl.include(transition, targetView);
+    public static void include(Object transition, View targetView) {
+        sImpl.include(transition, targetView);
     }
 
-    public void setStartDelay(Object transition, long startDelay) {
-        mImpl.setStartDelay(transition, startDelay);
+    public static void setStartDelay(Object transition, long startDelay) {
+        sImpl.setStartDelay(transition, startDelay);
     }
 
-    public void setDuration(Object transition, long duration) {
-        mImpl.setDuration(transition, duration);
+    public static void setDuration(Object transition, long duration) {
+        sImpl.setDuration(transition, duration);
     }
 
-    public Object createAutoTransition() {
-        return mImpl.createAutoTransition();
+    public static Object createAutoTransition() {
+        return sImpl.createAutoTransition();
     }
 
-    public Object createFadeTransition(int fadeMode) {
-        return mImpl.createFadeTransition(fadeMode);
+    public static Object createFadeTransition(int fadeMode) {
+        return sImpl.createFadeTransition(fadeMode);
     }
 
-    public void setTransitionListener(Object transition, TransitionListener listener) {
-        mImpl.setTransitionListener(transition, listener);
+    public static void addTransitionListener(Object transition, TransitionListener listener) {
+        sImpl.addTransitionListener(transition, listener);
     }
 
-    public void runTransition(Object scene, Object transition) {
-        mImpl.runTransition(scene, transition);
+    public static void removeTransitionListener(Object transition, TransitionListener listener) {
+        sImpl.removeTransitionListener(transition, listener);
     }
 
-    public void setInterpolator(Object transition, Object timeInterpolator) {
-        mImpl.setInterpolator(transition, timeInterpolator);
+    public static void runTransition(Object scene, Object transition) {
+        sImpl.runTransition(scene, transition);
     }
 
-    public void addTarget(Object transition, View view) {
-        mImpl.addTarget(transition, view);
+    public static void setInterpolator(Object transition, Object timeInterpolator) {
+        sImpl.setInterpolator(transition, timeInterpolator);
     }
 
-    public Object createDefaultInterpolator(Context context) {
-        return mImpl.createDefaultInterpolator(context);
+    public static void addTarget(Object transition, View view) {
+        sImpl.addTarget(transition, view);
     }
 
-    public Object loadTransition(Context context, int resId) {
-        return mImpl.loadTransition(context, resId);
+    public static Object createDefaultInterpolator(Context context) {
+        return sImpl.createDefaultInterpolator(context);
     }
 
-    public void setEnterTransition(android.app.Fragment fragment, Object transition) {
-        mImpl.setEnterTransition(fragment, transition);
+    public static Object loadTransition(Context context, int resId) {
+        return sImpl.loadTransition(context, resId);
     }
 
-    public void setExitTransition(android.app.Fragment fragment, Object transition) {
-        mImpl.setExitTransition(fragment, transition);
+    public static void setEnterTransition(android.app.Fragment fragment, Object transition) {
+        sImpl.setEnterTransition(fragment, transition);
     }
 
-    public void setEnterTransition(android.support.v4.app.Fragment fragment, Object transition) {
+    public static void setExitTransition(android.app.Fragment fragment, Object transition) {
+        sImpl.setExitTransition(fragment, transition);
+    }
+
+    public static void setEnterTransition(android.support.v4.app.Fragment fragment,
+            Object transition) {
         fragment.setEnterTransition(transition);
     }
 
-    public void setExitTransition(android.support.v4.app.Fragment fragment, Object transition) {
+    public static void setExitTransition(android.support.v4.app.Fragment fragment,
+            Object transition) {
         fragment.setExitTransition(transition);
     }
 
-    public Object createFadeAndShortSlide(int edge) {
-        return mImpl.createFadeAndShortSlide(edge);
+    public static Object createFadeAndShortSlide(int edge) {
+        return sImpl.createFadeAndShortSlide(edge);
     }
 
-    public void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup) {
-        mImpl.setTransitionGroup(viewGroup, transitionGroup);
+    public static void setTransitionGroup(ViewGroup viewGroup, boolean transitionGroup) {
+        sImpl.setTransitionGroup(viewGroup, transitionGroup);
     }
 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java
index 410aa28..cac7d9e 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewSharedElementHelper.java
@@ -232,11 +232,10 @@
                     Log.d(TAG, "setTransitionName "+mViewHolder.mOverviewFrame);
                 }
                 ViewCompat.setTransitionName(mViewHolder.mOverviewFrame, mSharedElementName);
-                final TransitionHelper transitionHelper = TransitionHelper.getInstance();
-                Object transition = transitionHelper.getSharedElementEnterTransition(
+                Object transition = TransitionHelper.getSharedElementEnterTransition(
                         mActivityToRunTransition.getWindow());
                 if (transition != null) {
-                    transitionHelper.setTransitionListener(transition, new TransitionListener() {
+                    TransitionHelper.addTransitionListener(transition, new TransitionListener() {
                         @Override
                         public void onTransitionEnd(Object transition) {
                             if (DEBUG) {
@@ -247,7 +246,7 @@
                             if (mViewHolder.mActionsRow.isFocused()) {
                                 mViewHolder.mActionsRow.requestFocus();
                             }
-                            transitionHelper.setTransitionListener(transition, null);
+                            TransitionHelper.removeTransitionListener(transition, this);
                         }
                     });
                 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper.java b/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper.java
index 857c4d9..a9fe9ec 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewSharedElementHelper.java
@@ -76,8 +76,7 @@
         if (DEBUG) {
             Log.d(TAG, "postponeEnterTransition " + mActivityToRunTransition);
         }
-        Object transition = TransitionHelper.getInstance()
-                .getSharedElementEnterTransition(activity.getWindow());
+        Object transition = TransitionHelper.getSharedElementEnterTransition(activity.getWindow());
         setAutoStartSharedElementTransition(transition != null);
         ActivityCompat.postponeEnterTransition(mActivityToRunTransition);
         if (timeoutMs > 0) {
@@ -140,11 +139,10 @@
                 }
                 ViewCompat.setTransitionName(mViewHolder.getLogoViewHolder().view,
                         mSharedElementName);
-                final TransitionHelper transitionHelper = TransitionHelper.getInstance();
-                Object transition = transitionHelper.getSharedElementEnterTransition(
+                Object transition = TransitionHelper.getSharedElementEnterTransition(
                         mActivityToRunTransition.getWindow());
                 if (transition != null) {
-                    transitionHelper.setTransitionListener(transition, new TransitionListener() {
+                    TransitionHelper.addTransitionListener(transition, new TransitionListener() {
                         @Override
                         public void onTransitionEnd(Object transition) {
                             if (DEBUG) {
@@ -155,7 +153,7 @@
                             if (mViewHolder.getActionsRow().isFocused()) {
                                 mViewHolder.getActionsRow().requestFocus();
                             }
-                            transitionHelper.setTransitionListener(transition, null);
+                            TransitionHelper.removeTransitionListener(transition, this);
                         }
                     });
                 }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
index 737492b..5540f78 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
@@ -100,8 +100,7 @@
         @Override
         protected void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) {
             if (viewHolder.itemView instanceof ViewGroup) {
-                TransitionHelper.getInstance().setTransitionGroup((ViewGroup) viewHolder.itemView,
-                        true);
+                TransitionHelper.setTransitionGroup((ViewGroup) viewHolder.itemView, true);
             }
             if (mShadowOverlayHelper != null) {
                 mShadowOverlayHelper.onViewCreated(viewHolder.itemView);
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/TitleHelper.java b/v17/leanback/src/android/support/v17/leanback/widget/TitleHelper.java
index c61087b..9282bb1 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/TitleHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/TitleHelper.java
@@ -36,8 +36,6 @@
     private Object mSceneWithTitle;
     private Object mSceneWithoutTitle;
 
-    static TransitionHelper sTransitionHelper = TransitionHelper.getInstance();
-
     // When moving focus off the TitleView, this focus search listener assumes that the view that
     // should take focus comes before the TitleView in a focus search starting at the scene root.
     private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener =
@@ -68,16 +66,16 @@
 
     private void createTransitions() {
         mTitleUpTransition = LeanbackTransitionHelper.loadTitleOutTransition(
-                mSceneRoot.getContext(), sTransitionHelper);
+                mSceneRoot.getContext());
         mTitleDownTransition = LeanbackTransitionHelper.loadTitleInTransition(
-                mSceneRoot.getContext(), sTransitionHelper);
-        mSceneWithTitle = sTransitionHelper.createScene(mSceneRoot, new Runnable() {
+                mSceneRoot.getContext());
+        mSceneWithTitle = TransitionHelper.createScene(mSceneRoot, new Runnable() {
             @Override
             public void run() {
                 mTitleView.setVisibility(View.VISIBLE);
             }
         });
-        mSceneWithoutTitle = sTransitionHelper.createScene(mSceneRoot, new Runnable() {
+        mSceneWithoutTitle = TransitionHelper.createScene(mSceneRoot, new Runnable() {
             @Override
             public void run() {
                 mTitleView.setVisibility(View.INVISIBLE);
@@ -90,9 +88,9 @@
      */
     public void showTitle(boolean show) {
         if (show) {
-            sTransitionHelper.runTransition(mSceneWithTitle, mTitleDownTransition);
+            TransitionHelper.runTransition(mSceneWithTitle, mTitleDownTransition);
         } else {
-            sTransitionHelper.runTransition(mSceneWithoutTitle, mTitleUpTransition);
+            TransitionHelper.runTransition(mSceneWithoutTitle, mTitleUpTransition);
         }
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java
index 3e9d289..7af5ea0 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java
@@ -34,7 +34,7 @@
         @Override
         protected void onCreate(ItemBridgeAdapter.ViewHolder viewHolder) {
             if (viewHolder.itemView instanceof ViewGroup) {
-                TransitionHelper.getInstance().setTransitionGroup((ViewGroup) viewHolder.itemView,
+                TransitionHelper.setTransitionGroup((ViewGroup) viewHolder.itemView,
                         true);
             }
             if (mShadowOverlayHelper != null) {