Merge "Deprecate LoaderCallback, create MetadataLoaderRepoCallback" into oc-support-26.0-dev am: 69d62e93e1
am: 9742d7bc0f

Change-Id: Id1e50051fa1d521ca005c766f5e96571b615210b
diff --git a/api/26.0.0-SNAPSHOT.txt b/api/26.0.0-SNAPSHOT.txt
index b39e21e..930e66f 100644
--- a/api/26.0.0-SNAPSHOT.txt
+++ b/api/26.0.0-SNAPSHOT.txt
@@ -1911,7 +1911,8 @@
   }
 
   public static abstract class EmojiCompat.Config {
-    ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataLoader);
+    ctor protected EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataRepoLoader);
+    ctor protected deprecated EmojiCompat.Config(android.support.text.emoji.EmojiCompat.MetadataLoader);
     method public android.support.text.emoji.EmojiCompat.Config registerInitCallback(android.support.text.emoji.EmojiCompat.InitCallback);
     method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorColor(int);
     method public android.support.text.emoji.EmojiCompat.Config setEmojiSpanIndicatorEnabled(boolean);
@@ -1925,16 +1926,26 @@
     method public void onInitialized();
   }
 
-  public static abstract class EmojiCompat.LoaderCallback {
+  public static abstract deprecated class EmojiCompat.LoaderCallback {
     ctor public EmojiCompat.LoaderCallback();
     method public abstract void onFailed(java.lang.Throwable);
     method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
   }
 
-  public static abstract interface EmojiCompat.MetadataLoader {
+  public static abstract deprecated interface EmojiCompat.MetadataLoader {
     method public abstract void load(android.support.text.emoji.EmojiCompat.LoaderCallback);
   }
 
+  public static abstract interface EmojiCompat.MetadataRepoLoader {
+    method public abstract void load(android.support.text.emoji.EmojiCompat.MetadataRepoLoaderCallback);
+  }
+
+  public static abstract class EmojiCompat.MetadataRepoLoaderCallback {
+    ctor public EmojiCompat.MetadataRepoLoaderCallback();
+    method public abstract void onFailed(java.lang.Throwable);
+    method public abstract void onLoaded(android.support.text.emoji.MetadataRepo);
+  }
+
   public abstract class EmojiSpan extends android.text.style.ReplacementSpan {
     method public int getSize(android.graphics.Paint, java.lang.CharSequence, int, int, android.graphics.Paint.FontMetricsInt);
   }
diff --git a/emoji/bundled/src/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java b/emoji/bundled/src/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
index 37fc444..97ea363 100644
--- a/emoji/bundled/src/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
+++ b/emoji/bundled/src/android/support/text/emoji/bundled/BundledEmojiCompatConfig.java
@@ -43,7 +43,7 @@
         super(new BundledMetadataLoader(context));
     }
 
-    private static class BundledMetadataLoader implements EmojiCompat.MetadataLoader {
+    private static class BundledMetadataLoader implements EmojiCompat.MetadataRepoLoader {
         private final Context mContext;
 
         private BundledMetadataLoader(@NonNull Context context) {
@@ -52,7 +52,7 @@
 
         @Override
         @RequiresApi(19)
-        public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
+        public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
             Preconditions.checkNotNull(loaderCallback, "loaderCallback cannot be null");
             final InitRunnable runnable = new InitRunnable(mContext, loaderCallback);
             final Thread thread = new Thread(runnable);
@@ -64,11 +64,11 @@
     @RequiresApi(19)
     private static class InitRunnable implements Runnable {
         private static final String FONT_NAME = "NotoColorEmojiCompat.ttf";
-        private final EmojiCompat.LoaderCallback mLoaderCallback;
+        private final EmojiCompat.MetadataRepoLoaderCallback mLoaderCallback;
         private final Context mContext;
 
         private InitRunnable(final Context context,
-                final EmojiCompat.LoaderCallback loaderCallback) {
+                final EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
             mContext = context;
             mLoaderCallback = loaderCallback;
         }
diff --git a/emoji/core/src/android/support/text/emoji/EmojiCompat.java b/emoji/core/src/android/support/text/emoji/EmojiCompat.java
index 5d816e5..26efbba 100644
--- a/emoji/core/src/android/support/text/emoji/EmojiCompat.java
+++ b/emoji/core/src/android/support/text/emoji/EmojiCompat.java
@@ -180,9 +180,16 @@
     private final CompatInternal mHelper;
 
     /**
-     * MetadataLoader instance given in the Config instance.
+     * Metadata loader instance given in the Config instance.
      */
-    private final MetadataLoader mMetadataLoader;
+    private final MetadataRepoLoader mMetadataLoader;
+
+    /**
+     * Old metadata loader instance given in the Config instance.
+     * @deprecated Will be removed soon.
+     */
+    @Deprecated
+    private final MetadataLoader mLegacyMetadataLoader;
 
     /**
      * @see Config#setReplaceAll(boolean)
@@ -210,6 +217,7 @@
         mEmojiSpanIndicatorEnabled = config.mEmojiSpanIndicatorEnabled;
         mEmojiSpanIndicatorColor = config.mEmojiSpanIndicatorColor;
         mMetadataLoader = config.mMetadataLoader;
+        mLegacyMetadataLoader = config.mLegacyMetadataLoader;
         mMainHandler = new Handler(Looper.getMainLooper());
         mInitCallbacks = new ArraySet<>();
         if (config.mInitCallbacks != null && !config.mInitCallbacks.isEmpty()) {
@@ -733,6 +741,44 @@
     /**
      * Interface to load emoji metadata.
      */
+    public interface MetadataRepoLoader {
+        /**
+         * Start loading the metadata. When the loading operation is finished {@link
+         * MetadataRepoLoaderCallback#onLoaded(MetadataRepo)} or
+         * {@link MetadataRepoLoaderCallback#onFailed(Throwable)} should be called. When used on
+         * devices running API 18 or below, this function is never called.
+         *
+         * @param loaderCallback callback to signal the loading state
+         */
+        void load(@NonNull MetadataRepoLoaderCallback loaderCallback);
+    }
+
+    /**
+     * Callback to inform EmojiCompat about the state of the metadata load. Passed to
+     * MetadataRepoLoader during {@link MetadataRepoLoader#load(MetadataRepoLoaderCallback)} call.
+     */
+    public abstract static class MetadataRepoLoaderCallback {
+        /**
+         * Called by {@link MetadataRepoLoader} when metadata is loaded successfully.
+         *
+         * @param metadataRepo MetadataRepo instance, cannot be {@code null}
+         */
+        public abstract void onLoaded(@NonNull MetadataRepo metadataRepo);
+
+        /**
+         * Called by {@link MetadataRepoLoader} if an error occurs while loading the metadata.
+         *
+         * @param throwable the exception that caused the failure, {@code nullable}
+         */
+        public abstract void onFailed(@Nullable Throwable throwable);
+    }
+
+    /**
+     * Interface to load emoji metadata.
+     *
+     * @deprecated Use {@link MetadataRepoLoader} instead.
+     */
+    @Deprecated
     public interface MetadataLoader {
         /**
          * Start loading the metadata. When the loading operation is finished {@link
@@ -748,7 +794,10 @@
     /**
      * Callback to inform EmojiCompat about the state of the metadata load. Passed to MetadataLoader
      * during {@link MetadataLoader#load(LoaderCallback)} call.
+     *
+     * @deprecated Use {@link MetadataRepoLoaderCallback} instead.
      */
+    @Deprecated
     public abstract static class LoaderCallback {
         /**
          * Called by {@link MetadataLoader} when metadata is loaded successfully.
@@ -772,7 +821,8 @@
      * @see #init(EmojiCompat.Config)
      */
     public abstract static class Config {
-        private final MetadataLoader mMetadataLoader;
+        private final MetadataRepoLoader mMetadataLoader;
+        private final MetadataLoader mLegacyMetadataLoader;
         private boolean mReplaceAll;
         private Set<InitCallback> mInitCallbacks;
         private boolean mEmojiSpanIndicatorEnabled;
@@ -781,11 +831,25 @@
         /**
          * Default constructor.
          *
+         * @param metadataLoader MetadataRepoLoader instance, cannot be {@code null}
+         */
+        protected Config(@NonNull final MetadataRepoLoader metadataLoader) {
+            Preconditions.checkNotNull(metadataLoader, "metadataLoader cannot be null.");
+            mMetadataLoader = metadataLoader;
+            mLegacyMetadataLoader = null;
+        }
+
+        /**
+         * Default constructor.
+         *
          * @param metadataLoader MetadataLoader instance, cannot be {@code null}
+         *
+         * @deprecated Use constructor with MetadataRepoLoader instead.
          */
         protected Config(@NonNull final MetadataLoader metadataLoader) {
             Preconditions.checkNotNull(metadataLoader, "metadataLoader cannot be null.");
-            mMetadataLoader = metadataLoader;
+            mLegacyMetadataLoader = metadataLoader;
+            mMetadataLoader = null;
         }
 
         /**
@@ -860,11 +924,11 @@
         }
 
         /**
-         * Returns the {@link MetadataLoader}.
+         * Returns the {@link MetadataRepoLoader}.
          * @hide
          */
         @RestrictTo(LIBRARY_GROUP)
-        public final MetadataLoader getMetadataLoader() {
+        public final MetadataRepoLoader getMetadataLoader() {
             return mMetadataLoader;
         }
     }
@@ -978,17 +1042,34 @@
         @Override
         void loadMetadata() {
             try {
-                mEmojiCompat.mMetadataLoader.load(new LoaderCallback() {
-                    @Override
-                    public void onLoaded(@NonNull MetadataRepo metadataRepo) {
-                        onMetadataLoadSuccess(metadataRepo);
-                    }
+                if (mEmojiCompat.mMetadataLoader != null) {
+                    final MetadataRepoLoaderCallback callback = new MetadataRepoLoaderCallback() {
+                        @Override
+                        public void onLoaded(@NonNull MetadataRepo metadataRepo) {
+                            onMetadataLoadSuccess(metadataRepo);
+                        }
 
-                    @Override
-                    public void onFailed(@Nullable Throwable throwable) {
-                        mEmojiCompat.onMetadataLoadFailed(throwable);
-                    }
-                });
+                        @Override
+                        public void onFailed(@Nullable Throwable throwable) {
+                            mEmojiCompat.onMetadataLoadFailed(throwable);
+                        }
+                    };
+                    mEmojiCompat.mMetadataLoader.load(callback);
+                } else {
+                    final LoaderCallback callback = new LoaderCallback() {
+                        @Override
+                        public void onLoaded(@NonNull MetadataRepo metadataRepo) {
+                            onMetadataLoadSuccess(metadataRepo);
+                        }
+
+                        @Override
+                        public void onFailed(@Nullable Throwable throwable) {
+                            mEmojiCompat.onMetadataLoadFailed(throwable);
+                        }
+                    };
+                    mEmojiCompat.mLegacyMetadataLoader.load(callback);
+                }
+
             } catch (Throwable t) {
                 mEmojiCompat.onMetadataLoadFailed(t);
             }
diff --git a/emoji/core/src/android/support/text/emoji/FontRequestEmojiCompatConfig.java b/emoji/core/src/android/support/text/emoji/FontRequestEmojiCompatConfig.java
index ae7cd14..b266473 100644
--- a/emoji/core/src/android/support/text/emoji/FontRequestEmojiCompatConfig.java
+++ b/emoji/core/src/android/support/text/emoji/FontRequestEmojiCompatConfig.java
@@ -64,10 +64,10 @@
 
 
     /**
-     * MetadataLoader implementation that uses FontsContractCompat and TypefaceCompat to load a
+     * MetadataRepoLoader implementation that uses FontsContractCompat and TypefaceCompat to load a
      * given FontRequest.
      */
-    private static class FontRequestMetadataLoader implements EmojiCompat.MetadataLoader {
+    private static class FontRequestMetadataLoader implements EmojiCompat.MetadataRepoLoader {
         private final Context mContext;
         private final FontRequest mRequest;
         private final FontsContractDelegate mFontsContract;
@@ -83,7 +83,7 @@
 
         @Override
         @RequiresApi(19)
-        public void load(@NonNull final EmojiCompat.LoaderCallback loaderCallback) {
+        public void load(@NonNull final EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
             Preconditions.checkNotNull(loaderCallback, "LoaderCallback cannot be null");
             final InitRunnable runnable =
                     new InitRunnable(mContext, mRequest, mFontsContract, loaderCallback);
@@ -98,7 +98,7 @@
      */
     @RequiresApi(19)
     private static class InitRunnable implements Runnable {
-        private final EmojiCompat.LoaderCallback mLoaderCallback;
+        private final EmojiCompat.MetadataRepoLoaderCallback mLoaderCallback;
         private final Context mContext;
         private final FontsContractDelegate mFontsContract;
         private final FontRequest mFontRequest;
@@ -106,7 +106,7 @@
         private InitRunnable(final Context context,
                 final FontRequest fontRequest,
                 final FontsContractDelegate fontsContract,
-                final EmojiCompat.LoaderCallback loaderCallback) {
+                final EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
             mContext = context;
             mFontRequest = fontRequest;
             mFontsContract = fontsContract;
diff --git a/emoji/core/tests/java/android/support/text/emoji/ConfigTest.java b/emoji/core/tests/java/android/support/text/emoji/ConfigTest.java
index 75692af..538ce99 100644
--- a/emoji/core/tests/java/android/support/text/emoji/ConfigTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/ConfigTest.java
@@ -102,9 +102,9 @@
     public void testInitCallback_callsFailCallback() {
         final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
         final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
-        final EmojiCompat.MetadataLoader loader = mock(EmojiCompat.MetadataLoader.class);
-        doThrow(new RuntimeException("")).when(loader).load(any(EmojiCompat.LoaderCallback
-                .class));
+        final EmojiCompat.MetadataRepoLoader loader = mock(EmojiCompat.MetadataRepoLoader.class);
+        doThrow(new RuntimeException("")).when(loader)
+                .load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
 
         final EmojiCompat.Config config = new TestConfigBuilder.TestConfig(loader)
                 .registerInitCallback(initCallback1)
diff --git a/emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java b/emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
index 72602c5..8201e96 100644
--- a/emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/FontRequestEmojiCompatConfigTest.java
@@ -203,7 +203,7 @@
         assertThat(argumentCaptor.getValue().getMessage(), containsString(exceptionMessage));
     }
 
-    public static class WaitingLoaderCallback extends EmojiCompat.LoaderCallback {
+    public static class WaitingLoaderCallback extends EmojiCompat.MetadataRepoLoaderCallback {
         final CountDownLatch mLatch;
 
         public WaitingLoaderCallback() {
diff --git a/emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java b/emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java
index e11f4da..10abb01 100644
--- a/emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java
+++ b/emoji/core/tests/java/android/support/text/emoji/InitCallbackTest.java
@@ -57,9 +57,9 @@
     public void testRegisterInitCallback_callsFailCallback() {
         final EmojiCompat.InitCallback initCallback1 = mock(EmojiCompat.InitCallback.class);
         final EmojiCompat.InitCallback initCallback2 = mock(EmojiCompat.InitCallback.class);
-        final EmojiCompat.MetadataLoader loader = mock(EmojiCompat.MetadataLoader.class);
-        doThrow(new RuntimeException("")).when(loader).load(any(EmojiCompat.LoaderCallback
-                .class));
+        final EmojiCompat.MetadataRepoLoader loader = mock(EmojiCompat.MetadataRepoLoader.class);
+        doThrow(new RuntimeException("")).when(loader)
+                .load(any(EmojiCompat.MetadataRepoLoaderCallback.class));
 
         final EmojiCompat.Config config = new TestConfig(loader);
         final EmojiCompat emojiCompat = EmojiCompat.reset(config);
@@ -76,9 +76,9 @@
     @SdkSuppress(minSdkVersion = 19)
     public void testRegisterInitCallback_callsFailCallback_whenOnFailCalledByLoader() {
         final EmojiCompat.InitCallback initCallback = mock(EmojiCompat.InitCallback.class);
-        final EmojiCompat.MetadataLoader loader = new EmojiCompat.MetadataLoader() {
+        final EmojiCompat.MetadataRepoLoader loader = new EmojiCompat.MetadataRepoLoader() {
             @Override
-            public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
+            public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
                 loaderCallback.onFailed(new RuntimeException(""));
             }
         };
@@ -95,9 +95,9 @@
     @SdkSuppress(minSdkVersion = 19)
     public void testRegisterInitCallback_callsFailCallback_whenMetadataRepoIsNull() {
         final EmojiCompat.InitCallback initCallback = mock(EmojiCompat.InitCallback.class);
-        final EmojiCompat.MetadataLoader loader = new EmojiCompat.MetadataLoader() {
+        final EmojiCompat.MetadataRepoLoader loader = new EmojiCompat.MetadataRepoLoader() {
             @Override
-            public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
+            public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
                 loaderCallback.onLoaded(null);
             }
         };
diff --git a/emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java b/emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java
index 202b2e4..242d62b 100644
--- a/emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java
+++ b/emoji/core/tests/java/android/support/text/emoji/TestConfigBuilder.java
@@ -34,12 +34,12 @@
             super(new TestEmojiDataLoader());
         }
 
-        TestConfig(final EmojiCompat.MetadataLoader metadataLoader) {
+        TestConfig(final EmojiCompat.MetadataRepoLoader metadataLoader) {
             super(metadataLoader);
         }
     }
 
-    public static class WaitingDataLoader implements EmojiCompat.MetadataLoader {
+    public static class WaitingDataLoader implements EmojiCompat.MetadataRepoLoader {
         private final CountDownLatch mLoaderLatch;
         private final CountDownLatch mTestLatch;
         private final boolean mSuccess;
@@ -63,7 +63,7 @@
         }
 
         @Override
-        public void load(@NonNull final EmojiCompat.LoaderCallback loaderCallback) {
+        public void load(@NonNull final EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
             new Thread(new Runnable() {
                 @Override
                 public void run() {
@@ -84,7 +84,7 @@
         }
     }
 
-    public static class TestEmojiDataLoader implements EmojiCompat.MetadataLoader {
+    public static class TestEmojiDataLoader implements EmojiCompat.MetadataRepoLoader {
         static final Object sMetadataRepoLock = new Object();
         // keep a static instance to in order not to slow down the tests
         @GuardedBy("sMetadataRepoLock")
@@ -94,7 +94,7 @@
         }
 
         @Override
-        public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
+        public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) {
             if (sMetadataRepo == null) {
                 synchronized (sMetadataRepoLock) {
                     if (sMetadataRepo == null) {