[go: nahoru, domu]

Fix lint baseline in emoji2

- Applied nullability annotations universally to annotate existing
behavior
- Supressed warnings for kotlin bean style
- Supressed warnings for api21 ctors

Refactored test constructor in MetadaRepository to allow new
nullability.

No changes to behavior, and no changes in nullability.

Bug: b/178035684
Test: automated manual
Change-Id: I8a29d4da785ff72ebcede6eb5750c8dd5c919965
diff --git a/emoji2/emoji2-bundled/lint-baseline.xml b/emoji2/emoji2-bundled/lint-baseline.xml
deleted file mode 100644
index 27e26a8..0000000
--- a/emoji2/emoji2-bundled/lint-baseline.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-</issues>
diff --git a/emoji2/emoji2-views-core/lint-baseline.xml b/emoji2/emoji2-views-core/lint-baseline.xml
deleted file mode 100644
index b4d30ed..0000000
--- a/emoji2/emoji2-views-core/lint-baseline.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji2.helpers.EmojiInputFilter.InitCallbackImpl is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            if (textView != null &amp;&amp; textView.isAttachedToWindow()) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java"
-            line="110"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji2.helpers.EmojiTextWatcher.InitCallbackImpl is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="            if (editText != null &amp;&amp; editText.isAttachedToWindow()) {"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java"
-            line="122"
-            column="46"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="                final KeyEvent event) {"
-        errorLine2="                      ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java"
-            line="80"
-            column="23"/>
-    </issue>
-
-</issues>
diff --git a/emoji2/emoji2-views-core/src/androidTest/AndroidManifest.xml b/emoji2/emoji2-views-core/src/androidTest/AndroidManifest.xml
index ed2f1d2..6c30771 100644
--- a/emoji2/emoji2-views-core/src/androidTest/AndroidManifest.xml
+++ b/emoji2/emoji2-views-core/src/androidTest/AndroidManifest.xml
@@ -13,8 +13,7 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="androidx.emoji2.helpers">
+<manifest package="androidx.emoji2.helpers">
 
     <application>
     </application>
diff --git a/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java b/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java
index be05e42..ccb3033 100644
--- a/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java
+++ b/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiInputFilter.java
@@ -96,6 +96,7 @@
         return mInitCallback;
     }
 
+    @RequiresApi(19)
     private static class InitCallbackImpl extends InitCallback {
         private final Reference<TextView> mViewRef;
 
diff --git a/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java b/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java
index fcd8e0a..a5b2129 100644
--- a/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java
+++ b/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiKeyListener.java
@@ -77,7 +77,7 @@
 
     public static class EmojiCompatHandleKeyDownHelper {
         public boolean handleKeyDown(@NonNull final Editable editable, final int keyCode,
-                final KeyEvent event) {
+                @NonNull final KeyEvent event) {
             return EmojiCompat.handleOnKeyDown(editable, keyCode, event);
         }
     }
diff --git a/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java b/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java
index d6676c1..43887bb 100644
--- a/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java
+++ b/emoji2/emoji2-views-core/src/main/java/androidx/emoji2/helpers/EmojiTextWatcher.java
@@ -108,6 +108,7 @@
         return mInitCallback;
     }
 
+    @RequiresApi(19)
     private static class InitCallbackImpl extends InitCallback {
         private final Reference<EditText> mViewRef;
 
diff --git a/emoji2/emoji2-views/lint-baseline.xml b/emoji2/emoji2-views/lint-baseline.xml
deleted file mode 100644
index 2f76b6b..0000000
--- a/emoji2/emoji2-views/lint-baseline.xml
+++ /dev/null
@@ -1,664 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji2.widget.EmojiButton is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="59"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji2.widget.EmojiEditText is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="66"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji2.widget.EmojiExtractEditText is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="75"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji2.widget.EmojiExtractTextLayout is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="99"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji2.widget.EmojiTextView is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="59"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 21, the call containing class androidx.emoji2.widget.ExtractButtonCompat is not annotated with @RequiresApi(x) where x is at least 21. Either annotate the containing class with at least @RequiresApi(21) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(21)."
-        errorLine1="        super(context, attrs, defStyleAttr, defStyleRes);"
-        errorLine2="        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="53"
-            column="9"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EditTextAttributeHelper(@NonNull View view, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                                       ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EditTextAttributeHelper.java"
-            line="40"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="42"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context, AttributeSet attrs) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="47"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context, AttributeSet attrs) {"
-        errorLine2="                                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="47"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="52"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="52"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="58"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                                        ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="58"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setFilters(InputFilter[] filters) {"
-        errorLine2="                           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="71"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiButton.java"
-            line="93"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="49"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context, AttributeSet attrs) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="54"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context, AttributeSet attrs) {"
-        errorLine2="                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="54"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="59"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="59"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="65"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="65"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="89"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="                                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="89"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiEditText.java"
-            line="134"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context) {"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="57"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context, AttributeSet attrs) {"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="62"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context, AttributeSet attrs) {"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="62"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="67"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="67"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="73"
-            column="33"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="73"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="           ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="98"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
-        errorLine2="                                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="98"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java"
-            line="162"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractTextLayout(Context context) {"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="79"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractTextLayout(Context context,"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="84"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractTextLayout(Context context,"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="90"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractTextLayout(Context context, AttributeSet attrs,"
-        errorLine2="                                  ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="97"
-            column="35"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiExtractTextLayout(Context context, AttributeSet attrs,"
-        errorLine2="                                                   ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="97"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onUpdateExtractingViews(InputMethodService inputMethodService, EditorInfo ei) {"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="163"
-            column="41"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void onUpdateExtractingViews(InputMethodService inputMethodService, EditorInfo ei) {"
-        errorLine2="                                                                               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java"
-            line="163"
-            column="80"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="42"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context, AttributeSet attrs) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="47"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context, AttributeSet attrs) {"
-        errorLine2="                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="47"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="52"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="52"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                         ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="58"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
-        errorLine2="                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="58"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setFilters(InputFilter[] filters) {"
-        errorLine2="                           ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="71"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/EmojiTextView.java"
-            line="93"
-            column="54"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="38"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context, AttributeSet attrs) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="42"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context, AttributeSet attrs) {"
-        errorLine2="                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="42"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="46"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context, AttributeSet attrs, int defStyleAttr) {"
-        errorLine2="                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="46"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="51"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public ExtractButtonCompat(Context context, AttributeSet attrs, int defStyleAttr,"
-        errorLine2="                                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="51"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java"
-            line="70"
-            column="54"/>
-    </issue>
-
-</issues>
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EditTextAttributeHelper.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EditTextAttributeHelper.java
index cc397a2..1fee3e1 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EditTextAttributeHelper.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EditTextAttributeHelper.java
@@ -24,6 +24,7 @@
 import android.view.View;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.emoji2.text.EmojiDefaults;
 
@@ -36,8 +37,8 @@
 public class EditTextAttributeHelper {
     private int mMaxEmojiCount;
 
-    public EditTextAttributeHelper(@NonNull View view, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public EditTextAttributeHelper(@NonNull View view, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         if (attrs != null) {
             final Context context = view.getContext();
             TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EmojiEditText,
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java
index 737c951..1b20ab5 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiButton.java
@@ -15,6 +15,7 @@
  */
 package androidx.emoji2.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.os.Build;
 import android.text.InputFilter;
@@ -22,6 +23,8 @@
 import android.view.ActionMode;
 import android.widget.Button;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.widget.TextViewCompat;
 import androidx.emoji2.helpers.EmojiTextViewHelper;
@@ -39,23 +42,25 @@
      */
     private boolean mInitialized;
 
-    public EmojiButton(Context context) {
+    public EmojiButton(@NonNull Context context) {
         super(context);
         init();
     }
 
-    public EmojiButton(Context context, AttributeSet attrs) {
+    public EmojiButton(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         init();
     }
 
-    public EmojiButton(Context context, AttributeSet attrs, int defStyleAttr) {
+    public EmojiButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         init();
     }
 
+    @SuppressLint("UnsafeNewApiCall")
     @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
-    public EmojiButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public EmojiButton(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         init();
     }
@@ -68,7 +73,7 @@
     }
 
     @Override
-    public void setFilters(InputFilter[] filters) {
+    public void setFilters(@NonNull InputFilter[] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -90,7 +95,9 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
+    public void setCustomSelectionActionModeCallback(
+            @NonNull ActionMode.Callback actionModeCallback
+    ) {
         super.setCustomSelectionActionModeCallback(TextViewCompat
                 .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java
index 722fd95..1dae701 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiEditText.java
@@ -15,6 +15,7 @@
  */
 package androidx.emoji2.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.os.Build;
 import android.text.method.KeyListener;
@@ -25,6 +26,7 @@
 import android.widget.EditText;
 
 import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.widget.TextViewCompat;
@@ -46,23 +48,25 @@
      */
     private boolean mInitialized;
 
-    public EmojiEditText(Context context) {
+    public EmojiEditText(@NonNull Context context) {
         super(context);
         init(null /*attrs*/, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
     }
 
-    public EmojiEditText(Context context, AttributeSet attrs) {
+    public EmojiEditText(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         init(attrs, android.R.attr.editTextStyle, 0 /*defStyleRes*/);
     }
 
-    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) {
+    public EmojiEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         init(attrs, defStyleAttr, 0 /*defStyleRes*/);
     }
 
+    @SuppressLint("UnsafeNewApiCall")
     @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
-    public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public EmojiEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         init(attrs, defStyleAttr, defStyleRes);
     }
@@ -85,8 +89,9 @@
         super.setKeyListener(keyListener);
     }
 
+    @Nullable
     @Override
-    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+    public InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
         final InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
         return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
     }
@@ -131,7 +136,9 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
+    public void setCustomSelectionActionModeCallback(
+            @NonNull ActionMode.Callback actionModeCallback
+    ) {
         super.setCustomSelectionActionModeCallback(TextViewCompat
                 .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java
index 6058386..95df225 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractEditText.java
@@ -18,6 +18,7 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.inputmethodservice.ExtractEditText;
 import android.os.Build;
@@ -29,6 +30,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -54,24 +56,26 @@
      */
     private boolean mInitialized;
 
-    public EmojiExtractEditText(Context context) {
+    public EmojiExtractEditText(@NonNull Context context) {
         super(context);
         init(null /*attrs*/, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
     }
 
-    public EmojiExtractEditText(Context context, AttributeSet attrs) {
+    public EmojiExtractEditText(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         init(attrs, android.R.attr.editTextStyle, 0 /*defStyleRes*/);
     }
 
-    public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr) {
+    public EmojiExtractEditText(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         init(attrs, defStyleAttr, 0 /*defStyleRes*/);
     }
 
+    @SuppressLint("UnsafeNewApiCall")
     @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
-    public EmojiExtractEditText(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public EmojiExtractEditText(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         init(attrs, defStyleAttr, defStyleRes);
     }
@@ -94,8 +98,9 @@
         super.setKeyListener(keyListener);
     }
 
+    @Nullable
     @Override
-    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+    public InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
         final InputConnection inputConnection = super.onCreateInputConnection(outAttrs);
         return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs);
     }
@@ -159,7 +164,9 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
+    public void setCustomSelectionActionModeCallback(
+            @NonNull ActionMode.Callback actionModeCallback
+    ) {
         super.setCustomSelectionActionModeCallback(TextViewCompat
                 .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java
index 319b1db..c930389 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiExtractTextLayout.java
@@ -16,6 +16,7 @@
 
 package androidx.emoji2.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.inputmethodservice.InputMethodService;
@@ -75,25 +76,26 @@
      */
     private boolean mInitialized;
 
-    public EmojiExtractTextLayout(Context context) {
+    public EmojiExtractTextLayout(@NonNull Context context) {
         super(context);
         init(context, null /*attrs*/, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
     }
 
-    public EmojiExtractTextLayout(Context context,
+    public EmojiExtractTextLayout(@NonNull Context context,
             @Nullable AttributeSet attrs) {
         super(context, attrs);
         init(context, attrs, 0 /*defStyleAttr*/, 0 /*defStyleRes*/);
     }
 
-    public EmojiExtractTextLayout(Context context,
+    public EmojiExtractTextLayout(@NonNull Context context,
             @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         init(context, attrs, defStyleAttr, 0 /*defStyleRes*/);
     }
 
+    @SuppressLint("UnsafeNewApiCall")
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-    public EmojiExtractTextLayout(Context context, AttributeSet attrs,
+    public EmojiExtractTextLayout(@NonNull Context context, @Nullable AttributeSet attrs,
             int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         init(context, attrs, defStyleAttr, defStyleRes);
@@ -159,7 +161,8 @@
      * {@link InputMethodService#onUpdateExtractingViews(EditorInfo)
      * InputMethodService#onUpdateExtractingViews(EditorInfo)}.
      */
-    public void onUpdateExtractingViews(InputMethodService inputMethodService, EditorInfo ei) {
+    public void onUpdateExtractingViews(@NonNull InputMethodService inputMethodService,
+            @NonNull EditorInfo ei) {
         // the following code is ported as it is from InputMethodService.onUpdateExtractingViews
         if (!inputMethodService.isExtractViewShown()) {
             return;
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java
index 7ec4875..709ddd3 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/EmojiTextView.java
@@ -15,6 +15,7 @@
  */
 package androidx.emoji2.widget;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.os.Build;
 import android.text.InputFilter;
@@ -22,6 +23,8 @@
 import android.view.ActionMode;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.widget.TextViewCompat;
 import androidx.emoji2.helpers.EmojiTextViewHelper;
@@ -39,23 +42,25 @@
      */
     private boolean mInitialized;
 
-    public EmojiTextView(Context context) {
+    public EmojiTextView(@NonNull Context context) {
         super(context);
         init();
     }
 
-    public EmojiTextView(Context context, AttributeSet attrs) {
+    public EmojiTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
         init();
     }
 
-    public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+    public EmojiTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         init();
     }
 
+    @SuppressLint("UnsafeNewApiCall")
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-    public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+    public EmojiTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
         init();
     }
@@ -68,7 +73,7 @@
     }
 
     @Override
-    public void setFilters(InputFilter[] filters) {
+    public void setFilters(@NonNull InputFilter[] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -90,7 +95,9 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
+    public void setCustomSelectionActionModeCallback(
+            @NonNull ActionMode.Callback actionModeCallback
+    ) {
         super.setCustomSelectionActionModeCallback(TextViewCompat
                 .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
diff --git a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java
index 26070ab..cf839e0 100644
--- a/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java
+++ b/emoji2/emoji2-views/src/main/java/androidx/emoji2/widget/ExtractButtonCompat.java
@@ -18,12 +18,15 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.os.Build;
 import android.util.AttributeSet;
 import android.view.ActionMode;
 import android.widget.Button;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.core.widget.TextViewCompat;
@@ -35,21 +38,23 @@
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
 public class ExtractButtonCompat extends Button {
-    public ExtractButtonCompat(Context context) {
+    public ExtractButtonCompat(@NonNull Context context) {
         super(context, null);
     }
 
-    public ExtractButtonCompat(Context context, AttributeSet attrs) {
+    public ExtractButtonCompat(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public ExtractButtonCompat(Context context, AttributeSet attrs, int defStyleAttr) {
+    public ExtractButtonCompat(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
 
+    @SuppressLint("UnsafeNewApiCall")
     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-    public ExtractButtonCompat(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
+    public ExtractButtonCompat(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr, int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
     }
 
@@ -59,7 +64,7 @@
      */
     @Override
     public boolean hasWindowFocus() {
-        return isEnabled() && getVisibility() == VISIBLE ? true : false;
+        return isEnabled() && getVisibility() == VISIBLE;
     }
 
     /**
@@ -67,7 +72,9 @@
      * {@link TextViewCompat#setCustomSelectionActionModeCallback(TextView, ActionMode.Callback)}
      */
     @Override
-    public void setCustomSelectionActionModeCallback(ActionMode.Callback actionModeCallback) {
+    public void setCustomSelectionActionModeCallback(
+            @NonNull ActionMode.Callback actionModeCallback
+    ) {
         super.setCustomSelectionActionModeCallback(TextViewCompat
                 .wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
diff --git a/emoji2/emoji2/lint-baseline.xml b/emoji2/emoji2/lint-baseline.xml
deleted file mode 100644
index d9ef293..0000000
--- a/emoji2/emoji2/lint-baseline.xml
+++ /dev/null
@@ -1,745 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="5" by="lint 4.2.0-beta04" client="gradle" variant="debug" version="4.2.0-beta04">
-
-    <issue
-        id="PrivateConstructorForUtilityClass"
-        message="Utility class with non private constructor"
-        errorLine1="    private static final class CodepointIndexFinder {"
-        errorLine2="                               ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiProcessor.java"
-            line="653"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji2.text.EmojiProcessor.CodepointIndexFinder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                if (!Character.isSurrogate(c)) {"
-        errorLine2="                               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiProcessor.java"
-            line="701"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="UnsafeNewApiCall"
-        message="This call is to a method from API 19, the call containing class androidx.emoji2.text.EmojiProcessor.CodepointIndexFinder is not annotated with @RequiresApi(x) where x is at least 19. Either annotate the containing class with at least @RequiresApi(19) or move the call to a static method in a wrapper class annotated with at least @RequiresApi(19)."
-        errorLine1="                if (!Character.isSurrogate(c)) {"
-        errorLine2="                               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiProcessor.java"
-            line="758"
-            column="32"/>
-    </issue>
-
-    <issue
-        id="KotlinPropertyAccess"
-        message="The getter return type (`int`) and setter parameter type (`boolean`) getter and setter methods for property `hasGlyph` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
-        errorLine1="    public int getHasGlyph() {"
-        errorLine2="               ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiMetadata.java"
-            line="184"
-            column="16"/>
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiMetadata.java"
-            line="193"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static EmojiCompat init(@NonNull final Config config) {"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="302"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static EmojiCompat reset(@NonNull final Config config) {"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="322"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static EmojiCompat reset(final EmojiCompat emojiCompat) {"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="337"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static EmojiCompat reset(final EmojiCompat emojiCompat) {"
-        errorLine2="                                          ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="337"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static EmojiCompat get() {"
-        errorLine2="                  ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="352"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            final KeyEvent event) {"
-        errorLine2="                  ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="541"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public CharSequence process(@NonNull final CharSequence charSequence) {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="625"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public CharSequence process(@NonNull final CharSequence charSequence,"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="662"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public CharSequence process(@NonNull final CharSequence charSequence,"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="698"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public CharSequence process(@NonNull final CharSequence charSequence,"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="739"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config registerInitCallback(@NonNull InitCallback initCallback) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="982"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config unregisterInitCallback(@NonNull InitCallback initCallback) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1000"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config setReplaceAll(final boolean replaceAll) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1017"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config setUseEmojiAsDefaultStyle(final boolean useEmojiAsDefaultStyle) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1037"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config setUseEmojiAsDefaultStyle(final boolean useEmojiAsDefaultStyle,"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1057"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config setEmojiSpanIndicatorEnabled(boolean emojiSpanIndicatorEnabled) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1081"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config setEmojiSpanIndicatorColor(@ColorInt int color) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1092"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Config setMetadataLoadStrategy(@LoadStrategy int strategy) {"
-        errorLine2="               ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1133"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        protected final MetadataRepoLoader getMetadataRepoLoader() {"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiCompat.java"
-            line="1154"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public Typeface getTypeface() {"
-        errorLine2="           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiMetadata.java"
-            line="120"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int getSize(@NonNull final Paint paint, final CharSequence text, final int start,"
-        errorLine2="                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiSpan.java"
-            line="77"
-            column="58"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            final int end, final Paint.FontMetricsInt fm) {"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/EmojiSpan.java"
-            line="78"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public FontRequestEmojiCompatConfig setHandler(Handler handler) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"
-            line="143"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public FontRequestEmojiCompatConfig setHandler(Handler handler) {"
-        errorLine2="                                                   ~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"
-            line="143"
-            column="52"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public FontRequestEmojiCompatConfig setRetryPolicy(RetryPolicy policy) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"
-            line="156"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public FontRequestEmojiCompatConfig setRetryPolicy(RetryPolicy policy) {"
-        errorLine2="                                                       ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"
-            line="156"
-            column="56"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public FontFamilyResult fetchFonts(@NonNull Context context,"
-        errorLine2="               ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"
-            line="335"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="        public Typeface buildTypeface(@NonNull Context context,"
-        errorLine2="               ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java"
-            line="341"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static MetadataRepo create(@NonNull final Typeface typeface,"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"
-            line="103"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static MetadataRepo create(@NonNull final Typeface typeface,"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"
-            line="115"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static MetadataRepo create(@NonNull final AssetManager assetManager,"
-        errorLine2="                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"
-            line="127"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="            final String assetPath) throws IOException {"
-        errorLine2="                  ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"
-            line="128"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public char[] getEmojiCharArray() {"
-        errorLine2="           ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"
-            line="176"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public MetadataList getMetadataList() {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/MetadataRepo.java"
-            line="184"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public static SpannableBuilder create(@NonNull Class&lt;?> clazz, @NonNull CharSequence text) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="95"
-            column="19"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public CharSequence subSequence(int start, int end) {"
-        errorLine2="           ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="122"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void setSpan(Object what, int start, int end, int flags) {"
-        errorLine2="                        ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="132"
-            column="25"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T> T[] getSpans(int queryStart, int queryEnd, Class&lt;T> kind) {"
-        errorLine2="               ~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="147"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public &lt;T> T[] getSpans(int queryStart, int queryEnd, Class&lt;T> kind) {"
-        errorLine2="                                                          ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="147"
-            column="59"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void removeSpan(Object what) {"
-        errorLine2="                           ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="165"
-            column="28"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int getSpanStart(Object tag) {"
-        errorLine2="                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="187"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int getSpanEnd(Object tag) {"
-        errorLine2="                          ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="201"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int getSpanFlags(Object tag) {"
-        errorLine2="                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="215"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public int nextSpanTransition(int start, int limit, Class type) {"
-        errorLine2="                                                        ~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="229"
-            column="57"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder replace(int start, int end, CharSequence tb) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="299"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder replace(int start, int end, CharSequence tb) {"
-        errorLine2="                                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="299"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder replace(int start, int end, CharSequence tb, int tbstart,"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="307"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder replace(int start, int end, CharSequence tb, int tbstart,"
-        errorLine2="                                                              ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="307"
-            column="63"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder insert(int where, CharSequence tb) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="316"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder insert(int where, CharSequence tb) {"
-        errorLine2="                                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="316"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder insert(int where, CharSequence tb, int start, int end) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="322"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder insert(int where, CharSequence tb, int start, int end) {"
-        errorLine2="                                                    ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="322"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder delete(int start, int end) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="328"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="334"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text) {"
-        errorLine2="                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="334"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(char text) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="340"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text, int start, int end) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="346"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text, int start, int end) {"
-        errorLine2="                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="346"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text, Object what, int flags) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="352"
-            column="12"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text, Object what, int flags) {"
-        errorLine2="                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="352"
-            column="42"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public SpannableStringBuilder append(CharSequence text, Object what, int flags) {"
-        errorLine2="                                                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/SpannableBuilder.java"
-            line="352"
-            column="61"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public TypefaceEmojiSpan(final EmojiMetadata metadata) {"
-        errorLine2="                                   ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java"
-            line="48"
-            column="36"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
-        errorLine1="    public void draw(@NonNull final Canvas canvas, final CharSequence text,"
-        errorLine2="                                                         ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java"
-            line="53"
-            column="58"/>
-    </issue>
-
-</issues>
diff --git a/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/MetadataRepoTest.java b/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/MetadataRepoTest.java
index cead30d..3039f17 100644
--- a/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/MetadataRepoTest.java
+++ b/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/MetadataRepoTest.java
@@ -15,12 +15,16 @@
  */
 package androidx.emoji2.text;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.mockito.Mockito.mock;
+
+import android.graphics.Typeface;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
+import androidx.text.emoji.flatbuffer.MetadataList;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -35,7 +39,7 @@
 
     @Before
     public void clearResourceIndex() {
-        mMetadataRepo = new MetadataRepo();
+        mMetadataRepo = MetadataRepo.create(mock(Typeface.class), new MetadataList());
     }
 
     @Test(expected = NullPointerException.class)
@@ -63,10 +67,10 @@
         mMetadataRepo.put(metadata);
         assertSame(metadata, getNode(codePoint));
 
-        assertEquals(null, getNode(new int[]{1}));
-        assertEquals(null, getNode(new int[]{1, 2}));
-        assertEquals(null, getNode(new int[]{1, 2, 3}));
-        assertEquals(null, getNode(new int[]{1, 2, 3, 5}));
+        assertNull(getNode(new int[]{1}));
+        assertNull(getNode(new int[]{1, 2}));
+        assertNull(getNode(new int[]{1, 2, 3}));
+        assertNull(getNode(new int[]{1, 2, 3, 5}));
     }
 
     @Test
@@ -88,8 +92,8 @@
         assertSame(metadata2, getNode(codePoint2));
         assertSame(metadata3, getNode(codePoint3));
 
-        assertEquals(null, getNode(new int[]{1}));
-        assertEquals(null, getNode(new int[]{1, 2, 3, 4, 5}));
+        assertNull(getNode(new int[]{1}));
+        assertNull(getNode(new int[]{1, 2, 3, 4, 5}));
     }
 
     final EmojiMetadata getNode(final int[] codepoints) {
diff --git a/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/TestConfigBuilder.java b/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/TestConfigBuilder.java
index 6753840..e44b5a4 100644
--- a/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/TestConfigBuilder.java
+++ b/emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/TestConfigBuilder.java
@@ -16,13 +16,16 @@
 package androidx.emoji2.text;
 
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
 
 import android.content.Context;
 import android.content.res.AssetManager;
+import android.graphics.Typeface;
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.NonNull;
 import androidx.test.core.app.ApplicationProvider;
+import androidx.text.emoji.flatbuffer.MetadataList;
 
 import java.util.concurrent.CountDownLatch;
 
@@ -85,7 +88,8 @@
                     try {
                         mLoaderLatch.await();
                         if (mSuccess) {
-                            loaderCallback.onLoaded(new MetadataRepo());
+                            loaderCallback.onLoaded(MetadataRepo.create(mock(Typeface.class),
+                                    new MetadataList()));
                         } else {
                             loaderCallback.onFailed(null);
                         }
diff --git a/emoji2/emoji2/src/androidTest/res/layout/activity_default.xml b/emoji2/emoji2/src/androidTest/res/layout/activity_default.xml
index c566d8f..486dfbd 100644
--- a/emoji2/emoji2/src/androidTest/res/layout/activity_default.xml
+++ b/emoji2/emoji2/src/androidTest/res/layout/activity_default.xml
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              xmlns:app="http://schemas.android.com/apk/res-auto"
-              android:id="@+id/root"
-              android:layout_width="match_parent"
-              android:layout_height="match_parent"
-              android:orientation="vertical">
+    android:id="@+id/root"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
 
     <TextView
         android:id="@+id/text"
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java
index 1dc1ac4..e660547 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiCompat.java
@@ -197,12 +197,12 @@
     private static final Object INSTANCE_LOCK = new Object();
 
     @GuardedBy("INSTANCE_LOCK")
-    private static volatile EmojiCompat sInstance;
+    private static volatile @Nullable EmojiCompat sInstance;
 
-    private final ReadWriteLock mInitLock;
+    private final @NonNull ReadWriteLock mInitLock;
 
     @GuardedBy("mInitLock")
-    private final Set<InitCallback> mInitCallbacks;
+    private final @NonNull Set<InitCallback> mInitCallbacks;
 
     @GuardedBy("mInitLock")
     @LoadState
@@ -211,18 +211,18 @@
     /**
      * Handler with main looper to run the callbacks on.
      */
-    private final Handler mMainHandler;
+    private final @NonNull Handler mMainHandler;
 
     /**
      * Helper class for pre 19 compatibility.
      */
-    private final CompatInternal mHelper;
+    private final @NonNull CompatInternal mHelper;
 
     /**
      * Metadata loader instance given in the Config instance.
      */
     @SuppressWarnings("WeakerAccess") /* synthetic access */
-    final MetadataRepoLoader mMetadataLoader;
+    final @NonNull MetadataRepoLoader mMetadataLoader;
 
     /**
      * @see Config#setReplaceAll(boolean)
@@ -240,7 +240,7 @@
      * @see Config#setUseEmojiAsDefaultStyle(boolean, List)
      */
     @SuppressWarnings("WeakerAccess") /* synthetic access */
-    final int[] mEmojiAsDefaultStyleExceptions;
+    final @Nullable int[] mEmojiAsDefaultStyleExceptions;
 
     /**
      * @see Config#setEmojiSpanIndicatorEnabled(boolean)
@@ -299,15 +299,20 @@
      * @see EmojiCompat.Config
      */
     @SuppressWarnings("GuardedBy")
+    @NonNull
     public static EmojiCompat init(@NonNull final Config config) {
-        if (sInstance == null) {
+        EmojiCompat localInstance = sInstance;
+        if (localInstance == null) {
             synchronized (INSTANCE_LOCK) {
-                if (sInstance == null) {
-                    sInstance = new EmojiCompat(config);
+                // copy ref to local for nullness checker
+                localInstance = sInstance;
+                if (localInstance == null) {
+                    localInstance = new EmojiCompat(config);
+                    sInstance = localInstance;
                 }
             }
         }
-        return sInstance;
+        return localInstance;
     }
 
     /**
@@ -319,11 +324,13 @@
     @SuppressWarnings("GuardedBy")
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @VisibleForTesting
+    @NonNull
     public static EmojiCompat reset(@NonNull final Config config) {
         synchronized (INSTANCE_LOCK) {
-            sInstance = new EmojiCompat(config);
+            EmojiCompat localInstance = new EmojiCompat(config);
+            sInstance = localInstance;
+            return localInstance;
         }
-        return sInstance;
     }
 
     /**
@@ -334,7 +341,8 @@
     @SuppressWarnings("GuardedBy")
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @VisibleForTesting
-    public static EmojiCompat reset(final EmojiCompat emojiCompat) {
+    @Nullable
+    public static EmojiCompat reset(@Nullable final EmojiCompat emojiCompat) {
         synchronized (INSTANCE_LOCK) {
             sInstance = emojiCompat;
         }
@@ -349,11 +357,13 @@
      *
      * @throws IllegalStateException if called before {@link #init(EmojiCompat.Config)}
      */
+    @NonNull
     public static EmojiCompat get() {
         synchronized (INSTANCE_LOCK) {
-            Preconditions.checkState(sInstance != null,
+            EmojiCompat localInstance = sInstance;
+            Preconditions.checkState(localInstance != null,
                     "EmojiCompat is not initialized. Please call EmojiCompat.init() first");
-            return sInstance;
+            return localInstance;
         }
     }
 
@@ -538,7 +548,7 @@
      * @return {@code true} if an {@link EmojiSpan} is deleted
      */
     public static boolean handleOnKeyDown(@NonNull final Editable editable, final int keyCode,
-            final KeyEvent event) {
+            @NonNull final KeyEvent event) {
         if (Build.VERSION.SDK_INT >= 19) {
             return EmojiProcessor.handleOnKeyDown(editable, keyCode, event);
         } else {
@@ -621,11 +631,13 @@
      * @throws IllegalStateException if not initialized yet
      * @see #process(CharSequence, int, int)
      */
+    @Nullable
     @CheckResult
     public CharSequence process(@NonNull final CharSequence charSequence) {
         // since charSequence might be null here we have to check it. Passing through here to the
         // main function so that it can do all the checks including isInitialized. It will also
         // be the main point that decides what to return.
+
         //noinspection ConstantConditions
         @IntRange(from = 0) final int length = charSequence == null ? 0 : charSequence.length();
         return process(charSequence, 0, length);
@@ -658,6 +670,7 @@
      *                                  {@code start > charSequence.length()},
      *                                  {@code end > charSequence.length()}
      */
+    @Nullable
     @CheckResult
     public CharSequence process(@NonNull final CharSequence charSequence,
             @IntRange(from = 0) final int start, @IntRange(from = 0) final int end) {
@@ -694,6 +707,7 @@
      *                                  {@code end > charSequence.length()}
      *                                  {@code maxEmojiCount < 0}
      */
+    @Nullable
     @CheckResult
     public CharSequence process(@NonNull final CharSequence charSequence,
             @IntRange(from = 0) final int start, @IntRange(from = 0) final int end,
@@ -735,6 +749,7 @@
      *                                  {@code end > charSequence.length()}
      *                                  {@code maxEmojiCount < 0}
      */
+    @Nullable
     @CheckResult
     public CharSequence process(@NonNull final CharSequence charSequence,
             @IntRange(from = 0) final int start, @IntRange(from = 0) final int end,
@@ -944,14 +959,17 @@
      */
     public abstract static class Config {
         @SuppressWarnings("WeakerAccess") /* synthetic access */
+        @NonNull
         final MetadataRepoLoader mMetadataLoader;
         @SuppressWarnings("WeakerAccess") /* synthetic access */
         boolean mReplaceAll;
         @SuppressWarnings("WeakerAccess") /* synthetic access */
         boolean mUseEmojiAsDefaultStyle;
         @SuppressWarnings("WeakerAccess") /* synthetic access */
+        @Nullable
         int[] mEmojiAsDefaultStyleExceptions;
         @SuppressWarnings("WeakerAccess") /* synthetic access */
+        @Nullable
         Set<InitCallback> mInitCallbacks;
         @SuppressWarnings("WeakerAccess") /* synthetic access */
         boolean mEmojiSpanIndicatorEnabled;
@@ -960,6 +978,7 @@
         @SuppressWarnings("WeakerAccess") /* synthetic access */
         @LoadStrategy int mMetadataLoadStrategy = LOAD_STRATEGY_DEFAULT;
         @SuppressWarnings("WeakerAccess") /* synthetic access */
+        @NonNull
         GlyphChecker mGlyphChecker = new EmojiProcessor.DefaultGlyphChecker();
 
         /**
@@ -979,6 +998,7 @@
          *
          * @return EmojiCompat.Config instance
          */
+        @NonNull
         public Config registerInitCallback(@NonNull InitCallback initCallback) {
             Preconditions.checkNotNull(initCallback, "initCallback cannot be null");
             if (mInitCallbacks == null) {
@@ -997,6 +1017,7 @@
          *
          * @return EmojiCompat.Config instance
          */
+        @NonNull
         public Config unregisterInitCallback(@NonNull InitCallback initCallback) {
             Preconditions.checkNotNull(initCallback, "initCallback cannot be null");
             if (mInitCallbacks != null) {
@@ -1014,6 +1035,7 @@
          *
          * @return EmojiCompat.Config instance
          */
+        @NonNull
         public Config setReplaceAll(final boolean replaceAll) {
             mReplaceAll = replaceAll;
             return this;
@@ -1034,6 +1056,7 @@
          * @param useEmojiAsDefaultStyle whether to use the emoji style presentation for all emojis
          *                               that would be presented as text style by default
          */
+        @NonNull
         public Config setUseEmojiAsDefaultStyle(final boolean useEmojiAsDefaultStyle) {
             return setUseEmojiAsDefaultStyle(useEmojiAsDefaultStyle,
                     null);
@@ -1054,6 +1077,7 @@
          *                                      {@link #setUseEmojiAsDefaultStyle(boolean)} should
          *                                      be used instead.
          */
+        @NonNull
         public Config setUseEmojiAsDefaultStyle(final boolean useEmojiAsDefaultStyle,
                 @Nullable final List<Integer> emojiAsDefaultStyleExceptions) {
             mUseEmojiAsDefaultStyle = useEmojiAsDefaultStyle;
@@ -1078,6 +1102,7 @@
          * @param emojiSpanIndicatorEnabled when {@code true} a background is drawn for each emoji
          *                                  that is replaced
          */
+        @NonNull
         public Config setEmojiSpanIndicatorEnabled(boolean emojiSpanIndicatorEnabled) {
             mEmojiSpanIndicatorEnabled = emojiSpanIndicatorEnabled;
             return this;
@@ -1089,6 +1114,7 @@
          *
          * @see #setEmojiSpanIndicatorEnabled(boolean)
          */
+        @NonNull
         public Config setEmojiSpanIndicatorColor(@ColorInt int color) {
             mEmojiSpanIndicatorColor = color;
             return this;
@@ -1130,6 +1156,7 @@
          *                  {@link EmojiCompat#LOAD_STRATEGY_MANUAL}
          *
          */
+        @NonNull
         public Config setMetadataLoadStrategy(@LoadStrategy int strategy) {
             mMetadataLoadStrategy = strategy;
             return this;
@@ -1151,6 +1178,7 @@
         /**
          * Returns the {@link MetadataRepoLoader}.
          */
+        @NonNull
         protected final MetadataRepoLoader getMetadataRepoLoader() {
             return mMetadataLoader;
         }
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java
index ba46f82..d6ef218 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiMetadata.java
@@ -17,6 +17,7 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
+import android.annotation.SuppressLint;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.Typeface;
@@ -78,6 +79,7 @@
     /**
      * MetadataRepo that holds this instance.
      */
+    @NonNull
     private final MetadataRepo mMetadataRepo;
 
     /**
@@ -117,6 +119,7 @@
     /**
      * @return return typeface to be used to render this metadata
      */
+    @NonNull
     public Typeface getTypeface() {
         return mMetadataRepo.getTypeface();
     }
@@ -181,6 +184,7 @@
      * style selector 0xFE0F)
      */
     @HasGlyph
+    @SuppressLint("KotlinPropertyAccess")
     public int getHasGlyph() {
         return mHasGlyph;
     }
@@ -190,6 +194,7 @@
      *
      * @param hasGlyph {@code true} if system can render the emoji
      */
+    @SuppressLint("KotlinPropertyAccess")
     public void setHasGlyph(boolean hasGlyph) {
         mHasGlyph = hasGlyph ? HAS_GLYPH_EXISTS : HAS_GLYPH_ABSENT;
     }
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiProcessor.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiProcessor.java
index ff25b2e..98849eb 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiProcessor.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiProcessor.java
@@ -80,16 +80,19 @@
     /**
      * Factory used to create EmojiSpans.
      */
+    @NonNull
     private final EmojiCompat.SpanFactory mSpanFactory;
 
     /**
      * Emoji metadata repository.
      */
+    @NonNull
     private final MetadataRepo mMetadataRepo;
 
     /**
      * Utility class that checks if the system can render a given glyph.
      */
+    @NonNull
     private EmojiCompat.GlyphChecker mGlyphChecker;
 
     /**
@@ -100,6 +103,7 @@
     /**
      * @see EmojiCompat.Config#setUseEmojiAsDefaultStyle(boolean, List)
      */
+    @Nullable
     private final int[] mEmojiAsDefaultStyleExceptions;
 
     EmojiProcessor(
@@ -297,7 +301,7 @@
      * @return {@code true} if an {@link EmojiSpan} is deleted
      */
     static boolean handleOnKeyDown(@NonNull final Editable editable, final int keyCode,
-            final KeyEvent event) {
+            @NonNull final KeyEvent event) {
         final boolean handled;
         switch (keyCode) {
             case KeyEvent.KEYCODE_DEL:
@@ -319,7 +323,7 @@
         return false;
     }
 
-    private static boolean delete(final Editable content, final KeyEvent event,
+    private static boolean delete(@NonNull final Editable content, @NonNull final KeyEvent event,
             final boolean forwardDelete) {
         if (hasModifiers(event)) {
             return false;
@@ -430,7 +434,7 @@
         return start == -1 || end == -1 || start != end;
     }
 
-    private static boolean hasModifiers(KeyEvent event) {
+    private static boolean hasModifiers(@NonNull KeyEvent event) {
         return !KeyEvent.metaStateHasNoModifiers(event.getMetaState());
     }
 
@@ -650,9 +654,12 @@
     /**
      * Copy of BaseInputConnection findIndexBackward and findIndexForward functions.
      */
+    @RequiresApi(19)
     private static final class CodepointIndexFinder {
         private static final int INVALID_INDEX = -1;
 
+        private CodepointIndexFinder() {}
+
         /**
          * Find start index of the character in {@code cs} that is {@code numCodePoints} behind
          * starting from {@code from}.
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java
index 70dd537..dd07ff1 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/EmojiSpan.java
@@ -17,10 +17,12 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
+import android.annotation.SuppressLint;
 import android.graphics.Paint;
 import android.text.style.ReplacementSpan;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
@@ -43,6 +45,7 @@
      * representing same emoji to be in memory. When unparcelled, EmojiSpan tries to set it back
      * using the singleton EmojiCompat instance.
      */
+    @NonNull
     private final EmojiMetadata mMetadata;
 
     /**
@@ -74,8 +77,11 @@
     }
 
     @Override
-    public int getSize(@NonNull final Paint paint, final CharSequence text, final int start,
-            final int end, final Paint.FontMetricsInt fm) {
+    public int getSize(@NonNull final Paint paint,
+            @SuppressLint("UnknownNullness") final CharSequence text,
+            final int start,
+            final int end,
+            @Nullable final Paint.FontMetricsInt fm) {
         paint.getFontMetricsInt(mTmpFontMetrics);
         final int fontHeight = Math.abs(mTmpFontMetrics.descent - mTmpFontMetrics.ascent);
 
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java
index 4ade79f..f20049c 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/FontRequestEmojiCompatConfig.java
@@ -140,7 +140,8 @@
      *               of {@code null}, the metadata loader creates own {@link HandlerThread} for
      *               initialization.
      */
-    public FontRequestEmojiCompatConfig setHandler(Handler handler) {
+    @NonNull
+    public FontRequestEmojiCompatConfig setHandler(@Nullable Handler handler) {
         ((FontRequestMetadataLoader) getMetadataRepoLoader()).setHandler(handler);
         return this;
     }
@@ -153,7 +154,8 @@
      *              file. Can be {@code null}. In case of {@code null}, the metadata loader never
      *              retries.
      */
-    public FontRequestEmojiCompatConfig setRetryPolicy(RetryPolicy policy) {
+    @NonNull
+    public FontRequestEmojiCompatConfig setRetryPolicy(@Nullable RetryPolicy policy) {
         ((FontRequestMetadataLoader) getMetadataRepoLoader()).setRetryPolicy(policy);
         return this;
     }
@@ -163,23 +165,23 @@
      * given FontRequest.
      */
     private static class FontRequestMetadataLoader implements EmojiCompat.MetadataRepoLoader {
-        private final Context mContext;
-        private final FontRequest mRequest;
-        private final FontProviderHelper mFontProviderHelper;
+        private final @NonNull Context mContext;
+        private final @NonNull FontRequest mRequest;
+        private final @NonNull FontProviderHelper mFontProviderHelper;
 
-        private final Object mLock = new Object();
+        private final @NonNull Object mLock = new Object();
         @GuardedBy("mLock")
-        private Handler mHandler;
+        private @Nullable Handler mHandler;
         @GuardedBy("mLock")
-        private HandlerThread mThread;
+        private @Nullable HandlerThread mThread;
         @GuardedBy("mLock")
         private @Nullable RetryPolicy mRetryPolicy;
 
         // Following three variables must be touched only on the thread associated with mHandler.
         @SuppressWarnings("WeakerAccess") /* synthetic access */
         EmojiCompat.MetadataRepoLoaderCallback mCallback;
-        private ContentObserver mObserver;
-        private Runnable mHandleMetadataCreationRunner;
+        private @Nullable ContentObserver mObserver;
+        private @Nullable Runnable mHandleMetadataCreationRunner;
 
         FontRequestMetadataLoader(@NonNull Context context, @NonNull FontRequest request,
                 @NonNull FontProviderHelper fontProviderHelper) {
@@ -190,13 +192,13 @@
             mFontProviderHelper = fontProviderHelper;
         }
 
-        public void setHandler(Handler handler) {
+        public void setHandler(@Nullable Handler handler) {
             synchronized (mLock) {
                 mHandler = handler;
             }
         }
 
-        public void setRetryPolicy(RetryPolicy policy) {
+        public void setRetryPolicy(@Nullable RetryPolicy policy) {
             synchronized (mLock) {
                 mRetryPolicy = policy;
             }
@@ -332,12 +334,14 @@
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
     public static class FontProviderHelper {
         /** Calls FontsContractCompat.fetchFonts. */
+        @NonNull
         public FontFamilyResult fetchFonts(@NonNull Context context,
                 @NonNull FontRequest request) throws NameNotFoundException {
             return FontsContractCompat.fetchFonts(context, null /* cancellation signal */, request);
         }
 
         /** Calls FontsContractCompat.buildTypeface. */
+        @Nullable
         public Typeface buildTypeface(@NonNull Context context,
                 @NonNull FontsContractCompat.FontInfo font) throws NameNotFoundException {
             return FontsContractCompat.buildTypeface(context, null /* cancellation signal */,
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java
index f9f397f..6db7379 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataListReader.java
@@ -21,6 +21,7 @@
 
 import androidx.annotation.AnyThread;
 import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.text.emoji.flatbuffer.MetadataList;
@@ -236,9 +237,9 @@
      */
     private static class InputStreamOpenTypeReader implements OpenTypeReader {
 
-        private final byte[] mByteArray;
-        private final ByteBuffer mByteBuffer;
-        private final InputStream mInputStream;
+        private final @NonNull byte[] mByteArray;
+        private final @NonNull ByteBuffer mByteBuffer;
+        private final @NonNull InputStream mInputStream;
         private long mPosition = 0;
 
         /**
@@ -247,7 +248,7 @@
          *
          * @param inputStream InputStream to read from
          */
-        InputStreamOpenTypeReader(final InputStream inputStream) {
+        InputStreamOpenTypeReader(@NonNull final InputStream inputStream) {
             mInputStream = inputStream;
             mByteArray = new byte[UINT32_BYTE_COUNT];
             mByteBuffer = ByteBuffer.wrap(mByteArray);
@@ -306,14 +307,14 @@
      */
     private static class ByteBufferReader implements OpenTypeReader {
 
-        private final ByteBuffer mByteBuffer;
+        private final @NonNull ByteBuffer mByteBuffer;
 
         /**
          * Constructs the reader with the given ByteBuffer.
          *
          * @param byteBuffer ByteBuffer to read from
          */
-        ByteBufferReader(final ByteBuffer byteBuffer) {
+        ByteBufferReader(@NonNull final ByteBuffer byteBuffer) {
             mByteBuffer = byteBuffer;
             mByteBuffer.order(ByteOrder.BIG_ENDIAN);
         }
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java
index 2f5ea66..00fef53 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/MetadataRepo.java
@@ -47,36 +47,23 @@
     /**
      * MetadataList that contains the emoji metadata.
      */
-    private final MetadataList mMetadataList;
+    private final @NonNull MetadataList mMetadataList;
 
     /**
      * char presentation of all EmojiMetadata's in a single array. All emojis we have are mapped to
      * Private Use Area A, in the range U+F0000..U+FFFFD. Therefore each emoji takes 2 chars.
      */
-    private final char[] mEmojiCharArray;
+    private final @NonNull char[] mEmojiCharArray;
 
     /**
      * Empty root node of the trie.
      */
-    private final Node mRootNode;
+    private final @NonNull Node mRootNode;
 
     /**
      * Typeface to be used to render emojis.
      */
-    private final Typeface mTypeface;
-
-    /**
-     * Constructor used for tests.
-     *
-     * @hide
-     */
-    @RestrictTo(LIBRARY_GROUP_PREFIX)
-    MetadataRepo() {
-        mTypeface = null;
-        mMetadataList = null;
-        mRootNode = new Node(DEFAULT_ROOT_SIZE);
-        mEmojiCharArray = new char[0];
-    }
+    private final @NonNull Typeface mTypeface;
 
     /**
      * Private constructor that is called by one of {@code create} methods.
@@ -94,12 +81,22 @@
     }
 
     /**
+     * Construct MetadataRepo from a preloaded MetadatList.
+     */
+    @NonNull
+    static MetadataRepo create(@NonNull final Typeface typeface,
+            @NonNull final MetadataList metadataList) {
+        return new MetadataRepo(typeface, metadataList);
+    }
+
+    /**
      * Construct MetadataRepo from an input stream. The library does not close the given
      * InputStream, therefore it is caller's responsibility to properly close the stream.
      *
      * @param typeface Typeface to be used to render emojis
      * @param inputStream InputStream to read emoji metadata from
      */
+    @NonNull
     public static MetadataRepo create(@NonNull final Typeface typeface,
             @NonNull final InputStream inputStream) throws IOException {
         return new MetadataRepo(typeface, MetadataListReader.read(inputStream));
@@ -112,6 +109,7 @@
      * @param typeface Typeface to be used to render emojis
      * @param byteBuffer ByteBuffer to read emoji metadata from
      */
+    @NonNull
     public static MetadataRepo create(@NonNull final Typeface typeface,
             @NonNull final ByteBuffer byteBuffer) throws IOException {
         return new MetadataRepo(typeface, MetadataListReader.read(byteBuffer));
@@ -124,8 +122,9 @@
      * @param assetPath asset manager path of the file that the Typeface and metadata will be
      *                  created from
      */
+    @NonNull
     public static MetadataRepo create(@NonNull final AssetManager assetManager,
-            final String assetPath) throws IOException {
+            @NonNull final String assetPath) throws IOException {
         final Typeface typeface = Typeface.createFromAsset(assetManager, assetPath);
         return new MetadataRepo(typeface, MetadataListReader.read(assetManager, assetPath));
     }
@@ -148,6 +147,7 @@
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     Typeface getTypeface() {
         return mTypeface;
@@ -164,6 +164,7 @@
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     Node getRootNode() {
         return mRootNode;
@@ -172,6 +173,7 @@
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public char[] getEmojiCharArray() {
         return mEmojiCharArray;
@@ -180,6 +182,7 @@
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public MetadataList getMetadataList() {
         return mMetadataList;
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/SpannableBuilder.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/SpannableBuilder.java
index 73a6392..01399a4 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/SpannableBuilder.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/SpannableBuilder.java
@@ -17,6 +17,7 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
+import android.annotation.SuppressLint;
 import android.text.Editable;
 import android.text.SpanWatcher;
 import android.text.Spannable;
@@ -51,12 +52,12 @@
     /**
      * DynamicLayout$ChangeWatcher class.
      */
-    private final Class<?> mWatcherClass;
+    private final @NonNull Class<?> mWatcherClass;
 
     /**
      * All WatcherWrappers.
      */
-    private final List<WatcherWrapper> mWatchers = new ArrayList<>();
+    private final @NonNull List<WatcherWrapper> mWatchers = new ArrayList<>();
 
     /**
      * @hide
@@ -91,6 +92,7 @@
     /**
      * @hide
      */
+    @NonNull
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public static SpannableBuilder create(@NonNull Class<?> clazz, @NonNull CharSequence text) {
         return new SpannableBuilder(clazz, text);
@@ -118,6 +120,7 @@
         return mWatcherClass == clazz;
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public CharSequence subSequence(int start, int end) {
         return new SpannableBuilder(mWatcherClass, this, start, end);
@@ -129,7 +132,7 @@
      * this new mObject as the span.
      */
     @Override
-    public void setSpan(Object what, int start, int end, int flags) {
+    public void setSpan(@Nullable Object what, int start, int end, int flags) {
         if (isWatcher(what)) {
             final WatcherWrapper span = new WatcherWrapper(what);
             mWatchers.add(span);
@@ -142,9 +145,10 @@
      * If previously a DynamicLayout$ChangeWatcher was wrapped in a WatcherWrapper, return the
      * correct Object that the client has set.
      */
+    @SuppressLint("UnknownNullness")
     @SuppressWarnings("unchecked")
     @Override
-    public <T> T[] getSpans(int queryStart, int queryEnd, Class<T> kind) {
+    public <T> T[] getSpans(int queryStart, int queryEnd, @NonNull Class<T> kind) {
         if (isWatcher(kind)) {
             final WatcherWrapper[] spans = super.getSpans(queryStart, queryEnd,
                     WatcherWrapper.class);
@@ -162,7 +166,7 @@
      * instead.
      */
     @Override
-    public void removeSpan(Object what) {
+    public void removeSpan(@Nullable Object what) {
         final WatcherWrapper watcher;
         if (isWatcher(what)) {
             watcher = getWatcherFor(what);
@@ -184,7 +188,7 @@
      * Return the correct start for the DynamicLayout$ChangeWatcher span.
      */
     @Override
-    public int getSpanStart(Object tag) {
+    public int getSpanStart(@Nullable Object tag) {
         if (isWatcher(tag)) {
             final WatcherWrapper watcher = getWatcherFor(tag);
             if (watcher != null) {
@@ -198,7 +202,7 @@
      * Return the correct end for the DynamicLayout$ChangeWatcher span.
      */
     @Override
-    public int getSpanEnd(Object tag) {
+    public int getSpanEnd(@Nullable Object tag) {
         if (isWatcher(tag)) {
             final WatcherWrapper watcher = getWatcherFor(tag);
             if (watcher != null) {
@@ -212,7 +216,7 @@
      * Return the correct flags for the DynamicLayout$ChangeWatcher span.
      */
     @Override
-    public int getSpanFlags(Object tag) {
+    public int getSpanFlags(@Nullable Object tag) {
         if (isWatcher(tag)) {
             final WatcherWrapper watcher = getWatcherFor(tag);
             if (watcher != null) {
@@ -226,8 +230,8 @@
      * Return the correct transition for the DynamicLayout$ChangeWatcher span.
      */
     @Override
-    public int nextSpanTransition(int start, int limit, Class type) {
-        if (isWatcher(type)) {
+    public int nextSpanTransition(int start, int limit, @Nullable Class type) {
+        if (type == null || isWatcher(type)) {
             type = WatcherWrapper.class;
         }
         return super.nextSpanTransition(start, limit, type);
@@ -295,6 +299,7 @@
         }
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public SpannableStringBuilder replace(int start, int end, CharSequence tb) {
         blockWatchers();
@@ -303,6 +308,7 @@
         return this;
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public SpannableStringBuilder replace(int start, int end, CharSequence tb, int tbstart,
             int tbend) {
@@ -312,42 +318,51 @@
         return this;
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public SpannableStringBuilder insert(int where, CharSequence tb) {
         super.insert(where, tb);
         return this;
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public SpannableStringBuilder insert(int where, CharSequence tb, int start, int end) {
         super.insert(where, tb, start, end);
         return this;
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public SpannableStringBuilder delete(int start, int end) {
         super.delete(start, end);
         return this;
     }
 
+    @NonNull
     @Override
-    public SpannableStringBuilder append(CharSequence text) {
+    public SpannableStringBuilder append(@SuppressLint("UnknownNullness") CharSequence text) {
         super.append(text);
         return this;
     }
 
+    @NonNull
     @Override
     public SpannableStringBuilder append(char text) {
         super.append(text);
         return this;
     }
 
+    @NonNull
     @Override
-    public SpannableStringBuilder append(CharSequence text, int start, int end) {
+    public SpannableStringBuilder append(@SuppressLint("UnknownNullness") CharSequence text,
+            int start,
+            int end) {
         super.append(text, start, end);
         return this;
     }
 
+    @SuppressLint("UnknownNullness")
     @Override
     public SpannableStringBuilder append(CharSequence text, Object what, int flags) {
         super.append(text, what, flags);
diff --git a/emoji2/emoji2/src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java b/emoji2/emoji2/src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java
index 2c3ab58..5eb3ff9 100644
--- a/emoji2/emoji2/src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java
+++ b/emoji2/emoji2/src/main/java/androidx/emoji2/text/TypefaceEmojiSpan.java
@@ -17,12 +17,14 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
+import android.annotation.SuppressLint;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.text.TextPaint;
 
 import androidx.annotation.IntRange;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
@@ -38,19 +40,20 @@
     /**
      * Paint object used to draw a background in debug mode.
      */
-    private static Paint sDebugPaint;
+    private static @Nullable Paint sDebugPaint;
 
     /**
      * Default constructor.
      *
      * @param metadata metadata representing the emoji that this span will draw
      */
-    public TypefaceEmojiSpan(final EmojiMetadata metadata) {
+    public TypefaceEmojiSpan(final @NonNull EmojiMetadata metadata) {
         super(metadata);
     }
 
     @Override
-    public void draw(@NonNull final Canvas canvas, final CharSequence text,
+    public void draw(@NonNull final Canvas canvas,
+            @SuppressLint("UnknownNullness") final CharSequence text,
             @IntRange(from = 0) final int start, @IntRange(from = 0) final int end, final float x,
             final int top, final int y, final int bottom, @NonNull final Paint paint) {
         if (EmojiCompat.get().isEmojiSpanIndicatorEnabled()) {
@@ -59,6 +62,7 @@
         getMetadata().draw(canvas, x, y, paint);
     }
 
+    @NonNull
     private static Paint getDebugPaint() {
         if (sDebugPaint == null) {
             sDebugPaint = new TextPaint();