DO NOT MERGE - Support RTL in Toolbar

FR: http://b/169277517
Bug: 169277517,170675319
Test: CarSetupWizardLibRoboTests
Change-Id: I7f31cb76b5165a44fd0d2593c2f4f9ab5eeac26f
(cherry picked from commit 04ea5697503248165dd3fa1029c07602386f9b06)
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 @@
 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 @@
         }
 
         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 @@
             return;
         }
         int direction = TextUtils.getLayoutDirectionFromLocale(locale);
-        setLayoutDirection(direction);
 
         mToolbarTitle.setTextLocale(locale);
         mToolbarTitle.setLayoutDirection(direction);
@@ -625,6 +633,15 @@
         }
     }
 
+    @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 @@
     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 @@
         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 @@
 
     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 @@
      * 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 @@
     }
 
     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.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.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 @@
  * 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 @@
         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;
+    }
+}