/* * Copyright 2013 ZXing authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.zxing.client.android.result.supplement; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.Locale; import android.content.Context; import android.widget.TextView; import com.google.zxing.client.android.HttpHelper; import com.google.zxing.client.android.LocaleManager; import com.google.zxing.client.android.history.HistoryManager; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; /** * @author Sean Owen */ final class AmazonInfoRetriever extends SupplementalInfoRetriever { private final String type; private final String productID; private final String country; AmazonInfoRetriever(TextView textView, String type, String productID, HistoryManager historyManager, Context context) { super(textView, historyManager); String country = LocaleManager.getCountry(context); if ("ISBN".equals(type) && !Locale.US.getCountry().equals(country)) { type = "EAN"; } this.type = type; this.productID = productID; this.country = country; } @Override void retrieveSupplementalInfo() throws IOException { boolean success = doRetrieveForCountry(country); if (!success && !"US".equals(country)) { // Also show US results to expand scope of results doRetrieveForCountry("US"); } } private boolean doRetrieveForCountry(String theCountry) throws IOException { CharSequence contents = HttpHelper.downloadViaHttp("https://bsplus.srowen.com/ss?c=" + theCountry + "&t=" + type + "&i=" + productID, HttpHelper.ContentType.XML); String detailPageURL = null; Collection<String> authors = new ArrayList<String>(); String title = null; String formattedNewPrice = null; String formattedUsedPrice = null; boolean error = false; try { XmlPullParser xpp = buildParser(contents); boolean seenItem = false; boolean seenLowestNewPrice = false; boolean seenLowestUsedPrice = false; for (int eventType = xpp.getEventType(); eventType != XmlPullParser.END_DOCUMENT; eventType = xpp.next()) { if (eventType == XmlPullParser.START_TAG) { String name = xpp.getName(); if ("Item".equals(name)) { if (seenItem) { break; } else { seenItem = true; } } else if ("DetailPageURL".equals(name)) { assertTextNext(xpp); detailPageURL = xpp.getText(); } else if ("Author".equals(name)) { assertTextNext(xpp); authors.add(xpp.getText()); } else if ("Title".equals(name)) { assertTextNext(xpp); title = xpp.getText(); } else if ("LowestNewPrice".equals(name)) { seenLowestNewPrice = true; seenLowestUsedPrice = false; } else if ("LowestUsedPrice".equals(name)) { seenLowestNewPrice = false; seenLowestUsedPrice = true; } else if ("FormattedPrice".equals(name)) { if (seenLowestNewPrice || seenLowestUsedPrice) { assertTextNext(xpp); String theText = xpp.getText(); if (seenLowestNewPrice) { formattedNewPrice = theText; } else { formattedUsedPrice = theText; } seenLowestNewPrice = false; seenLowestUsedPrice = false; } } else if ("Errors".equals(name)) { error = true; break; } } } } catch (XmlPullParserException xppe) { throw new IOException(xppe); } if (error || detailPageURL == null) { return false; } Collection<String> newTexts = new ArrayList<String>(); maybeAddText(title, newTexts); maybeAddTextSeries(authors, newTexts); if (formattedNewPrice != null) { maybeAddText(formattedNewPrice, newTexts); } else if (formattedUsedPrice != null) { maybeAddText(formattedUsedPrice, newTexts); } append(productID, "Amazon " + theCountry, newTexts.toArray(new String[newTexts.size()]), detailPageURL); return true; } private static void assertTextNext(XmlPullParser xpp) throws XmlPullParserException, IOException { if (xpp.next() != XmlPullParser.TEXT) { throw new IOException(); } } private static XmlPullParser buildParser(CharSequence contents) throws XmlPullParserException { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(new StringReader(contents.toString())); return xpp; } }