// Copyright 2020 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.

package org.chromium.weblayer;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.os.RemoteException;

import androidx.annotation.NonNull;

import org.chromium.weblayer_private.interfaces.ObjectWrapper;

/**
 * A foreground {@link Service} for the Web MediaSession API.
 * This class is a thin wrapper that forwards lifecycle events to the WebLayer implementation, which
 * in turn manages a system notification and {@link MediaSession}. This service will be in the
 * foreground when the MediaSession is active.
 * @since 85
 */
public class MediaSessionService extends MediaPlaybackBaseService {
    // A helper to automatically pause the media session when a user removes headphones.
    private BroadcastReceiver mAudioBecomingNoisyReceiver;

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mAudioBecomingNoisyReceiver != null) {
            unregisterReceiver(mAudioBecomingNoisyReceiver);
        }
    }

    @Override
    void init() {
        mAudioBecomingNoisyReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (!AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
                    return;
                }

                Intent i = new Intent(getApplication(), MediaSessionService.class);
                i.setAction(intent.getAction());
                getApplication().startService(i);
            }
        };

        IntentFilter filter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
        registerReceiver(mAudioBecomingNoisyReceiver, filter);
    }

    @Override
    void forwardStartCommandToImpl(@NonNull WebLayer webLayer, Intent intent)
            throws RemoteException {
        webLayer.getImpl().onMediaSessionServiceStarted(ObjectWrapper.wrap(this), intent);
    }

    @Override
    void forwardDestroyToImpl() throws RemoteException {
        getWebLayer().getImpl().onMediaSessionServiceDestroyed();
    }
}
