X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=fd4db58fe980820be2f62fd5015f50c7dae86058;hb=0aefba20fe07dbb79d7b3683ab38c0b0b313a655;hp=6c4a185282b5b46ff96c58bf48af3f37ff78808e;hpb=92e613114ff5212fa7e5c2a226e32b6e252c9a9c;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index 6c4a185..fd4db58 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -14,40 +14,124 @@ * limitations under the License. */ -import QtQuick 2.6 -import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 -import QtMultimedia 5.6 +import QtQuick 2.11 +import QtQuick.Layouts 1.11 +import QtQuick.Controls 2.4 +import QtQuick.Window 2.13 + import AGL.Demo.Controls 1.0 -import 'api' as API ApplicationWindow { id: root - API.MediaPlayer { + width: container.width * container.scale + height: container.height * container.scale + + Item { id: player - url: bindingAddress + + property string title: "" + property string album: "" + property string artist: "" + + property bool av_connected: false + + property int duration: 0 + property int position: 0 + + property string status: "stopped" + + function time2str(value) { + return Qt.formatTime(new Date(value), (value > 3600000) ? 'hh:mm:ss' : 'mm:ss') + } } - API.BluetoothManager { - id: bluetooth - url: bindingAddress + Component.onCompleted : { + // Let the mediaplayer backend know we're ready for metadata events + mediaplayer.start() + + VehicleSignals.connect() + } + + Connections { + target: mediaplayer + + onMetadataChanged: { + var track = metadata.track + + if ('status' in metadata) { + player.status = metadata.status + } + + if ('connected' in metadata) { + player.av_connected = metadata.connected + } + + if (track) { + if ('image' in track) + return + player.title = track.title + player.album = track.album + player.artist = track.artist + + if ('duration' in track) + player.duration = track.duration + + if ('index' in track) { + playlistview.currentIndex = track.index + } + } + + if ('position' in metadata) { + player.position = metadata.position + } + } + } + + Connections { + target: VehicleSignals + + onConnected: { + VehicleSignals.authorize() + } + + onAuthorized: { + VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.Next") + VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.Previous") + VehicleSignals.subscribe("Vehicle.Cabin.SteeringWheel.Switches.Mode") + } + + onSignalNotification: { + if (path === "Vehicle.Cabin.SteeringWheel.Switches.Next" && value === "true") { + mediaplayer.next() + } else if (path === "Vehicle.Cabin.SteeringWheel.Switches.Previous" && value === "true") { + mediaplayer.previous() + } else if (path === "Vehicle.Cabin.SteeringWheel.Switches.Mode" && value === "true") { + if (player.av_connected) + mediaplayer.connect() + else + mediaplayer.disconnect() + } + } } Timer { id: timer interval: 250 - running: (bluetooth.av_connected && bluetooth.state == "playing") + running: player.av_connected && player.status == "playing" repeat: true onTriggered: { - bluetooth.position = bluetooth.position + 250 - slider.value = bluetooth.position + player.position = player.position + 250 } } - ListModel { - id: playlist - } + Item { + id: container + anchors.centerIn: parent + width: Window.width + height: Window.height + //scale: screenInfo.scale_factor() + scale: 1 ColumnLayout { anchors.fill: parent @@ -56,18 +140,19 @@ ApplicationWindow { Layout.fillHeight: true Layout.preferredHeight: 1080 clip: true + Image { - id: albumart + anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - anchors.bottom: parent.bottom - height: sourceSize.height * width / sourceSize.width - fillMode: Image.PreserveAspectCrop - source: player.cover_art ? player.cover_art : '' - visible: bluetooth.av_connected == false + anchors.bottom: controls.top + fillMode: Image.PreserveAspectFit + source: AlbumArt + visible: player.av_connected === false } Item { + id: controls anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom @@ -86,19 +171,18 @@ ApplicationWindow { Layout.fillHeight: true Row { spacing: 20 - ToggleButton { - id: random - visible: bluetooth.connected == false - offImage: './images/AGL_MediaPlayer_Shuffle_Inactive.svg' - onImage: './images/AGL_MediaPlayer_Shuffle_Active.svg' - } + //ToggleButton { + // id: random + // visible: bluetooth.connected == false + // offImage: './images/AGL_MediaPlayer_Shuffle_Inactive.svg' + // onImage: './images/AGL_MediaPlayer_Shuffle_Active.svg' + //} ToggleButton { id: loop - visible: bluetooth.connected == false - checked: player.loop_state + visible: player.av_connected === false offImage: './images/AGL_MediaPlayer_Loop_Inactive.svg' onImage: './images/AGL_MediaPlayer_Loop_Active.svg' - onClicked: { player.loop(checked) } + onClicked: { mediaplayer.loop(checked ? "playlist" : "off") } } } ColumnLayout { @@ -106,13 +190,13 @@ ApplicationWindow { Label { id: title Layout.alignment: Layout.Center - text: bluetooth.av_connected ? bluetooth.title : (player.title ? player.title : '') + text: player.title horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter } Label { Layout.alignment: Layout.Center - text: bluetooth.av_connected ? bluetooth.artist : (player.artist ? player.artist : '') + text: player.artist horizontalAlignment: Label.AlignHCenter verticalAlignment: Label.AlignVCenter font.pixelSize: title.font.pixelSize * 0.6 @@ -122,30 +206,24 @@ ApplicationWindow { Slider { id: slider Layout.fillWidth: true - to: bluetooth.av_connected ? bluetooth.duration : player.duration - enabled: bluetooth.av_connected == false - value: bluetooth.av_connected ? bluetooth.position : player.position - function getPosition() { - if (bluetooth.av_connected) { - return player.time2str(bluetooth.position) - } - return player.time2str(player.position) - } + to: player.duration + enabled: player.av_connected === false + value: player.position Label { id: position anchors.left: parent.left anchors.bottom: parent.top font.pixelSize: 32 - text: slider.getPosition() + text: player.time2str(player.position) } Label { id: duration anchors.right: parent.right anchors.bottom: parent.top font.pixelSize: 32 - text: bluetooth.av_connected ? player.time2str(bluetooth.duration) : player.time2str(player.duration) + text: player.time2str(player.duration) } - onPressedChanged: player.seek(value) + onPressedChanged: mediaplayer.seek(value) } RowLayout { Layout.fillHeight: true @@ -160,70 +238,53 @@ ApplicationWindow { id: previous offImage: './images/AGL_MediaPlayer_BackArrow.svg' onClicked: { - if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Previous") - bluetooth.position = 0 - } else { - player.previous() - } + mediaplayer.previous() } } ImageButton { id: play - offImage: './images/AGL_MediaPlayer_Player_Play.svg' - onClicked: { - if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Play") - } else { - player.play() - } - } states: [ State { - when: player.running === true + when: player.status == "playing" PropertyChanges { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' - onClicked: player.pause() + onClicked: { + mediaplayer.pause() + } } }, State { - when: bluetooth.av_connected && bluetooth.state == "playing" + when: player.status != "playing" PropertyChanges { target: play - offImage: './images/AGL_MediaPlayer_Player_Pause.svg' - onClicked: bluetooth.sendMediaCommand("Pause") + offImage: './images/AGL_MediaPlayer_Player_Play.svg' + onClicked: mediaplayer.play() } } - ] } ImageButton { id: forward offImage: './images/AGL_MediaPlayer_ForwardArrow.svg' onClicked: { - if (bluetooth.av_connected) { - bluetooth.sendMediaCommand("Next") - } else { - player.next() - } + mediaplayer.next() } } Item { Layout.fillWidth: true } ToggleButton { - visible: bluetooth.connected - checked: bluetooth.av_connected - offImage: './images/AGL_MediaPlayer_Bluetooth_Inactive.svg' - onImage: './images/AGL_MediaPlayer_Bluetooth_Active.svg' - + visible: true + checked: player.av_connected onClicked: { - if (bluetooth.av_connected) { - bluetooth.disconnect_profiles() - } else { - bluetooth.connect_profiles() - } + if (checked) + mediaplayer.connect() + else + mediaplayer.disconnect() + } + contentItem: Image { + source: player.av_connected ? './images/AGL_MediaPlayer_Bluetooth_Active.svg' : './images/AGL_MediaPlayer_Bluetooth_Inactive.svg' } } } @@ -233,19 +294,19 @@ ApplicationWindow { Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.preferredHeight: 407 + Layout.preferredHeight: 480 ListView { anchors.fill: parent id: playlistview - visible: bluetooth.av_connected == false + visible: player.av_connected === false clip: true header: Label { x: 50 text: 'PLAYLIST' opacity: 0.5 } - model: playlist + model: MediaplayerModel currentIndex: -1 delegate: MouseArea { @@ -265,19 +326,18 @@ ApplicationWindow { Label { Layout.fillWidth: true text: model.artist - color: '#66FF99' + color: '#00ADDC' font.pixelSize: 32 } } //Label { // text: player.time2str(model.duration) - // color: '#66FF99' + // color: '#00ADDC' // font.pixelSize: 32 //} } onClicked: { - player.pick_track(playlistview.model.get(index).index) - player.play() + mediaplayer.picktrack(playlistview.model[index].index) } } @@ -289,3 +349,4 @@ ApplicationWindow { } } } +}