diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index d0491af86..abd043913 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -18,6 +18,7 @@ package com.hippo.ehviewer.ui.scene; import android.content.Context; import android.content.DialogInterface; +import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.Nullable; @@ -69,7 +70,7 @@ import com.hippo.util.DrawableManager; import com.hippo.widget.ContentLayout; import com.hippo.widget.FabLayout; import com.hippo.widget.SearchBarMover; -import com.hippo.yorozuya.AssertUtils; +import com.hippo.widget.refreshlayout.RefreshLayout; import com.hippo.yorozuya.ObjectUtils; import com.hippo.yorozuya.SimpleHandler; import com.hippo.yorozuya.ViewUtils; @@ -237,11 +238,13 @@ public class FavoritesScene extends BaseScene implements View view = inflater.inflate(R.layout.scene_favorites, container, false); ContentLayout contentLayout = (ContentLayout) view.findViewById(R.id.content_layout); mRecyclerView = contentLayout.getRecyclerView(); - AssertUtils.assertNotNull(mRecyclerView); - mSearchBar = (SearchBar) view.findViewById(R.id.search_bar); - AssertUtils.assertNotNull(mSearchBar); - mFabLayout = (FabLayout) view.findViewById(R.id.fab_layout); - AssertUtils.assertNotNull(mFabLayout); + FastScroller fastScroller = contentLayout.getFastScroller(); + RefreshLayout refreshLayout = contentLayout.getRefreshLayout(); + mSearchBar = (SearchBar) ViewUtils.$$(view, R.id.search_bar); + mFabLayout = (FabLayout) ViewUtils.$$(view, R.id.fab_layout); + + Resources resources = getResources(); + int paddingTopSB = resources.getDimensionPixelOffset(R.dimen.list_padding_top_search_bar); mHelper = new FavoritesHelper(); contentLayout.setHelper(mHelper); @@ -261,6 +264,13 @@ public class FavoritesScene extends BaseScene implements getContext(), mRecyclerView, layoutManager, Settings.getListMode()); mRecyclerView.setAdapter(mAdapter); mAdapter.register(); + mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), mRecyclerView.getPaddingTop() + paddingTopSB, + mRecyclerView.getPaddingRight(), mRecyclerView.getPaddingBottom()); + + fastScroller.setPadding(fastScroller.getPaddingLeft(), fastScroller.getPaddingTop() + paddingTopSB, + fastScroller.getPaddingRight(), fastScroller.getPaddingBottom()); + + refreshLayout.setHeaderTranslationY(paddingTopSB); mLeftDrawable = new DrawerArrowDrawable(getContext()); mSearchBar.setLeftDrawable(mLeftDrawable); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java index 40ec14881..d770cd8cb 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java @@ -143,6 +143,8 @@ public final class GalleryCommentsScene extends ToolbarScene mEditText = (EditText) ViewUtils.$$(mEditPanel, R.id.edit_text); mFab = (FloatingActionButton) ViewUtils.$$(view, R.id.fab); + int paddingBottomFab = getResources().getDimensionPixelOffset(R.dimen.list_padding_bottom_fab); + Drawable drawable = DrawableManager.getDrawable(getContext(), R.drawable.big_weird_face); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); tip.setCompoundDrawables(null, drawable, null, null); @@ -160,6 +162,8 @@ public final class GalleryCommentsScene extends ToolbarScene recyclerView.setHasFixedSize(true); recyclerView.setOnItemClickListener(this); recyclerView.setOnItemLongClickListener(this); + recyclerView.setPadding(recyclerView.getPaddingLeft(), recyclerView.getPaddingTop(), + recyclerView.getPaddingRight(), recyclerView.getPaddingBottom() + paddingBottomFab); mSendImage.setOnClickListener(this); mFab.setOnClickListener(this); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index f2abbb4d4..74278da70 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -62,7 +62,6 @@ import com.hippo.ehviewer.client.data.ListUrlBuilder; import com.hippo.ehviewer.client.parser.GalleryListParser; import com.hippo.ehviewer.dao.QuickSearch; import com.hippo.ehviewer.ui.CommonOperations; -import com.hippo.ehviewer.widget.FitPaddingLayout; import com.hippo.ehviewer.widget.SearchBar; import com.hippo.ehviewer.widget.SearchLayout; import com.hippo.rippleold.RippleSalon; @@ -74,6 +73,7 @@ import com.hippo.util.DrawableManager; import com.hippo.view.ViewTransition; import com.hippo.widget.ContentLayout; import com.hippo.widget.SearchBarMover; +import com.hippo.widget.refreshlayout.RefreshLayout; import com.hippo.yorozuya.AnimationUtils; import com.hippo.yorozuya.MathUtils; import com.hippo.yorozuya.SimpleAnimatorListener; @@ -123,8 +123,6 @@ public final class GalleryListScene extends BaseScene View life cycle ---------------*/ @Nullable - private FitPaddingLayout mFitPaddingLayout; - @Nullable private EasyRecyclerView mRecyclerView; @Nullable private SearchLayout mSearchLayout; @@ -332,12 +330,17 @@ public final class GalleryListScene extends BaseScene Resources resources = getContext().getResources(); - mFitPaddingLayout = (FitPaddingLayout) ViewUtils.$$(view, R.id.main_layout); - ContentLayout contentLayout = (ContentLayout) ViewUtils.$$(mFitPaddingLayout, R.id.content_layout); + View mainLayout = ViewUtils.$$(view, R.id.main_layout); + ContentLayout contentLayout = (ContentLayout) ViewUtils.$$(mainLayout, R.id.content_layout); mRecyclerView = contentLayout.getRecyclerView(); - mSearchLayout = (SearchLayout) ViewUtils.$$(mFitPaddingLayout, R.id.search_layout); - mSearchBar = (SearchBar) ViewUtils.$$(mFitPaddingLayout, R.id.search_bar); - mFab = (FloatingActionButton) ViewUtils.$$(mFitPaddingLayout, R.id.fab); + FastScroller fastScroller = contentLayout.getFastScroller(); + RefreshLayout refreshLayout = contentLayout.getRefreshLayout(); + mSearchLayout = (SearchLayout) ViewUtils.$$(mainLayout, R.id.search_layout); + mSearchBar = (SearchBar) ViewUtils.$$(mainLayout, R.id.search_bar); + mFab = (FloatingActionButton) ViewUtils.$$(mainLayout, R.id.fab); + + int paddingTopSB = resources.getDimensionPixelOffset(R.dimen.list_padding_top_search_bar); + int paddingBottomFab = resources.getDimensionPixelOffset(R.dimen.list_padding_bottom_fab); mViewTransition = new ViewTransition(contentLayout, mSearchLayout); @@ -358,6 +361,13 @@ public final class GalleryListScene extends BaseScene getContext(), mRecyclerView, layoutManager, Settings.getListMode()); mRecyclerView.setAdapter(mAdapter); mAdapter.register(); + mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), mRecyclerView.getPaddingTop() + paddingTopSB, + mRecyclerView.getPaddingRight(), mRecyclerView.getPaddingBottom()); + + fastScroller.setPadding(fastScroller.getPaddingLeft(), fastScroller.getPaddingTop() + paddingTopSB, + fastScroller.getPaddingRight(), fastScroller.getPaddingBottom()); + + refreshLayout.setHeaderTranslationY(paddingTopSB); mLeftDrawable = new DrawerArrowDrawable(getContext()); mRightDrawable = new AddDeleteDrawable(getContext()); @@ -368,6 +378,8 @@ public final class GalleryListScene extends BaseScene setSearchBarHint(getContext(), mSearchBar); mSearchLayout.setHelper(this); + mSearchLayout.setPadding(mSearchLayout.getPaddingLeft(), mSearchLayout.getPaddingTop() + paddingTopSB, + mSearchLayout.getPaddingRight(), mSearchLayout.getPaddingBottom() + paddingBottomFab); mFab.setOnClickListener(this); @@ -410,7 +422,6 @@ public final class GalleryListScene extends BaseScene } mRecyclerView = null; - mFitPaddingLayout = null; mSearchLayout = null; mSearchBar = null; mFab = null; @@ -835,16 +846,10 @@ public final class GalleryListScene extends BaseScene @Override public void onStateChange(SearchBar searchBar, int newState, int oldState, boolean animation) { - if (null == mFitPaddingLayout || null == mLeftDrawable || null == mRightDrawable) { + if (null == mLeftDrawable || null == mRightDrawable) { return; } - if (newState == SearchBar.STATE_NORMAL) { - mFitPaddingLayout.setEnableUpdatePaddingTop(true); - } else { - mFitPaddingLayout.setEnableUpdatePaddingTop(false); - } - switch (oldState) { default: case SearchBar.STATE_NORMAL: diff --git a/app/src/main/java/com/hippo/ehviewer/widget/FitPaddingLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/FitPaddingLayout.java deleted file mode 100644 index da6783c5d..000000000 --- a/app/src/main/java/com/hippo/ehviewer/widget/FitPaddingLayout.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2016 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hippo.ehviewer.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.view.View; - -import com.hippo.ehviewer.R; -import com.hippo.widget.OffsetLayout; -import com.hippo.yorozuya.IntList; -import com.hippo.yorozuya.SimpleHandler; - -import java.util.ArrayList; -import java.util.List; - -public class FitPaddingLayout extends OffsetLayout { - - private static final String KEY_SUPER = "super"; - private static final String KEY_PADDING_TOP_1 = "padding_top_1"; - private static final String KEY_PADDING_TOP_2 = "padding_top_2"; - private static final String KEY_PADDING_TOP_3 = "padding_top_3"; - private static final String KEY_PADDING_BOTTOM_1 = "padding_bottom_1"; - private static final String KEY_PADDING_BOTTOM_2 = "padding_bottom_2"; - private static final String KEY_PADDING_BOTTOM_3 = "padding_bottom_3"; - - private int mFitTop1; - private int mFitTop2; - private int mFitTop3; - private int mContentId1; - private int mContentId2; - private int mContentId3; - private int mFitBottom1; - private int mFitBottom2; - private int mFitBottom3; - - private boolean mOnce; - - private int mOriginalPaddingTop1 = -1; - private int mOriginalPaddingTop2 = -1; - private int mOriginalPaddingTop3 = -1; - private int mOriginalPaddingBottom1 = -1; - private int mOriginalPaddingBottom2 = -1; - private int mOriginalPaddingBottom3 = -1; - - private boolean mEnableUpdatePaddingTop = true; - - private boolean mUpdated = false; - - private List mContentList = new ArrayList<>(); - private IntList mPaddingTopList = new IntList(); - private IntList mPaddingBottomList = new IntList(); - - private Runnable mUpdatePaddingTask = new Runnable() { - @Override - public void run() { - for (int i = 0, size = mContentList.size(); i < size; i++) { - View content = mContentList.get(i); - int paddingTop = mPaddingTopList.get(i); - int paddingBottom = mPaddingBottomList.get(i); - content.setPadding(content.getPaddingLeft(), - paddingTop == -1 ? content.getPaddingTop() : paddingTop, - content.getPaddingRight(), - paddingBottom == -1 ? content.getPaddingBottom() : paddingBottom); - } - mContentList.clear(); - mPaddingTopList.clear(); - mPaddingBottomList.clear(); - } - }; - - public FitPaddingLayout(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public FitPaddingLayout(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context, attrs); - } - - private void init(Context context, AttributeSet attrs) { - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FitPaddingLayout); - mFitTop1 = a.getResourceId(R.styleable.FitPaddingLayout_fitTop1, 0); - mFitTop2 = a.getResourceId(R.styleable.FitPaddingLayout_fitTop2, 0); - mFitTop3 = a.getResourceId(R.styleable.FitPaddingLayout_fitTop3, 0); - mContentId1 = a.getResourceId(R.styleable.FitPaddingLayout_content1, 0); - mContentId2 = a.getResourceId(R.styleable.FitPaddingLayout_content2, 0); - mContentId3 = a.getResourceId(R.styleable.FitPaddingLayout_content3, 0); - mFitBottom1 = a.getResourceId(R.styleable.FitPaddingLayout_fitBottom1, 0); - mFitBottom2 = a.getResourceId(R.styleable.FitPaddingLayout_fitBottom2, 0); - mFitBottom3 = a.getResourceId(R.styleable.FitPaddingLayout_fitBottom3, 0); - mOnce = a.getBoolean(R.styleable.FitPaddingLayout_once, true); - a.recycle(); - } - - public void setEnableUpdatePaddingTop(boolean enableUpdatePaddingTop) { - mEnableUpdatePaddingTop = enableUpdatePaddingTop; - } - - @Nullable - private View findViewByIdEx(int id) { - return id == 0 ? null : findViewById(id); - } - - private boolean updatePadding(View content, View fitTop, View fitBottom, - int originalPaddingTop, int originalPaddingBottom, int[] paddings, int[] newPaddins) { - if (content == null || (fitTop == null && fitBottom == null)) { - return false; - } - if (originalPaddingTop == -1) { - originalPaddingTop = content.getPaddingTop(); - } - if (originalPaddingBottom == -1) { - originalPaddingBottom = content.getPaddingBottom(); - } - paddings[0] = originalPaddingTop; - paddings[1] = originalPaddingBottom; - - int newPaddingTop = -1; - int newPaddingBottom = -1; - if (fitTop != null) { - newPaddingTop = originalPaddingTop + fitTop.getBottom() - - ((LayoutParams) fitTop.getLayoutParams()).offsetY; - } - if (fitBottom != null) { - newPaddingBottom = originalPaddingBottom + getHeight() - fitBottom.getTop() - - ((LayoutParams) fitBottom.getLayoutParams()).offsetY; - } - newPaddins[0] = newPaddingTop; - newPaddins[1] = newPaddingBottom; - - return true; - } - - private boolean isNeedUpdatePadding(View content, int paddingTop, int paddingBottom) { - return (paddingTop != -1 || paddingTop != content.getPaddingTop()) || - (paddingBottom != -1 || paddingBottom != content.getPaddingBottom()); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - - if (!mEnableUpdatePaddingTop || (mOnce && mUpdated)) { - return; - } - - View fitTop1 = findViewById(mFitTop1); - View fitTop2 = findViewById(mFitTop2); - View fitTop3 = findViewById(mFitTop3); - View content1 = findViewById(mContentId1); - View content2 = findViewById(mContentId2); - View content3 = findViewById(mContentId3); - View fitBottom1 = findViewById(mFitBottom1); - View fitBottom2 = findViewById(mFitBottom2); - View fitBottom3 = findViewById(mFitBottom3); - - mContentList.clear(); - mPaddingTopList.clear(); - mPaddingBottomList.clear(); - - int[] paddings = new int[2]; - int[] newPaddings = new int[2]; - if (updatePadding(content1, fitTop1, fitBottom1, mOriginalPaddingTop1, - mOriginalPaddingBottom1, paddings, newPaddings)) { - mOriginalPaddingTop1 = paddings[0]; - mOriginalPaddingBottom1 = paddings[1]; - if (isNeedUpdatePadding(content1, newPaddings[0], newPaddings[1])) { - mContentList.add(content1); - mPaddingTopList.add(newPaddings[0]); - mPaddingBottomList.add(newPaddings[1]); - } - } - if (updatePadding(content2, fitTop2, fitBottom2, mOriginalPaddingTop2, - mOriginalPaddingBottom2, paddings, newPaddings)) { - mOriginalPaddingTop2 = paddings[0]; - mOriginalPaddingBottom2 = paddings[1]; - if (isNeedUpdatePadding(content2, newPaddings[0], newPaddings[1])) { - mContentList.add(content2); - mPaddingTopList.add(newPaddings[0]); - mPaddingBottomList.add(newPaddings[1]); - } - } - if (updatePadding(content3, fitTop3, fitBottom3, mOriginalPaddingTop3, - mOriginalPaddingBottom3, paddings, newPaddings)) { - mOriginalPaddingTop3 = paddings[0]; - mOriginalPaddingBottom3 = paddings[1]; - if (isNeedUpdatePadding(content3, newPaddings[0], newPaddings[1])) { - mContentList.add(content3); - mPaddingTopList.add(newPaddings[0]); - mPaddingBottomList.add(newPaddings[1]); - } - } - - if (mContentList.size() > 0) { - SimpleHandler.getInstance().post(mUpdatePaddingTask); - } - - mUpdated = true; - } - - private void saveContentPadding(Bundle state, int id, String topKey, String bottomKey) { - View content = findViewByIdEx(id); - if (content != null) { - state.putInt(topKey, content.getPaddingTop()); - state.putInt(bottomKey, content.getPaddingBottom()); - } else { - state.putInt(topKey, -1); - state.putInt(bottomKey, -1); - } - } - - @Override - protected Parcelable onSaveInstanceState() { - final Bundle state = new Bundle(); - state.putParcelable(KEY_SUPER, super.onSaveInstanceState()); - saveContentPadding(state, mContentId1, KEY_PADDING_TOP_1, KEY_PADDING_BOTTOM_1); - saveContentPadding(state, mContentId2, KEY_PADDING_TOP_2, KEY_PADDING_BOTTOM_2); - saveContentPadding(state, mContentId3, KEY_PADDING_TOP_3, KEY_PADDING_BOTTOM_3); - return state; - } - - private void restoreContentPadding(Bundle state, int id, String topKey, String bottomKey, int[] paddings) { - View content = findViewByIdEx(id); - if (content != null) { - paddings[0] = content.getPaddingTop(); - paddings[1] = content.getPaddingBottom(); - int paddingTop = state.getInt(topKey); - int paddingBottom = state.getInt(bottomKey); - if (paddingTop != -1 || paddingBottom != -1) { - content.setPadding(content.getPaddingLeft(), - paddingTop == -1 ? content.getPaddingTop() : paddingTop, - content.getPaddingRight(), - paddingBottom == -1 ? content.getPaddingBottom() : paddingBottom); - } - } else { - paddings[0] = -1; - paddings[1] = -1; - } - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - if (state instanceof Bundle) { - final Bundle savedState = (Bundle) state; - super.onRestoreInstanceState(savedState.getParcelable(KEY_SUPER)); - int[] ints = new int[2]; - restoreContentPadding(savedState, mContentId1, KEY_PADDING_TOP_1, KEY_PADDING_BOTTOM_1, ints); - mOriginalPaddingTop1 = ints[0]; - mOriginalPaddingBottom1 = ints[1]; - restoreContentPadding(savedState, mContentId2, KEY_PADDING_TOP_2, KEY_PADDING_BOTTOM_2, ints); - mOriginalPaddingTop2 = ints[0]; - mOriginalPaddingBottom2 = ints[1]; - restoreContentPadding(savedState, mContentId3, KEY_PADDING_TOP_3, KEY_PADDING_BOTTOM_3, ints); - mOriginalPaddingTop3 = ints[0]; - mOriginalPaddingBottom3 = ints[1]; - } - } -} diff --git a/app/src/main/java/com/hippo/widget/ContentLayout.java b/app/src/main/java/com/hippo/widget/ContentLayout.java index 92c0f1a23..ffce5b09b 100644 --- a/app/src/main/java/com/hippo/widget/ContentLayout.java +++ b/app/src/main/java/com/hippo/widget/ContentLayout.java @@ -122,6 +122,10 @@ public class ContentLayout extends FrameLayout { return mFastScroller; } + public RefreshLayout getRefreshLayout() { + return mRefreshLayout; + } + public void setHelper(ContentHelper helper) { mContentHelper = helper; helper.init(this); diff --git a/app/src/main/java/com/hippo/widget/refreshlayout/RefreshLayout.java b/app/src/main/java/com/hippo/widget/refreshlayout/RefreshLayout.java index 694904665..547467eca 100644 --- a/app/src/main/java/com/hippo/widget/refreshlayout/RefreshLayout.java +++ b/app/src/main/java/com/hippo/widget/refreshlayout/RefreshLayout.java @@ -584,6 +584,10 @@ public class RefreshLayout extends ViewGroup { return alpha; } + public void setHeaderTranslationY(float translationY) { + mCircleView.setTranslationY(translationY); + } + /** * Set the background color of the progress spinner disc. * diff --git a/app/src/main/res/layout/scene_favorites.xml b/app/src/main/res/layout/scene_favorites.xml index e4b6cce20..b9605681a 100644 --- a/app/src/main/res/layout/scene_favorites.xml +++ b/app/src/main/res/layout/scene_favorites.xml @@ -15,19 +15,12 @@ ~ limitations under the License. --> - + android:layout_height="match_parent"> - + diff --git a/app/src/main/res/layout/scene_gallery_comments.xml b/app/src/main/res/layout/scene_gallery_comments.xml index e079c3806..9f36dfd46 100644 --- a/app/src/main/res/layout/scene_gallery_comments.xml +++ b/app/src/main/res/layout/scene_gallery_comments.xml @@ -15,21 +15,17 @@ ~ limitations under the License. --> - + android:layout_height="match_parent"> - + diff --git a/app/src/main/res/layout/scene_gallery_list.xml b/app/src/main/res/layout/scene_gallery_list.xml index 748aa6620..3590dd182 100644 --- a/app/src/main/res/layout/scene_gallery_list.xml +++ b/app/src/main/res/layout/scene_gallery_list.xml @@ -15,20 +15,12 @@ ~ limitations under the License. --> - + android:layout_height="match_parent"> - + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 023923127..c62ba25c2 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -40,19 +40,6 @@ - - - - - - - - - - - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 78df4a5df..587d4b37e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -44,6 +44,8 @@ 4dp 4dp 4dp + 77dp + 80dp 320dp 120dp