package com.lmit.jenkins.android.activity; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.util.Date; import java.util.Map; import java.util.UUID; import org.apache.http.Header; import org.apache.http.HttpResponse; import android.content.Context; import android.os.AsyncTask; import android.telephony.TelephonyManager; import android.view.View; import com.lmit.jenkins.android.addon.ApplicationStatus; import com.lmit.jenkins.android.addon.LocalStorage; import com.lmit.jenkins.android.configuration.Configuration; import com.lmit.jenkins.android.logger.Logger; import com.lmit.jenkins.android.networking.AbstractSecureHttpClient; import com.lmit.jenkins.android.networking.ImageDownloader; import com.lmit.jenkins.android.networking.ServerAuthenticationDefaultHttpClient; import com.lmit.jenkinscloud.commons.JenkinsCloudDataNode; class HomeActivityLoadTask extends AsyncTask<String, Void, String> { /** * */ private final HudsonDroidHomeActivity HomeScreenLoadTask; /** * @param hudsonDroidHomeActivity */ public HomeActivityLoadTask(HudsonDroidHomeActivity hudsonDroidHomeActivity) { HomeScreenLoadTask = hudsonDroidHomeActivity; } private static final long ERROR_MESSAGE_DELAY_MSEC = 10000L; private void setLogLoading(String message) { HomeScreenLoadTask.messageDisplayLog = message; publishProgress(); } private void showFailureAlert(Throwable e) { setLogLoading("Error on Server connection: " + e.getMessage()); } public void onSuccessclientHudsonMobiAsyncHttpClient( JenkinsCloudDataNode result) { JenkinsCloudDataNode cachedResult = LocalStorage.getInstance().getNode("/qaexplorer", JenkinsCloudDataNode.class); if (result == null && cachedResult != null) { setLogLoading("INVALID SERVER RESPONSE\n" + "Network call was possibly redirected.\n" + "Going OFF-LINE with local cache"); Configuration.getInstance().setConnected(false, true); result = cachedResult; try { Thread.sleep(1000L); } catch (InterruptedException e) { } } else if (result == null && cachedResult == null) { if (Configuration.getInstance().isConnected()) { setLogLoading("INVALID SERVER RESPONSE\n" + "Network call was possibly redirected.\n" + "Close the App, check your network settings, " + "open your Browser and authenticate to Wi-Fi"); } else { setLogLoading("No connectivity or local cached data.\n" + "check your network settings, " + "open your Browser and check connectivity"); Configuration.getInstance().setConnected(true, true); Configuration.getInstance().save(); } stopProgress(); return; } else { Configuration.getInstance().setLastRefreshTimestamp( "" + new Date().getTime()); Configuration.getInstance().save(); HomeScreenLoadTask.saveResultInLocalDB(HomeScreenLoadTask.path, result, HomeScreenLoadTask.forceRefresh); ImageDownloader.getInstance().preloadImage( "/qaexplorer/" + ApplicationStatus.getCurrentPath(), result); } HomeScreenLoadTask.nextNodeToRender = result; HomeScreenLoadTask.moveOn(); } private void stopProgress() { HomeScreenLoadTask.progressGone = true; publishProgress(); } public void onFailureclientHudsonMobiAsyncHttpClient(Throwable e) { stopProgress(); HudsonDroidHomeActivity.log.error("HTTP Client failure", e); if (LocalStorage.getInstance().getNode("qaexplorer") == null) { setLogLoading(getExceptionErrorMessage(e) + "\n" + "Close the application, check your network settings and try again"); } else { setLogLoading("Connection Error: using latest local cached data"); Configuration.getInstance().setConnected(false, true); HomeScreenLoadTask.connectToCloud(); } } private String getExceptionErrorMessage(Throwable e) { String[] exceptionNameParts = e.getClass().getName().split("\\."); String exceptionName = exceptionNameParts[exceptionNameParts.length-1]; StringBuilder outBuff = new StringBuilder(); for (int pos=0; pos < exceptionName.length(); pos++) { char currChar = exceptionName.charAt(pos); if(pos > 0 && Character.isUpperCase(currChar)) { outBuff.append(" "); currChar = Character.toLowerCase(currChar); } outBuff.append(currChar); } outBuff.append(" - "); outBuff.append(e.getMessage()); return outBuff.toString(); } @Override protected String doInBackground(String... params) { Logger.getInstance().logConfig(); boolean simChange = Configuration.getInstance().detectSubscriberId(); if (Configuration.getInstance().isConnected()) { if (HomeScreenLoadTask.connectedToCellularData() && simChange && Configuration.getInstance().getMsisdn() == null) { } } // final JenkinsCloudAPIClient client = new // JenkinsCloudAPIClient(ctx); Map<String, String> headers = Configuration.getInstance().getRequestHeaders(); ApplicationStatus.reset(); JenkinsCloudDataNode result = null; AbstractSecureHttpClient client = new ServerAuthenticationDefaultHttpClient( HomeScreenLoadTask.path); try { HomeScreenLoadTask.currTime = sleep(HomeScreenLoadTask.currTime); setLogLoading(HomeScreenLoadTask.getString(Configuration.getInstance().isConnected() ? R.string.loading_stage_connect:R.string.loading_stage_offline)); if(Configuration.getInstance().isConnected()) { HudsonDroidHomeActivity.log.debug("Getting URL: '" + HomeScreenLoadTask.path + "'"); HttpResponse response = client.executeGetQuery(false, headers); HomeScreenLoadTask.currTime = sleep(HomeScreenLoadTask.currTime); switch (response.getStatusLine().getStatusCode()) { case HttpURLConnection.HTTP_OK: if(Configuration.getInstance().isConnected()) { setLogLoading(HomeScreenLoadTask.getString(R.string.loading_stage_receive)); } 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: if(Configuration.getInstance().isConnected()) { setLogLoading(HomeScreenLoadTask.getString(R.string.loading_stage_notmodified)); } result = (JenkinsCloudDataNode) client.getCachedNode(); break; default: Configuration.getInstance().setConnected(false, true); throw new IOException("Error " + response.getStatusLine().getReasonPhrase()); } } else { result = (JenkinsCloudDataNode) client.getCachedNode(HomeScreenLoadTask.path); } } catch (IOException exec) { HomeScreenLoadTask.e = exec; Configuration.getInstance().setConnected(false, true); } HomeScreenLoadTask.currTime = sleep(HomeScreenLoadTask.currTime); if (HomeScreenLoadTask.e == null) { if(Configuration.getInstance().isConnected()) { setLogLoading(HomeScreenLoadTask.getString(R.string.loading_stage_images)); } onSuccessclientHudsonMobiAsyncHttpClient(result); } else { result = (JenkinsCloudDataNode) client.getCachedNode(); if (result == null) { setLogLoading(HomeScreenLoadTask.getString(R.string.loading_stage_failure)); HomeScreenLoadTask.currTime = sleep(HomeScreenLoadTask.currTime); onFailureclientHudsonMobiAsyncHttpClient(HomeScreenLoadTask.e); } else { setLogLoading(HomeScreenLoadTask.getString(R.string.loading_stage_offline)); HomeScreenLoadTask.currTime = sleep(HomeScreenLoadTask.currTime); onSuccessclientHudsonMobiAsyncHttpClient(result); } } return null; } private long sleep(long currTime) { long now = System.currentTimeMillis(); long sleepTime = HudsonDroidHomeActivity.MIN_SLEEP_MSEC - (now - currTime); if(sleepTime > 10) { try { HudsonDroidHomeActivity.log.debug("Sleeping " + sleepTime + " msec"); Thread.sleep(sleepTime); } catch (InterruptedException e) { } } return System.currentTimeMillis(); } @Override protected void onPostExecute(String result) { } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { HomeScreenLoadTask.text.setText(HomeScreenLoadTask.messageDisplayLog); if (HomeScreenLoadTask.progressGone) { HomeScreenLoadTask.progress.setVisibility(View.INVISIBLE); } } }