package com.dotcool.reader.fragment;
import java.util.Iterator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.view.Menu;
import com.dotcool.R;
import com.dotcool.reader.Constants;
import com.dotcool.reader.LNReaderApplication;
import com.dotcool.reader.UIHelper;
import com.dotcool.reader.adapter.BookModelAdapter;
import com.dotcool.reader.callback.ICallbackEventData;
import com.dotcool.reader.dao.NovelsDao;
import com.dotcool.reader.helper.AsyncTaskResult;
import com.dotcool.reader.helper.Util;
import com.dotcool.reader.model.BookModel;
import com.dotcool.reader.model.NovelCollectionModel;
import com.dotcool.reader.model.NovelContentModel;
import com.dotcool.reader.model.PageModel;
import com.dotcool.reader.task.DownloadNovelContentTask;
import com.dotcool.reader.task.IAsyncTaskOwner;
import com.dotcool.reader.task.LoadNovelDetailsTask;
import com.dotcool.view.BookReadActivity;
public class DisplayLightNovelDetailsFragment extends SherlockFragment implements IAsyncTaskOwner {
public static final String TAG = DisplayLightNovelDetailsFragment.class.toString();
private PageModel page;
private NovelCollectionModel novelCol;
private final NovelsDao dao = NovelsDao.getInstance(getSherlockActivity());
private BookModelAdapter bookModelAdapter;
private ExpandableListView expandList;
private DownloadNovelContentTask downloadTask = null;
private LoadNovelDetailsTask task = null;
private TextView loadingText;
private ProgressBar loadingBar;
private String touchedForDownload;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
UIHelper.SetActionBarDisplayHomeAsUp(getSherlockActivity(), true);
View view = inflater.inflate(R.layout.activity_display_light_novel_details, container, false);
// Get intent and message
page = new PageModel();
String pageTitle = getArguments().getString(Constants.EXTRA_PAGE);
if (Util.isStringNullOrEmpty(pageTitle)) {
Log.w(TAG, "Page title is empty!");
}
page.setPage(pageTitle);
try {
page = NovelsDao.getInstance(getSherlockActivity()).getPageModel(page, null);
} catch (Exception e) {
Log.e(TAG, "Error when getting Page Model for " + page.getPage(), e);
}
loadingText = (TextView) view.findViewById(R.id.emptyList);
loadingBar = (ProgressBar) view.findViewById(R.id.empttListProgress);
// setup listener
expandList = (ExpandableListView) view.findViewById(R.id.chapter_list);
registerForContextMenu(expandList);
expandList.setOnChildClickListener(new OnChildClickListener() {
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
if (novelCol != null) {
PageModel chapter = bookModelAdapter.getChild(groupPosition, childPosition);
String bookName = novelCol.getBookCollections().get(groupPosition).getTitle();
touchedForDownload = bookName + " " + chapter.getTitle();
//loadChapter(chapter);
}
return false;
}
});
expandList.setOnGroupClickListener(new OnGroupClickListener(){
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition,
long id) {
if (novelCol != null) {
BookModel chapter = bookModelAdapter.getGroup(groupPosition);
loadCotent(chapter);
}
return false;
}
});
getSherlockActivity().setTitle(page.getTitle());
setHasOptionsMenu(true);
executeTask(page, false);
return view;
}
private void loadCotent(BookModel chapter) {
downloadTask = new DownloadNovelContentTask(chapter, DisplayLightNovelDetailsFragment.this);
downloadTask.execute();
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "OnResume: " + task.getStatus().toString());
}
@Override
public void onCreateOptionsMenu(Menu menu, com.actionbarsherlock.view.MenuInflater inflater) {
inflater.inflate(R.menu.fragment_display_light_novel_details, menu);
}
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
Log.d(TAG, "menu Option called.");
switch (item.getItemId()) {
case R.id.menu_refresh_chapter_list:
Log.d(TAG, "Refreshing Details");
executeTask(page, true);
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.refreshing_detail), Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
MenuInflater inflater = getSherlockActivity().getMenuInflater();
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
inflater.inflate(R.menu.novel_details_volume_context_menu, menu);
} else if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
inflater.inflate(R.menu.novel_details_chapter_context_menu, menu);
}
}
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
if (!(item.getMenuInfo() instanceof ExpandableListView.ExpandableListContextMenuInfo))
return super.onContextItemSelected(item);
Log.d(TAG, "Context menu called");
ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
// unpacking
int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int childPosition = ExpandableListView.getPackedPositionChild(info.packedPosition);
BookModel chapter = null;
switch (item.getItemId()) {
// Volume cases
case R.id.clear_volume:
/*
* Implement code to clear this volume cache
*/
BookModel bookClear = novelCol.getBookCollections().get(groupPosition);
Toast.makeText(getSherlockActivity(), String.format(getResources().getString(R.string.toast_clear_volume), bookClear.getTitle()), Toast.LENGTH_SHORT).show();
dao.deleteBookCache(bookClear);
bookModelAdapter.notifyDataSetChanged();
return true;
case R.id.mark_volume:
/*
* Implement code to mark entire volume as read
*/
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_mark_volume), Toast.LENGTH_SHORT).show();
BookModel book2 = novelCol.getBookCollections().get(groupPosition);
for (Iterator<PageModel> iPage = book2.getChapterCollection().iterator(); iPage.hasNext();) {
PageModel page = iPage.next();
page.setFinishedRead(true);
dao.updatePageModel(page);
}
bookModelAdapter.notifyDataSetChanged();
return true;
case R.id.mark_volume2:
/*
* Implement code to mark entire volume as unread
*/
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_mark_volume2), Toast.LENGTH_SHORT).show();
BookModel ubook2 = novelCol.getBookCollections().get(groupPosition);
for (Iterator<PageModel> iPage = ubook2.getChapterCollection().iterator(); iPage.hasNext();) {
PageModel page = iPage.next();
page.setFinishedRead(false);
dao.updatePageModel(page);
}
bookModelAdapter.notifyDataSetChanged();
return true;
// Chapter cases
case R.id.download_chapter:
/*
* Implement code to download this chapter
*/
chapter = bookModelAdapter.getGroup(groupPosition);
String bookName = novelCol.getBookCollections().get(groupPosition).getTitle();
touchedForDownload = bookName + " " + chapter.getTitle();
downloadTask = new DownloadNovelContentTask(chapter, this);
downloadTask.execute();
return true;
case R.id.delete_volume:
/*
* Implement code to delete this volume cache
*/
BookModel bookDel = novelCol.getBookCollections().get(groupPosition);
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.delete_this_volume, bookDel.getTitle()), Toast.LENGTH_SHORT).show();
dao.deleteBooks(bookDel);
novelCol.getBookCollections().remove(groupPosition);
bookModelAdapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
@SuppressLint("NewApi")
private void executeTask(PageModel pageModel, boolean willRefresh) {
task = new LoadNovelDetailsTask(willRefresh, this);
String key = TAG + ":" + pageModel.getPage();
boolean isAdded = LNReaderApplication.getInstance().addTask(key, task);
if (isAdded) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new PageModel[] { pageModel });
else
task.execute(new PageModel[] { pageModel });
} else {
Log.i(TAG, "Continue execute task: " + key);
LoadNovelDetailsTask tempTask = (LoadNovelDetailsTask) LNReaderApplication.getInstance().getTask(key);
if (tempTask != null) {
task = tempTask;
task.owner = this;
}
toggleProgressBar(true);
}
}
@SuppressLint("NewApi")
private void executeDownloadTask(BookModel chapters, boolean isAll) {
if (page != null) {
downloadTask = new DownloadNovelContentTask(chapters, this);
String key = TAG + Constants.KEY_DOWNLOAD_CHAPTER + page.getPage();
if (isAll) {
key = TAG + Constants.KEY_DOWNLOAD_ALL_CHAPTER + page.getPage();
}
boolean isAdded = LNReaderApplication.getInstance().addTask(key, task);
if (isAdded) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
downloadTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
downloadTask.execute();
} else {
Log.i(TAG, "Continue download task: " + key);
DownloadNovelContentTask tempTask = (DownloadNovelContentTask) LNReaderApplication.getInstance().getTask(key);
if (tempTask != null) {
downloadTask = tempTask;
downloadTask.owner = this;
}
}
}
}
public boolean downloadListSetup(String id, String toastText, int type, boolean hasError) {
boolean exists = false;
if (!this.isAdded() || this.isDetached())
return exists;
if (page != null && !Util.isStringNullOrEmpty(page.getTitle())) {
String name = page.getTitle() + " " + touchedForDownload;
if (type == 0) {
if (LNReaderApplication.getInstance().checkIfDownloadExists(name)) {
exists = true;
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_download_on_queue), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_downloading, name), Toast.LENGTH_SHORT).show();
LNReaderApplication.getInstance().addDownload(id, name);
}
} else if (type == 1) {
Toast.makeText(getSherlockActivity(), "" + toastText, Toast.LENGTH_SHORT).show();
} else if (type == 2) {
String downloadDescription = LNReaderApplication.getInstance().getDownloadDescription(id);
if (downloadDescription != null) {
String message = getResources().getString(R.string.toast_download_finish, page.getTitle(), downloadDescription);
if (hasError)
message = getResources().getString(R.string.toast_download_finish_with_error, page.getTitle(), downloadDescription);
Toast.makeText(getSherlockActivity(), message, Toast.LENGTH_SHORT).show();
}
LNReaderApplication.getInstance().removeDownload(id);
}
}
return exists;
}
public void updateProgress(String id, int current, int total, String message) {
double cur = current;
double tot = total;
double result = (cur / tot) * 100;
LNReaderApplication.getInstance().updateDownload(id, (int) result, message);
if (loadingBar != null && loadingBar.getVisibility() == View.VISIBLE) {
loadingBar.setIndeterminate(false);
loadingBar.setMax(total);
loadingBar.setProgress(current);
loadingBar.setProgress(0);
loadingBar.setProgress(current);
loadingBar.setMax(total);
}
}
public void toggleProgressBar(boolean show) {
if (show) {
loadingText.setText("Loading List, please wait...");
loadingText.setVisibility(TextView.VISIBLE);
loadingBar.setVisibility(ProgressBar.VISIBLE);
expandList.setVisibility(ListView.GONE);
} else {
loadingText.setVisibility(TextView.GONE);
loadingBar.setVisibility(ProgressBar.GONE);
expandList.setVisibility(ListView.VISIBLE);
}
}
public void setMessageDialog(ICallbackEventData message) {
if (loadingText.getVisibility() == View.VISIBLE) {
loadingText.setText(message.getMessage());
}
}
@SuppressLint("NewApi")
public void onGetResult(AsyncTaskResult<?> result, Class<?> t) {
if (!isAdded())
return;
Exception e = result.getError();
if (e == null) {
// from DownloadNovelContentTask
if (t == NovelContentModel[].class) {
NovelContentModel content = (NovelContentModel) result.getResult();
if (content != null) {
Intent intent = new Intent(this.getContext(),BookReadActivity.class);
intent.putExtra("net", 1);
intent.putExtra("net_content", content.getContent());
intent.putExtra("net_book_id", content.getId());
startActivity(intent);
bookModelAdapter.notifyDataSetChanged();
}
}
// from LoadNovelDetailsTask
else if (t == NovelCollectionModel.class) {
novelCol = (NovelCollectionModel) result.getResult();
// now add the volume and chapter list.
try {
// Prepare header
if ((expandList.getHeaderViewsCount() == 0) && getArguments().getBoolean("show_list_child")) {
page = novelCol.getPageModel();
LayoutInflater layoutInflater = getSherlockActivity().getLayoutInflater();
View synopsis = layoutInflater.inflate(R.layout.activity_display_synopsis, null);
TextView textViewTitle = (TextView) synopsis.findViewById(R.id.title);
TextView textViewSynopsis = (TextView) synopsis.findViewById(R.id.synopsys);
textViewTitle.setTextSize(20);
textViewSynopsis.setTextSize(16);
String title = page.getTitle();
if (page.isTeaser()) {
title += " (Teaser Project)";
}
if (page.isStalled()) {
title += "\nStatus: Project Stalled";
}
if (page.isAbandoned()) {
title += "\nStatus: Project Abandoned";
}
if (page.isPending()) {
title += "\nStatus: Project Pending Authorization";
}
textViewTitle.setText(title);
textViewSynopsis.setText(novelCol.getSynopsis());
CheckBox isWatched = (CheckBox) synopsis.findViewById(R.id.isWatched);
isWatched.setChecked(page.isWatched());
isWatched.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_add_watch, page.getTitle()), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_remove_watch, page.getTitle()), Toast.LENGTH_SHORT).show();
}
// update the db!
page.setWatched(isChecked);
NovelsDao dao = NovelsDao.getInstance(getSherlockActivity());
dao.updatePageModel(page);
}
});
ImageView ImageViewCover = (ImageView) synopsis.findViewById(R.id.cover);
if (novelCol.getCoverBitmap() == null) {
// IN app test, is returning empty bitmap
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.toast_err_bitmap_empty), Toast.LENGTH_LONG).show();
} else {
if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) && UIHelper.getStrechCoverPreference(getSherlockActivity())) {
Drawable coverDrawable = new BitmapDrawable(getResources(), novelCol.getCoverBitmap());
int coverHeight = novelCol.getCoverBitmap().getHeight();
int coverWidth = novelCol.getCoverBitmap().getWidth();
int screenWidth = (int) (UIHelper.getScreenHeight(getSherlockActivity()) * 0.9);
int finalHeight = coverHeight * (screenWidth / coverWidth);
ImageViewCover.setBackground(coverDrawable);
ImageViewCover.getLayoutParams().height = finalHeight;
ImageViewCover.getLayoutParams().width = screenWidth;
} else {
ImageViewCover.setImageBitmap(novelCol.getCoverBitmap());
ImageViewCover.getLayoutParams().height = novelCol.getCoverBitmap().getHeight();
ImageViewCover.getLayoutParams().width = novelCol.getCoverBitmap().getWidth();
}
}
expandList.addHeaderView(synopsis);
}
bookModelAdapter = new BookModelAdapter(getSherlockActivity(), novelCol.getBookCollections());
expandList.setAdapter(bookModelAdapter);
} catch (Exception e2) {
Log.e(TAG, "Error when setting up chapter list: " + e2.getMessage(), e2);
Toast.makeText(getSherlockActivity(), getResources().getString(R.string.error_setting_chapter_list, e2.getMessage()), Toast.LENGTH_SHORT).show();
}
}
} else {
String message = e.getClass().toString();
if (e.getMessage() != null)
message += ": " + e.getMessage();
Log.e(TAG, message, e);
Toast.makeText(getSherlockActivity(), message, Toast.LENGTH_SHORT).show();
}
toggleProgressBar(false);
}
public Context getContext() {
Context ctx = this.getSherlockActivity();
if (ctx == null)
return LNReaderApplication.getInstance().getApplicationContext();
return ctx;
}
}