summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClark Scheff <clark@cyngn.com>2014-08-01 14:40:00 -0700
committerClark Scheff <clark@cyngn.com>2014-08-04 17:00:58 +0000
commita3436527cd7531db85d8e844d70fcb0f049727a9 (patch)
tree891f28bc875e5b1d9590b26d71095c74de83dfe3
parent3f8d7af0709c4ef693a934a1e904f3dc227f1f06 (diff)
downloadpackages_apps_ThemeChooser-a3436527cd7531db85d8e844d70fcb0f049727a9.zip
packages_apps_ThemeChooser-a3436527cd7531db85d8e844d70fcb0f049727a9.tar.gz
packages_apps_ThemeChooser-a3436527cd7531db85d8e844d70fcb0f049727a9.tar.bz2
Scroll the ScrollView to reveal content behing component selector.
The current implementation shifted the entire content view up which caused the top to be off screen and the user unable to scroll all the way to the top while the component selector was out. This patch animates scrolling the content in the ScrollView and adds a space view to the bottom so that all content will be visible above the component selector. Change-Id: I48577e941b6429db3673b6769f44f3519097b2e8
-rw-r--r--src/com/cyngn/theme/chooser/ChooserActivity.java9
-rw-r--r--src/com/cyngn/theme/chooser/ThemeFragment.java74
2 files changed, 78 insertions, 5 deletions
diff --git a/src/com/cyngn/theme/chooser/ChooserActivity.java b/src/com/cyngn/theme/chooser/ChooserActivity.java
index 9809015..1c375de 100644
--- a/src/com/cyngn/theme/chooser/ChooserActivity.java
+++ b/src/com/cyngn/theme/chooser/ChooserActivity.java
@@ -59,7 +59,6 @@ public class ChooserActivity extends FragmentActivity
public static final int REQUEST_UNINSTALL = 1; // Request code
public static final String EXTRA_PKGNAME = "pkgName";
- private static final long SLIDE_CONTENT_ANIM_DURATION = 300L;
private static final long MOVE_TO_MY_THEME_DELAY = 750L;
private static final int OFFSCREEN_PAGE_LIMIT = 3;
@@ -256,19 +255,19 @@ public class ChooserActivity extends FragmentActivity
coordinates[1] += v.getHeight();
int top = getWindowManager().getDefaultDisplay().getHeight() - height;
if (coordinates[1] > top) {
- slideContentUp(top - coordinates[1]);
+ slideContentUp(top - coordinates[1], height);
}
}
}
- private void slideContentUp(int yDelta) {
+ private void slideContentUp(int yDelta, int selectorHeight) {
yDelta -= getResources().getDimensionPixelSize(R.dimen.content_offset_padding);
+ getCurrentFragment().slideContentUp(-yDelta, selectorHeight);
mContainerYOffset = yDelta;
- mContainer.animate().translationYBy(yDelta).setDuration(SLIDE_CONTENT_ANIM_DURATION);
}
private void slideContentDown(final int yDelta) {
- mContainer.animate().translationYBy(-yDelta).setDuration(SLIDE_CONTENT_ANIM_DURATION);
+ getCurrentFragment().slideContentDown(yDelta);
}
@Override
diff --git a/src/com/cyngn/theme/chooser/ThemeFragment.java b/src/com/cyngn/theme/chooser/ThemeFragment.java
index 17f11f0..07e1c59 100644
--- a/src/com/cyngn/theme/chooser/ThemeFragment.java
+++ b/src/com/cyngn/theme/chooser/ThemeFragment.java
@@ -75,6 +75,7 @@ import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
import android.widget.ScrollView;
+import android.widget.Space;
import android.widget.TextView;
import android.widget.Toast;
@@ -144,6 +145,9 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb
new ComponentName("com.android.gallery3d", "com.android.gallery3d.app.GalleryActivity");
private static final String CAMERA_NEXT_PACKAGE = "com.cyngn.cameranext";
+ private static final int ADDITIONAL_CONTENT_SPACE_ID = 123456;
+ private static final long SLIDE_CONTENT_ANIM_DURATION = 300L;
+
protected static final int LOADER_ID_ALL = 0;
protected static final int LOADER_ID_STATUS_BAR = 1;
protected static final int LOADER_ID_FONT = 2;
@@ -1747,6 +1751,76 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb
mCurrentTheme = currentTheme;
}
+ /**
+ * Slides the scrollview content up and adds a space view at the bottom
+ * of mAdditionalCards so all content can be visible above the selector.
+ *
+ * We are using a ValueAnimator here to scroll the content rather than calling
+ * mScrollView.smoothScrollBy() since the speed of that animation cannot be customized.
+ * @param yDelta
+ * @param selectorHeight
+ */
+ public void slideContentUp(final int yDelta, int selectorHeight) {
+ Space space = new Space(getActivity());
+ space.setId(ADDITIONAL_CONTENT_SPACE_ID);
+ mAdditionalCards.addView(space, new LinearLayout.LayoutParams(
+ LinearLayout.LayoutParams.MATCH_PARENT, selectorHeight));
+ final int startY = mScrollView.getScrollY();
+ final ValueAnimator scrollAnimator =
+ ValueAnimator.ofInt(startY, startY + yDelta);
+ scrollAnimator.setDuration(SLIDE_CONTENT_ANIM_DURATION);
+ scrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int value = (Integer) animation.getAnimatedValue();
+ mScrollView.scrollTo(0, value);
+ }
+ });
+ scrollAnimator.start();
+ }
+
+ /**
+ * Slides the scrollview content down and removes a space view at the bottom
+ * of mAdditionalCards.
+ *
+ * We are using a ValueAnimator here to scroll the content rather than calling
+ * mScrollView.smoothScrollBy() since the speed of that animation cannot be customized.
+ * @param yDelta
+ */
+ public void slideContentDown(int yDelta) {
+ final int startY = mScrollView.getScrollY();
+ final ValueAnimator scrollAnimator =
+ ValueAnimator.ofInt(startY, startY + yDelta);
+ scrollAnimator.setDuration(SLIDE_CONTENT_ANIM_DURATION);
+ scrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int value = (Integer) animation.getAnimatedValue();
+ mScrollView.scrollTo(0, value);
+ }
+ });
+ scrollAnimator.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ View space = mAdditionalCards.findViewById(ADDITIONAL_CONTENT_SPACE_ID);
+ if (space != null) mAdditionalCards.removeView(space);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+ }
+ });
+ scrollAnimator.start();
+ }
+
class AnimationLoader extends AsyncTask<Void, Void, Boolean> {
Context mContext;
String mPkgName;