/*
* This file provided by Facebook is for non-commercial testing and evaluation
* purposes only. Facebook reserves all rights not expressly granted.
*
* 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
* FACEBOOK 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 com.facebook.fresco.sample.urlsfetcher;
import android.os.AsyncTask;
import com.facebook.common.internal.Preconditions;
import com.facebook.common.logging.FLog;
import org.apache.http.HttpStatus;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
/**
* Helper that asynchronously fetches the list of image URIs from Imgur.
*/
public class ImageUrlsFetcher {
/**
* Imgur license key for use by the Fresco project.
*
* The rest of this class may be used freely according to the licence file,
* with the sole exception of this variable. Any fork of this code or use in
* any other application, whether open- or closed-source, must use a
* different client ID obtained from Imgur. See the <a
* href="https://api.imgur.com/#register">Imgur API documentation</a>.
*/
private static final String IMGUR_CLIENT_ID = "Client-ID ccc6ca6a65ecdd8";
private static final String TAG = "FrescoSample";
public interface Callback {
public void onFinish(List<String> results);
}
public static void getImageUrls(final ImageUrlsRequest request,
final Callback callback) {
new AsyncTask<Void, Void, List<String>>() {
@Override
protected List<String> doInBackground(Void... params) {
return getImageUrls(request);
}
@Override
protected void onPostExecute(List<String> result) {
callback.onFinish(result);
}
}.execute();
}
private static List<String> getImageUrls(ImageUrlsRequest request) {
List<String> urls = new ArrayList<String>();
try {
String rawJson = downloadContentAsString(request.getEndpointUrl());
if (rawJson == null) {
return urls;
}
JSONObject json = new JSONObject(rawJson);
JSONArray data = json.getJSONArray("data");
for (int i = 0; i < data.length(); i++) {
JSONObject item = data.getJSONObject(i);
if (!item.has("type")) {
continue;
}
ImageFormat imageFormat = ImageFormat
.getImageFormatForMime(item.getString("type"));
ImageSize imageSize = request.getImageSize(imageFormat);
if (imageSize != null) {
urls.add(getThumbnailLink(item, imageSize));
}
}
} catch (Exception e) {
FLog.e(TAG, "Exception fetching album", e);
}
return urls;
}
@Nullable
private static String downloadContentAsString(String urlString)
throws IOException {
InputStream is = null;
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Authorization", IMGUR_CLIENT_ID);
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
if (response != HttpStatus.SC_OK) {
FLog.e(TAG, "Album request returned %s", response);
return null;
}
is = conn.getInputStream();
return readAsString(is);
} finally {
if (is != null) {
is.close();
}
}
}
/** Reads an InputStream and converts it to a String. */
private static String readAsString(InputStream stream) throws IOException {
StringWriter writer = new StringWriter();
Reader reader = new BufferedReader(new InputStreamReader(stream,
"UTF-8"));
while (true) {
int c = reader.read();
if (c < 0) {
break;
}
writer.write(c);
}
return writer.toString();
}
private static String getThumbnailLink(final JSONObject json,
final ImageSize imageSize) throws JSONException {
Preconditions.checkNotNull(imageSize);
final String originalUrl = json.getString("link");
if (imageSize == ImageSize.ORIGINAL_IMAGE) {
return originalUrl;
}
final int dotPos = originalUrl.lastIndexOf('.');
final StringBuilder linkBuilder = new StringBuilder(
originalUrl.length() + 1);
return linkBuilder.append(originalUrl).insert(dotPos, imageSize.suffix)
.toString();
}
}