// Copyright 2011 UPM-GSI: Group of Intelligent Systems - // - Universidad Politécnica de Madrid (UPM) // // 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 es.upm.dit.gsi.noticiastvi.gtv; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Html; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.CheckBox; import android.widget.Gallery; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import android.widget.VideoView; import es.upm.dit.gsi.noticiastvi.gtv.account.Account; import es.upm.dit.gsi.noticiastvi.gtv.adapter.GalleryAdapter; import es.upm.dit.gsi.noticiastvi.gtv.item.Item; import es.upm.dit.gsi.noticiastvi.gtv.item.ItemList; import es.upm.dit.gsi.noticiastvi.gtv.item.SetRemoveFavoriteThread; /** * Video player activity. * It also shows additional info, has rating capabilities, etc * * @author Antonio Prada <toniprada@gmail.com> * */ public class ItemPlayerActivity extends Activity implements OnClickListener, OnCompletionListener { private Context mContext; private InfoPanel mInfoPanel; private ItemListPanel mListPanel; private ItemList mItemList; private CheckBox mStar; private VideoView mVideoView; private ScrollView mNewsView; // private TextView mNewTitle; // private TextView mNewSubtitle; // private TextView mNewText; // private ImageView mImage; private Account mAccount; // private MediaController mc; private static final String TAG = "VideoPlayerActivity"; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.player); mContext = this; mInfoPanel = new InfoPanel(this); Intent i = getIntent(); String title = i.getStringExtra(NoticiasTVIActivity.TITLE); mItemList = (ItemList) i.getSerializableExtra(ItemList.EXTRA); mListPanel = new ItemListPanel(this, mItemList, title ); Bundle b = i.getBundleExtra(Account.ACCOUNT); mAccount = new Account(b.getInt(Account.ID), b.getString(Account.NAME)); mStar = (CheckBox) findViewById(R.id.star); setInfo(); } @Override public void onResume() { super.onResume(); initViews(); playItem(); } private void initViews() { // Setting video: mVideoView = (VideoView) findViewById(R.id.videoView); // Starting video: mVideoView.setClickable(true); mVideoView.setOnClickListener(this); mVideoView.setOnCompletionListener(this); mVideoView.setVisibility(View.GONE); // Init news mNewsView = (ScrollView) findViewById(R.id.scrollViewNews); mNewsView.setVisibility(View.GONE); // mNewTitle = (TextView) findViewById(R.id.textTitle); // mNewSubtitle = (TextView) findViewById(R.id.textSubtitle); // mNewText = (TextView) findViewById(R.id.text); // mImage = (ImageView) findViewById(R.id.image); } public void playItem() { // Type type = mItemList.getSelectedItem().getType(); // if ( type == Type.VIDEO) { ProgressDialog pd = ProgressDialog.show(mContext, mContext .getText(R.string.please_wait), mContext .getText(R.string.getting_videos), true, false); mVideoView.setVideoPath(mItemList.getSelectedItem().getVideo().replace(".flv", ".mp4")); mNewsView.setVisibility(View.GONE); mVideoView.setVisibility(View.VISIBLE); mInfoPanel.enable(); mVideoView.requestFocus(); mVideoView.start(); pd.dismiss(); // } else if (type == Type.PIECEOFNEWS) { // mVideoView.setVisibility(View.GONE); // mNewsView.setVisibility(View.VISIBLE); // mInfoPanel.disable(); // PieceOfNews p = (PieceOfNews) mItemList.getSelectedItem(); // mNewTitle.setText(p.getNombre()); // mNewSubtitle.setText(p.getAutor()); // mNewText.setText(p.getContenido()); // ImageDownloader imageDowloader = ImageDownloaderSingleton.getImageDownloader(); // imageDowloader.download(p.getCaptura(), mImage); // } } private void changeVideoDiff(int diff) { changeVideoTo(mItemList.getSelected() + diff); } private void changeVideoTo(int position) { if (mItemList.setSelected(position)) { mListPanel.hide(); mInfoPanel.hide(); setInfo(); mListPanel.setSelection(position); playItem(); mInfoPanel.show(); } } private void setInfo() { Item i = mItemList.getSelectedItem(); mInfoPanel.setInfo(i); } @Override public void onCompletion(MediaPlayer mp) { changeVideoDiff(1); } @Override public void onClick(View v) { handleKeyCode(KeyEvent.KEYCODE_DPAD_CENTER); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (handleKeyCode(keyCode)) { return true; } else { return super.onKeyDown(keyCode, event); } } private boolean handleKeyCode(int keyCode) { if (mListPanel.isVisible()) { if (mListPanel.handleKey(keyCode)) { return true; } } else if (mInfoPanel.isVisible()) { if (mInfoPanel.handleKey(keyCode)) { return true; } } else { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: mInfoPanel.show(); return true; case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: mListPanel.show(); return true; } } switch (keyCode) { case KeyEvent.KEYCODE_BOOKMARK: favorite(); return true; case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: case KeyEvent.KEYCODE_MEDIA_NEXT: changeVideoDiff(1); return true; case KeyEvent.KEYCODE_MEDIA_REWIND: case KeyEvent.KEYCODE_MEDIA_PREVIOUS: changeVideoDiff(-1); return true; case KeyEvent.KEYCODE_MEDIA_PAUSE: // if (mItemList.getSelectedItem().getType() == Type.VIDEO) { pause(); // } return true; case KeyEvent.KEYCODE_MEDIA_PLAY: // if (mItemList.getSelectedItem().getType() == Type.VIDEO) { play(); // } return true; default: return false; } } private void pause() { Toast.makeText(mContext, getText(R.string.paused), Toast.LENGTH_SHORT).show(); mVideoView.pause(); } private void play() { Toast.makeText(mContext, getText(R.string.started), Toast.LENGTH_SHORT).show(); mVideoView.start(); } private void favorite() { Log.i("favorite", "favorite"); String action; final boolean remove; if (mStar.isChecked()) { action = SetRemoveFavoriteThread.REMOVE; remove = true; } else { action = SetRemoveFavoriteThread.SET; remove = false; } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case SetRemoveFavoriteThread.RESULT_OK: if (remove) { mStar.setChecked(false); Toast.makeText(mContext, getText(R.string.deleted_favorite), Toast.LENGTH_LONG).show(); } else { mStar.setChecked(true); Toast.makeText(mContext, getText(R.string.added_favorite), Toast.LENGTH_LONG).show(); } break; case SetRemoveFavoriteThread.RESULT_ERROR: Toast.makeText(mContext, getText(R.string.error_favorite), Toast.LENGTH_SHORT).show(); break; } } }; SetRemoveFavoriteThread favoriteThread = new SetRemoveFavoriteThread(handler, mItemList.getSelectedItem().getId(), mAccount.getId(), action); favoriteThread.start(); } private class ItemListPanel { private LinearLayout panel; private Animation appear; private Animation disappear; private boolean visible; private GalleryAdapter mAdapter; private Gallery gallery; public ItemListPanel(Context context , ItemList videoList, String title) { panel = (LinearLayout) findViewById(R.id.linearVideoList); panel.setVisibility(View.GONE); visible = false; appear = AnimationUtils.loadAnimation(context, R.anim.appear); disappear = AnimationUtils.loadAnimation(context, R.anim.disappear); TextView titleView = (TextView)findViewById(R.id.textViewTitle); titleView.setText(title); gallery = (Gallery)findViewById(R.id.gallery); mAdapter = new GalleryAdapter(context, videoList.getVideos()); gallery.setAdapter(mAdapter); setSelection(videoList.getSelected()); gallery.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(final AdapterView<?> parent, final View v, final int position, final long id) { Log.i(TAG, "Gallery: selected " + position); changeVideoTo(position); } }); gallery.setOnItemSelectedListener( new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapter, View selectedView, int position, long arg3) { int first = gallery.getFirstVisiblePosition(); int last = gallery.getLastVisiblePosition(); for (int i = 0; i <= (last - first); i++) { View v = gallery.getChildAt(i); mAdapter.nonSelectedTransformation(v); } mAdapter.selectedTransformation(selectedView); } @Override public void onNothingSelected(AdapterView<?> arg0) { Log.w(TAG , "Gallery: nothing selected"); } }); } public void setSelection(int position) { gallery.setSelection(position, false); View v = gallery.getChildAt(position - gallery.getFirstVisiblePosition()); mAdapter.selectedTransformation(v); } public boolean handleKey(int keyCode) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_BACK: hide(); return true; default: return false; } } public void show() { if (!isVisible()) { clearAnim(); panel.startAnimation(appear); panel.setVisibility(View.VISIBLE); visible = true; gallery.requestFocus(); } } public void hide() { if (isVisible()) { clearAnim(); panel.startAnimation(disappear); panel.setVisibility(View.GONE); visible = false; } } private void clearAnim() { appear.reset(); disappear.reset(); panel.clearAnimation(); } public boolean isVisible() { return visible; } } /** * Panel that show info from the video, rating panel, etc. * Should be hidden if the user wants to. * * @author Antonio Prada <toniprada@gmail.com> */ private class InfoPanel { private RelativeLayout header; private LinearLayout footer; private TextView mTitle; private TextView mSubtitle; private TextView mText; private Animation headerShow; private Animation footerShow; private Animation headerHide; private Animation footerHide; private boolean visible; private boolean enabled; public InfoPanel(Context context) { header = (RelativeLayout) findViewById(R.id.header); footer = (LinearLayout) findViewById(R.id.footer); mTitle = (TextView) findViewById(R.id.videoTitle); mSubtitle = (TextView) findViewById(R.id.videoSubTitle); mText = (TextView) findViewById(R.id.videoDescription); visible = true; headerShow = AnimationUtils.loadAnimation(context, R.anim.header_show); footerShow = AnimationUtils.loadAnimation(context, R.anim.footer_show); headerHide = AnimationUtils.loadAnimation(context, R.anim.header_hide); footerHide = AnimationUtils.loadAnimation(context, R.anim.footer_hide); enabled = true; } public void setInfo(Item item) { mTitle.setText(Html.fromHtml(item.getNombre())); mSubtitle.setText(Html.fromHtml(item.getFecha() + " - " + item.getAutor())); mText.setText(Html.fromHtml(item.getContenido())); mStar.setChecked(item.getHave() == 1); } public void enable() { show(); enabled = true; } // ENABLE & DISABLE IS FOR TEXT NEWS // public void disable() { // hide(); // enabled = false; // } public boolean handleKey(int keyCode) { if (!enabled) { return false; } switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: hide(); return true; default: return false; } } private void show() { if (!enabled) { return; } if (!isVisible()) { clearAnim(); header.startAnimation(headerShow); footer.startAnimation(footerShow); header.setVisibility(View.VISIBLE); footer.setVisibility(View.VISIBLE); visible = true; } } private void hide() { if (!enabled) { return; } if (isVisible()) { clearAnim(); header.startAnimation(headerHide); footer.startAnimation(footerHide); header.setVisibility(View.GONE); footer.setVisibility(View.GONE); visible = false; } } private void clearAnim() { if (!enabled) { return; } headerShow.reset(); footerShow.reset(); header.clearAnimation(); footer.clearAnimation(); } public boolean isVisible() { return visible; } } }