diff --git a/Android.bp b/Android.bp
index 680c703..9138aa1 100644
--- a/Android.bp
+++ b/Android.bp
@@ -15,6 +15,10 @@
 android_library {
     name: "localepicker",
     manifest: "AndroidManifest.xml",
+    sdk_version: "system_current",
+    static_libs: [
+        "androidx.annotation_annotation",
+    ],
     resource_dirs: [
         "res",
     ],
diff --git a/src/com/android/localepicker/LocaleHelper.java b/src/com/android/localepicker/LocaleHelper.java
index 7fd598f..ed2c543 100644
--- a/src/com/android/localepicker/LocaleHelper.java
+++ b/src/com/android/localepicker/LocaleHelper.java
@@ -16,12 +16,13 @@
 
 package com.android.localepicker;
 
-import android.annotation.IntRange;
 import android.icu.text.ListFormatter;
 import android.icu.util.ULocale;
 import android.os.LocaleList;
 import android.text.TextUtils;
 
+import androidx.annotation.IntRange;
+
 import java.text.Collator;
 import java.util.Comparator;
 import java.util.Locale;
@@ -159,52 +160,13 @@
     }
 
     /**
-     * Returns the locale list localized for display in the provided locale.
-     *
-     * @param locales the list of locales whose names is to be displayed.
-     * @param displayLocale the locale in which to display the names.
-     *                      If this is null, it will use the default locale.
-     * @param maxLocales maximum number of locales to display. Generates ellipsis after that.
-     * @return the locale aware list of locale names
-     */
-    public static String getDisplayLocaleList(
-            LocaleList locales, Locale displayLocale, @IntRange(from=1) int maxLocales) {
-
-        final Locale dispLocale = displayLocale == null ? Locale.getDefault() : displayLocale;
-
-        final boolean ellipsisNeeded = locales.size() > maxLocales;
-        final int localeCount, listCount;
-        if (ellipsisNeeded) {
-            localeCount = maxLocales;
-            listCount = maxLocales + 1;  // One extra slot for the ellipsis
-        } else {
-            listCount = localeCount = locales.size();
-        }
-        final String[] localeNames = new String[listCount];
-        for (int i = 0; i < localeCount; i++) {
-            localeNames[i] = LocaleHelper.getDisplayName(locales.get(i), dispLocale, false);
-        }
-        if (ellipsisNeeded) {
-            // Theoretically, we want to extract this from ICU's Resource Bundle for
-            // "Ellipsis/final", which seeAms to have different strings than the normal ellipsis for
-            // Hong Kong Traditional Chinese (zh_Hant_HK) and Dzongkha (dz). But that has two
-            // problems: it's expensive to extract it, and in case the output string becomes
-            // automatically ellipsized, it can result in weird output.
-            localeNames[maxLocales] = TextUtils.getEllipsisString(TextUtils.TruncateAt.END);
-        }
-
-        ListFormatter lfn = ListFormatter.getInstance(dispLocale);
-        return lfn.format((Object[]) localeNames);
-    }
-
-    /**
      * Adds the likely subtags for a provided locale ID.
      *
      * @param locale the locale to maximize.
      * @return the maximized Locale instance.
      */
     public static Locale addLikelySubtags(Locale locale) {
-        return libcore.icu.ICU.addLikelySubtags(locale);
+        return ULocale.addLikelySubtags(ULocale.forLocale(locale)).toLocale();
     }
 
     /**
diff --git a/src/com/android/localepicker/LocaleStore.java b/src/com/android/localepicker/LocaleStore.java
index 5d07ff2..ff4f85a 100644
--- a/src/com/android/localepicker/LocaleStore.java
+++ b/src/com/android/localepicker/LocaleStore.java
@@ -16,13 +16,15 @@
 
 package com.android.localepicker;
 
+import android.app.ActivityManager;
 import android.content.Context;
+import android.content.res.Resources;
+import android.icu.util.ULocale;
 import android.os.LocaleList;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
 
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.app.LocalePicker;
+import androidx.annotation.VisibleForTesting;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -191,7 +193,7 @@
     private static Set<String> getSimCountries(Context context) {
         Set<String> result = new HashSet<>();
 
-        TelephonyManager tm = TelephonyManager.from(context);
+        TelephonyManager tm = context.getSystemService(TelephonyManager.class);
 
         if (tm != null) {
             String iso = tm.getSimCountryIso().toUpperCase(Locale.US);
@@ -266,13 +268,14 @@
 
         final boolean isInDeveloperMode = Settings.Global.getInt(context.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
-        for (String localeId : LocalePicker.getSupportedLocales(context)) {
-            if (localeId.isEmpty()) {
-                throw new IllformedLocaleException("Bad locale entry in locale_config.xml");
+        ActivityManager activityManager = context.getSystemService(ActivityManager.class);
+        for (Locale locale : activityManager.getSupportedLocales()) {
+            if (locale == null) {
+                throw new NullPointerException("Bad locale entry in locale_config.xml");
             }
-            LocaleInfo li = new LocaleInfo(localeId);
+            LocaleInfo li = new LocaleInfo(locale);
 
-            if (LocaleList.isPseudoLocale(li.getLocale())) {
+            if (LocaleList.isPseudoLocale(ULocale.forLocale(li.getLocale()))) {
                 if (isInDeveloperMode) {
                     li.setTranslated(true);
                     li.mIsPseudo = true;
@@ -298,7 +301,7 @@
 
         // TODO: See if we can reuse what LocaleList.matchScore does
         final HashSet<String> localizedLocales = new HashSet<>();
-        for (String localeId : LocalePicker.getSystemAssetLocales()) {
+        for (String localeId : Resources.getSystem().getAssets().getLocales()) {
             LocaleInfo li = new LocaleInfo(localeId);
             final String country = li.getLocale().getCountry();
             // All this is to figure out if we should suggest a country
diff --git a/src/com/android/localepicker/SuggestedLocaleAdapter.java b/src/com/android/localepicker/SuggestedLocaleAdapter.java
index 97e2971..c012263 100644
--- a/src/com/android/localepicker/SuggestedLocaleAdapter.java
+++ b/src/com/android/localepicker/SuggestedLocaleAdapter.java
@@ -16,8 +16,6 @@
 
 package com.android.localepicker;
 
-import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.text.TextUtils;
@@ -29,7 +27,10 @@
 import android.widget.Filterable;
 import android.widget.TextView;
 
-import com.android.internal.annotations.VisibleForTesting;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
 import com.android.localepicker.R;
 
 import java.util.ArrayList;
