package com.battlelancer.seriesguide.ui;
import android.app.SearchManager;
import android.content.Intent;
import android.graphics.drawable.GradientDrawable;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.battlelancer.seriesguide.Constants;
import com.battlelancer.seriesguide.R;
import com.battlelancer.seriesguide.adapters.TabStripAdapter;
import com.battlelancer.seriesguide.dataliberation.model.Show;
import com.battlelancer.seriesguide.sync.SgSyncAdapter;
import com.battlelancer.seriesguide.ui.dialogs.RemoveShowDialogFragment;
import com.battlelancer.seriesguide.util.DBUtils;
import com.battlelancer.seriesguide.util.RemoveShowWorkerFragment;
import com.battlelancer.seriesguide.util.Shadows;
import com.battlelancer.seriesguide.widgets.SlidingTabLayout;
import com.uwetrottmann.androidutils.AndroidUtils;
import java.lang.ref.WeakReference;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
* Hosts an {@link OverviewFragment}.
*/
public class OverviewActivity extends BaseNavDrawerActivity {
public static final String EXTRA_INT_SHOW_TVDBID = OverviewFragment.ARG_INT_SHOW_TVDBID;
public static final int SHOW_LOADER_ID = 100;
public static final int SHOW_CREDITS_LOADER_ID = 101;
public static final int OVERVIEW_EPISODE_LOADER_ID = 102;
public static final int OVERVIEW_SHOW_LOADER_ID = 103;
public static final int OVERVIEW_ACTIONS_LOADER_ID = 104;
public static final int SEASONS_LOADER_ID = 105;
// keep reference to adapter while activity is alive
@SuppressWarnings("FieldCanBeLocal") private NfcAdapter nfcAdapter;
private int showTvdbId;
@Nullable @BindView(R.id.viewOverviewShadowStart) View shadowOverviewStart;
@Nullable @BindView(R.id.viewOverviewShadowEnd) View shadowOverviewEnd;
@Nullable @BindView(R.id.viewOverviewShadowBottom) View shadowShowBottom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
ButterKnife.bind(this);
setupActionBar();
setupNavDrawer();
showTvdbId = getIntent().getIntExtra(EXTRA_INT_SHOW_TVDBID, -1);
if (showTvdbId < 0 || !DBUtils.isShowExists(this, showTvdbId)) {
finish();
return;
}
setupViews(savedInstanceState);
setupAndroidBeam();
updateShowDelayed(showTvdbId);
}
@Override
protected void setupActionBar() {
super.setupActionBar();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
private void setupViews(Bundle savedInstanceState) {
// look if we are on a multi-pane or single-pane layout...
View pagerView = findViewById(R.id.pagerOverview);
if (pagerView != null && pagerView.getVisibility() == View.VISIBLE) {
// ...single pane layout with view pager
// clear up left-over fragments from multi-pane layout
findAndRemoveFragment(R.id.fragment_overview);
findAndRemoveFragment(R.id.fragment_seasons);
setupViewPager(pagerView);
} else {
// ...multi-pane overview and seasons fragment
// clear up left-over fragments from single-pane layout
boolean isSwitchingLayouts = getActiveFragments().size() != 0;
for (Fragment fragment : getActiveFragments()) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
// attach new fragments if there are none or if we just switched
// layouts
if (savedInstanceState == null || isSwitchingLayouts) {
setupPanes();
}
}
if (shadowOverviewStart != null) {
Shadows.getInstance().setShadowDrawable(this, shadowOverviewStart,
GradientDrawable.Orientation.RIGHT_LEFT);
}
if (shadowOverviewEnd != null) {
Shadows.getInstance().setShadowDrawable(this, shadowOverviewEnd,
GradientDrawable.Orientation.LEFT_RIGHT);
}
if (shadowShowBottom != null) {
Shadows.getInstance().setShadowDrawable(this, shadowShowBottom,
GradientDrawable.Orientation.TOP_BOTTOM);
}
}
private void setupPanes() {
Fragment showsFragment = ShowFragment.newInstance(showTvdbId);
FragmentTransaction ft1 = getSupportFragmentManager().beginTransaction();
ft1.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
ft1.replace(R.id.fragment_show, showsFragment);
ft1.commit();
Fragment overviewFragment = OverviewFragment.newInstance(showTvdbId);
FragmentTransaction ft2 = getSupportFragmentManager().beginTransaction();
ft2.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
ft2.replace(R.id.fragment_overview, overviewFragment);
ft2.commit();
Fragment seasonsFragment = SeasonsFragment.newInstance(showTvdbId);
FragmentTransaction ft3 = getSupportFragmentManager().beginTransaction();
ft3.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
ft3.replace(R.id.fragment_seasons, seasonsFragment);
ft3.commit();
}
private void setupViewPager(View pagerView) {
ViewPager pager = (ViewPager) pagerView;
// setup tab strip
TabStripAdapter tabsAdapter = new TabStripAdapter(getSupportFragmentManager(), this, pager,
(SlidingTabLayout) findViewById(R.id.tabsOverview));
Bundle argsShow = new Bundle();
argsShow.putInt(ShowFragment.InitBundle.SHOW_TVDBID, showTvdbId);
tabsAdapter.addTab(R.string.show, ShowFragment.class, argsShow);
tabsAdapter.addTab(R.string.description_overview, OverviewFragment.class, getIntent()
.getExtras());
Bundle argsSeason = new Bundle();
argsSeason.putInt(SeasonsFragment.InitBundle.SHOW_TVDBID, showTvdbId);
tabsAdapter.addTab(R.string.seasons, SeasonsFragment.class, argsSeason);
tabsAdapter.notifyTabsChanged();
// select overview to be shown initially
pager.setCurrentItem(1);
}
private void findAndRemoveFragment(int fragmentId) {
Fragment overviewFragment = getSupportFragmentManager().findFragmentById(fragmentId);
if (overviewFragment != null) {
getSupportFragmentManager().beginTransaction().remove(overviewFragment).commit();
}
}
private void setupAndroidBeam() {
// Support beaming shows via Android Beam
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
nfcAdapter.setNdefPushMessageCallback(new CreateNdefMessageCallback() {
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
// send show TVDB id
return new NdefMessage(new NdefRecord[] {
createMimeRecord(
String.valueOf(showTvdbId).getBytes())
});
}
/**
* Creates a custom MIME type encapsulated in an NDEF record
*/
public NdefRecord createMimeRecord(byte[] payload) {
byte[] mimeBytes = Constants.ANDROID_BEAM_NDEF_MIME_TYPE.getBytes(
Charset.forName("US-ASCII"));
return new NdefRecord(
NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
}
}, this);
}
}
List<WeakReference<Fragment>> mFragments = new ArrayList<>();
@Override
public void onAttachFragment(Fragment fragment) {
/*
* View pager fragments have tags set by the pager, we can use this to
* only add refs to those then, making them available to get removed if
* we switch to a non-pager layout.
*/
if (fragment.getTag() != null) {
mFragments.add(new WeakReference<>(fragment));
}
}
public ArrayList<Fragment> getActiveFragments() {
ArrayList<Fragment> ret = new ArrayList<>();
for (WeakReference<Fragment> ref : mFragments) {
Fragment f = ref.get();
if (f != null) {
if (f.isAdded()) {
ret.add(f);
}
}
}
return ret;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.overview_activity_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.menu_overview_search) {
launchSearch();
return true;
}
if (itemId == R.id.menu_overview_remove_show) {
if (!SgSyncAdapter.isSyncActive(this, true)) {
RemoveShowDialogFragment.show(getSupportFragmentManager(), showTvdbId);
}
return true;
}
return super.onOptionsItemSelected(item);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(RemoveShowWorkerFragment.OnRemovingShowEvent event) {
if (event.showTvdbId == showTvdbId) {
finish(); // finish this activity if the show it displays is about to get removed
}
}
private void launchSearch() {
// refine search with the show's title
Show show = DBUtils.getShow(this, showTvdbId);
if (show != null) {
Bundle appSearchData = new Bundle();
appSearchData.putString(EpisodeSearchFragment.InitBundle.SHOW_TITLE, show.title);
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchManager.APP_DATA, appSearchData);
intent.setAction(Intent.ACTION_SEARCH);
startActivity(intent);
}
}
@Override
protected View getSnackbarParentView() {
if (AndroidUtils.isLollipopOrHigher() && getResources().getBoolean(R.bool.isSinglePane)) {
return findViewById(R.id.coordinatorLayoutOverview);
} else {
return super.getSnackbarParentView();
}
}
}