[HomepagePromo] Add three layout variations

Adding compact and slim variations to the homepage promo;
Add feature flag to control the three variations.

Bug: 1068831
Change-Id: I236e23a5d8a8bf18e0590da8c482f25164e28891
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2168652
Commit-Queue: Wenyu Fu <[email protected]>
Reviewed-by: Theresa  <[email protected]>
Cr-Commit-Position: refs/heads/master@{#764517}
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 08f3919..aa95ab2 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1038,6 +1038,7 @@
   "java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoController.java",
   "java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoSnackbarController.java",
   "java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoUtils.java",
+  "java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoVariationManager.java",
   "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxChipDelegate.java",
   "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxContainerView.java",
   "java/src/org/chromium/chrome/browser/ntp/search/SearchBoxCoordinator.java",
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
index ad7fccc..afe8623 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
@@ -340,9 +340,12 @@
 
         // Mediator should be created before any Stream changes.
         mMediator = new FeedSurfaceMediator(this, snapScrollHelper, mPageNavigationDelegate);
-        mHomepagePromoController =
-                new HomepagePromoController(mActivity, mSnackbarManager, mTracker, mMediator);
-        mMediator.onHomepagePromoStateChange();
+
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.HOMEPAGE_PROMO_CARD)) {
+            mHomepagePromoController =
+                    new HomepagePromoController(mActivity, mSnackbarManager, mTracker, mMediator);
+            mMediator.onHomepagePromoStateChange();
+        }
 
         // Native should already have been loaded because of FeedSurfaceMediator.
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.INTEREST_FEED_V2)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoController.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoController.java
index 701f5fd..1856772 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoController.java
@@ -137,12 +137,14 @@
                                 r.getString(R.string.homepage_promo_primary_button))
                         .with(PromoCardProperties.PRIMARY_BUTTON_CALLBACK,
                                 (v) -> onPrimaryButtonClicked())
-                        .with(PromoCardProperties.SECONDARY_BUTTON_VISIBLE, false)
+                        .with(PromoCardProperties.HAS_SECONDARY_BUTTON, false)
+                        .with(PromoCardProperties.HAS_CLOSE_BUTTON, true)
                         .with(PromoCardProperties.CLOSE_BUTTON_CALLBACK, (v) -> dismissPromo())
                         .build();
 
-        mPromoCoordinator = new PromoCardCoordinator(
-                mContext, mModel, FeatureConstants.HOMEPAGE_PROMO_CARD_FEATURE);
+        mPromoCoordinator = new PromoCardCoordinator(mContext, mModel,
+                FeatureConstants.HOMEPAGE_PROMO_CARD_FEATURE,
+                HomepagePromoVariationManager.getInstance().getLayoutVariation());
         mPromoCoordinator.getView().setId(R.id.homepage_promo);
 
         // Subscribe to homepage update only when view is created.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoVariationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoVariationManager.java
new file mode 100644
index 0000000..07275cb
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoVariationManager.java
@@ -0,0 +1,67 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ntp.cards.promo;
+
+import androidx.annotation.StringDef;
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.components.browser_ui.widget.promo.PromoCardCoordinator.LayoutStyle;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Manager class that controls the experiment / layout variation for the homepage promo.
+ */
+public class HomepagePromoVariationManager {
+    @StringDef({Variations.NONE, Variations.LARGE, Variations.COMPACT, Variations.SLIM})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface Variations {
+        String NONE = "";
+        String LARGE = "Large";
+        String COMPACT = "Compact";
+        String SLIM = "Slim";
+    }
+
+    private static HomepagePromoVariationManager sInstance;
+
+    /**
+     * @return Singleton instance for {@link HomepagePromoVariationManager}.
+     */
+    public static HomepagePromoVariationManager getInstance() {
+        if (sInstance == null) {
+            sInstance = new HomepagePromoVariationManager();
+        }
+        return sInstance;
+    }
+
+    @VisibleForTesting
+    public static void setInstanceForTesting(HomepagePromoVariationManager mock) {
+        sInstance = mock;
+    }
+
+    /**
+     * Get the {@link LayoutStyle} used for
+     * {@link org.chromium.components.browser_ui.widget.promo.PromoCardCoordinator}.
+     */
+    @LayoutStyle
+    public int getLayoutVariation() {
+        String variation = ChromeFeatureList.getFieldTrialParamByFeature(
+                ChromeFeatureList.HOMEPAGE_PROMO_CARD, "promo-card-variation");
+
+        if (variation.equals(Variations.LARGE)) {
+            return LayoutStyle.LARGE;
+        }
+        if (variation.equals(Variations.COMPACT)) {
+            return LayoutStyle.COMPACT;
+        }
+        if (variation.equals(Variations.SLIM)) {
+            return LayoutStyle.SLIM;
+        }
+        // TODO(wenyufu): change the default style to compact after making adjustment to large
+        return LayoutStyle.LARGE;
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoTest.java
index afbaeec2..46b030a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/cards/promo/HomepagePromoTest.java
@@ -27,6 +27,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
@@ -35,6 +36,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.homepage.HomepageManager;
 import org.chromium.chrome.browser.homepage.HomepageTestRule;
@@ -47,6 +49,8 @@
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.feature_engagement.FeatureConstants;
 import org.chromium.components.feature_engagement.Tracker;
@@ -57,6 +61,7 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@EnableFeatures(ChromeFeatureList.HOMEPAGE_PROMO_CARD)
 public class HomepagePromoTest {
     public static final String PARTNER_HOMEPAGE_URL = "http://127.0.0.1:8000/foo.html";
     public static final String CUSTOM_TEST_URL = "http://127.0.0.1:8000/bar.html";
@@ -73,6 +78,8 @@
             new BasePartnerBrowserCustomizationIntegrationTestRule();
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
+    @Rule
+    public TestRule mProcessor = new Features.InstrumentationProcessor();
 
     @Mock
     private Tracker mTracker;
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 30f5b92..7494007 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1469,6 +1469,23 @@
          base::size(kAutofillUseMobileLabelDisambiguationShowOne), nullptr}};
 #endif  // defined(OS_ANDROID)
 
+#if defined(OS_ANDROID)
+const FeatureEntry::FeatureParam kHomepagePromoCardLarge[] = {
+    {"promo-card-variation", "Large"}};
+const FeatureEntry::FeatureParam kHomepagePromoCardCompact[] = {
+    {"promo-card-variation", "Compact"}};
+const FeatureEntry::FeatureParam kHomepagePromoCardSlim[] = {
+    {"promo-card-variation", "Slim"}};
+
+const FeatureEntry::FeatureVariation kHomepagePromoCardVariations[] = {
+    {"Large", kHomepagePromoCardLarge, base::size(kHomepagePromoCardLarge),
+     nullptr},
+    {"Compact", kHomepagePromoCardCompact,
+     base::size(kHomepagePromoCardCompact), nullptr},
+    {"Slim", kHomepagePromoCardSlim, base::size(kHomepagePromoCardSlim),
+     nullptr}};
+#endif  // defined(OS_ANDROID)
+
 const FeatureEntry::FeatureParam kLazyFrameLoadingAutomatic[] = {
     {"automatic-lazy-load-frames-enabled", "true"},
     {"restrict-lazy-load-frames-to-data-saver-only", "false"},
@@ -5194,6 +5211,11 @@
      flag_descriptions::kHomepageSettingsUIConversionName,
      flag_descriptions::kHomepageSettingsUIConversionDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kHomepageSettingsUIConversion)},
+    {"homepage-promo-card", flag_descriptions::kHomepagePromoCardName,
+     flag_descriptions::kHomepagePromoCardDescription, kOsAndroid,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kHomepagePromoCard,
+                                    kHomepagePromoCardVariations,
+                                    "HomepagePromoCard")},
 #endif  // defined(OS_ANDROID)
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 643572c..4780b8f 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2638,6 +2638,11 @@
     "expiry_milestone": 90
   },
   {
+    "name": "homepage-promo-card",
+    "owners": [ "wenyufu", "[email protected]" ],
+    "expiry_milestone": 90
+  },
+  {
     "name": "homepage-settings-ui-conversion",
     "owners": [ "wenyufu", "[email protected]" ],
     "expiry_milestone": 84
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 9148fcf..64d037d 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2443,6 +2443,12 @@
     "Enable enterprice policy HomepageLocation, a rule of configure the home "
     "page URL";
 
+const char kHomepagePromoCardName[] =
+    "Enable homepage promo card on the New Tab Page";
+const char kHomepagePromoCardDescription[] =
+    "Enable homepage promo card that will be shown to users with partner "
+    "configured homepage.";
+
 const char kHomepageSettingsUIConversionName[] =
     "Enable new homepage setting UI";
 const char kHomepageSettingsUIConversionDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 587a20d4..2aa1cdc 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1422,6 +1422,9 @@
 extern const char kHomepageLocationName[];
 extern const char kHomepageLocationDescription[];
 
+extern const char kHomepagePromoCardName[];
+extern const char kHomepagePromoCardDescription[];
+
 extern const char kHomepageSettingsUIConversionName[];
 extern const char kHomepageSettingsUIConversionDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 8b568ed4..c5ac40f 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -153,6 +153,7 @@
     &kFocusOmniboxInIncognitoTabIntents,
     &kHandleMediaIntents,
     &kHomepageLocation,
+    &kHomepagePromoCard,
     &kHomepageSettingsUIConversion,
     &kHorizontalTabSwitcherAndroid,
     &kImmersiveUiMode,
@@ -449,6 +450,9 @@
 const base::Feature kHomepageLocation{"HomepageLocationPolicy",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kHomepagePromoCard{"HomepagePromoCard",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kHomepageSettingsUIConversion{
     "HomepageSettingsUIConversion", base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 3635420..b311707 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -72,6 +72,7 @@
 extern const base::Feature kFocusOmniboxInIncognitoTabIntents;
 extern const base::Feature kHandleMediaIntents;
 extern const base::Feature kHomepageLocation;
+extern const base::Feature kHomepagePromoCard;
 extern const base::Feature kHomepageSettingsUIConversion;
 extern const base::Feature kHorizontalTabSwitcherAndroid;
 extern const base::Feature kImmersiveUiMode;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 6badf49..e101d88 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -281,6 +281,7 @@
     public static final String GRANT_NOTIFICATIONS_TO_DSE = "GrantNotificationsToDSE";
     public static final String HANDLE_MEDIA_INTENTS = "HandleMediaIntents";
     public static final String HOMEPAGE_LOCATION_POLICY = "HomepageLocationPolicy";
+    public static final String HOMEPAGE_PROMO_CARD = "HomepagePromoCard";
     public static final String HOMEPAGE_SETTINGS_UI_CONVERSION = "HomepageSettingsUIConversion";
     public static final String HORIZONTAL_TAB_SWITCHER_ANDROID = "HorizontalTabSwitcherAndroid";
     public static final String IMMERSIVE_UI_MODE = "ImmersiveUiMode";
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_compact.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_compact.Nexus_5X-23.png.sha1
new file mode 100644
index 0000000..2f4fd92
--- /dev/null
+++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_compact.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@
+dd41ea5cc4842cafb577e34017ab4d7386845b0b
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_compact_stack.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_compact_stack.Nexus_5X-23.png.sha1
new file mode 100644
index 0000000..97382c91
--- /dev/null
+++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_compact_stack.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@
+46bcc5c9acb59ea7f7fc494ec8e0400a69c24410
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_slim.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_slim.Nexus_5X-23.png.sha1
new file mode 100644
index 0000000..229e99d
--- /dev/null
+++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_slim.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@
+32127df4276831a93690e14b46e99f4b6bbdff66
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_compact.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_compact.Nexus_5X-23.png.sha1
new file mode 100644
index 0000000..1504868
--- /dev/null
+++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_compact.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@
+788ebf9e300327d45f185279c40ef0d4f624de09
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_compact_stack.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_compact_stack.Nexus_5X-23.png.sha1
new file mode 100644
index 0000000..fcbdf75
--- /dev/null
+++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_compact_stack.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@
+2b4d8a8081bdefdaba594343f4a54a620a4f5c09
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_slim.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_slim.Nexus_5X-23.png.sha1
new file mode 100644
index 0000000..4ed57cb
--- /dev/null
+++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_slim.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@
+3d80b3f9eda632d3f3942d819acd4adc31943088
\ No newline at end of file