Fix weather clock clipped when swiping in Lockscreen

The cause is that layer will be clipped to the bound when alpha < 1.0

Test: atest KeyguardClockSwitchControllerTest, KeyguardStatusViewTest
Bug: 279487893

Change-Id: I38929ee87c1025a2b863b2092e5cab41c6f9419f
This commit is contained in:
Sherry Zhou
2023-04-28 22:07:38 +00:00
parent a1e3db27ef
commit e40e3268e1
5 changed files with 63 additions and 3 deletions

View File

@@ -178,6 +178,20 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
}
}
/**
* Set alpha directly to mView will clip clock, so we set alpha to clock face instead
*/
public void setAlpha(float alpha) {
ClockController clock = getClock();
if (clock != null) {
clock.getLargeClock().getView().setAlpha(alpha);
clock.getSmallClock().getView().setAlpha(alpha);
}
if (mStatusArea != null) {
mStatusArea.setAlpha(alpha);
}
}
/**
* Attach the controller to the view it relates to.
*/

View File

@@ -135,4 +135,29 @@ public class KeyguardStatusView extends GridLayout {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Trace.endSection();
}
/**
* Clock content will be clipped when goes beyond bounds,
* so we setAlpha for all views except clock
*/
public void setAlpha(float alpha, boolean excludeClock) {
if (!excludeClock) {
setAlpha(alpha);
return;
}
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (child == mStatusViewContainer) {
for (int j = 0; j < mStatusViewContainer.getChildCount(); j++) {
View innerChild = mStatusViewContainer.getChildAt(j);
if (innerChild != mClockView) {
innerChild.setAlpha(alpha);
}
}
} else {
child.setAlpha(alpha);
}
}
}
}

View File

@@ -180,7 +180,8 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
*/
public void setAlpha(float alpha) {
if (!mKeyguardVisibilityHelper.isVisibilityAnimating()) {
mView.setAlpha(alpha);
mView.setAlpha(alpha, true);
mKeyguardClockSwitchController.setAlpha(alpha);
}
}

View File

@@ -134,6 +134,7 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
private KeyguardClockSwitchController mController;
private View mSliceView;
private LinearLayout mStatusArea;
private FakeExecutor mExecutor;
@Before
@@ -195,8 +196,8 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
mSliceView = new View(getContext());
when(mView.findViewById(R.id.keyguard_slice_view)).thenReturn(mSliceView);
when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(
new LinearLayout(getContext()));
mStatusArea = new LinearLayout(getContext());
when(mView.findViewById(R.id.keyguard_status_area)).thenReturn(mStatusArea);
}
@Test
@@ -401,6 +402,15 @@ public class KeyguardClockSwitchControllerTest extends SysuiTestCase {
assertNull(mController.getClock());
}
@Test
public void testSetAlpha_setClockAlphaForCLockFace() {
mController.onViewAttached();
mController.setAlpha(0.5f);
verify(mLargeClockView).setAlpha(0.5f);
verify(mSmallClockView).setAlpha(0.5f);
assertEquals(0.5f, mStatusArea.getAlpha(), 0.0f);
}
private void verifyAttachment(VerificationMode times) {
verify(mClockRegistry, times).registerClockChangeListener(
any(ClockRegistry.ClockChangeListener.class));

View File

@@ -24,6 +24,8 @@ class KeyguardStatusViewTest : SysuiTestCase() {
get() = keyguardStatusView.findViewById(R.id.status_view_media_container)
private val statusViewContainer: ViewGroup
get() = keyguardStatusView.findViewById(R.id.status_view_container)
private val clockView: ViewGroup
get() = keyguardStatusView.findViewById(R.id.keyguard_clock_container)
private val childrenExcludingMedia
get() = statusViewContainer.children.filter { it != mediaView }
@@ -56,4 +58,12 @@ class KeyguardStatusViewTest : SysuiTestCase() {
assertThat(it.translationY).isEqualTo(translationY)
}
}
@Test
fun setAlphaExcludeClock() {
keyguardStatusView.setAlpha(0.5f, /* excludeClock= */true)
assertThat(statusViewContainer.alpha).isNotEqualTo(0.5f)
assertThat(mediaView.alpha).isEqualTo(0.5f)
assertThat(clockView.alpha).isNotEqualTo(0.5f)
}
}