diff options
author | Farruh Habibullaev <farruhh@google.com> | 2021-10-25 14:42:07 -0700 |
---|---|---|
committer | Farruh Habibullaev <farruhh@google.com> | 2021-10-26 02:38:50 +0000 |
commit | d1ee862270de8ec5487af39e3f918aa0ed5eb0c9 (patch) | |
tree | 1dc8a6ff9c9d49fb0890c70fa091a42348c22862 | |
parent | 82328bb4765806086e1cac7eecb2357650aa1e40 (diff) | |
download | setupwizard-d1ee862270de8ec5487af39e3f918aa0ed5eb0c9.tar.gz |
Add nullability check for toolbar instance
- to avoid any operation on it if toolbar instance is null.
- by adding necessary unit tests
- by manually checking the added behavior.
Test: added unit tests to verify
BUG: 204113738
Change-Id: I7d4b3ff1d73d2ff6d60a52c6e4d67c4c67b0644e
2 files changed, 86 insertions, 16 deletions
diff --git a/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java b/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java index 36af464..706ce19 100644 --- a/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java +++ b/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java @@ -100,7 +100,7 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay } CarSetupWizardBaseLayout(Context context, @Nullable AttributeSet attrs, - int defStyleAttr) { + int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } @@ -109,7 +109,7 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay * the custom views that can be set by the user (e.g. back button, continue button). */ CarSetupWizardBaseLayout(Context context, @Nullable AttributeSet attrs, - int defStyleAttr, int defStyleRes) { + int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mPartnerConfigHelper = PartnerConfigHelper.get(context); @@ -435,6 +435,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay * Sets the header title visibility to given value. */ public void setToolbarTitleVisible(boolean visible) { + if (mToolbarTitle == null) { + return; + } setViewVisible(mToolbarTitle, visible); } @@ -442,6 +445,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay * Sets the header title text to the provided text. */ public void setToolbarTitleText(String text) { + if (mToolbarTitle == null) { + return; + } mToolbarTitle.setText(text); } @@ -449,6 +455,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay * Sets the style for the toolbar title. */ public void setToolbarTitleStyle(@StyleRes int style) { + if (mToolbarTitle == null) { + return; + } mToolbarTitle.setTextAppearance(style); } @@ -688,7 +697,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay return findViewById(R.id.layout_content_stub); } - /** Returns the content ViewStub when split-nav layout is used or rotary control is supported */ + /** + * Returns the content ViewStub when split-nav layout is used or rotary control is supported + */ public ViewStub getContentViewStub() { return findViewById(R.id.layout_content_stub); } @@ -702,8 +713,10 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay } int direction = TextUtils.getLayoutDirectionFromLocale(locale); - mToolbarTitle.setTextLocale(locale); - mToolbarTitle.setLayoutDirection(direction); + if (mToolbarTitle != null) { + mToolbarTitle.setTextLocale(locale); + mToolbarTitle.setLayoutDirection(direction); + } mPrimaryToolbarButton.setTextLocale(locale); mPrimaryToolbarButton.setLayoutDirection(direction); @@ -755,7 +768,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay } } - /** Sets button text color using partner overlay if exists */ + /** + * Sets button text color using partner overlay if exists + */ @VisibleForTesting void setButtonTextColor(TextView button, PartnerConfig config) { ColorStateList colorStateList = @@ -783,7 +798,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay } } - /** Sets button background color using partner overlay if exists */ + /** + * Sets button background color using partner overlay if exists + */ @VisibleForTesting void setBackgroundColor(View button, PartnerConfig config) { ColorStateList color = mPartnerConfigHelper.getColorStateList(getContext(), config); @@ -792,7 +809,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay } } - /** Sets button text size using partner overlay if exists */ + /** + * Sets button text size using partner overlay if exists + */ @VisibleForTesting void setButtonTextSize(TextView button) { float dimension = mPartnerConfigHelper.getDimension( @@ -807,10 +826,12 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay boolean shouldMirrorNavIcons() { return getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL && mPartnerConfigHelper.getBoolean( - getContext(), PartnerConfig.CONFIG_TOOLBAR_NAV_ICON_MIRRORING_IN_RTL, true); + getContext(), PartnerConfig.CONFIG_TOOLBAR_NAV_ICON_MIRRORING_IN_RTL, true); } - /** Sets button type face with partner overlay if exists */ + /** + * Sets button type face with partner overlay if exists + */ private void setButtonTypeFace(TextView button) { String fontFamily = mPartnerConfigHelper.getString( getContext(), @@ -828,7 +849,9 @@ class CarSetupWizardBaseLayout extends LinearLayout implements CarSetupWizardLay button.setTypeface(typeface); } - /** Sets button radius using partner overlay if exists */ + /** + * Sets button radius using partner overlay if exists + */ private void setButtonRadius(Button button) { float radius = mPartnerConfigHelper.getDimension( getContext(), diff --git a/library/main/tests/robotests/src/com/android/car/setupwizardlib/CarSetupWizardCompatLayoutTest.java b/library/main/tests/robotests/src/com/android/car/setupwizardlib/CarSetupWizardCompatLayoutTest.java index c1cd106..9371947 100644 --- a/library/main/tests/robotests/src/com/android/car/setupwizardlib/CarSetupWizardCompatLayoutTest.java +++ b/library/main/tests/robotests/src/com/android/car/setupwizardlib/CarSetupWizardCompatLayoutTest.java @@ -24,6 +24,7 @@ import android.app.Activity; import android.content.res.ColorStateList; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.TextView; @@ -243,6 +244,38 @@ public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { } /** + * Test that any call to setToolbarTitle calls toolbar's setText when split-nav is enabled. + */ + @Test + public void testSetToolbarTitleWhenSplitNavEnabled() { + CarSetupWizardCompatLayout spyCarSetupWizardCompatLayout = + Mockito.spy(mCarSetupWizardCompatLayout); + TextView spyToolbar = Mockito.spy(mCarSetupWizardCompatLayout.getToolbarTitle()); + spyCarSetupWizardCompatLayout.setToolbarTitle(null); + + spyCarSetupWizardCompatLayout.setToolbarTitleText("test title"); + + Mockito.verify(spyToolbar, Mockito.never()).setText("test title"); + } + + /** + * Test that any call to setToolbarTitleStyle calls toolbar's setTextAppearance when split-nav + * is enabled. + */ + @Test + public void testSetToolbarStyleWhenSplitNavEnabled() { + @StyleRes int newStyle = R.style.TextAppearance_Car_Body2; + CarSetupWizardCompatLayout spyCarSetupWizardCompatLayout = + Mockito.spy(mCarSetupWizardCompatLayout); + TextView spyToolbar = Mockito.spy(mCarSetupWizardCompatLayout.getToolbarTitle()); + spyCarSetupWizardCompatLayout.setToolbarTitle(null); + + spyCarSetupWizardCompatLayout.setToolbarTitleStyle(newStyle); + + Mockito.verify(spyToolbar, Mockito.never()).setTextAppearance(newStyle); + } + + /** * Test that {@link CarSetupWizardCompatLayout#setPrimaryActionButtonVisible} does set the view * visible/not visible. */ @@ -477,6 +510,20 @@ public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { } @Test + public void testApplyUpdatedLocaleWhenSplitNavEnabled() { + CarSetupWizardCompatLayout spyCarSetupWizardCompatLayout = + Mockito.spy(mCarSetupWizardCompatLayout); + TextView spyToolbar = Mockito.spy(mCarSetupWizardCompatLayout.getToolbarTitle()); + spyCarSetupWizardCompatLayout.setToolbarTitle(null); + + spyCarSetupWizardCompatLayout.applyLocale(LOCALE_EN_US); + + Mockito.verify(spyToolbar, Mockito.never()).setTextLocale(LOCALE_EN_US); + Mockito.verify(spyToolbar, Mockito.never()) + .setLayoutDirection(TextUtils.getLayoutDirectionFromLocale(LOCALE_EN_US)); + } + + @Test public void testGetBackButton() { assertThat(mCarSetupWizardLayoutInterface.getPrimaryActionButton()).isEqualTo( mCarSetupWizardCompatLayout.findViewById(R.id.primary_toolbar_button)); @@ -515,8 +562,8 @@ public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { // Verify primary button background Button primary = layout.getPrimaryActionButton(); Drawable expected = application.getResources().getDrawable(R.drawable.button_ripple_bg); - assertThat(getDrawbleDefaultColor(primary.getBackground())) - .isEqualTo(getDrawbleDefaultColor(expected)); + assertThat(getDrawableDefaultColor(primary.getBackground())) + .isEqualTo(getDrawableDefaultColor(expected)); // Verify primary button text size assertThat(primary.getTextSize()) @@ -572,8 +619,8 @@ public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { PartnerConfig.CONFIG_TOOLBAR_SECONDARY_BUTTON_BG_COLOR); Drawable expected = application.getResources().getDrawable(R.drawable.button_ripple_bg); - assertThat(getDrawbleDefaultColor(secondary.getBackground())) - .isEqualTo(getDrawbleDefaultColor(expected)); + assertThat(getDrawableDefaultColor(secondary.getBackground())) + .isEqualTo(getDrawableDefaultColor(expected)); } @Test @@ -637,7 +684,7 @@ public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { return activity.findViewById(R.id.car_setup_wizard_layout); } - private @ColorRes int getDrawbleDefaultColor(Drawable drawable) { + private @ColorRes int getDrawableDefaultColor(Drawable drawable) { Drawable.ConstantState state = drawable.getConstantState(); ColorStateList colorStateList = ReflectionHelpers.getField(state, "mColor"); return colorStateList.getDefaultColor(); |