diff options
author | Andy Mast <andy@cyngn.com> | 2014-07-17 12:33:56 -0700 |
---|---|---|
committer | Andy Mast <andy@cyngn.com> | 2014-07-17 15:27:13 -0700 |
commit | 6f0bdbc17f7e817d9c7a51374a9ee89165599b0e (patch) | |
tree | ab0abc72a1470b2e6ad19f9b62ae2d719cf82623 /src/org | |
parent | ab323cff22ec09cba01c8a0735c6d590ca334272 (diff) | |
download | packages_apps_ThemeChooser-6f0bdbc17f7e817d9c7a51374a9ee89165599b0e.zip packages_apps_ThemeChooser-6f0bdbc17f7e817d9c7a51374a9ee89165599b0e.tar.gz packages_apps_ThemeChooser-6f0bdbc17f7e817d9c7a51374a9ee89165599b0e.tar.bz2 |
Wallpaper preview card
Change-Id: Ib8a8b5fb2af04fe50a1cd71a2e0864cf3558900c
Diffstat (limited to 'src/org')
3 files changed, 180 insertions, 12 deletions
diff --git a/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java b/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java index 0dc3387..d985860 100644 --- a/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java +++ b/src/org/cyanogenmod/theme/chooserv2/ComponentCardView.java @@ -24,7 +24,7 @@ public class ComponentCardView extends LinearLayout { private static final float SEMI_OPAQUE_ALPHA = 0.2f; private static final int BACKGROUND_SEMI_OPAQUE_ALPHA = (int) (256.0f * SEMI_OPAQUE_ALPHA); - private TextView mLabel; + protected TextView mLabel; // Expanded Padding int mExpandPadLeft; @@ -60,7 +60,10 @@ public class ComponentCardView extends LinearLayout { } public void expand() { - TransitionDrawable bg = (TransitionDrawable) getBackground(); + TransitionDrawable bg = null; + if (getBackground() instanceof TransitionDrawable) { + bg = (TransitionDrawable) getBackground(); + } if (bg != null) { Rect paddingRect = new Rect(); bg.getPadding(paddingRect); @@ -96,8 +99,11 @@ public class ComponentCardView extends LinearLayout { if (mLabel != null) { mLabel.animate().alpha(0f).setDuration(CARD_FADE_DURATION); } - TransitionDrawable background = (TransitionDrawable) getBackground(); - background.reverseTransition(CARD_FADE_DURATION); + + if (getBackground() instanceof TransitionDrawable) { + TransitionDrawable background = (TransitionDrawable) getBackground(); + background.reverseTransition(CARD_FADE_DURATION); + } } /** diff --git a/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java b/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java index 75b2025..651c448 100644 --- a/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java +++ b/src/org/cyanogenmod/theme/chooserv2/ThemeFragment.java @@ -27,6 +27,7 @@ import android.content.res.ThemeConfig; import android.content.res.ThemeManager; import android.database.Cursor; import android.graphics.Bitmap; +import android.graphics.Point; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; @@ -44,6 +45,8 @@ import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.util.SparseArray; +import android.util.TypedValue; +import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -70,6 +73,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_LAUNCHER; import static android.provider.ThemesContract.ThemesColumns.MODIFIES_STATUS_BAR; import static android.provider.ThemesContract.ThemesColumns.MODIFIES_NAVIGATION_BAR; import static android.provider.ThemesContract.ThemesColumns.MODIFIES_ICONS; @@ -159,6 +163,10 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb private ImageView mOverflow; private ProgressBar mProgress; + // Additional Card Views + private RelativeLayout mAdditionalCards; + private WallpaperCardView mWallpaperCard; + private Handler mHandler; private int mActiveCardId = -1; @@ -170,6 +178,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb sCardIdsToComponentTypes.put(R.id.font_preview_container, MODIFIES_FONTS); sCardIdsToComponentTypes.put(R.id.icon_container, MODIFIES_ICONS); sCardIdsToComponentTypes.put(R.id.navigation_bar_container, MODIFIES_NAVIGATION_BAR); + sCardIdsToComponentTypes.put(R.id.wallpaper_card, MODIFIES_LAUNCHER); } static ThemeFragment newInstance(String pkgName) { @@ -253,6 +262,13 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } }); + // Additional cards which should hang out offscreen until expanded + mAdditionalCards = (RelativeLayout) v.findViewById(R.id.additional_cards); + mWallpaperCard = (WallpaperCardView) v.findViewById(R.id.wallpaper_card); + int translationY = getDistanceToMoveBelowScreen(mWallpaperCard); + mWallpaperCard.setTranslationY(translationY); + + getLoaderManager().initLoader(LOADER_ID_ALL, null, this); initCards(v); @@ -312,21 +328,26 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb mWallpaper.setLayoutParams(wpParams); mIconContainer.setPadding(padding.left, padding.top, padding.right, padding.bottom); mShadowFrame.setBackground(null); + mAdditionalCards.setPadding(padding.left, padding.top, padding.right, padding.bottom); + + // Off screen cards will become visible and then be animated in + mWallpaperCard.setVisibility(View.VISIBLE); // Expand the children + int top = (int) getResources() + .getDimension(R.dimen.expanded_card_margin_top); for (int i = 0; i < mPreviewContent.getChildCount(); i++) { ComponentCardView child = (ComponentCardView) mPreviewContent.getChildAt(i); + RelativeLayout.LayoutParams lparams = (RelativeLayout.LayoutParams) child.getLayoutParams(); - - int top = (int) child.getResources() - .getDimension(R.dimen.expanded_card_margin_top); lparams.setMargins(0, top, 0, 0); if (child.getId() == R.id.navigation_bar_container) { lparams.removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM); lparams.addRule(RelativeLayout.BELOW, R.id.icon_container); } + child.setLayoutParams(lparams); child.expand(); } @@ -339,11 +360,12 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb animateWallpaperOut(); animateTitleCard(true, false); animateChildren(true, getChildrensGlobalBounds()); + animateExtras(true, getChildrensGlobalBounds()); 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() { @@ -426,8 +448,10 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb child.getLayoutParams(); child.collapse(); } + mScrollView.requestLayout(); animateChildren(false, getChildrensGlobalBounds()); + animateExtras(false, getChildrensGlobalBounds()); animateWallpaperIn(); animateTitleCard(false, applyTheme); } @@ -500,6 +524,78 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb }); } + private void animateExtras(final boolean isExpanding, final List<Rect> prevBounds) { + final ViewGroup root = (ViewGroup) getActivity().getWindow() + .getDecorView().findViewById(android.R.id.content); + // Expanding has a delay while the wallpaper begins to fade out + // Collapsing is opposite of this so wallpaper will have the delay instead + final int startDelay = isExpanding ? ANIMATE_START_DELAY : 0; + + if (!isExpanding) { + // If we are collapsing then we do not wait for the onPreDraw() because + // 1) We will simply translate the view out and 2) The view will get "squished" + // during the layout change (due to parent's padding) which is undesireable. + for (int i = mAdditionalCards.getChildCount() - 1; i >= 0; i--) { + final ComponentCardView v = (ComponentCardView) mAdditionalCards.getChildAt(i); + root.getOverlay().add(v); + + int translationY = getDistanceToMoveBelowScreen(v); + v.animate() + .setStartDelay(0) + .translationY(translationY) + .setDuration(ANIMATE_DURATION) + .setInterpolator( + new DecelerateInterpolator(ANIMATE_INTERPOLATE_FACTOR)) + .withEndAction(new Runnable() { + public void run() { + root.getOverlay().remove(v); + mAdditionalCards.addView(v, 0); + v.setVisibility(View.INVISIBLE); + } + }); + } + } else { + final ViewTreeObserver observer = mScrollContent.getViewTreeObserver(); + observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + public boolean onPreDraw() { + observer.removeOnPreDrawListener(this); + + for (int i = mAdditionalCards.getChildCount() - 1; i >= 0; i--) { + final ComponentCardView v = + (ComponentCardView) mAdditionalCards.getChildAt(i); + root.getOverlay().add(v); + v.animate() + .setStartDelay(startDelay) + .translationY(0) + .setDuration(ANIMATE_DURATION+100) + .setInterpolator( + new DecelerateInterpolator(ANIMATE_INTERPOLATE_FACTOR)) + .withEndAction(new Runnable() { + public void run() { + root.getOverlay().remove(v); + mAdditionalCards.addView(v, 0); + } + }); + + } + return false; + } + }); + } + } + + private int getDistanceToMoveBelowScreen(View v) { + Display display = getActivity().getWindowManager().getDefaultDisplay(); + Point p = new Point(); + display.getSize(p); + int heightId = getResources() + .getIdentifier("system_bar_height", "dimen", "android"); + int navbar_height = getResources().getDimensionPixelSize(heightId); + int[] pos = new int[2]; + v.getLocationInWindow(pos); + return p.y + navbar_height - pos[1]; + } + private void animateTitleCard(final boolean expand, final boolean applyTheme) { final ViewGroup parent = (ViewGroup) mTitleCard.getParent(); // Get current location of the title card @@ -769,12 +865,22 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb } private void loadWallpaper(Cursor c) { - if (CURRENTLY_APPLIED_THEME.equals(mPkgName)) { - mWallpaper.setBackground(getActivity().getWallpaper()); - } else { - int wpIdx = c.getColumnIndex(PreviewColumns.WALLPAPER_PREVIEW); + int pkgNameIdx = c.getColumnIndex(ThemesColumns.PKG_NAME); + int wpIdx = c.getColumnIndex(PreviewColumns.WALLPAPER_PREVIEW); + + if (pkgNameIdx > -1) { Bitmap bitmap = Utils.loadBitmapBlob(c, wpIdx); mWallpaper.setImageBitmap(bitmap); + mWallpaperCard.setWallpaper(new BitmapDrawable(bitmap)); + String pkgName = c.getString(pkgNameIdx); + mSelectedComponentsMap.put(MODIFIES_LAUNCHER, pkgName); + } else { + Drawable wp = getActivity().getWallpaper(); + if (wp == null) { + wp = new BitmapDrawable(Utils.loadBitmapBlob(c, wpIdx)); + } + mWallpaper.setBackground(wp); + mWallpaperCard.setWallpaper(wp); } } @@ -1005,6 +1111,8 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb loaderId = LOADER_ID_ICONS; } else if (MODIFIES_NAVIGATION_BAR.equals(component)) { loaderId = LOADER_ID_NAVIGATION_BAR; + } else if (MODIFIES_LAUNCHER.equals(component)) { + loaderId = LOADER_ID_WALLPAPER; } else { return; } diff --git a/src/org/cyanogenmod/theme/chooserv2/WallpaperCardView.java b/src/org/cyanogenmod/theme/chooserv2/WallpaperCardView.java new file mode 100644 index 0000000..e22984f --- /dev/null +++ b/src/org/cyanogenmod/theme/chooserv2/WallpaperCardView.java @@ -0,0 +1,54 @@ +package org.cyanogenmod.theme.chooserv2; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.cyanogenmod.theme.chooser.R; + +public class WallpaperCardView extends ComponentCardView { + protected ImageView mImage; + + public WallpaperCardView(Context context) { + this(context, null); + } + + public WallpaperCardView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public WallpaperCardView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setOrientation(LinearLayout.VERTICAL); + + setBackgroundResource(R.drawable.card_bg); + + // Wallpaper Image + mImage = new ImageView(context); + mImage.setScaleType(ImageView.ScaleType.CENTER_CROP); + addView(mImage); + + // Wallpaper Label - inflated because programmatic styles is hard + mLabel = (TextView) inflate(context, R.layout.v2card_label, null); + addView(mLabel); + } + + public void setWallpaper(Drawable drawable) { + mImage.setImageDrawable(drawable); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int childLeft = mPaddingLeft; + int childRight = r - mPaddingRight; + int childTop = mPaddingTop; + int childBottom = b - mPaddingBottom; + + mImage.layout(childLeft, childTop, childRight, childBottom); + mLabel.layout(childLeft, childTop, childRight, childTop + mLabel.getMeasuredHeight()); + } +} |