/*******************************************************************************
* Copyright 2012 Crazywater
*
* 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 de.knufficast.ui.episode;
import java.util.ArrayList;
import java.util.List;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import de.knufficast.App;
import de.knufficast.R;
import de.knufficast.flattr.FlattrApi;
import de.knufficast.logic.db.DBEpisode;
import de.knufficast.logic.db.DBFeed;
import de.knufficast.logic.db.Database;
import de.knufficast.logic.db.SQLiteHelper;
import de.knufficast.logic.db.DBEpisode.FlattrState;
import de.knufficast.ui.main.MainActivity;
import de.knufficast.ui.settings.SettingsActivity;
import de.knufficast.util.BooleanCallback;
import de.knufficast.util.NetUtil;
import de.knufficast.watchers.QueueDownloader;
/**
* An activity that displays details about episodes, either in a feed or the
* queue. The user can flick through the different episodes.
*
* @author crazywater
*/
public class EpisodeDetailActivity extends FragmentActivity {
// The episode that should be the current one upon invoking this activity.
public static final String EPISODE_ID_INTENT = "episodeIdIntent";
// Request paging through the queue instead of paging through the feed.
public static final String REQUEST_QUEUE_PAGING_INTENT = "queuePagingIntent";
private Database db;
private DBEpisode currentEpisode;
private ViewPager viewPager;
private EpisodesPagerAdapter sectionsPagerAdapter;
private final List<DBEpisode> episodes = new ArrayList<DBEpisode>();
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_episode_detail, menu);
return true;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_episode_detail);
getActionBar().setDisplayHomeAsUpEnabled(true);
db = App.get().getDB();
Long episodeId = getIntent().getExtras().getLong(EPISODE_ID_INTENT);
boolean queuePaging = getIntent().getExtras().getBoolean(
REQUEST_QUEUE_PAGING_INTENT);
episodes.clear();
currentEpisode = new DBEpisode(episodeId);
if (queuePaging) {
// if we have queue paging, set the episodes according to the queue
episodes.addAll(App.get().getQueue().asList());
} else {
// we have feed paging, page through the feed
List<Long> ids = db.query(SQLiteHelper.TABLE_EPISODES,
SQLiteHelper.C_EP_FEED_ID,
String.valueOf(currentEpisode.getFeed().getId()));
for (long id : ids) {
episodes.add(new DBEpisode(id));
}
}
}
@Override
public void onStart() {
super.onStart();
viewPager = (ViewPager) findViewById(R.id.episode_detail_pager);
sectionsPagerAdapter = new EpisodesPagerAdapter(
getSupportFragmentManager(), currentEpisode.getFeed());
viewPager.setAdapter(sectionsPagerAdapter);
viewPager.setCurrentItem(episodes.indexOf(currentEpisode));
viewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
currentEpisode = episodes.get(position);
requestFlattrUpdate();
}
});
}
private void requestFlattrUpdate() {
if (currentEpisode.hasFlattr()) {
NetUtil netUtil = new NetUtil(this);
if (netUtil.isOnline()) {
// check if the flattr state has changed
FlattrApi flattrApi = new FlattrApi();
final DBEpisode episode = currentEpisode;
flattrApi.isFlattred(episode.getFlattrUrl(),
new BooleanCallback<Boolean, String>() {
@Override
public void success(Boolean flattred) {
if (episode.getFlattrState() != FlattrState.ENQUEUED
|| flattred) {
episode.setFlattrState(flattred ? FlattrState.FLATTRED
: FlattrState.NONE);
}
}
@Override
public void fail(String error) {
// do nothing, might just not have a good connection...
}
});
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// The Android way to ensure correct behavior of the "Up" button in the
// action bar
Intent parentActivityIntent = new Intent(this, MainActivity.class);
parentActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();
return true;
case R.id.menu_flattr:
currentEpisode.setFlattrState(FlattrState.ENQUEUED);
App.get().getFlattrQueue().enqueue(currentEpisode);
return true;
case R.id.menu_settings:
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
case R.id.menu_delete_download:
QueueDownloader.get().deleteDownload(currentEpisode);
return true;
}
return super.onOptionsItemSelected(item);
}
public class EpisodesPagerAdapter extends FragmentPagerAdapter {
public EpisodesPagerAdapter(FragmentManager fm, DBFeed feed) {
super(fm);
}
@Override
public Fragment getItem(int i) {
EpisodeDetailFragment fragment = new EpisodeDetailFragment();
fragment.setEpisode(episodes.get(i));
return fragment;
}
@Override
public int getCount() {
return episodes.size();
}
@Override
public CharSequence getPageTitle(int position) {
return episodes.get(position).getTitle();
}
}
}