Merge "Fix background data setting being backwords" into nyc-dev
diff --git a/res/layout/data_usage_bytes_editor.xml b/res/layout/data_usage_bytes_editor.xml
index 8de7450..2878c3e 100644
--- a/res/layout/data_usage_bytes_editor.xml
+++ b/res/layout/data_usage_bytes_editor.xml
@@ -17,25 +17,27 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
     android:gravity="center"
-    android:layout_width="wrap_content"
+    android:paddingStart="16dp"
+    android:paddingEnd="16dp"
+    android:layout_width="match_parent"
     android:layout_height="wrap_content">
 
-    <NumberPicker
+    <EditText
         android:id="@+id/bytes"
         android:layout_width="wrap_content"
-        android:minWidth="48dip"
         android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:minWidth="48dip"
         android:layout_gravity="center_vertical"
-        android:layout_marginStart="16dip"
-        android:layout_marginEnd="16dip"
         android:focusable="true"
-        android:focusableInTouchMode="true" />
+        android:focusableInTouchMode="true"
+        android:inputType="numberDecimal" />
 
-    <TextView
+    <Spinner
+        android:id="@+id/size_spinner"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@*android:string/megabyteShort" />
+        android:entries="@array/bytes_picker_sizes" />
 
 </LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a0a0c97..fd21db1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7178,4 +7178,9 @@
     <!-- [CHAR_LIMIT=NONE] Label for when app is ignoring battery optimizations -->
     <string name="not_battery_optimizing">Not using battery optimization</string>
 
+    <string-array name="bytes_picker_sizes" translatable="false">
+        <item>@*android:string/megabyteShort</item>
+        <item>@*android:string/gigabyteShort</item>
+    </string-array>
+
 </resources>
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 8ae5888..943a4e6 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -766,22 +766,24 @@
                 Log.e(TAG, "No WebView providers available");
                 return;
             }
-            String[] options = new String[providers.length];
-            String[] values = new String[providers.length];
+            ArrayList<String> options = new ArrayList<String>();
+            ArrayList<String> values = new ArrayList<String>();
             for(int n = 0; n < providers.length; n++) {
-                options[n] = providers[n].description;
-                values[n] = providers[n].packageName;
+                if (isPackageEnabled(providers[n].packageName)) {
+                    options.add(providers[n].description);
+                    values.add(providers[n].packageName);
+                }
             }
-            mWebViewProvider.setEntries(options);
-            mWebViewProvider.setEntryValues(values);
+            mWebViewProvider.setEntries(options.toArray(new String[options.size()]));
+            mWebViewProvider.setEntryValues(values.toArray(new String[values.size()]));
 
             String value = mWebViewUpdateService.getCurrentWebViewPackageName();
             if (value == null) {
                 value = "";
             }
 
-            for (int i = 0; i < values.length; i++) {
-                if (value.contentEquals(values[i])) {
+            for (int i = 0; i < values.size(); i++) {
+                if (value.contentEquals(values.get(i))) {
                     mWebViewProvider.setValueIndex(i);
                     return;
                 }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index b6ac0c0..b875823 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -460,18 +460,22 @@
     @Override
     public SharedPreferences getSharedPreferences(String name, int mode) {
         if (name.equals(getPackageName() + "_preferences")) {
-            String tag = getClass().getName();
-            if (getIntent() != null && getIntent().hasExtra(EXTRA_SHOW_FRAGMENT)) {
-                tag = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
-            }
-            if (tag.startsWith("com.android.settings.")) {
-                tag = tag.replace("com.android.settings.", "");
-            }
-            return new SharedPreferencesLogger(this, tag);
+            return new SharedPreferencesLogger(this, getMetricsTag());
         }
         return super.getSharedPreferences(name, mode);
     }
 
+    private String getMetricsTag() {
+        String tag = getClass().getName();
+        if (getIntent() != null && getIntent().hasExtra(EXTRA_SHOW_FRAGMENT)) {
+            tag = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
+        }
+        if (tag.startsWith("com.android.settings.")) {
+            tag = tag.replace("com.android.settings.", "");
+        }
+        return tag;
+    }
+
     private static boolean isShortCutIntent(final Intent intent) {
         Set<String> categories = intent.getCategories();
         return (categories != null) && categories.contains("com.android.settings.SHORTCUT");
@@ -610,6 +614,9 @@
             mActionBar.setHomeButtonEnabled(mDisplayHomeAsUpEnabled);
         }
         mSwitchBar = (SwitchBar) findViewById(R.id.switch_bar);
+        if (mSwitchBar != null) {
+            mSwitchBar.setMetricsTag(getMetricsTag());
+        }
 
         // see if we should show Back/Next buttons
         if (intent.getBooleanExtra(EXTRA_PREFS_SHOW_BUTTON_BAR, false)) {
diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java
index 5807992..e00170d 100644
--- a/src/com/android/settings/datausage/BillingCycleSettings.java
+++ b/src/com/android/settings/datausage/BillingCycleSettings.java
@@ -30,7 +30,9 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.widget.EditText;
 import android.widget.NumberPicker;
+import android.widget.Spinner;
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settingslib.NetworkPolicyEditor;
@@ -172,7 +174,8 @@
 
             final LayoutInflater dialogInflater = LayoutInflater.from(context);
             mView = dialogInflater.inflate(R.layout.data_usage_bytes_editor, null, false);
-            setupPicker((NumberPicker) mView.findViewById(R.id.bytes));
+            setupPicker((EditText) mView.findViewById(R.id.bytes),
+                    (Spinner) mView.findViewById(R.id.size_spinner));
             return new AlertDialog.Builder(context)
                     .setTitle(R.string.data_usage_warning_editor_title)
                     .setView(mView)
@@ -180,32 +183,28 @@
                     .create();
         }
 
-        private void setupPicker(NumberPicker bytesPicker) {
+        private void setupPicker(EditText bytesPicker, Spinner type) {
             final BillingCycleSettings target = (BillingCycleSettings) getTargetFragment();
             final NetworkPolicyEditor editor = target.services.mPolicyEditor;
 
             final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE);
             final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT);
-            final long warningBytes = editor.getPolicyWarningBytes(template);
-            final long limitBytes = editor.getPolicyLimitBytes(template);
+            final long bytes = isLimit ? editor.getPolicyLimitBytes(template)
+                    : editor.getPolicyWarningBytes(template);
+            final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED;
 
-            if (isLimit) {
-                bytesPicker.setMaxValue(Integer.MAX_VALUE);
-                if (warningBytes != WARNING_DISABLED) {
-                    bytesPicker.setMinValue((int) (warningBytes / MB_IN_BYTES) + 1);
-                } else {
-                    bytesPicker.setMinValue(0);
-                }
+            if (bytes > 1.5f * GB_IN_BYTES) {
+                bytesPicker.setText(formatText(bytes / (float) GB_IN_BYTES));
+                type.setSelection(1);
             } else {
-                bytesPicker.setMinValue(0);
-                if (limitBytes != LIMIT_DISABLED) {
-                    bytesPicker.setMaxValue((int) (limitBytes / MB_IN_BYTES) - 1);
-                } else {
-                    bytesPicker.setMaxValue(Integer.MAX_VALUE);
-                }
+                bytesPicker.setText(formatText(bytes / (float) MB_IN_BYTES));
+                type.setSelection(0);
             }
-            bytesPicker.setValue((int) ((isLimit ? limitBytes : warningBytes) / MB_IN_BYTES));
-            bytesPicker.setWrapSelectorWheel(false);
+        }
+
+        private String formatText(float v) {
+            v = Math.round(v * 100) / 100f;
+            return String.valueOf(v);
         }
 
         @Override
@@ -218,11 +217,15 @@
 
             final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE);
             final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT);
-            NumberPicker bytesPicker = (NumberPicker) mView.findViewById(R.id.bytes);
-            // clear focus to finish pending text edits
-            bytesPicker.clearFocus();
+            EditText bytesField = (EditText) mView.findViewById(R.id.bytes);
+            Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner);
 
-            final long bytes = bytesPicker.getValue() * MB_IN_BYTES;
+            String bytesString = bytesField.getText().toString();
+            if (bytesString.isEmpty()) {
+                bytesString = "0";
+            }
+            final long bytes = (long) (Float.valueOf(bytesString)
+                        * (spinner.getSelectedItemPosition() == 0 ? MB_IN_BYTES : GB_IN_BYTES));
             if (isLimit) {
                 editor.setPolicyLimitBytes(template, bytes);
             } else {
diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java
index 019103f..adf1ce0 100644
--- a/src/com/android/settings/widget/SwitchBar.java
+++ b/src/com/android/settings/widget/SwitchBar.java
@@ -34,6 +34,7 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settingslib.RestrictedLockUtils;
 
@@ -64,6 +65,8 @@
     private boolean mDisabledByAdmin = false;
     private EnforcedAdmin mEnforcedAdmin = null;
 
+    private String mMetricsTag;
+
     private ArrayList<OnSwitchChangeListener> mSwitchChangeListeners =
             new ArrayList<OnSwitchChangeListener>();
 
@@ -125,6 +128,10 @@
         setVisibility(View.GONE);
     }
 
+    public void setMetricsTag(String tag) {
+        mMetricsTag = tag;
+    }
+
     public void setTextViewLabel(boolean isChecked) {
         mLabel = getResources()
                 .getString(isChecked ? R.string.switch_on_text : R.string.switch_off_text);
@@ -217,9 +224,11 @@
     @Override
     public void onClick(View v) {
         if (mDisabledByAdmin) {
+            MetricsLogger.histogram(mContext, mMetricsTag + "/switch_bar|restricted", 1);
             RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mContext, mEnforcedAdmin);
         } else {
             final boolean isChecked = !mSwitch.isChecked();
+            MetricsLogger.histogram(mContext, mMetricsTag + "/switch_bar|" + isChecked, 1);
             setChecked(isChecked);
         }
     }