package give_me_coins.dashboard;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.ArrayList;
import javax.net.ssl.HttpsURLConnection;
/**
* Created by Patrik on 06.11.13.
*/
class GetInfoWorker extends AsyncTask<Void, JSONObject, Void> {
private static final String TAG = "GetInfoWorker";
private boolean isRunning = true;
private static final int iConnectionTimeout = 5000;
private final ArrayList<GetInfoWorkerCallback> getInfoWorkerCallbacks = new ArrayList<GetInfoWorkerCallback>();
private final boolean[] showCoin = {true, true, true,true,true};
private int sleepTime = 60000; // 1 min - default value
private boolean isSleeping = false;
private String getUrlToGiveMeCoins() {
return urlToGiveMeCoins;
}
void setUrlToGiveMeCoins(String urlToGiveMeCoins) {
this.urlToGiveMeCoins = urlToGiveMeCoins;
}
private String urlToGiveMeCoins = null;
private Thread oCurrentWorkerThread;
private boolean isRunning() {
return isRunning;
}
/**
*
* @param isRunning = false stops running
*/
void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}
/**
*
* @return time the process sleeps between refreshes
*/
private int getSleepTime() {
return sleepTime;
}
/**
* sets time the process sleeps between refreshes
* @param sleepTime
*/
void setSleepTime(int sleepTime) {
this.sleepTime = sleepTime;
}
GetInfoWorker(GetInfoWorkerCallback para_getInfoWorkerCallbackBTC, GetInfoWorkerCallback para_getInfoWorkerCallbackLTC,
GetInfoWorkerCallback para_getInfoWorkerCallbackFTC,GetInfoWorkerCallback para_getInfoWorkerCallbackVTC,
GetInfoWorkerCallback para_getInfoWorkerCallbackPPC) {
getInfoWorkerCallbacks.add( para_getInfoWorkerCallbackBTC );
getInfoWorkerCallbacks.add( para_getInfoWorkerCallbackLTC );
getInfoWorkerCallbacks.add( para_getInfoWorkerCallbackFTC );
getInfoWorkerCallbacks.add( para_getInfoWorkerCallbackVTC );
getInfoWorkerCallbacks.add( para_getInfoWorkerCallbackPPC );
}
@Override
protected Void doInBackground(Void... params) {
oCurrentWorkerThread = Thread.currentThread();
while( isRunning )
{
if(urlToGiveMeCoins != null )
{
final String[] currencySwitcher = {"btc","ltc","ftc","vtc","ppc"};
for(int i = 0; i<5;i++)
{
if( showCoin[i] && getInfoWorkerCallbacks.get(i) != null )
{
try {
String currentUrlString = urlToGiveMeCoins;
currentUrlString = currentUrlString.replace("ltc?api_key", currencySwitcher[i]+"?api_key");
if( getInfoWorkerCallbacks.get(i) != null )
{
URL currentUrl = new URL(currentUrlString);
// bring it to UI
JSONObject currentJson = getJSONFromUrl(currentUrl);
if( currentJson != null )
{
// Log.d(TAG,currentJson.toString() );
try {
currentJson.put("currency", i);
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e(TAG,"couldnt add currency");
}
publishProgress( currentJson );
}
else
{
Log.e(TAG, "failed to get a valid json");
}
}
}
catch (MalformedURLException e)
{
Log.e(TAG,e.toString());
}
}
}
try {
setSleeping(true);
Thread.sleep(sleepTime);
setSleeping(false);
} catch (InterruptedException e) {
Log.e(TAG, "error sleeping"+e.toString());
}
}
} // protected Void doInBackground(String... params)
return null;
}
@Override
protected void onProgressUpdate(JSONObject... values) {
super.onProgressUpdate(values);
GiveMeCoinsInfo currentCoinsInfo = new GiveMeCoinsInfo(values[0]);
// Log.e(TAG,currentCoinsInfo.getUsername() );
try
{
int currentCurrencyIndex = JSONHelper.getVal(values[0],"currency",0);
getInfoWorkerCallbacks.get(currentCurrencyIndex).refreshValues(currentCoinsInfo);
}
catch(Exception e)
{
Log.e(TAG,"troll"+e.toString());
}
}
private JSONObject getJSONFromUrl(URL para_url)
{
// ProgressDialog oShowProgress = ProgressDialog.show(oAct, "Loading", "Loading", true, false);
JSONObject oRetJson = null;
try
{
//Log.d(TAG,para_url.toString());
HttpsURLConnection oConnection = (HttpsURLConnection) para_url.openConnection();
// HttpsURLConnection.setDefaultHostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
oConnection.setConnectTimeout(iConnectionTimeout);
oConnection.setReadTimeout(iConnectionTimeout*2);
// connection.setRequestProperty ("Authorization", sAuthorization);
oConnection.connect();
BufferedInputStream oInput = new BufferedInputStream( oConnection.getInputStream() );
BufferedReader reader = new BufferedReader( new InputStreamReader(oInput) );
String sReturn = reader.readLine();
//Log.d(TAG,sReturn);
oRetJson = new JSONObject(sReturn);
}
catch (SocketTimeoutException e)
{
Log.e(TAG, "Timeout");
}
catch (IOException e)
{
Log.e(TAG,e.toString());
} catch (JSONException e)
{
Log.e(TAG,e.toString());
}
catch (Exception e)
{
Log.e(TAG,e.toString());
}
//para_ProgressDialog.dismiss();
return oRetJson;
}
/**
*
* @return tells if process is currently sleeping
*/
private boolean isSleeping() {
return isSleeping;
}
private void setSleeping(boolean isSleeping) {
this.isSleeping = isSleeping;
}
void forceUpdate() {
oCurrentWorkerThread.interrupt();
}
void setCoinsToShow(boolean para_showBTC, boolean para_showLTC, boolean para_showFTC, boolean para_showVTC, boolean para_showPPC)
{
showCoin[0] = para_showBTC;
showCoin[1] = para_showLTC;
showCoin[2] = para_showFTC;
showCoin[3] = para_showVTC;
showCoin[4] = para_showPPC;
}
}