blob: d7a29bda42abe22958f186759133042996a76b9b [file] [log] [blame]
/*
* 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;
}
}