package com.lmit.jenkins.android.networking; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.http.Header; import org.apache.http.HttpResponse; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import com.lmit.jenkins.android.activity.GenericListActivity; import com.lmit.jenkins.android.activity.R; import com.lmit.jenkins.android.addon.ApplicationStatus; import com.lmit.jenkins.android.addon.LoadingView; import com.lmit.jenkins.android.addon.LocalStorage; import com.lmit.jenkins.android.configuration.Configuration; import com.lmit.jenkins.android.logger.Logger; import com.lmit.jenkinscloud.commons.JenkinsCloudDataNode; public class ReconnectRootNode extends AsyncTask<Void, Void, Boolean> { GenericListActivity ctx; private ProgressDialog dialog; private static Logger log = Logger.getInstance(); private Configuration config; private static final String ROOT_PATH = "/qaexplorer"; private static final long DISCONNECT_DELAY_MSEC = 2000L; public static class ConnectNodeOnClickListener implements OnClickListener { private GenericListActivity ctx; public ConnectNodeOnClickListener(GenericListActivity ctx) { this.ctx = ctx; } @Override public void onClick(View v) { boolean isConnected = Configuration.getInstance().isConnected(); ProgressDialog connectProgress = new ProgressDialog(ctx); connectProgress.setCancelable(true); connectProgress .setMessage( ctx.getString(isConnected ? R.string.online_disconnect : R.string.offline_connect)); ReconnectRootNode refreshNode = new ReconnectRootNode(ctx, connectProgress); refreshNode.execute(); } } public ReconnectRootNode(GenericListActivity ctx, ProgressDialog dialog) { this.ctx = ctx; config = Configuration.getInstance(); this.dialog = dialog; } boolean cacheHit = false; boolean appendMode = false; String messageDisplayLog = ""; Header[] lastHttpHeaders; Throwable e; @Override protected Boolean doInBackground(Void... params) { if (config.isConnected()) { return goOffLine(); } else { return goOnLine(); } } private Boolean goOffLine() { try { Thread.sleep(DISCONNECT_DELAY_MSEC); } catch (InterruptedException e) { } Configuration.getInstance().setConnected(false, true); Configuration.getInstance().save(); return false; } private Boolean goOnLine() { config.setConnected(true, true); Map<String, String> headers = Configuration.getInstance().getRequestHeaders(); JenkinsCloudDataNode result = null; AbstractSecureHttpClient client = new ServerAuthenticationDefaultHttpClient(ApplicationStatus.getCurrentPath()); try { HttpResponse response = client.executeGetQuery(false, headers); switch (response.getStatusLine().getStatusCode()) { case HttpURLConnection.HTTP_OK: InputStream responseInStream = response.getEntity().getContent(); try { result = (JenkinsCloudDataNode) JenkinsCloudDataNode.fromJson( responseInStream, JenkinsCloudDataNode.class); Header etag = response.getFirstHeader("ETag"); if (etag != null && result != null) { result.setEtag(etag.getValue()); } } finally { responseInStream.close(); } break; case HttpURLConnection.HTTP_NOT_MODIFIED: result = (JenkinsCloudDataNode) client.getCachedNode(); break; default: config.setConnected(false, true); e = new Throwable("Error " + response.getStatusLine().getReasonPhrase()); } } catch (Exception exec) { e = exec; config.setConnected(false, true); } if (e == null && result != null) { onSuccessclientHudsonMobiAsyncHttpClient(result); BackgroundLoader.getInstance().enqueue( new BackgroundLoader.ExecutionRequest(ctx, "", 0, 0)); } else { onFailureclientHudsonMobiAsyncHttpClient(e); } if(config.isConnected()) { config.save(); } return config.isConnected(); } @Override protected void onPostExecute(Boolean connected) { if (dialog != null && dialog.isShowing()) { dialog.cancel(); } ctx.updateRightButtonImage(); } @Override protected void onPreExecute() { if (dialog != null) { dialog.show(); } } @Override protected void onProgressUpdate(Void... values) { } public void onSuccessclientHudsonMobiAsyncHttpClient( JenkinsCloudDataNode result) { Configuration.getInstance().setLastRefreshTimestamp( "" + new Date().getTime()); Configuration.getInstance().save(); Logger.getInstance().debug("Connected to cloud"); if (!result.isCached()) { LocalStorage.getInstance().replaceNode(ROOT_PATH, result); ImageDownloader.getInstance().preloadImage(ROOT_PATH, result); } LoadingView.remove(); } public void onFailureclientHudsonMobiAsyncHttpClient(Throwable e) { LoadingView.remove(); } }