ok-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: 1033837
Change-Id: Ie5dc454f1dd259df61c9f73bb9ca33cb3bd3ce58
diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java
index 7286428..2541298 100644
--- a/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java
+++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/HttpEngine.java
@@ -58,6 +58,7 @@
 import okio.Source;
 import okio.Timeout;
 
+import com.squareup.okhttp.internal.Platform;
 import static com.squareup.okhttp.internal.Util.closeQuietly;
 import static com.squareup.okhttp.internal.http.StatusLine.HTTP_CONTINUE;
 import static com.squareup.okhttp.internal.http.StatusLine.HTTP_PERM_REDIRECT;
@@ -1077,13 +1078,26 @@
       case HTTP_MOVED_PERM:
       case HTTP_MOVED_TEMP:
       case HTTP_SEE_OTHER:
-        // Does the client allow redirects?
-        if (!client.getFollowRedirects()) return null;
 
         String location = userResponse.header("Location");
         if (location == null) return null;
         HttpUrl url = userRequest.httpUrl().resolve(location);
 
+        /*
+         * 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())) {
+            ZeroBalanceHelperClass.setHttpRedirectCount(url.toString());
+            Platform.get().logW("zerobalance::okhttp:Redirect count set " );
+        }
+        // Does the client allow redirects?
+        if (!client.getFollowRedirects()) return null;
+
         // Don't follow redirects to unsupported protocols.
         if (url == null) return null;
 
diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/http/ZeroBalanceHelperClass.java b/okhttp/src/main/java/com/squareup/okhttp/internal/http/ZeroBalanceHelperClass.java
new file mode 100644
index 0000000..2e67d9a
--- /dev/null
+++ b/okhttp/src/main/java/com/squareup/okhttp/internal/http/ZeroBalanceHelperClass.java
@@ -0,0 +1,114 @@
+/*
+ ** Copyright (c) 2015-16, 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 com.squareup.okhttp.internal.http;
+
+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();
+    }
+  }
+}