Merge "API council changes for ResourcesLoaders"

This commit is contained in:
Ryan Mitchell
2020-02-13 16:31:55 +00:00
committed by Android (Google) Code Review
6 changed files with 111 additions and 111 deletions

View File

@@ -12703,8 +12703,7 @@ package android.content.res {
public class Resources {
ctor @Deprecated public Resources(android.content.res.AssetManager, android.util.DisplayMetrics, android.content.res.Configuration);
method public void addLoader(@NonNull android.content.res.loader.ResourcesLoader);
method public void clearLoaders();
method public void addLoaders(@NonNull android.content.res.loader.ResourcesLoader...);
method public final void finishPreloading();
method public final void flushLayoutCache();
method @NonNull public android.content.res.XmlResourceParser getAnimation(@AnimRes @AnimatorRes int) throws android.content.res.Resources.NotFoundException;
@@ -12731,7 +12730,6 @@ package android.content.res {
method @NonNull public int[] getIntArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
method public int getInteger(@IntegerRes int) throws android.content.res.Resources.NotFoundException;
method @NonNull public android.content.res.XmlResourceParser getLayout(@LayoutRes int) throws android.content.res.Resources.NotFoundException;
method @NonNull public java.util.List<android.content.res.loader.ResourcesLoader> getLoaders();
method @Deprecated public android.graphics.Movie getMovie(@RawRes int) throws android.content.res.Resources.NotFoundException;
method @NonNull public String getQuantityString(@PluralsRes int, int, java.lang.Object...) throws android.content.res.Resources.NotFoundException;
method @NonNull public String getQuantityString(@PluralsRes int, int) throws android.content.res.Resources.NotFoundException;
@@ -12759,8 +12757,7 @@ package android.content.res {
method public android.content.res.AssetFileDescriptor openRawResourceFd(@RawRes int) throws android.content.res.Resources.NotFoundException;
method public void parseBundleExtra(String, android.util.AttributeSet, android.os.Bundle) throws org.xmlpull.v1.XmlPullParserException;
method public void parseBundleExtras(android.content.res.XmlResourceParser, android.os.Bundle) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public void removeLoader(@NonNull android.content.res.loader.ResourcesLoader);
method public void setLoaders(@NonNull java.util.List<android.content.res.loader.ResourcesLoader>);
method public void removeLoaders(@NonNull android.content.res.loader.ResourcesLoader...);
method @Deprecated public void updateConfiguration(android.content.res.Configuration, android.util.DisplayMetrics);
field @AnyRes public static final int ID_NULL = 0; // 0x0
}

View File

@@ -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);
final List<ResourcesLoader> loaders = new ArrayList<>(
mResourcesImpl.getAssets().getLoaders());
if (!loaders.remove(loader)) {
for (int i = 0; i < loaders.length; i++) {
final ResourcesLoader loader = loaders[i];
if (!loaderSet.contains(loader)) {
newLoaders.add(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);
}
}
}
}

View File

@@ -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.

View File

@@ -44,7 +44,7 @@ class DirectoryAssetsProviderTest : ResourceLoaderTestBase() {
testDir = context.filesDir.resolve("DirectoryAssetsProvider_${testName.methodName}")
assetsProvider = DirectoryAssetsProvider(testDir)
loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
}
@After

View File

@@ -119,7 +119,7 @@ class ResourceLoaderAssetsTest : ResourceLoaderTestBase() {
val loader = ResourcesLoader()
loader.providers = listOf(one, two)
resources.addLoader(loader)
resources.addLoaders(loader)
assertOpenedAsset()
inOrder(two.assetsProvider, one.assetsProvider).apply {
@@ -149,7 +149,7 @@ class ResourceLoaderAssetsTest : ResourceLoaderTestBase() {
val loader2 = ResourcesLoader()
loader2.addProvider(two)
resources.loaders = listOf(loader1, loader2)
resources.addLoaders(loader1, loader2)
assertOpenedAsset()
inOrder(two.assetsProvider, one.assetsProvider).apply {
@@ -170,7 +170,7 @@ class ResourceLoaderAssetsTest : ResourceLoaderTestBase() {
val loader = ResourcesLoader()
val one = ResourcesProvider.empty(assetsProvider1)
val two = ResourcesProvider.empty(assetsProvider2)
resources.addLoader(loader)
resources.addLoaders(loader)
loader.providers = listOf(one, two)
assertOpenedAsset()
@@ -186,7 +186,7 @@ class ResourceLoaderAssetsTest : ResourceLoaderTestBase() {
val loader = ResourcesLoader()
val one = ResourcesProvider.empty(assetsProvider1)
val two = ResourcesProvider.empty(assetsProvider2)
resources.addLoader(loader)
resources.addLoaders(loader)
loader.providers = listOf(one, two)
assertOpenedAsset()
@@ -202,7 +202,7 @@ class ResourceLoaderAssetsTest : ResourceLoaderTestBase() {
val loader = ResourcesLoader()
val one = ResourcesProvider.empty(assetsProvider1)
val two = ResourcesProvider.empty(assetsProvider2)
resources.addLoader(loader)
resources.addLoaders(loader)
loader.providers = listOf(one, two)
assertOpenedAsset()

View File

@@ -192,13 +192,13 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
}
@Test
fun addMultipleProviders() {
fun addProvidersRepeatedly() {
val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.addProvider(testOne)
assertEquals(valueOne, getValue())
@@ -213,25 +213,25 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
}
@Test
fun addMultipleLoaders() {
fun addLoadersRepeatedly() {
val originalValue = getValue()
val testOne = openOne()
val testTwo = openTwo()
val loader1 = ResourcesLoader()
val loader2 = ResourcesLoader()
resources.addLoader(loader1)
resources.addLoaders(loader1)
loader1.addProvider(testOne)
assertEquals(valueOne, getValue())
resources.addLoader(loader2)
resources.addLoaders(loader2)
loader2.addProvider(testTwo)
assertEquals(valueTwo, getValue())
resources.removeLoader(loader1)
resources.removeLoaders(loader1)
assertEquals(valueTwo, getValue())
resources.removeLoader(loader2)
resources.removeLoaders(loader2)
assertEquals(originalValue, getValue())
}
@@ -242,7 +242,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.providers = listOf(testOne, testTwo)
assertEquals(valueTwo, getValue())
@@ -254,20 +254,20 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
}
@Test
fun setMultipleLoaders() {
fun addMultipleLoaders() {
val originalValue = getValue()
val loader1 = ResourcesLoader()
loader1.addProvider(openOne())
val loader2 = ResourcesLoader()
loader2.addProvider(openTwo())
resources.loaders = listOf(loader1, loader2)
resources.addLoaders(loader1, loader2)
assertEquals(valueTwo, getValue())
resources.removeLoader(loader2)
resources.removeLoaders(loader2)
assertEquals(valueOne, getValue())
resources.loaders = Collections.emptyList()
resources.removeLoaders(loader1)
assertEquals(originalValue, getValue())
}
@@ -291,7 +291,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.addProvider(testOne)
loader.addProvider(testTwo)
loader.addProvider(testOne)
@@ -308,9 +308,9 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val loader2 = ResourcesLoader()
loader2.addProvider(openTwo())
resources.addLoader(loader1)
resources.addLoader(loader2)
resources.addLoader(loader1)
resources.addLoaders(loader1)
resources.addLoaders(loader2)
resources.addLoaders(loader1)
assertEquals(2, resources.loaders.size)
assertEquals(resources.loaders[0], loader1)
@@ -323,7 +323,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.addProvider(testOne)
loader.addProvider(testTwo)
@@ -341,12 +341,16 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val loader2 = ResourcesLoader()
loader2.addProvider(openTwo())
resources.loaders = listOf(loader1, loader2)
resources.removeLoader(loader1)
resources.removeLoader(loader1)
resources.addLoaders(loader1, loader2)
resources.removeLoaders(loader1)
resources.removeLoaders(loader1)
assertEquals(1, resources.loaders.size)
assertEquals(resources.loaders[0], loader2)
resources.removeLoaders(loader2, loader2)
assertEquals(0, resources.loaders.size)
}
@Test
@@ -355,7 +359,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.providers = listOf(testOne, testTwo)
loader.providers = listOf(testOne, testTwo)
@@ -365,14 +369,14 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
}
@Test
fun repeatedSetLoaders() {
fun repeatedAddMultipleLoaders() {
val loader1 = ResourcesLoader()
loader1.addProvider(openOne())
val loader2 = ResourcesLoader()
loader2.addProvider(openTwo())
resources.loaders = listOf(loader1, loader2)
resources.loaders = listOf(loader1, loader2)
resources.addLoaders(loader1, loader2)
resources.addLoaders(loader1, loader2)
assertEquals(2, resources.loaders.size)
assertEquals(resources.loaders[0], loader1)
@@ -386,7 +390,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.addProvider(testOne)
loader.addProvider(testTwo)
assertEquals(valueTwo, getValue())
@@ -414,20 +418,20 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val loader2 = ResourcesLoader()
loader2.addProvider(testTwo)
resources.addLoader(loader1)
resources.addLoader(loader2)
resources.addLoaders(loader1)
resources.addLoaders(loader2)
assertEquals(valueTwo, getValue())
resources.removeLoader(loader1)
resources.removeLoaders(loader1)
assertEquals(valueTwo, getValue())
resources.addLoader(loader1)
resources.addLoaders(loader1)
assertEquals(valueOne, getValue())
resources.removeLoader(loader2)
resources.removeLoaders(loader2)
assertEquals(valueOne, getValue())
resources.removeLoader(loader1)
resources.removeLoaders(loader1)
assertEquals(originalValue, getValue())
}
@@ -444,10 +448,11 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val loader2 = ResourcesLoader()
loader2.providers = listOf(testThree, testFour)
resources.loaders = listOf(loader1, loader2)
resources.addLoaders(loader1, loader2)
assertEquals(valueFour, getValue())
resources.loaders = listOf(loader2, loader1)
resources.removeLoaders(loader1)
resources.addLoaders(loader1)
assertEquals(valueTwo, getValue())
loader1.removeProvider(testTwo)
@@ -471,7 +476,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val loader2 = ResourcesLoader()
loader2.addProvider(openTwo())
resources.loaders = listOf(loader1)
resources.addLoaders(loader1)
assertEquals(valueOne, getValue())
// The child context should include the loaders of the original context.
@@ -479,12 +484,12 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
assertEquals(valueOne, getValue(childContext))
// Changing the loaders of the child context should not affect the original context.
childContext.resources.loaders = listOf(loader1, loader2)
childContext.resources.addLoaders(loader2)
assertEquals(valueOne, getValue())
assertEquals(valueTwo, getValue(childContext))
// Changing the loaders of the original context should not affect the child context.
resources.removeLoader(loader1)
resources.removeLoaders(loader1)
assertEquals(originalValue, getValue())
assertEquals(valueTwo, getValue(childContext))
@@ -506,7 +511,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
val testTwo = openTwo()
val loader = ResourcesLoader()
resources.addLoader(loader)
resources.addLoaders(loader)
loader.addProvider(testOne)
assertEquals(valueOne, getValue())
@@ -527,7 +532,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
assertEquals(originalValue, getValue())
assertEquals(originalValue, getValue(childContext2))
childContext2.resources.addLoader(loader)
childContext2.resources.addLoaders(loader)
assertEquals(originalValue, getValue())
assertEquals(valueTwo, getValue(childContext))
assertEquals(valueTwo, getValue(childContext2))
@@ -539,7 +544,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
loader.addProvider(openOne())
val applicationContext = context.applicationContext
applicationContext.resources.addLoader(loader)
applicationContext.resources.addLoaders(loader)
assertEquals(valueOne, getValue(applicationContext))
val activity = mTestActivityRule.launchActivity(Intent())
@@ -556,7 +561,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
loader2.addProvider(openTwo())
val applicationContext = context.applicationContext
applicationContext.resources.addLoader(loader1)
applicationContext.resources.addLoaders(loader1)
assertEquals(valueOne, getValue(applicationContext))
var token: IBinder? = null
@@ -569,7 +574,7 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
assertEquals(valueOne, getValue(applicationContext))
assertEquals(valueOne, getValue(activity))
activity.resources.addLoader(loader2)
activity.resources.addLoaders(loader2)
assertEquals(valueOne, getValue(applicationContext))
assertEquals(valueTwo, getValue(activity))
@@ -598,10 +603,11 @@ class ResourceLoaderValuesTest : ResourceLoaderTestBase() {
loader2.addProvider(provider1)
loader2.addProvider(openTwo())
resources.loaders = listOf(loader1, loader2)
resources.addLoaders(loader1, loader2)
assertEquals(valueTwo, getValue())
resources.loaders = listOf(loader2, loader1)
resources.removeLoaders(loader1)
resources.addLoaders(loader1)
assertEquals(valueOne, getValue())
assertEquals(2, resources.assets.apkAssets.count { apkAssets -> apkAssets.isForLoader })