diff options
6 files changed, 110 insertions, 9 deletions
diff --git a/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java b/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java index 526a5ca..e36980c 100644 --- a/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java +++ b/library/main/src/com/android/car/setupwizardlib/CarSetupWizardBaseLayout.java @@ -60,6 +60,8 @@ import java.util.Objects; class CarSetupWizardBaseLayout extends LinearLayout { private static final String TAG = CarSetupWizardBaseLayout.class.getSimpleName(); private static final int INVALID_COLOR = 0; + // For mirroring an image + private static final float IMAGE_MIRROR_ROTATION = 180.0f; private View mBackButton; private View mTitleBar; @@ -164,15 +166,22 @@ class CarSetupWizardBaseLayout extends LinearLayout { } LayoutInflater inflater = LayoutInflater.from(getContext()); - inflater.inflate(R.layout.car_setup_wizard_layout, this); + View view = inflater.inflate(R.layout.car_setup_wizard_layout, this); + // The layout will not be mirrored in RTL + view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR); - // Set the back button visibility based on the custom attribute. setBackButton(findViewById(R.id.back_button)); Drawable drawable = mPartnerConfigHelper.getDrawable( getContext(), PartnerConfig.CONFIG_TOOLBAR_BUTTON_ICON_BACK); if (drawable != null) { ((ImageView) mBackButton).setImageDrawable(drawable); } + + if (shouldMirrorNavIcons()) { + Log.v(TAG, "Mirroring navigation icons"); + mBackButton.setRotation(IMAGE_MIRROR_ROTATION); + } + setBackButtonVisible(showBackButton); // Se the title bar. @@ -520,7 +529,6 @@ class CarSetupWizardBaseLayout extends LinearLayout { return; } int direction = TextUtils.getLayoutDirectionFromLocale(locale); - setLayoutDirection(direction); mToolbarTitle.setTextLocale(locale); mToolbarTitle.setLayoutDirection(direction); @@ -625,6 +633,15 @@ class CarSetupWizardBaseLayout extends LinearLayout { } } + @VisibleForTesting + boolean shouldMirrorNavIcons() { + return getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL + && mPartnerConfigHelper.getBoolean( + getContext(), + PartnerConfig.CONFIG_TOOLBAR_NAV_ICON_MIRRORING_IN_RTL, + true); + } + /** Sets button type face with partner overlay if exists */ private void setButtonTypeFace(TextView button) { String fontFamily = mPartnerConfigHelper.getString( diff --git a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java index 00c0ea3..27ea753 100644 --- a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java +++ b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java @@ -28,6 +28,9 @@ public enum PartnerConfig { CONFIG_TOOLBAR_BUTTON_ICON_BACK( PartnerConfigKey.KEY_TOOLBAR_BUTTON_ICON_BACK, ResourceType.DRAWABLE), + CONFIG_TOOLBAR_NAV_ICON_MIRRORING_IN_RTL( + PartnerConfigKey.KEY_TOOLBAR_NAV_BUTTON_MIRRORING_IN_RTL, ResourceType.BOOLEAN), + CONFIG_TOOLBAR_BUTTON_FONT_FAMILY( PartnerConfigKey.KEY_TOOLBAR_BUTTON_FONT_FAMILY, ResourceType.STRING), diff --git a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java index 32caceb..8556fa7 100644 --- a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java +++ b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java @@ -26,6 +26,7 @@ import java.lang.annotation.RetentionPolicy; PartnerConfigKey.KEY_IMMERSIVE_MODE, PartnerConfigKey.KEY_TOOLBAR_BG_COLOR, PartnerConfigKey.KEY_TOOLBAR_BUTTON_ICON_BACK, + PartnerConfigKey.KEY_TOOLBAR_NAV_BUTTON_MIRRORING_IN_RTL, PartnerConfigKey.KEY_TOOLBAR_BUTTON_FONT_FAMILY, PartnerConfigKey.KEY_TOOLBAR_BUTTON_PADDING_HORIZONTAL, PartnerConfigKey.KEY_TOOLBAR_BUTTON_PADDING_VERTICAL, @@ -54,6 +55,9 @@ public @interface PartnerConfigKey { String KEY_TOOLBAR_BUTTON_ICON_BACK = "suw_compat_toolbar_button_icon_back"; + String KEY_TOOLBAR_NAV_BUTTON_MIRRORING_IN_RTL = + "suw_compat_toolbar_nav_button_mirroring_in_rtl"; + String KEY_TOOLBAR_BUTTON_FONT_FAMILY = "suw_compat_toolbar_button_font_family"; String KEY_TOOLBAR_BUTTON_TEXT_SIZE = "suw_compat_toolbar_button_text_size"; diff --git a/library/main/src/com/android/car/setupwizardlib/util/CarDrivingStateMonitor.java b/library/main/src/com/android/car/setupwizardlib/util/CarDrivingStateMonitor.java index ee6c8db..0cb667b 100644 --- a/library/main/src/com/android/car/setupwizardlib/util/CarDrivingStateMonitor.java +++ b/library/main/src/com/android/car/setupwizardlib/util/CarDrivingStateMonitor.java @@ -108,14 +108,14 @@ public class CarDrivingStateMonitor implements * Starts the monitor listening to driving state changes. */ public synchronized void startMonitor() { - if (isVerboseLoggable()) { - Log.v(TAG, "Starting monitor"); - } mMonitorStartedCount++; if (mMonitorStartedCount == 0) { + Log.w(TAG, "MonitorStartedCount was negative"); return; } mHandler.removeCallbacks(mDisconnectRunnable); + Log.i(TAG, String.format( + "Starting monitor, MonitorStartedCount = %d", mMonitorStartedCount)); if (mCar != null) { if (mCar.isConnected()) { try { @@ -189,12 +189,13 @@ public class CarDrivingStateMonitor implements } private void disconnectCarMonitor() { - if (isVerboseLoggable()) { - Log.v(TAG, "Timeout finished, disconnecting Car Monitor"); - } if (mMonitorStartedCount > 0) { + if (isVerboseLoggable()) { + Log.v(TAG, "MonitorStartedCount > 0, do nothing"); + } return; } + Log.i(TAG, "Disconnecting Car Monitor"); try { if (mRestrictionsManager != null) { mRestrictionsManager.unregisterListener(); 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 6ec0c28..cd62072 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 @@ -37,6 +37,7 @@ import com.android.car.setupwizardlib.partner.PartnerConfig; import com.android.car.setupwizardlib.partner.ResourceEntry; import com.android.car.setupwizardlib.robolectric.BaseRobolectricTest; import com.android.car.setupwizardlib.robolectric.TestHelper; +import com.android.car.setupwizardlib.shadows.ShadowConfiguration; import org.junit.Before; import org.junit.Test; @@ -45,6 +46,7 @@ import org.mockito.Mockito; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.Shadows; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowTextView; import org.robolectric.util.ReflectionHelpers; @@ -56,6 +58,7 @@ import java.util.Locale; * Tests for the CarSetupWizardCompatLayout */ @RunWith(RobolectricTestRunner.class) +@Config(shadows = ShadowConfiguration.class) public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { private static final Locale LOCALE_EN_US = new Locale("en", "US"); // Hebrew locale can be used to test RTL. @@ -532,6 +535,28 @@ public class CarSetupWizardCompatLayoutTest extends BaseRobolectricTest { assertThat(secondaryButton.getTextSize()).isWithin(TOLERANCE).of(EXCEPTED_TEXT_SIZE); } + @Test + public void test_shouldNotMirrorNavIcons_inLtr() { + Activity activity = Robolectric.buildActivity(CarSetupWizardLayoutTestActivity.class) + .create() + .get(); + + CarSetupWizardCompatLayout layout = activity.findViewById(R.id.car_setup_wizard_layout); + assertThat(layout.shouldMirrorNavIcons()).isFalse(); + } + + @Test + public void test_shouldMirrorNavIcons_inRtl() { + application.getResources().getConfiguration().setLocale(LOCALE_IW_IL); + + Activity activity = Robolectric.buildActivity(CarSetupWizardLayoutTestActivity.class) + .create() + .get(); + + CarSetupWizardCompatLayout layout = activity.findViewById(R.id.car_setup_wizard_layout); + assertThat(layout.shouldMirrorNavIcons()).isTrue(); + } + private void setupFakeContentProvider() { FakeOverrideContentProvider.installDefaultProvider(); } diff --git a/library/main/tests/robotests/src/com/android/car/setupwizardlib/shadows/ShadowConfiguration.java b/library/main/tests/robotests/src/com/android/car/setupwizardlib/shadows/ShadowConfiguration.java new file mode 100644 index 0000000..39057be --- /dev/null +++ b/library/main/tests/robotests/src/com/android/car/setupwizardlib/shadows/ShadowConfiguration.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.car.setupwizardlib.shadows; + +import android.content.res.Configuration; +import android.view.View; + +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; + +import java.util.Locale; + +/** + * Shadow class for {@link Configuration}. + */ +@Implements(Configuration.class) +public class ShadowConfiguration { + + private static final Locale HEBREW_LOCALE = new Locale("iw", "IL"); + private int mLayoutDir = View.LAYOUT_DIRECTION_LTR; + + /** + * Set the layout direction from a {@link Locale}. + */ + @Implementation + public void setLayoutDirection(Locale locale) { + if (locale.getLanguage().equals(HEBREW_LOCALE.getLanguage())) { + mLayoutDir = View.LAYOUT_DIRECTION_RTL; + } + } + + /** Returs the layout direction */ + @Implementation + public int getLayoutDirection() { + return mLayoutDir; + } +} |