summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/drawable/data_sweep_left.xml1
-rw-r--r--res/drawable/data_sweep_limit.xml1
-rw-r--r--res/drawable/data_sweep_right.xml1
-rw-r--r--res/drawable/data_sweep_warning.xml1
-rw-r--r--res/layout/data_usage_header.xml17
-rw-r--r--res/layout/data_usage_summary.xml1
-rw-r--r--src/com/android/settings/DataUsageSummary.java43
-rw-r--r--src/com/android/settings/widget/ChartSweepView.java7
-rw-r--r--src/com/android/settings/widget/ChartView.java2
-rw-r--r--src/com/android/settings/widget/DataUsageChartView.java52
10 files changed, 86 insertions, 40 deletions
diff --git a/res/drawable/data_sweep_left.xml b/res/drawable/data_sweep_left.xml
index cb801a0..3532cbc 100644
--- a/res/drawable/data_sweep_left.xml
+++ b/res/drawable/data_sweep_left.xml
@@ -15,6 +15,7 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="@android:integer/config_mediumAnimTime"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_activated="true" android:state_enabled="true" android:drawable="@drawable/data_sweep_left_activated" />
diff --git a/res/drawable/data_sweep_limit.xml b/res/drawable/data_sweep_limit.xml
index 378b0aa..cfdbfbb 100644
--- a/res/drawable/data_sweep_limit.xml
+++ b/res/drawable/data_sweep_limit.xml
@@ -15,6 +15,7 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="@android:integer/config_mediumAnimTime"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_activated="true" android:state_enabled="true" android:drawable="@drawable/data_sweep_limit_activated" />
diff --git a/res/drawable/data_sweep_right.xml b/res/drawable/data_sweep_right.xml
index a75a1b2..cbe2a85 100644
--- a/res/drawable/data_sweep_right.xml
+++ b/res/drawable/data_sweep_right.xml
@@ -15,6 +15,7 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="@android:integer/config_mediumAnimTime"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_activated="true" android:state_enabled="true" android:drawable="@drawable/data_sweep_right_activated" />
diff --git a/res/drawable/data_sweep_warning.xml b/res/drawable/data_sweep_warning.xml
index 001d0c5..8fbe8e7 100644
--- a/res/drawable/data_sweep_warning.xml
+++ b/res/drawable/data_sweep_warning.xml
@@ -15,6 +15,7 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:enterFadeDuration="@android:integer/config_mediumAnimTime"
android:exitFadeDuration="@android:integer/config_mediumAnimTime">
<item android:state_activated="true" android:state_enabled="true" android:drawable="@drawable/data_sweep_warning_activated" />
diff --git a/res/layout/data_usage_header.xml b/res/layout/data_usage_header.xml
index 3f4ca5b..547d85d 100644
--- a/res/layout/data_usage_header.xml
+++ b/res/layout/data_usage_header.xml
@@ -19,13 +19,18 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <LinearLayout
- android:id="@+id/network_switches"
+ <FrameLayout
+ android:id="@+id/network_switches_container"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:showDividers="middle|end"
- android:divider="?android:attr/listDivider" />
+ android:layout_height="wrap_content">
+ <LinearLayout
+ android:id="@+id/network_switches"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:showDividers="middle|end"
+ android:divider="?android:attr/listDivider" />
+ </FrameLayout>
<LinearLayout
android:layout_width="match_parent"
diff --git a/res/layout/data_usage_summary.xml b/res/layout/data_usage_summary.xml
index 41b8eed..7e68143 100644
--- a/res/layout/data_usage_summary.xml
+++ b/res/layout/data_usage_summary.xml
@@ -20,6 +20,7 @@
android:layout_height="match_parent">
<LinearLayout
+ android:id="@+id/tabs_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 098f57a..bd79669 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -71,6 +71,7 @@ import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
@@ -136,12 +137,14 @@ public class DataUsageSummary extends Fragment {
private SharedPreferences mPrefs;
private TabHost mTabHost;
+ private ViewGroup mTabsContainer;
private TabWidget mTabWidget;
private ListView mListView;
private DataUsageAdapter mAdapter;
private ViewGroup mHeader;
+ private ViewGroup mNetworkSwitchesContainer;
private LinearLayout mNetworkSwitches;
private Switch mDataEnabled;
private View mDataEnabledView;
@@ -176,6 +179,7 @@ public class DataUsageSummary extends Fragment {
private NetworkStatsHistory mHistory;
private NetworkStatsHistory mDetailHistory;
+ private String mCurrentTab = null;
private String mIntentTab = null;
/** Flag used to ignore listeners during binding. */
@@ -209,6 +213,7 @@ public class DataUsageSummary extends Fragment {
final View view = inflater.inflate(R.layout.data_usage_summary, container, false);
mTabHost = (TabHost) view.findViewById(android.R.id.tabhost);
+ mTabsContainer = (ViewGroup) view.findViewById(R.id.tabs_container);
mTabWidget = (TabWidget) view.findViewById(android.R.id.tabs);
mListView = (ListView) view.findViewById(android.R.id.list);
@@ -220,6 +225,8 @@ public class DataUsageSummary extends Fragment {
{
// bind network switches
+ mNetworkSwitchesContainer = (ViewGroup) mHeader.findViewById(
+ R.id.network_switches_container);
mNetworkSwitches = (LinearLayout) mHeader.findViewById(R.id.network_switches);
mDataEnabled = new Switch(inflater.getContext());
@@ -263,9 +270,8 @@ public class DataUsageSummary extends Fragment {
mAppSwitches.addView(mAppRestrictView);
}
- // TODO: tweak these transitions
- final LayoutTransition transition = new LayoutTransition();
- mHeader.setLayoutTransition(transition);
+ // only assign layout transitions once first layout is finished
+ mHeader.getViewTreeObserver().addOnGlobalLayoutListener(mFirstLayoutListener);
mAdapter = new DataUsageAdapter();
mListView.setOnItemClickListener(mListListener);
@@ -345,6 +351,25 @@ public class DataUsageSummary extends Fragment {
}
/**
+ * Listener to setup {@link LayoutTransition} after first layout pass.
+ */
+ private OnGlobalLayoutListener mFirstLayoutListener = new OnGlobalLayoutListener() {
+ /** {@inheritDoc} */
+ public void onGlobalLayout() {
+ mHeader.getViewTreeObserver().removeGlobalOnLayoutListener(mFirstLayoutListener);
+
+ mTabsContainer.setLayoutTransition(new LayoutTransition());
+ mHeader.setLayoutTransition(new LayoutTransition());
+ mNetworkSwitchesContainer.setLayoutTransition(new LayoutTransition());
+
+ final LayoutTransition chartTransition = new LayoutTransition();
+ chartTransition.setStartDelay(LayoutTransition.APPEARING, 0);
+ chartTransition.setStartDelay(LayoutTransition.DISAPPEARING, 0);
+ mChart.setLayoutTransition(chartTransition);
+ }
+ };
+
+ /**
* Rebuild all tabs based on {@link NetworkPolicyEditor} and
* {@link #mShowWifi}, hiding the tabs entirely when applicable. Selects
* first tab, and kicks off a full rebind of body contents.
@@ -434,6 +459,9 @@ public class DataUsageSummary extends Fragment {
throw new IllegalStateException("no mobile or wifi radios");
}
+ final boolean tabChanged = !currentTab.equals(mCurrentTab);
+ mCurrentTab = currentTab;
+
if (LOGD) Log.d(TAG, "updateBody() with currentTab=" + currentTab);
if (TAB_WIFI.equals(currentTab)) {
@@ -480,7 +508,8 @@ public class DataUsageSummary extends Fragment {
// bind chart to historical stats
mChart.bindNetworkStats(mHistory);
- updatePolicy(true);
+ // only update policy when switching tabs
+ updatePolicy(tabChanged);
updateAppDetail();
// force scroll to top of body
@@ -607,6 +636,12 @@ public class DataUsageSummary extends Fragment {
// we fall through to update cycle list for detail mode
} else {
mNetworkSwitches.setVisibility(View.VISIBLE);
+
+ // when heading back to summary without cycle refresh, kick details
+ // update to repopulate list.
+ if (!refreshCycle) {
+ updateDetailData();
+ }
}
final NetworkPolicy policy = mPolicyEditor.getPolicy(mTemplate);
diff --git a/src/com/android/settings/widget/ChartSweepView.java b/src/com/android/settings/widget/ChartSweepView.java
index d8344d5..6c9ded4 100644
--- a/src/com/android/settings/widget/ChartSweepView.java
+++ b/src/com/android/settings/widget/ChartSweepView.java
@@ -188,7 +188,12 @@ public class ChartSweepView extends FrameLayout {
}
public float getPoint() {
- return mAxis.convertToPoint(mValue);
+ if (isEnabled()) {
+ return mAxis.convertToPoint(mValue);
+ } else {
+ // when disabled, show along top edge
+ return 0;
+ }
}
@Override
diff --git a/src/com/android/settings/widget/ChartView.java b/src/com/android/settings/widget/ChartView.java
index bf5616d..9223ca6 100644
--- a/src/com/android/settings/widget/ChartView.java
+++ b/src/com/android/settings/widget/ChartView.java
@@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
@@ -93,7 +94,6 @@ public class ChartView extends FrameLayout {
// sweep is always placed along specific dimension
final ChartSweepView sweep = (ChartSweepView) child;
final Rect sweepMargins = sweep.getSweepMargins();
- final float point = sweep.getPoint();
if (sweep.getFollowAxis() == ChartSweepView.HORIZONTAL) {
parentRect.left = parentRect.right =
diff --git a/src/com/android/settings/widget/DataUsageChartView.java b/src/com/android/settings/widget/DataUsageChartView.java
index 6fe4042..a8bdaa6 100644
--- a/src/com/android/settings/widget/DataUsageChartView.java
+++ b/src/com/android/settings/widget/DataUsageChartView.java
@@ -129,9 +129,7 @@ public class DataUsageChartView extends ChartView {
mSweepLimit.setValue(policy.limitBytes);
mSweepLimit.setEnabled(true);
} else {
- // TODO: set limit default based on axis maximum
mSweepLimit.setVisibility(View.VISIBLE);
- mSweepLimit.setValue(5 * GB_IN_BYTES);
mSweepLimit.setEnabled(false);
}
@@ -189,6 +187,15 @@ public class DataUsageChartView extends ChartView {
}
}
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (!isActivated()) {
+ return true;
+ } else {
+ return super.onInterceptTouchEvent(ev);
+ }
+ }
+
/**
* Return current inspection range (start and end time) based on internal
* {@link ChartSweepView} positions.
@@ -302,56 +309,45 @@ public class DataUsageChartView extends ChartView {
public static class DataAxis implements ChartAxis {
private long mMin;
private long mMax;
- private long mMinLog;
- private long mMaxLog;
private float mSize;
public DataAxis() {
// TODO: adapt ranges to show when history >5GB, and handle 4G
// interfaces with higher limits.
- setBounds(1 * MB_IN_BYTES, 5 * GB_IN_BYTES);
+ setBounds(0, 5 * GB_IN_BYTES);
}
/** {@inheritDoc} */
public void setBounds(long min, long max) {
mMin = min;
mMax = max;
- mMinLog = (long) Math.log(mMin);
- mMaxLog = (long) Math.log(mMax);
}
/** {@inheritDoc} */
public void setSize(float size) {
- this.mSize = size;
+ mSize = size;
}
/** {@inheritDoc} */
public float convertToPoint(long value) {
- return (mSize * (value - mMin)) / (mMax - mMin);
-
- // TODO: finish tweaking log scale
-// if (value > mMin) {
-// return (float) ((mSize * (Math.log(value) - mMinLog)) / (mMaxLog - mMinLog));
-// } else {
-// return 0;
-// }
+ // TODO: this assumes range of [0,5]GB
+ final double fraction = Math.pow(
+ 10, 0.36884343106175160321 * Math.log10(value) + -3.62828151137812282556);
+ return (float) fraction * mSize;
}
/** {@inheritDoc} */
public long convertToValue(float point) {
- return (long) (mMin + ((point * (mMax - mMin)) / mSize));
-
- // TODO: finish tweaking log scale
-// return (long) Math.pow(Math.E, (mMinLog + ((point * (mMaxLog - mMinLog)) / mSize)));
+ final double y = point / mSize;
+ // TODO: this assumes range of [0,5]GB
+ final double fraction = 6.869341163271789302 * Math.pow(10, 9)
+ * Math.pow(y, 2.71117746931646030774);
+ return (long) fraction;
}
/** {@inheritDoc} */
public CharSequence getLabel(long value) {
-
// TODO: use exploded string here
-
-
- // TODO: convert to string
return Long.toString(value);
}
@@ -365,13 +361,13 @@ public class DataUsageChartView extends ChartView {
public float[] getTickPoints() {
final float[] tickPoints = new float[16];
- long value = mMax;
- float mult = 0.8f;
+ final long jump = ((mMax - mMin) / tickPoints.length);
+ long value = mMin;
for (int i = 0; i < tickPoints.length; i++) {
tickPoints[i] = convertToPoint(value);
- value = (long) (value * mult);
- mult *= 0.9;
+ value += jump;
}
+
return tickPoints;
}
}