[2/2] OmniGears: bring back status nework traffic

Change-Id: I4ddbc4984799e146ef1f057ec87a4bd6609bbadc
diff --git a/res/xml/bars_settings.xml b/res/xml/bars_settings.xml
index c237a69..e813280 100644
--- a/res/xml/bars_settings.xml
+++ b/res/xml/bars_settings.xml
@@ -21,28 +21,35 @@
             android:key="category_statusbar"
             android:title="@string/statusbar_title">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnigears.preference.SystemCheckBoxPreference
                 android:key="double_tap_sleep_gesture"
                 android:title="@string/double_tap_to_sleep_title"
                 android:summary="@string/double_tap_to_sleep_summary"
                 android:defaultValue="false" />
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnigears.preference.SystemCheckBoxPreference
                 android:key="status_bar_ime_notification"
                 android:title="@string/status_bar_ime_notification_title"
                 android:summary="@string/status_bar_ime_notification_summary"
                 android:defaultValue="true"/>
+
         </PreferenceCategory>
 
+        <PreferenceScreen
+                android:key="category_network_traffic"
+                android:title="@string/network_traffic_title"
+                android:fragment="org.omnirom.omnigears.interfacesettings.NetworkTraffic" />
+
         <PreferenceCategory
             android:key="category_navigationbar"
             android:title="@string/navigationbar_title">
 
-            <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            <org.omnirom.omnigears.preference.SystemCheckBoxPreference
                 android:key="navigation_bar_ime_button"
                 android:title="@string/navigation_bar_ime_button_title"
                 android:summary="@string/navigation_bar_ime_button_summary"
                 android:defaultValue="true"/>
 
+
         </PreferenceCategory>
 </PreferenceScreen>
diff --git a/res/xml/network_traffic.xml b/res/xml/network_traffic.xml
new file mode 100644
index 0000000..6877985
--- /dev/null
+++ b/res/xml/network_traffic.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--  Copyright (C) 2015 The OmniROM Project
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+        android:key="category_network_traffic"
+        android:title="@string/network_traffic_title">
+
+            <ListPreference
+                android:key="network_traffic_state"
+                android:title="@string/show_network_traffic_state"
+                android:entries="@array/show_network_traffic_state_entries"
+                android:entryValues="@array/show_network_traffic_state_values"
+                android:persistent="false" />
+
+            <ListPreference
+                android:key="network_traffic_unit"
+                android:title="@string/show_network_traffic_unit"
+                android:entries="@array/show_network_traffic_unit_entries"
+                android:entryValues="@array/show_network_traffic_unit_values"
+                android:persistent="false" />
+
+            <ListPreference
+                android:key="network_traffic_period"
+                android:title="@string/show_network_traffic_frequency"
+                android:entries="@array/show_network_traffic_frequency_entries"
+                android:entryValues="@array/show_network_traffic_frequency_values"
+                android:persistent="false" />
+
+            <org.omnirom.omnigears.preference.SystemCheckBoxPreference
+                android:key="network_traffic_autohide"
+                android:title="@string/network_traffic_autohide_title"
+                android:summary="@string/network_traffic_autohide_summary"
+                android:defaultValue="false"/>
+
+            <org.omnirom.omnigears.preference.SeekBarPreference
+                android:key="network_traffic_autohide_threshold"
+                android:title="@string/network_traffic_autohide_threshold"
+                android:max="100"
+                settings:min="0"
+                settings:unitsLeft=""
+                settings:unitsRight="kB/s"
+                android:dependency="network_traffic_autohide"
+                android:persistent="false" />
+
+</PreferenceScreen>
diff --git a/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java b/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
index c87a0cd..22702af 100644
--- a/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/BarsSettings.java
@@ -25,22 +25,35 @@
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.util.Log;
+import android.net.TrafficStats;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 
+import android.support.v7.preference.CheckBoxPreference;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceCategory;
+
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.R;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
+import com.android.internal.util.omni.DeviceUtils;
+import com.android.settings.Utils;
+
 import java.util.List;
 import java.util.ArrayList;
 
 public class BarsSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
     private static final String TAG = "BarsSettings";
+    private static final String NETWORK_TRAFFIC_ROOT = "category_network_traffic";
+    private static final String NAVIGATIONBAR_ROOT = "category_navigationbar";
 
     @Override
     public int getMetricsCategory() {
@@ -51,6 +64,74 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.bars_settings);
+
+        PreferenceScreen prefScreen = getPreferenceScreen();
+
+        // Navigationbar catagory will not be displayed when the device is not a tablet
+        // or the device has physical keys
+        if ((!DeviceUtils.deviceSupportNavigationBar(getActivity())) || DeviceUtils.isPhone(getActivity())) {
+            prefScreen.removePreference(findPreference(NAVIGATIONBAR_ROOT));
+        }
+
+        // TrafficStats will return UNSUPPORTED if the device does not support it.
+        if (TrafficStats.getTotalTxBytes() == TrafficStats.UNSUPPORTED ||
+                TrafficStats.getTotalRxBytes() == TrafficStats.UNSUPPORTED) {
+            prefScreen.removePreference(findPreference(NETWORK_TRAFFIC_ROOT));
+        }
+
+        //final boolean customHeaderImage = Settings.System.getInt(getContentResolver(),
+        //        Settings.System.STATUS_BAR_CUSTOM_HEADER, 0) == 1;
+        //mCustomHeaderImage = (CheckBoxPreference) findPreference(CUSTOM_HEADER_IMAGE);
+        //mCustomHeaderImage.setChecked(customHeaderImage);
+
+        //String settingHeaderPackage = Settings.System.getString(getContentResolver(),
+        //        Settings.System.STATUS_BAR_DAYLIGHT_HEADER_PACK);
+        //if (settingHeaderPackage == null) {
+        //    settingHeaderPackage = DEFAULT_HEADER_PACKAGE;
+        //}
+        //mDaylightHeaderPack = (ListPreference) findPreference(DAYLIGHT_HEADER_PACK);
+
+        //List<String> entries = new ArrayList<String>();
+        //List<String> values = new ArrayList<String>();
+        //getAvailableHeaderPacks(entries, values);
+        //mDaylightHeaderPack.setEntries(entries.toArray(new String[entries.size()]));
+        //mDaylightHeaderPack.setEntryValues(values.toArray(new String[values.size()]));
+
+        //int valueIndex = mDaylightHeaderPack.findIndexOfValue(settingHeaderPackage);
+        //if (valueIndex == -1) {
+            // no longer found
+        //    settingHeaderPackage = DEFAULT_HEADER_PACKAGE;
+        //    Settings.System.putString(getContentResolver(),
+        //            Settings.System.STATUS_BAR_DAYLIGHT_HEADER_PACK, settingHeaderPackage);
+        //    valueIndex = mDaylightHeaderPack.findIndexOfValue(settingHeaderPackage);
+        //}
+        //mDaylightHeaderPack.setValueIndex(valueIndex >= 0 ? valueIndex : 0);
+        //mDaylightHeaderPack.setSummary(mDaylightHeaderPack.getEntry());
+        //mDaylightHeaderPack.setOnPreferenceChangeListener(this);
+
+        //mHeaderShadow = (SeekBarPreference) findPreference(CUSTOM_HEADER_IMAGE_SHADOW);
+        //final int headerShadow = Settings.System.getInt(getContentResolver(),
+        //        Settings.System.STATUS_BAR_CUSTOM_HEADER_SHADOW, 0);
+        //mHeaderShadow.setValue((int)(((double) headerShadow / 255) * 100));
+        //mHeaderShadow.setOnPreferenceChangeListener(this);
+
+        //mQuickPulldown = (ListPreference) findPreference(QUICK_SETTTINGS_PULLDOWN);
+        //mQuickPulldown.setOnPreferenceChangeListener(this);
+        //int quickPullDownValue = Settings.System.getInt(getContentResolver(), Settings.System.STATUS_BAR_QUICK_QS_PULLDOWN, 0);
+        //mQuickPulldown.setValue(String.valueOf(quickPullDownValue));
+        //updatePulldownSummary(quickPullDownValue);
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        //if (preference == mCustomHeaderImage) {
+        //    final boolean value = ((CheckBoxPreference)preference).isChecked();
+        //    Settings.System.putInt(getContentResolver(),
+        //            Settings.System.STATUS_BAR_CUSTOM_HEADER, value ? 1 : 0);
+        //    return true;
+        //}
+        // If we didn't handle it, let preferences handle it.
+        return super.onPreferenceTreeClick(preference);
     }
 
     @Override
diff --git a/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java b/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java
new file mode 100644
index 0000000..6f983f9
--- /dev/null
+++ b/src/org/omnirom/omnigears/interfacesettings/NetworkTraffic.java
@@ -0,0 +1,204 @@
+/*
+ *  Copyright (C) 2015 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.omnirom.omnigears.interfacesettings;
+
+import android.app.AlertDialog;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.net.TrafficStats;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceGroup;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.PreferenceCategory;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
+
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.R;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.omni.DeviceUtils;
+import com.android.settings.Utils;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.omnirom.omnigears.preference.SeekBarPreference;
+import org.omnirom.omnigears.preference.SystemCheckBoxPreference;
+
+public class NetworkTraffic extends SettingsPreferenceFragment implements
+        Preference.OnPreferenceChangeListener, Indexable {
+    private static final String TAG = "NetworkTraffic";
+
+    private static final String NETWORK_TRAFFIC_STATE = "network_traffic_state";
+    private static final String NETWORK_TRAFFIC_UNIT = "network_traffic_unit";
+    private static final String NETWORK_TRAFFIC_PERIOD = "network_traffic_period";
+    private static final String NETWORK_TRAFFIC_AUTOHIDE = "network_traffic_autohide";
+    private static final String NETWORK_TRAFFIC_AUTOHIDE_THRESHOLD = "network_traffic_autohide_threshold";
+
+    private ListPreference mNetTrafficState;
+    private ListPreference mNetTrafficUnit;
+    private ListPreference mNetTrafficPeriod;
+    private SystemCheckBoxPreference mNetTrafficAutohide;
+    private SeekBarPreference mNetTrafficAutohideThreshold;
+
+    private int mNetTrafficVal;
+    private int MASK_UP;
+    private int MASK_DOWN;
+    private int MASK_UNIT;
+    private int MASK_PERIOD;
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsEvent.OMNI_SETTINGS;
+    }
+
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.network_traffic);
+        loadResources();
+
+        PreferenceScreen prefScreen = getPreferenceScreen();
+        ContentResolver resolver = getActivity().getContentResolver();
+
+        mNetTrafficState = (ListPreference) prefScreen.findPreference(NETWORK_TRAFFIC_STATE);
+        mNetTrafficUnit = (ListPreference) prefScreen.findPreference(NETWORK_TRAFFIC_UNIT);
+        mNetTrafficPeriod = (ListPreference) prefScreen.findPreference(NETWORK_TRAFFIC_PERIOD);
+        mNetTrafficAutohide = (SystemCheckBoxPreference) prefScreen.findPreference(NETWORK_TRAFFIC_AUTOHIDE);
+        mNetTrafficAutohideThreshold = (SeekBarPreference) prefScreen.findPreference(NETWORK_TRAFFIC_AUTOHIDE_THRESHOLD);
+
+        // TrafficStats will return UNSUPPORTED if the device does not support it.
+        if (TrafficStats.getTotalTxBytes() != TrafficStats.UNSUPPORTED &&
+                TrafficStats.getTotalRxBytes() != TrafficStats.UNSUPPORTED) {
+            mNetTrafficVal = Settings.System.getInt(resolver, Settings.System.NETWORK_TRAFFIC_STATE, 0);
+            int intIndex = mNetTrafficVal & (MASK_UP + MASK_DOWN);
+            intIndex = mNetTrafficState.findIndexOfValue(String.valueOf(intIndex));
+
+            mNetTrafficState.setValueIndex(intIndex >= 0 ? intIndex : 0);
+            mNetTrafficState.setSummary(mNetTrafficState.getEntry());
+            mNetTrafficState.setOnPreferenceChangeListener(this);
+
+            mNetTrafficUnit.setValueIndex(getBit(mNetTrafficVal, MASK_UNIT) ? 1 : 0);
+            mNetTrafficUnit.setSummary(mNetTrafficUnit.getEntry());
+            mNetTrafficUnit.setOnPreferenceChangeListener(this);
+
+            int period = (mNetTrafficVal & MASK_PERIOD) >>> 16;
+            int periodIndex = mNetTrafficPeriod.findIndexOfValue(String.valueOf(period));
+            mNetTrafficPeriod.setValueIndex(periodIndex >= 0 ? periodIndex : 1);
+            mNetTrafficPeriod.setSummary(mNetTrafficPeriod.getEntry());
+            mNetTrafficPeriod.setOnPreferenceChangeListener(this);
+
+            int netTrafficAutohideThreshold = Settings.System.getInt(getContentResolver(),
+                    Settings.System.NETWORK_TRAFFIC_AUTOHIDE_THRESHOLD, 10);
+            mNetTrafficAutohideThreshold.setValue(netTrafficAutohideThreshold / 1);
+            mNetTrafficAutohideThreshold.setOnPreferenceChangeListener(this);
+
+            mNetTrafficUnit.setEnabled(intIndex != 0);
+            mNetTrafficPeriod.setEnabled(intIndex != 0);
+            mNetTrafficAutohide.setEnabled(intIndex != 0);
+            mNetTrafficAutohideThreshold.setEnabled(intIndex != 0);
+        }
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        ContentResolver resolver = getActivity().getContentResolver();
+        if (preference == mNetTrafficState) {
+            int intState = Integer.valueOf((String)newValue);
+            mNetTrafficVal = setBit(mNetTrafficVal, MASK_UP, getBit(intState, MASK_UP));
+            mNetTrafficVal = setBit(mNetTrafficVal, MASK_DOWN, getBit(intState, MASK_DOWN));
+            Settings.System.putInt(resolver, Settings.System.NETWORK_TRAFFIC_STATE, mNetTrafficVal);
+            int index = mNetTrafficState.findIndexOfValue((String) newValue);
+            mNetTrafficState.setSummary(mNetTrafficState.getEntries()[index]);
+            mNetTrafficUnit.setEnabled(intState != 0);
+            mNetTrafficPeriod.setEnabled(intState != 0);
+            mNetTrafficAutohide.setEnabled(intState != 0);
+            mNetTrafficAutohideThreshold.setEnabled(intState != 0);
+        } else if (preference == mNetTrafficUnit) {
+            // 1 = Display as Byte/s; default is bit/s
+            mNetTrafficVal = setBit(mNetTrafficVal, MASK_UNIT, ((String)newValue).equals("1"));
+            Settings.System.putInt(resolver, Settings.System.NETWORK_TRAFFIC_STATE, mNetTrafficVal);
+            int index = mNetTrafficUnit.findIndexOfValue((String) newValue);
+            mNetTrafficUnit.setSummary(mNetTrafficUnit.getEntries()[index]);
+        } else if (preference == mNetTrafficPeriod) {
+            int intState = Integer.valueOf((String)newValue);
+            mNetTrafficVal = setBit(mNetTrafficVal, MASK_PERIOD, false) + (intState << 16);
+            Settings.System.putInt(resolver, Settings.System.NETWORK_TRAFFIC_STATE, mNetTrafficVal);
+            int index = mNetTrafficPeriod.findIndexOfValue((String) newValue);
+            mNetTrafficPeriod.setSummary(mNetTrafficPeriod.getEntries()[index]);
+        } else if (preference == mNetTrafficAutohideThreshold) {
+            int threshold = (Integer) newValue;
+            Settings.System.putInt(getActivity().getContentResolver(),
+                    Settings.System.NETWORK_TRAFFIC_AUTOHIDE_THRESHOLD, threshold * 1);
+        }
+
+        return true;
+    }
+
+    private void loadResources() {
+        Resources resources = getActivity().getResources();
+        MASK_UP = resources.getInteger(R.integer.maskUp);
+        MASK_DOWN = resources.getInteger(R.integer.maskDown);
+        MASK_UNIT = resources.getInteger(R.integer.maskUnit);
+        MASK_PERIOD = resources.getInteger(R.integer.maskPeriod);
+    }
+
+    // intMask should only have the desired bit(s) set
+    private int setBit(int intNumber, int intMask, boolean blnState) {
+        if (blnState) {
+            return (intNumber | intMask);
+        }
+        return (intNumber & ~intMask);
+    }
+
+    private boolean getBit(int intNumber, int intMask) {
+        return (intNumber & intMask) == intMask;
+    }
+
+    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider() {
+                @Override
+                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+                        boolean enabled) {
+                    ArrayList<SearchIndexableResource> result =
+                            new ArrayList<SearchIndexableResource>();
+
+                    SearchIndexableResource sir = new SearchIndexableResource(context);
+                    sir.xmlResId = R.xml.network_traffic;
+                    result.add(sir);
+
+                    return result;
+                }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    ArrayList<String> result = new ArrayList<String>();
+                    return result;
+                }
+            };
+}