Cleans up findPreference()s and adds relevant nullness annotations

Also suppresses some lint warnings, and allows lint to fail on
unchecked errors. Cleans up some thrown exceptions as well.

Bug: b/36881810
Bug: b/120269565
Test: Manually verified
Change-Id: I3a1cbe3d6acaab722d6a306b422d9131ad7777bd
diff --git a/preference/api/1.1.0-alpha03.txt b/preference/api/1.1.0-alpha03.txt
index 0671bee..5a60465 100644
--- a/preference/api/1.1.0-alpha03.txt
+++ b/preference/api/1.1.0-alpha03.txt
@@ -33,7 +33,7 @@
   }
 
   public static interface DialogPreference.TargetFragment {
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
   }
 
   public class DropDownPreference extends androidx.preference.ListPreference {
@@ -150,7 +150,7 @@
     ctor public Preference(android.content.Context!);
     method public boolean callChangeListener(Object!);
     method public int compareTo(androidx.preference.Preference);
-    method protected <T extends androidx.preference.Preference> T! findPreferenceInHierarchy(String!);
+    method protected <T extends androidx.preference.Preference> T? findPreferenceInHierarchy(String);
     method public android.content.Context! getContext();
     method public String! getDependency();
     method public android.os.Bundle! getExtras();
@@ -356,7 +356,7 @@
   public abstract class PreferenceFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
     ctor public PreferenceFragmentCompat();
     method public void addPreferencesFromResource(@XmlRes int);
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public final androidx.recyclerview.widget.RecyclerView! getListView();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
@@ -396,7 +396,7 @@
     method public boolean addPreference(androidx.preference.Preference!);
     method protected void dispatchRestoreInstanceState(android.os.Bundle!);
     method protected void dispatchSaveInstanceState(android.os.Bundle!);
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public int getInitialExpandedChildrenCount();
     method public androidx.preference.Preference! getPreference(int);
     method public int getPreferenceCount();
@@ -417,7 +417,7 @@
 
   public class PreferenceManager {
     method public androidx.preference.PreferenceScreen! createPreferenceScreen(android.content.Context!);
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public android.content.Context! getContext();
     method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context!);
     method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener! getOnDisplayPreferenceDialogListener();
diff --git a/preference/api/current.txt b/preference/api/current.txt
index 0671bee..5a60465 100644
--- a/preference/api/current.txt
+++ b/preference/api/current.txt
@@ -33,7 +33,7 @@
   }
 
   public static interface DialogPreference.TargetFragment {
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
   }
 
   public class DropDownPreference extends androidx.preference.ListPreference {
@@ -150,7 +150,7 @@
     ctor public Preference(android.content.Context!);
     method public boolean callChangeListener(Object!);
     method public int compareTo(androidx.preference.Preference);
-    method protected <T extends androidx.preference.Preference> T! findPreferenceInHierarchy(String!);
+    method protected <T extends androidx.preference.Preference> T? findPreferenceInHierarchy(String);
     method public android.content.Context! getContext();
     method public String! getDependency();
     method public android.os.Bundle! getExtras();
@@ -356,7 +356,7 @@
   public abstract class PreferenceFragmentCompat extends androidx.fragment.app.Fragment implements androidx.preference.DialogPreference.TargetFragment androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener androidx.preference.PreferenceManager.OnNavigateToScreenListener androidx.preference.PreferenceManager.OnPreferenceTreeClickListener {
     ctor public PreferenceFragmentCompat();
     method public void addPreferencesFromResource(@XmlRes int);
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public final androidx.recyclerview.widget.RecyclerView! getListView();
     method public androidx.preference.PreferenceManager! getPreferenceManager();
     method public androidx.preference.PreferenceScreen! getPreferenceScreen();
@@ -396,7 +396,7 @@
     method public boolean addPreference(androidx.preference.Preference!);
     method protected void dispatchRestoreInstanceState(android.os.Bundle!);
     method protected void dispatchSaveInstanceState(android.os.Bundle!);
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public int getInitialExpandedChildrenCount();
     method public androidx.preference.Preference! getPreference(int);
     method public int getPreferenceCount();
@@ -417,7 +417,7 @@
 
   public class PreferenceManager {
     method public androidx.preference.PreferenceScreen! createPreferenceScreen(android.content.Context!);
-    method public <T extends androidx.preference.Preference> T! findPreference(CharSequence!);
+    method public <T extends androidx.preference.Preference> T? findPreference(CharSequence);
     method public android.content.Context! getContext();
     method public static android.content.SharedPreferences! getDefaultSharedPreferences(android.content.Context!);
     method public androidx.preference.PreferenceManager.OnDisplayPreferenceDialogListener! getOnDisplayPreferenceDialogListener();
diff --git a/preference/build.gradle b/preference/build.gradle
index 80ec938..64ad0f5 100644
--- a/preference/build.gradle
+++ b/preference/build.gradle
@@ -60,6 +60,6 @@
     mavenGroup = LibraryGroups.PREFERENCE
     inceptionYear = "2015"
     description = "AndroidX Preference"
-    failOnUncheckedWarnings = false
+    // TODO: remove when PreferenceFragment / PreferenceDialogFragment are removed
     failOnDeprecationWarnings = false
 }
diff --git a/preference/ktx/api/1.0.0.txt b/preference/ktx/api/1.0.0.txt
index e9174e1..e0d9d02 100644
--- a/preference/ktx/api/1.0.0.txt
+++ b/preference/ktx/api/1.0.0.txt
@@ -6,7 +6,7 @@
     method public static operator boolean contains(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
     method public static void forEach(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function1<? super androidx.preference.Preference,kotlin.Unit> action);
     method public static void forEachIndexed(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.preference.Preference,kotlin.Unit> action);
-    method public static operator androidx.preference.Preference get(androidx.preference.PreferenceGroup, CharSequence key);
+    method public static operator <T extends androidx.preference.Preference> T? get(androidx.preference.PreferenceGroup, CharSequence key);
     method public static operator androidx.preference.Preference get(androidx.preference.PreferenceGroup, int index);
     method public static kotlin.sequences.Sequence<androidx.preference.Preference> getChildren(androidx.preference.PreferenceGroup);
     method public static int getSize(androidx.preference.PreferenceGroup);
diff --git a/preference/ktx/api/1.1.0-alpha02.txt b/preference/ktx/api/1.1.0-alpha02.txt
index e09222b8..e0d9d02 100644
--- a/preference/ktx/api/1.1.0-alpha02.txt
+++ b/preference/ktx/api/1.1.0-alpha02.txt
@@ -6,7 +6,7 @@
     method public static operator boolean contains(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
     method public static void forEach(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function1<? super androidx.preference.Preference,kotlin.Unit> action);
     method public static void forEachIndexed(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.preference.Preference,kotlin.Unit> action);
-    method public static operator <T extends androidx.preference.Preference> T get(androidx.preference.PreferenceGroup, CharSequence key);
+    method public static operator <T extends androidx.preference.Preference> T? get(androidx.preference.PreferenceGroup, CharSequence key);
     method public static operator androidx.preference.Preference get(androidx.preference.PreferenceGroup, int index);
     method public static kotlin.sequences.Sequence<androidx.preference.Preference> getChildren(androidx.preference.PreferenceGroup);
     method public static int getSize(androidx.preference.PreferenceGroup);
diff --git a/preference/ktx/api/1.1.0-alpha03.txt b/preference/ktx/api/1.1.0-alpha03.txt
index e09222b8..e0d9d02 100644
--- a/preference/ktx/api/1.1.0-alpha03.txt
+++ b/preference/ktx/api/1.1.0-alpha03.txt
@@ -6,7 +6,7 @@
     method public static operator boolean contains(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
     method public static void forEach(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function1<? super androidx.preference.Preference,kotlin.Unit> action);
     method public static void forEachIndexed(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.preference.Preference,kotlin.Unit> action);
-    method public static operator <T extends androidx.preference.Preference> T get(androidx.preference.PreferenceGroup, CharSequence key);
+    method public static operator <T extends androidx.preference.Preference> T? get(androidx.preference.PreferenceGroup, CharSequence key);
     method public static operator androidx.preference.Preference get(androidx.preference.PreferenceGroup, int index);
     method public static kotlin.sequences.Sequence<androidx.preference.Preference> getChildren(androidx.preference.PreferenceGroup);
     method public static int getSize(androidx.preference.PreferenceGroup);
diff --git a/preference/ktx/api/current.txt b/preference/ktx/api/current.txt
index e09222b8..e0d9d02 100644
--- a/preference/ktx/api/current.txt
+++ b/preference/ktx/api/current.txt
@@ -6,7 +6,7 @@
     method public static operator boolean contains(androidx.preference.PreferenceGroup, androidx.preference.Preference preference);
     method public static void forEach(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function1<? super androidx.preference.Preference,kotlin.Unit> action);
     method public static void forEachIndexed(androidx.preference.PreferenceGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super androidx.preference.Preference,kotlin.Unit> action);
-    method public static operator <T extends androidx.preference.Preference> T get(androidx.preference.PreferenceGroup, CharSequence key);
+    method public static operator <T extends androidx.preference.Preference> T? get(androidx.preference.PreferenceGroup, CharSequence key);
     method public static operator androidx.preference.Preference get(androidx.preference.PreferenceGroup, int index);
     method public static kotlin.sequences.Sequence<androidx.preference.Preference> getChildren(androidx.preference.PreferenceGroup);
     method public static int getSize(androidx.preference.PreferenceGroup);
diff --git a/preference/ktx/src/main/java/androidx/preference/PreferenceGroup.kt b/preference/ktx/src/main/java/androidx/preference/PreferenceGroup.kt
index 2d7377a..4544c35 100644
--- a/preference/ktx/src/main/java/androidx/preference/PreferenceGroup.kt
+++ b/preference/ktx/src/main/java/androidx/preference/PreferenceGroup.kt
@@ -19,11 +19,10 @@
 package androidx.preference
 
 /**
- * Returns the preference with `key`.
- *
- * @throws NullPointerException if no preference is found with that key.
+ * Returns the preference with `key`, or `null` if no preference with `key` is found.
  */
-inline operator fun <T : Preference> PreferenceGroup.get(key: CharSequence): T = findPreference(key)
+inline operator fun <T : Preference> PreferenceGroup.get(key: CharSequence): T? =
+    findPreference(key)
 
 /**
  * Returns the preference at `index`.
@@ -31,7 +30,7 @@
  * @throws IndexOutOfBoundsException if index is less than 0 or greater than or equal to the count.
  */
 operator fun PreferenceGroup.get(index: Int): Preference = getPreference(index)
-        ?: throw IndexOutOfBoundsException("Index: $index, Size: $preferenceCount")
+    ?: throw IndexOutOfBoundsException("Index: $index, Size: $preferenceCount")
 
 /** Returns `true` if `preference` is found in this preference group. */
 operator fun PreferenceGroup.contains(preference: Preference): Boolean {
diff --git a/preference/src/androidTest/java/androidx/preference/tests/EditTextPreferenceTest.java b/preference/src/androidTest/java/androidx/preference/tests/EditTextPreferenceTest.java
index 62b8456..af6ef57 100644
--- a/preference/src/androidTest/java/androidx/preference/tests/EditTextPreferenceTest.java
+++ b/preference/src/androidTest/java/androidx/preference/tests/EditTextPreferenceTest.java
@@ -23,7 +23,7 @@
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 import static androidx.test.espresso.matcher.ViewMatchers.withText;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertNull;
 
 import android.text.InputFilter;
@@ -95,6 +95,6 @@
                         .findFragmentByTag(
                                 "androidx.preference.PreferenceFragment.DIALOG")).getDialog()
                         .findViewById(android.R.id.edit);
-        assertEquals(filters, editText.getFilters());
+        assertArrayEquals(filters, editText.getFilters());
     }
 }
diff --git a/preference/src/androidTest/java/androidx/preference/tests/PreferenceGroupFindPreferenceTest.java b/preference/src/androidTest/java/androidx/preference/tests/PreferenceGroupFindPreferenceTest.java
new file mode 100644
index 0000000..9fb8049
--- /dev/null
+++ b/preference/src/androidTest/java/androidx/preference/tests/PreferenceGroupFindPreferenceTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.preference.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
+import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Test for {@link PreferenceGroup#findPreference(CharSequence)}
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class PreferenceGroupFindPreferenceTest {
+
+    private static final String KEY = "test_key";
+
+    private Preference mPreference;
+    private PreferenceScreen mScreen;
+
+    @Before
+    @UiThreadTest
+    public void setup() {
+        Context context = ApplicationProvider.getApplicationContext();
+        PreferenceManager manager = new PreferenceManager(context);
+        mPreference = new Preference(context);
+        mPreference.setKey(KEY);
+        mScreen = manager.createPreferenceScreen(context);
+    }
+
+    /**
+     * Tests that the {@link Preference} with the given key is correctly returned.
+     */
+    @Test
+    @UiThreadTest
+    public void preferenceInGroup_findPreferenceReturnsPreference() {
+        mScreen.addPreference(mPreference);
+        assertEquals(mPreference, mScreen.findPreference(KEY));
+    }
+
+    /**
+     * Tests that {@code null} is returned if no {@link Preference} exists with the given key.
+     */
+    @Test
+    @UiThreadTest
+    public void preferenceNotInGroup_findPreferenceReturnsNull() {
+        // Preference not added to the group
+        assertNull(mScreen.findPreference(KEY));
+    }
+
+    /**
+     * Tests that an exception is thrown if the key is null.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    @UiThreadTest
+    public void findPreferenceWithNullKey_exceptionThrown() {
+        mScreen.findPreference(null);
+    }
+}
diff --git a/preference/src/main/java/androidx/preference/DialogPreference.java b/preference/src/main/java/androidx/preference/DialogPreference.java
index b39a17b..059d3ae 100644
--- a/preference/src/main/java/androidx/preference/DialogPreference.java
+++ b/preference/src/main/java/androidx/preference/DialogPreference.java
@@ -23,6 +23,8 @@
 import android.util.AttributeSet;
 import android.view.View;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.content.res.TypedArrayUtils;
 
@@ -264,13 +266,15 @@
      */
     public interface TargetFragment {
         /**
-         * Finds a {@link Preference} based on its key.
+         * Finds a {@link Preference} with the given key. Returns {@code null} if no
+         * {@link Preference} could be found with the given key.
          *
-         * @param key The key of the preference to retrieve
+         * @param key The key of the {@link Preference} to retrieve
          * @return The {@link Preference} with the key, or {@code null}
          * @see PreferenceGroup#findPreference(CharSequence)
          */
         @SuppressWarnings("TypeParameterUnusedInFormals")
-        <T extends Preference> T findPreference(CharSequence key);
+        @Nullable
+        <T extends Preference> T findPreference(@NonNull CharSequence key);
     }
 }
diff --git a/preference/src/main/java/androidx/preference/DropDownPreference.java b/preference/src/main/java/androidx/preference/DropDownPreference.java
index 9f3bf62..c158389 100644
--- a/preference/src/main/java/androidx/preference/DropDownPreference.java
+++ b/preference/src/main/java/androidx/preference/DropDownPreference.java
@@ -101,6 +101,7 @@
         return new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_dropdown_item);
     }
 
+    @SuppressWarnings("unchecked")
     private void updateEntries() {
         mAdapter.clear();
         if (getEntries() != null) {
diff --git a/preference/src/main/java/androidx/preference/ListPreference.java b/preference/src/main/java/androidx/preference/ListPreference.java
index 2cab574..99ba692 100644
--- a/preference/src/main/java/androidx/preference/ListPreference.java
+++ b/preference/src/main/java/androidx/preference/ListPreference.java
@@ -158,6 +158,7 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public CharSequence getSummary() {
         if (getSummaryProvider() != null) {
@@ -169,7 +170,7 @@
             return summary;
         }
         String formattedString = String.format(mSummary, entry == null ? "" : entry);
-        if (formattedString.contentEquals(summary)) {
+        if (TextUtils.equals(formattedString, summary)) {
             return summary;
         }
         Log.w(TAG,
diff --git a/preference/src/main/java/androidx/preference/Preference.java b/preference/src/main/java/androidx/preference/Preference.java
index 31ef4ec..cfa8b4e 100644
--- a/preference/src/main/java/androidx/preference/Preference.java
+++ b/preference/src/main/java/androidx/preference/Preference.java
@@ -715,6 +715,7 @@
      * @see #setSummary(CharSequence)
      * @see #setSummaryProvider(SummaryProvider)
      */
+    @SuppressWarnings("unchecked")
     public CharSequence getSummary() {
         if (getSummaryProvider() != null) {
             return getSummaryProvider().provideSummary(this);
@@ -1394,17 +1395,19 @@
     }
 
     /**
-     * Finds a preference in this hierarchy (the whole thing, even above/below your
-     * {@link PreferenceScreen} screen break) with the given key.
+     * Finds a preference in the entire hierarchy (above or below this preference) with the given
+     * key. Returns {@code null} if no preference could be found with the given key.
      *
-     * <p>This only functions after we have been attached to a hierarchy.
+     * <p>This only works after this preference has been attached to a hierarchy.
      *
-     * @param key The key of the preference to find
-     * @return The preference that uses the given key
+     * @param key The key of the preference to retrieve
+     * @return The preference with the key, or {@code null}
+     * @see PreferenceGroup#findPreference(CharSequence)
      */
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    protected <T extends Preference> T findPreferenceInHierarchy(String key) {
-        if (TextUtils.isEmpty(key) || mPreferenceManager == null) {
+    @Nullable
+    protected <T extends Preference> T findPreferenceInHierarchy(@NonNull String key) {
+        if (mPreferenceManager == null) {
             return null;
         }
 
diff --git a/preference/src/main/java/androidx/preference/PreferenceFragment.java b/preference/src/main/java/androidx/preference/PreferenceFragment.java
index 4efe0d5..de7e8f1 100644
--- a/preference/src/main/java/androidx/preference/PreferenceFragment.java
+++ b/preference/src/main/java/androidx/preference/PreferenceFragment.java
@@ -92,6 +92,7 @@
  *
  * @deprecated Use {@link PreferenceFragmentCompat} instead
  */
+@SuppressWarnings("deprecation")
 @Deprecated
 public abstract class PreferenceFragment extends Fragment implements
         PreferenceManager.OnPreferenceTreeClickListener,
diff --git a/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java b/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
index 9a22723..5e22662 100644
--- a/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
+++ b/preference/src/main/java/androidx/preference/PreferenceFragmentCompat.java
@@ -199,7 +199,7 @@
 
         final View rawListContainer = view.findViewById(AndroidResources.ANDROID_R_LIST_CONTAINER);
         if (!(rawListContainer instanceof ViewGroup)) {
-            throw new RuntimeException("Content has view with id attribute "
+            throw new IllegalStateException("Content has view with id attribute "
                     + "'android.R.id.list_container' that is not a ViewGroup class");
         }
 
@@ -457,7 +457,8 @@
 
     @Override
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    public <T extends Preference> T findPreference(CharSequence key) {
+    @Nullable
+    public <T extends Preference> T findPreference(@NonNull CharSequence key) {
         if (mPreferenceManager == null) {
             return null;
         }
diff --git a/preference/src/main/java/androidx/preference/PreferenceGroup.java b/preference/src/main/java/androidx/preference/PreferenceGroup.java
index 6afd79e..62a609a 100644
--- a/preference/src/main/java/androidx/preference/PreferenceGroup.java
+++ b/preference/src/main/java/androidx/preference/PreferenceGroup.java
@@ -354,18 +354,20 @@
 
     /**
      * Finds a {@link Preference} based on its key. If two {@link Preference}s share the same key
-     * (not recommended), the first to appear will be returned (to retrieve the other preference
-     * with the same key, call this method on the first preference). If this preference has the
-     * key, it will not be returned.
+     * (not recommended), the first to appear will be returned.
      *
-     * <p>This will recursively search for the preference into children that are also
+     * <p>This will recursively search for the {@link Preference} in any children that are also
      * {@link PreferenceGroup}s.
      *
-     * @param key The key of the preference to retrieve
-     * @return The {@link Preference} with the key, or null
+     * @param key The key of the {@link Preference} to retrieve
+     * @return The {@link Preference} with the key, or {@code null}
      */
-    @SuppressWarnings("TypeParameterUnusedInFormals")
-    public <T extends Preference> T findPreference(CharSequence key) {
+    @SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
+    @Nullable
+    public <T extends Preference> T findPreference(@NonNull CharSequence key) {
+        if (key == null) {
+            throw new IllegalArgumentException("Key cannot be null");
+        }
         if (TextUtils.equals(getKey(), key)) {
             return (T) this;
         }
@@ -374,7 +376,7 @@
             final Preference preference = getPreference(i);
             final String curKey = preference.getKey();
 
-            if (curKey != null && curKey.contentEquals(key)) {
+            if (TextUtils.equals(curKey, key)) {
                 return (T) preference;
             }
 
@@ -385,7 +387,6 @@
                 }
             }
         }
-
         return null;
     }
 
diff --git a/preference/src/main/java/androidx/preference/PreferenceManager.java b/preference/src/main/java/androidx/preference/PreferenceManager.java
index 622d345..80382a7 100644
--- a/preference/src/main/java/androidx/preference/PreferenceManager.java
+++ b/preference/src/main/java/androidx/preference/PreferenceManager.java
@@ -25,6 +25,7 @@
 import android.os.Build.VERSION_CODES;
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.ContextCompat;
@@ -433,14 +434,16 @@
     }
 
     /**
-     * Finds a {@link Preference} based on its key.
+     * Finds a {@link Preference} with the given key. Returns {@code null} if no
+     * {@link Preference} could be found with the given key.
      *
-     * @param key The key of the preference to retrieve
+     * @param key The key of the {@link Preference} to retrieve
      * @return The {@link Preference} with the key, or {@code null}
      * @see PreferenceGroup#findPreference(CharSequence)
      */
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    public <T extends Preference> T findPreference(CharSequence key) {
+    @Nullable
+    public <T extends Preference> T findPreference(@NonNull CharSequence key) {
         if (mPreferenceScreen == null) {
             return null;
         }