package com.bumptech.glide.module;

import com.bumptech.glide.Registry;

/**
 * An interface allowing lazy configuration of Glide including setting options using
 * {@link com.bumptech.glide.GlideBuilder} and registering
 * {@link com.bumptech.glide.load.model.ModelLoader ModelLoaders}.
 *
 * <p> To use this interface: <ol> <li> Implement the GlideModule interface in a class with public
 * visibility, calling
 * {@link Registry#prepend(Class, Class, com.bumptech.glide.load.ResourceDecoder)} for each
 * {@link com.bumptech.glide.load.model.ModelLoader} you'd like to register:
 * <pre>
 *                  <code>
 *                      public class FlickrGlideModule implements GlideModule {
 *                          {@literal @}Override
 *                          public void applyOptions(Context context, GlideBuilder builder) {
 *                              builder.setDecodeFormat(DecodeFormat.ALWAYS_ARGB_8888);
 *                          }
 *
 *                          {@literal @}Override
 *                          public void registerComponents(Context context, Glide glide) {
 *                              glide.register(Model.class, Data.class, new MyModelLoader());
 *                          }
 *                      }
 *                  </code>
 *             </pre>
 * </li> <li> Add your implementation to your list of keeps in your proguard.cfg file:
 * <pre>
 *                  {@code
 *                      -keepnames class * com.bumptech.glide.samples.flickr.FlickrGlideModule
 *                  }
 *              </pre>
 * </li> <li> Add a metadata tag to your AndroidManifest.xml with your GlideModule implementation's
 * fully qualified classname as the key, and {@code GlideModule} as the value:
 * <pre>
 *                 {@code
 *                      <meta-data
 *                          android:name="com.bumptech.glide.samples.flickr.FlickrGlideModule"
 *                          android:value="GlideModule" />
 *                 }
 *             </pre>
 * </li> </ol> </p>
 *
 * <p> All implementations must be publicly visible and contain only an empty constructor so they
 * can be instantiated via reflection when Glide is lazily initialized. </p>
 *
 * <p> There is no defined order in which modules are called, so projects should be careful to avoid
 * applying conflicting settings in different modules. If an application depends on libraries that
 * have conflicting modules, the application should consider avoiding the library modules and
 * instead providing their required dependencies in a single application module. </p>
 *
 * @deprecated Libraries should use {@link LibraryGlideModule} and Applications should use
 * {@link AppGlideModule}.
 */
@Deprecated
public interface GlideModule extends RegistersComponents, AppliesOptions { }
