/* * Copyright (C) 2010 Geometer Plus <contact@geometerplus.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ package org.geometerplus.android.fbreader; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.view.View; import android.view.ViewGroup; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.core.image.ZLLoadableImage; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.view.ZLView; import org.geometerplus.zlibrary.text.view.ZLTextView; import org.geometerplus.fbreader.fbreader.FBReaderApp; import org.geometerplus.fbreader.formats.FormatPlugin; import org.geometerplus.fbreader.formats.PluginCollection; import org.geometerplus.fbreader.library.Author; import org.geometerplus.fbreader.library.Book; import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData; import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageManager; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; public class NavigationDialog extends Dialog { public NavigationDialog(Context context, final EPDView epd) { super(context, android.R.style.Theme_Translucent_NoTitleBar); setContentView(R.layout.navigation_view); final EPDView.EventsListener listener = new EPDView.EventsListener() { public void onPageScrolling() { } public void onEpdRepaintFinished() { updateView(); } }; epd.addEventsListener(listener); //final TextView statusPositionText = (TextView) findViewById(R.id.statusbar_position_text); final TextView bookPositionText = (TextView) findViewById(R.id.book_position_text); final SeekBar bookPositionSlider = (SeekBar) findViewById(R.id.book_position_slider); bookPositionText.setText(""); //statusPositionText.setText(""); bookPositionSlider.setProgress(0); bookPositionSlider.setMax(1); bookPositionSlider.setVisibility(View.INVISIBLE); bookPositionSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { private boolean myInTouch; private void gotoPage(int page) { final ZLView view = ZLApplication.Instance().getCurrentView(); if (view instanceof ZLTextView) { ZLTextView textView = (ZLTextView) view; if (page == 1) { textView.gotoHome(); } else { textView.gotoPage(page); } } } public void onStopTrackingTouch(SeekBar seekBar) { gotoPage(seekBar.getProgress() + 1); epd.updateEpdDisplay(); myInTouch = false; } public void onStartTrackingTouch(SeekBar seekBar) { myInTouch = true; } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { final int page = progress + 1; final int pagesNumber = seekBar.getMax() + 1; bookPositionText.setText(EPDView.makePositionText(page, pagesNumber)); if (!myInTouch) { gotoPage(page); epd.updateEpdDisplay(); } } } }); setOnDismissListener(new OnDismissListener() { public void onDismiss(DialogInterface dialog) { epd.removeEventsListener(listener); } }); final TextView bookNoCover = (TextView) findViewById(R.id.book_no_cover_text); bookNoCover.setText(ZLResource.resource("fbreader").getResource("noCover").getValue()); } @Override protected void onStart() { super.onStart(); myViewBook = null; FBReaderApp.Instance().repaintView(); } private int myCoverWidth; private int myCoverHeight; private Book myViewBook; public void updateView() { final FBReaderApp fbreader = (FBReaderApp)FBReaderApp.Instance(); final TextView bookTitle = (TextView) findViewById(R.id.book_title); final TextView bookAuthors = (TextView) findViewById(R.id.book_authors); final ImageView bookCover = (ImageView) findViewById(R.id.book_cover); final TextView bookNoCoverText = (TextView) findViewById(R.id.book_no_cover_text); final RelativeLayout bookNoCoverLayout = (RelativeLayout) findViewById(R.id.book_no_cover_layout); if (myCoverWidth == 0) { myCoverWidth = bookCover.getWidth(); myCoverHeight = bookCover.getHeight(); final int viewHeight = myCoverWidth * 4 / 3; if (myCoverHeight > viewHeight) { final int margin = (myCoverHeight - viewHeight) / 2; ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) bookNoCoverLayout.getLayoutParams(); params.topMargin = params.bottomMargin = margin; bookNoCoverLayout.invalidate(); bookNoCoverLayout.requestLayout(); } } bookCover.setAnimation(null); bookCover.setPadding(0, 0, 0, 0); bookNoCoverText.setAnimation(null); if (fbreader.Model != null && fbreader.Model.Book != null) { if (fbreader.Model.Book != myViewBook) { myViewBook = fbreader.Model.Book; final ZLFile bookFile = ((FBReaderApp)FBReaderApp.Instance()).Model.Book.File; final Book book = Book.getByFile(bookFile); bookTitle.setText(book.getTitle()); int count = 0; final StringBuilder authors = new StringBuilder(); for (Author a: book.authors()) { if (count++ > 0) { authors.append(", "); } authors.append(a.DisplayName); if (count == 5) { break; } } bookAuthors.setText(authors.toString()); bookCover.setImageDrawable(null); bookCover.setVisibility(View.GONE); bookNoCoverLayout.setVisibility(View.VISIBLE); final FormatPlugin plugin = PluginCollection.Instance().getPlugin(myViewBook.File); if (plugin != null) { final ZLImage image = plugin.readCover(myViewBook.File); if (image != null) { final ZLAndroidImageManager mgr = (ZLAndroidImageManager) ZLAndroidImageManager.Instance(); final Runnable refreshRunnable = new Runnable() { public void run() { ZLAndroidImageData data = mgr.getImageData(image); if (data != null) { final Bitmap coverBitmap = data.getBitmap(2 * myCoverWidth, 2 * myCoverHeight); if (coverBitmap != null) { bookCover.setImageBitmap(coverBitmap); bookCover.setVisibility(View.VISIBLE); bookNoCoverLayout.setVisibility(View.GONE); } } } }; if (image instanceof ZLLoadableImage) { ZLLoadableImage loadable = (ZLLoadableImage)image; if (loadable.isSynchronized()) { refreshRunnable.run(); } else { loadable.startSynchronization(refreshRunnable); } } else { refreshRunnable.run(); } } } } final int angle = ZLAndroidApplication.Instance().RotationFlag; if (angle != ZLAndroidApplication.ROTATE_0) { final RotateAnimation anim = new RotateAnimation(angle, angle, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); anim.setFillEnabled(true); anim.setFillAfter(true); final View coverView = bookCover.getVisibility() == View.VISIBLE ? bookCover : bookNoCoverText; coverView.startAnimation(anim); if (coverView == bookCover && angle != ZLAndroidApplication.ROTATE_180) { final int padding = (bookCover.getHeight() - bookCover.getWidth()) / 2; bookCover.setPadding(0, padding, 0, padding); } } } else { myViewBook = null; bookTitle.setText(""); bookAuthors.setText(""); bookCover.setImageDrawable(null); bookCover.setVisibility(View.VISIBLE); bookNoCoverLayout.setVisibility(View.GONE); } findViewById(R.id.navigation_view).invalidate(); final TextView bookPositionText = (TextView) findViewById(R.id.book_position_text); final SeekBar bookPositionSlider = (SeekBar) findViewById(R.id.book_position_slider); final ZLView view = fbreader.getCurrentView(); if (view instanceof ZLTextView && ((ZLTextView) view).getModel() != null && ((ZLTextView) view).getModel().getParagraphsNumber() != 0) { ZLTextView textView = (ZLTextView) view; final int page = textView.computeCurrentPage(); final int pagesNumber = textView.computePageNumber(); bookPositionText.setText(EPDView.makePositionText(page, pagesNumber)); bookPositionSlider.setVisibility(View.VISIBLE); bookPositionSlider.setMax(pagesNumber - 1); bookPositionSlider.setProgress(page - 1); } else { bookPositionText.setText(""); bookPositionSlider.setProgress(0); bookPositionSlider.setMax(1); bookPositionSlider.setVisibility(View.INVISIBLE); } } }