package org.liberty.android.fantastischmemo.downloader.quizlet;
import android.util.Log;
import org.apache.commons.io.IOUtils;
import org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelper;
import org.liberty.android.fantastischmemo.common.AnyMemoDBOpenHelperManager;
import org.liberty.android.fantastischmemo.dao.CardDao;
import org.liberty.android.fantastischmemo.entity.Card;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLEncoder;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
class QuizletUploadHelper {
private static final String TAG = QuizletUploadHelper.class.getSimpleName();
/**
* Upload cardsets list to Quizlet from a db file
*
* @param db
* file
* @param authToken
* oauth token
* @return null
* @throws IOException
* IOException If http response code is not 2xx
*/
public void uploadToQuizlet(File file, String authToken) throws IOException {
// First read card because if it failed we don't even bother uploading.
AnyMemoDBOpenHelper helper = AnyMemoDBOpenHelperManager.getHelper(file
.getAbsolutePath());
List<Card> cardList = null;
try {
final CardDao cardDao = helper.getCardDao();
cardList = cardDao.queryForAll();
} finally {
AnyMemoDBOpenHelperManager.releaseHelper(helper);
}
// Following doing upload
StringBuilder data = new StringBuilder();
data.append(String.format("whitespace=%s",
URLEncoder.encode("1", "UTF-8")));
data.append(String.format("&title=%s",
URLEncoder.encode(file.getName(), "UTF-8")));
// Get cards from cardList
for (int i = 0; i < cardList.size(); i++) {
Card c = cardList.get(i);
data.append(String.format("&terms[]=%s",
URLEncoder.encode(c.getQuestion(), "UTF-8")));
data.append(String.format("&definitions[]=%s",
URLEncoder.encode(c.getAnswer(), "UTF-8")));
}
data.append(String.format("&lang_terms=%s",
URLEncoder.encode("en", "UTF-8")));
data.append(String.format("&lang_definitions=%s",
URLEncoder.encode("en", "UTF-8")));
data.append(String.format("&allow_discussion=%s",
URLEncoder.encode("true", "UTF-8")));
URL url = new URL("https://api.quizlet.com/2.0/sets");
makePostApiCall(url, data.toString(), authToken);
}
/**
* Make Post API call to Quizlet server with oauth
*
* @param url
* API call endpoint
* @param post
* content
* @param authToken
* oauth auth token
* @throws IOException
* If http response code is not 2xx
*/
private void makePostApiCall(URL url, String content, String authToken)
throws IOException {
HttpsURLConnection conn = null;
OutputStreamWriter writer = null;
try {
conn = (HttpsURLConnection) url.openConnection();
conn.setDoInput(false);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.addRequestProperty("Authorization", "Bearer " + authToken);
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(content);
writer.close();
if (conn.getResponseCode() / 100 >= 3) {
Log.v(TAG, "Post content is: " + content);
Log.v(TAG, "Error string is: "
+ new String(IOUtils.toByteArray(conn.getErrorStream())));
throw new IOException("Response code: "
+ conn.getResponseCode() + " URL is: " + url);
}
} finally {
conn.disconnect();
}
}
}