Loading core/java/android/net/ZeroBalanceHelper.java 0 → 100644 +100 −0 Original line number Diff line number Diff line /* ** 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 android.net; import android.app.ActivityThread; import android.content.Context; import android.content.Intent; import android.os.SystemProperties; import android.util.Log; import android.os.UserHandle; import com.android.internal.R; /** @hide */ public final class ZeroBalanceHelper { public static final String BACKGROUND_DATA_PROPERTY = "sys.background.data.disable"; public static final String BACKGROUND_DATA_BROADCAST = "org.codeaurora.background.data"; public static final String TAG = "ZeroBalance"; private static int sRedirectCount = 0; private Context mContext = null; public ZeroBalanceHelper() { mContext = ActivityThread.currentApplication(); } public void setBgDataProperty(String enabled) { Intent intent = new Intent(); intent.setAction(BACKGROUND_DATA_BROADCAST); intent.putExtra("enabled", enabled); mContext.sendBroadcast(intent); } public String getBgDataProperty() { String isBgDataPropertySet = SystemProperties.get(BACKGROUND_DATA_PROPERTY, "false"); if(Boolean.valueOf(isBgDataPropertySet)) { sRedirectCount = 0; } return isBgDataPropertySet; } private String getConfiguredRedirectURL() { String redirectURL = mContext.getResources().getString( com.android.internal.R.string.operator_config_url); Log.d(TAG, "Returning the configured redirect URL : " + redirectURL); return redirectURL; } public synchronized void setHttpRedirectCount(String url) { String redirectUrl = getConfiguredRedirectURL(); if (redirectUrl != null && url.contains(redirectUrl)) { sRedirectCount++; Log.d(TAG, "http:sRedirectCount="+sRedirectCount); if (sRedirectCount >= 3) { Log.d(TAG,"http:Background Data will be disabled" ); setBgDataProperty("true"); sRedirectCount = 0; } } else { Log.d(TAG,"http: resetting the counter "); sRedirectCount = 0; } } public boolean getFeatureConfigValue() { return mContext.getResources().getBoolean(R.bool.config_zero_balance_operator); } } core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -2435,4 +2435,10 @@ <!-- Keypress Optimization --> <bool name="config_enableKeypressOptimization">false</bool> <integer-array name="keypress_param_value"/> <!-- Zero Balance redirect URL config --> <string name="operator_config_url" translatable="false"></string> <!-- Zero Balance ping URL config --> <string name="operator_ping_url" translatable="false"></string> <!-- Zero Balance feature enable config --> <bool name="config_zero_balance_operator">false</bool> </resources> core/res/res/values/symbols.xml +3 −0 Original line number Diff line number Diff line Loading @@ -2424,4 +2424,7 @@ <!-- keypress optimization --> <java-symbol type="bool" name="config_enableKeypressOptimization" /> <java-symbol type="array" name="keypress_param_value" /> <java-symbol type="string" name="operator_config_url" /> <java-symbol type="string" name="operator_ping_url" /> <java-symbol type="bool" name="config_zero_balance_operator"/> </resources> services/core/java/com/android/server/NetworkManagementService.java +35 −0 Original line number Diff line number Diff line Loading @@ -46,7 +46,10 @@ import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENAB import android.annotation.NonNull; import android.app.ActivityManagerNative; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.InterfaceConfiguration; Loading Loading @@ -82,6 +85,7 @@ import android.util.Slog; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.net.NetworkStatsFactory; Loading Loading @@ -322,6 +326,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void systemReady() { prepareNativeDaemon(); //Registering the receiver for Zerobalance blocking/unblocking if (mContext.getResources().getBoolean(R.bool.config_zero_balance_operator)) { final IntentFilter restrictFilter = new IntentFilter(); restrictFilter.addAction("org.codeaurora.restrictData"); mContext.registerReceiver(mZeroBalanceReceiver, restrictFilter); } if (DBG) Slog.d(TAG, "Prepared"); } Loading Loading @@ -2573,4 +2583,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void removeInterfaceFromLocalNetwork(String iface) { modifyInterfaceInNetwork("remove", "local", iface); } private BroadcastReceiver mZeroBalanceReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isBlockAllData = false; if(intent != null && intent.getAction().equals("org.codeaurora.restrictData")) { isBlockAllData = intent.getBooleanExtra("Restrict",false); Log.wtf("ZeroBalance", "Intent value to block unblock data"+isBlockAllData); } mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled if (!mBandwidthControlEnabled) return; try { Log.wtf("ZeroBalance", "before calling connector Intent" +"value to block unblock data"+isBlockAllData); mConnector.execute("bandwidth", isBlockAllData ? "blockAllData" : "unblockAllData"); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } } }; } Loading
core/java/android/net/ZeroBalanceHelper.java 0 → 100644 +100 −0 Original line number Diff line number Diff line /* ** 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 android.net; import android.app.ActivityThread; import android.content.Context; import android.content.Intent; import android.os.SystemProperties; import android.util.Log; import android.os.UserHandle; import com.android.internal.R; /** @hide */ public final class ZeroBalanceHelper { public static final String BACKGROUND_DATA_PROPERTY = "sys.background.data.disable"; public static final String BACKGROUND_DATA_BROADCAST = "org.codeaurora.background.data"; public static final String TAG = "ZeroBalance"; private static int sRedirectCount = 0; private Context mContext = null; public ZeroBalanceHelper() { mContext = ActivityThread.currentApplication(); } public void setBgDataProperty(String enabled) { Intent intent = new Intent(); intent.setAction(BACKGROUND_DATA_BROADCAST); intent.putExtra("enabled", enabled); mContext.sendBroadcast(intent); } public String getBgDataProperty() { String isBgDataPropertySet = SystemProperties.get(BACKGROUND_DATA_PROPERTY, "false"); if(Boolean.valueOf(isBgDataPropertySet)) { sRedirectCount = 0; } return isBgDataPropertySet; } private String getConfiguredRedirectURL() { String redirectURL = mContext.getResources().getString( com.android.internal.R.string.operator_config_url); Log.d(TAG, "Returning the configured redirect URL : " + redirectURL); return redirectURL; } public synchronized void setHttpRedirectCount(String url) { String redirectUrl = getConfiguredRedirectURL(); if (redirectUrl != null && url.contains(redirectUrl)) { sRedirectCount++; Log.d(TAG, "http:sRedirectCount="+sRedirectCount); if (sRedirectCount >= 3) { Log.d(TAG,"http:Background Data will be disabled" ); setBgDataProperty("true"); sRedirectCount = 0; } } else { Log.d(TAG,"http: resetting the counter "); sRedirectCount = 0; } } public boolean getFeatureConfigValue() { return mContext.getResources().getBoolean(R.bool.config_zero_balance_operator); } }
core/res/res/values/config.xml +6 −0 Original line number Diff line number Diff line Loading @@ -2435,4 +2435,10 @@ <!-- Keypress Optimization --> <bool name="config_enableKeypressOptimization">false</bool> <integer-array name="keypress_param_value"/> <!-- Zero Balance redirect URL config --> <string name="operator_config_url" translatable="false"></string> <!-- Zero Balance ping URL config --> <string name="operator_ping_url" translatable="false"></string> <!-- Zero Balance feature enable config --> <bool name="config_zero_balance_operator">false</bool> </resources>
core/res/res/values/symbols.xml +3 −0 Original line number Diff line number Diff line Loading @@ -2424,4 +2424,7 @@ <!-- keypress optimization --> <java-symbol type="bool" name="config_enableKeypressOptimization" /> <java-symbol type="array" name="keypress_param_value" /> <java-symbol type="string" name="operator_config_url" /> <java-symbol type="string" name="operator_ping_url" /> <java-symbol type="bool" name="config_zero_balance_operator"/> </resources>
services/core/java/com/android/server/NetworkManagementService.java +35 −0 Original line number Diff line number Diff line Loading @@ -46,7 +46,10 @@ import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENAB import android.annotation.NonNull; import android.app.ActivityManagerNative; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.InterfaceConfiguration; Loading Loading @@ -82,6 +85,7 @@ import android.util.Slog; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.net.NetworkStatsFactory; Loading Loading @@ -322,6 +326,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void systemReady() { prepareNativeDaemon(); //Registering the receiver for Zerobalance blocking/unblocking if (mContext.getResources().getBoolean(R.bool.config_zero_balance_operator)) { final IntentFilter restrictFilter = new IntentFilter(); restrictFilter.addAction("org.codeaurora.restrictData"); mContext.registerReceiver(mZeroBalanceReceiver, restrictFilter); } if (DBG) Slog.d(TAG, "Prepared"); } Loading Loading @@ -2573,4 +2583,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void removeInterfaceFromLocalNetwork(String iface) { modifyInterfaceInNetwork("remove", "local", iface); } private BroadcastReceiver mZeroBalanceReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isBlockAllData = false; if(intent != null && intent.getAction().equals("org.codeaurora.restrictData")) { isBlockAllData = intent.getBooleanExtra("Restrict",false); Log.wtf("ZeroBalance", "Intent value to block unblock data"+isBlockAllData); } mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled if (!mBandwidthControlEnabled) return; try { Log.wtf("ZeroBalance", "before calling connector Intent" +"value to block unblock data"+isBlockAllData); mConnector.execute("bandwidth", isBlockAllData ? "blockAllData" : "unblockAllData"); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } } }; }