#ifndef CONTENT_BROWSER_MEDIA_SESSION_AUDIO_FOCUS_DELEGATE_ANDROID_H_
#define CONTENT_BROWSER_MEDIA_SESSION_AUDIO_FOCUS_DELEGATE_ANDROID_H_
#include <jni.h>
#include "base/android/scoped_java_ref.h"
#include "base/memory/raw_ptr.h"
#include "content/browser/media/session/audio_focus_delegate.h"
#include "content/public/browser/web_contents_observer.h"
namespace media_session {
namespace mojom {
enum class AudioFocusType;
}
}
namespace content {
class AudioFocusDelegateAndroid : public AudioFocusDelegate,
public WebContentsObserver {
public:
explicit AudioFocusDelegateAndroid(MediaSessionImpl* media_session);
AudioFocusDelegateAndroid(const AudioFocusDelegateAndroid&) = delete;
AudioFocusDelegateAndroid& operator=(const AudioFocusDelegateAndroid&) =
delete;
~AudioFocusDelegateAndroid() override;
void Initialize();
AudioFocusResult RequestAudioFocus(
media_session::mojom::AudioFocusType audio_focus_type) override;
void AbandonAudioFocus() override;
std::optional<media_session::mojom::AudioFocusType> GetCurrentFocusType()
const override;
const base::UnguessableToken& request_id() const override;
void ReleaseRequestId() override {}
void OnSuspend(JNIEnv* env);
void OnResume(JNIEnv* env);
void OnStartDucking(JNIEnv* env);
void OnStopDucking(JNIEnv* env);
void MediaSessionInfoChanged(
const media_session::mojom::MediaSessionInfoPtr&) override {}
protected:
void OnAudioStateChanged(bool is_audible) override;
private:
raw_ptr<MediaSessionImpl> media_session_;
base::android::ScopedJavaGlobalRef<jobject> j_media_session_delegate_;
bool is_deferred_gain_pending_ = false;
};
}
#endif