/*  Copyright (C) 2015-2017 Andreas Shimokawa, Carsten Pfeiffer, Daniele
    Gobbetti

    This file is part of Gadgetbridge.

    Gadgetbridge is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Gadgetbridge is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.service.receivers;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.SystemClock;
import android.view.KeyEvent;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl;
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;

public class GBMusicControlReceiver extends BroadcastReceiver {
    private static final Logger LOG = LoggerFactory.getLogger(GBMusicControlReceiver.class);

    public static final String ACTION_MUSICCONTROL = "nodomain.freeyourgadget.gadgetbridge.musiccontrol";

    @Override
    public void onReceive(Context context, Intent intent) {
        GBDeviceEventMusicControl.Event musicCmd = GBDeviceEventMusicControl.Event.values()[intent.getIntExtra("event", 0)];
        int keyCode = -1;
        int volumeAdjust = AudioManager.ADJUST_LOWER;

        switch (musicCmd) {
            case NEXT:
                keyCode = KeyEvent.KEYCODE_MEDIA_NEXT;
                break;
            case PREVIOUS:
                keyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS;
                break;
            case PLAY:
                keyCode = KeyEvent.KEYCODE_MEDIA_PLAY;
                break;
            case PAUSE:
                keyCode = KeyEvent.KEYCODE_MEDIA_PAUSE;
                break;
            case PLAYPAUSE:
                keyCode = KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE;
                break;
            case VOLUMEUP:
                // change default and fall through, :P
                volumeAdjust = AudioManager.ADJUST_RAISE;
            case VOLUMEDOWN:
                AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, volumeAdjust, 0);
                break;
            default:
                return;
        }

        if (keyCode != -1) {
            Prefs prefs = GBApplication.getPrefs();
            String audioPlayer = prefs.getString("audio_player", "default");

            long eventtime = SystemClock.uptimeMillis();

            Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
            KeyEvent downEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_DOWN, keyCode, 0);
            downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent);
            if (!"default".equals(audioPlayer)) {
                downIntent.setPackage(audioPlayer);
            }
            context.sendOrderedBroadcast(downIntent, null);

            Intent upIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
            KeyEvent upEvent = new KeyEvent(eventtime, eventtime, KeyEvent.ACTION_UP, keyCode, 0);
            upIntent.putExtra(Intent.EXTRA_KEY_EVENT, upEvent);
            if (!"default".equals(audioPlayer)) {
                upIntent.setPackage(audioPlayer);
            }
            context.sendOrderedBroadcast(upIntent, null);
        }
    }
}

@@ -899,24 +899,62 @@
 stReceiver;%0A
+import android.content.ComponentName;%0A
 import andro
@@ -973,16 +973,16 @@
 ontext;%0A
-
 import a
@@ -1035,24 +1035,120 @@
 dioManager;%0A
+import android.media.session.MediaController;%0Aimport android.media.session.MediaSessionManager;%0A
 import andro
@@ -1255,16 +1255,40 @@
 ctory;%0A%0A
+import java.util.List;%0A%0A
 import n
@@ -1338,16 +1338,16 @@
 cation;%0A
-
 import n
@@ -1422,16 +1422,97 @@
 ontrol;%0A
+import nodomain.freeyourgadget.gadgetbridge.externalevents.NotificationListener;%0A
 import n
@@ -3263,24 +3263,873 @@
 default%22);%0A%0A
+            if (android.os.Build.VERSION.SDK_INT %3E= android.os.Build.VERSION_CODES.LOLLIPOP) %7B%0A                MediaSessionManager mediaSessionManager =%0A                        (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);%0A%0A                List%3CMediaController%3E controllers = mediaSessionManager.getActiveSessions(%0A                        new ComponentName(context, NotificationListener.class));%0A                try %7B%0A                    MediaController controller = controllers.get(0);%0A                    audioPlayer = controller.getPackageName();%0A                %7D catch (IndexOutOfBoundsException e) %7B%0A                    System.err.println(%22IndexOutOfBoundsException: %22 + e.getMessage());%0A                %7D%0A            %7D%0A%0A            LOG.debug(%22keypress: %22 + musicCmd.toString() + %22 sent to: %22 + audioPlayer);%0A%0A
             

Support control of multiple media playback applications (#807)