blob: eb51e3e8e5200ea02de89a4aacb42df1a19e9396 [file] [log] [blame]
// Copyright 2016 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_METRICS_DESKTOP_SESSION_DURATION_AUDIBLE_CONTENTS_TRACKER_H_
#define CHROME_BROWSER_METRICS_DESKTOP_SESSION_DURATION_AUDIBLE_CONTENTS_TRACKER_H_
#include <set>
#include "base/callback.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
namespace metrics {
// BrowserList / TabStripModelObserver used for tracking audio status.
// TODO(chrisha): Migrate this entire thing to use RecentlyAudibleHelper
// notifications rather then TabStripModel notifications.
// https://crbug.com/846374
class AudibleContentsTracker : public BrowserListObserver,
public TabStripModelObserver {
public:
// Interface for an observer of the AudibleContentsTracker. The only client
// of this class is the DesktopSessionDurationTracker, but an observer
// interface has been created for ease of testing.
class Observer {
public:
Observer() {}
virtual ~Observer() {}
// Invoked when a first audio source starts playing after a period of no
// audio sources.
virtual void OnAudioStart() = 0;
// Invoked when all audio sources stop playing.
virtual void OnAudioEnd() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(Observer);
};
// Creates an audible contents tracker that dispatches its messages to the
// provided |observer|.
explicit AudibleContentsTracker(Observer* observer);
~AudibleContentsTracker() override;
private:
// BrowserListObserver:
void OnBrowserAdded(Browser* browser) override;
void OnBrowserRemoved(Browser* browser) override;
// TabStripModelObserver:
void TabClosingAt(TabStripModel* model,
content::WebContents* web_contents,
int index) override;
void TabChangedAt(content::WebContents* web_contents,
int index,
TabChangeType change_type) override;
void TabReplacedAt(TabStripModel* model,
content::WebContents* old_web_contents,
content::WebContents* new_web_contents,
int index) override;
// Used for managing audible_contents_, and invoking OnAudioStart and
// OnAudioEnd callbacks.
void AddAudibleWebContents(content::WebContents* web_contents);
void RemoveAudibleWebContents(content::WebContents* web_contents);
Observer* observer_;
// The set of WebContents that are currently playing audio.
std::set<content::WebContents*> audible_contents_;
DISALLOW_COPY_AND_ASSIGN(AudibleContentsTracker);
};
} // namespace metrics
#endif // CHROME_BROWSER_METRICS_DESKTOP_SESSION_DURATION_AUDIBLE_CONTENTS_TRACKER_H_