package edu.mit.mitmobile2.libraries; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.text.Html; import android.text.Spannable; import android.text.Spannable.Factory; import android.text.SpannableStringBuilder; import android.text.style.TextAppearanceSpan; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import android.widget.TextView; import edu.mit.mitmobile2.CommonActions; import edu.mit.mitmobile2.DividerView; import edu.mit.mitmobile2.FullScreenLoader; import edu.mit.mitmobile2.LockingScrollView; import edu.mit.mitmobile2.MobileWebApi; import edu.mit.mitmobile2.R; import edu.mit.mitmobile2.SectionHeader; import edu.mit.mitmobile2.SectionHeader.Prominence; import edu.mit.mitmobile2.SliderInterface; import edu.mit.mitmobile2.TwoLineActionRow; import edu.mit.mitmobile2.libraries.BookItem.Holding; import edu.mit.mitmobile2.libraries.BookItem.Holding.Availabilitys; public class BookDetailView implements SliderInterface { enum DetailsLoadingStatus { Loaded, Loading, NotLoaded } private Activity mActivity; private BookItem mBookItem; private LockingScrollView mView; private DetailsLoadingStatus mLoadingStatus; private FullScreenLoader mFullScreenLoader; private TextView mTitleTextView; private LinearLayout mDetailsLinearLayout; private LinearLayout mExtraItemsLayout; private View mEmailCitationButton; public BookDetailView(Activity activity, BookItem bookItem) { mActivity = activity; mBookItem = bookItem; LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mView = (LockingScrollView) inflater.inflate(R.layout.book_detail, null); mFullScreenLoader = (FullScreenLoader) mView.findViewById(R.id.libraryWorldCatBookDetailLoader); mTitleTextView = (TextView) mView.findViewById(R.id.libraryWorldCatBookDetailsTitle); mDetailsLinearLayout = (LinearLayout) mView.findViewById(R.id.libraryWorldCatBookDetailLL); mExtraItemsLayout = (LinearLayout) mView.findViewById(R.id.libraryWorldCatDetailsExtraItems); mEmailCitationButton = mView.findViewById(R.id.libraryWorldCatEmailCitationsButton); mLoadingStatus = DetailsLoadingStatus.NotLoaded; } @Override public LockingScrollView getVerticalScrollView() { return mView; } @Override public View getView() { return mView; } @Override public void onDestroy() { } @Override public void onSelected() { if (mLoadingStatus != DetailsLoadingStatus.Loaded) { if (mBookItem.detailsLoaded) { showBookDetails(); mLoadingStatus = DetailsLoadingStatus.Loaded; } else if (mLoadingStatus != DetailsLoadingStatus.Loading) { mFullScreenLoader.showLoading(); mLoadingStatus = DetailsLoadingStatus.Loading; LibraryModel.fetchWorldCatBookDetails(mBookItem, mActivity, new Handler() { @Override public void handleMessage(Message msg) { if (msg.arg1 == MobileWebApi.SUCCESS) { showBookDetails(); mLoadingStatus = DetailsLoadingStatus.Loaded; } else { mFullScreenLoader.showError(); mLoadingStatus = DetailsLoadingStatus.NotLoaded; } } }); } } } SpannableStringBuilder mSpanBuilder; public void showBookDetails() { mFullScreenLoader.setVisibility(View.GONE); mTitleTextView.setText(mBookItem.title); addRow(null, mBookItem.getAuthorsDisplayString()); if (mBookItem.format != null) { addRow("Format", join(", ", mBookItem.format)); } if (mBookItem.summary != null) { addRow("Summary", join(" ", mBookItem.summary)); } if (mBookItem.publisher != null) { String address = ""; if (mBookItem.address != null) { address = join("", mBookItem.address) + " "; } addRow("Publisher", address + join("", mBookItem.publisher)); } if (mBookItem.editions != null) { addRow("Edition", join(", ", mBookItem.editions)); } if (mBookItem.extent != null) { addRow("Description", join(" ", mBookItem.extent)); } if (mBookItem.isbn != null) { addRow("ISBN", join(" : ", mBookItem.isbn)); } mEmailCitationButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); intent.putExtra(Intent.EXTRA_SUBJECT, mBookItem.title); intent.putExtra( Intent.EXTRA_TEXT, Html.fromHtml(mBookItem.emailAndCiteMessage) ); mActivity.startActivity(intent); } }); final List<Holding> mitHoldings = mBookItem.getHoldingsByOCLCCode(BookItem.MITLibrariesOCLCCode); if (mitHoldings.size() > 0) { mExtraItemsLayout.addView(new SectionHeader(mActivity, "MIT Libraries", Prominence.SECONDARY)); TwoLineActionRow requestItem = new TwoLineActionRow(mActivity); requestItem.setTitle("Request Item"); requestItem.setActionIconResource(R.drawable.action_external); requestItem.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { CommonActions.viewURL(mActivity, mitHoldings.get(0).url); } }); mExtraItemsLayout.addView(requestItem); for (Holding aMitHolding : mitHoldings) { final Map<String, Availabilitys> availabilitiesByLibrary = aMitHolding.getAvailabilitys(); final ArrayList<String> locations = new ArrayList<String>(availabilitiesByLibrary.keySet()); Collections.sort(locations); for (int i = 0; i < locations.size(); i++) { final int index = i; String location = locations.get(i); Availabilitys availablitys = availabilitiesByLibrary.get(location); mExtraItemsLayout.addView(new DividerView(mActivity, null)); TwoLineActionRow availabilityRow = new TwoLineActionRow(mActivity); availabilityRow.setTitle(location); availabilityRow.setSubtitle("" + availablitys.available + " of " + availablitys.total + " available"); availabilityRow.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { LibrariesHoldingsSliderActivity.launch(mActivity, availabilitiesByLibrary, locations, index); } }); mExtraItemsLayout.addView(availabilityRow); } } } int otherHoldingsCount = mBookItem.holdings.size() - mitHoldings.size(); if (otherHoldingsCount > 0) { mExtraItemsLayout.addView(new SectionHeader(mActivity, "Boston Library Consortium", Prominence.SECONDARY)); TwoLineActionRow blcHoldingsRow = new TwoLineActionRow(mActivity); blcHoldingsRow.setTitle("View Holdings"); blcHoldingsRow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { LibraryBLCHoldingsActivity.launch(mActivity, mBookItem); } }); mExtraItemsLayout.addView(blcHoldingsRow); } } public void addRow(String label, CharSequence value) { Factory factory = Spannable.Factory.getInstance(); if (label != null) { label += ": "; } else { label = ""; } Spannable span = factory.newSpannable(label + value); if (label.length() > 0) { span.setSpan(new TextAppearanceSpan(mActivity, R.style.BoldBodyText), 0, label.length()-1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); } span.setSpan(new TextAppearanceSpan(mActivity, R.style.BodyText), label.length(), span.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); TextView textView = new TextView(mActivity); int padding = mActivity.getResources().getDimensionPixelSize(R.dimen.verticalPadding); textView.setPadding(0, 0, 0, padding); textView.setText(span); mDetailsLinearLayout.addView(textView); } private String join(String delimiter, List<String> parts) { String out = ""; boolean isFirst = true; for (String part : parts) { if (isFirst) { isFirst = false; } else { out += delimiter; } out += part; } return out; } @Override public void updateView() { } }