/*
* 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.TvShowListController;
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.ITvShowManager;
import org.xbmc.api.object.Actor;
import org.xbmc.api.object.TvShow;
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.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.ContextMenu.ContextMenuInfo;
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;
public class TvShowDetailsActivity 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 TvShowDetailsController mTvShowDetailsController;
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 TvShowDetailsActivity() {
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) {
TvShowDetailsActivity.super.onKeyDown(keyCode, event);
}
});
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tvdetails);
// 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 TvShow show = (TvShow)getIntent().getSerializableExtra(ListController.EXTRA_TVSHOW);
mTvShowDetailsController = new TvShowDetailsController(this, show);
((TextView)findViewById(R.id.titlebar_text)).setText(show.getName());
Log.i("EpisodeDetailsActivity", "rating = " + show.rating + ", index = " + ((int)Math.round(show.rating % 10)) + ".");
if (show.rating > -1) {
((ImageView)findViewById(R.id.tvdetails_rating_stars)).setImageResource(sStarImages[(int)Math.round(show.rating % 10)]);
}
((TextView)findViewById(R.id.tvdetails_first_aired)).setText(show.firstAired);
((TextView)findViewById(R.id.tvdetails_genre)).setText(show.genre);
((TextView)findViewById(R.id.tvdetails_rating)).setText(String.valueOf(show.rating));
mTvShowDetailsController.setupPlayButton((Button)findViewById(R.id.tvdetails_playbutton));
mTvShowDetailsController.loadCover((ImageView)findViewById(R.id.tvdetails_thumb));
mTvShowDetailsController.updateTvShowDetails(
(TextView)findViewById(R.id.tvdetails_episodes),
(TextView)findViewById(R.id.tvdetails_studio),
(TextView)findViewById(R.id.tvdetails_parental),
(TextView)findViewById(R.id.tvdetails_plot),
(LinearLayout)findViewById(R.id.tvdetails_datalayout));
mConfigurationManager = ConfigurationManager.getInstance(this);
}
private static class TvShowDetailsController extends AbstractController implements INotifiableController, IController {
private ITvShowManager mShowManager;
private IControlManager mControlManager;
private final TvShow mShow;
TvShowDetailsController(Activity activity, TvShow show) {
super.onCreate(activity, new Handler());
mActivity = activity;
mShow = show;
mShowManager = ManagerFactory.getTvManager(this);
mControlManager = ManagerFactory.getControlManager(this);
}
public void setupPlayButton(Button button) {
button.setText("Play Show");
button.setEnabled(false);
}
public void loadCover(final ImageView imageView) {
mShowManager.getCover(new DataResponse<Bitmap>() {
public void run() {
if (value == null) {
imageView.setImageResource(R.drawable.nocover);
} else {
imageView.setImageBitmap(value);
}
}
}, mShow, ThumbSize.BIG, null, mActivity.getApplicationContext(), false);
}
public void updateTvShowDetails(final TextView episodesVew, final TextView studioView, final TextView parentalView, final TextView plotView, final LinearLayout dataLayout) {
mShowManager.updateTvShowDetails(new DataResponse<TvShow>() {
public void run() {
final TvShow show = value;
episodesVew.setText(show.numEpisodes + " (" + show.watchedEpisodes + " Watched - " + (show.numEpisodes - show.watchedEpisodes) + " Unwatched)");
studioView.setText(show.network);
parentalView.setText(show.contentRating.equals("") ? NO_DATA : show.contentRating);
plotView.setText(show.summary.equals("") ? NO_DATA : show.summary);
if (show.actors != null) {
final LayoutInflater inflater = mActivity.getLayoutInflater();
for (Actor actor : show.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));
mShowManager.getCover(new DataResponse<Bitmap>() {
public void run() {
if (value != null) {
((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 TvShowListController());
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;
// final FiveLabelsItemView view = (FiveLabelsItemView)((AdapterContextMenuInfo)menuInfo).targetView;
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);
}
}
}
}, mShow, mActivity.getApplicationContext());
}
public void onActivityPause() {
mShowManager.setController(null);
// mShowManager.postActivity();
mControlManager.setController(null);
}
public void onActivityResume(Activity activity) {
mShowManager.setController(this);
mControlManager.setController(this);
}
}
@Override
protected void onResume() {
super.onResume();
mTvShowDetailsController.onActivityResume(this);
mConfigurationManager.onActivityResume(this);
}
@Override
protected void onPause() {
super.onPause();
mTvShowDetailsController.onActivityPause();
mConfigurationManager.onActivityPause();
}
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
Intent intent = new Intent(TvShowDetailsActivity.this, HomeActivity.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean handled = (mKeyTracker != null)?mKeyTracker.doKeyUp(keyCode, event):false;
return handled || super.onKeyUp(keyCode, event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
IEventClientManager client = ManagerFactory.getEventClientManager(mTvShowDetailsController);
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);
}
}