summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPragnya Paramita <prgnya@codeaurora.org>2015-11-30 19:51:56 +0530
committerZhao Wei Liew <zhaoweiliew@gmail.com>2016-11-10 06:18:58 -0700
commit73406be5362100576dae362f218b624065bb9c57 (patch)
tree79ff6c543913e4b87b5964bd31495c405b580e5e
parentc15736bb1034f8aca5429ca336a2ab7126fe7a57 (diff)
downloadframeworks_base-73406be5362100576dae362f218b624065bb9c57.zip
frameworks_base-73406be5362100576dae362f218b624065bb9c57.tar.gz
frameworks_base-73406be5362100576dae362f218b624065bb9c57.tar.bz2
frameworks/base: Addition of Changes for ZeroBalance feature
--Addition of code to receive broadcast from ZeroBalanceHelper application for executing command to write block/unblock rule to Iptable. --Addition of ZeroBalanceHelper file to be accesible by other modules to notify ZeroBalanceHelper application about update on change of SIM balance. --Addition of rule to allow browser uid when rest all applications are in blocked state. --Addition of feature flag to control the zerobalance feature. CRs-Fixed: 927258 Change-Id: Ifdf4c46fd63ab78193047a9bc8b62bf41065a665
-rw-r--r--core/java/android/net/ZeroBalanceHelper.java99
-rw-r--r--core/res/res/values/config.xml6
-rw-r--r--core/res/res/values/symbols.xml4
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java35
4 files changed, 144 insertions, 0 deletions
diff --git a/core/java/android/net/ZeroBalanceHelper.java b/core/java/android/net/ZeroBalanceHelper.java
new file mode 100644
index 0000000..e0ffca5
--- /dev/null
+++ b/core/java/android/net/ZeroBalanceHelper.java
@@ -0,0 +1,99 @@
+/*
+ ** 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.os.UserHandle;
+import android.util.Log;
+
+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 static int sRedirectMaxCount = 3;
+
+ 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.parseBoolean(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 >= sRedirectMaxCount) {
+ 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);
+ }
+}
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 8b49227..0bbc730 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2598,4 +2598,10 @@
<integer-array translatable="false" name="config_deviceLightCapabilities">
</integer-array>
+ <!-- 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>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 0989e20..ccc80c7 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2418,4 +2418,8 @@
<java-symbol type="string" name="config_packagedKeyboardName" />
<java-symbol type="bool" name="config_useSystemClockforRotationSensor" />
+
+ <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>
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index c063d9f..f53c4ef 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -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;
@@ -84,6 +87,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;
@@ -332,6 +336,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub
public void systemReady() {
prepareNativeDaemon();
+ // Register 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");
}
@@ -2674,4 +2684,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub
mDataInterfaceName = linkProperties.getInterfaceName();
}
}
+
+ 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 always be 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();
+ }
+ }
+ };
}