[feature_notification_guide] Initial directory setup

This CL sets up the initial directory setup for feature notification
guide which includes public, internal, test and factory targets and top
level service. Java targets will be set up in a later CL.

Bug: 1275371
Change-Id: Iadf44ea81570225c932db2497cfee4f7ef0fe1cd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3309600
Reviewed-by: Henrique Nakashima <[email protected]>
Reviewed-by: Xing Liu <[email protected]>
Reviewed-by: David Trainor <[email protected]>
Commit-Queue: Shakti Sahu <[email protected]>
Cr-Commit-Position: refs/heads/main@{#947753}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5dd3db3b..36c98c81 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1966,6 +1966,8 @@
     "//chrome/browser/browsing_data:constants",
     "//chrome/browser/commerce:feature_list",
     "//chrome/browser/devtools",
+    "//chrome/browser/feature_guide/notifications:factory",
+    "//chrome/browser/feature_guide/notifications:public",
     "//chrome/browser/image_decoder",
     "//chrome/browser/media:media_engagement_preload_proto",
     "//chrome/browser/media:mojo_bindings",
diff --git a/chrome/browser/feature_guide/notifications/BUILD.gn b/chrome/browser/feature_guide/notifications/BUILD.gn
new file mode 100644
index 0000000..8c8c9b0
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/BUILD.gn
@@ -0,0 +1,41 @@
+# Copyright 2021 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.
+
+if (is_android) {
+  import("//build/config/android/config.gni")
+  import("//build/config/android/rules.gni")
+  import("//chrome/android/features/android_library_factory_tmpl.gni")
+}
+
+source_set("public") {
+  sources = [
+    "feature_notification_guide_service.cc",
+    "feature_notification_guide_service.h",
+  ]
+
+  deps = []
+
+  public_deps = [
+    "//base",
+    "//components/keyed_service/core",
+  ]
+}
+
+source_set("factory") {
+  sources = [
+    "feature_notification_guide_service_factory.cc",
+    "feature_notification_guide_service_factory.h",
+  ]
+
+  deps = [
+    ":public",
+    "internal:internal",
+  ]
+}
+
+group("unit_tests") {
+  testonly = true
+
+  deps = [ "internal:unit_tests" ]
+}
diff --git a/chrome/browser/feature_guide/notifications/COMMON_METADATA b/chrome/browser/feature_guide/notifications/COMMON_METADATA
new file mode 100644
index 0000000..27cf754
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/COMMON_METADATA
@@ -0,0 +1,5 @@
+monorail: {
+  component: "Upboarding"
+}
+team_email: "[email protected]"
+os: ANDROID
diff --git a/chrome/browser/feature_guide/notifications/DEPS b/chrome/browser/feature_guide/notifications/DEPS
new file mode 100644
index 0000000..a82819d6
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+components/keyed_service",
+]
diff --git a/chrome/browser/feature_guide/notifications/DIR_METADATA b/chrome/browser/feature_guide/notifications/DIR_METADATA
new file mode 100644
index 0000000..d91ed999
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//chrome/browser/feature_guide/notifications/COMMON_METADATA"
diff --git a/chrome/browser/feature_guide/notifications/OWNERS b/chrome/browser/feature_guide/notifications/OWNERS
new file mode 100644
index 0000000..ffc05827
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/OWNERS
@@ -0,0 +1 @@
[email protected]
diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc
new file mode 100644
index 0000000..a91f5e04
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.cc
@@ -0,0 +1,20 @@
+// 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.
+
+#include "chrome/browser/feature_guide/notifications/feature_notification_guide_service.h"
+
+#include "base/feature_list.h"
+
+namespace feature_guide {
+namespace features {
+
+const base::Feature kFeatureNotificationGuide{
+    "FeatureNotificationGuide", base::FEATURE_DISABLED_BY_DEFAULT};
+}  // namespace features
+
+FeatureNotificationGuideService::FeatureNotificationGuideService() = default;
+
+FeatureNotificationGuideService::~FeatureNotificationGuideService() = default;
+
+}  // namespace feature_guide
diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h
new file mode 100644
index 0000000..79b7186
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service.h
@@ -0,0 +1,34 @@
+// Copyright 2021 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.
+
+#ifndef CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_FEATURE_NOTIFICATION_GUIDE_SERVICE_H_
+#define CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_FEATURE_NOTIFICATION_GUIDE_SERVICE_H_
+
+#include "base/feature_list.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace feature_guide {
+namespace features {
+
+// Main feature flag for the feature notification guide feature.
+extern const base::Feature kFeatureNotificationGuide;
+
+}  // namespace features
+
+// The central class responsible for managing feature notification guide in
+// chrome.
+class FeatureNotificationGuideService : public KeyedService {
+ public:
+  FeatureNotificationGuideService();
+  ~FeatureNotificationGuideService() override;
+
+  FeatureNotificationGuideService(const FeatureNotificationGuideService&) =
+      delete;
+  FeatureNotificationGuideService& operator=(
+      const FeatureNotificationGuideService&) = delete;
+};
+
+}  // namespace feature_guide
+
+#endif  // CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_FEATURE_NOTIFICATION_GUIDE_SERVICE_H_
diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc b/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc
new file mode 100644
index 0000000..ecc8b799
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.cc
@@ -0,0 +1,38 @@
+// Copyright 2021 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.
+
+#include "chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.h"
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/feature_guide/notifications/feature_notification_guide_service.h"
+#include "chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h"
+#include "components/keyed_service/core/simple_dependency_manager.h"
+
+namespace feature_guide {
+
+// static
+FeatureNotificationGuideServiceFactory*
+FeatureNotificationGuideServiceFactory::GetInstance() {
+  return base::Singleton<FeatureNotificationGuideServiceFactory>::get();
+}
+
+// static
+FeatureNotificationGuideService*
+FeatureNotificationGuideServiceFactory::GetForKey(SimpleFactoryKey* key) {
+  return static_cast<FeatureNotificationGuideService*>(
+      GetInstance()->GetServiceForKey(key, /*create=*/true));
+}
+
+FeatureNotificationGuideServiceFactory::FeatureNotificationGuideServiceFactory()
+    : SimpleKeyedServiceFactory("FeatureNotificationGuideService",
+                                SimpleDependencyManager::GetInstance()) {}
+
+std::unique_ptr<KeyedService>
+FeatureNotificationGuideServiceFactory::BuildServiceInstanceFor(
+    SimpleFactoryKey* key) const {
+  auto service = std::make_unique<FeatureNotificationGuideServiceImpl>();
+  return std::move(service);
+}
+
+}  // namespace feature_guide
diff --git a/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.h b/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.h
new file mode 100644
index 0000000..e6c7f5a
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/feature_notification_guide_service_factory.h
@@ -0,0 +1,41 @@
+// Copyright 2021 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.
+
+#ifndef CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_FEATURE_NOTIFICATION_GUIDE_SERVICE_FACTORY_H_
+#define CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_FEATURE_NOTIFICATION_GUIDE_SERVICE_FACTORY_H_
+
+#include <memory>
+
+#include "components/keyed_service/core/simple_factory_key.h"
+#include "components/keyed_service/core/simple_keyed_service_factory.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}  // namespace base
+
+namespace feature_guide {
+class FeatureNotificationGuideService;
+
+// A factory to create one unique FeatureNotificationGuideService.
+class FeatureNotificationGuideServiceFactory
+    : public SimpleKeyedServiceFactory {
+ public:
+  static FeatureNotificationGuideServiceFactory* GetInstance();
+  static FeatureNotificationGuideService* GetForKey(SimpleFactoryKey* key);
+
+ private:
+  friend struct base::DefaultSingletonTraits<
+      FeatureNotificationGuideServiceFactory>;
+
+  FeatureNotificationGuideServiceFactory();
+  ~FeatureNotificationGuideServiceFactory() override = default;
+
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      SimpleFactoryKey* key) const override;
+};
+
+}  // namespace feature_guide
+
+#endif  // CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_FEATURE_NOTIFICATION_GUIDE_SERVICE_FACTORY_H_
diff --git a/chrome/browser/feature_guide/notifications/internal/BUILD.gn b/chrome/browser/feature_guide/notifications/internal/BUILD.gn
new file mode 100644
index 0000000..f48e0ab
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/internal/BUILD.gn
@@ -0,0 +1,34 @@
+# Copyright 2021 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.
+
+if (is_android) {
+  import("//build/config/android/config.gni")
+  import("//build/config/android/rules.gni")
+}
+
+source_set("internal") {
+  sources = [
+    "feature_notification_guide_service_impl.cc",
+    "feature_notification_guide_service_impl.h",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome/browser/feature_guide/notifications:public",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+
+  sources = [ "feature_notification_guide_service_impl_unittest.cc" ]
+
+  deps = [
+    ":internal",
+    "//base",
+    "//base/test:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc
new file mode 100644
index 0000000..f0e77e2
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.cc
@@ -0,0 +1,15 @@
+// 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.
+
+#include "chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h"
+
+namespace feature_guide {
+
+FeatureNotificationGuideServiceImpl::FeatureNotificationGuideServiceImpl() =
+    default;
+
+FeatureNotificationGuideServiceImpl::~FeatureNotificationGuideServiceImpl() =
+    default;
+
+}  // namespace feature_guide
diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h
new file mode 100644
index 0000000..abcbea8
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h
@@ -0,0 +1,26 @@
+// Copyright 2021 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.
+
+#ifndef CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_INTERNAL_FEATURE_NOTIFICATION_GUIDE_SERVICE_IMPL_H_
+#define CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_INTERNAL_FEATURE_NOTIFICATION_GUIDE_SERVICE_IMPL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/feature_guide/notifications/feature_notification_guide_service.h"
+
+namespace feature_guide {
+
+class FeatureNotificationGuideServiceImpl
+    : public FeatureNotificationGuideService {
+ public:
+  FeatureNotificationGuideServiceImpl();
+  ~FeatureNotificationGuideServiceImpl() override;
+
+ private:
+  base::WeakPtrFactory<FeatureNotificationGuideServiceImpl> weak_ptr_factory_{
+      this};
+};
+
+}  // namespace feature_guide
+
+#endif  // CHROME_BROWSER_FEATURE_GUIDE_NOTIFICATIONS_INTERNAL_FEATURE_NOTIFICATION_GUIDE_SERVICE_IMPL_H_
diff --git a/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc
new file mode 100644
index 0000000..d49276f
--- /dev/null
+++ b/chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl_unittest.cc
@@ -0,0 +1,23 @@
+// Copyright 2021 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.
+
+#include "chrome/browser/feature_guide/notifications/internal/feature_notification_guide_service_impl.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace feature_guide {
+namespace {
+
+class FeatureNotificationGuideServiceImplTest : public testing::Test {
+ public:
+  FeatureNotificationGuideServiceImplTest() = default;
+  ~FeatureNotificationGuideServiceImplTest() override = default;
+};
+
+TEST_F(FeatureNotificationGuideServiceImplTest, Initialize) {}
+
+}  // namespace
+
+}  // namespace feature_guide