/*
* TV-Browser for Android
* Copyright (C) 2014 René Mach (rene@tvbrowser.org)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to use, copy, modify or merge the Software,
* furthermore to publish and distribute the Software free of charge without modifications and to
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package org.tvbrowser.devplugin;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Locale;
import java.util.concurrent.TimeoutException;
import org.tvbrowser.settings.SettingConstants;
import org.tvbrowser.utils.IOUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
/**
* A class that contains informations about a certain Plugin.
* <p>
* @author René Mach
*/
public class PluginDefinition implements Comparable<PluginDefinition> {
private static final String PLUGIN_INFO_URL = SettingConstants.URL_SYNC_BASE + "download/android-plugins.gz";
private static final String XML_ELEMENT_ROOT = "plugin";
private static final String XML_ATTRIBUTE_PACKAGE = "package";
private static final String XML_ATTRIBUTE_MIN_API = "minApi";
private static final String XML_ATTRIBUTE_VERSION = "version";
private static final String XML_ATTRIBUTE_AUTHOR = "author";
private static final String XML_ATTRIBUTE_ON_GOOGLE_PLAY = "isOnGooglePlay";
private static final String XML_ELEMENT_NAME_DE = "name-de";
private static final String XML_ELEMENT_NAME_EN = "name-en";
private static final String XML_ELEMENT_DESCRIPTION_DE = "description-de";
private static final String XML_ELEMENT_DESCRIPTION_EN = "description-en";
private static final String XML_ELEMENT_DOWNLOAD_LINK = "donwloadlink";
private static final String XML_ELEMENT_SERVICES = "servicelist";
private static final String XML_ELEMENT_SERVICE = "service";
private String mPackageName;
private String mVersion;
private String mAuthor;
private String mNameDe;
private String mNameEn;
private String mDescriptionDe;
private String mDescriptionEn;
private String mDownloadLink;
private int mMinApiVersion;
private boolean mIsOnGooglePlay;
private boolean mIsUpdate;
private String[] mServices;
public PluginDefinition(String packageName, int minApiVersion, String version, String author, boolean isOnGooglePlay) {
this(packageName, minApiVersion, version, author, isOnGooglePlay, null, null, null, null, null, null);
}
public PluginDefinition(String packageName, int minApiVersion, String version, String author, boolean isOnGooglePlay, String nameDe, String nameEn, String descriptionDe, String descriptionEn, String downloadLink, String[] services) {
mPackageName = packageName;
mMinApiVersion = minApiVersion;
mVersion = version;
mAuthor = author;
mIsOnGooglePlay = isOnGooglePlay;
mNameDe = nameDe;
mNameEn = nameEn;
mDescriptionDe = descriptionDe;
mDescriptionEn = descriptionEn;
mDownloadLink = downloadLink;
mServices = services;
}
private String getValue(String value) {
return value != null ? value : "";
}
public String getPackageName() {
return getValue(mPackageName);
}
public int getMinApiVersion() {
return mMinApiVersion;
}
public String getVersion() {
return getValue(mVersion);
}
public String getAuthor() {
return mAuthor;
}
public boolean isOnGooglePlay() {
return mIsOnGooglePlay;
}
public String getName() {
if (Locale.getDefault().getLanguage().equals(new Locale("de", "", "").getLanguage())) {
return getValue(mNameDe);
}
return getValue(mNameEn);
}
public String getDescription() {
if (Locale.getDefault().getLanguage().equals(new Locale("de", "", "").getLanguage())) {
return getValue(mDescriptionDe);
}
return getValue(mDescriptionEn);
}
public String getDownloadLink() {
return getValue(mDownloadLink);
}
public String[] getServices() {
return mServices;
}
public static PluginDefinition[] loadAvailablePluginDefinitions() {
ArrayList<PluginDefinition> pluginList = new ArrayList<PluginDefinition>();
InputStreamReader in = null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
in = new InputStreamReader(IOUtils.decompressStream(new ByteArrayInputStream(IOUtils.loadUrl(PLUGIN_INFO_URL, 15000))),"UTF-8");
XmlPullParser parser = factory.newPullParser();
parser.setInput(in);
String tagName = null;
PluginDefinition current = null;
int event = parser.getEventType();
ArrayList<String> serviceList = new ArrayList<String>();
while(event != XmlPullParser.END_DOCUMENT) {
switch(parser.getEventType()) {
case XmlPullParser.START_TAG:
{
tagName = parser.getName();
if(tagName.equals(XML_ELEMENT_ROOT)) {
String isOnGooglePlay = parser.getAttributeValue(null, XML_ATTRIBUTE_ON_GOOGLE_PLAY);
if(isOnGooglePlay == null) {
isOnGooglePlay = "false";
}
String author = parser.getAttributeValue(null, XML_ATTRIBUTE_AUTHOR);
if(author != null) {
author = URLDecoder.decode(author, "UTF-8");
}
else {
author = "Unknown";
}
int minApi = 11;
String readApi = parser.getAttributeValue(null, XML_ATTRIBUTE_MIN_API);
if(readApi != null) {
minApi = Integer.parseInt(readApi);
}
current = new PluginDefinition(parser.getAttributeValue(null, XML_ATTRIBUTE_PACKAGE), minApi, parser.getAttributeValue(null, XML_ATTRIBUTE_VERSION), author, isOnGooglePlay.equals("true"));
}
else if(tagName.equals(XML_ELEMENT_SERVICES)) {
serviceList.clear();
}
else if(tagName.equals(XML_ELEMENT_SERVICE)) {
serviceList.add(parser.getAttributeValue(null, XML_ATTRIBUTE_PACKAGE));
}
}break;
case XmlPullParser.TEXT:
{
if(current != null) {
if(tagName.equals(XML_ELEMENT_NAME_EN)) {
current.mNameEn = URLDecoder.decode(parser.getText(), "UTF-8");
}
else if(tagName.equals(XML_ELEMENT_NAME_DE)) {
current.mNameDe = URLDecoder.decode(parser.getText(), "UTF-8");
}
else if(tagName.equals(XML_ELEMENT_DESCRIPTION_EN)) {
current.mDescriptionEn = URLDecoder.decode(parser.getText(), "UTF-8");
}
else if(tagName.equals(XML_ELEMENT_DESCRIPTION_DE)) {
current.mDescriptionDe = URLDecoder.decode(parser.getText(), "UTF-8");
}
else if(tagName.equals(XML_ELEMENT_DOWNLOAD_LINK)) {
current.mDownloadLink = URLDecoder.decode(parser.getText(), "UTF-8");
}
}
}break;
case XmlPullParser.END_TAG:
{
if(parser.getName().equals(XML_ELEMENT_ROOT)) {
pluginList.add(current);
}
else if(parser.getName().equals(XML_ELEMENT_SERVICES)) {
current.mServices = serviceList.toArray(new String[serviceList.size()]);
serviceList.clear();
}
}break;
}
event = parser.next();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pluginList.toArray(new PluginDefinition[pluginList.size()]);
}
@Override
public int compareTo(PluginDefinition o) {
if (Locale.getDefault().getLanguage().equals(new Locale("de", "", "").getLanguage())) {
return mNameDe.compareToIgnoreCase(o.mNameDe);
}
return mNameEn.compareTo(o.mNameEn);
}
public void setIsUpdate() {
mIsUpdate = true;
}
public boolean isUpdate() {
return mIsUpdate;
}
@Override
public String toString() {
if (Locale.getDefault().getLanguage().equals(new Locale("de", "", "").getLanguage())) {
return mNameDe + " " + mVersion;
}
return mNameEn + " " + mVersion;
}
}