X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=app%2FMediaPlayer.qml;h=cdd9368c5cfa0d29ca9d6697c40586f605ad8b6f;hb=419fc3c50d25fe0f55313f63b717ad16c5100187;hp=6f2fa81fd6d59c1f4d67621afe43a59393ded898;hpb=13bb3fad73f1933e75ea17e101c5f8a3d2c2f561;p=apps%2Fmediaplayer.git diff --git a/app/MediaPlayer.qml b/app/MediaPlayer.qml index 6f2fa81..cdd9368 100644 --- a/app/MediaPlayer.qml +++ b/app/MediaPlayer.qml @@ -14,15 +14,20 @@ * 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.11 + import AGL.Demo.Controls 1.0 ApplicationWindow { id: root + width: container.width * container.scale + height: container.height * container.scale + Item { id: player @@ -30,157 +35,70 @@ ApplicationWindow { property string album: "" property string artist: "" - property int duration: 0 - property int position: 0 - - property string cover_art: "" - property string status: "" - - function time2str(value) { - return Qt.formatTime(new Date(value), 'mm:ss') - } - } - - Item { - id: bluetooth - - property string deviceAddress: "" - property bool connected: false property bool av_connected: false - property int position: 0 property int duration: 0 + property int position: 0 - property string artist: "" - property string title: "" - property string state: "stopped" - - // AVRCP Target UUID - property string avrcp_uuid: "0000110e-0000-1000-8000-00805f9b34fb" - - function connect_profiles() { - var address = bluetooth.deviceAddress; - bluetooth_connection.connect(address, "a2dp") - bluetooth_connection.connect(address, "avrcp") - } - - function disconnect_profiles() { - var address = bluetooth.deviceAddress; - bluetooth_connection.disconnect(address, "a2dp") - bluetooth_connection.disconnect(address, "avrcp") - } + property string status: "stopped" - function set_avrcp_controls(cmd) { - bluetooth_connection.set_avrcp_controls(bluetooth.deviceAddress, cmd) + function time2str(value) { + return Qt.formatTime(new Date(value), (value > 3600000) ? 'hh:mm:ss' : 'mm:ss') } } Connections { - target: bluetooth_connection - - onDeviceListEvent: { - var address = "" - for (var i = 0; i < data.list.length; i++) { - var item = data.list[i] - if (item.Connected == "True" && item.UUIDs.indexOf(bluetooth.avrcp_uuid) >= 0) { - address = item.Address + target: mediaplayer - bluetooth.connected = true - mediaplayer.pause() + onMetadataChanged: { + var track = metadata.track - //NOTE: This hack is here for when MediaPlayer is started - // with an existing connection. - bluetooth.av_connected = item.AVPConnected == "True" - } + if ('status' in metadata) { + player.status = metadata.status } - if (!address) - bluetooth.connected = false - else - bluetooth.deviceAddress = address - } - - onDeviceUpdatedEvent: { - var metadata = data.Metadata - - if (data.Connected == "False") - return - - bluetooth.connected = data.Connected == "True" - bluetooth.av_connected = data.AVPConnected == "True" - bluetooth.deviceAddress = data.Address - - if ('Position' in metadata) - bluetooth.position = metadata.Position - - if ('Duration' in metadata) - bluetooth.duration = metadata.Duration - if ('Status' in metadata) - bluetooth.state = metadata.Status - - if ('Artist' in metadata) - bluetooth.artist = metadata.Artist - - if ('Title' in metadata) - bluetooth.title = metadata.Title - } - } - - Connections { - target: mediaplayer - - onPlaylistChanged: { - playlist.clear() + if ('connected' in metadata) { + player.av_connected = metadata.connected + } - for (var i = 0; i < playlist.list.length; i++) { - var item = playlist.list[i] + if (track) { + if ('image' in track) + return + player.title = track.title + player.album = track.album + player.artist = track.artist - playlist_model.append({ "index": item.index, "artist": item.artist ? item.artist : '', "title": item.title ? item.title : '' }) + if ('duration' in track) + player.duration = track.duration - if (item.selected) { - playlistview.currentIndex = i + if ('index' in track) { + playlistview.currentIndex = track.index } } - } - - onMetadataChanged: { - player.title = metadata.title - player.album = metadata.album - player.artist = metadata.artist - - if (metadata.duration) { - player.duration = metadata.duration - } - if (metadata.position) { + if ('position' in metadata) { player.position = metadata.position } - - if (metadata.status) { - player.status = metadata.status - } - - if (metadata.image) { - player.cover_art = metadata.image - } - - playlistview.currentIndex = metadata.index } } 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 + player.position = player.position + 250 } } - ListModel { - id: playlist_model - } + Item { + id: container + anchors.centerIn: parent + width: Screen.width + height: Screen.height + //scale: screenInfo.scale_factor() + scale: 1 ColumnLayout { anchors.fill: parent @@ -190,14 +108,13 @@ ApplicationWindow { Layout.preferredHeight: 1080 clip: true Image { - id: albumart 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 + source: AlbumArt + visible: player.av_connected === false } Item { @@ -227,11 +144,10 @@ ApplicationWindow { //} 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: { mediaplayer.loop(checked) } + onClicked: { mediaplayer.loop(checked ? "playlist" : "off") } } } ColumnLayout { @@ -239,13 +155,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 @@ -255,28 +171,22 @@ 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: mediaplayer.seek(value) } @@ -293,24 +203,11 @@ ApplicationWindow { id: previous offImage: './images/AGL_MediaPlayer_BackArrow.svg' onClicked: { - if (bluetooth.av_connected) { - bluetooth.set_avrcp_controls("Previous") - bluetooth.position = 0 - } else { - mediaplayer.previous() - } + mediaplayer.previous() } } ImageButton { id: play - offImage: './images/AGL_MediaPlayer_Player_Play.svg' - onClicked: { - if (bluetooth.av_connected) { - bluetooth.set_avrcp_controls("Play") - } else { - mediaplayer.play() - } - } states: [ State { when: player.status == "playing" @@ -318,48 +215,41 @@ ApplicationWindow { target: play offImage: './images/AGL_MediaPlayer_Player_Pause.svg' onClicked: { - player.status = "" 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.set_avrcp_controls("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.set_avrcp_controls("Next") - } else { - mediaplayer.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' } } } @@ -374,14 +264,14 @@ ApplicationWindow { 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 + model: MediaplayerModel currentIndex: -1 delegate: MouseArea { @@ -412,7 +302,7 @@ ApplicationWindow { //} } onClicked: { - mediaplayer.picktrack(playlistview.model.get(index).index) + mediaplayer.picktrack(playlistview.model[index].index) } } @@ -424,3 +314,4 @@ ApplicationWindow { } } } +}