package org.itsnat.droid.impl.browser; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Build; import android.util.DisplayMetrics; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; import org.itsnat.droid.ItsNatDroidException; import org.itsnat.droid.impl.ItsNatDroidImpl; /** * Created by jmarranz on 12/11/14. */ public class HttpRequestData { private HttpFileCache httpFileCache; private HttpContext httpContext; private RequestPropertyMap requestPropertyMap; private HttpParams httpParams; private int connectTimeout; private int readTimeout; private boolean sslSelfSignedAllowed; public HttpRequestData(PageImpl page) { // Para acciones posteriores a la carga de la página tal y como carga de recursos, envío de eventos etc una vez cargada la página reutilizando su configuración de red, // pero aun así clonamos la configuración pues en requestPropertyMap tenemos que poner los headers ItsNat más recientes posibles this(page.getPageRequestClonedImpl()); } public HttpRequestData(PageRequestImpl pageRequest) { // Dos casos: // 1) Carga de página, clonamos y así permitimos en el PageRequest modificarlo y volver a llamar a execute(). En las requests síncronas no haria falta clonar pero no es importante // 2) Acciones posteriores a la carga de la página tal y como carga de recursos utilizando el getPageRequestClonedImpl() ItsNatDroidBrowserImpl browser = pageRequest.getItsNatDroidBrowserImpl(); Context ctx = pageRequest.getContext(); this.httpFileCache = browser.getHttpFileCache(); this.httpContext = browser.getHttpContext(); this.requestPropertyMap = pageRequest.getRequestPropertyMap().copy(); this.httpParams = pageRequest.getHttpParams().copy(); this.connectTimeout = pageRequest.getConnectTimeout(); this.readTimeout = pageRequest.getReadTimeout(); this.sslSelfSignedAllowed = browser.isSSLSelfSignedAllowed(); setCurrentDeviceStateHttpHeaders(this.requestPropertyMap,browser,ctx); // Da igual el flag copy, hay que enviar el estado del dispositivo lo más fresco posible } public HttpRequestData(GenericHttpClientImpl genericHttpClient) { PageImpl page = genericHttpClient.getItsNatDocImpl().getPageImpl(); ItsNatDroidBrowserImpl browser = page.getItsNatDroidBrowserImpl(); Context ctx = page.getContext(); this.httpFileCache = browser.getHttpFileCache(); this.httpContext = browser.getHttpContext(); this.requestPropertyMap = genericHttpClient.getRequestPropertyMap().copy(); this.httpParams = genericHttpClient.getHttpParams().copy(); this.connectTimeout = genericHttpClient.getConnectTimeout(); this.readTimeout = genericHttpClient.getReadTimeout(); this.sslSelfSignedAllowed = browser.isSSLSelfSignedAllowed(); setCurrentDeviceStateHttpHeaders(this.requestPropertyMap, browser, ctx); } private void setCurrentDeviceStateHttpHeaders(RequestPropertyMap requestPropertyMap,ItsNatDroidBrowserImpl browser,Context ctx) { // http://stackoverflow.com/questions/17481341/how-to-get-android-screen-size-programmatically-once-and-for-all // Recuerda que cambia con la orientación por eso hay que enviarlos "frescos" Resources resources = ctx.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); ItsNatDroidImpl itsNatDroid = browser.getItsNatDroidImpl(); int libVersionCode = itsNatDroid.getVersionCode(); String libVersionName = itsNatDroid.getVersionName(); PackageInfo pInfo; try { pInfo = ctx.getPackageManager().getPackageInfo( ctx.getPackageName(), 0); } catch(PackageManager.NameNotFoundException ex) { throw new ItsNatDroidException(ex); } // Da igual llamar a addProperty o setProperty pues siempre se llama en un requestPropertyMap clonado pues necesitamos datos frescos y que no se pisen entre hilos requestPropertyMap.addProperty("ItsNat-model", "" + Build.MODEL); requestPropertyMap.addProperty("ItsNat-sdk-int", "" + Build.VERSION.SDK_INT); requestPropertyMap.addProperty("ItsNat-lib-version-name", "" + libVersionName); requestPropertyMap.addProperty("ItsNat-lib-version-code", "" + libVersionCode); requestPropertyMap.addProperty("ItsNat-app-version-name", "" + pInfo.versionName); requestPropertyMap.addProperty("ItsNat-app-version-code", "" + pInfo.versionCode); requestPropertyMap.addProperty("ItsNat-display-width", "" + dm.widthPixels); requestPropertyMap.addProperty("ItsNat-display-height", "" + dm.heightPixels); requestPropertyMap.addProperty("ItsNat-display-density", "" + dm.density); } public HttpFileCache getHttpFileCache() { return httpFileCache; } public HttpContext getHttpContext() { return httpContext; } public RequestPropertyMap getRequestPropertyMap() { return requestPropertyMap; } public HttpParams getHttpParams() { return httpParams; } public int getConnectTimeout() { return connectTimeout; } public int getReadTimeout() { return readTimeout; } public void setReadTimeout(int timeout) { this.readTimeout = timeout; } public boolean isSslSelfSignedAllowed() { return sslSelfSignedAllowed; } }