diff --git a/api/current.txt b/api/current.txt
index dc7c41f..180f0d41 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2880,7 +2880,7 @@
     method public void removePauseListener(android.animation.Animator.AnimatorPauseListener);
     method public void resume();
     method public abstract android.animation.Animator setDuration(long);
-    method public void setDurationScaleHint(android.content.Context, int);
+    method public void setDurationScaleHint(int, android.content.res.Resources);
     method public abstract void setInterpolator(android.animation.TimeInterpolator);
     method public abstract void setStartDelay(long);
     method public void setTarget(java.lang.Object);
diff --git a/api/system-current.txt b/api/system-current.txt
index 1837099..76c0261 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -2960,7 +2960,7 @@
     method public void removePauseListener(android.animation.Animator.AnimatorPauseListener);
     method public void resume();
     method public abstract android.animation.Animator setDuration(long);
-    method public void setDurationScaleHint(android.content.Context, int);
+    method public void setDurationScaleHint(int, android.content.res.Resources);
     method public abstract void setInterpolator(android.animation.TimeInterpolator);
     method public abstract void setStartDelay(long);
     method public void setTarget(java.lang.Object);
diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java
index 068f700..02a329d 100644
--- a/core/java/android/animation/Animator.java
+++ b/core/java/android/animation/Animator.java
@@ -16,7 +16,6 @@
 
 package android.animation;
 
-import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.ConstantState;
 import android.content.res.Resources;
@@ -38,7 +37,7 @@
     public static final int HINT_NO_SCALE = 0;
 
     /**
-     * Set this scale hint (using {@link #setDurationScaleHint(Context, int)} when the animation's
+     * Set this scale hint (using {@link #setDurationScaleHint(int, Resources)} when the animation's
      * moving distance is proportional to the screen size. (e.g. a view coming in from the bottom of
      * the screen to top/center). With this scale hint set, the animation duration will be
      * automatically scaled based on screen size.
@@ -46,7 +45,7 @@
     public static final int HINT_DISTANCE_PROPORTIONAL_TO_SCREEN_SIZE = 1;
 
     /**
-     * Set this scale hint (using {@link #setDurationScaleHint(Context, int)}) if the animation
+     * Set this scale hint (using {@link #setDurationScaleHint(int, Resources)}) if the animation
      * has pre-defined moving distance in dp that does not vary from device to device. This is
      * extremely useful when the animation needs to run on both phones/tablets and TV, because TV
      * has inflated dp and therefore will have a longer visual arc for the same animation than on
@@ -238,27 +237,12 @@
      * users' field of view. Therefore, the duration scale factor is determined by the ratio of the
      * angular movement on current devices to that on the baseline device (i.e. Nexus 5).
      *
-     * @param context Context used to determine the display metrics
      * @param hint an indicator on how the animation is defined. The hint could be
      *             {@link #HINT_NO_SCALE}, {@link #HINT_DISTANCE_PROPORTIONAL_TO_SCREEN_SIZE} or
      *             {@link #HINT_DISTANCE_DEFINED_IN_DP}.
+     * @param res The resources {@see android.content.res.Resources} for getting display metrics
      */
-    public void setDurationScaleHint(Context context, int hint) {
-        if (ANIM_DEBUG) {
-            Log.d("ANIM_DEBUG", "distance based duration hint: " + hint);
-        }
-        if (hint == mDurationScaleHint) {
-            return;
-        }
-        if (hint == HINT_NO_SCALE) {
-            mDurationScaleHint = hint;
-            return;
-        }
-        DisplayMetrics metrics = AnimationUtils.getRealDisplayMetrics(context);
-        setDurationScaleHint(context.getResources(), metrics, hint);
-    }
-
-    void setDurationScaleHint(Resources res, DisplayMetrics metrics, int hint) {
+    public void setDurationScaleHint(int hint, Resources res) {
         if (ANIM_DEBUG) {
             Log.d("ANIM_DEBUG", "distance based duration hint: " + hint);
         }
@@ -268,9 +252,9 @@
         mDurationScaleHint = hint;
         if (hint != HINT_NO_SCALE) {
             int uiMode = res.getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK;
-            float dpi = metrics.xdpi;
-            float width = metrics.widthPixels / dpi;
-            float height = metrics.heightPixels / dpi;
+            DisplayMetrics metrics = res.getDisplayMetrics();
+            float width = metrics.widthPixels / metrics.xdpi;
+            float height = metrics.heightPixels / metrics.ydpi;
             float viewingDistance = AnimationUtils.getViewingDistance(width, height, uiMode);
             if (ANIM_DEBUG) {
                 Log.d("ANIM_DEBUG", "width, height, viewing distance, uimode: "
@@ -279,7 +263,7 @@
             mScreenSizeBasedDurationScale = AnimationUtils
                     .getScreenSizeBasedDurationScale(width, height, viewingDistance);
             mDpBasedDurationScale = AnimationUtils.getDpBasedDurationScale(
-                    metrics.density, dpi, viewingDistance);
+                    metrics.density, metrics.xdpi, viewingDistance);
             if (ANIM_DEBUG) {
                 Log.d("ANIM_DEBUG", "screen based scale, dp based scale: " +
                         mScreenSizeBasedDurationScale + ", " + mDpBasedDurationScale);
diff --git a/core/java/android/animation/AnimatorInflater.java b/core/java/android/animation/AnimatorInflater.java
index 630a2cc..224e8e9 100644
--- a/core/java/android/animation/AnimatorInflater.java
+++ b/core/java/android/animation/AnimatorInflater.java
@@ -26,7 +26,6 @@
 import android.content.res.XmlResourceParser;
 import android.graphics.Path;
 import android.util.AttributeSet;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.PathParser;
 import android.util.StateSet;
@@ -86,47 +85,34 @@
     /**
      * Loads an {@link Animator} object from a resource
      *
-     * @param context Context used to access resources
+     * @param context Application context used to access resources
      * @param id The resource id of the animation to load
      * @return The animator object reference by the specified id
      * @throws android.content.res.Resources.NotFoundException when the animation cannot be loaded
      */
     public static Animator loadAnimator(Context context, @AnimatorRes int id)
             throws NotFoundException {
-        return loadAnimator(context, context.getTheme(), id);
+        return loadAnimator(context.getResources(), context.getTheme(), id);
     }
 
     /**
      * Loads an {@link Animator} object from a resource
      *
-     * @param context Context used to access resources
+     * @param resources The resources
      * @param theme The theme
      * @param id The resource id of the animation to load
      * @return The animator object reference by the specified id
      * @throws android.content.res.Resources.NotFoundException when the animation cannot be loaded
      * @hide
      */
-    public static Animator loadAnimator(Context context, Theme theme, int id)
+    public static Animator loadAnimator(Resources resources, Theme theme, int id)
             throws NotFoundException {
-        return loadAnimator(context, theme, id, 1);
+        return loadAnimator(resources, theme, id, 1);
     }
 
     /** @hide */
     public static Animator loadAnimator(Resources resources, Theme theme, int id,
             float pathErrorScale) throws NotFoundException {
-        DisplayMetrics metrics = resources.getDisplayMetrics();
-        return loadAnimator(resources, theme, id, pathErrorScale, metrics);
-    }
-
-    private static Animator loadAnimator(Context context, Theme theme, int id, float pathErrorScale)
-            throws NotFoundException {
-        DisplayMetrics metrics = AnimationUtils.getRealDisplayMetrics(context);
-        return loadAnimator(context.getResources(), theme, id, pathErrorScale, metrics);
-    }
-
-    private static Animator loadAnimator(Resources resources, Theme theme, int id,
-            float pathErrorScale, DisplayMetrics metrics) {
-
         final ConfigurationBoundResourceCache<Animator> animatorCache = resources
                 .getAnimatorCache();
         Animator animator = animatorCache.get(id, theme);
@@ -141,7 +127,7 @@
         XmlResourceParser parser = null;
         try {
             parser = resources.getAnimation(id);
-            animator = createAnimatorFromXml(resources, theme, parser, pathErrorScale, metrics);
+            animator = createAnimatorFromXml(resources, theme, parser, pathErrorScale);
             if (animator != null) {
                 animator.appendChangingConfigurations(getChangingConfigs(resources, id));
                 final ConstantState<Animator> constantState = animator.createConstantState();
@@ -253,8 +239,7 @@
                         }
                         if (animator == null) {
                             animator = createAnimatorFromXml(context.getResources(),
-                                    context.getTheme(), parser, 1f,
-                                    AnimationUtils.getRealDisplayMetrics(context));
+                                    context.getTheme(), parser, 1f);
                         }
 
                         if (animator == null) {
@@ -671,15 +656,15 @@
     }
 
     private static Animator createAnimatorFromXml(Resources res, Theme theme, XmlPullParser parser,
-            float pixelSize, DisplayMetrics metrics)
+            float pixelSize)
             throws XmlPullParserException, IOException {
         return createAnimatorFromXml(res, theme, parser, Xml.asAttributeSet(parser), null, 0,
-                pixelSize, metrics);
+                pixelSize);
     }
 
     private static Animator createAnimatorFromXml(Resources res, Theme theme, XmlPullParser parser,
-            AttributeSet attrs, AnimatorSet parent, int sequenceOrdering, float pixelSize,
-            DisplayMetrics metrics) throws XmlPullParserException, IOException {
+            AttributeSet attrs, AnimatorSet parent, int sequenceOrdering, float pixelSize)
+            throws XmlPullParserException, IOException {
         Animator anim = null;
         ArrayList<Animator> childAnims = null;
 
@@ -698,9 +683,9 @@
             boolean gotValues = false;
 
             if (name.equals("objectAnimator")) {
-                anim = loadObjectAnimator(res, theme, attrs, pixelSize, metrics);
+                anim = loadObjectAnimator(res, theme, attrs, pixelSize);
             } else if (name.equals("animator")) {
-                anim = loadAnimator(res, theme, attrs, null, pixelSize, metrics);
+                anim = loadAnimator(res, theme, attrs, null, pixelSize);
             } else if (name.equals("set")) {
                 anim = new AnimatorSet();
                 TypedArray a;
@@ -712,10 +697,10 @@
                 anim.appendChangingConfigurations(a.getChangingConfigurations());
                 int ordering = a.getInt(R.styleable.AnimatorSet_ordering, TOGETHER);
                 createAnimatorFromXml(res, theme, parser, attrs, (AnimatorSet) anim, ordering,
-                        pixelSize, metrics);
+                        pixelSize);
                 final int hint = a.getInt(R.styleable.AnimatorSet_durationScaleHint,
                         HINT_NO_SCALE);
-                anim.setDurationScaleHint(res, metrics, hint);
+                anim.setDurationScaleHint(hint, res);
                 a.recycle();
             } else if (name.equals("propertyValuesHolder")) {
                 PropertyValuesHolder[] values = loadValues(res, theme, parser,
@@ -995,10 +980,10 @@
     }
 
     private static ObjectAnimator loadObjectAnimator(Resources res, Theme theme, AttributeSet attrs,
-            float pathErrorScale, DisplayMetrics metrics) throws NotFoundException {
+            float pathErrorScale) throws NotFoundException {
         ObjectAnimator anim = new ObjectAnimator();
 
-        loadAnimator(res, theme, attrs, anim, pathErrorScale, metrics);
+        loadAnimator(res, theme, attrs, anim, pathErrorScale);
 
         return anim;
     }
@@ -1013,7 +998,7 @@
      *            ObjectAnimator
      */
     private static ValueAnimator loadAnimator(Resources res, Theme theme,
-            AttributeSet attrs, ValueAnimator anim, float pathErrorScale, DisplayMetrics metrics)
+            AttributeSet attrs, ValueAnimator anim, float pathErrorScale)
             throws NotFoundException {
         TypedArray arrayAnimator = null;
         TypedArray arrayObjectAnimator = null;
@@ -1054,7 +1039,7 @@
 
         final int hint = arrayAnimator.getInt(R.styleable.Animator_durationScaleHint,
                 HINT_NO_SCALE);
-        anim.setDurationScaleHint(res, metrics, hint);
+        anim.setDurationScaleHint(hint, res);
         arrayAnimator.recycle();
         if (arrayObjectAnimator != null) {
             arrayObjectAnimator.recycle();
diff --git a/core/java/android/view/animation/AnimationUtils.java b/core/java/android/view/animation/AnimationUtils.java
index 4ca4add..0417921 100644
--- a/core/java/android/view/animation/AnimationUtils.java
+++ b/core/java/android/view/animation/AnimationUtils.java
@@ -16,10 +16,7 @@
 
 package android.view.animation;
 
-import android.app.Activity;
 import android.content.res.Configuration;
-import android.util.DisplayMetrics;
-import android.view.WindowManager;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -51,7 +48,7 @@
     private static final float RECOMMENDED_FIELD_OF_VIEW_FOR_TV = 40f;
     private static final float ESTIMATED_VIEWING_DISTANCE_FOR_WATCH = 11f;
     private static final float AVERAGE_VIEWING_DISTANCE_FOR_PHONES = 14.2f;
-    private static final float N5_DIAGONAL_VIEW_ANGLE = 19.887228f;
+    private static final float N5_DIAGONAL_VIEW_ANGLE = 19.58f;
     private static final float N5_DENSITY = 3.0f;
     private static final float N5_DPI = 443f;
 
@@ -455,18 +452,4 @@
                 AVERAGE_VIEWING_DISTANCE_FOR_PHONES) * 2;
         return anglePerDp / baselineAnglePerDp;
     }
-
-    /**
-     * @hide
-     */
-    public static DisplayMetrics getRealDisplayMetrics(Context context) {
-        DisplayMetrics metrics = new DisplayMetrics();
-        if (context instanceof Activity) {
-            ((Activity) context).getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
-        } else {
-            ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
-                    .getRealMetrics(metrics);
-        }
-        return metrics;
-    }
 }
