Hide tab when disabled, metered strings, fixes.

Hide "Data usage" item when kernel support isn't available and
enabled.  Change "restrict background" strings to reflect metered
status.  Hide app settings button when no package found.  Always
start limit sweep above any warning.  Imply metered state for
networks with limits.

Bug: 6303364, 5465643, 5379686, 6376276, 6368329, 6376276
Change-Id: I4faccc9a50f2f741fd937bb8c361a3ca055135e2
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index ae9c1cb..0d003b3 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -784,7 +784,7 @@
 
         } else {
             mAppSettingsIntent = null;
-            mAppSettings.setEnabled(false);
+            mAppSettings.setVisibility(View.GONE);
         }
 
         updateDetailData();
@@ -1601,19 +1601,21 @@
 
             final Resources res = parent.getResources();
             final CharSequence message;
+            final long minLimitBytes = (long) (
+                    parent.mPolicyEditor.getPolicy(parent.mTemplate).warningBytes * 1.2f);
             final long limitBytes;
 
             // TODO: customize default limits based on network template
             final String currentTab = parent.mCurrentTab;
             if (TAB_3G.equals(currentTab)) {
                 message = res.getString(R.string.data_usage_limit_dialog_mobile);
-                limitBytes = 5 * GB_IN_BYTES;
+                limitBytes = Math.max(5 * GB_IN_BYTES, minLimitBytes);
             } else if (TAB_4G.equals(currentTab)) {
                 message = res.getString(R.string.data_usage_limit_dialog_mobile);
-                limitBytes = 5 * GB_IN_BYTES;
+                limitBytes = Math.max(5 * GB_IN_BYTES, minLimitBytes);
             } else if (TAB_MOBILE.equals(currentTab)) {
                 message = res.getString(R.string.data_usage_limit_dialog_mobile);
-                limitBytes = 5 * GB_IN_BYTES;
+                limitBytes = Math.max(5 * GB_IN_BYTES, minLimitBytes);
             } else {
                 throw new IllegalArgumentException("unknown current tab: " + currentTab);
             }
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 1922100..88fac0a 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -31,6 +31,9 @@
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
+import android.os.INetworkManagementService;
+import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.os.UserId;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
@@ -359,6 +362,17 @@
                 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
                     target.remove(header);
                 }
+            } else if (id == R.id.data_usage_settings) {
+                // Remove data usage when kernel module not enabled
+                final INetworkManagementService netManager = INetworkManagementService.Stub
+                        .asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
+                try {
+                    if (!netManager.isBandwidthControlEnabled()) {
+                        target.remove(header);
+                    }
+                } catch (RemoteException e) {
+                    // ignored
+                }
             } else if (id == R.id.user_settings) {
                 if (!mEnableUserManagement
                         || !UserId.MU_ENABLED || UserId.myUserId() != 0
diff --git a/src/com/android/settings/net/DataUsageMeteredSettings.java b/src/com/android/settings/net/DataUsageMeteredSettings.java
index 4967611..fea8a12 100644
--- a/src/com/android/settings/net/DataUsageMeteredSettings.java
+++ b/src/com/android/settings/net/DataUsageMeteredSettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.net;
 
+import static android.net.NetworkPolicy.LIMIT_DISABLED;
 import static android.net.wifi.WifiInfo.removeDoubleQuotes;
 import static com.android.settings.DataUsageSummary.hasReadyMobileRadio;
 import static com.android.settings.DataUsageSummary.hasWifiRadio;
@@ -106,19 +107,35 @@
 
     private class MeteredPreference extends CheckBoxPreference {
         private final NetworkTemplate mTemplate;
+        private boolean mBinding;
 
         public MeteredPreference(Context context, NetworkTemplate template) {
             super(context);
             mTemplate = template;
 
             setPersistent(false);
-            setChecked(mPolicyEditor.getPolicyMetered(mTemplate));
+
+            mBinding = true;
+            final NetworkPolicy policy = mPolicyEditor.getPolicy(template);
+            if (policy != null) {
+                if (policy.limitBytes != LIMIT_DISABLED) {
+                    setChecked(true);
+                    setEnabled(false);
+                } else {
+                    setChecked(policy.metered);
+                }
+            } else {
+                setChecked(false);
+            }
+            mBinding = false;
         }
 
         @Override
         protected void notifyChanged() {
             super.notifyChanged();
-            mPolicyEditor.setPolicyMetered(mTemplate, isChecked());
+            if (!mBinding) {
+                mPolicyEditor.setPolicyMetered(mTemplate, isChecked());
+            }
         }
     }
 }