mirror of
https://github.com/clangen/musikcube.git
synced 2025-02-21 12:40:58 +00:00
PlayControlls starting to work.
This commit is contained in:
parent
e9e9a0b79b
commit
0493f9cd13
@ -7,20 +7,25 @@
|
||||
android:paddingRight="8dp" android:gravity="center_vertical|center_horizontal">
|
||||
|
||||
<LinearLayout android:id="@+id/LinearLayout01" android:layout_weight="0.5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:gravity="left">
|
||||
<ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:src="@drawable/album" android:layout_marginTop="5sp" android:layout_marginBottom="5sp" android:layout_height="wrap_content"></ImageView>
|
||||
<TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Track" android:textSize="24sp"></TextView>
|
||||
<TextView android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Genre:"></TextView>
|
||||
<TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Album:"></TextView>
|
||||
<TextView android:id="@+id/TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Artists:"></TextView>
|
||||
<ImageView android:id="@+id/ImageView01" android:src="@drawable/album" android:layout_marginTop="5sp" android:layout_marginBottom="5sp" android:layout_height="200sp" android:layout_width="200sp" android:scaleType="fitXY"></ImageView>
|
||||
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24sp" android:id="@+id/TrackTitle" android:text="Title:"></TextView>
|
||||
|
||||
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Album:" android:id="@+id/TrackAlbum"></TextView>
|
||||
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Artists:" android:id="@+id/TrackArtist"></TextView>
|
||||
</LinearLayout>
|
||||
<LinearLayout android:id="@+id/LinearLayout02" android:layout_weight="0.5" android:layout_width="wrap_content" android:layout_height="wrap_content"></LinearLayout><LinearLayout android:id="@+id/LinearLayout01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">
|
||||
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/MediaPrev" android:clickable="true" android:src="@drawable/ic_media_previous" android:adjustViewBounds="true"></ImageButton>
|
||||
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:id="@+id/MediaPause" android:src="@drawable/ic_media_pause"></ImageButton>
|
||||
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/MediaNext" android:adjustViewBounds="true" android:src="@drawable/ic_media_next"></ImageButton>
|
||||
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/MediaPrev" android:clickable="true" android:src="@drawable/ic_media_previous" android:adjustViewBounds="true" android:padding="15sp"></ImageButton>
|
||||
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:id="@+id/MediaPause" android:src="@drawable/ic_media_pause" android:padding="15sp"></ImageButton>
|
||||
<ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/MediaNext" android:adjustViewBounds="true" android:src="@drawable/ic_media_next" android:padding="15sp"></ImageButton>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
|
||||
|
||||
<SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content" android:layout_width="fill_parent" android:max="1000" android:progress="300" android:secondaryProgress="100"></SeekBar>
|
||||
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0:00" android:id="@+id/TrackPosition" android:typeface="monospace"></TextView>
|
||||
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="0:00" android:id="@+id/TrackDuration" android:typeface="monospace" android:gravity="right"></TextView>
|
||||
|
||||
</LinearLayout>
|
||||
<SeekBar android:layout_height="wrap_content" android:layout_width="fill_parent" android:max="1000" android:progress="300" android:secondaryProgress="100" android:id="@+id/TrackProgress"></SeekBar>
|
||||
</LinearLayout>
|
@ -1,14 +1,34 @@
|
||||
package org.musikcube;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import org.musikcube.core.IQuery;
|
||||
import org.musikcube.core.Library;
|
||||
import org.musikcube.core.MetadataQuery;
|
||||
import org.musikcube.core.Player;
|
||||
import org.musikcube.core.Track;
|
||||
import org.musikcube.core.IQuery.OnQueryResultListener;
|
||||
import org.musikcube.core.Player.OnTrackUpdateListener;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
public class PlayerControl extends Activity {
|
||||
public class PlayerControl extends Activity implements OnTrackUpdateListener, OnQueryResultListener {
|
||||
|
||||
private int trackId = 0;
|
||||
private Track track = new Track();
|
||||
private int buffer = 0;
|
||||
private int duration = 0;
|
||||
private int secondsPlayed = 0;
|
||||
private Object lock = new Object();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@ -36,6 +56,164 @@ public class PlayerControl extends Activity {
|
||||
startService(intent);
|
||||
}
|
||||
};
|
||||
|
||||
public void OnTrackBufferUpdate(int percent) {
|
||||
synchronized(lock){
|
||||
this.buffer = percent;
|
||||
}
|
||||
this.callbackTrackPositionsUpdateHandler.post(this.callbackTrackPositionsUpdateRunnable);
|
||||
}
|
||||
public void OnTrackPositionUpdate(int secondsPlayed) {
|
||||
synchronized(lock){
|
||||
this.secondsPlayed = secondsPlayed;
|
||||
}
|
||||
this.callbackTrackPositionsUpdateHandler.post(this.callbackTrackPositionsUpdateRunnable);
|
||||
}
|
||||
public void OnTrackUpdate() {
|
||||
|
||||
synchronized(lock){
|
||||
int newTrackId = Player.GetInstance().GetCurrentTrackId();
|
||||
if(newTrackId!=this.trackId){
|
||||
this.trackId = newTrackId;
|
||||
this.track = new Track();
|
||||
|
||||
if(this.trackId!=0){
|
||||
MetadataQuery query = new MetadataQuery();
|
||||
query.requestedMetakeys.add("title");
|
||||
query.requestedMetakeys.add("track");
|
||||
query.requestedMetakeys.add("visual_artist");
|
||||
query.requestedMetakeys.add("album");
|
||||
query.requestedMetakeys.add("year");
|
||||
query.requestedMetakeys.add("thumbnail_id");
|
||||
query.requestedMetakeys.add("duration");
|
||||
query.requestedTracks.add(this.trackId);
|
||||
query.SetResultListener(this);
|
||||
Library.GetInstance().AddQuery(query);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.callbackTrackUpdateHandler.post(this.callbackTrackUpdateRunnable);
|
||||
}
|
||||
|
||||
|
||||
public void OnQueryResults(IQuery query) {
|
||||
MetadataQuery mdQuery = (MetadataQuery)query;
|
||||
if(!mdQuery.resultTracks.isEmpty()){
|
||||
synchronized(lock){
|
||||
Track newTrack = mdQuery.resultTracks.get(0);
|
||||
if(this.trackId==newTrack.id){
|
||||
this.track = newTrack;
|
||||
this.callbackTrackUpdateHandler.post(this.callbackTrackUpdateRunnable);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
Player.GetInstance().SetUpdateListener(null);
|
||||
this.timer.cancel();
|
||||
super.onPause();
|
||||
}
|
||||
@Override
|
||||
protected void onResume() {
|
||||
Player.GetInstance().SetUpdateListener(this);
|
||||
super.onResume();
|
||||
|
||||
this.timer = new Timer();
|
||||
this.timer.schedule(new TimerTask() { public void run() {
|
||||
callbackTrackPositionsUpdateHandler.post(callbackTrackPositionsUpdateRunnable);
|
||||
} }, 100);
|
||||
}
|
||||
|
||||
// Need handler for callbacks to the UI thread
|
||||
final Handler callbackTrackUpdateHandler = new Handler();
|
||||
// Create runnable for posting
|
||||
final Runnable callbackTrackUpdateRunnable = new Runnable() {
|
||||
public void run() {
|
||||
OnUpdateTrackUI();
|
||||
}
|
||||
};
|
||||
|
||||
public void OnUpdateTrackUI() {
|
||||
TextView titleView = (TextView)findViewById(R.id.TrackTitle);
|
||||
TextView albumView = (TextView)findViewById(R.id.TrackAlbum);
|
||||
TextView artistView = (TextView)findViewById(R.id.TrackArtist);
|
||||
TextView durationView = (TextView)findViewById(R.id.TrackDuration);
|
||||
|
||||
synchronized(lock){
|
||||
String title = this.track.metadata.get("title");
|
||||
if(title==null){
|
||||
titleView.setText("Title:");
|
||||
}else{
|
||||
titleView.setText("Title: "+title);
|
||||
}
|
||||
String album = this.track.metadata.get("album");
|
||||
if(album==null){
|
||||
albumView.setText("Album:");
|
||||
}else{
|
||||
albumView.setText("Album: "+album);
|
||||
}
|
||||
String artist = this.track.metadata.get("visual_artist");
|
||||
if(artist==null){
|
||||
artistView.setText("Artist:");
|
||||
}else{
|
||||
artistView.setText("Artist: "+artist);
|
||||
}
|
||||
|
||||
String duration = this.track.metadata.get("duration");
|
||||
if(duration==null){
|
||||
this.duration = 0;
|
||||
}else{
|
||||
this.duration = Integer.parseInt(duration);
|
||||
}
|
||||
int minutes = (int)Math.floor(this.duration/60);
|
||||
int seconds = this.duration-minutes*60;
|
||||
String durationText = Integer.toString(minutes)+":";
|
||||
if(seconds<10){ durationText += "0"; }
|
||||
durationText += Integer.toString(seconds);
|
||||
durationView.setText(durationText);
|
||||
}
|
||||
}
|
||||
|
||||
// Need handler for callbacks to the UI thread
|
||||
final Handler callbackTrackPositionsUpdateHandler = new Handler();
|
||||
// Create runnable for posting
|
||||
final Runnable callbackTrackPositionsUpdateRunnable = new Runnable() {
|
||||
public void run() {
|
||||
OnUpdateTrackPositionsUI();
|
||||
}
|
||||
};
|
||||
|
||||
public void OnUpdateTrackPositionsUI() {
|
||||
int msPosition = Player.GetInstance().GetTrackPosition();
|
||||
int position = msPosition/1000;
|
||||
int minutes = (int)Math.floor(position/60);
|
||||
int seconds = position-minutes*60;
|
||||
String positionText = Integer.toString(minutes)+":";
|
||||
if(seconds<10){ positionText += "0"; }
|
||||
positionText += Integer.toString(seconds);
|
||||
TextView positionView = (TextView)findViewById(R.id.TrackPosition);
|
||||
positionView.setText(positionText);
|
||||
|
||||
SeekBar seekBar = (SeekBar)findViewById(R.id.TrackProgress);
|
||||
if(this.duration==0){
|
||||
seekBar.setProgress(0);
|
||||
}else{
|
||||
seekBar.setProgress(msPosition/this.duration);
|
||||
}
|
||||
|
||||
// Next callback in 0.5 seconds
|
||||
this.timer.schedule(new TimerTask() { public void run() {
|
||||
callbackTrackPositionsUpdateHandler.post(callbackTrackPositionsUpdateRunnable);
|
||||
} }, 500);
|
||||
}
|
||||
|
||||
private java.util.Timer timer = new java.util.Timer();
|
||||
|
||||
/*
|
||||
gametimer.schedule(new TimerTask() { public void run() {
|
||||
seconds+=0.1; updatecount();
|
||||
} }, 100, 100);
|
||||
*/
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ public class TrackList extends ListActivity implements OnQueryResultListener {
|
||||
@Override
|
||||
protected void onListItemClick(ListView l, View v, int position, long id){
|
||||
Intent intent = new Intent(this, org.musikcube.Service.class);
|
||||
intent.putExtra("org.musikcube.Service.tracklist", this.query.trackList);
|
||||
intent.putExtra("org.musikcube.Service.tracklist", this.trackList);
|
||||
intent.putExtra("org.musikcube.Service.position", position);
|
||||
intent.putExtra("org.musikcube.Service.action", "playlist");
|
||||
startService(intent);
|
||||
|
@ -2,6 +2,8 @@ package org.musikcube.core;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.musikcube.core.IQuery.OnQueryResultListener;
|
||||
|
||||
import android.content.Intent;
|
||||
|
||||
public class Player implements TrackPlayer.OnTrackStatusListener{
|
||||
@ -13,6 +15,7 @@ public class Player implements TrackPlayer.OnTrackStatusListener{
|
||||
private java.lang.Object lock = new java.lang.Object();
|
||||
|
||||
private ArrayList<TrackPlayer> playingTracks = new ArrayList<TrackPlayer>();
|
||||
private TrackPlayer currentPlayer;
|
||||
|
||||
public android.app.Service service;
|
||||
|
||||
@ -58,9 +61,36 @@ public class Player implements TrackPlayer.OnTrackStatusListener{
|
||||
TrackPlayer player = new TrackPlayer(url,true);
|
||||
player.listener = this;
|
||||
this.playingTracks.add(player);
|
||||
this.currentPlayer = player;
|
||||
|
||||
if(this.listener!=null){
|
||||
this.listener.OnTrackUpdate();
|
||||
this.listener.OnTrackBufferUpdate(0);
|
||||
this.listener.OnTrackPositionUpdate(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
// Inteface for updated track
|
||||
public interface OnTrackUpdateListener{
|
||||
public void OnTrackUpdate();
|
||||
public void OnTrackBufferUpdate(int percent);
|
||||
public void OnTrackPositionUpdate(int secondsPlayed);
|
||||
}
|
||||
protected OnTrackUpdateListener listener = null;
|
||||
public void SetUpdateListener(OnTrackUpdateListener listener){
|
||||
synchronized(this.lock){
|
||||
this.listener = listener;
|
||||
if(this.listener!=null){
|
||||
this.listener.OnTrackUpdate();
|
||||
this.listener.OnTrackBufferUpdate(0);
|
||||
this.listener.OnTrackPositionUpdate(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void Next(){
|
||||
synchronized(this.lock){
|
||||
@ -83,6 +113,7 @@ public class Player implements TrackPlayer.OnTrackStatusListener{
|
||||
|
||||
private void StopAllTracks(){
|
||||
synchronized(this.lock){
|
||||
this.currentPlayer = null;
|
||||
int trackCount = this.playingTracks.size();
|
||||
for(int i=0;i<trackCount;i++){
|
||||
this.playingTracks.get(i).listener = null;
|
||||
@ -122,5 +153,24 @@ public class Player implements TrackPlayer.OnTrackStatusListener{
|
||||
this.service.startService(intent);
|
||||
}
|
||||
|
||||
public int GetCurrentTrackId(){
|
||||
synchronized(this.lock){
|
||||
if(this.position>=0 && this.position<this.nowPlaying.size()){
|
||||
return this.nowPlaying.get(this.position);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int GetTrackPosition(){
|
||||
synchronized(this.lock){
|
||||
TrackPlayer player = this.currentPlayer;
|
||||
if(player!=null){
|
||||
return player.GetTrackPosition();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,7 +17,9 @@ public class TrackPlayer implements Runnable, MediaPlayer.OnCompletionListener,
|
||||
private static final int STATUS_EXIT = 10;
|
||||
|
||||
public void run() {
|
||||
this.mediaPlayer = new MediaPlayer();
|
||||
synchronized(this.lock){
|
||||
this.mediaPlayer = new MediaPlayer();
|
||||
}
|
||||
try {
|
||||
|
||||
this.mediaPlayer.setOnCompletionListener(this);
|
||||
@ -141,5 +143,13 @@ public class TrackPlayer implements Runnable, MediaPlayer.OnCompletionListener,
|
||||
return false;
|
||||
}
|
||||
|
||||
public int GetTrackPosition(){
|
||||
synchronized(this.lock){
|
||||
if(this.mediaPlayer!=null){
|
||||
return this.mediaPlayer.getCurrentPosition();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user