apache-http: Listening to the redirect URL.

Using reflection method we set the data block system property
and block background data on the device on 3 redirect urls due
to zero balance in the prepaid sim.

CRs-Fixed: 927258

Change-Id: I7808ed845736886889b620f076f34c1dd13baf07
diff --git a/src/org/apache/http/impl/client/DefaultRequestDirector.java b/src/org/apache/http/impl/client/DefaultRequestDirector.java
index 6c3a826..35c1a41 100644
--- a/src/org/apache/http/impl/client/DefaultRequestDirector.java
+++ b/src/org/apache/http/impl/client/DefaultRequestDirector.java
@@ -98,6 +98,7 @@
 import org.apache.http.protocol.HttpRequestExecutor;
 import org.apache.http.impl.auth.DigestScheme;
 
+
 /**
  * Default implementation of {@link RequestDirector}.
  * <br/>
@@ -137,19 +138,19 @@
 
     /** The HTTP protocol processor. */
     protected final HttpProcessor httpProcessor;
-    
+
     /** The request retry handler. */
     protected final HttpRequestRetryHandler retryHandler;
-    
+
     /** The redirect handler. */
     protected final RedirectHandler redirectHandler;
-    
+
     /** The target authentication handler. */
     private final AuthenticationHandler targetAuthHandler;
-    
+
     /** The proxy authentication handler. */
     private final AuthenticationHandler proxyAuthHandler;
-    
+
     /** The user token handler. */
     private final UserTokenHandler userTokenHandler;
     
@@ -920,13 +921,12 @@
                                            HttpResponse response,
                                            HttpContext context)
         throws HttpException, IOException {
-
         HttpRoute route = roureq.getRoute();
         HttpHost proxy = route.getProxyHost();
         RequestWrapper request = roureq.getRequest();
-        
+
         HttpParams params = request.getParams();
-        if (HttpClientParams.isRedirecting(params) && 
+        if (HttpClientParams.isRedirecting(params) &&
                 this.redirectHandler.isRedirectRequested(response, context)) {
 
             if (redirectCount >= maxRedirects) {
@@ -937,6 +937,21 @@
             
             URI uri = this.redirectHandler.getLocationURI(response, context);
 
+            /*
+             * When SIM reaches zero balance all http traffic gets redirected
+             * to recharge url and all traffic need to be blocked.
+             * So redirect count is maintained.
+             * If feature is disabled or data traffic is already blocked
+             * no need to check for redirection.
+             */
+            if (ZeroBalanceHelperClass.getFeatureFlagValue() &&
+                    (!ZeroBalanceHelperClass.getBackgroundDataProperty())) {
+                Header locationHeader = response.getFirstHeader("location");
+                String location = locationHeader.getValue();
+                ZeroBalanceHelperClass.setHttpRedirectCount(location);
+                this.log.error("zerobalance::Apachehttp:Redirect count set " );
+            }
+
             HttpHost newTarget = new HttpHost(
                     uri.getHost(), 
                     uri.getPort(),
diff --git a/src/org/apache/http/impl/client/ZeroBalanceHelperClass.java b/src/org/apache/http/impl/client/ZeroBalanceHelperClass.java
new file mode 100644
index 0000000..5dc28d8
--- /dev/null
+++ b/src/org/apache/http/impl/client/ZeroBalanceHelperClass.java
@@ -0,0 +1,114 @@
+/*
+ ** Copyright (c) 2015, The Linux Foundation. All rights reserved.
+
+ ** Redistribution and use in source and binary forms, with or without
+ ** modification, are permitted provided that the following conditions are
+ ** met:
+ **     * Redistributions of source code must retain the above copyright
+ **       notice, this list of conditions and the following disclaimer.
+ **     * Redistributions in binary form must reproduce the above
+ **       copyright notice, this list of conditions and the following
+ **       disclaimer in the documentation and/or other materials provided
+ **       with the distribution.
+ **     * Neither the name of The Linux Foundation nor the names of its
+ **       contributors may be used to endorse or promote products derived
+ **       from this software without specific prior written permission.
+
+ ** THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ ** ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ ** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ ** BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ ** OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ ** IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.apache.http.impl.client;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
+public final class ZeroBalanceHelperClass {
+
+    protected static boolean getFeatureFlagValue() {
+        try {
+          Class<?> ZeroBalanceHelper = Class
+              .forName("android.net.ZeroBalanceHelper");
+          Object helperObject = ZeroBalanceHelper.newInstance();
+          boolean isFeatureEnabled = false;
+          Method featureFlagValue = ZeroBalanceHelper.getMethod(
+              "getFeatureConfigValue");
+          featureFlagValue.setAccessible(true);
+          isFeatureEnabled = (Boolean)featureFlagValue.invoke(helperObject);
+          return isFeatureEnabled;
+        } catch (ClassNotFoundException ex) {
+           ex.printStackTrace();
+        } catch (LinkageError ex) {
+           ex.printStackTrace();
+        } catch (NoSuchMethodException ex) {
+           ex.printStackTrace();
+        } catch (InstantiationException ex) {
+           ex.printStackTrace();
+        } catch (IllegalAccessException ex) {
+           ex.printStackTrace();
+        } catch (InvocationTargetException ex) {
+           ex.printStackTrace();
+        }
+        return false;
+    }
+
+    protected static boolean getBackgroundDataProperty() {
+        try {
+            Class<?> ZeroBalanceHelper = Class
+                .forName("android.net.ZeroBalanceHelper");
+            Object helperObject = ZeroBalanceHelper.newInstance();
+            boolean isDisabled = false;
+            Method bgDataProperty = ZeroBalanceHelper.getMethod(
+                "getBgDataProperty");
+            bgDataProperty.setAccessible(true);
+            isDisabled = Boolean.valueOf(((String)bgDataProperty.invoke(helperObject)));
+            return isDisabled;
+        } catch (ClassNotFoundException ex) {
+            ex.printStackTrace();
+        } catch (LinkageError ex) {
+            ex.printStackTrace();
+        } catch (NoSuchMethodException ex) {
+            ex.printStackTrace();
+        } catch (InstantiationException ex) {
+            ex.printStackTrace();
+        } catch (IllegalAccessException ex) {
+            ex.printStackTrace();
+        } catch (InvocationTargetException ex) {
+            ex.printStackTrace();
+        }
+        return false;
+    }
+
+    protected static void setHttpRedirectCount(String url) {
+        try {
+            Class<?> ZeroBalanceHelper = Class
+                .forName("android.net.ZeroBalanceHelper");
+            Object helperObject = ZeroBalanceHelper.newInstance();
+            Method setHttpRedirectCount = ZeroBalanceHelper.getMethod(
+                "setHttpRedirectCount", String.class);
+            setHttpRedirectCount.setAccessible(true);
+            setHttpRedirectCount.invoke(helperObject, url);
+        } catch (ClassNotFoundException ex) {
+            ex.printStackTrace();
+        } catch (LinkageError ex) {
+            ex.printStackTrace();
+        } catch (NoSuchMethodException ex) {
+            ex.printStackTrace();
+        } catch (InstantiationException ex) {
+            ex.printStackTrace();
+        } catch (IllegalAccessException ex) {
+            ex.printStackTrace();
+        } catch (InvocationTargetException ex) {
+            ex.printStackTrace();
+        }
+    }
+}