Merge "Fix animation bugs, stop disabled sweep touches."

This commit is contained in:
Jeff Sharkey
2011-06-24 23:13:13 -07:00
committed by Android (Google) Code Review
10 changed files with 86 additions and 40 deletions

View File

@@ -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" />

View File

@@ -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" />

View File

@@ -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" />

View File

@@ -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" />

View File

@@ -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"

View File

@@ -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">

View File

@@ -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);
@@ -344,6 +350,25 @@ public class DataUsageSummary extends Fragment {
mDisableAtLimitView = null;
}
/**
* 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
@@ -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);

View File

@@ -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

View File

@@ -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 =

View File

@@ -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;
}
}