diff options
| author | Ryan Mitchell <rtmitchell@google.com> | 2020-02-11 15:51:29 -0800 |
|---|---|---|
| committer | Ryan Mitchell <rtmitchell@google.com> | 2020-02-12 12:34:44 -0800 |
| commit | e272307dd3319bbdc24e349a5334654a397f8629 (patch) | |
| tree | 9ebb6c2a9effe0e038b710aed7a9c2d338f9fa52 /core/java/android | |
| parent | 2779c6c7a425515fea7a861ce9117bbf1edaae53 (diff) | |
API council changes for ResourcesLoaders
Per API council guidance, setLoaders, getLoaders, and clearLoaders
are no longer part of the public API. addLoader and removeLoader
are now consume variadic loaders.
Bug: 142716192
Test: atest FrameworksResourceLoaderTests
Change-Id: If29d47b526ae6acd582b14206b2c6372f3c497be
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/content/res/Resources.java | 107 | ||||
| -rw-r--r-- | core/java/android/content/res/loader/ResourcesLoader.java | 4 |
2 files changed, 54 insertions, 57 deletions
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 471e83c4c3eb..cb809da3b867 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -62,6 +62,7 @@ import android.view.DisplayAdjustments; import android.view.ViewDebug; import android.view.ViewHierarchyEncoder; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.GrowingArrayUtils; @@ -112,7 +113,7 @@ public class Resources { static final String TAG = "Resources"; private static final Object sSync = new Object(); - private final Object mLock = new Object(); + private final Object mUpdateLock = new Object(); // Used by BridgeResources in layoutlib @UnsupportedAppUsage @@ -139,6 +140,7 @@ public class Resources { @UnsupportedAppUsage final ClassLoader mClassLoader; + @GuardedBy("mUpdateLock") private UpdateCallbacks mCallbacks = null; /** @@ -2375,6 +2377,7 @@ public class Resources { * * <p>Loaders are listed in increasing precedence order. A loader will override the resources * and assets of loaders listed before itself. + * @hide */ @NonNull public List<ResourcesLoader> getLoaders() { @@ -2382,87 +2385,81 @@ public class Resources { } /** - * Appends a loader to the end of the loader list. If the loader is already present in the - * loader list, the list will not be modified. - * - * @param loader the loader to add - */ - public void addLoader(@NonNull ResourcesLoader loader) { - synchronized (mLock) { - checkCallbacksRegistered(); - - final List<ResourcesLoader> loaders = new ArrayList<>( - mResourcesImpl.getAssets().getLoaders()); - if (loaders.contains(loader)) { - return; - } - - loaders.add(loader); - mCallbacks.onLoadersChanged(this, loaders); - loader.registerOnProvidersChangedCallback(this, mCallbacks); - } - } - - /** - * Removes a loader from the loaders. If the loader is not present in the loader list, the list + * Adds a loader to the list of loaders. If the loader is already present in the list, the list * will not be modified. * - * @param loader the loader to remove + * @param loaders the loaders to add */ - public void removeLoader(@NonNull ResourcesLoader loader) { - synchronized (mLock) { + public void addLoaders(@NonNull ResourcesLoader... loaders) { + synchronized (mUpdateLock) { checkCallbacksRegistered(); + final List<ResourcesLoader> newLoaders = + new ArrayList<>(mResourcesImpl.getAssets().getLoaders()); + final ArraySet<ResourcesLoader> loaderSet = new ArraySet<>(newLoaders); + + for (int i = 0; i < loaders.length; i++) { + final ResourcesLoader loader = loaders[i]; + if (!loaderSet.contains(loader)) { + newLoaders.add(loader); + } + } - final List<ResourcesLoader> loaders = new ArrayList<>( - mResourcesImpl.getAssets().getLoaders()); - if (!loaders.remove(loader)) { + if (loaderSet.size() == newLoaders.size()) { return; } - mCallbacks.onLoadersChanged(this, loaders); - loader.unregisterOnProvidersChangedCallback(this); + mCallbacks.onLoadersChanged(this, newLoaders); + for (int i = loaderSet.size(), n = newLoaders.size(); i < n; i++) { + newLoaders.get(i).registerOnProvidersChangedCallback(this, mCallbacks); + } } } /** - * Sets the list of loaders. + * Removes loaders from the list of loaders. If the loader is not present in the list, the list + * will not be modified. * - * @param loaders the new loaders + * @param loaders the loaders to remove */ - public void setLoaders(@NonNull List<ResourcesLoader> loaders) { - synchronized (mLock) { + public void removeLoaders(@NonNull ResourcesLoader... loaders) { + synchronized (mUpdateLock) { checkCallbacksRegistered(); - + final ArraySet<ResourcesLoader> removedLoaders = new ArraySet<>(loaders); + final List<ResourcesLoader> newLoaders = new ArrayList<>(); final List<ResourcesLoader> oldLoaders = mResourcesImpl.getAssets().getLoaders(); - int index = 0; - boolean modified = loaders.size() != oldLoaders.size(); - final ArraySet<ResourcesLoader> seenLoaders = new ArraySet<>(); - for (final ResourcesLoader loader : loaders) { - if (!seenLoaders.add(loader)) { - throw new IllegalArgumentException("Loader " + loader + " present twice"); - } - if (!modified && oldLoaders.get(index++) != loader) { - modified = true; + for (int i = 0, n = oldLoaders.size(); i < n; i++) { + final ResourcesLoader loader = oldLoaders.get(i); + if (!removedLoaders.contains(loader)) { + newLoaders.add(loader); } } - if (!modified) { + if (oldLoaders.size() == newLoaders.size()) { return; } - mCallbacks.onLoadersChanged(this, loaders); - for (int i = 0, n = oldLoaders.size(); i < n; i++) { - oldLoaders.get(i).unregisterOnProvidersChangedCallback(this); - } - for (ResourcesLoader newLoader : loaders) { - newLoader.registerOnProvidersChangedCallback(this, mCallbacks); + mCallbacks.onLoadersChanged(this, newLoaders); + for (int i = 0; i < loaders.length; i++) { + loaders[i].unregisterOnProvidersChangedCallback(this); } } } - /** Removes all {@link ResourcesLoader ResourcesLoader(s)}. */ + /** + * Removes all {@link ResourcesLoader ResourcesLoader(s)}. + * @hide + */ + @VisibleForTesting public void clearLoaders() { - setLoaders(Collections.emptyList()); + synchronized (mUpdateLock) { + checkCallbacksRegistered(); + final List<ResourcesLoader> newLoaders = Collections.emptyList(); + final List<ResourcesLoader> oldLoaders = mResourcesImpl.getAssets().getLoaders(); + mCallbacks.onLoadersChanged(this, newLoaders); + for (ResourcesLoader loader : oldLoaders) { + loader.unregisterOnProvidersChangedCallback(this); + } + } } } diff --git a/core/java/android/content/res/loader/ResourcesLoader.java b/core/java/android/content/res/loader/ResourcesLoader.java index 69daceeaffc2..58fec603a2d5 100644 --- a/core/java/android/content/res/loader/ResourcesLoader.java +++ b/core/java/android/content/res/loader/ResourcesLoader.java @@ -40,8 +40,8 @@ import java.util.List; * of {@link ResourcesProvider ResourcesProvider(s)} a loader contains propagates to all Resources * objects that use the loader. * - * <p>Loaders retrieved with {@link Resources#getLoaders()} are listed in increasing precedence - * order. A loader will override the resources and assets of loaders listed before itself. + * <p>Loaders must be added to Resources objects in increasing precedence order. A loader will + * override the resources and assets of loaders added before itself. * * <p>Providers retrieved with {@link #getProviders()} are listed in increasing precedence order. A * provider will override the resources and assets of providers listed before itself. |
