package com.dotcool.reader.activity; import java.net.URL; import java.util.ArrayList; 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.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; 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.View.OnClickListener; 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.SherlockActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.dotcool.bll.DbTags; import com.dotcool.reader.Constants; import com.dotcool.reader.LNReaderApplication; import com.dotcool.R; 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.model.BookModel; import com.dotcool.reader.model.NovelCollectionModel; import com.dotcool.reader.model.NovelContentModel; import com.dotcool.reader.model.PageModel; import com.dotcool.reader.parser.CommonParser; import com.dotcool.reader.task.DownloadNovelContentTask; import com.dotcool.reader.task.IAsyncTaskOwner; import com.dotcool.reader.task.LoadNovelDetailsTask; import com.dotcool.view.BookReadActivity; import com.dotcool.view.BookshelfActivity; public class DisplayLightNovelDetailsActivity extends SherlockActivity implements IAsyncTaskOwner { public static final String TAG = DisplayLightNovelDetailsActivity.class.toString(); private PageModel page; private NovelCollectionModel novelCol; private final NovelsDao dao = NovelsDao.getInstance(this); private BookModelAdapter bookModelAdapter; private ExpandableListView expandList; private DownloadNovelContentTask downloadTask = null; private LoadNovelDetailsTask task = null; private TextView loadingText; private ProgressBar loadingBar; private boolean isInverted; private String touchedForDownload; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); UIHelper.SetTheme(this, R.layout.activity_display_light_novel_details); UIHelper.SetActionBarDisplayHomeAsUp(this, true); // Get intent and message Intent intent = getIntent(); page = new PageModel(); page.setPage(intent.getStringExtra(Constants.EXTRA_PAGE)); try { page = NovelsDao.getInstance(this).getPageModel(page, null); } catch (Exception e) { Log.e(TAG, "Error when getting Page Model for " + page.getPage(), e); } // setup listener expandList = (ExpandableListView) 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 ; //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; } }); setTitle(page.getTitle()); isInverted = UIHelper.getColorPreferences(this); loadingText = (TextView) findViewById(R.id.emptyList); loadingBar = (ProgressBar) findViewById(R.id.empttListProgress); executeTask(page, false); } private void loadCotent(BookModel chapter) { downloadTask = new DownloadNovelContentTask(chapter, DisplayLightNovelDetailsActivity.this); downloadTask.execute(); } @Override protected void onRestart() { super.onRestart(); if (isInverted != UIHelper.getColorPreferences(this)) { UIHelper.Recreate(this); } if (bookModelAdapter != null) { bookModelAdapter.notifyDataSetChanged(); } } @Override protected void onResume() { super.onResume(); Log.d(TAG, "OnResume: " + task.getStatus().toString()); } @Override public void onStop() { super.onStop(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.activity_display_light_novel_details, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: super.onBackPressed(); 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 = 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); } } @SuppressLint("NewApi") private void executeTask(PageModel pageModel, boolean willRefresh) { task = new LoadNovelDetailsTask(willRefresh, this); String key = TAG + Constants.KEY_LOAD_CHAPTER + 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 { 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 { 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; String name = page.getTitle() + " " + touchedForDownload; if (type == 0) { if (LNReaderApplication.getInstance().checkIfDownloadExists(name)) { exists = true; Toast.makeText(this, getResources().getString(R.string.download_on_queue), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, getResources().getString(R.string.toast_downloading, name), Toast.LENGTH_SHORT).show(); LNReaderApplication.getInstance().addDownload(id, name); } } else if (type == 1) { Toast.makeText(this, toastText, Toast.LENGTH_SHORT).show(); } else if (type == 2) { String message = getResources().getString(R.string.toast_download_finish, page.getTitle(), LNReaderApplication.getInstance().getDownloadDescription(id)); if (hasError) message = getResources().getString(R.string.toast_download_finish_with_error, page.getTitle(), LNReaderApplication.getInstance().getDownloadDescription(id)); Toast.makeText(this, 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("加载中,请稍后..."); loadingText.setVisibility(TextView.VISIBLE); loadingBar.setVisibility(ProgressBar.VISIBLE); loadingBar.setIndeterminate(true); 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) { 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(DisplayLightNovelDetailsActivity.this ,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(); if(novelCol==null){ return; } expandList = (ExpandableListView) findViewById(R.id.chapter_list); // now add the volume and chapter list. try { // Prepare header if (expandList.getHeaderViewsCount() == 0) { page = novelCol.getPageModel(); LayoutInflater layoutInflater = 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 += " (" + getResources().getString(R.string.teaser_project) + ")"; } if (page.isStalled()) { title += "\nStatus: " + getResources().getString(R.string.project_stalled); } if (page.isAbandoned()) { title += "\nStatus: " + getResources().getString(R.string.project_abandonded); } if (page.isPending()) { title += "\nStatus: " + getResources().getString(R.string.project_pending_authorization); } textViewTitle.setText(title); textViewSynopsis.setText(novelCol.getPageModel().getSummary()); CheckBox isWatched = (CheckBox) synopsis.findViewById(R.id.isWatched); isWatched.setChecked(page.isWatched()); isWatched.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { updateWatchStatus(isChecked, page); } }); ImageView ImageViewCover = (ImageView) synopsis.findViewById(R.id.cover); if (novelCol.getCoverBitmap() == null) { // IN app test, is returning empty bitmap Toast.makeText(this, 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(this)) { Drawable coverDrawable = new BitmapDrawable(getResources(), novelCol.getCoverBitmap()); int coverHeight = novelCol.getCoverBitmap().getHeight(); int coverWidth = novelCol.getCoverBitmap().getWidth(); int screenWidth = (int) (UIHelper.getScreenHeight(this) * 0.9); int finalHeight = coverHeight * (screenWidth / coverWidth); ImageViewCover.setBackground(coverDrawable); ImageViewCover.getLayoutParams().height = finalHeight; ImageViewCover.getLayoutParams().width = screenWidth; } else { Log.d(TAG, "Non Stretch"); ImageViewCover.setImageBitmap(novelCol.getCoverBitmap()); ImageViewCover.getLayoutParams().height = novelCol.getCoverBitmap().getHeight(); ImageViewCover.getLayoutParams().width = novelCol.getCoverBitmap().getWidth(); } } expandList.addHeaderView(synopsis); } bookModelAdapter = new BookModelAdapter(DisplayLightNovelDetailsActivity.this, novelCol.getBookCollections()); expandList.setAdapter(bookModelAdapter); Log.d(TAG, "Loaded: " + novelCol.getPage()); } catch (Exception e2) { Log.e(TAG, "Error when setting up chapter list: " + e2.getMessage(), e2); Toast.makeText(DisplayLightNovelDetailsActivity.this, getResources().getString(R.string.error_setting_chapter_list, e2.getMessage()), Toast.LENGTH_SHORT).show(); } if (novelCol == null) { Log.e(TAG, "Empty Novel Collection: " + getIntent().getStringExtra(Constants.EXTRA_PAGE)); } } } else { Log.e(TAG, e.getClass().toString() + ": " + e.getMessage(), e); Toast.makeText(this, e.getClass().toString() + ": " + e.getMessage(), Toast.LENGTH_SHORT).show(); } toggleProgressBar(false); } private void updateWatchStatus(boolean isChecked, PageModel page) { if (isChecked) { Toast.makeText(this, getResources().getString(R.string.toast_add_watch, page.getTitle()), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, getResources().getString(R.string.toast_remove_watch, page.getTitle()), Toast.LENGTH_SHORT).show(); } // update the db! page.setWatched(isChecked); NovelsDao dao = NovelsDao.getInstance(this); dao.updatePageModel(page); } public Context getContext() { return this; } }