/* * This file provided by Facebook is for non-commercial testing and evaluation * purposes only. Facebook reserves all rights not expressly granted. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.facebook.samples.animation2.bitmap; import com.facebook.common.logging.FLog; import com.facebook.fresco.animation.bitmap.BitmapAnimationBackend; /** * {@link com.facebook.fresco.animation.bitmap.BitmapAnimationBackend.FrameListener} * that logs animation statistics. */ public class DebugBitmapAnimationFrameListener implements BitmapAnimationBackend.FrameListener { private static final Class<?> TAG = DebugBitmapAnimationFrameListener.class; private int mCachedCount; private int mReusedCount; private int mCreatedCount; private int mFallbackCount; private int mUnknownCount; private int mDroppedFrameCount; private long mLastFrameStart; @Override public void onDrawFrameStart(BitmapAnimationBackend backend, int frameNumber) { mLastFrameStart = System.currentTimeMillis(); FLog.d(TAG, "Frame: event=start, number=%d", frameNumber); } @Override public void onFrameDrawn( BitmapAnimationBackend backend, int frameNumber, @BitmapAnimationBackend.FrameType int frameType) { increaseFrameTypeCount(frameType); FLog.d( TAG, "Frame: event=drawn, number=%d, type=%s, render_time=%d ms", frameNumber, getFrameTypeName(frameType), System.currentTimeMillis() - mLastFrameStart); logStatistics(); } @Override public void onFrameDropped(BitmapAnimationBackend backend, int frameNumber) { mDroppedFrameCount++; FLog.d( TAG, "Frame: event=dropped, number=%d, render_time=%d ms", frameNumber, System.currentTimeMillis() - mLastFrameStart); logStatistics(); } private void logStatistics() { FLog.d( TAG, "Stats: cached=%s, reused=%s, created=%s, fallback=%s, dropped=%s, unknown=%s", mCachedCount, mReusedCount, mCreatedCount, mFallbackCount, mDroppedFrameCount, mUnknownCount); } private void increaseFrameTypeCount(@BitmapAnimationBackend.FrameType int frameType) { switch (frameType) { case BitmapAnimationBackend.FRAME_TYPE_CACHED: mCachedCount++; break; case BitmapAnimationBackend.FRAME_TYPE_REUSED: mReusedCount++; break; case BitmapAnimationBackend.FRAME_TYPE_CREATED: mCreatedCount++; break; case BitmapAnimationBackend.FRAME_TYPE_FALLBACK: mFallbackCount++; break; case BitmapAnimationBackend.FRAME_TYPE_UNKNOWN: default: mUnknownCount++; break; } } private static String getFrameTypeName(@BitmapAnimationBackend.FrameType int frameType) { switch (frameType) { case BitmapAnimationBackend.FRAME_TYPE_CACHED: return "cached"; case BitmapAnimationBackend.FRAME_TYPE_REUSED: return "reused"; case BitmapAnimationBackend.FRAME_TYPE_CREATED: return "created"; case BitmapAnimationBackend.FRAME_TYPE_FALLBACK: return "fallback"; case BitmapAnimationBackend.FRAME_TYPE_UNKNOWN: default: return "unknown"; } } }