PlayControlls starting to work.

This commit is contained in:
Daniel Önnerby 2009-08-06 22:24:39 +00:00
parent e9e9a0b79b
commit 0493f9cd13
5 changed files with 255 additions and 12 deletions

View File

@ -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>

View File

@ -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);
*/
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;
}
}