package com.github.gen2brain.crtaci.fragments;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.text.SpannableString;
import android.text.style.StyleSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import com.github.gen2brain.crtaci.R;
import com.github.gen2brain.crtaci.activities.PlayerActivity;
import com.github.gen2brain.crtaci.entities.Cartoon;
import com.github.gen2brain.crtaci.utils.Utils;
import go.crtaci.Crtaci;
public class CartoonsFragment extends Fragment {
public static final String TAG = "CartoonsFragment";
private boolean twoPane;
private ArrayList<Cartoon> cartoons;
private Cartoon selectedCartoon;
private ProgressBar progressBar;
protected ImageLoader imageLoader = ImageLoader.getInstance();
public static CartoonsFragment newInstance(ArrayList<Cartoon> cartoons, boolean twoPane) {
CartoonsFragment fragment = new CartoonsFragment();
Bundle args = new Bundle();
args.putSerializable("cartoons", cartoons);
args.putBoolean("twoPane", twoPane);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(TAG, "onCreateView");
if(savedInstanceState != null) {
cartoons = (ArrayList<Cartoon>) savedInstanceState.getSerializable("cartoons");
} else {
cartoons = (ArrayList<Cartoon>) getArguments().getSerializable("cartoons");
}
twoPane = getArguments().getBoolean("twoPane");
View view = inflater.inflate(R.layout.fragment_cartoons, container, false);
if(!imageLoader.isInited()) {
File cacheDir = new File(getActivity().getCacheDir().toString());
ImageLoaderConfiguration config = new
ImageLoaderConfiguration.Builder(getActivity().getApplicationContext())
.diskCache(new UnlimitedDiskCache(cacheDir))
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.build();
imageLoader.init(config);
}
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
progressBar = (ProgressBar) view.getRootView().findViewById(R.id.progressbar);
createListView(view);
if(cartoons != null && !cartoons.isEmpty()) {
Tracker tracker = Utils.getTracker(getActivity());
tracker.setScreenName(cartoons.get(0).character);
tracker.send(new HitBuilders.ScreenViewBuilder().build());
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.d(TAG, "onSaveInstanceState");
super.onSaveInstanceState(outState);
if(cartoons != null && !cartoons.isEmpty()) {
outState.putSerializable("cartoons", cartoons);
}
}
public void createListView(View view) {
ListView listView = (ListView) view.findViewById(R.id.cartoons);
final ItemAdapter adapter = new ItemAdapter();
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context, menu);
return true;
}
@Override
public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
int id = item.getItemId();
if(id == R.id.action_download) {
for(Cartoon c: adapter.getSelectedItems()) {
new DownloadTask().execute(c.service, c.id, c.title);
}
mode.finish();
return true;
}
return false;
}
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) {
if(checked) {
adapter.selectItem(position);
} else {
adapter.unselectItem(position);
}
int count = adapter.getSelectedCount();
mode.setTitle(count + " selected");
}
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
adapter.unselectItems();
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedCartoon = cartoons.get(position);
new ExtractTask().execute(selectedCartoon.service, selectedCartoon.id);
}
});
}
class ItemAdapter extends BaseAdapter {
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
private ArrayList<Cartoon> selectedCartoons = new ArrayList<>();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(new SimpleBitmapDisplayer())
.build();
private class ViewHolder {
public TextView title;
ImageView thumbnail;
public ImageView logo;
}
@Override
public int getCount() {
if(cartoons != null) {
return cartoons.size();
} else {
return 0;
}
}
@Override
public Object getItem(int position) {
return cartoons.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
final Cartoon cartoon = cartoons.get(position);
if(convertView == null) {
LayoutInflater inflater = getLayoutInflater(null);
view = inflater.inflate(R.layout.item_list_cartoon, parent, false);
holder = new ViewHolder();
holder.title = (TextView) view.findViewById(R.id.title);
holder.thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
Typeface tf=Typeface.createFromAsset(getActivity().getAssets(), "fonts/ComicRelief.ttf");
holder.title.setTypeface(tf);
view.setTag(holder);
view.setBackgroundResource(R.drawable.item_background_cartoon);
} else {
holder = (ViewHolder) view.getTag();
}
SpannableString spanString = new SpannableString(getTitle(cartoon));
spanString.setSpan(new StyleSpan(Typeface.BOLD), 0, spanString.length(), 0);
holder.title.setText(spanString);
String thumb;
if(twoPane) {
thumb = cartoon.thumbLarge;
} else {
thumb = cartoon.thumbSmall;
}
imageLoader.displayImage(thumb, holder.thumbnail, options, animateFirstListener);
return view;
}
private String getTitle(Cartoon cartoon) {
String ch = Utils.toTitleCase(cartoon.formattedTitle);
String se = "";
if(cartoon.season != -1) {
se += String.format(Locale.ROOT, "S%02d", cartoon.season);
}
if(cartoon.episode != -1) {
se += String.format(Locale.ROOT, "E%02d", cartoon.episode);
}
if(!se.isEmpty()) {
se = " - " + se;
}
return String.format(Locale.ROOT, "%s%s (%s)", ch, se, cartoon.durationString);
}
void selectItem(int position) {
Cartoon cartoon = cartoons.get(position);
selectedCartoons.add(cartoon);
}
void unselectItem(int position) {
Cartoon cartoon = cartoons.get(position);
selectedCartoons.remove(cartoon);
}
void unselectItems() {
selectedCartoons = new ArrayList<>();
}
ArrayList<Cartoon> getSelectedItems() {
return selectedCartoons;
}
int getSelectedCount() {
return selectedCartoons.size();
}
}
private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if(loadedImage != null) {
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if(firstDisplay) {
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
}
}
}
private class ExtractTask extends AsyncTask<String, Void, String> {
protected void onPreExecute() {
super.onPreExecute();
if(progressBar != null) {
progressBar.setVisibility(View.VISIBLE);
}
}
protected String doInBackground(String... params) {
String service = params[0];
String videoId = params[1];
String result = null;
try {
result = Crtaci.extract(service, videoId);
} catch(Exception e) {
e.printStackTrace();
}
if(result == null || result.equals("empty")) {
try {
result = Crtaci.extract(service, videoId);
} catch(Exception e) {
e.printStackTrace();
}
}
if(result == null) {
return null;
} else if(result.equals("empty")) {
return "empty";
}
return result;
}
protected void onPostExecute(String results) {
Log.d(TAG, "onPostExecute");
if(progressBar != null) {
progressBar.setVisibility(View.GONE);
}
Activity activity = getActivity();
if(activity != null) {
if(results != null && !results.equals("empty")) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
String player = prefs.getString("player", "default");
if(player.equals("external")) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(results), "video/*");
startActivity(intent);
} else {
Intent intent = new Intent(activity, PlayerActivity.class);
intent.putExtra("video", results);
intent.putExtra("cartoon", selectedCartoon);
startActivity(intent);
}
} else if(results != null && results.equals("empty")) {
Toast.makeText(getActivity(), getString(R.string.error_video), Toast.LENGTH_LONG).show();
}
}
}
}
private class DownloadTask extends AsyncTask<String, Void, String> {
private String title;
protected String doInBackground(String... params) {
String service = params[0];
String videoId = params[1];
title = params[2];
String result = null;
try {
result = Crtaci.extract(service, videoId);
} catch(Exception e) {
e.printStackTrace();
}
if(result == null) {
return null;
} else if(result.equals("empty")) {
return "empty";
}
return result;
}
protected void onPostExecute(String results) {
Log.d(TAG, "onPostExecute");
if(results != null && !results.equals("empty")) {
Utils.downloadVideo(getActivity(), results, title);
}
}
}
}