From 198dd3e8cf9aedfa8b57308b770bf544e10b8c8f Mon Sep 17 00:00:00 2001 From: Tim Su Date: Wed, 8 Feb 2012 01:57:56 -0800 Subject: [PATCH] Nestable view pager is pretty cool --- astrid/res/layout/task_edit_activity.xml | 2 +- .../astrid/activity/TaskEditFragment.java | 6 ++-- .../todoroo/astrid/ui/NestableViewPager.java | 29 +++++++++++++++++++ .../todoroo/astrid/ui/WebServicesView.java | 26 +++++++++++++---- 4 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 astrid/src/com/todoroo/astrid/ui/NestableViewPager.java diff --git a/astrid/res/layout/task_edit_activity.xml b/astrid/res/layout/task_edit_activity.xml index 2729cdfcc..78d331a26 100644 --- a/astrid/res/layout/task_edit_activity.xml +++ b/astrid/res/layout/task_edit_activity.xml @@ -106,7 +106,7 @@ android:layout_weight="1" android:visibility="gone" /> - diff --git a/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java index 487d8f7b1..1cd079859 100755 --- a/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskEditFragment.java @@ -95,6 +95,7 @@ import com.todoroo.astrid.ui.EditNotesControlSet; import com.todoroo.astrid.ui.EditTitleControlSet; import com.todoroo.astrid.ui.HideUntilControlSet; import com.todoroo.astrid.ui.ImportanceControlSet; +import com.todoroo.astrid.ui.NestableViewPager; import com.todoroo.astrid.ui.ReminderControlSet; import com.todoroo.astrid.ui.TaskEditMoreControls; import com.todoroo.astrid.ui.WebServicesView; @@ -205,7 +206,7 @@ public final class TaskEditFragment extends Fragment implements private EditText title; private TaskEditMoreControls moreControls; private EditNoteActivity editNotes; - private ViewPager mPager; + private NestableViewPager mPager; private TaskEditViewPager mAdapter; private TabPageIndicator mIndicator; @@ -425,8 +426,9 @@ public final class TaskEditFragment extends Fragment implements mAdapter = new TaskEditViewPager(getActivity(), tabStyle); mAdapter.parent = this; - mPager = (ViewPager) getView().findViewById(R.id.pager); + mPager = (NestableViewPager) getView().findViewById(R.id.pager); mPager.setAdapter(mAdapter); + mPager.setScrollabelViews(webServices.getScrollableViews()); mIndicator = (TabPageIndicator) getView().findViewById( R.id.indicator); diff --git a/astrid/src/com/todoroo/astrid/ui/NestableViewPager.java b/astrid/src/com/todoroo/astrid/ui/NestableViewPager.java new file mode 100644 index 000000000..3c6400458 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/ui/NestableViewPager.java @@ -0,0 +1,29 @@ +package com.todoroo.astrid.ui; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewParent; + +public class NestableViewPager extends ViewPager { + private int[] scrollableViews = new int[0]; + + public NestableViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + for(int i = 0; i < scrollableViews.length; i++) { + View view = findViewById(scrollableViews[i]); + if (view instanceof ViewParent) + ((ViewParent)view).requestDisallowInterceptTouchEvent(true); + } + return super.onInterceptTouchEvent(event); + } + + public void setScrollabelViews(int[] views) { + this.scrollableViews = views; + } +} diff --git a/astrid/src/com/todoroo/astrid/ui/WebServicesView.java b/astrid/src/com/todoroo/astrid/ui/WebServicesView.java index 37831f001..5b53c2387 100644 --- a/astrid/src/com/todoroo/astrid/ui/WebServicesView.java +++ b/astrid/src/com/todoroo/astrid/ui/WebServicesView.java @@ -36,7 +36,6 @@ import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; -import com.todoroo.andlib.service.HttpErrorException; import com.todoroo.andlib.service.RestClient; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.AmazonRequestsHelper; @@ -50,6 +49,9 @@ public class WebServicesView extends LinearLayout { private static final int ROW_HEIGHT = 100; + private static final int ID_AMAZON = 0x3423712; + private static final int ID_GOOGLE = 0x3487532; + private static final String GOOGLE_SEARCH_URL = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="; private Task task; @@ -77,6 +79,10 @@ public class WebServicesView extends LinearLayout { initialize(); } + public int[] getScrollableViews() { + return new int[] { ID_AMAZON, ID_GOOGLE }; + } + /** * Initialize view */ @@ -108,7 +114,7 @@ public class WebServicesView extends LinearLayout { protected void initializeAmazon() { addSectionHeader("Amazon.com"); - final LinearLayout body = addHorizontalScroller(); + final LinearLayout body = addHorizontalScroller(ID_AMAZON); new Thread() { @Override @@ -181,7 +187,7 @@ public class WebServicesView extends LinearLayout { } else if("Error".equals(xpp.getName())) { while(!"Message".equals(xpp.getName())) xpp.next(); - throw new HttpErrorException(0, xpp.getText()); + throw new AmazonException(xpp.nextText()); } } else if(eventType == XmlPullParser.END_TAG) { if("Item".equals(xpp.getName())) @@ -216,6 +222,15 @@ public class WebServicesView extends LinearLayout { } } + private class AmazonException extends Exception { + + private static final long serialVersionUID = -3759207030258905605L; + + public AmazonException(String arg0) { + super(arg0); + } + + } /** * Initialize Google search results @@ -223,7 +238,7 @@ public class WebServicesView extends LinearLayout { protected void initializeGoogleSearch() { addSectionHeader("Google Search"); - final LinearLayout body = addHorizontalScroller(); + final LinearLayout body = addHorizontalScroller(ID_GOOGLE); new Thread() { @Override @@ -326,10 +341,11 @@ public class WebServicesView extends LinearLayout { }); } - protected LinearLayout addHorizontalScroller() { + protected LinearLayout addHorizontalScroller(int id) { HorizontalScrollView scroll = new HorizontalScrollView(getContext()); scroll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); + scroll.setId(id); addView(scroll); LinearLayout body = new LinearLayout(getContext());