/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.imagepipeline.animated.factory;
import java.util.concurrent.ScheduledExecutorService;
import javax.annotation.concurrent.NotThreadSafe;
import android.graphics.Rect;
import android.app.ActivityManager;
import android.content.Context;
import android.content.res.Resources;
import com.facebook.common.time.MonotonicClock;
import com.facebook.common.time.RealtimeSinceBootClock;
import com.facebook.common.executors.DefaultSerialExecutorService;
import com.facebook.common.executors.SerialExecutorService;
import com.facebook.common.executors.UiThreadImmediateExecutorService;
import com.facebook.imagepipeline.animated.base.AnimatedDrawableBackend;
import com.facebook.imagepipeline.animated.base.AnimatedDrawableOptions;
import com.facebook.imagepipeline.animated.base.AnimatedImageResult;
import com.facebook.imagepipeline.animated.factory.AnimatedDrawableFactory;
import com.facebook.imagepipeline.animated.factory.AnimatedImageFactory;
import com.facebook.imagepipeline.animated.impl.AnimatedDrawableBackendImpl;
import com.facebook.imagepipeline.animated.impl.AnimatedDrawableBackendProvider;
import com.facebook.imagepipeline.animated.impl.AnimatedDrawableCachingBackendImpl;
import com.facebook.imagepipeline.animated.impl.AnimatedDrawableCachingBackendImplProvider;
import com.facebook.imagepipeline.animated.util.AnimatedDrawableUtil;
import com.facebook.imagepipeline.bitmaps.PlatformBitmapFactory;
import com.facebook.imagepipeline.core.ExecutorSupplier;
import com.facebook.common.internal.DoNotStrip;
@NotThreadSafe
@DoNotStrip
public class AnimatedFactoryImpl implements AnimatedFactory {
private AnimatedDrawableBackendProvider mAnimatedDrawableBackendProvider;
private AnimatedDrawableUtil mAnimatedDrawableUtil;
private AnimatedDrawableFactory mAnimatedDrawableFactory;
private AnimatedImageFactory mAnimatedImageFactory;
private ExecutorSupplier mExecutorSupplier;
private PlatformBitmapFactory mPlatformBitmapFactory;
@DoNotStrip
public AnimatedFactoryImpl(
PlatformBitmapFactory platformBitmapFactory,
ExecutorSupplier executorSupplier) {
this.mPlatformBitmapFactory = platformBitmapFactory;
this.mExecutorSupplier = executorSupplier;
}
private AnimatedDrawableFactory buildAnimatedDrawableFactory(
final SerialExecutorService serialExecutorService,
final ActivityManager activityManager,
final AnimatedDrawableUtil animatedDrawableUtil,
AnimatedDrawableBackendProvider animatedDrawableBackendProvider,
ScheduledExecutorService scheduledExecutorService,
final MonotonicClock monotonicClock,
Resources resources) {
AnimatedDrawableCachingBackendImplProvider animatedDrawableCachingBackendImplProvider =
new AnimatedDrawableCachingBackendImplProvider() {
@Override
public AnimatedDrawableCachingBackendImpl get(
AnimatedDrawableBackend animatedDrawableBackend,
AnimatedDrawableOptions options) {
return new AnimatedDrawableCachingBackendImpl(
serialExecutorService,
activityManager,
animatedDrawableUtil,
monotonicClock,
animatedDrawableBackend,
options);
}
};
return createAnimatedDrawableFactory(
animatedDrawableBackendProvider,
animatedDrawableCachingBackendImplProvider,
animatedDrawableUtil,
scheduledExecutorService,
resources);
}
private AnimatedDrawableBackendProvider getAnimatedDrawableBackendProvider() {
if (mAnimatedDrawableBackendProvider == null) {
mAnimatedDrawableBackendProvider = new AnimatedDrawableBackendProvider() {
@Override
public AnimatedDrawableBackend get(AnimatedImageResult animatedImageResult, Rect bounds) {
return new AnimatedDrawableBackendImpl(
getAnimatedDrawableUtil(),
animatedImageResult,
bounds);
}
};
}
return mAnimatedDrawableBackendProvider;
}
@Override
public AnimatedDrawableFactory getAnimatedDrawableFactory(Context context) {
if (mAnimatedDrawableFactory == null) {
SerialExecutorService serialExecutorService =
new DefaultSerialExecutorService(mExecutorSupplier.forDecode());
ActivityManager activityManager =
(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
mAnimatedDrawableFactory = buildAnimatedDrawableFactory(
serialExecutorService,
activityManager,
getAnimatedDrawableUtil(),
getAnimatedDrawableBackendProvider(),
UiThreadImmediateExecutorService.getInstance(),
RealtimeSinceBootClock.get(),
context.getResources());
}
return mAnimatedDrawableFactory;
}
// We need some of these methods public for now so internal code can use them.
private AnimatedDrawableUtil getAnimatedDrawableUtil() {
if (mAnimatedDrawableUtil == null) {
mAnimatedDrawableUtil = new AnimatedDrawableUtil();
}
return mAnimatedDrawableUtil;
}
private AnimatedImageFactory buildAnimatedImageFactory() {
AnimatedDrawableBackendProvider animatedDrawableBackendProvider =
new AnimatedDrawableBackendProvider() {
@Override
public AnimatedDrawableBackend get(AnimatedImageResult imageResult, Rect bounds) {
return new AnimatedDrawableBackendImpl(getAnimatedDrawableUtil(), imageResult, bounds);
}
};
return new AnimatedImageFactoryImpl(animatedDrawableBackendProvider, mPlatformBitmapFactory);
}
@Override
public AnimatedImageFactory getAnimatedImageFactory() {
if (mAnimatedImageFactory == null) {
mAnimatedImageFactory = buildAnimatedImageFactory();
}
return mAnimatedImageFactory;
}
protected AnimatedDrawableFactory createAnimatedDrawableFactory(
AnimatedDrawableBackendProvider animatedDrawableBackendProvider,
AnimatedDrawableCachingBackendImplProvider animatedDrawableCachingBackendImplProvider,
AnimatedDrawableUtil animatedDrawableUtil,
ScheduledExecutorService scheduledExecutorService,
Resources resources) {
return new AnimatedDrawableFactoryImpl(
animatedDrawableBackendProvider,
animatedDrawableCachingBackendImplProvider,
animatedDrawableUtil,
scheduledExecutorService,
resources);
}
}