Restore KeyguardBottomAreaView state

KeyguardBottomAreaView will be re-inflated when the theme changes,
it's necessary to also restore some of its internal state, otherwise
we'll have NPEs.

Test: manual
Test: atest KeyguardBottomAreaTest
Fixes: 117121386
Change-Id: Idac8192877b65f8ad00cd60a2bb0c1ce75476cf1
This commit is contained in:
Lucas Dupin
2018-10-16 12:43:37 -07:00
parent a7998431d4
commit cea7deea4c
3 changed files with 57 additions and 1 deletions

View File

@@ -63,6 +63,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -228,6 +229,11 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
}
};
public void initFrom(KeyguardBottomAreaView oldBottomArea) {
setKeyguardIndicationController(oldBottomArea.mIndicationController);
setStatusBar(oldBottomArea.mStatusBar);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -578,7 +584,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
}
}
private void launchVoiceAssist() {
@VisibleForTesting
void launchVoiceAssist() {
Runnable runnable = new Runnable() {
@Override
public void run() {

View File

@@ -446,10 +446,12 @@ public class NotificationPanelView extends PanelView implements
// Update keyguard bottom area
index = indexOfChild(mKeyguardBottomArea);
removeView(mKeyguardBottomArea);
KeyguardBottomAreaView oldBottomArea = mKeyguardBottomArea;
mKeyguardBottomArea = (KeyguardBottomAreaView) LayoutInflater.from(mContext).inflate(
R.layout.keyguard_bottom_area,
this,
false);
mKeyguardBottomArea.initFrom(oldBottomArea);
addView(mKeyguardBottomArea, index);
initBottomArea();
setDarkAmount(mLinearDarkAmount, mInterpolatedDarkAmount);

View File

@@ -0,0 +1,47 @@
package com.android.systemui.statusbar.phone
import android.support.test.filters.SmallTest
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.KeyguardIndicationController
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
class KeyguardBottomAreaTest : SysuiTestCase() {
@Mock
private lateinit var mStatusBar: StatusBar
@Mock
private lateinit var mKeyguardIndicationController: KeyguardIndicationController
private lateinit var mKeyguardBottomArea: KeyguardBottomAreaView
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
mKeyguardBottomArea = LayoutInflater.from(mContext).inflate(
R.layout.keyguard_bottom_area, null, false) as KeyguardBottomAreaView
mKeyguardBottomArea.setStatusBar(mStatusBar)
mKeyguardBottomArea.setKeyguardIndicationController(mKeyguardIndicationController)
}
@Test
fun initFrom_doesntCrash() {
val other = LayoutInflater.from(mContext).inflate(
R.layout.keyguard_bottom_area, null, false) as KeyguardBottomAreaView
other.initFrom(mKeyguardBottomArea)
other.launchVoiceAssist()
other.onLongClick(null)
}
}