camera_roll_view_unittest.cc 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/phonehub/camera_roll_view.h"
  5. #include "ash/components/phonehub/camera_roll_item.h"
  6. #include "ash/components/phonehub/fake_camera_roll_manager.h"
  7. #include "ash/components/phonehub/fake_user_action_recorder.h"
  8. #include "ash/system/phonehub/camera_roll_thumbnail.h"
  9. #include "ash/system/phonehub/phone_hub_metrics.h"
  10. #include "ash/test/ash_test_base.h"
  11. #include "camera_roll_view.h"
  12. #include "third_party/skia/include/core/SkBitmap.h"
  13. #include "ui/compositor/property_change_reason.h"
  14. #include "ui/gfx/image/image.h"
  15. #include "ui/views/controls/button/menu_button.h"
  16. #include "ui/views/view.h"
  17. namespace ash {
  18. class CameraRollViewForTest : public CameraRollView {
  19. public:
  20. CameraRollViewForTest(phonehub::CameraRollManager* camera_roll_manager,
  21. phonehub::UserActionRecorder* user_action_recorder)
  22. : CameraRollView(camera_roll_manager, user_action_recorder) {}
  23. ~CameraRollViewForTest() override = default;
  24. };
  25. class CameraRollViewTest : public AshTestBase {
  26. public:
  27. CameraRollViewTest() = default;
  28. ~CameraRollViewTest() override = default;
  29. // AshTestBase:
  30. void TearDown() override {
  31. camera_roll_view_.reset();
  32. fake_camera_roll_manager_.reset();
  33. AshTestBase::TearDown();
  34. }
  35. protected:
  36. const CameraRollView* camera_roll_view() const {
  37. return camera_roll_view_.get();
  38. }
  39. phonehub::FakeCameraRollManager* fake_camera_roll_manager() {
  40. return fake_camera_roll_manager_.get();
  41. }
  42. void PresetCameraRollOptInState(bool can_be_enabled) {
  43. fake_camera_roll_manager_ =
  44. std::make_unique<phonehub::FakeCameraRollManager>();
  45. fake_camera_roll_manager_->SetIsCameraRollAvailableToBeEnabled(
  46. can_be_enabled);
  47. fake_user_action_recorder_ =
  48. std::make_unique<phonehub::FakeUserActionRecorder>();
  49. camera_roll_view_ = std::make_unique<CameraRollViewForTest>(
  50. fake_camera_roll_manager_.get(), fake_user_action_recorder_.get());
  51. }
  52. const std::vector<phonehub::CameraRollItem> CreateFakeItems(int num) {
  53. std::vector<phonehub::CameraRollItem> items;
  54. for (int i = num; i > 0; --i) {
  55. phonehub::proto::CameraRollItemMetadata metadata;
  56. metadata.set_key(base::NumberToString(i));
  57. metadata.set_mime_type("image/jpeg");
  58. metadata.set_last_modified_millis(1577865600 + i);
  59. metadata.set_file_size_bytes(123456);
  60. metadata.set_file_name("fake_file_" + base::NumberToString(i) + ".jpg");
  61. SkBitmap bitmap;
  62. bitmap.allocN32Pixels(96, 96);
  63. gfx::Image thumbnail = gfx::Image::CreateFrom1xBitmap(bitmap);
  64. items.emplace_back(metadata, thumbnail);
  65. }
  66. return items;
  67. }
  68. const std::vector<phonehub::CameraRollItem> CreateSingleItemWithType(
  69. bool is_video) {
  70. phonehub::proto::CameraRollItemMetadata metadata;
  71. metadata.set_key("key");
  72. metadata.set_last_modified_millis(1577865600);
  73. metadata.set_file_size_bytes(123456);
  74. if (is_video) {
  75. metadata.set_mime_type("video/mp4");
  76. metadata.set_file_name("fake_video.mp4");
  77. } else {
  78. metadata.set_mime_type("image/png");
  79. metadata.set_file_name("fake_image.png");
  80. }
  81. SkBitmap bitmap;
  82. bitmap.allocN32Pixels(1, 1);
  83. gfx::Image thumbnail = gfx::Image::CreateFrom1xBitmap(bitmap);
  84. return std::vector<phonehub::CameraRollItem>{
  85. phonehub::CameraRollItem(metadata, thumbnail)};
  86. }
  87. CameraRollView::CameraRollItemsView* GetItemsView() const {
  88. return static_cast<CameraRollView::CameraRollItemsView*>(
  89. camera_roll_view()->children().at(1));
  90. }
  91. CameraRollThumbnail* GetThumbnailView(int index) const {
  92. return static_cast<CameraRollThumbnail*>(
  93. GetItemsView()->children().at(index));
  94. }
  95. private:
  96. std::unique_ptr<CameraRollView> camera_roll_view_;
  97. std::unique_ptr<phonehub::FakeUserActionRecorder> fake_user_action_recorder_;
  98. std::unique_ptr<phonehub::FakeCameraRollManager> fake_camera_roll_manager_;
  99. };
  100. TEST_F(CameraRollViewTest, OptInAlready) {
  101. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  102. fake_camera_roll_manager()->ClearCurrentItems();
  103. EXPECT_FALSE(camera_roll_view()->GetVisible());
  104. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(1));
  105. EXPECT_TRUE(camera_roll_view()->GetVisible());
  106. EXPECT_TRUE(camera_roll_view()->items_view_->GetVisible());
  107. }
  108. TEST_F(CameraRollViewTest, OptInAndDismissed) {
  109. PresetCameraRollOptInState(/*can_be_enabled=*/true);
  110. fake_camera_roll_manager()->ClearCurrentItems();
  111. EXPECT_FALSE(camera_roll_view()->GetVisible());
  112. // Setting disabled, shouldn't display anything even if there are camera roll
  113. // items
  114. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(1));
  115. EXPECT_FALSE(camera_roll_view()->GetVisible());
  116. }
  117. TEST_F(CameraRollViewTest, ViewVisibility) {
  118. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  119. // The camera roll view is not visible if there are no items available and
  120. // visible when there are one or more items available.
  121. fake_camera_roll_manager()->ClearCurrentItems();
  122. EXPECT_FALSE(camera_roll_view()->GetVisible());
  123. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(1));
  124. EXPECT_TRUE(camera_roll_view()->GetVisible());
  125. fake_camera_roll_manager()->ClearCurrentItems();
  126. EXPECT_FALSE(camera_roll_view()->GetVisible());
  127. }
  128. TEST_F(CameraRollViewTest, SingleItem) {
  129. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  130. // Set 1 camera roll item.
  131. size_t expected_size = 1;
  132. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(expected_size));
  133. EXPECT_EQ(GetItemsView()->children().size(), expected_size);
  134. }
  135. TEST_F(CameraRollViewTest, MultipleItems) {
  136. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  137. // Set 4 camera roll items.
  138. size_t expected_size = 4;
  139. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(expected_size));
  140. EXPECT_EQ(GetItemsView()->children().size(), expected_size);
  141. }
  142. TEST_F(CameraRollViewTest, ViewLayout) {
  143. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  144. // Test the layout size and positions of the items. If the layout is being
  145. // intentionally changed this test will need to be updated.
  146. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(4));
  147. GetItemsView()->Layout();
  148. EXPECT_EQ(GetItemsView()->CalculatePreferredSize(), gfx::Size(328, 82));
  149. EXPECT_EQ(GetThumbnailView(0)->bounds(), gfx::Rect(4, 4, 74, 74));
  150. EXPECT_EQ(GetThumbnailView(1)->bounds(), gfx::Rect(86, 4, 74, 74));
  151. EXPECT_EQ(GetThumbnailView(2)->bounds(), gfx::Rect(168, 4, 74, 74));
  152. EXPECT_EQ(GetThumbnailView(3)->bounds(), gfx::Rect(250, 4, 74, 74));
  153. }
  154. TEST_F(CameraRollViewTest, AccessibleNameAndTooltip) {
  155. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  156. fake_camera_roll_manager()->SetCurrentItems(CreateFakeItems(4));
  157. EXPECT_EQ(u"Recent photo 1 of 4.", GetThumbnailView(0)->GetAccessibleName());
  158. EXPECT_EQ(u"Recent photo 1 of 4.", GetThumbnailView(0)->GetTooltipText());
  159. EXPECT_EQ(u"Recent photo 2 of 4.", GetThumbnailView(1)->GetAccessibleName());
  160. EXPECT_EQ(u"Recent photo 2 of 4.", GetThumbnailView(1)->GetTooltipText());
  161. EXPECT_EQ(u"Recent photo 3 of 4.", GetThumbnailView(2)->GetAccessibleName());
  162. EXPECT_EQ(u"Recent photo 3 of 4.", GetThumbnailView(2)->GetTooltipText());
  163. EXPECT_EQ(u"Recent photo 4 of 4.", GetThumbnailView(3)->GetAccessibleName());
  164. EXPECT_EQ(u"Recent photo 4 of 4.", GetThumbnailView(3)->GetTooltipText());
  165. }
  166. TEST_F(CameraRollViewTest, ImageThumbnail) {
  167. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  168. fake_camera_roll_manager()->SetCurrentItems(
  169. CreateSingleItemWithType(/*is_video=*/false));
  170. EXPECT_EQ(GetThumbnailView(0)->GetMediaType(),
  171. phone_hub_metrics::CameraRollMediaType::kPhoto);
  172. }
  173. TEST_F(CameraRollViewTest, VideoThumbnail) {
  174. PresetCameraRollOptInState(/*can_be_enabled=*/false);
  175. fake_camera_roll_manager()->SetCurrentItems(
  176. CreateSingleItemWithType(/*is_video=*/true));
  177. EXPECT_EQ(GetThumbnailView(0)->GetMediaType(),
  178. phone_hub_metrics::CameraRollMediaType::kVideo);
  179. }
  180. } // namespace ash