media_notification_util.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2019 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 "components/media_message_center/media_notification_util.h"
  5. #include "base/containers/contains.h"
  6. #include "base/metrics/histogram_macros.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "ui/views/controls/button/button.h"
  9. namespace media_message_center {
  10. using media_session::mojom::MediaSessionAction;
  11. namespace {
  12. // The action buttons in order of preference. If there is not enough space to
  13. // show all the action buttons then this is used to determine which will be
  14. // shown.
  15. constexpr MediaSessionAction kPreferredActions[] = {
  16. MediaSessionAction::kPlay,
  17. MediaSessionAction::kPause,
  18. MediaSessionAction::kPreviousTrack,
  19. MediaSessionAction::kNextTrack,
  20. MediaSessionAction::kSeekBackward,
  21. MediaSessionAction::kSeekForward,
  22. MediaSessionAction::kEnterPictureInPicture,
  23. MediaSessionAction::kExitPictureInPicture,
  24. };
  25. // The maximum number of media notifications to count when recording the
  26. // Media.Notification.Count histogram. 20 was chosen because it would be very
  27. // unlikely to see a user with 20+ things playing at once.
  28. const int kMediaNotificationCountHistogramMax = 20;
  29. } // namespace
  30. const char kCountHistogramName[] = "Media.Notification.Count";
  31. const char kCastCountHistogramName[] = "Media.Notification.Cast.Count";
  32. std::u16string GetAccessibleNameFromMetadata(
  33. media_session::MediaMetadata session_metadata) {
  34. std::vector<std::u16string> text;
  35. if (!session_metadata.title.empty())
  36. text.push_back(session_metadata.title);
  37. if (!session_metadata.artist.empty())
  38. text.push_back(session_metadata.artist);
  39. if (!session_metadata.album.empty())
  40. text.push_back(session_metadata.album);
  41. std::u16string accessible_name = base::JoinString(text, u" - ");
  42. return accessible_name;
  43. }
  44. base::flat_set<MediaSessionAction> GetTopVisibleActions(
  45. const base::flat_set<MediaSessionAction>& enabled_actions,
  46. const base::flat_set<MediaSessionAction>& ignored_actions,
  47. size_t max_actions) {
  48. base::flat_set<MediaSessionAction> visible_actions;
  49. for (auto& action : kPreferredActions) {
  50. if (visible_actions.size() >= max_actions)
  51. break;
  52. if (!base::Contains(enabled_actions, action) ||
  53. base::Contains(ignored_actions, action))
  54. continue;
  55. visible_actions.insert(action);
  56. }
  57. return visible_actions;
  58. }
  59. MediaSessionAction GetActionFromButtonTag(const views::Button& button) {
  60. return static_cast<MediaSessionAction>(button.tag());
  61. }
  62. MediaSessionAction GetPlayPauseIgnoredAction(
  63. MediaSessionAction current_action) {
  64. return current_action == MediaSessionAction::kPlay
  65. ? MediaSessionAction::kPause
  66. : MediaSessionAction::kPlay;
  67. }
  68. MediaSessionAction GetPictureInPictureIgnoredAction(
  69. MediaSessionAction current_action) {
  70. return current_action == MediaSessionAction::kEnterPictureInPicture
  71. ? MediaSessionAction::kExitPictureInPicture
  72. : MediaSessionAction::kEnterPictureInPicture;
  73. }
  74. void RecordConcurrentNotificationCount(size_t count) {
  75. UMA_HISTOGRAM_EXACT_LINEAR(kCountHistogramName, count,
  76. kMediaNotificationCountHistogramMax);
  77. }
  78. void RecordConcurrentCastNotificationCount(size_t count) {
  79. UMA_HISTOGRAM_EXACT_LINEAR(kCastCountHistogramName, count,
  80. kMediaNotificationCountHistogramMax);
  81. }
  82. } // namespace media_message_center