Mutate the drawable when updating QS icon.
This fixes an issue that same drawable could be tinted in different places at the same time. Test: manual Test: atest QSIconViewImplTest Fixes: 196886638 Change-Id: Ib1d53b6b843c35406e50eec7975ee0e34dada640
This commit is contained in:
@@ -116,6 +116,9 @@ public class QSIconViewImpl extends QSIconView {
|
||||
: icon.getInvisibleDrawable(mContext) : null;
|
||||
int padding = icon != null ? icon.getPadding() : 0;
|
||||
if (d != null) {
|
||||
if (d.getConstantState() != null) {
|
||||
d = d.getConstantState().newDrawable();
|
||||
}
|
||||
d.setAutoMirrored(false);
|
||||
d.setLayoutDirection(getLayoutDirection());
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.argThat;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -73,6 +74,24 @@ public class QSIconViewImplTest extends SysuiTestCase {
|
||||
verify(s.icon, never()).getInvisibleDrawable(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMutateIconDrawable() {
|
||||
SlashImageView iv = mock(SlashImageView.class);
|
||||
Drawable originalDrawable = mock(Drawable.class);
|
||||
Drawable otherDrawable = mock(Drawable.class);
|
||||
State s = new State();
|
||||
s.icon = mock(Icon.class);
|
||||
when(s.icon.getInvisibleDrawable(eq(mContext))).thenReturn(originalDrawable);
|
||||
when(s.icon.getDrawable(eq(mContext))).thenReturn(originalDrawable);
|
||||
when(iv.isShown()).thenReturn(true);
|
||||
when(originalDrawable.getConstantState()).thenReturn(fakeConstantState(otherDrawable));
|
||||
|
||||
|
||||
mIconView.updateIcon(iv, s, /* allowAnimations= */true);
|
||||
|
||||
verify(iv).setState(any(), eq(otherDrawable));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNoFirstFade() {
|
||||
ImageView iv = mock(ImageView.class);
|
||||
@@ -104,4 +123,18 @@ public class QSIconViewImplTest extends SysuiTestCase {
|
||||
public void testIconNotSet_toString() {
|
||||
assertFalse(mIconView.toString().contains("lastIcon"));
|
||||
}
|
||||
|
||||
private static Drawable.ConstantState fakeConstantState(Drawable otherDrawable) {
|
||||
return new Drawable.ConstantState() {
|
||||
@Override
|
||||
public Drawable newDrawable() {
|
||||
return otherDrawable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChangingConfigurations() {
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user