From 7b193bbeb8a4e134a42049d8e9324788f878f70a Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Sat, 27 Aug 2016 19:47:56 -0400 Subject: [PATCH] Fade in selected state on tabs when they are in the drawer --- .../lightning/fragment/TabsFragment.java | 45 +++++++++++-------- .../browser/lightning/utils/ThemeUtils.java | 2 +- .../lightning/view/BackgroundDrawable.java | 42 +++++++++++++++++ .../res/drawable/tab_vertical_background.xml | 6 +++ app/src/main/res/layout/tab_list_item.xml | 20 ++++----- .../res/layout/tab_list_item_horizontal.xml | 29 ++++++------ app/src/main/res/values/styles.xml | 6 +-- 7 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/acr/browser/lightning/view/BackgroundDrawable.java create mode 100644 app/src/main/res/drawable/tab_vertical_background.xml diff --git a/app/src/main/java/acr/browser/lightning/fragment/TabsFragment.java b/app/src/main/java/acr/browser/lightning/fragment/TabsFragment.java index 6426945..66af7fe 100644 --- a/app/src/main/java/acr/browser/lightning/fragment/TabsFragment.java +++ b/app/src/main/java/acr/browser/lightning/fragment/TabsFragment.java @@ -12,18 +12,21 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.TransitionDrawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.IdRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.TextViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.SimpleItemAnimator; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -46,8 +49,10 @@ import acr.browser.lightning.controller.UIController; import acr.browser.lightning.fragment.anim.HorizontalItemAnimator; import acr.browser.lightning.fragment.anim.VerticalItemAnimator; import acr.browser.lightning.preference.PreferenceManager; +import acr.browser.lightning.utils.DrawableUtils; import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.Utils; +import acr.browser.lightning.view.BackgroundDrawable; import acr.browser.lightning.view.LightningView; /** @@ -272,7 +277,6 @@ public class TabsFragment extends Fragment implements View.OnClickListener, View private final int mLayoutResourceId; @Nullable private final Drawable mBackgroundTabDrawable; - @Nullable private final Drawable mForegroundTabDrawable; @Nullable private final Bitmap mForegroundTabBitmap; private ColorMatrix mColorMatrix; private Paint mPaint; @@ -288,7 +292,6 @@ public class TabsFragment extends Fragment implements View.OnClickListener, View if (vertical) { mBackgroundTabDrawable = null; mForegroundTabBitmap = null; - mForegroundTabDrawable = ThemeUtils.getSelectedBackground(getContext(), mDarkTheme); } else { int backgroundColor = Utils.mixTwoColors(ThemeUtils.getPrimaryColor(getContext()), Color.BLACK, 0.75f); Bitmap backgroundTabBitmap = Bitmap.createBitmap(Utils.dpToPx(175), Utils.dpToPx(30), Bitmap.Config.ARGB_8888); @@ -298,7 +301,6 @@ public class TabsFragment extends Fragment implements View.OnClickListener, View int foregroundColor = ThemeUtils.getPrimaryColor(getContext()); mForegroundTabBitmap = Bitmap.createBitmap(Utils.dpToPx(175), Utils.dpToPx(30), Bitmap.Config.ARGB_8888); Utils.drawTrapezoid(new Canvas(mForegroundTabBitmap), foregroundColor, false); - mForegroundTabDrawable = null; } } @@ -307,6 +309,9 @@ public class TabsFragment extends Fragment implements View.OnClickListener, View public LightningViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(mLayoutResourceId, viewGroup, false); + if (mDrawerTabs) { + DrawableUtils.setBackground(view, new BackgroundDrawable(view.getContext())); + } return new LightningViewHolder(view); } @@ -324,36 +329,39 @@ public class TabsFragment extends Fragment implements View.OnClickListener, View final Bitmap favicon = web.getFavicon(); if (web.isForegroundTab()) { - TextViewCompat.setTextAppearance(holder.txtTitle, R.style.boldText); - Drawable foregroundDrawable; + Drawable foregroundDrawable = null; if (!mDrawerTabs) { foregroundDrawable = new BitmapDrawable(getResources(), mForegroundTabBitmap); if (!mIsIncognito && mColorMode) { foregroundDrawable.setColorFilter(mUiController.getUiColor(), PorterDuff.Mode.SRC_IN); } - } else { - foregroundDrawable = mForegroundTabDrawable; - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - holder.layout.setBackground(foregroundDrawable); - } else { - //noinspection deprecation - holder.layout.setBackgroundDrawable(foregroundDrawable); } if (!mIsIncognito && mColorMode) { mUiController.changeToolbarBackground(favicon, foregroundDrawable); } + + TextViewCompat.setTextAppearance(holder.txtTitle, R.style.boldText); + if (!mDrawerTabs) { + DrawableUtils.setBackground(holder.layout, foregroundDrawable); + } holder.favicon.setImageBitmap(favicon); } else { TextViewCompat.setTextAppearance(holder.txtTitle, R.style.normalText); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - holder.layout.setBackground(mBackgroundTabDrawable); - } else { - //noinspection deprecation - holder.layout.setBackgroundDrawable(mBackgroundTabDrawable); + if (!mDrawerTabs) { + DrawableUtils.setBackground(holder.layout, mBackgroundTabDrawable); } holder.favicon.setImageBitmap(getDesaturatedBitmap(favicon)); } + + if (mDrawerTabs) { + BackgroundDrawable verticalBackground = (BackgroundDrawable) holder.layout.getBackground(); + verticalBackground.setCrossFadeEnabled(false); + if (web.isForegroundTab()) { + verticalBackground.startTransition(200); + } else { + verticalBackground.reverseTransition(200); + } + } } @Override @@ -403,7 +411,6 @@ public class TabsFragment extends Fragment implements View.OnClickListener, View @Override public void onClick(View v) { if (v == exitButton) { - // Close tab mBus.post(new TabEvents.CloseTab(getAdapterPosition())); } if (v == layout) { diff --git a/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java b/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java index 4d1a64d..8d2c02b 100644 --- a/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java +++ b/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java @@ -40,7 +40,7 @@ public class ThemeUtils { return getColor(context, R.attr.colorAccent); } - private static int getColor(@NonNull Context context, @AttrRes int resource) { + public static int getColor(@NonNull Context context, @AttrRes int resource) { TypedArray a = context.obtainStyledAttributes(sTypedValue.data, new int[]{resource}); int color = a.getColor(0, 0); a.recycle(); diff --git a/app/src/main/java/acr/browser/lightning/view/BackgroundDrawable.java b/app/src/main/java/acr/browser/lightning/view/BackgroundDrawable.java new file mode 100644 index 0000000..94da56b --- /dev/null +++ b/app/src/main/java/acr/browser/lightning/view/BackgroundDrawable.java @@ -0,0 +1,42 @@ +package acr.browser.lightning.view; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.TransitionDrawable; +import android.support.v4.content.ContextCompat; + +import acr.browser.lightning.R; +import acr.browser.lightning.utils.ThemeUtils; + +public class BackgroundDrawable extends TransitionDrawable { + + private boolean mSelected; + + /** + * Create a new transition drawable with the specified list of layers. At least + * 2 layers are required for this drawable to work properly. + */ + public BackgroundDrawable(Context context) { + super(new Drawable[]{new ColorDrawable(ContextCompat.getColor(context, R.color.transparent)), + new ColorDrawable(ThemeUtils.getColor(context, R.attr.selectedBackground))}); + } + + + @Override + public void startTransition(int durationMillis) { + if (!mSelected) { + super.startTransition(durationMillis); + } + mSelected = true; + } + + @Override + public void reverseTransition(int duration) { + if (mSelected) { + super.reverseTransition(duration); + } + mSelected = false; + } + +} diff --git a/app/src/main/res/drawable/tab_vertical_background.xml b/app/src/main/res/drawable/tab_vertical_background.xml new file mode 100644 index 0000000..6286c4e --- /dev/null +++ b/app/src/main/res/drawable/tab_vertical_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_list_item.xml b/app/src/main/res/layout/tab_list_item.xml index 12081f8..d2bcf7a 100644 --- a/app/src/main/res/layout/tab_list_item.xml +++ b/app/src/main/res/layout/tab_list_item.xml @@ -1,14 +1,14 @@ - + - + + android:gravity="center_vertical"/> + android:textAppearance="?android:attr/textAppearanceSmall"/> + app:srcCompat="@drawable/ic_action_delete"/> \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 861880f..7f6e35b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -49,7 +49,7 @@ @color/drawer_background @color/divider_light - @drawable/list_bg_light + @color/selected_light true false @@ -72,7 +72,7 @@ @color/drawer_background_dark @color/divider_dark - @drawable/list_bg_dark + @color/selected_dark true false @@ -94,7 +94,7 @@ @color/black @color/black - @drawable/list_bg_dark + @color/selected_dark true false