Allow configuring a default global value for async updates
diff --git a/lottie/src/main/java/com/airbnb/lottie/L.java b/lottie/src/main/java/com/airbnb/lottie/L.java
index ae9f92c..c22cb11 100644
--- a/lottie/src/main/java/com/airbnb/lottie/L.java
+++ b/lottie/src/main/java/com/airbnb/lottie/L.java
@@ -5,7 +5,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
-import androidx.core.os.TraceCompat;
 
 import com.airbnb.lottie.network.DefaultLottieNetworkFetcher;
 import com.airbnb.lottie.network.LottieNetworkCacheProvider;
@@ -25,6 +24,7 @@
   private static boolean traceEnabled = false;
   private static boolean networkCacheEnabled = true;
   private static boolean disablePathInterpolatorCache = true;
+  private static AsyncUpdates defaultAsyncUpdates = AsyncUpdates.AUTOMATIC;
 
   private static LottieNetworkFetcher fetcher;
   private static LottieNetworkCacheProvider cacheProvider;
@@ -131,4 +131,12 @@
   public static boolean getDisablePathInterpolatorCache() {
     return disablePathInterpolatorCache;
   }
+
+  public static void setDefaultAsyncUpdates(AsyncUpdates asyncUpdates) {
+    L.defaultAsyncUpdates = asyncUpdates;
+  }
+
+  public static AsyncUpdates getDefaultAsyncUpdates() {
+    return L.defaultAsyncUpdates;
+  }
 }
diff --git a/lottie/src/main/java/com/airbnb/lottie/Lottie.java b/lottie/src/main/java/com/airbnb/lottie/Lottie.java
index 816fff7..c6274a3 100644
--- a/lottie/src/main/java/com/airbnb/lottie/Lottie.java
+++ b/lottie/src/main/java/com/airbnb/lottie/Lottie.java
@@ -21,5 +21,6 @@
     L.setTraceEnabled(lottieConfig.enableSystraceMarkers);
     L.setNetworkCacheEnabled(lottieConfig.enableNetworkCache);
     L.setDisablePathInterpolatorCache(lottieConfig.disablePathInterpolatorCache);
+    L.setDefaultAsyncUpdates(lottieConfig.defaultAsyncUpdates);
   }
 }
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieConfig.java b/lottie/src/main/java/com/airbnb/lottie/LottieConfig.java
index b186058..497a5c1 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieConfig.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieConfig.java
@@ -20,14 +20,17 @@
   final boolean enableSystraceMarkers;
   final boolean enableNetworkCache;
   final boolean disablePathInterpolatorCache;
+  final AsyncUpdates defaultAsyncUpdates;
 
   private LottieConfig(@Nullable LottieNetworkFetcher networkFetcher, @Nullable LottieNetworkCacheProvider cacheProvider,
-      boolean enableSystraceMarkers, boolean enableNetworkCache, boolean disablePathInterpolatorCache) {
+      boolean enableSystraceMarkers, boolean enableNetworkCache, boolean disablePathInterpolatorCache,
+      AsyncUpdates defaultAsyncUpdates) {
     this.networkFetcher = networkFetcher;
     this.cacheProvider = cacheProvider;
     this.enableSystraceMarkers = enableSystraceMarkers;
     this.enableNetworkCache = enableNetworkCache;
     this.disablePathInterpolatorCache = disablePathInterpolatorCache;
+    this.defaultAsyncUpdates = defaultAsyncUpdates;
   }
 
   public static final class Builder {
@@ -39,6 +42,7 @@
     private boolean enableSystraceMarkers = false;
     private boolean enableNetworkCache = true;
     private boolean disablePathInterpolatorCache = true;
+    private AsyncUpdates enableAsyncUpdatesByDefault = AsyncUpdates.AUTOMATIC;
 
     /**
      * Lottie has a default network fetching stack built on {@link java.net.HttpURLConnection}. However, if you would like to hook into your own
@@ -127,9 +131,20 @@
       return this;
     }
 
+    /**
+     * Sets the default value for async updates.
+     * @see LottieDrawable#setAsyncUpdates(AsyncUpdates)
+     */
+    @NonNull
+    public Builder setDefaultAsyncUpdates(AsyncUpdates asyncUpdates) {
+      enableAsyncUpdatesByDefault = asyncUpdates;
+      return this;
+    }
+
     @NonNull
     public LottieConfig build() {
-      return new LottieConfig(networkFetcher, cacheProvider, enableSystraceMarkers, enableNetworkCache, disablePathInterpolatorCache);
+      return new LottieConfig(networkFetcher, cacheProvider, enableSystraceMarkers, enableNetworkCache, disablePathInterpolatorCache,
+          enableAsyncUpdatesByDefault);
     }
   }
 }
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index 82233c0..abf094f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -31,6 +31,7 @@
 import androidx.annotation.RestrictTo;
 
 import com.airbnb.lottie.animation.LPaint;
+import com.airbnb.lottie.animation.keyframe.PathKeyframe;
 import com.airbnb.lottie.manager.FontAssetManager;
 import com.airbnb.lottie.manager.ImageAssetManager;
 import com.airbnb.lottie.model.Font;
@@ -145,7 +146,8 @@
   private Matrix softwareRenderingOriginalCanvasMatrix;
   private Matrix softwareRenderingOriginalCanvasMatrixInverse;
 
-  private AsyncUpdates asyncUpdates = AsyncUpdates.AUTOMATIC;
+  /** Use the getter so that it can fall back to {@link L#getDefaultAsyncUpdates()}. */
+  @Nullable private AsyncUpdates asyncUpdates;
   private final ValueAnimator.AnimatorUpdateListener progressUpdateListener = animation -> {
     if (getAsyncUpdatesEnabled()) {
       // Render a new frame.
@@ -411,7 +413,11 @@
    * Returns the current value of {@link AsyncUpdates}. Refer to the docs for {@link AsyncUpdates} for more info.
    */
   public AsyncUpdates getAsyncUpdates() {
-    return asyncUpdates;
+    AsyncUpdates asyncUpdates = this.asyncUpdates;
+    if (asyncUpdates != null) {
+      return asyncUpdates;
+    }
+    return L.getDefaultAsyncUpdates();
   }
 
   /**
@@ -421,7 +427,7 @@
    * whether automatic is defaulting to enabled or not.
    */
   public boolean getAsyncUpdatesEnabled() {
-    return asyncUpdates == AsyncUpdates.ENABLED;
+    return getAsyncUpdates() == AsyncUpdates.ENABLED;
   }
 
   /**