Migrate to androidx (#962)

Fixes #898
diff --git a/.travis.yml b/.travis.yml
index 7204725..fe3c849 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -36,8 +36,8 @@
   - tools
   - platform-tools
   - tools
-  - build-tools-27.0.3
-  - android-27
+  - build-tools-28.0.2
+  - android-28
   - extra-android-m2repository
 jdk:
 - oraclejdk8
diff --git a/LottieSample/build.gradle b/LottieSample/build.gradle
index 42d1e7e..d56f708 100644
--- a/LottieSample/build.gradle
+++ b/LottieSample/build.gradle
@@ -7,15 +7,15 @@
 }
 
 android {
-  compileSdkVersion 27
+  compileSdkVersion 28
   defaultConfig {
     applicationId "com.airbnb.lottie"
     minSdkVersion 16
-    targetSdkVersion 27
+    targetSdkVersion 28
     versionCode 66
     versionName "2.7.0"
     multiDexEnabled true
-    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     vectorDrawables.useSupportLibrary = true
     buildConfigField("String", "S3AccessKey", "\"" + System.getenv("LOTTIE_S3_API_KEY") + "\"")
     buildConfigField("String", "S3SecretKey", "\"" + System.getenv("LOTTIE_S3_SECRET_KEY") + "\"")
@@ -53,55 +53,56 @@
 
 dependencies {
   implementation project(':lottie')
-  implementation "com.android.support:appcompat-v7:$supportLibVersion"
-  implementation "com.android.support:recyclerview-v7:$supportLibVersion"
-  implementation "com.android.support:design:$supportLibVersion"
-  implementation "com.android.support:cardview-v7:$supportLibVersion"
-  implementation 'com.android.support:multidex:1.0.1'
-  implementation 'android.arch.lifecycle:extensions:1.1.0'
-  kapt "android.arch.lifecycle:compiler:1.1.0"
-  implementation "com.android.support:customtabs:$supportLibVersion"
-  implementation 'com.airbnb.android:epoxy:2.16.4'
-  kapt 'com.airbnb.android:epoxy-processor:2.16.4'
+  implementation "androidx.appcompat:appcompat:${androidXVersion}"
+  implementation "androidx.recyclerview:recyclerview:${androidXVersion}"
+  implementation "com.google.android.material:material:${androidXVersion}"
+  implementation "androidx.cardview:cardview:${androidXVersion}"
+  implementation "androidx.core:core-ktx:${androidXVersion}"
+  implementation "androidx.browser:browser:${androidXVersion}"
+  implementation 'androidx.multidex:multidex:2.0.0'
+  implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
+  kapt "androidx.lifecycle:lifecycle-compiler:2.0.0"
+  implementation 'com.airbnb.android:epoxy:2.17.0'
+  kapt 'com.airbnb.android:epoxy-processor:2.17.0'
   implementation 'com.airbnb.android:mvrx:0.5.0'
-  implementation 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
-  implementation 'androidx.core:core-ktx:0.2'
+  implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
   implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
   implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
-  implementation 'com.jakewharton:butterknife:8.8.1'
-  kapt 'com.jakewharton:butterknife-compiler:8.8.1'
+  implementation 'com.jakewharton:butterknife:9.0.0-SNAPSHOT'
+  kapt 'com.jakewharton:butterknife-compiler:9.0.0-SNAPSHOT'
   implementation 'com.matthew-tamlin:sliding-intro-screen:3.2.0'
   implementation 'com.dlazaro66.qrcodereaderview:qrcodereaderview:2.0.2'
   implementation 'com.github.PhilJay:MPAndroidChart:v3.0.2'
   testImplementation 'junit:junit:4.12'
   androidTestImplementation 'com.airbnb.android:happo:0.0.15@aar'
   // TODO: figure out why transitive deps of happo are needed
-  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
-  androidTestImplementation 'com.android.support.test:runner:1.0.1'
-  androidTestImplementation 'com.android.support.test.espresso:espresso-idling-resource:3.0.1'
-  androidTestImplementation 'io.reactivex.rxjava2:rxjava:2.1.5'
-  androidTestImplementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
-  androidTestImplementation 'com.squareup.okhttp3:okhttp:3.9.0'
-  androidTestImplementation 'com.amazonaws:aws-android-sdk-core:2.6.5'
-  androidTestImplementation 'com.amazonaws:aws-android-sdk-s3:2.6.5'
-  androidTestImplementation 'io.jsonwebtoken:jjwt:0.8.0'
-  androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
+  androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
+  androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
+  androidTestImplementation 'androidx.test.espresso:espresso-idling-resource:3.1.0-alpha4'
+  androidTestImplementation 'io.reactivex.rxjava2:rxjava:2.2.1'
+  androidTestImplementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
+  androidTestImplementation 'com.squareup.okhttp3:okhttp:3.11.0'
+  androidTestImplementation 'com.amazonaws:aws-android-sdk-core:2.6.31'
+  androidTestImplementation 'com.amazonaws:aws-android-sdk-s3:2.6.31'
+  androidTestImplementation 'io.jsonwebtoken:jjwt:0.9.0'
+  androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0-alpha4', {
     exclude group: 'com.android.support', module: 'support-annotations'
     exclude group: 'org.hamcrest', module: 'hamcrest-integration'
   })
-  androidTestImplementation('com.android.support.test:runner:0.5', {
+  androidTestImplementation('androidx.test:runner:1.1.0-alpha4', {
     exclude group: 'com.android.support', module: 'support-annotations'
   })
-  androidTestImplementation('com.android.support.test:rules:0.5', {
+  androidTestImplementation('androidx.test:rules:1.1.0-alpha4', {
     exclude group: 'com.android.support', module: 'support-annotations'
   })
   implementation 'com.google.code.gson:gson:2.8.2'
-  implementation 'com.squareup.okhttp3:okhttp:3.10.0'
-  implementation 'com.squareup.retrofit2:retrofit:2.3.0'
+  implementation 'com.squareup.okhttp3:okhttp:3.11.0'
+  implementation 'com.squareup.retrofit2:retrofit:2.4.0'
   implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
-  implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
-  implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
-  implementation 'com.github.bumptech.glide:glide:4.6.1'
+  implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
+  implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
+  implementation 'io.reactivex.rxjava2:rxjava:2.2.1'
+  implementation 'com.github.bumptech.glide:glide:4.8.0'
 }
 repositories {
   mavenCentral()
diff --git a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
index 6c7b9e7..f0d5f14 100644
--- a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
+++ b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieSnapshotProvider.java
@@ -10,7 +10,7 @@
 import android.graphics.Rect;
 import android.graphics.drawable.ColorDrawable;
 import android.os.Environment;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.util.TypedValue;
@@ -28,14 +28,11 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import retrofit2.http.HEAD;
-
 public class LottieSnapshotProvider extends SnapshotProvider {
 
   private static final float[] PROGRESS = {0f, 0.25f, 0.5f, 0.75f, 1f};
diff --git a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.java b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.java
index 39268e2..f1acc33 100644
--- a/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.java
+++ b/LottieSample/src/androidTest/java/com/airbnb/lottie/LottieTest.java
@@ -2,10 +2,10 @@
 
 import android.Manifest;
 import android.os.Build;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.rule.GrantPermissionRule;
-import android.support.test.runner.AndroidJUnit4;
+import androidx.test.filters.LargeTest;
+import androidx.test.rule.ActivityTestRule;
+import androidx.test.rule.GrantPermissionRule;
+import androidx.test.runner.AndroidJUnit4;
 import android.text.TextUtils;
 import android.util.Log;
 
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt
index ed2d83e..cfcdba7 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/AppIntroActivity.kt
@@ -1,8 +1,7 @@
 package com.airbnb.lottie.samples
 
 import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.support.v4.view.ViewPager
+import androidx.fragment.app.Fragment
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -60,7 +59,7 @@
         animationView.progress = startProgress.lerp(endProgress, positionOffset)
     }
 
-    class EmptyFragment : Fragment() {
+    class EmptyFragment : androidx.fragment.app.Fragment() {
 
         override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
             return container!!.inflate(R.layout.fragment_empty, false)
@@ -75,9 +74,9 @@
 
     private fun setViewPagerScroller() {
         try {
-            val scrollerField = ViewPager::class.java.getDeclaredField("mScroller")
+            val scrollerField = androidx.viewpager.widget.ViewPager::class.java.getDeclaredField("mScroller")
             scrollerField.isAccessible = true
-            val interpolator = ViewPager::class.java.getDeclaredField("sInterpolator")
+            val interpolator = androidx.viewpager.widget.ViewPager::class.java.getDeclaredField("sInterpolator")
             interpolator.isAccessible = true
 
             val scroller = object : Scroller(this, interpolator.get(null) as Interpolator) {
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BaseEpoxyFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BaseEpoxyFragment.kt
index 1eb4d0f..1c18749 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BaseEpoxyFragment.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BaseEpoxyFragment.kt
@@ -6,6 +6,7 @@
 import android.view.ViewGroup
 import com.airbnb.epoxy.AsyncEpoxyController
 import com.airbnb.epoxy.EpoxyController
+import com.airbnb.lottie.samples.R.id.recyclerView
 import com.airbnb.mvrx.BaseMvRxFragment
 import kotlinx.android.synthetic.main.fragment_base.*
 import kotlinx.android.synthetic.main.fragment_base.view.*
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BullseyeActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BullseyeActivity.kt
index 9c2caca..1ad64ed 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BullseyeActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/BullseyeActivity.kt
@@ -2,8 +2,8 @@
 
 import android.graphics.PointF
 import android.os.Bundle
-import android.support.v4.widget.ViewDragHelper
-import android.support.v7.app.AppCompatActivity
+import androidx.customview.widget.ViewDragHelper
+import androidx.appcompat.app.AppCompatActivity
 import android.view.View
 import com.airbnb.lottie.LottieProperty
 import com.airbnb.lottie.model.KeyPath
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicActivity.kt
index 918c33a..10966ac 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicActivity.kt
@@ -2,15 +2,12 @@
 
 import android.graphics.PointF
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import android.util.Log
 import com.airbnb.lottie.LottieProperty
 import com.airbnb.lottie.model.KeyPath
 import com.airbnb.lottie.utils.MiscUtils
-import kotlinx.android.synthetic.main.activity_dynamic.animationView
-import kotlinx.android.synthetic.main.activity_dynamic.colorButton
-import kotlinx.android.synthetic.main.activity_dynamic.jumpHeight
-import kotlinx.android.synthetic.main.activity_dynamic.speedButton
+import kotlinx.android.synthetic.main.activity_dynamic.*
 
 private val COLORS = arrayOf(
     0xff5a5f,
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicTextActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicTextActivity.kt
index 2468c07..71dd6b2 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicTextActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/DynamicTextActivity.kt
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.samples
 
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import android.text.Editable
 import android.text.TextWatcher
 import com.airbnb.lottie.TextDelegate
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FontFragment.java b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FontFragment.java
index 4748037..c01e666 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FontFragment.java
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FontFragment.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.samples;
 
 import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FullScreenActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FullScreenActivity.kt
index dceec6d..07014cb 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FullScreenActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/FullScreenActivity.kt
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.samples
 
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 
 /**
  * To have a full screen animation, make an animation that is wider than the screen and set the
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ListActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ListActivity.kt
index cbfa463..f0bf1b8 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ListActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ListActivity.kt
@@ -1,9 +1,8 @@
 package com.airbnb.lottie.samples
 
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import com.airbnb.epoxy.EpoxyController
-import com.airbnb.lottie.samples.views.ListingCard
 import com.airbnb.lottie.samples.views.WishListIconView
 import com.airbnb.lottie.samples.views.listingCard
 import com.airbnb.lottie.samples.views.marquee
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt
index 4f5c462..d6e9650 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottieApplication.kt
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.samples
 
-import android.support.multidex.MultiDexApplication
+import androidx.multidex.MultiDexApplication
 import com.airbnb.lottie.L
 import com.google.gson.FieldNamingPolicy
 import com.google.gson.GsonBuilder
@@ -25,7 +25,7 @@
     val retrofit by lazy {
         Retrofit.Builder()
                 .client(okHttpClient)
-                .baseUrl("http://lottiefiles.com/api/v1/")
+                .baseUrl("https://lottiefiles.com/api/v1/")
                 .addConverterFactory(GsonConverterFactory.create(gson))
                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                 .build()
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt
index e233b10..e66e777 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/LottiefilesFragment.kt
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.samples
 
-import android.support.v4.app.FragmentActivity
+import androidx.fragment.app.FragmentActivity
 import com.airbnb.epoxy.EpoxyController
 import com.airbnb.lottie.samples.model.AnimationData
 import com.airbnb.lottie.samples.model.AnimationResponse
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/MainActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/MainActivity.kt
index 5bc6ef6..a0bcd90 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/MainActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/MainActivity.kt
@@ -1,17 +1,16 @@
 package com.airbnb.lottie.samples
 
 import android.os.Bundle
-import android.support.customtabs.CustomTabsIntent
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v7.app.AppCompatActivity
-import android.support.v7.app.AppCompatDelegate
 import android.view.MenuItem
-import androidx.net.toUri
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.browser.customtabs.CustomTabsIntent
+import androidx.core.net.toUri
+import androidx.fragment.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
 import kotlinx.android.synthetic.main.activity_main.*
 
 class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
-
     override fun onCreate(savedInstanceState: Bundle?) {
         AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
         super.onCreate(savedInstanceState)
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/OnPageChangeListenerAdapter.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/OnPageChangeListenerAdapter.kt
index 5bcbd54..10dfe39 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/OnPageChangeListenerAdapter.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/OnPageChangeListenerAdapter.kt
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.samples
 
-import android.support.v4.view.ViewPager
+import androidx.viewpager.widget.ViewPager
 
 internal open class OnPageChangeListenerAdapter(
         private val onPageScrollStateChanged: ((state: Int) -> Unit)? = null,
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerActivity.kt
index 3126a61..8b1cb7f 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerActivity.kt
@@ -3,7 +3,7 @@
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import com.airbnb.lottie.samples.model.CompositionArgs
 
 class PlayerActivity : AppCompatActivity() {
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt
index d699236..f189cee 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerFragment.kt
@@ -3,21 +3,19 @@
 import android.animation.ValueAnimator
 import android.annotation.SuppressLint
 import android.app.AlertDialog
-import android.arch.lifecycle.Lifecycle
 import android.graphics.Color
 import android.os.Bundle
-import android.support.design.widget.BottomSheetBehavior
-import android.support.design.widget.Snackbar
-import android.support.transition.AutoTransition
-import android.support.transition.TransitionManager
-import android.support.v4.app.Fragment
-import android.support.v4.content.ContextCompat
-import android.support.v7.app.AppCompatActivity
 import android.util.Log
 import android.view.*
 import android.widget.EditText
-import androidx.view.children
-import androidx.view.isVisible
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import androidx.core.view.children
+import androidx.core.view.isVisible
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.Lifecycle
+import androidx.transition.AutoTransition
+import androidx.transition.TransitionManager
 import com.airbnb.lottie.L
 import com.airbnb.lottie.LottieAnimationView
 import com.airbnb.lottie.LottieComposition
@@ -35,6 +33,8 @@
 import com.github.mikephil.charting.data.Entry
 import com.github.mikephil.charting.data.LineData
 import com.github.mikephil.charting.data.LineDataSet
+import com.google.android.material.bottomsheet.BottomSheetBehavior
+import com.google.android.material.snackbar.Snackbar
 import kotlinx.android.synthetic.main.bottom_sheet_key_paths.*
 import kotlinx.android.synthetic.main.bottom_sheet_render_times.*
 import kotlinx.android.synthetic.main.bottom_sheet_warnings.*
@@ -132,7 +132,7 @@
         viewModel.fetchAnimation(args)
         viewModel.asyncSubscribe(PlayerState::composition, onFail = {
             Snackbar.make(coordinatorLayout, R.string.composition_load_error, Snackbar.LENGTH_LONG).show()
-            Log.w(L.TAG, "Error loading composition.", it);
+            Log.w(L.TAG, "Error loading composition.", it)
         }) {
             loadingView.isVisible = false
             onCompositionLoaded(it)
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt
index f70d592..0594bc7 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PlayerViewModel.kt
@@ -3,7 +3,7 @@
 import android.animation.ValueAnimator
 import android.app.Application
 import android.net.Uri
-import android.support.v4.app.FragmentActivity
+import androidx.fragment.app.FragmentActivity
 import com.airbnb.lottie.LottieComposition
 import com.airbnb.lottie.LottieCompositionFactory
 import com.airbnb.lottie.LottieTask
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt
index 3e80d76..89011c6 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewFragment.kt
@@ -6,11 +6,15 @@
 import android.content.ActivityNotFoundException
 import android.content.Intent
 import android.content.pm.PackageManager
-import android.support.design.widget.Snackbar
+import com.google.android.material.snackbar.Snackbar
 import android.widget.ArrayAdapter
 import android.widget.EditText
 import android.widget.Toast
+import androidx.core.app.ActivityCompat.requestPermissions
+import androidx.core.app.ActivityCompat.startActivityForResult
+import androidx.core.content.ContextCompat.startActivity
 import com.airbnb.epoxy.EpoxyController
+import com.airbnb.lottie.samples.R.id.coordinatorLayout
 import com.airbnb.lottie.samples.model.CompositionArgs
 import com.airbnb.lottie.samples.views.marquee
 import kotlinx.android.synthetic.main.fragment_player.*
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewItemView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewItemView.kt
index c6830d8..79f1c3c 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewItemView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/PreviewItemView.kt
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.samples
 
 import android.content.Context
-import android.support.annotation.DrawableRes
+import androidx.annotation.DrawableRes
 import android.util.AttributeSet
 import android.view.View
 import android.widget.LinearLayout
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/QRScanActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/QRScanActivity.kt
index f3cb32d..19c654a 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/QRScanActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/QRScanActivity.kt
@@ -5,7 +5,7 @@
 import android.graphics.PointF
 import android.os.Bundle
 import android.os.Vibrator
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
 import com.airbnb.lottie.samples.model.CompositionArgs
 import com.dlazaro66.qrcodereaderview.QRCodeReaderView
 import kotlinx.android.synthetic.main.activity_qrscan.*
@@ -50,4 +50,4 @@
     companion object {
         fun intent(context: Context) = Intent(context, QRScanActivity::class.java)
     }
-}
+}
\ No newline at end of file
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt
index 876fbc3..81661b5 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/ShowcaseFragment.kt
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.samples
 
 import android.content.Intent
-import android.support.v4.app.FragmentActivity
+import androidx.fragment.app.FragmentActivity
 import com.airbnb.epoxy.EpoxyController
 import com.airbnb.lottie.samples.model.AnimationResponse
 import com.airbnb.lottie.samples.model.CompositionArgs
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TestColorFilterActivity.java b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TestColorFilterActivity.java
index 84ec8a2..7877cfb 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TestColorFilterActivity.java
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TestColorFilterActivity.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.samples;
 
 import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v7.app.AppCompatActivity;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
 
 public class TestColorFilterActivity extends AppCompatActivity {
 
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TodoFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TodoFragment.kt
deleted file mode 100644
index 86ebaf9..0000000
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TodoFragment.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.airbnb.lottie.samples
-
-import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-
-class TodoFragment : Fragment() {
-
-    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
-            inflater.inflate(R.layout.fragment_todo, container, false)
-}
\ No newline at end of file
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TrimView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TrimView.kt
index c5f1ade..9e7ce50 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TrimView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TrimView.kt
@@ -2,7 +2,7 @@
 
 import android.annotation.SuppressLint
 import android.content.Context
-import android.support.v4.widget.ViewDragHelper
+import androidx.customview.widget.ViewDragHelper
 import android.util.AttributeSet
 import android.view.Gravity
 import android.view.MotionEvent
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypeExtensions.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypeExtensions.kt
index 5d0f051..dcec895 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypeExtensions.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypeExtensions.kt
@@ -8,17 +8,16 @@
 import android.os.Build
 import android.os.VibrationEffect
 import android.os.Vibrator
-import android.support.annotation.DrawableRes
-import android.support.annotation.LayoutRes
-import android.support.annotation.StringRes
-import android.support.design.widget.Snackbar
-import android.support.graphics.drawable.VectorDrawableCompat
-import android.support.v4.app.Fragment
-import android.support.v4.content.ContextCompat
+import androidx.annotation.DrawableRes
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import com.google.android.material.snackbar.Snackbar
+import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
+import androidx.fragment.app.Fragment
+import androidx.core.content.ContextCompat
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
-import android.widget.EditText
 import android.widget.ImageView
 import android.widget.TextView
 import com.bumptech.glide.Glide
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypographyDemoActivity.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypographyDemoActivity.kt
index e0d6f33..64cbbb8 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypographyDemoActivity.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/TypographyDemoActivity.kt
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.samples
 
 import android.os.Bundle
-import android.support.v7.app.AppCompatActivity
 import android.view.View
 import android.view.ViewTreeObserver
+import androidx.appcompat.app.AppCompatActivity
 import kotlinx.android.synthetic.main.activity_typography_demo.*
 
 class TypographyDemoActivity : AppCompatActivity() {
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/WarningsDialogFragment.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/WarningsDialogFragment.kt
deleted file mode 100644
index 09d805b..0000000
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/WarningsDialogFragment.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.airbnb.lottie.samples
-
-import android.os.Bundle
-import android.support.v4.app.DialogFragment
-import android.support.v7.widget.RecyclerView
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import kotlinx.android.synthetic.main.fragment_warnings.view.*
-import kotlinx.android.synthetic.main.view_holder_warning.view.*
-
-class WarningsDialogFragment : DialogFragment() {
-
-    override fun onCreateView(
-            inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
-        val view = inflater.inflate(R.layout.fragment_warnings, container, false)
-        view!!.okButton.setOnClickListener { dismiss() }
-        view.recyclerView.adapter = Adapter(arguments!!.getStringArrayList(ARG_WARNINGS))
-        return view
-    }
-
-    private class Adapter(private val warnings: List<String>) : RecyclerView.Adapter<VH>() {
-
-        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH = VH(parent)
-
-        override fun onBindViewHolder(holder: VH, position: Int) =
-                holder.bind(warnings[position], position != itemCount - 1)
-
-        override fun getItemCount(): Int = warnings.size
-    }
-
-    internal class VH(parent: ViewGroup) : RecyclerView.ViewHolder(
-            parent.inflate(R.layout.view_holder_warning, false)) {
-        fun bind(warning: String, showDivider: Boolean) {
-            itemView.warning.text = warning
-            itemView.divider.visibility = if (showDivider) View.VISIBLE else View.GONE
-        }
-    }
-
-    companion object {
-        private val ARG_WARNINGS = "warnings"
-
-        internal fun newInstance(warnings: ArrayList<String>): WarningsDialogFragment {
-            val args = Bundle()
-            args.putStringArrayList(ARG_WARNINGS, warnings)
-            val frag = WarningsDialogFragment()
-            frag.arguments = args
-            return frag
-        }
-    }
-}
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/AnimationData.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/AnimationData.kt
index a222890..dfca563 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/AnimationData.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/AnimationData.kt
@@ -2,9 +2,9 @@
 
 import android.graphics.Color
 import android.os.Parcelable
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
 import android.util.Log
-import androidx.graphics.toColorInt
+import androidx.core.graphics.toColorInt
 import com.airbnb.lottie.L
 import kotlinx.android.parcel.Parcelize
 
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/ShowcaseItem.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/ShowcaseItem.kt
index 51fbf81..38c5d10 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/ShowcaseItem.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/model/ShowcaseItem.kt
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.samples.model
 
-import android.support.annotation.DrawableRes
-import android.support.annotation.StringRes
+import androidx.annotation.DrawableRes
+import androidx.annotation.StringRes
 
 data class ShowcaseItem(
         @DrawableRes val drawableRes: Int,
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BackgroundColorView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BackgroundColorView.kt
index ac6cb03..976c2be 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BackgroundColorView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BackgroundColorView.kt
@@ -6,8 +6,8 @@
 import android.graphics.Color
 import android.graphics.Paint
 import android.graphics.drawable.ColorDrawable
-import android.support.annotation.ColorInt
-import android.support.v4.content.ContextCompat
+import androidx.annotation.ColorInt
+import androidx.core.content.ContextCompat
 import android.util.AttributeSet
 import android.view.View
 import com.airbnb.lottie.samples.R
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BottomSheetItemView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BottomSheetItemView.kt
index d8f1738..6dc4352 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BottomSheetItemView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/BottomSheetItemView.kt
@@ -5,7 +5,7 @@
 import android.text.TextUtils
 import android.util.AttributeSet
 import android.widget.FrameLayout
-import androidx.view.isVisible
+import androidx.core.view.isVisible
 import com.airbnb.epoxy.ModelProp
 import com.airbnb.epoxy.ModelView
 import com.airbnb.lottie.samples.R
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ControlBarItemToggleView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ControlBarItemToggleView.kt
index a747f22..60a1941 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ControlBarItemToggleView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ControlBarItemToggleView.kt
@@ -2,15 +2,15 @@
 
 import android.content.Context
 import android.graphics.Color
-import android.support.annotation.DrawableRes
-import android.support.v4.content.ContextCompat
-import android.support.v4.graphics.drawable.DrawableCompat
+import androidx.annotation.DrawableRes
+import androidx.core.content.ContextCompat
+import androidx.core.graphics.drawable.DrawableCompat
 import android.util.AttributeSet
 import android.view.View
 import android.widget.ImageView
 import android.widget.LinearLayout
-import androidx.view.isVisible
-import androidx.view.setPadding
+import androidx.core.view.isVisible
+import androidx.core.view.setPadding
 import com.airbnb.lottie.samples.R
 import com.airbnb.lottie.samples.getText
 import kotlinx.android.synthetic.main.item_view_control_bar.view.*
@@ -26,7 +26,6 @@
         orientation = HORIZONTAL
         setBackgroundResource(R.drawable.control_bar_item_view_background)
         setPadding(resources.getDimensionPixelSize(R.dimen.control_bar_button_padding))
-
         attrs?.let {
             val typedArray = context.obtainStyledAttributes(it, R.styleable.ControlBarItemToggleView, 0, 0)
 
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/InterceptingFrameLayout.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/InterceptingFrameLayout.kt
index 92156a5..edce66f 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/InterceptingFrameLayout.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/InterceptingFrameLayout.kt
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.samples.views
 
 import android.content.Context
-import android.support.v4.widget.ViewDragHelper
+import androidx.customview.widget.ViewDragHelper
 import android.util.AttributeSet
 import android.view.MotionEvent
 import android.widget.FrameLayout
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/NoShiftBottomNavigationView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/NoShiftBottomNavigationView.kt
index 4926596..b6df595 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/NoShiftBottomNavigationView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/NoShiftBottomNavigationView.kt
@@ -2,13 +2,13 @@
 
 import android.annotation.SuppressLint
 import android.content.Context
-import android.support.design.internal.BottomNavigationItemView
-import android.support.design.internal.BottomNavigationMenuView
-import android.support.design.widget.BottomNavigationView
+import com.google.android.material.bottomnavigation.BottomNavigationView
 import android.util.AttributeSet
 import android.util.Log
 import android.view.View
-import androidx.view.children
+import androidx.core.view.children
+import com.google.android.material.bottomnavigation.BottomNavigationItemView
+import com.google.android.material.bottomnavigation.BottomNavigationMenuView
 
 private val TAG = NoShiftBottomNavigationView::class.java.name
 
@@ -36,7 +36,7 @@
             menuView.children
                     .map { it as BottomNavigationItemView }
                     .forEach {
-                        it.setShiftingMode(false)
+                        it.setShifting(false)
                         it.setChecked(it.itemData.isChecked)
                     }
         } catch (e: NoSuchFieldException) {
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/SearchInputItemView.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/SearchInputItemView.kt
index c26aac9..318d4d0 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/SearchInputItemView.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/SearchInputItemView.kt
@@ -35,10 +35,10 @@
 
     @ModelProp(options = [ModelProp.Option.DoNotHash])
     fun setSearchClickListener(listener: (String) -> Unit) {
-        searchButton.setOnClickListener({
+        searchButton.setOnClickListener {
             val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
             inputMethodManager.hideSoftInputFromInputMethod(windowToken, 0)
             listener(searchEditText.text.toString())
-        })
+        }
     }
 }
\ No newline at end of file
diff --git a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ShowcaseCarousel.kt b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ShowcaseCarousel.kt
index 0770b82..5923524 100644
--- a/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ShowcaseCarousel.kt
+++ b/LottieSample/src/main/kotlin/com/airbnb/lottie/samples/views/ShowcaseCarousel.kt
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.samples.views
 
 import android.content.Context
-import android.support.v7.widget.LinearLayoutManager
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
 import android.util.AttributeSet
 import com.airbnb.epoxy.EpoxyController
 import com.airbnb.epoxy.EpoxyRecyclerView
@@ -21,7 +21,7 @@
     private var items: List<ShowcaseItem>? = null
 
     init {
-        layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
+        layoutManager = androidx.recyclerview.widget.LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
         buildModelsWith(this)
         val sidePadding = resources.getDimensionPixelSize(R.dimen.showcase_carousel_padding)
         setPadding(sidePadding, 0, sidePadding, 0)
diff --git a/LottieSample/src/main/res/layout/activity_list.xml b/LottieSample/src/main/res/layout/activity_list.xml
index 551f4df..7a3f48d 100644
--- a/LottieSample/src/main/res/layout/activity_list.xml
+++ b/LottieSample/src/main/res/layout/activity_list.xml
@@ -9,7 +9,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 
-    <android.support.v7.widget.Toolbar
+    <androidx.appcompat.widget.Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="?attr/actionBarSize"
diff --git a/LottieSample/src/main/res/layout/bottom_sheet_key_paths.xml b/LottieSample/src/main/res/layout/bottom_sheet_key_paths.xml
index c8a3924..a45854c 100644
--- a/LottieSample/src/main/res/layout/bottom_sheet_key_paths.xml
+++ b/LottieSample/src/main/res/layout/bottom_sheet_key_paths.xml
@@ -9,7 +9,7 @@
     android:background="@android:color/white"
     app:behavior_hideable="true"
     app:behavior_peekHeight="80dp"
-    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
+    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
 
     <View
         android:layout_width="match_parent"
diff --git a/LottieSample/src/main/res/layout/bottom_sheet_render_times.xml b/LottieSample/src/main/res/layout/bottom_sheet_render_times.xml
index 5f6a42e..ebf3e66 100644
--- a/LottieSample/src/main/res/layout/bottom_sheet_render_times.xml
+++ b/LottieSample/src/main/res/layout/bottom_sheet_render_times.xml
@@ -9,7 +9,7 @@
     android:background="@android:color/white"
     app:behavior_hideable="true"
     app:behavior_peekHeight="80dp"
-    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
+    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
 
     <View
         android:layout_width="match_parent"
diff --git a/LottieSample/src/main/res/layout/bottom_sheet_warnings.xml b/LottieSample/src/main/res/layout/bottom_sheet_warnings.xml
index 1a06c4a..3d3148c 100644
--- a/LottieSample/src/main/res/layout/bottom_sheet_warnings.xml
+++ b/LottieSample/src/main/res/layout/bottom_sheet_warnings.xml
@@ -9,7 +9,7 @@
     android:background="@android:color/white"
     app:behavior_hideable="true"
     app:behavior_peekHeight="80dp"
-    app:layout_behavior="android.support.design.widget.BottomSheetBehavior">
+    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
 
     <View
         android:layout_width="match_parent"
diff --git a/LottieSample/src/main/res/layout/control_bar_player_controls.xml b/LottieSample/src/main/res/layout/control_bar_player_controls.xml
index d7dc7f4..37977ec 100644
--- a/LottieSample/src/main/res/layout/control_bar_player_controls.xml
+++ b/LottieSample/src/main/res/layout/control_bar_player_controls.xml
@@ -64,7 +64,7 @@
                 android:textSize="10sp"/>
         </RelativeLayout>
 
-        <android.support.v7.widget.AppCompatSeekBar
+        <androidx.appcompat.widget.AppCompatSeekBar
             android:id="@+id/seekBar"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
diff --git a/LottieSample/src/main/res/layout/control_bar_scale.xml b/LottieSample/src/main/res/layout/control_bar_scale.xml
index 48cdb04..faa2994 100644
--- a/LottieSample/src/main/res/layout/control_bar_scale.xml
+++ b/LottieSample/src/main/res/layout/control_bar_scale.xml
@@ -23,7 +23,7 @@
             android:textColor="#222222"
             android:textSize="14sp"/>
 
-        <android.support.v7.widget.AppCompatSeekBar
+        <androidx.appcompat.widget.AppCompatSeekBar
             android:id="@+id/scaleSeekBar"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
diff --git a/LottieSample/src/main/res/layout/fragment_base.xml b/LottieSample/src/main/res/layout/fragment_base.xml
index 05ad3cb..bd6a661 100644
--- a/LottieSample/src/main/res/layout/fragment_base.xml
+++ b/LottieSample/src/main/res/layout/fragment_base.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/coordinatorLayout"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                                                     android:id="@+id/coordinatorLayout"
+                                                     android:layout_width="match_parent"
+                                                     android:layout_height="match_parent">
 
     <com.airbnb.epoxy.EpoxyRecyclerView
         android:id="@+id/recyclerView"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
 
-</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/LottieSample/src/main/res/layout/fragment_choose_asset.xml b/LottieSample/src/main/res/layout/fragment_choose_asset.xml
index bd2c2f7..2b6b6e4 100644
--- a/LottieSample/src/main/res/layout/fragment_choose_asset.xml
+++ b/LottieSample/src/main/res/layout/fragment_choose_asset.xml
@@ -3,7 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
-    <android.support.v7.widget.RecyclerView
+    <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recyclerView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
diff --git a/LottieSample/src/main/res/layout/fragment_player.xml b/LottieSample/src/main/res/layout/fragment_player.xml
index 116c80b..468fe4e 100644
--- a/LottieSample/src/main/res/layout/fragment_player.xml
+++ b/LottieSample/src/main/res/layout/fragment_player.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.design.widget.CoordinatorLayout
+<androidx.coordinatorlayout.widget.CoordinatorLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/coordinatorLayout"
@@ -46,7 +46,7 @@
         <include layout="@layout/control_bar" />
     </LinearLayout>
 
-    <android.support.v7.widget.Toolbar
+    <androidx.appcompat.widget.Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="?attr/actionBarSize"
@@ -57,4 +57,4 @@
     <include layout="@layout/bottom_sheet_render_times" />
     <include layout="@layout/bottom_sheet_warnings" />
     <include layout="@layout/bottom_sheet_key_paths" />
-</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/LottieSample/src/main/res/layout/fragment_warnings.xml b/LottieSample/src/main/res/layout/fragment_warnings.xml
index 8965d94..b90f48a 100644
--- a/LottieSample/src/main/res/layout/fragment_warnings.xml
+++ b/LottieSample/src/main/res/layout/fragment_warnings.xml
@@ -20,7 +20,7 @@
         android:layout_height="@dimen/divider_height"
         android:background="@color/divider"/>
 
-    <android.support.v7.widget.RecyclerView
+    <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/recyclerView"
         android:layout_width="match_parent"
         android:layout_height="0dp"
diff --git a/LottieSample/src/main/res/layout/item_view_animation.xml b/LottieSample/src/main/res/layout/item_view_animation.xml
index bf32b3b..73f129c 100644
--- a/LottieSample/src/main/res/layout/item_view_animation.xml
+++ b/LottieSample/src/main/res/layout/item_view_animation.xml
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
-<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_marginLeft="24dp"
-    android:layout_marginRight="24dp"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                                                   xmlns:app="http://schemas.android.com/apk/res-auto"
+                                                   xmlns:tools="http://schemas.android.com/tools"
+                                                   android:layout_marginLeft="24dp"
+                                                   android:layout_marginRight="24dp"
+                                                   android:layout_width="match_parent"
+                                                   android:layout_height="wrap_content">
 
     <ImageView
         android:id="@+id/animationView"
@@ -51,4 +51,4 @@
         app:layout_constraintTop_toTopOf="@+id/animationView"/>
 
 
-</android.support.constraint.ConstraintLayout>
\ No newline at end of file
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/LottieSample/src/main/res/layout/item_view_showcase_demo.xml b/LottieSample/src/main/res/layout/item_view_showcase_demo.xml
index 601fa60..c935b4f 100644
--- a/LottieSample/src/main/res/layout/item_view_showcase_demo.xml
+++ b/LottieSample/src/main/res/layout/item_view_showcase_demo.xml
@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     tools:parentTag="android.widget.FrameLayout">
 
-    <android.support.v7.widget.CardView
+    <androidx.cardview.widget.CardView
         android:id="@+id/cardView"
         android:layout_width="196dp"
         android:layout_height="108dp"
@@ -29,5 +29,5 @@
             android:layout_marginLeft="12dp"
             android:textColor="@color/text_color_dark"
             android:textSize="20sp"/>
-    </android.support.v7.widget.CardView>
+    </androidx.cardview.widget.CardView>
 </merge>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index c43e143..e839523 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,9 +1,9 @@
 import org.ajoberstar.grgit.Grgit
 
 buildscript {
-  ext.kotlinVersion = '1.2.51'
-  ext.supportLibVersion = '27.1.1'
-  ext.navVersion = '1.0.0-alpha04'
+  ext.kotlinVersion = '1.2.70'
+  ext.androidXVersion = '1.0.0'
+  ext.navVersion = '1.0.0-alpha06'
 
   repositories {
     jcenter()
@@ -11,7 +11,7 @@
   }
   dependencies {
     classpath 'org.ajoberstar:grgit:1.9.3'
-    classpath 'com.android.tools.build:gradle:3.1.3'
+    classpath 'com.android.tools.build:gradle:3.2.0'
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
     classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlinVersion"
     classpath 'org.ajoberstar:grgit:1.9.3'
@@ -25,6 +25,9 @@
     maven {
       url "https://jitpack.io"
     }
+    maven {
+      url "https://oss.sonatype.org/content/repositories/snapshots/"
+    }
     flatDir {
       dirs 'libs'
     }
diff --git a/gradle.properties b/gradle.properties
index c11575e..e9ce997 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -32,3 +32,5 @@
 POM_DEVELOPER_NAME=Airbnb
 POM_DEVELOPER_EMAIL=lottie@airbnb.com
 POM_INCEPTION_YEAR=2017
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 936f240..4caf1df 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
diff --git a/lottie/build.gradle b/lottie/build.gradle
index e98d46b..0d1e038 100644
--- a/lottie/build.gradle
+++ b/lottie/build.gradle
@@ -2,12 +2,12 @@
 apply plugin: 'com.android.library'
 
 android {
-  compileSdkVersion 27
+  compileSdkVersion 28
   resourcePrefix 'lottie_'
 
   defaultConfig {
     minSdkVersion 16
-    targetSdkVersion 27
+    targetSdkVersion 28
     versionCode 100
     versionName "2.7.0"
   }
@@ -28,10 +28,10 @@
 }
 
 dependencies {
-  implementation "com.android.support:appcompat-v7:$supportLibVersion"
+  implementation "androidx.appcompat:appcompat:${androidXVersion}"
   testImplementation "org.mockito:mockito-core:2.15.0"
   testImplementation 'junit:junit:4.12'
-  testImplementation "org.robolectric:robolectric:3.5.1"
+  testImplementation "org.robolectric:robolectric:4.0-alpha-3"
 }
 
 task javadoc(type: Javadoc) {
diff --git a/lottie/src/main/java/com/airbnb/lottie/L.java b/lottie/src/main/java/com/airbnb/lottie/L.java
index 1e1dda9..319958b 100644
--- a/lottie/src/main/java/com/airbnb/lottie/L.java
+++ b/lottie/src/main/java/com/airbnb/lottie/L.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie;
 
-import android.support.annotation.RestrictTo;
-import android.support.v4.os.TraceCompat;
+import androidx.annotation.RestrictTo;
+import androidx.core.os.TraceCompat;
 import android.util.Log;
 
 import java.util.HashSet;
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
index 9c3a379..e6c42d5 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieAnimationView.java
@@ -10,26 +10,23 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.annotation.FloatRange;
-import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RawRes;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.widget.AppCompatImageView;
+import androidx.annotation.FloatRange;
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RawRes;
+import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.widget.AppCompatImageView;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.JsonReader;
 import android.util.Log;
 
 import com.airbnb.lottie.model.KeyPath;
-import com.airbnb.lottie.model.LottieCompositionCache;
 import com.airbnb.lottie.value.LottieFrameInfo;
 import com.airbnb.lottie.value.LottieValueCallback;
 import com.airbnb.lottie.value.SimpleLottieValueCallback;
 
-import org.json.JSONObject;
-
 import java.io.StringReader;
 import java.util.HashSet;
 import java.util.List;
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieComposition.java b/lottie/src/main/java/com/airbnb/lottie/LottieComposition.java
index 5a0a9ce..d7578a2 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieComposition.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieComposition.java
@@ -3,12 +3,12 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
-import android.support.annotation.Nullable;
-import android.support.annotation.RawRes;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.WorkerThread;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SparseArrayCompat;
+import androidx.annotation.Nullable;
+import androidx.annotation.RawRes;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.WorkerThread;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SparseArrayCompat;
 import android.util.JsonReader;
 import android.util.Log;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java b/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java
index 0eb9350..02ed667 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java
@@ -4,9 +4,9 @@
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.support.annotation.Nullable;
-import android.support.annotation.RawRes;
-import android.support.annotation.WorkerThread;
+import androidx.annotation.Nullable;
+import androidx.annotation.RawRes;
+import androidx.annotation.WorkerThread;
 import android.util.JsonReader;
 import android.util.Log;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
index a2b3e4a..a10d594 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieDrawable.java
@@ -12,12 +12,12 @@
 import android.graphics.drawable.Animatable;
 import android.graphics.drawable.Drawable;
 import android.os.Build;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import android.util.Log;
 import android.view.View;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieImageAsset.java b/lottie/src/main/java/com/airbnb/lottie/LottieImageAsset.java
index 33f268f..2c8f1d0 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieImageAsset.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieImageAsset.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie;
 
 import android.graphics.Bitmap;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 
 /**
  * Data class describing an image asset exported by bodymovin.
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieResult.java b/lottie/src/main/java/com/airbnb/lottie/LottieResult.java
index 1f290d4..5ebefe7 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieResult.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieResult.java
@@ -1,9 +1,8 @@
 package com.airbnb.lottie;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import java.util.Arrays;
-import java.util.Objects;
 
 /**
  * Contains class to hold the resulting value of an async task or an exception if it failed.
diff --git a/lottie/src/main/java/com/airbnb/lottie/LottieTask.java b/lottie/src/main/java/com/airbnb/lottie/LottieTask.java
index 42ef483..785cbc1 100644
--- a/lottie/src/main/java/com/airbnb/lottie/LottieTask.java
+++ b/lottie/src/main/java/com/airbnb/lottie/LottieTask.java
@@ -2,8 +2,8 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 import android.util.Log;
 
 import java.util.ArrayList;
diff --git a/lottie/src/main/java/com/airbnb/lottie/OnCompositionLoadedListener.java b/lottie/src/main/java/com/airbnb/lottie/OnCompositionLoadedListener.java
index 71fc341..e42956a 100644
--- a/lottie/src/main/java/com/airbnb/lottie/OnCompositionLoadedListener.java
+++ b/lottie/src/main/java/com/airbnb/lottie/OnCompositionLoadedListener.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 /**
  * @see LottieCompositionFactory
diff --git a/lottie/src/main/java/com/airbnb/lottie/PerformanceTracker.java b/lottie/src/main/java/com/airbnb/lottie/PerformanceTracker.java
index 0790dc5..e41cbff 100644
--- a/lottie/src/main/java/com/airbnb/lottie/PerformanceTracker.java
+++ b/lottie/src/main/java/com/airbnb/lottie/PerformanceTracker.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie;
 
-import android.support.v4.util.ArraySet;
-import android.support.v4.util.Pair;
+import androidx.collection.ArraySet;
+import androidx.core.util.Pair;
 import android.util.Log;
 
 import com.airbnb.lottie.utils.MeanCalculator;
diff --git a/lottie/src/main/java/com/airbnb/lottie/SimpleColorFilter.java b/lottie/src/main/java/com/airbnb/lottie/SimpleColorFilter.java
index 30e9eb3..c6a21ef 100644
--- a/lottie/src/main/java/com/airbnb/lottie/SimpleColorFilter.java
+++ b/lottie/src/main/java/com/airbnb/lottie/SimpleColorFilter.java
@@ -2,7 +2,7 @@
 
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffColorFilter;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
 
 /**
  * A color filter with a predefined transfer mode that applies the specified color on top of the
diff --git a/lottie/src/main/java/com/airbnb/lottie/TextDelegate.java b/lottie/src/main/java/com/airbnb/lottie/TextDelegate.java
index 7784a6b..1682f97 100644
--- a/lottie/src/main/java/com/airbnb/lottie/TextDelegate.java
+++ b/lottie/src/main/java/com/airbnb/lottie/TextDelegate.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie;
 
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java
index 2c489ac..809d401 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/BaseStrokeContent.java
@@ -8,14 +8,13 @@
 import android.graphics.Path;
 import android.graphics.PathMeasure;
 import android.graphics.RectF;
-import android.support.annotation.CallSuper;
-import android.support.annotation.Nullable;
+import androidx.annotation.CallSuper;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
-import com.airbnb.lottie.animation.keyframe.FloatKeyframeAnimation;
 import com.airbnb.lottie.animation.keyframe.ValueCallbackKeyframeAnimation;
 import com.airbnb.lottie.model.KeyPath;
 import com.airbnb.lottie.model.animatable.AnimatableFloatValue;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java
index 9433e66..306c96f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/ContentGroup.java
@@ -4,7 +4,7 @@
 import android.graphics.Matrix;
 import android.graphics.Path;
 import android.graphics.RectF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/EllipseContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/EllipseContent.java
index 40739d8..dbc4ffb 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/EllipseContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/EllipseContent.java
@@ -2,7 +2,7 @@
 
 import android.graphics.Path;
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
index 06d8130..8312b56 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/FillContent.java
@@ -6,7 +6,7 @@
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.RectF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java
index 863d391..58f4afb 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientFillContent.java
@@ -10,9 +10,9 @@
 import android.graphics.RadialGradient;
 import android.graphics.RectF;
 import android.graphics.Shader;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.util.LongSparseArray;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.collection.LongSparseArray;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientStrokeContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientStrokeContent.java
index 8f7198a..29aa65e 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientStrokeContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/GradientStrokeContent.java
@@ -7,7 +7,7 @@
 import android.graphics.RadialGradient;
 import android.graphics.RectF;
 import android.graphics.Shader;
-import android.support.v4.util.LongSparseArray;
+import androidx.collection.LongSparseArray;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/PolystarContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/PolystarContent.java
index c439d39..a204e41 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/PolystarContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/PolystarContent.java
@@ -2,7 +2,7 @@
 
 import android.graphics.Path;
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/RectangleContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/RectangleContent.java
index 3254a7b..0b6ecbe 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/RectangleContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/RectangleContent.java
@@ -3,7 +3,7 @@
 import android.graphics.Path;
 import android.graphics.PointF;
 import android.graphics.RectF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/RepeaterContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/RepeaterContent.java
index 338efec..506fb43 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/RepeaterContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/RepeaterContent.java
@@ -4,7 +4,7 @@
 import android.graphics.Matrix;
 import android.graphics.Path;
 import android.graphics.RectF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java
index e1c6ef3..5d45292 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/ShapeContent.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.animation.content;
 
 import android.graphics.Path;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/StrokeContent.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/StrokeContent.java
index 5542d2e..3e3f449 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/StrokeContent.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/StrokeContent.java
@@ -3,7 +3,7 @@
 import android.graphics.Canvas;
 import android.graphics.ColorFilter;
 import android.graphics.Matrix;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/content/package-info.java b/lottie/src/main/java/com/airbnb/lottie/animation/content/package-info.java
index a2e92c7..0ef11ae 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/content/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/content/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.animation.content;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java
index 04d9418..d115c36 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.animation.keyframe;
 
-import android.support.annotation.FloatRange;
-import android.support.annotation.Nullable;
+import androidx.annotation.FloatRange;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.value.LottieValueCallback;
 import com.airbnb.lottie.value.Keyframe;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframe.java b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframe.java
index 9949d8a..cc8f3b9 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframe.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/PathKeyframe.java
@@ -2,7 +2,7 @@
 
 import android.graphics.Path;
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieComposition;
 import com.airbnb.lottie.value.Keyframe;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation.java b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation.java
index 18ae857..3fc0ef2 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/TransformKeyframeAnimation.java
@@ -2,7 +2,7 @@
 
 import android.graphics.Matrix;
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.value.LottieValueCallback;
 import com.airbnb.lottie.value.ScaleXY;
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/package-info.java b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/package-info.java
index e0635e1..fe27111 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/keyframe/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.animation.keyframe;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/animation/package-info.java b/lottie/src/main/java/com/airbnb/lottie/animation/package-info.java
index fe93824..5b8b264 100644
--- a/lottie/src/main/java/com/airbnb/lottie/animation/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/animation/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.animation;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/manager/FontAssetManager.java b/lottie/src/main/java/com/airbnb/lottie/manager/FontAssetManager.java
index a6e3ccb..c7b5e37 100644
--- a/lottie/src/main/java/com/airbnb/lottie/manager/FontAssetManager.java
+++ b/lottie/src/main/java/com/airbnb/lottie/manager/FontAssetManager.java
@@ -3,7 +3,7 @@
 import android.content.res.AssetManager;
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 import android.util.Log;
 import android.view.View;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java b/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java
index 6f1764d..cb7237a 100644
--- a/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java
+++ b/lottie/src/main/java/com/airbnb/lottie/manager/ImageAssetManager.java
@@ -4,7 +4,7 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 import android.text.TextUtils;
 import android.util.Base64;
 import android.util.Log;
@@ -17,7 +17,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 public class ImageAssetManager {
diff --git a/lottie/src/main/java/com/airbnb/lottie/manager/package-info.java b/lottie/src/main/java/com/airbnb/lottie/manager/package-info.java
index 69ae3b7..87a0854 100644
--- a/lottie/src/main/java/com/airbnb/lottie/manager/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/manager/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.manager;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/CubicCurveData.java b/lottie/src/main/java/com/airbnb/lottie/model/CubicCurveData.java
index 82d3e5a..f150ff2 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/CubicCurveData.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/CubicCurveData.java
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.model;
 
 import android.graphics.PointF;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 @RestrictTo(LIBRARY)
 public class CubicCurveData {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/DocumentData.java b/lottie/src/main/java/com/airbnb/lottie/model/DocumentData.java
index 50097e0..e7b8b33 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/DocumentData.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/DocumentData.java
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.ColorInt;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.ColorInt;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 @RestrictTo(LIBRARY)
 public class DocumentData {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/Font.java b/lottie/src/main/java/com/airbnb/lottie/model/Font.java
index f5f59cf..89be53f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/Font.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/Font.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 @RestrictTo(LIBRARY)
 public class Font {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/FontCharacter.java b/lottie/src/main/java/com/airbnb/lottie/model/FontCharacter.java
index 29044d8..e09fbbd 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/FontCharacter.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/FontCharacter.java
@@ -1,12 +1,12 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
 import com.airbnb.lottie.model.content.ShapeGroup;
 
 import java.util.List;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 @RestrictTo(LIBRARY)
 public class FontCharacter {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/KeyPath.java b/lottie/src/main/java/com/airbnb/lottie/model/KeyPath.java
index 509ff71..18720e9 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/KeyPath.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/KeyPath.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.CheckResult;
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.CheckResult;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/KeyPathElement.java b/lottie/src/main/java/com/airbnb/lottie/model/KeyPathElement.java
index df0f703..b3a095f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/KeyPathElement.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/KeyPathElement.java
@@ -1,13 +1,13 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 
 import com.airbnb.lottie.value.LottieValueCallback;
 
 import java.util.List;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 /**
  * Any item that can be a part of a {@link KeyPath} should implement this.
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/LottieCompositionCache.java b/lottie/src/main/java/com/airbnb/lottie/model/LottieCompositionCache.java
index 7a3f044..c8ea8f7 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/LottieCompositionCache.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/LottieCompositionCache.java
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.util.LruCache;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.annotation.VisibleForTesting;
+import androidx.collection.LruCache;
 
 import com.airbnb.lottie.LottieComposition;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/MutablePair.java b/lottie/src/main/java/com/airbnb/lottie/model/MutablePair.java
index f45c425..e116601 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/MutablePair.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/MutablePair.java
@@ -1,10 +1,10 @@
 package com.airbnb.lottie.model;
 
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
-import android.support.v4.util.Pair;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+import androidx.core.util.Pair;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 /**
  * Non final version of {@link Pair}
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTextProperties.java b/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTextProperties.java
index 10056d2..1b72bb3 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTextProperties.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTextProperties.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.model.animatable;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 public class AnimatableTextProperties {
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java b/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java
index a628a44..bd80786 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/animatable/AnimatableTransform.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.model.animatable;
 
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/animatable/package-info.java b/lottie/src/main/java/com/airbnb/lottie/model/animatable/package-info.java
index 94c9917..b64d3a6 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/animatable/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/animatable/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.model.animatable;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java
index 5256f8c..2e92685 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ContentModel.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.model.content;
 
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java
index cf1ecdf..090d8fe 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientFill.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.model.content;
 
 import android.graphics.Path;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java
index 4bf5954..671aeba 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/GradientStroke.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.model.content;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java b/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java
index 5ce9fec..d9345ea 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/MergePaths.java
@@ -1,7 +1,6 @@
 package com.airbnb.lottie.model.content;
 
-import android.support.annotation.Nullable;
-import android.util.Log;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieDrawable;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java b/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java
index 140a5df..2aa1c76 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/Repeater.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.model.content;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java
index e851c21..e1413a2 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeData.java
@@ -1,8 +1,7 @@
 package com.airbnb.lottie.model.content;
 
 import android.graphics.PointF;
-import android.support.annotation.FloatRange;
-import android.util.Log;
+import androidx.annotation.FloatRange;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.model.CubicCurveData;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java
index ecdb17e..028b110 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeFill.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.model.content;
 
 import android.graphics.Path;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java
index e68601e..1fabcd5 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/ShapeStroke.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.model.content;
 
 import android.graphics.Paint;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/content/package-info.java b/lottie/src/main/java/com/airbnb/lottie/model/content/package-info.java
index 4b31ea1..4a474d3 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/content/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/content/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.model.content;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
index c8cd783..89b2790 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/BaseLayer.java
@@ -1,19 +1,11 @@
 package com.airbnb.lottie.model.layer;
 
 import android.annotation.SuppressLint;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.RectF;
+import android.graphics.*;
 import android.os.Build;
-import android.support.annotation.CallSuper;
-import android.support.annotation.FloatRange;
-import android.support.annotation.Nullable;
-import android.util.Log;
-
+import androidx.annotation.CallSuper;
+import androidx.annotation.FloatRange;
+import androidx.annotation.Nullable;
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieComposition;
 import com.airbnb.lottie.LottieDrawable;
@@ -34,8 +26,14 @@
 
 public abstract class BaseLayer
     implements DrawingContent, BaseKeyframeAnimation.AnimationListener, KeyPathElement {
-  private static final int SAVE_FLAGS = Canvas.CLIP_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG |
-      Canvas.MATRIX_SAVE_FLAG;
+  /**
+   * These flags were in Canvas but they were deprecated and removed.
+   * TODO: test removing these on older versions of Android.
+   */
+    private static final int CLIP_SAVE_FLAG = 0x02;
+    private static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10;
+    private static final int MATRIX_SAVE_FLAG = 0x01;
+    private static final int SAVE_FLAGS = CLIP_SAVE_FLAG | CLIP_TO_LAYER_SAVE_FLAG | MATRIX_SAVE_FLAG;
 
   @Nullable
   static BaseLayer forModel(
@@ -161,7 +159,7 @@
   @SuppressLint("WrongConstant")
   private void saveLayerCompat(Canvas canvas, RectF rect, Paint paint, boolean all) {
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-      // This method was deprecated in API level 26 and not recommented since 22, but its
+      // This method was deprecated in API level 26 and not recommended since 22, but its
       // 2-parameter replacement is only available starting at API level 21.
       canvas.saveLayer(rect, paint, all ? Canvas.ALL_SAVE_FLAG : SAVE_FLAGS);
     } else {
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java
index 33e55c8..97d9e25 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/CompositionLayer.java
@@ -3,9 +3,9 @@
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.RectF;
-import android.support.annotation.FloatRange;
-import android.support.annotation.Nullable;
-import android.support.v4.util.LongSparseArray;
+import androidx.annotation.FloatRange;
+import androidx.annotation.Nullable;
+import androidx.collection.LongSparseArray;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieComposition;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
index 32fee88..7f5186f 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/ImageLayer.java
@@ -7,8 +7,8 @@
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.RectF;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/Layer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/Layer.java
index 725abe9..a936208 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/Layer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/Layer.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.model.layer;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieComposition;
 import com.airbnb.lottie.value.Keyframe;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java
index 71f0b89..6ffdb75 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/ShapeLayer.java
@@ -3,7 +3,7 @@
 import android.graphics.Canvas;
 import android.graphics.Matrix;
 import android.graphics.RectF;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.animation.content.Content;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
index 7696fb3..0454525 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/SolidLayer.java
@@ -7,7 +7,7 @@
 import android.graphics.Paint;
 import android.graphics.Path;
 import android.graphics.RectF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieDrawable;
 import com.airbnb.lottie.LottieProperty;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java
index f176eec..7f2aa77 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/TextLayer.java
@@ -7,7 +7,7 @@
 import android.graphics.Path;
 import android.graphics.RectF;
 import android.graphics.Typeface;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.LottieComposition;
 import com.airbnb.lottie.LottieDrawable;
diff --git a/lottie/src/main/java/com/airbnb/lottie/model/layer/package-info.java b/lottie/src/main/java/com/airbnb/lottie/model/layer/package-info.java
index 8cf047b..58db6e7 100644
--- a/lottie/src/main/java/com/airbnb/lottie/model/layer/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/model/layer/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.model.layer;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/network/NetworkCache.java b/lottie/src/main/java/com/airbnb/lottie/network/NetworkCache.java
index ccd50ac..b63322e 100644
--- a/lottie/src/main/java/com/airbnb/lottie/network/NetworkCache.java
+++ b/lottie/src/main/java/com/airbnb/lottie/network/NetworkCache.java
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.network;
 
 import android.content.Context;
-import android.support.annotation.Nullable;
-import android.support.annotation.WorkerThread;
-import android.support.v4.util.Pair;
+import androidx.annotation.Nullable;
+import androidx.annotation.WorkerThread;
+import androidx.core.util.Pair;
 
 import com.airbnb.lottie.L;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/network/NetworkFetcher.java b/lottie/src/main/java/com/airbnb/lottie/network/NetworkFetcher.java
index 01841ab..98566d5 100644
--- a/lottie/src/main/java/com/airbnb/lottie/network/NetworkFetcher.java
+++ b/lottie/src/main/java/com/airbnb/lottie/network/NetworkFetcher.java
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.network;
 
 import android.content.Context;
-import android.support.annotation.Nullable;
-import android.support.annotation.WorkerThread;
-import android.support.v4.util.Pair;
+import androidx.annotation.Nullable;
+import androidx.annotation.WorkerThread;
+import androidx.core.util.Pair;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.LottieComposition;
diff --git a/lottie/src/main/java/com/airbnb/lottie/network/package-info.java b/lottie/src/main/java/com/airbnb/lottie/network/package-info.java
index b85ad1b..7a014de 100644
--- a/lottie/src/main/java/com/airbnb/lottie/network/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/network/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.network;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/AnimatableValueParser.java b/lottie/src/main/java/com/airbnb/lottie/parser/AnimatableValueParser.java
index 611fdc2..b836aad 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/AnimatableValueParser.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/AnimatableValueParser.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.parser;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 import android.util.JsonReader;
 
 import com.airbnb.lottie.LottieComposition;
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/ContentModelParser.java b/lottie/src/main/java/com/airbnb/lottie/parser/ContentModelParser.java
index 1d27cd8..1df423c 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/ContentModelParser.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/ContentModelParser.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.parser;
 
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 import android.util.JsonReader;
 import android.util.Log;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/GradientColorParser.java b/lottie/src/main/java/com/airbnb/lottie/parser/GradientColorParser.java
index e53bfdb..b330693 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/GradientColorParser.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/GradientColorParser.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.parser;
 
 import android.graphics.Color;
-import android.support.annotation.IntRange;
+import androidx.annotation.IntRange;
 import android.util.JsonReader;
 import android.util.JsonToken;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/JsonUtils.java b/lottie/src/main/java/com/airbnb/lottie/parser/JsonUtils.java
index e469caf..26b38dc 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/JsonUtils.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/JsonUtils.java
@@ -2,7 +2,7 @@
 
 import android.graphics.Color;
 import android.graphics.PointF;
-import android.support.annotation.ColorInt;
+import androidx.annotation.ColorInt;
 import android.util.JsonReader;
 import android.util.JsonToken;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/KeyframeParser.java b/lottie/src/main/java/com/airbnb/lottie/parser/KeyframeParser.java
index 0760846..72ed856 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/KeyframeParser.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/KeyframeParser.java
@@ -1,9 +1,9 @@
 package com.airbnb.lottie.parser;
 
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
-import android.support.v4.util.SparseArrayCompat;
-import android.support.v4.view.animation.PathInterpolatorCompat;
+import androidx.annotation.Nullable;
+import androidx.collection.SparseArrayCompat;
+import androidx.core.view.animation.PathInterpolatorCompat;
 import android.util.JsonReader;
 import android.view.animation.Interpolator;
 import android.view.animation.LinearInterpolator;
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/LottieCompositionParser.java b/lottie/src/main/java/com/airbnb/lottie/parser/LottieCompositionParser.java
index d3670d6..c8a387d 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/LottieCompositionParser.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/LottieCompositionParser.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.parser;
 
 import android.graphics.Rect;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SparseArrayCompat;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SparseArrayCompat;
 import android.util.JsonReader;
 
 import com.airbnb.lottie.L;
diff --git a/lottie/src/main/java/com/airbnb/lottie/parser/package-info.java b/lottie/src/main/java/com/airbnb/lottie/parser/package-info.java
index 729a574..fa7edd8 100644
--- a/lottie/src/main/java/com/airbnb/lottie/parser/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/parser/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.parser;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java b/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
index fbeb0a2..18b4863 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/LottieValueAnimator.java
@@ -1,10 +1,10 @@
 package com.airbnb.lottie.utils;
 
 import android.animation.ValueAnimator;
-import android.support.annotation.FloatRange;
-import android.support.annotation.MainThread;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
+import androidx.annotation.FloatRange;
+import androidx.annotation.MainThread;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import android.view.Choreographer;
 
 import com.airbnb.lottie.LottieComposition;
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/MiscUtils.java b/lottie/src/main/java/com/airbnb/lottie/utils/MiscUtils.java
index 45b31be..e3f656b 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/MiscUtils.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/MiscUtils.java
@@ -2,7 +2,7 @@
 
 import android.graphics.Path;
 import android.graphics.PointF;
-import android.support.annotation.FloatRange;
+import androidx.annotation.FloatRange;
 
 import com.airbnb.lottie.animation.content.KeyPathElementContent;
 import com.airbnb.lottie.model.CubicCurveData;
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java b/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
index c0f2acf..dde5ad6 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/Utils.java
@@ -5,7 +5,7 @@
 import android.graphics.Path;
 import android.graphics.PathMeasure;
 import android.graphics.PointF;
-import android.support.annotation.Nullable;
+import androidx.annotation.Nullable;
 
 import com.airbnb.lottie.L;
 import com.airbnb.lottie.animation.content.TrimPathContent;
diff --git a/lottie/src/main/java/com/airbnb/lottie/utils/package-info.java b/lottie/src/main/java/com/airbnb/lottie/utils/package-info.java
index 2b4efe8..7bf2a4c 100644
--- a/lottie/src/main/java/com/airbnb/lottie/utils/package-info.java
+++ b/lottie/src/main/java/com/airbnb/lottie/utils/package-info.java
@@ -1,6 +1,6 @@
 @RestrictTo(LIBRARY)
 package com.airbnb.lottie.utils;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
\ No newline at end of file
diff --git a/lottie/src/main/java/com/airbnb/lottie/value/Keyframe.java b/lottie/src/main/java/com/airbnb/lottie/value/Keyframe.java
index 6c1e68b..6a42077 100644
--- a/lottie/src/main/java/com/airbnb/lottie/value/Keyframe.java
+++ b/lottie/src/main/java/com/airbnb/lottie/value/Keyframe.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.value;
 
 import android.graphics.PointF;
-import android.support.annotation.FloatRange;
-import android.support.annotation.Nullable;
+import androidx.annotation.FloatRange;
+import androidx.annotation.Nullable;
 import android.view.animation.Interpolator;
 
 import com.airbnb.lottie.LottieComposition;
diff --git a/lottie/src/main/java/com/airbnb/lottie/value/LottieFrameInfo.java b/lottie/src/main/java/com/airbnb/lottie/value/LottieFrameInfo.java
index 231decc..95f80df 100644
--- a/lottie/src/main/java/com/airbnb/lottie/value/LottieFrameInfo.java
+++ b/lottie/src/main/java/com/airbnb/lottie/value/LottieFrameInfo.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.value;
 
-import android.support.annotation.RestrictTo;
+import androidx.annotation.RestrictTo;
 
 /**
  * Data class for use with {@link LottieValueCallback}.
diff --git a/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativeFloatValueCallback.java b/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativeFloatValueCallback.java
index a2db77e..cd22a42 100644
--- a/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativeFloatValueCallback.java
+++ b/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativeFloatValueCallback.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie.value;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.airbnb.lottie.utils.MiscUtils;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativePointValueCallback.java b/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativePointValueCallback.java
index ed49510..f0a7446 100644
--- a/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativePointValueCallback.java
+++ b/lottie/src/main/java/com/airbnb/lottie/value/LottieRelativePointValueCallback.java
@@ -1,7 +1,7 @@
 package com.airbnb.lottie.value;
 
 import android.graphics.PointF;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.airbnb.lottie.utils.MiscUtils;
 
diff --git a/lottie/src/main/java/com/airbnb/lottie/value/LottieValueCallback.java b/lottie/src/main/java/com/airbnb/lottie/value/LottieValueCallback.java
index a30d8f9..6e3354b 100644
--- a/lottie/src/main/java/com/airbnb/lottie/value/LottieValueCallback.java
+++ b/lottie/src/main/java/com/airbnb/lottie/value/LottieValueCallback.java
@@ -1,8 +1,8 @@
 package com.airbnb.lottie.value;
 
 
-import android.support.annotation.Nullable;
-import android.support.annotation.RestrictTo;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
 
 import com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation;
 
diff --git a/lottie/src/test/java/com/airbnb/lottie/BaseTest.java b/lottie/src/test/java/com/airbnb/lottie/BaseTest.java
new file mode 100644
index 0000000..33ec1eb
--- /dev/null
+++ b/lottie/src/test/java/com/airbnb/lottie/BaseTest.java
@@ -0,0 +1,12 @@
+package com.airbnb.lottie;
+
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config
+@Ignore
+public class BaseTest {
+}
diff --git a/lottie/src/test/java/com/airbnb/lottie/KeyPathTest.java b/lottie/src/test/java/com/airbnb/lottie/KeyPathTest.java
index 71d26fb..45a3165 100644
--- a/lottie/src/test/java/com/airbnb/lottie/KeyPathTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/KeyPathTest.java
@@ -15,8 +15,7 @@
 
 import static junit.framework.Assert.assertEquals;
 
-@RunWith(RobolectricTestRunner.class)
-public class KeyPathTest {
+public class KeyPathTest extends BaseTest {
   private static final String[] V = {
       "Shape Layer 1",
       "Group 1",
diff --git a/lottie/src/test/java/com/airbnb/lottie/LottieCompositionFactoryTest.java b/lottie/src/test/java/com/airbnb/lottie/LottieCompositionFactoryTest.java
index 0687025..ba2c162 100644
--- a/lottie/src/test/java/com/airbnb/lottie/LottieCompositionFactoryTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/LottieCompositionFactoryTest.java
@@ -19,9 +19,7 @@
 import static junit.framework.Assert.assertNotNull;
 import static junit.framework.Assert.assertNull;
 
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class)
-public class LottieCompositionFactoryTest {
+public class LottieCompositionFactoryTest extends BaseTest {
   private static final String JSON = "{\"v\":\"4.11.1\",\"fr\":60,\"ip\":0,\"op\":180,\"w\":300,\"h\":300,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[]," +
       "\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Shape Layer 1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0," +
       "\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[150,150,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100]," +
diff --git a/lottie/src/test/java/com/airbnb/lottie/LottieDrawableTest.java b/lottie/src/test/java/com/airbnb/lottie/LottieDrawableTest.java
index 45dc654..195420e 100644
--- a/lottie/src/test/java/com/airbnb/lottie/LottieDrawableTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/LottieDrawableTest.java
@@ -1,17 +1,12 @@
 package com.airbnb.lottie;
 
 import android.graphics.Rect;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SparseArrayCompat;
-
+import androidx.collection.LongSparseArray;
+import androidx.collection.SparseArrayCompat;
 import com.airbnb.lottie.model.Font;
 import com.airbnb.lottie.model.FontCharacter;
 import com.airbnb.lottie.model.layer.Layer;
-
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -19,9 +14,7 @@
 
 import static junit.framework.Assert.assertEquals;
 
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class)
-public class LottieDrawableTest {
+public class LottieDrawableTest extends BaseTest {
 
   @SuppressWarnings("SameParameterValue")
   private LottieComposition createComposition(int startFrame, int endFrame) {
diff --git a/lottie/src/test/java/com/airbnb/lottie/LottieTaskTest.java b/lottie/src/test/java/com/airbnb/lottie/LottieTaskTest.java
index 0b28cb2..4dbb4ea 100644
--- a/lottie/src/test/java/com/airbnb/lottie/LottieTaskTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/LottieTaskTest.java
@@ -3,25 +3,15 @@
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.Semaphore;
 
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.*;
 
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class)
-public class LottieTaskTest {
+public class LottieTaskTest extends BaseTest {
 
   @Mock
   public LottieListener<Integer> successListener;
diff --git a/lottie/src/test/java/com/airbnb/lottie/LottieValueAnimatorUnitTest.java b/lottie/src/test/java/com/airbnb/lottie/LottieValueAnimatorUnitTest.java
index 235a968..0ed3c86 100644
--- a/lottie/src/test/java/com/airbnb/lottie/LottieValueAnimatorUnitTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/LottieValueAnimatorUnitTest.java
@@ -3,21 +3,16 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.graphics.Rect;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SparseArrayCompat;
-
+import androidx.collection.LongSparseArray;
+import androidx.collection.SparseArrayCompat;
 import com.airbnb.lottie.model.Font;
 import com.airbnb.lottie.model.FontCharacter;
 import com.airbnb.lottie.model.layer.Layer;
 import com.airbnb.lottie.utils.LottieValueAnimator;
-
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 import org.mockito.InOrder;
 import org.mockito.Mockito;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,9 +23,7 @@
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.times;
 
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class)
-public class LottieValueAnimatorUnitTest {
+public class LottieValueAnimatorUnitTest extends BaseTest {
   private interface VerifyListener {
     void verify(InOrder inOrder);
   }
diff --git a/lottie/src/test/java/com/airbnb/lottie/PerformanceTrackerTest.java b/lottie/src/test/java/com/airbnb/lottie/PerformanceTrackerTest.java
index c71419d..f6f0bc2 100644
--- a/lottie/src/test/java/com/airbnb/lottie/PerformanceTrackerTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/PerformanceTrackerTest.java
@@ -1,6 +1,6 @@
 package com.airbnb.lottie;
 
-import android.support.v4.util.Pair;
+import androidx.core.util.Pair;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/lottie/src/test/java/com/airbnb/lottie/model/LottieCompositionCacheTest.java b/lottie/src/test/java/com/airbnb/lottie/model/LottieCompositionCacheTest.java
index e31567f..86842e0 100644
--- a/lottie/src/test/java/com/airbnb/lottie/model/LottieCompositionCacheTest.java
+++ b/lottie/src/test/java/com/airbnb/lottie/model/LottieCompositionCacheTest.java
@@ -1,5 +1,6 @@
 package com.airbnb.lottie.model;
 
+import com.airbnb.lottie.BaseTest;
 import com.airbnb.lottie.BuildConfig;
 import com.airbnb.lottie.LottieAnimationView;
 import com.airbnb.lottie.LottieComposition;
@@ -14,9 +15,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class)
-public class LottieCompositionCacheTest {
+public class LottieCompositionCacheTest extends BaseTest  {
 
   private LottieComposition composition;
   private LottieCompositionCache cache;