Commit 74966885 authored by Shakti Sahu's avatar Shakti Sahu Committed by Chromium LUCI CQ

Video Tutorials : Fixed summary card not getting shown

There was a bug due to which the tutorial manager didn't return the
summary card correctly. This CL fixes that.

Bug: 1166765
Change-Id: I0775f827f5ab96dd209b85c482ce33ef86ff70e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2629461
Auto-Submit: Shakti Sahu <shaktisahu@chromium.org>
Reviewed-by: default avatarMin Qin <qinmin@chromium.org>
Commit-Queue: Shakti Sahu <shaktisahu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#843865}
parent c08b4303
...@@ -15,11 +15,16 @@ namespace video_tutorials { ...@@ -15,11 +15,16 @@ namespace video_tutorials {
class TutorialManager { class TutorialManager {
public: public:
using SuccessCallback = base::OnceCallback<void(bool)>; using SuccessCallback = base::OnceCallback<void(bool)>;
using GetTutorialsCallback = base::OnceCallback<void(std::vector<Tutorial>)>; using MultipleItemCallback = base::OnceCallback<void(std::vector<Tutorial>)>;
using SingleItemCallback = base::OnceCallback<void(base::Optional<Tutorial>)>;
// Loads video tutorials. Must be called again if the locale was changed by // Loads video tutorials. Must be called again if the locale was changed by
// the user. // the user.
virtual void GetTutorials(GetTutorialsCallback callback) = 0; virtual void GetTutorials(MultipleItemCallback callback) = 0;
// Called to retrieve the tutorial associated with |feature_type|.
virtual void GetTutorial(FeatureType feature_type,
SingleItemCallback callback) = 0;
// Returns a list of languages for which video tutorials are available. // Returns a list of languages for which video tutorials are available.
virtual const std::vector<std::string>& GetSupportedLanguages() = 0; virtual const std::vector<std::string>& GetSupportedLanguages() = 0;
......
...@@ -41,7 +41,7 @@ void TutorialManagerImpl::Initialize() { ...@@ -41,7 +41,7 @@ void TutorialManagerImpl::Initialize() {
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
void TutorialManagerImpl::GetTutorials(GetTutorialsCallback callback) { void TutorialManagerImpl::GetTutorials(MultipleItemCallback callback) {
if (!init_success_.has_value()) { if (!init_success_.has_value()) {
MaybeCacheApiCall(base::BindOnce(&TutorialManagerImpl::GetTutorials, MaybeCacheApiCall(base::BindOnce(&TutorialManagerImpl::GetTutorials,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
...@@ -69,6 +69,33 @@ void TutorialManagerImpl::GetTutorials(GetTutorialsCallback callback) { ...@@ -69,6 +69,33 @@ void TutorialManagerImpl::GetTutorials(GetTutorialsCallback callback) {
weak_ptr_factory_.GetWeakPtr(), std::move(callback))); weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
} }
void TutorialManagerImpl::GetTutorial(FeatureType feature_type,
SingleItemCallback callback) {
// Ensure that all the tutorials are already loaded.
GetTutorials(base::BindOnce(&TutorialManagerImpl::RunSingleItemCallback,
weak_ptr_factory_.GetWeakPtr(),
std::move(callback), feature_type));
}
void TutorialManagerImpl::RunSingleItemCallback(
SingleItemCallback callback,
FeatureType feature_type,
std::vector<Tutorial> tutorials_excluding_summary) {
if (!tutorial_group_.has_value()) {
std::move(callback).Run(base::nullopt);
return;
}
for (const Tutorial& tutorial : tutorial_group_->tutorials) {
if (tutorial.feature == feature_type) {
std::move(callback).Run(tutorial);
return;
}
}
std::move(callback).Run(base::nullopt);
}
const std::vector<std::string>& TutorialManagerImpl::GetSupportedLanguages() { const std::vector<std::string>& TutorialManagerImpl::GetSupportedLanguages() {
return supported_languages_; return supported_languages_;
} }
...@@ -113,7 +140,7 @@ void TutorialManagerImpl::OnInitialDataLoaded( ...@@ -113,7 +140,7 @@ void TutorialManagerImpl::OnInitialDataLoaded(
} }
void TutorialManagerImpl::OnTutorialsLoaded( void TutorialManagerImpl::OnTutorialsLoaded(
GetTutorialsCallback callback, MultipleItemCallback callback,
bool success, bool success,
std::unique_ptr<std::vector<TutorialGroup>> loaded_groups) { std::unique_ptr<std::vector<TutorialGroup>> loaded_groups) {
if (!success || !loaded_groups || loaded_groups->empty()) { if (!success || !loaded_groups || loaded_groups->empty()) {
......
...@@ -28,7 +28,9 @@ class TutorialManagerImpl : public TutorialManager { ...@@ -28,7 +28,9 @@ class TutorialManagerImpl : public TutorialManager {
private: private:
// TutorialManager implementation. // TutorialManager implementation.
void GetTutorials(GetTutorialsCallback callback) override; void GetTutorials(MultipleItemCallback callback) override;
void GetTutorial(FeatureType feature_type,
SingleItemCallback callback) override;
const std::vector<std::string>& GetSupportedLanguages() override; const std::vector<std::string>& GetSupportedLanguages() override;
base::Optional<std::string> GetPreferredLocale() override; base::Optional<std::string> GetPreferredLocale() override;
void SetPreferredLocale(const std::string& locale) override; void SetPreferredLocale(const std::string& locale) override;
...@@ -41,9 +43,12 @@ class TutorialManagerImpl : public TutorialManager { ...@@ -41,9 +43,12 @@ class TutorialManagerImpl : public TutorialManager {
std::unique_ptr<std::vector<TutorialGroup>> all_groups); std::unique_ptr<std::vector<TutorialGroup>> all_groups);
void MaybeCacheApiCall(base::OnceClosure api_call); void MaybeCacheApiCall(base::OnceClosure api_call);
void OnTutorialsLoaded( void OnTutorialsLoaded(
GetTutorialsCallback callback, MultipleItemCallback callback,
bool success, bool success,
std::unique_ptr<std::vector<TutorialGroup>> loaded_groups); std::unique_ptr<std::vector<TutorialGroup>> loaded_groups);
void RunSingleItemCallback(SingleItemCallback callback,
FeatureType feature_type,
std::vector<Tutorial> tutorials_excluding_summary);
std::unique_ptr<TutorialStore> store_; std::unique_ptr<TutorialStore> store_;
PrefService* prefs_; PrefService* prefs_;
......
...@@ -132,6 +132,21 @@ class TutorialManagerTest : public testing::Test { ...@@ -132,6 +132,21 @@ class TutorialManagerTest : public testing::Test {
std::move(closure).Run(); std::move(closure).Run();
} }
void GetTutorial(FeatureType feature_type) {
base::RunLoop loop;
manager()->GetTutorial(
feature_type,
base::BindOnce(&TutorialManagerTest::OnGetTutorial,
base::Unretained(this), loop.QuitClosure()));
loop.Run();
}
void OnGetTutorial(base::RepeatingClosure closure,
base::Optional<Tutorial> tutorial) {
last_get_tutorial_result_ = tutorial;
std::move(closure).Run();
}
void OnComplete(base::RepeatingClosure closure, bool success) { void OnComplete(base::RepeatingClosure closure, bool success) {
std::move(closure).Run(); std::move(closure).Run();
} }
...@@ -145,6 +160,9 @@ class TutorialManagerTest : public testing::Test { ...@@ -145,6 +160,9 @@ class TutorialManagerTest : public testing::Test {
TutorialManager* manager() { return manager_.get(); } TutorialManager* manager() { return manager_.get(); }
TestStore* tutorial_store() { return tutorial_store_; } TestStore* tutorial_store() { return tutorial_store_; }
std::vector<Tutorial> last_results() { return last_results_; } std::vector<Tutorial> last_results() { return last_results_; }
base::Optional<Tutorial> last_get_tutorial_result() {
return last_get_tutorial_result_;
}
private: private:
base::test::TaskEnvironment task_environment_; base::test::TaskEnvironment task_environment_;
...@@ -152,6 +170,7 @@ class TutorialManagerTest : public testing::Test { ...@@ -152,6 +170,7 @@ class TutorialManagerTest : public testing::Test {
std::unique_ptr<TutorialManager> manager_; std::unique_ptr<TutorialManager> manager_;
TestStore* tutorial_store_; TestStore* tutorial_store_;
std::vector<Tutorial> last_results_; std::vector<Tutorial> last_results_;
base::Optional<Tutorial> last_get_tutorial_result_;
}; };
TEST_F(TutorialManagerTest, InitAndGetTutorials) { TEST_F(TutorialManagerTest, InitAndGetTutorials) {
...@@ -167,6 +186,9 @@ TEST_F(TutorialManagerTest, InitAndGetTutorials) { ...@@ -167,6 +186,9 @@ TEST_F(TutorialManagerTest, InitAndGetTutorials) {
manager()->SetPreferredLocale("hi"); manager()->SetPreferredLocale("hi");
GetTutorials(); GetTutorials();
EXPECT_EQ(last_results().size(), 2u); EXPECT_EQ(last_results().size(), 2u);
GetTutorial(FeatureType::kSearch);
EXPECT_EQ(FeatureType::kSearch, last_get_tutorial_result()->feature);
} }
TEST_F(TutorialManagerTest, InitAndGetTutorialsWithSummary) { TEST_F(TutorialManagerTest, InitAndGetTutorialsWithSummary) {
...@@ -184,6 +206,27 @@ TEST_F(TutorialManagerTest, InitAndGetTutorialsWithSummary) { ...@@ -184,6 +206,27 @@ TEST_F(TutorialManagerTest, InitAndGetTutorialsWithSummary) {
EXPECT_EQ(last_results().size(), 2u); EXPECT_EQ(last_results().size(), 2u);
} }
TEST_F(TutorialManagerTest, GetSingleTutorialBeforeGetTutorialsCall) {
std::vector<FeatureType> features(
{FeatureType::kDownload, FeatureType::kSearch, FeatureType::kSummary});
auto groups = CreateSampleGroups({"hi", "kn"}, features);
auto tutorial_store = std::make_unique<StrictMock<TestStore>>();
tutorial_store->InitStoreData("hi", groups);
CreateTutorialManager(std::move(tutorial_store));
auto languages = manager()->GetSupportedLanguages();
EXPECT_EQ(languages.size(), 2u);
manager()->SetPreferredLocale("hi");
GetTutorial(FeatureType::kSummary);
EXPECT_TRUE(last_get_tutorial_result().has_value());
EXPECT_EQ(FeatureType::kSummary, last_get_tutorial_result()->feature);
GetTutorial(FeatureType::kSearch);
EXPECT_EQ(FeatureType::kSearch, last_get_tutorial_result()->feature);
GetTutorial(FeatureType::kVoiceSearch);
EXPECT_FALSE(last_get_tutorial_result().has_value());
}
TEST_F(TutorialManagerTest, SaveNewData) { TEST_F(TutorialManagerTest, SaveNewData) {
std::vector<FeatureType> features( std::vector<FeatureType> features(
{FeatureType::kDownload, FeatureType::kSearch, FeatureType::kSummary}); {FeatureType::kDownload, FeatureType::kSearch, FeatureType::kSummary});
......
...@@ -34,22 +34,7 @@ void TutorialServiceImpl::GetTutorials(MultipleItemCallback callback) { ...@@ -34,22 +34,7 @@ void TutorialServiceImpl::GetTutorials(MultipleItemCallback callback) {
void TutorialServiceImpl::GetTutorial(FeatureType feature_type, void TutorialServiceImpl::GetTutorial(FeatureType feature_type,
SingleItemCallback callback) { SingleItemCallback callback) {
tutorial_manager_->GetTutorials(base::BindOnce( tutorial_manager_->GetTutorial(feature_type, std::move(callback));
&TutorialServiceImpl::OnGetTutorials, weak_ptr_factory_.GetWeakPtr(),
std::move(callback), feature_type));
}
void TutorialServiceImpl::OnGetTutorials(SingleItemCallback callback,
FeatureType feature_type,
std::vector<Tutorial> tutorials) {
for (const Tutorial& tutorial : tutorials) {
if (tutorial.feature == feature_type) {
std::move(callback).Run(tutorial);
return;
}
}
std::move(callback).Run(base::nullopt);
} }
void TutorialServiceImpl::StartFetchIfNecessary() { void TutorialServiceImpl::StartFetchIfNecessary() {
......
...@@ -30,10 +30,6 @@ class TutorialServiceImpl : public VideoTutorialService { ...@@ -30,10 +30,6 @@ class TutorialServiceImpl : public VideoTutorialService {
void SetPreferredLocale(const std::string& locale) override; void SetPreferredLocale(const std::string& locale) override;
private: private:
void OnGetTutorials(SingleItemCallback callback,
FeatureType feature_type,
std::vector<Tutorial> tutorials);
// Called at service startup to determine if a network fetch is necessary // Called at service startup to determine if a network fetch is necessary
// based on the last fetch timestamp. // based on the last fetch timestamp.
void StartFetchIfNecessary(); void StartFetchIfNecessary();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment