summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2011-06-24 17:30:27 -0700
committerJeff Sharkey <jsharkey@android.com>2011-06-24 23:11:51 -0700
commit2af35fb44d385d7a04ea1b421c426a0350f0e896 (patch)
tree4acce87be36aa48385c209c5975bff757fd18f13
parentf54f435f1f3215b39798c671fc64344d1867de4e (diff)
downloadpackages_apps_settings-2af35fb44d385d7a04ea1b421c426a0350f0e896.zip
packages_apps_settings-2af35fb44d385d7a04ea1b421c426a0350f0e896.tar.gz
packages_apps_settings-2af35fb44d385d7a04ea1b421c426a0350f0e896.tar.bz2
Fix animation bugs, stop disabled sweep touches.
Change sweep drawables to crossfade correctly between states, and work around 4946591 by nesting container one level deeper. Also wait until first layout pass is finished before applying LayoutTransition. Prevent touches from reaching sweeps when chart is disabled. Also bring back log scale for data. Change-Id: I2194714ab075fd32525681119f30427c1b96fc50
-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;
}
}