package com.darkrockstudios.apps.tminus.dataupdate;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.RequestFuture;
import com.darkrockstudios.apps.tminus.TMinusApplication;
import com.darkrockstudios.apps.tminus.dataupdate.wikipedia.WikiArticleHandler;
import com.darkrockstudios.apps.tminus.dataupdate.wikipedia.WikiImageHandler;
import org.json.JSONObject;
import java.util.concurrent.ExecutionException;
/**
* Created by Adam on 2/15/14.
*/
public abstract class WikiUpdateTask extends UpdateTask
{
private static final String TAG = WikiUpdateTask.class.getSimpleName();
protected final Uri m_data;
public WikiUpdateTask( final Context context, final Uri data )
{
super( context );
m_data = data;
}
protected abstract int getId();
protected abstract String getArticleTitle();
protected abstract boolean saveArticleToDatabase( final String articleText, int id, Context context );
protected abstract boolean saveImageToDatabase( final String thumbnailUrl, final int id, final Context context );
/**
* We are subverting the normal UpdateTask flow
*/
@Override
public final void run()
{
final boolean success;
Log.d( TAG, "Began Wiki Detail update" );
final int id = getId();
if( id > -1 )
{
String articleTitle = getArticleTitle();
if( articleTitle != null )
{
final Context context = getContext();
Log.d( TAG, "Requesting Wiki Details from wiki article: " + articleTitle );
String wikiArticle = requestArticle( articleTitle, context );
if( saveArticleToDatabase( wikiArticle, id, context ) )
{
Log.d( TAG, "Wiki Article saved to DB, requesting images..." );
String thumbnailUrl = requestImage( articleTitle, context );
saveImageToDatabase( thumbnailUrl, id, context );
}
else
{
Log.d( TAG, "Failed to save Wiki article to DB: " + articleTitle );
}
success = true;
}
else
{
Log.d( TAG, "Could not extract Wiki article for id: " + id );
success = false;
}
}
else
{
Log.w( TAG, "Not item found for URI: " + m_data + " aborting Wiki Details update" );
success = false;
}
final Intent intent;
if( success )
{
Log.d( TAG, "Wiki Details received successfully" );
intent = new Intent( getSuccessIntentAction() );
intent.setData( m_data );
}
else
{
Log.d( TAG, "Failed to retrieve Wiki Details" );
intent = new Intent( getFailureIntentAction() );
intent.setData( m_data );
}
getContext().sendBroadcast( intent );
}
/**
* We are now using the normal UpdateTask flow here
*/
@Override
public final boolean handleData( final JSONObject response )
{
return false;
}
/**
* We are now using the normal UpdateTask flow here
*/
@Override
public final String getRequestUrl()
{
return null;
}
private static String requestArticle( final String articleTitle, final Context context )
{
String wikiArticle;
Log.d( TAG, "Requesting Wiki Article..." );
final String baseUrl = "http://en.wikipedia.org";
final String articleQuery =
"/w/api.php?action=parse&format=json&prop=wikitext§ion=0&contentformat=text%2Fx-wiki&contentmodel=wikitext&redirects=&page=";
final String url = baseUrl + articleQuery + articleTitle;
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest( url, null, future, future );
request.setTag( context );
TMinusApplication.getRequestQueue().add( request );
try
{
JSONObject response = future.get();
wikiArticle = WikiArticleHandler.processWikiArticle( response );
}
catch( InterruptedException | ExecutionException e )
{
wikiArticle = null;
}
return wikiArticle;
}
private static String requestImage( final String articleTitle, final Context context )
{
String thumbnailUrl;
Log.d( TAG, "Requesting Wiki Image..." );
// This gives the "page image"
// Action: query
// prop=pageimages
final String baseUrl = "http://en.wikipedia.org";
final String imageQuery =
"/w/api.php?action=query&prop=pageimages&format=json&piprop=thumbnail%7Cname&pithumbsize=512&pilimit=1&indexpageids=&redirects=&titles=";
final String url = baseUrl + imageQuery + articleTitle;
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JsonObjectRequest request = new JsonObjectRequest( url, null, future, future );
request.setTag( context );
TMinusApplication.getRequestQueue().add( request );
try
{
JSONObject response = future.get();
thumbnailUrl = WikiImageHandler.processImage( response );
}
catch( InterruptedException | ExecutionException e )
{
thumbnailUrl = null;
}
return thumbnailUrl;
}
}