/*
* Copyright (C) 2010-2011 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.util.DisplayMetrics;
import android.view.View;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.content.Intent;
import android.graphics.Bitmap;
import org.geometerplus.zlibrary.ui.androidfly.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.androidfly.image.ZLAndroidImageManager;
import org.geometerplus.zlibrary.ui.androidfly.image.ZLAndroidImageData;
import org.geometerplus.fbreader.network.NetworkTree;
import org.geometerplus.fbreader.network.NetworkBookItem;
import org.geometerplus.fbreader.network.tree.NetworkBookTree;
public class NetworkBookInfoActivity extends Activity implements NetworkView.EventListener {
private NetworkBookItem myBook;
private View myMainView;
private final ZLResource myResource = ZLResource.resource("networkBookView");
private BookDownloaderServiceConnection myConnection;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
myMainView = getLayoutInflater().inflate(R.layout.network_book, null, false);
setContentView(myMainView);
myMainView.setOnCreateContextMenuListener(this);
}
@Override
protected void onResume() {
super.onResume();
if (!NetworkView.Instance().isInitialized()) {
if (NetworkInitializer.Instance == null) {
new NetworkInitializer(null);
NetworkInitializer.Instance.start();
} else {
NetworkInitializer.Instance.setActivity(null);
}
}
if (myBook == null) {
final NetworkTree tree = Util.getTreeFromIntent(getIntent());
if (!(tree instanceof NetworkBookTree)) {
finish();
return;
}
myBook = ((NetworkBookTree)tree).Book;
myConnection = new BookDownloaderServiceConnection();
bindService(
new Intent(getApplicationContext(), BookDownloaderService.class),
myConnection,
BIND_AUTO_CREATE
);
setTitle(myBook.Title);
setupDescription();
setupInfo();
setupCover();
setupButtons();
}
}
View getMainView() {
return myMainView;
}
private void setTextById(int id, CharSequence text) {
((TextView)findViewById(id)).setText(text);
}
private void setTextFromResource(int id, String resourceKey) {
setTextById(id, myResource.getResource(resourceKey).getValue());
}
@Override
public void onDestroy() {
if (!NetworkView.Instance().isInitialized() && NetworkInitializer.Instance != null) {
NetworkInitializer.Instance.setActivity(null);
}
if (myConnection != null) {
unbindService(myConnection);
myConnection = null;
}
super.onDestroy();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
NetworkView.Instance().getTopUpActions().buildContextMenu(this, menu, myBook.Link);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
RefillAccountActions.runAction(this, myBook.Link, item.getItemId());
return true;
}
private final void setupDescription() {
setTextFromResource(R.id.network_book_description_title, "description");
String description = myBook.Summary;
if (description == null) {
description = myResource.getResource("noDescription").getValue();
}
setTextById(R.id.network_book_description, description);
}
private void setPairLabelTextFromResource(int id, String resourceKey) {
final LinearLayout layout = (LinearLayout)findViewById(id);
((TextView)layout.findViewById(R.id.book_info_key))
.setText(myResource.getResource(resourceKey).getValue());
}
private void setPairValueText(int id, CharSequence text) {
final LinearLayout layout = (LinearLayout)findViewById(id);
((TextView)layout.findViewById(R.id.book_info_value)).setText(text);
}
private void setupInfo() {
setTextFromResource(R.id.network_book_info_title, "bookInfo");
setPairLabelTextFromResource(R.id.network_book_title, "title");
setPairLabelTextFromResource(R.id.network_book_authors, "authors");
setPairLabelTextFromResource(R.id.network_book_series_title, "series");
setPairLabelTextFromResource(R.id.network_book_series_index, "indexInSeries");
setPairLabelTextFromResource(R.id.network_book_tags, "tags");
setPairLabelTextFromResource(R.id.network_book_catalog, "catalog");
setPairValueText(R.id.network_book_title, 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);
}
setPairValueText(R.id.network_book_authors, authorsText);
} else {
findViewById(R.id.network_book_authors).setVisibility(View.GONE);
}
if (myBook.SeriesTitle != null) {
findViewById(R.id.network_book_series_title).setVisibility(View.VISIBLE);
setPairValueText(R.id.network_book_series_title, myBook.SeriesTitle);
if (myBook.IndexInSeries > 0) {
setPairValueText(R.id.network_book_series_index, 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_title).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);
}
setPairValueText(R.id.network_book_tags, tagsText);
} else {
findViewById(R.id.network_book_tags).setVisibility(View.GONE);
}
setPairValueText(R.id.network_book_catalog, myBook.Link.getTitle());
}
private final void setupCover() {
final View rootView = findViewById(R.id.network_book_root);
final ImageView coverView = (ImageView)findViewById(R.id.network_book_cover);
final DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
final int maxHeight = metrics.heightPixels * 2 / 3;
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.runActionStatic(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 AuthenticationDialog dlg = AuthenticationDialog.getDialog();
if (dlg != null) {
return dlg.createDialog(this);
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
final AuthenticationDialog dlg = AuthenticationDialog.getDialog();
if (dlg != null) {
dlg.prepareDialog(this, dialog);
}
}
}