[res] Preserve the resid order in ThemeKey

Resource ID order matters for ThemeKey objects - we apply them
one after another, overriding all attributes that happen to
repeat. This means duplicate filtering has to move the "newly
added" ids to the end of the list, making sure they have the
final word.

Bug: 278667073
Test: build + boot + bug repro
Merged-In: If547e16a15f5f7294fc863852171c96e10402cf7
Change-Id: If547e16a15f5f7294fc863852171c96e10402cf7
This commit is contained in:
Yurii Zubrytskyi
2023-06-20 17:36:51 -07:00
parent cc112e1010
commit 99be40df05

View File

@@ -2003,13 +2003,25 @@ public class Resources {
private int mHashCode = 0;
private boolean containsValue(int resId, boolean force) {
private int findValue(int resId, boolean force) {
for (int i = 0; i < mCount; ++i) {
if (mResId[i] == resId && mForce[i] == force) {
return true;
return i;
}
}
return false;
return -1;
}
private void moveToLast(int index) {
if (index < 0 || index >= mCount - 1) {
return;
}
final int id = mResId[index];
final boolean force = mForce[index];
System.arraycopy(mResId, index + 1, mResId, index, mCount - index - 1);
mResId[mCount - 1] = id;
System.arraycopy(mForce, index + 1, mForce, index, mCount - index - 1);
mForce[mCount - 1] = force;
}
public void append(int resId, boolean force) {
@@ -2022,15 +2034,17 @@ public class Resources {
}
// Some apps tend to keep adding same resources over and over, let's protect from it.
if (containsValue(resId, force)) {
return;
// Note: the order still matters, as the values that come later override the earlier
// ones.
final int index = findValue(resId, force);
if (index >= 0) {
moveToLast(index);
} else {
mResId = GrowingArrayUtils.append(mResId, mCount, resId);
mForce = GrowingArrayUtils.append(mForce, mCount, force);
mCount++;
mHashCode = 31 * (31 * mHashCode + resId) + (force ? 1 : 0);
}
mResId = GrowingArrayUtils.append(mResId, mCount, resId);
mForce = GrowingArrayUtils.append(mForce, mCount, force);
mCount++;
mHashCode = 31 * (31 * mHashCode + resId) + (force ? 1 : 0);
}
/**