diff options
Diffstat (limited to 'src/com')
4 files changed, 70 insertions, 34 deletions
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java index 098f57ac7..bd79669a9 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 d8344d52f..6c9ded4ed 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 bf5616db5..9223ca6d2 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 6fe40425a..a8bdaa6f8 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; } } |