/*
* Copyright (C) 2005-2009 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC Remote; see the file license. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
* http://www.gnu.org/copyleft/gpl.html
*
*/
package org.xbmc.android.remote.presentation.activity;
import org.xbmc.android.remote.R;
import org.xbmc.android.remote.business.ManagerFactory;
import org.xbmc.android.remote.presentation.controller.AbstractController;
import org.xbmc.android.remote.presentation.controller.IController;
import org.xbmc.android.remote.presentation.controller.ListController;
import org.xbmc.android.remote.presentation.controller.MovieListController;
import org.xbmc.android.remote.presentation.widget.JewelView;
import org.xbmc.android.util.KeyTracker;
import org.xbmc.android.util.KeyTracker.Stage;
import org.xbmc.android.util.OnLongPressBackKeyTracker;
import org.xbmc.api.business.DataResponse;
import org.xbmc.api.business.IControlManager;
import org.xbmc.api.business.IEventClientManager;
import org.xbmc.api.business.IVideoManager;
import org.xbmc.api.object.Actor;
import org.xbmc.api.object.Movie;
import org.xbmc.api.presentation.INotifiableController;
import org.xbmc.api.type.ThumbSize;
import org.xbmc.eventclient.ButtonCodes;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build.VERSION;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MovieDetailsActivity extends Activity {
private static final String NO_DATA = "-";
public static final int CAST_CONTEXT_IMDB = 1;
private static View selectedView;
private static Actor selectedAcotr;
private ConfigurationManager mConfigurationManager;
private MovieDetailsController mMovieDetailsController;
private KeyTracker mKeyTracker;
private static final int[] sStarImages = { R.drawable.stars_0, R.drawable.stars_1, R.drawable.stars_2, R.drawable.stars_3, R.drawable.stars_4, R.drawable.stars_5, R.drawable.stars_6, R.drawable.stars_7, R.drawable.stars_8, R.drawable.stars_9, R.drawable.stars_10 };
public MovieDetailsActivity() {
if(Integer.parseInt(VERSION.SDK) < 5) {
mKeyTracker = new KeyTracker(new OnLongPressBackKeyTracker() {
@Override
public void onLongPressBack(int keyCode, KeyEvent event,
Stage stage, int duration) {
onKeyLongPress(keyCode, event);
}
@Override
public void onShortPressBack(int keyCode, KeyEvent event,
Stage stage, int duration) {
MovieDetailsActivity.super.onKeyDown(keyCode, event);
}
});
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.moviedetails);
// set display size
final Display display = getWindowManager().getDefaultDisplay();
ThumbSize.setScreenSize(display.getWidth(), display.getHeight());
// remove nasty top fading edge
FrameLayout topFrame = (FrameLayout)findViewById(android.R.id.content);
topFrame.setForeground(null);
final Movie movie = (Movie)getIntent().getSerializableExtra(ListController.EXTRA_MOVIE);
mMovieDetailsController = new MovieDetailsController(this, movie);
((TextView)findViewById(R.id.titlebar_text)).setText(movie.getName());
Log.i("MovieDetailsActivity", "rating = " + movie.rating + ", index = " + ((int)Math.round(movie.rating % 10)) + ".");
if (movie.rating > -1) {
((ImageView)findViewById(R.id.moviedetails_rating_stars)).setImageResource(sStarImages[(int)Math.round(movie.rating % 10)]);
}
((TextView)findViewById(R.id.moviedetails_director)).setText(movie.director);
((TextView)findViewById(R.id.moviedetails_genre)).setText(movie.genres);
((TextView)findViewById(R.id.moviedetails_runtime)).setText(movie.runtime);
((TextView)findViewById(R.id.moviedetails_rating)).setText(String.valueOf(movie.rating));
mMovieDetailsController.setupPlayButton((Button)findViewById(R.id.moviedetails_playbutton));
mMovieDetailsController.loadCover((JewelView)findViewById(R.id.moviedetails_jewelcase));
mMovieDetailsController.updateMovieDetails(new Handler(),
(TextView)findViewById(R.id.moviedetails_rating_numvotes),
(TextView)findViewById(R.id.moviedetails_studio),
(TextView)findViewById(R.id.moviedetails_plot),
(TextView)findViewById(R.id.moviedetails_parental),
(Button)findViewById(R.id.moviedetails_trailerbutton),
(LinearLayout)findViewById(R.id.moviedetails_datalayout));
mConfigurationManager = ConfigurationManager.getInstance(this);
}
private static class MovieDetailsController extends AbstractController implements INotifiableController, IController {
private IVideoManager mVideoManager;
private IControlManager mControlManager;
private final Movie mMovie;
MovieDetailsController(Activity activity, Movie movie) {
super.onCreate(activity, new Handler());
mActivity = activity;
mMovie = movie;
mVideoManager = ManagerFactory.getVideoManager(this);
mControlManager = ManagerFactory.getControlManager(this);
}
public void setupPlayButton(Button button) {
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mControlManager.playFile(new DataResponse<Boolean>() {
public void run() {
if (value) {
mActivity.startActivity(new Intent(mActivity, NowPlayingActivity.class));
}
}
}, mMovie.getPath(), 1, mActivity.getApplicationContext());
}
});
}
public void loadCover(final JewelView jewelView) {
mVideoManager.getCover(new DataResponse<Bitmap>() {
public void run() {
if (value != null) {
jewelView.setCover(value);
}
}
}, mMovie, ThumbSize.BIG, null, mActivity.getApplicationContext(), false);
}
public void updateMovieDetails(final Handler handler, final TextView numVotesView, final TextView studioView, final TextView plotView, final TextView parentalView, final Button trailerButton, final LinearLayout dataLayout) {
mVideoManager.updateMovieDetails(new DataResponse<Movie>() {
public void run() {
final Movie movie = value;
if (movie == null) {
Log.w(TAG, "updateMovieDetails: value is null.");
return;
}
numVotesView.setText(movie.numVotes > 0 ? " (" + movie.numVotes + " votes)" : "");
studioView.setText(movie.studio.equals("") ? NO_DATA : movie.studio);
plotView.setText(movie.plot.equals("") ? NO_DATA : movie.plot);
parentalView.setText(movie.rated.equals("") ? NO_DATA : movie.rated);
if (movie.trailerUrl != null && !movie.trailerUrl.equals("")) {
trailerButton.setEnabled(true);
trailerButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mControlManager.playFile(new DataResponse<Boolean>() {
public void run() {
if (value) {
Toast toast = Toast.makeText(mActivity, "Playing trailer for \"" + movie.getName() + "\"...", Toast.LENGTH_LONG);
toast.show();
}
}
}, movie.trailerUrl, 1, mActivity.getApplicationContext());
}
});
}
if (movie.actors != null) {
final LayoutInflater inflater = mActivity.getLayoutInflater();
//int n = 0;
for (Actor actor : movie.actors) {
final View view = inflater.inflate(R.layout.actor_item, null);
((TextView)view.findViewById(R.id.actor_name)).setText(actor.name);
((TextView)view.findViewById(R.id.actor_role)).setText("as " + actor.role);
ImageButton img = ((ImageButton)view.findViewById(R.id.actor_image));
mVideoManager.getCover(new DataResponse<Bitmap>() {
public void run() {
if (value != null) {
handler.post(new Runnable() {
public void run() {
((ImageButton)view.findViewById(R.id.actor_image)).setImageBitmap(value);
}
});
}
}
}, actor, ThumbSize.SMALL, null, mActivity.getApplicationContext(), false);
img.setTag(actor);
img.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent nextActivity;
Actor actor = (Actor)v.getTag();
nextActivity = new Intent(view.getContext(), ListActivity.class);
nextActivity.putExtra(ListController.EXTRA_LIST_CONTROLLER, new MovieListController());
nextActivity.putExtra(ListController.EXTRA_ACTOR, actor);
mActivity.startActivity(nextActivity);
}
});
img.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
selectedAcotr = (Actor) v.getTag();
selectedView = v;
menu.setHeaderTitle(selectedAcotr.getShortName());
menu.add(0, CAST_CONTEXT_IMDB, 1, "Open IMDb").setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Intent intentIMDb = new Intent(Intent.ACTION_VIEW, Uri.parse("imdb:///find?s=nm&q=" + selectedAcotr.getName()));
if (selectedView.getContext().getPackageManager().resolveActivity(intentIMDb, PackageManager.MATCH_DEFAULT_ONLY) == null)
{
intentIMDb = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.imdb.com/find?s=nm&q=" + selectedAcotr.getName()));
}
selectedView.getContext().startActivity(intentIMDb);
return false;
}
});
}
});
dataLayout.addView(view);
//n++;
}
}
}
}, mMovie, mActivity.getApplicationContext());
}
public void onActivityPause() {
mVideoManager.setController(null);
mVideoManager.postActivity();
mControlManager.setController(null);
}
public void onActivityResume(Activity activity) {
mVideoManager.setController(this);
mControlManager.setController(this);
}
}
@Override
protected void onResume() {
super.onResume();
mMovieDetailsController.onActivityResume(this);
mConfigurationManager.onActivityResume(this);
}
@Override
protected void onPause() {
super.onPause();
mMovieDetailsController.onActivityPause();
mConfigurationManager.onActivityPause();
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean handled = (mKeyTracker != null)?mKeyTracker.doKeyUp(keyCode, event):false;
return handled || super.onKeyUp(keyCode, event);
}
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
Intent intent = new Intent(MovieDetailsActivity.this, HomeActivity.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
IEventClientManager client = ManagerFactory.getEventClientManager(mMovieDetailsController);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
client.sendButton("R1", ButtonCodes.REMOTE_VOLUME_PLUS, false, true, true, (short)0, (byte)0);
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
client.sendButton("R1", ButtonCodes.REMOTE_VOLUME_MINUS, false, true, true, (short)0, (byte)0);
return true;
}
client.setController(null);
boolean handled = (mKeyTracker != null)?mKeyTracker.doKeyDown(keyCode, event):false;
return handled || super.onKeyDown(keyCode, event);
}
}