/*
* 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.network;
import java.util.Set;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.content.Intent;
import android.graphics.Bitmap;
import org.geometerplus.zlibrary.ui.android.R;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.image.ZLLoadableImage;
import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageManager;
import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData;
import org.geometerplus.fbreader.network.*;
public class NetworkBookInfoActivity extends Activity implements NetworkView.EventListener {
private NetworkBookItem myBook;
private final ZLResource myResource = ZLResource.resource("networkBookView");
private BookDownloaderServiceConnection myConnection;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!NetworkView.Instance().isInitialized()) {
finish();
return;
}
myBook = NetworkView.Instance().getBookInfoItem();
if (myBook == null) {
finish();
return;
}
myConnection = new BookDownloaderServiceConnection();
bindService(
new Intent(getApplicationContext(), BookDownloaderService.class),
myConnection,
BIND_AUTO_CREATE
);
setTitle(myBook.Title);
setContentView(R.layout.network_book);
setupDescription();
setupInfo();
setupCover();
setupButtons();
}
@Override
public void onDestroy() {
if (myConnection != null) {
unbindService(myConnection);
myConnection = null;
}
super.onDestroy();
}
private final void setupDescription() {
((TextView) findViewById(R.id.network_book_description_title)).setText(myResource.getResource("description").getValue());
final TextView descriptionView = (TextView) findViewById(R.id.network_book_description);
final String description;
if (myBook.Summary != null) {
description = myBook.Summary;
} else {
description = myResource.getResource("noDescription").getValue();
}
descriptionView.setText(description);
}
private void setupInfo() {
((TextView) findViewById(R.id.network_book_info_title)).setText(myResource.getResource("bookInfo").getValue());
((TextView) findViewById(R.id.network_book_title_key)).setText(myResource.getResource("title").getValue());
((TextView) findViewById(R.id.network_book_authors_key)).setText(myResource.getResource("authors").getValue());
((TextView) findViewById(R.id.network_book_series_key)).setText(myResource.getResource("series").getValue());
((TextView) findViewById(R.id.network_book_series_index_key)).setText(myResource.getResource("indexInSeries").getValue());
((TextView) findViewById(R.id.network_book_tags_key)).setText(myResource.getResource("tags").getValue());
((TextView) findViewById(R.id.network_book_title_value)).setText(myBook.Title);
if (myBook.Authors.size() > 0) {
findViewById(R.id.network_book_authors).setVisibility(View.VISIBLE);
final StringBuilder authorsText = new StringBuilder();
for (NetworkBookItem.AuthorData author: myBook.Authors) {
if (authorsText.length() > 0) {
authorsText.append(", ");
}
authorsText.append(author.DisplayName);
}
((TextView) findViewById(R.id.network_book_authors_value)).setText(authorsText);
} else {
findViewById(R.id.network_book_authors).setVisibility(View.GONE);
}
if (myBook.SeriesTitle != null) {
findViewById(R.id.network_book_series).setVisibility(View.VISIBLE);
((TextView) findViewById(R.id.network_book_series_value)).setText(myBook.SeriesTitle);
if (myBook.IndexInSeries > 0) {
((TextView) findViewById(R.id.network_book_series_index_value)).setText(String.valueOf(myBook.IndexInSeries));
findViewById(R.id.network_book_series_index).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.network_book_series_index).setVisibility(View.GONE);
}
} else {
findViewById(R.id.network_book_series).setVisibility(View.GONE);
findViewById(R.id.network_book_series_index).setVisibility(View.GONE);
}
if (myBook.Tags.size() > 0) {
findViewById(R.id.network_book_tags).setVisibility(View.VISIBLE);
final StringBuilder tagsText = new StringBuilder();
for (String tag: myBook.Tags) {
if (tagsText.length() > 0) {
tagsText.append(", ");
}
tagsText.append(tag);
}
((TextView) findViewById(R.id.network_book_tags_value)).setText(tagsText);
} else {
findViewById(R.id.network_book_tags).setVisibility(View.GONE);
}
}
private final void setupCover() {
final View rootView = findViewById(R.id.network_book_root);
final ImageView coverView = (ImageView) findViewById(R.id.network_book_cover);
final int maxHeight = 300; // FIXME: hardcoded constant
final int maxWidth = maxHeight * 2 / 3;
Bitmap coverBitmap = null;
final ZLImage cover = NetworkTree.createCover(myBook);
if (cover != null) {
ZLAndroidImageData data = null;
final ZLAndroidImageManager mgr = (ZLAndroidImageManager)ZLAndroidImageManager.Instance();
if (cover instanceof ZLLoadableImage) {
final ZLLoadableImage img = (ZLLoadableImage)cover;
img.startSynchronization(new Runnable() {
public void run() {
img.synchronizeFast();
final ZLAndroidImageData data = mgr.getImageData(img);
if (data != null) {
final Bitmap coverBitmap = data.getBitmap(maxWidth, maxHeight);
if (coverBitmap != null) {
coverView.setImageBitmap(coverBitmap);
coverView.setVisibility(View.VISIBLE);
rootView.invalidate();
rootView.requestLayout();
}
}
}
});
} else {
data = mgr.getImageData(cover);
}
if (data != null) {
coverBitmap = data.getBitmap(maxWidth, maxHeight);
}
}
if (coverBitmap != null) {
coverView.setImageBitmap(coverBitmap);
coverView.setVisibility(View.VISIBLE);
} else {
coverView.setVisibility(View.GONE);
}
}
private final void setupButtons() {
final ZLResource resource = ZLResource.resource("networkView");
final int buttons[] = new int[] {
R.id.network_book_button0,
R.id.network_book_button1,
R.id.network_book_button2,
R.id.network_book_button3,
};
final Set<NetworkBookActions.Action> actions = NetworkBookActions.getContextMenuActions(myBook, myConnection);
final boolean skipSecondButton = actions.size() < buttons.length && (actions.size() % 2) == 1;
int buttonNumber = 0;
for (final NetworkBookActions.Action a: actions) {
if (skipSecondButton && buttonNumber == 1) {
++buttonNumber;
}
if (buttonNumber >= buttons.length) {
break;
}
final String text;
if (a.Arg == null) {
text = resource.getResource(a.Key).getValue();
} else {
text = resource.getResource(a.Key).getValue().replace("%s", a.Arg);
}
final int buttonId = buttons[buttonNumber++];
TextView button = (TextView) findViewById(buttonId);
button.setText(text);
button.setVisibility(View.VISIBLE);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
NetworkBookActions.runAction(NetworkBookInfoActivity.this, myBook, a.Id);
NetworkBookInfoActivity.this.updateView();
}
});
button.setEnabled(a.Id != NetworkTreeActions.TREE_NO_ACTION);
}
findViewById(R.id.network_book_left_spacer).setVisibility(skipSecondButton ? View.VISIBLE : View.GONE);
findViewById(R.id.network_book_right_spacer).setVisibility(skipSecondButton ? View.VISIBLE : View.GONE);
if (skipSecondButton) {
final int buttonId = buttons[1];
View button = findViewById(buttonId);
button.setVisibility(View.GONE);
button.setOnClickListener(null);
}
while (buttonNumber < buttons.length) {
final int buttonId = buttons[buttonNumber++];
View button = findViewById(buttonId);
button.setVisibility(View.GONE);
button.setOnClickListener(null);
}
}
private void updateView() {
setupButtons();
final View rootView = findViewById(R.id.network_book_root);
rootView.invalidate();
rootView.requestLayout();
}
@Override
protected void onStart() {
super.onStart();
NetworkView.Instance().addEventListener(this);
}
@Override
protected void onStop() {
NetworkView.Instance().removeEventListener(this);
super.onStop();
}
public void onModelChanged() {
updateView();
}
@Override
protected Dialog onCreateDialog(int id) {
if (!NetworkView.Instance().isInitialized()) {
return null;
}
final NetworkDialog dlg = NetworkDialog.getDialog(id);
if (dlg != null) {
return dlg.createDialog(this);
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
final NetworkDialog dlg = NetworkDialog.getDialog(id);
if (dlg != null) {
dlg.prepareDialog(this, dialog);
}
}
}