/**********************************************************************************
* Copyright 2015 Tom Praschan
* <p/>
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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 de.tap.easy_xkcd.utils;
import android.content.Context;
import android.preference.PreferenceManager;
import android.util.Log;
import com.tap.xkcd_reader.R;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Arrays;
public class Comic {
private String[] comicData;
private String jsonUrl;
protected int comicNumber;
private JSONObject json;
public Comic(Integer number, Context context) throws IOException {
if (number != 0) {
jsonUrl = "https://xkcd.com/" + number.toString() + "/info.0.json";
} else {
jsonUrl = "https://xkcd.com/info.0.json";
}
try {
comicData = loadComicData(jsonUrl);
} catch (JSONException e) {
e.printStackTrace();
}
if (context != null) {
if (Arrays.binarySearch(context.getResources().getIntArray(R.array.interactive_comics), comicNumber) >= 0) { //Check for interactive comic
comicData[0] = comicData[0] + " " + context.getResources().getString(R.string.title_interactive);
}
int i = Arrays.binarySearch(context.getResources().getIntArray(R.array.large_comics), comicNumber);
if (i >= 0 && PreferenceManager.getDefaultSharedPreferences(context).getBoolean("pref_large", true)) { //Check for large comic
comicData[2] = context.getResources().getStringArray(R.array.large_comics_urls)[i];
}
}
}
public Comic(Integer number) throws IOException {
if (number != 0) {
jsonUrl = "https://xkcd.com/" + number.toString() + "/info.0.json";
} else {
jsonUrl = "https://xkcd.com/info.0.json";
}
try {
comicData = loadComicData(jsonUrl);
} catch (JSONException e) {
e.printStackTrace();
}
}
public Comic() {}
private String[] loadComicData(String url) throws IOException, JSONException {
json = JsonParser.getJSONFromUrl(url);
String[] result = new String[3];
if (json != null) {
result[0] = new String(json.getString("title").getBytes("ISO-8859-1"), "UTF-8");
result[1] = new String(json.getString("alt").getBytes("ISO-8859-1"), "UTF-8");
result[2] = json.getString("img");
comicNumber = Integer.parseInt(json.getString("num"));
} else if (comicNumber == 404) { //xkcd.com/404 doesn't have a json object
result[0] = "404";
result[1] = "404";
result[2] = "http://i.imgur.com/p0eKxKs.png";
comicNumber = 404;
} else throw new IOException("json not found");
// some image fixes
switch (comicNumber) {
case 1037: result[2] = "http://www.explainxkcd.com/wiki/images/f/ff/umwelt_the_void.jpg";
break;
case 1608: result[2] = "http://www.explainxkcd.com/wiki/images/4/41/hoverboard.png";
break;
case 1350: result[2] = "http://www.explainxkcd.com/wiki/images/3/3d/lorenz.png";
break;
case 104: result[2] = "http://i.imgur.com/dnCNfPo.jpg";
break;
case 76: result[2] = "http://i.imgur.com/h3fi2RV.jpg";
break;
case 80: result[2] = "http://i.imgur.com/lWmI1lB.jpg";
break;
case 1663: result[2] = "http://explainxkcd.com/wiki/images/c/ce/garden.png";
break;
case 1193: result[2] = "https://www.explainxkcd.com/wiki/images/0/0b/externalities.png";
break;
case 1054: result[0] = "The Bacon";
break;
case 1137: result[0] = "RTL";
break;
}
return result;
}
public String getTranscript() {
try {
return json.getString("transcript");
} catch (JSONException e) {
return " ";
}
}
public String[] getComicData() {
return comicData;
}
public int getComicNumber() {
return comicNumber;
}
}