实例介绍
【实例简介】telecapoland-jamendo
【实例截图】
【实例截图】
【核心代码】
/*
* Copyright (C) 2009 Teleca Poland Sp. z o.o. <android@teleca.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.teleca.jamendo.activity;
import java.util.List;
import org.json.JSONException;
import com.teleca.jamendo.JamendoApplication;
import com.teleca.jamendo.api.Album;
import com.teleca.jamendo.api.JamendoGet2Api;
import com.teleca.jamendo.api.License;
import com.teleca.jamendo.api.Playlist;
import com.teleca.jamendo.api.PlaylistEntry;
import com.teleca.jamendo.api.PlaylistRemote;
import com.teleca.jamendo.api.Track;
import com.teleca.jamendo.api.WSError;
import com.teleca.jamendo.api.impl.JamendoGet2ApiImpl;
import com.teleca.jamendo.dialog.AddToPlaylistDialog;
import com.teleca.jamendo.dialog.LoadingDialog;
import com.teleca.jamendo.dialog.LyricsDialog;
import com.teleca.jamendo.dialog.PlayerAlbumLoadingDialog;
import com.teleca.jamendo.dialog.PlaylistRemoteLoadingDialog;
import com.teleca.jamendo.media.PlayerEngine;
import com.teleca.jamendo.media.PlayerEngineListener;
import com.teleca.jamendo.util.Helper;
import com.teleca.jamendo.widget.ReflectableLayout;
import com.teleca.jamendo.widget.ReflectiveSurface;
import com.teleca.jamendo.widget.RemoteImageView;
import com.teleca.jamendo.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.SlidingDrawer;
import android.widget.TextView;
import android.widget.Toast;
/**
* Central part of the UI. Touching cover fades in 4-way media buttons.
* 4-way media buttons fade out after certain amount of time. Other parts
* of layout are progress bar, total play time, played time, song title,
* artist name and jamendo slider.<br><br>
*
* License information is implemented overlaying CreativeCommons logo over
* the album picture. Information about type of license is retrieved concurrently
* to track bufferring.
*
* @author Lukasz Wisniewski
*/
public class PlayerActivity extends Activity{
private PlayerEngine getPlayerEngine(){
return JamendoApplication.getInstance().getPlayerEngineInterface();
};
private Playlist mPlaylist;
private Album mCurrentAlbum;
// XML layout
private TextView mArtistTextView;
private TextView mSongTextView;
private TextView mCurrentTimeTextView;
private TextView mTotalTimeTextView;
private RatingBar mRatingBar;
private ProgressBar mProgressBar;
private ImageButton mPlayImageButton;
private ImageButton mNextImageButton;
private ImageButton mPrevImageButton;
private ImageButton mStopImageButton;
private RemoteImageView mCoverImageView;
private RemoteImageView mLicenseImageView;
private Animation mFadeInAnimation;
private Animation mFadeOutAnimation;
private ReflectableLayout mReflectableLayout;
private ReflectiveSurface mReflectiveSurface;
private String mBetterRes;
private SlidingDrawer mSlidingDrawer;
/**
* Launch this Activity from the outside, with defined playlist
*
* @param c context from which Activity should be started
* @param a playlist to be played
*/
public static void launch(Context c, Playlist playlist){
Intent intent = new Intent(c, PlayerActivity.class);
intent.putExtra("playlist", playlist);
/*
* For example, consider a task consisting of the activities:
* A, B, C, D. If D calls startActivity() with an Intent that
* resolves to the component of activity B, then C and D will
* be finished and B receive the given Intent, resulting in
* the stack now being: A, B.
*/
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP );
c.startActivity(intent);
}
/**
* Launch this Activity from the outside, with defined playlist on a remote server
*
* @param c
* @param playlistRemote
*/
public static void launch(Activity c, PlaylistRemote playlistRemote){
Intent intent = new Intent(c, PlayerActivity.class);
new PlaylistRemoteLoadingDialog(c, R.string.loading_playlist, R.string.loading_playlist_fail, intent).execute(playlistRemote);
}
/**
* Launch this Activity from the outside with the given album
*
* @param c Activity from which PlayerActivity should be started
* @param album an album to be played
*/
public static void launch(Activity c, Album album){
new PlayerAlbumLoadingDialog(c, R.string.album_loading, R.string.album_fail).execute(album);
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(JamendoApplication.TAG, "PlayerActivity.onCreate");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.player);
// XML binding
mBetterRes = getResources().getString(R.string.better_res);
mArtistTextView = (TextView)findViewById(R.id.ArtistTextView);
mSongTextView = (TextView)findViewById(R.id.SongTextView);
mCurrentTimeTextView = (TextView)findViewById(R.id.CurrentTimeTextView);
mTotalTimeTextView = (TextView)findViewById(R.id.TotalTimeTextView);
mRatingBar = (RatingBar) findViewById(R.id.TrackRowRatingBar);
mCoverImageView = (RemoteImageView)findViewById(R.id.CoverImageView);
mCoverImageView.setOnClickListener(mCoverOnClickListener);
mCoverImageView.setDefaultImage(R.drawable.no_cd_300);
mProgressBar = (ProgressBar)findViewById(R.id.ProgressBar);
mReflectableLayout = (ReflectableLayout)findViewById(R.id.ReflectableLayout);
mReflectiveSurface = (ReflectiveSurface)findViewById(R.id.ReflectiveSurface);
if(mReflectableLayout != null && mReflectiveSurface != null){
mReflectableLayout.setReflectiveSurface(mReflectiveSurface);
mReflectiveSurface.setReflectableLayout(mReflectableLayout);
}
handleIntent();
mPlayImageButton = (ImageButton)findViewById(R.id.PlayImageButton);
mPlayImageButton.setOnClickListener(mPlayOnClickListener);
mNextImageButton = (ImageButton)findViewById(R.id.NextImageButton);
mNextImageButton.setOnClickListener(mNextOnClickListener);
mPrevImageButton = (ImageButton)findViewById(R.id.PrevImageButton);
mPrevImageButton.setOnClickListener(mPrevOnClickListener);
mStopImageButton = (ImageButton)findViewById(R.id.StopImageButton);
mStopImageButton.setOnClickListener(mStopOnClickListener);
mFadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);
mFadeInAnimation.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
if(mFadeInAnimation.hasEnded())
mPlayImageButton.startAnimation(mFadeOutAnimation);
}
}, 7500);
}
@Override
public void onAnimationRepeat(Animation animation) {
// nothing here
}
@Override
public void onAnimationStart(Animation animation) {
setMediaVisible();
}
});
mFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
mFadeOutAnimation.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationEnd(Animation animation) {
setMediaGone();
}
@Override
public void onAnimationRepeat(Animation animation) {
// nothing here
}
@Override
public void onAnimationStart(Animation animation) {
setFadeOutAnimation();
}
});
mLicenseImageView = (RemoteImageView)findViewById(R.id.LicenseImageView);
mCurrentAlbum = null;
mSlidingDrawer = (SlidingDrawer)findViewById(R.id.drawer);
// cupcake backwards compability
int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if(sdkVersion == Build.VERSION_CODES.CUPCAKE){
new CupcakeListener();
}
}
@Override
public void onResume() {
super.onResume();
Log.i(JamendoApplication.TAG, "PlayerActivity.onResume");
// register UI listener
JamendoApplication.getInstance().setPlayerEngineListener(mPlayerEngineListener);
// refresh UI
if(getPlayerEngine() != null){
// the playlist is empty, abort playback, show message
if(getPlayerEngine().getPlaylist() == null){
Toast.makeText(this, R.string.no_tracks, Toast.LENGTH_LONG).show();
finish();
return;
}
mPlayerEngineListener.onTrackChanged(getPlayerEngine().getPlaylist().getSelectedTrack());
}
}
@Override
public void onPause() {
super.onPause();
Log.i(JamendoApplication.TAG, "PlayerActivity.onPause");
// unregister UI listener
JamendoApplication.getInstance().setPlayerEngineListener(null);
}
/**
* Makes 4-way media visible
*/
private void setMediaVisible(){
mPlayImageButton.setVisibility(View.VISIBLE);
mNextImageButton.setVisibility(View.VISIBLE);
mPrevImageButton.setVisibility(View.VISIBLE);
mStopImageButton.setVisibility(View.VISIBLE);
}
/**
* Makes 4-way media gone
*/
private void setMediaGone(){
mPlayImageButton.setVisibility(View.GONE);
mNextImageButton.setVisibility(View.GONE);
mPrevImageButton.setVisibility(View.GONE);
mStopImageButton.setVisibility(View.GONE);
}
/**
* Sets fade out animation to 4-way media
*/
private void setFadeOutAnimation(){
mPlayImageButton.setAnimation(mFadeOutAnimation);
mNextImageButton.setAnimation(mFadeOutAnimation);
mPrevImageButton.setAnimation(mFadeOutAnimation);
mStopImageButton.setAnimation(mFadeOutAnimation);
}
/**
* Sets fade out animation to 4-way media
*/
private void setFadeInAnimation(){
mPlayImageButton.setAnimation(mFadeInAnimation);
mNextImageButton.setAnimation(mFadeInAnimation);
mPrevImageButton.setAnimation(mFadeInAnimation);
mStopImageButton.setAnimation(mFadeInAnimation);
}
/**
* Launches fade in/out sequence
*/
private OnClickListener mCoverOnClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
if(mPlayImageButton.getVisibility() == View.GONE)
{
setMediaVisible();
setFadeInAnimation();
mPlayImageButton.startAnimation(mFadeInAnimation);
}
}
};
/**
* on click play/pause and open playlist if necessary
*/
private OnClickListener mPlayOnClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
if(getPlayerEngine().isPlaying()){
getPlayerEngine().pause();
} else {
getPlayerEngine().play();
}
}
};
/**
* next button action
*/
private OnClickListener mNextOnClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
getPlayerEngine().next();
}
};
/**
* prev button action
*/
private OnClickListener mPrevOnClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
getPlayerEngine().prev();
}
};
/**
* stop button action
*/
private OnClickListener mStopOnClickListener = new OnClickListener(){
@Override
public void onClick(View v) {
getPlayerEngine().stop();
}
};
/**
* PlayerEngineListener implementation, manipulates UI
*/
private PlayerEngineListener mPlayerEngineListener = new PlayerEngineListener(){
@Override
public void onTrackChanged(PlaylistEntry playlistEntry) {
new LicenseTask(playlistEntry.getAlbum(), mCurrentAlbum);
mCurrentAlbum = playlistEntry.getAlbum();
mArtistTextView.setText(playlistEntry.getAlbum().getArtistName());
mSongTextView.setText(playlistEntry.getTrack().getName());
mCurrentTimeTextView.setText(Helper.secondsToString(0));
mTotalTimeTextView.setText(Helper.secondsToString(playlistEntry.getTrack().getDuration()));
mCoverImageView.setImageUrl(playlistEntry.getAlbum().getImage().replaceAll("1.100.jpg", mBetterRes)); // Get higher resolution image 300x300
mProgressBar.setProgress(0);
mProgressBar.setMax(playlistEntry.getTrack().getDuration());
mCoverImageView.performClick();
if(mRatingBar != null){
mRatingBar.setProgress((int) (10* playlistEntry.getAlbum().getRating()));
mRatingBar.setMax(10);
}
if(getPlayerEngine() != null){
if(getPlayerEngine().isPlaying()){
mPlayImageButton.setImageResource(R.drawable.player_pause_light);
} else {
mPlayImageButton.setImageResource(R.drawable.player_play_light);
}
}
}
@Override
public void onTrackProgress(int seconds) {
mCurrentTimeTextView.setText(Helper.secondsToString(seconds));
mProgressBar.setProgress(seconds);
}
@Override
public void onTrackBuffering(int percent) {
// int secondaryProgress = (int) (((float)percent/100)*mProgressBar.getMax());
// mProgressBar.setSecondaryProgress(secondaryProgress);
}
@Override
public void onTrackStop() {
mPlayImageButton.setImageResource(R.drawable.player_play_light);
}
@Override
public boolean onTrackStart() {
mPlayImageButton.setImageResource(R.drawable.player_pause_light);
return true;
}
@Override
public void onTrackPause() {
mPlayImageButton.setImageResource(R.drawable.player_play_light);
}
@Override
public void onTrackStreamError() {
Toast.makeText(PlayerActivity.this, R.string.stream_error, Toast.LENGTH_LONG).show();
}
};
/**
* Loads playlist to the PlayerEngine
*
* @param playlist
*/
private void handleIntent(){
Log.i(JamendoApplication.TAG, "PlayerActivity.handleIntent");
// This will be result of this intent handling
Playlist playlist = null;
// We need to handle Uri
if(getIntent().getData() != null){
// Check if this intent was already once parsed
// we don't need to do that again
if(!getIntent().getBooleanExtra("handled", false)){
new UriLoadingDialog(this, R.string.loading, R.string.loading_fail).execute();
}
} else {
playlist = (Playlist) getIntent().getSerializableExtra("playlist");
loadPlaylist(playlist);
}
}
private void loadPlaylist(Playlist playlist){
Log.i(JamendoApplication.TAG, "PlayerActivity.loadPlaylist");
if(playlist == null)
return;
mPlaylist = playlist;
if(mPlaylist != getPlayerEngine().getPlaylist()){
//getPlayerEngine().stop();
getPlayerEngine().openPlaylist(mPlaylist);
getPlayerEngine().play();
}
}
/**
* This creates playlist based on url that was passed in the intent,
* e.g. http://www.jamendo.com/pl/track/325654 or http://www.jamendo.com/pl/album/7505
*
* @author Lukasz Wisniewski
*/
private class UriLoadingDialog extends LoadingDialog<Void, Playlist>{
public UriLoadingDialog(Activity activity, int loadingMsg, int failMsg) {
super(activity, loadingMsg, failMsg);
}
@Override
public Playlist doInBackground(Void... params) {
Playlist playlist = null;
Intent intent = getIntent();
String action = intent.getAction();
if(Intent.ACTION_VIEW.equals(action)){
playlist = new Playlist();
List<String> segments = intent.getData().getPathSegments();
String mode = segments.get((segments.size()-2));
int id = Integer.parseInt(segments.get((segments.size()-1)));
JamendoGet2Api service = new JamendoGet2ApiImpl();
if(mode.equals("track")){
try {
Track[] tracks = service.getTracksByTracksId(new int[]{id}, JamendoApplication.getInstance().getStreamEncoding());
Album[] albums = service.getAlbumsByTracksId(new int[]{id});
playlist.addTracks(tracks, albums[0]);
} catch (JSONException e) {
Log.e(JamendoApplication.TAG, "sth went completely wrong");
PlayerActivity.this.finish();
e.printStackTrace();
} catch (WSError e){
publishProgress(e);
}
}
if(mode.equals("album")){
try {
Album album = service.getAlbumById(id);
Track[] tracks = service.getAlbumTracks(album, JamendoApplication.getInstance().getStreamEncoding());
playlist.addTracks(tracks, album);
} catch (JSONException e) {
Log.e("jamendroid", "sth went completely wrong");
PlayerActivity.this.finish();
e.printStackTrace();
} catch (WSError e){
publishProgress(e);
}
}
}
intent.putExtra("handled", true);
return playlist;
}
@Override
public void doStuffWithResult(Playlist result) {
loadPlaylist(result);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_MENU){
mSlidingDrawer.animateToggle();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void albumClickHandler(View target) {
AlbumActivity.launch(this, getPlayerEngine().getPlaylist().getSelectedTrack().getAlbum());
}
public void artistClickHandler(View target) {
ArtistActivity.launch(this, getPlayerEngine().getPlaylist().getSelectedTrack().getAlbum().getArtistName());
}
public void playlistClickHandler(View target) {
PlaylistActivity.launch(this, false);
}
public void homeClickHandler(View target) {
Intent intent = new Intent(this, HomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
public void addOnClick(View v) {
AddToPlaylistDialog dialog = new AddToPlaylistDialog(PlayerActivity.this);
dialog.setPlaylistEntry(getPlayerEngine().getPlaylist().getSelectedTrack());
dialog.show();
mSlidingDrawer.animateClose();
}
public void lyricsOnClick(View v) {
Track track = getPlayerEngine().getPlaylist().getSelectedTrack().getTrack();
new LyricsDialog(PlayerActivity.this, track).show();
mSlidingDrawer.animateClose();
}
public void downloadOnClick(View v) {
AlertDialog alertDialog = new AlertDialog.Builder(PlayerActivity.this)
.setTitle(R.string.download_track_q)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Helper.addToDownloads(PlayerActivity.this, getPlayerEngine().getPlaylist().getSelectedTrack());
}
})
.setNegativeButton(R.string.cancel, null)
.create();
alertDialog.show();
mSlidingDrawer.animateClose();
}
public void shareOnClick(View v) {
if(mPlaylist == null || mPlaylist.getSelectedTrack() == null){
return;
}
PlaylistEntry entry = mPlaylist.getSelectedTrack();
Helper.share(PlayerActivity.this, entry);
mSlidingDrawer.animateClose();
}
License mLicense;
/**
* do background JamendoGet2Api.getAlbumLicense
*
* @author Lukasz Wisniewski
*/
private class LicenseTask extends AsyncTask<Album, WSError, License>{
public LicenseTask(Album newAlbum, Album oldAlbum){
boolean runQuery = true;
if(oldAlbum != null && newAlbum.getId() == oldAlbum.getId()){
runQuery = false;
}
if(runQuery){
this.execute(newAlbum);
}
}
@Override
protected void onPreExecute() {
mLicenseImageView.setImageResource(R.drawable.cc_loading);
super.onPreExecute();
}
@Override
public License doInBackground(Album... params) {
JamendoGet2Api service = new JamendoGet2ApiImpl();
try {
return service.getAlbumLicense(params[0]);
} catch (WSError e) {
return null;
}
}
@Override
public void onPostExecute(License result) {
super.onPostExecute(result);
mLicense = result;
if(mLicense != null){
mLicenseImageView.setImageUrl(mLicense.getImage());
}
}
@Override
protected void onProgressUpdate(WSError... values) {
Toast.makeText(PlayerActivity.this, values[0].getMessage(), Toast.LENGTH_LONG).show();
super.onProgressUpdate(values);
}
};
public void licenseClickHandler(View v) {
if(mLicense != null){
Intent myIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse(mLicense.getUrl()));
startActivity(myIntent);
}
}
public class CupcakeListener implements OnClickListener{
public CupcakeListener(){
// icons
findViewById(R.id.SliderHome).setOnClickListener(this);
findViewById(R.id.SliderAlbum).setOnClickListener(this);
findViewById(R.id.SliderArtist).setOnClickListener(this);
findViewById(R.id.SliderPlaylist).setOnClickListener(this);
// buttons
findViewById(R.id.SliderLyrics).setOnClickListener(this);
findViewById(R.id.SliderAddToPlaylist).setOnClickListener(this);
findViewById(R.id.SliderShare).setOnClickListener(this);
findViewById(R.id.SliderDownload).setOnClickListener(this);
// license
if(mLicenseImageView != null){
mLicenseImageView.setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
switch(v.getId()){
// icons
case R.id.SliderHome:
homeClickHandler(v);
break;
case R.id.SliderAlbum:
albumClickHandler(v);
break;
case R.id.SliderArtist:
artistClickHandler(v);
break;
case R.id.SliderPlaylist:
playlistClickHandler(v);
break;
// buttons
case R.id.SliderLyrics:
lyricsOnClick(v);
break;
case R.id.SliderAddToPlaylist:
addOnClick(v);
break;
case R.id.SliderShare:
shareOnClick(v);
break;
case R.id.SliderDownload:
downloadOnClick(v);
break;
// license
case R.id.LicenseImageView:
licenseClickHandler(v);
break;
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论