diff options
-rw-r--r-- | res/drawable-xxhdpi/bg_themepreview_shadow.9.png | bin | 194 -> 154 bytes | |||
-rw-r--r-- | res/drawable-xxhdpi/card_themepreview_bg.9.png | bin | 1269 -> 718 bytes | |||
-rw-r--r-- | res/layout/v2_activity_main.xml | 2 | ||||
-rw-r--r-- | res/layout/v2_fragment_pager_list.xml | 2 | ||||
-rw-r--r-- | res/layout/v2item_font.xml | 4 | ||||
-rw-r--r-- | res/layout/v2item_icon.xml | 19 | ||||
-rw-r--r-- | res/values/dimens.xml | 18 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | res/values/styles.xml | 2 | ||||
-rw-r--r-- | src/android/support/v4/view/ThemeViewPager.java | 8 | ||||
-rw-r--r-- | src/org/cyanogenmod/theme/chooserv2/ChooserActivity.java | 32 | ||||
-rw-r--r-- | src/org/cyanogenmod/theme/chooserv2/PagerContainer.java | 14 | ||||
-rw-r--r-- | src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java | 46 |
13 files changed, 108 insertions, 41 deletions
diff --git a/res/drawable-xxhdpi/bg_themepreview_shadow.9.png b/res/drawable-xxhdpi/bg_themepreview_shadow.9.png Binary files differindex f368eb1..3137ccf 100644 --- a/res/drawable-xxhdpi/bg_themepreview_shadow.9.png +++ b/res/drawable-xxhdpi/bg_themepreview_shadow.9.png diff --git a/res/drawable-xxhdpi/card_themepreview_bg.9.png b/res/drawable-xxhdpi/card_themepreview_bg.9.png Binary files differindex 9dbbd30..6e6ea16 100644 --- a/res/drawable-xxhdpi/card_themepreview_bg.9.png +++ b/res/drawable-xxhdpi/card_themepreview_bg.9.png diff --git a/res/layout/v2_activity_main.xml b/res/layout/v2_activity_main.xml index cae0c31..5d81b5b 100644 --- a/res/layout/v2_activity_main.xml +++ b/res/layout/v2_activity_main.xml @@ -16,7 +16,7 @@ android:layout_gravity="center_vertical"> <android.support.v4.view.ThemeViewPager android:id="@+id/viewpager" - android:layout_width="312dp" + android:layout_width="@dimen/theme_fragment_width" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:overScrollMode="never"/> diff --git a/res/layout/v2_fragment_pager_list.xml b/res/layout/v2_fragment_pager_list.xml index 08f23ec..5ec265e 100644 --- a/res/layout/v2_fragment_pager_list.xml +++ b/res/layout/v2_fragment_pager_list.xml @@ -25,7 +25,7 @@ android:background="@drawable/bg_themepreview_shadow"> <ImageView android:id="@+id/wallpaper" - android:layout_width="@dimen/theme_preview_width" + android:layout_width="@dimen/wallpaper_preview_width" android:layout_height="@dimen/theme_preview_height" android:layout_gravity="center_horizontal" android:scaleType="centerCrop" diff --git a/res/layout/v2item_font.xml b/res/layout/v2item_font.xml index a36b489..11876b9 100644 --- a/res/layout/v2item_font.xml +++ b/res/layout/v2item_font.xml @@ -5,7 +5,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/status_bar_container" + android:layout_marginTop="@dimen/collapsed_font_card_margin_top" android:orientation="vertical" + android:padding="0dp" android:background="@drawable/theme_component_bg_transition"> <TextView android:id="@+id/label" @@ -25,7 +27,7 @@ android:shadowDx="2" android:shadowDy="2" android:shadowRadius="4" - android:textSize="32sp" + android:textSize="40sp" android:gravity="center" /> </org.cyanogenmod.theme.chooserv2.ComponentCardView> diff --git a/res/layout/v2item_icon.xml b/res/layout/v2item_icon.xml index 10c7f46..e9e81db 100644 --- a/res/layout/v2item_icon.xml +++ b/res/layout/v2item_icon.xml @@ -20,28 +20,29 @@ android:id="@+id/icon_preview_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_horizontal" android:orientation="horizontal" - android:paddingLeft="30dp" - android:paddingRight="30dp" > + <Space android:layout_width="30dp" android:layout_height="match_parent"/> <ImageView - android:layout_width="0px" - android:layout_weight="1" + android:layout_width="48dp" android:layout_height="48dp" + android:scaleType="fitCenter" android:src="@drawable/comp_icon1" /> + <Space android:layout_width="30dp" android:layout_height="match_parent"/> <ImageView - android:layout_width="0px" - android:layout_weight="1" + android:layout_width="48dp" android:layout_height="48dp" + android:scaleType="fitCenter" android:src="@drawable/comp_icon2" /> + <Space android:layout_width="30dp" android:layout_height="match_parent"/> <ImageView - android:layout_width="0px" + android:layout_width="48dp" android:layout_height="48dp" - android:layout_weight="1" + android:scaleType="fitCenter" android:src="@drawable/comp_icon3" /> + <Space android:layout_width="30dp" android:layout_height="match_parent"/> </LinearLayout> </org.cyanogenmod.theme.chooserv2.ComponentCardView>
\ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 58da714..8b32391 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -21,8 +21,13 @@ <dimen name="item_browse_height">260dp</dimen> <dimen name="expanded_preview_margin">24dp</dimen> <dimen name="navigation_button_width">80dp</dimen> - <dimen name="theme_preview_width">264dp</dimen> - <dimen name="theme_preview_height">300dp</dimen> + + <!-- Theme fragment width should account for the fact that there will be cards which expand --> + <dimen name="theme_fragment_width">320dp</dimen> + <dimen name="theme_preview_width">272dp</dimen> + <!-- Should be same as theme_preview_width less the 9patch padding --> + <dimen name="wallpaper_preview_width">264dp</dimen> + <dimen name="theme_preview_height">264dp</dimen> <dimen name="component_selection_cell_width">80dp</dimen> <dimen name="component_selection_cell_height">112dp</dimen> @@ -34,11 +39,12 @@ <dimen name="component_selection_bootani_content_height">142dp</dimen> <dimen name="component_margin_top">24dp</dimen> - <dimen name="card_padding_top">0dp</dimen> + <dimen name="card_padding_top">4dp</dimen> <dimen name="card_padding_bottom">24dp</dimen> - <dimen name="card_padding_left_right">24dp</dimen> - <dimen name="collapsed_icon_card_margin_top">40dp</dimen> - <dimen name="expanded_card_margin_top">24dp</dimen> + <dimen name="card_padding_left_right">28dp</dimen> + <dimen name="collapsed_font_card_margin_top">22dp</dimen> + <dimen name="collapsed_icon_card_margin_top">48dp</dimen> + <dimen name="expanded_card_margin_top">16dp</dimen> <dimen name="wallpaper_card_height">168dp</dimen> <!-- This is a hack. The viewpager needs to expand horizontally diff --git a/res/values/strings.xml b/res/values/strings.xml index 6735f5c..e96e90a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -47,7 +47,7 @@ <string name="unknown_author">Author unknown</string> - <string name="font_preview_letters">AaBbCcDd123</string> + <string name="font_preview_letters">AaBbCcDd</string> <string name="theme_installed_notification_title">%s installed</string> <string name="theme_installed_notification_text">Theme successfully installed.</string> diff --git a/res/values/styles.xml b/res/values/styles.xml index 989786a..e172846 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -159,5 +159,7 @@ <item name="android:textAllCaps">true</item> <item name="android:textSize">6pt</item> <item name="android:textStyle">bold</item> + <item name="android:paddingTop">4dp</item> + <item name="android:paddingBottom">4dp</item> </style> </resources> diff --git a/src/android/support/v4/view/ThemeViewPager.java b/src/android/support/v4/view/ThemeViewPager.java index cf13871..9c9b540 100644 --- a/src/android/support/v4/view/ThemeViewPager.java +++ b/src/android/support/v4/view/ThemeViewPager.java @@ -16,7 +16,6 @@ package android.support.v4.view; import android.content.Context; -import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -26,6 +25,7 @@ import org.cyanogenmod.theme.chooser.R; public class ThemeViewPager extends ViewPager { private boolean mExpanded; + private boolean mIsAnimating; private boolean mIsDragging = false; private float mSlop; @@ -45,11 +45,15 @@ public class ThemeViewPager extends ViewPager { mExpanded = expanded; } + public void setAnimating(boolean isAnimating) { + mIsAnimating = isAnimating; + } + @Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean intercept = false; - if (!mExpanded && isEnabled()) { + if (!mExpanded && isEnabled() && !mIsAnimating) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: intercept = !isTouchingApplyButton(ev); diff --git a/src/org/cyanogenmod/theme/chooserv2/ChooserActivity.java b/src/org/cyanogenmod/theme/chooserv2/ChooserActivity.java index f5830c8..2a42def 100644 --- a/src/org/cyanogenmod/theme/chooserv2/ChooserActivity.java +++ b/src/org/cyanogenmod/theme/chooserv2/ChooserActivity.java @@ -22,6 +22,7 @@ import android.content.res.ThemeManager; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Handler; import android.provider.ThemesContract; import android.provider.ThemesContract.ThemesColumns; import android.support.v4.app.Fragment; @@ -61,6 +62,7 @@ public class ChooserActivity extends FragmentActivity private PagerContainer mContainer; private ThemeViewPager mPager; private Button mEdit; + private ThemesAdapter mAdapter; private ThemeManager mService; private boolean mExpanded = false; @@ -68,6 +70,8 @@ public class ChooserActivity extends FragmentActivity private View mSaveApplyLayout; private int mContainerYOffset = 0; private TypefaceHelperCache mTypefaceHelperCache; + private boolean mIsAnimating; + private Handler mHandler; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -82,7 +86,7 @@ public class ChooserActivity extends FragmentActivity mPager.setAdapter(mAdapter); DisplayMetrics dm = getResources().getDisplayMetrics(); - int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, dm); + int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, dm); mPager.setPageMargin(-margin / 2); mPager.setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT); @@ -102,9 +106,11 @@ public class ChooserActivity extends FragmentActivity mEdit.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mExpanded = true; + mContainer.setClickable(false); mContainer.expand(); ThemeFragment f = getCurrentFragment(); f.expand(); + setAnimatingStateAndScheduleFinish(); } }); @@ -122,8 +128,10 @@ public class ChooserActivity extends FragmentActivity new View.OnClickListener() { @Override public void onClick(View v) { + if (mIsAnimating) return; hideSaveApplyButton(); mExpanded = false; + mContainer.setClickable(false); final ThemeFragment f = getCurrentFragment(); f.fadeOutCards(new Runnable() { public void run() { @@ -131,9 +139,11 @@ public class ChooserActivity extends FragmentActivity f.collapse(true); } }); + setAnimatingStateAndScheduleFinish(); } }); mTypefaceHelperCache = TypefaceHelperCache.getInstance(); + mHandler = new Handler(); } public void hideSaveApplyButton() { @@ -155,6 +165,17 @@ public class ChooserActivity extends FragmentActivity }); } + private void setAnimatingStateAndScheduleFinish() { + mIsAnimating = true; + mContainer.setIsAnimating(true); + mHandler.postDelayed(new Runnable() { + public void run() { + mIsAnimating = false; + mContainer.setIsAnimating(false); + } + }, ThemeFragment.ANIMATE_START_DELAY + ThemeFragment.ANIMATE_DURATION); + } + /** * Disable the ViewPager while a theme change is occuring */ @@ -248,6 +269,10 @@ public class ChooserActivity extends FragmentActivity final ThemeFragment f = getCurrentFragment(); f.fadeInCards(); } else if (mExpanded) { + if (mIsAnimating) { + return; + } + if (mSaveApplyLayout.getVisibility() == View.VISIBLE) { hideSaveApplyButton(); getCurrentFragment().clearChanges(); @@ -260,6 +285,7 @@ public class ChooserActivity extends FragmentActivity f.collapse(false); } }); + setAnimatingStateAndScheduleFinish(); } else { super.onBackPressed(); } @@ -288,11 +314,13 @@ public class ChooserActivity extends FragmentActivity private View.OnClickListener mPagerClickListener = new View.OnClickListener() { @Override public void onClick(View v) { - if (!mExpanded) { + if (!mExpanded && !mIsAnimating) { mExpanded = true; + mContainer.setClickable(false); mContainer.expand(); ThemeFragment f = getCurrentFragment(); f.expand(); + setAnimatingStateAndScheduleFinish(); } } }; diff --git a/src/org/cyanogenmod/theme/chooserv2/PagerContainer.java b/src/org/cyanogenmod/theme/chooserv2/PagerContainer.java index 9ed44ee..a76b324 100644 --- a/src/org/cyanogenmod/theme/chooserv2/PagerContainer.java +++ b/src/org/cyanogenmod/theme/chooserv2/PagerContainer.java @@ -51,6 +51,7 @@ public class PagerContainer extends FrameLayout implements ViewPager.OnPageChang private Point mCenter = new Point(); private Point mInitialTouch = new Point(); private int mCollapsedHeight; + private boolean mIsAnimating = false; boolean mNeedsRedraw = false; @@ -92,7 +93,16 @@ public class PagerContainer extends FrameLayout implements ViewPager.OnPageChang } @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (mIsAnimating) return true; + return super.onInterceptTouchEvent(ev); + } + + @Override public boolean onTouchEvent(MotionEvent ev) { + // Do not allow touch events to propagate if we are animating + if (mIsAnimating) return true; + //We capture any touches not already handled by the ViewPager // to implement scrolling from a touch outside the pager bounds. switch (ev.getAction()) { @@ -122,6 +132,10 @@ public class PagerContainer extends FrameLayout implements ViewPager.OnPageChang mNeedsRedraw = (state != ThemeViewPager.SCROLL_STATE_IDLE); } + public void setIsAnimating(boolean isAnimating) { + mIsAnimating = isAnimating; + } + public void expand() { LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getLayoutParams()); params.height = LinearLayout.LayoutParams.MATCH_PARENT; diff --git a/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java b/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java index 30a5b80..cac2ff5 100644 --- a/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java +++ b/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java @@ -324,11 +324,9 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb Rect padding = new Rect(); NinePatchDrawable bg = (NinePatchDrawable) mShadowFrame.getBackground(); bg.getPadding(padding); - ViewGroup.LayoutParams wpParams = mWallpaper.getLayoutParams(); - wpParams.width -= padding.left + padding.right; - mWallpaper.setLayoutParams(wpParams); mIconContainer.setPadding(padding.left, padding.top, padding.right, padding.bottom); mShadowFrame.setBackground(null); + mShadowFrame.setPadding(0, 0, 0, 0); mAdditionalCards.setPadding(padding.left, padding.top, padding.right, padding.bottom); // Off screen cards will become visible and then be animated in @@ -360,19 +358,19 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb mScrollView.requestLayout(); animateWallpaperOut(); animateTitleCard(true, false); - animateChildren(true, getChildrensGlobalBounds()); - animateExtras(true, getChildrensGlobalBounds()); + animateChildren(true, getChildrensGlobalBounds(mPreviewContent)); + animateExtras(true, getChildrensGlobalBounds(mAdditionalCards)); mSelector = ((ChooserActivity) getActivity()).getComponentSelector(); mSelector.setOnItemClickedListener(mOnComponentItemClicked); } - // Returns the boundaries for all the children in the scrollview relative to the window - private List<Rect> getChildrensGlobalBounds() { + // Returns the boundaries for all the children of parent relative to the app window + private List<Rect> getChildrensGlobalBounds(ViewGroup parent) { List<Rect> bounds = new ArrayList<Rect>(); - for (int i = 0; i < mPreviewContent.getChildCount(); i++) { - final View v = mPreviewContent.getChildAt(i); + for (int i = 0; i < parent.getChildCount(); i++) { + final View v = parent.getChildAt(i); int[] pos = new int[2]; v.getLocationInWindow(pos); Rect boundary = new Rect(pos[0], pos[1], pos[0] + v.getWidth(), pos[1]+v.getHeight()); @@ -406,9 +404,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb Rect padding = new Rect(); final NinePatchDrawable bg = (NinePatchDrawable) mShadowFrame.getBackground(); bg.getPadding(padding); - ViewGroup.LayoutParams wpParams = mWallpaper.getLayoutParams(); - wpParams.width += padding.left + padding.right; - mWallpaper.setLayoutParams(wpParams); + mShadowFrame.setPadding(padding.left, padding.top, padding.right, padding.bottom); // Gradually fade the drop shadow back in or else it will be out of place ValueAnimator shadowAnimation = ValueAnimator.ofObject(new IntEvaluator(), 0, 255); @@ -444,6 +440,10 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb int top = (int) child.getResources() .getDimension(R.dimen.collapsed_icon_card_margin_top); lparams.setMargins(0, top, 0, 0); + } else if (child.getId() == R.id.font_preview_container) { + int top = (int) child.getResources() + .getDimension(R.dimen.collapsed_font_card_margin_top); + lparams.setMargins(0, top, 0, 0); } child.getLayoutParams(); @@ -451,8 +451,8 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } mScrollView.requestLayout(); - animateChildren(false, getChildrensGlobalBounds()); - animateExtras(false, getChildrensGlobalBounds()); + animateChildren(false, getChildrensGlobalBounds(mPreviewContent)); + animateExtras(false, getChildrensGlobalBounds(mAdditionalCards)); animateWallpaperIn(); animateTitleCard(false, applyTheme); } @@ -493,7 +493,8 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb endHeight = v.getHeight(); } - v.setTranslationY((prevY - endY) + (prevHeight - endHeight) / 2); + int paddingTop = v.getPaddingTop(); + v.setTranslationY((prevY - endY - paddingTop) + (prevHeight - endHeight) / 2); root.getOverlay().add(v); // Expanding has a delay while the wallpaper begins to fade out @@ -678,6 +679,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } }); return true; + } }); } @@ -954,9 +956,17 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb // Set the icons. If the provider does not have an icon preview then // fall back to the default icon set IconPreviewHelper helper = new IconPreviewHelper(getActivity(), ""); - ViewGroup container = (ViewGroup) mIconContainer.findViewById(R.id.icon_preview_container); - for(int i=0; i < container.getChildCount() && i < iconIdx.length; i++) { - final ImageView v = (ImageView) ((ViewGroup)mIconContainer.getChildAt(1)).getChildAt(i); + int numOfChildren = ((ViewGroup)mIconContainer.getChildAt(1)).getChildCount(); + + List<ImageView> iconViews = new ArrayList<ImageView>(numOfChildren); + for(int i=0; i < numOfChildren; i++) { + final View view = (View) ((ViewGroup)mIconContainer.getChildAt(1)).getChildAt(i); + if (!(view instanceof ImageView)) continue; + iconViews.add((ImageView) view); + } + + for(int i=0; i < iconViews.size() && i < iconIdx.length; i++) { + final ImageView v = iconViews.get(i); Bitmap bitmap = Utils.loadBitmapBlob(c, iconIdx[i]); Drawable oldIcon = v.getDrawable(); Drawable newIcon; |