diff --git a/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java b/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java index e96d63dfb..62b872b3a 100644 --- a/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java +++ b/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java @@ -79,6 +79,11 @@ public class AddDeleteDrawable extends Drawable { canvas.restore(); } + public void setColor(int color) { + mPaint.setColor(color); + invalidateSelf(); + } + @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/AbsActionBarActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/AbsActionBarActivity.java deleted file mode 100644 index b2f59f1d1..000000000 --- a/app/src/main/java/com/hippo/ehviewer/ui/AbsActionBarActivity.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2014-2015 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 - * 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.ui; - -import android.support.v7.app.ActionBarActivity; -import android.view.View; -import android.view.Window; - -public abstract class AbsActionBarActivity extends ActionBarActivity { - - public boolean post(Runnable action) { - Window w = getWindow(); - if (w != null) { - View v = w.getDecorView(); - return v != null && v.post(action); - } else { - return false; - } - } - - public boolean postDelayed(Runnable action, long delayMillis) { - Window w = getWindow(); - if (w != null) { - View v = w.getDecorView(); - return v != null && v.postDelayed(action, delayMillis); - } else { - return false; - } - } - -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java index f36e821d4..ee15aa587 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java @@ -17,6 +17,7 @@ package com.hippo.ehviewer.ui; import android.content.Intent; import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.TextView; @@ -26,7 +27,7 @@ import com.larvalabs.svgandroid.SVG; import com.larvalabs.svgandroid.SVGBuilder; import com.larvalabs.svgandroid.SVGParseException; -public class StartActivity extends AbsActionBarActivity { +public class StartActivity extends AppCompatActivity { private static final String TAG = StartActivity.class.getSimpleName(); @@ -46,16 +47,8 @@ public class StartActivity extends AbsActionBarActivity { // Empty, I think this exception will never be caught. } - if (savedInstanceState == null) { - // Only do this when first time - postDelayed(new Runnable() { - @Override - public void run() { - finish(); - Intent intent = new Intent(StartActivity.this, ContentActivity.class); - startActivity(intent); - } - }, 0); - } + finish(); + Intent intent = new Intent(StartActivity.this, ContentActivity.class); + startActivity(intent); } } 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 7d79a5497..11915aad9 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 @@ -16,15 +16,23 @@ package com.hippo.ehviewer.ui.scene; import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v4.view.animation.FastOutLinearInInterpolator; import android.support.v7.widget.RecyclerView; +import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.view.animation.Interpolator; +import android.widget.FrameLayout; import com.hippo.animation.SimpleAnimatorListener; +import com.hippo.drawable.AddDeleteDrawable; import com.hippo.effect.ViewTransition; import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.ContentActivity; @@ -37,9 +45,11 @@ import com.hippo.scene.Scene; import com.hippo.util.Log; import com.hippo.util.MathUtils; import com.hippo.util.ViewUtils; +import com.hippo.widget.FloatingActionButton; -public -class GalleryListScene extends Scene implements SearchBar.Helper { +// TODO disable click action when animating +public class GalleryListScene extends Scene implements SearchBar.Helper, + View.OnClickListener { private static final long ANIMATE_TIME = 300l; @@ -48,6 +58,11 @@ class GalleryListScene extends Scene implements SearchBar.Helper { private final static int STATE_SEARCH = 2; private final static int STATE_SEARCH_SHOW_LIST = 3; + private final static int FAB_STATE_NORMAL = 0; + private final static int FAB_STATE_SEARCH = 1; + + private final static Interpolator FAST_OUT_LINEAR_IN_INTERPOLATOR = new FastOutLinearInInterpolator(); + private ContentActivity mActivity; private Resources mResources; private SearchDatabase mSearchDatabase; @@ -57,6 +72,7 @@ class GalleryListScene extends Scene implements SearchBar.Helper { private RecyclerView mContentRecyclerView; private SearchLayout mSearchLayout; private RecyclerView mSearchRecyclerView; + private FloatingActionButton mCornerFab; private ViewTransition mViewTransition; @@ -64,8 +80,14 @@ class GalleryListScene extends Scene implements SearchBar.Helper { private int mSearchBarOriginalBottom; private ValueAnimator mSearchBarMoveAnimator; - private int mState = STATE_NORMAL; + private int mCornerFabOriginalBottom; + private AddDeleteDrawable mAddDeleteDrawable; + private Drawable mSearchDrawable; + private int mState = STATE_NORMAL; + private int mFabState = FAB_STATE_NORMAL; + + @SuppressWarnings("deprecation") @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -80,6 +102,7 @@ class GalleryListScene extends Scene implements SearchBar.Helper { mContentRecyclerView = mContentLayout.getRecyclerView(); mSearchLayout = (SearchLayout) findViewById(R.id.search_layout); mSearchRecyclerView = mSearchLayout.getRecyclerView(); + mCornerFab = (FloatingActionButton) findViewById(R.id.fab); mViewTransition = new ViewTransition(mContentLayout, mSearchLayout); @@ -95,18 +118,59 @@ class GalleryListScene extends Scene implements SearchBar.Helper { ViewUtils.removeOnGlobalLayoutListener(mSearchBar.getViewTreeObserver(), this); mSearchBarOriginalTop = mSearchBar.getTop(); mSearchBarOriginalBottom = mSearchBar.getBottom(); - mSearchLayout.setFitPaddingTop(mSearchBar.getHeight() + - mResources.getDimensionPixelOffset(R.dimen.search_bar_padding_vertical)); + mSearchLayout.setFitPaddingTop(mSearchBar.getHeight() + mResources.getDimensionPixelOffset(R.dimen.search_bar_padding_vertical)); } }); + // Corner Fab + mCornerFab.setOnClickListener(this); + mCornerFabOriginalBottom = mResources.getDimensionPixelOffset(R.dimen.corner_fab_padding_bottom); + mAddDeleteDrawable = new AddDeleteDrawable(getStageActivity()); + mAddDeleteDrawable.setColor(mResources.getColor(R.color.primary_drawable_dark)); + mSearchDrawable = mResources.getDrawable(R.drawable.ic_search_dark); + mCornerFab.setDrawable(mAddDeleteDrawable); + // TEST mContentLayout.showText("四姑拉斯基"); } @Override protected void onGetFitPaddingBottom(int b) { + // Search Layout mSearchLayout.setFitPaddingBottom(b); + // Corner Fab + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mCornerFab.getLayoutParams(); + lp.bottomMargin = b + mCornerFabOriginalBottom; + mCornerFab.setLayoutParams(lp); + } + + private void setFabState(int fabState) { + if (mFabState != fabState) { + mFabState = fabState; + Drawable drawable = null; + if (mFabState == FAB_STATE_NORMAL) { + drawable = mAddDeleteDrawable; + } else if (mFabState == FAB_STATE_SEARCH) { + drawable = mSearchDrawable; + } else { + return; + } + PropertyValuesHolder scaleXPvh = PropertyValuesHolder.ofFloat("scaleX", 1f, 0f); + PropertyValuesHolder scaleYPvh = PropertyValuesHolder.ofFloat("scaleY", 1f, 0f); + ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(mCornerFab, scaleXPvh, scaleYPvh); + oa.setDuration(ANIMATE_TIME / 2); + oa.setInterpolator(FAST_OUT_LINEAR_IN_INTERPOLATOR); + oa.setRepeatCount(1); + oa.setRepeatMode(ValueAnimator.REVERSE); + final Drawable finalDrawable = drawable; + oa.addListener(new SimpleAnimatorListener() { + @Override + public void onAnimationRepeat(Animator animation) { + mCornerFab.setDrawable(finalDrawable); + } + }); + oa.start(); + } } @Override @@ -119,12 +183,14 @@ class GalleryListScene extends Scene implements SearchBar.Helper { mState = STATE_NORMAL; mSearchBar.setInNormalMode(); returnSearchBarPosition(); + setFabState(FAB_STATE_NORMAL); break; case STATE_SEARCH: mState = STATE_NORMAL; mViewTransition.showFirstView(); mSearchBar.setInNormalMode(); returnSearchBarPosition(); + setFabState(FAB_STATE_NORMAL); break; case STATE_SEARCH_SHOW_LIST: mState = STATE_SEARCH; @@ -134,12 +200,24 @@ class GalleryListScene extends Scene implements SearchBar.Helper { } } + @Override + public void onClick(View v) { + if (v == mCornerFab) { + if (mFabState == FAB_STATE_NORMAL) { + // + } else if (mFabState == FAB_STATE_SEARCH) { + onApplySearch(mSearchBar.getText()); + } + } + } + @Override public void onClickTitle() { if (mState == STATE_NORMAL) { mState = STATE_SIMPLE_SEARCH; mSearchBar.setInEditMode(true); returnSearchBarPosition(); + setFabState(FAB_STATE_SEARCH); } } @@ -161,6 +239,7 @@ class GalleryListScene extends Scene implements SearchBar.Helper { mSearchLayout.scrollSearchContainerToTop(); mSearchBar.setInEditMode(false); returnSearchBarPosition(); + setFabState(FAB_STATE_SEARCH); } } @@ -175,6 +254,7 @@ class GalleryListScene extends Scene implements SearchBar.Helper { @Override public void onApplySearch(String query) { + // TODO Query may be "", should not do search if it is Log.d("onApplySearch " + query); mSearchDatabase.addQuery(query); @@ -182,6 +262,7 @@ class GalleryListScene extends Scene implements SearchBar.Helper { mViewTransition.showFirstView(); mSearchBar.setInNormalMode(); returnSearchBarPosition(); + setFabState(FAB_STATE_NORMAL); } private RecyclerView getVaildRecyclerView() { diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java index 7ce1b5611..5f97066fe 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java @@ -29,7 +29,6 @@ import android.support.v7.widget.CardView; import android.text.Editable; import android.text.Spannable; import android.text.SpannableStringBuilder; -import android.text.TextUtils; import android.text.TextWatcher; import android.text.style.ImageSpan; import android.util.AttributeSet; @@ -183,6 +182,10 @@ public class SearchBar extends CardView implements View.OnClickListener, mHelper = helper; } + public String getText() { + return mEditText.getText().toString(); + } + @Override public void onClick(View v) { if (v == mTitleTextView) { @@ -207,9 +210,7 @@ public class SearchBar extends CardView implements View.OnClickListener, if (v == mEditText) { if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_NULL) { String query = mEditText.getText().toString(); - if (!TextUtils.isEmpty(query)) { - mHelper.onApplySearch(query); - } + mHelper.onApplySearch(query); return true; } } diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java index 3ba9aefd9..c3d652693 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java @@ -41,7 +41,6 @@ import com.hippo.ehviewer.data.ListUrlBuilder; import com.hippo.scene.SimpleDialog; import com.hippo.util.ViewUtils; import com.hippo.widget.FloatLabelEditText; -import com.hippo.widget.FloatingActionButton; import com.hippo.widget.recyclerview.EasyRecyclerView; // TODO requst returnSearchBarPosition when content of recycler changed @@ -79,7 +78,6 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke private boolean mEnableAdvance = false; private EasyRecyclerView mSearchContainer; - private FloatingActionButton mFab; private View mNormalView; private CategoryTable mTableCategory; @@ -111,7 +109,6 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke private Bitmap mSearchImage; - private int mFabMarginBottomOrigin; private int mSearchPaddingTopOrigin; private int mSearchPaddingBottomOrigin; @@ -137,7 +134,6 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke LayoutInflater.from(context).inflate(R.layout.widget_search_layout, this); mSearchContainer = (EasyRecyclerView) getChildAt(0); - mFab = (FloatingActionButton) getChildAt(1); mLayoutManager = new LinearLayoutManager(mContext); mAdapter = new SearchAdapter(); @@ -147,11 +143,9 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke mSearchContainer.setHasFixedSize(true); mSearchContainer.setItemAnimator(mAnimator); - mFab.setOnClickListener(this); - mFabMarginBottomOrigin = mResources.getDimensionPixelSize(R.dimen.content_fab_margin_bottom); - // Search Container mSearchPaddingTopOrigin = mSearchContainer.getPaddingTop(); + // Original padding bottom and the padding bottom to make it above fab mSearchPaddingBottomOrigin = mSearchContainer.getPaddingBottom() + mResources.getDimensionPixelSize(R.dimen.content_padding_bottom); mSearchContainer.setPadding( mSearchContainer.getPaddingLeft(), @@ -179,10 +173,6 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke mSearchContainer.getPaddingRight(), mSearchPaddingBottomOrigin + fitPaddingBottom ); - - LayoutParams lp = (LayoutParams) mFab.getLayoutParams(); - lp.bottomMargin = mFabMarginBottomOrigin + fitPaddingBottom; - mFab.setLayoutParams(lp); } public void setHelper(SearhLayoutHelper helper) { @@ -263,10 +253,6 @@ public class SearchLayout extends FrameLayout implements CompoundButton.OnChecke // TODO add quick search } else if (v == mAction2) { taggleSearchMode(); - } else if (v == mFab) { - if (mHelper != null) { - mHelper.onRequestSearch(getListUrlBuilder(null)); - } } else if (v == mSearchTagHelp) { int[] location = new int [2]; ViewUtils.getLocationInAncestor(mSearchTagHelp, location, R.id.stage); diff --git a/app/src/main/java/com/hippo/ehviewer/widget/StatusBarLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/StatusBarLayout.java index d18136a2c..5743d09d3 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/StatusBarLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/StatusBarLayout.java @@ -28,6 +28,7 @@ import android.view.View; import android.view.ViewGroup; import com.hippo.ehviewer.R; +import com.hippo.util.Log; public class StatusBarLayout extends ViewGroup { diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index 14d11a171..38ae3e0f3 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -59,8 +59,6 @@ public abstract class Scene { protected static SceneManager sSceneManager; - private int mFitPaddingBottom = -1; - static void setSceneManager(SceneManager sceneManager) { sSceneManager = sceneManager; } @@ -173,11 +171,8 @@ public abstract class Scene { onOut(); } - void getFitPaddingBottom(int b) { - if (mFitPaddingBottom != b) { - mFitPaddingBottom = b; - onGetFitPaddingBottom(b); - } + void setFitPaddingBottom(int b) { + onGetFitPaddingBottom(b); } /** diff --git a/app/src/main/java/com/hippo/scene/SceneManager.java b/app/src/main/java/com/hippo/scene/SceneManager.java index e8e4bb3c7..9f4932d5e 100644 --- a/app/src/main/java/com/hippo/scene/SceneManager.java +++ b/app/src/main/java/com/hippo/scene/SceneManager.java @@ -103,7 +103,7 @@ class SceneManager { // Update fit padding int fitPaddingBottom = getStageActivity().getFitPaddingBottom(); if (fitPaddingBottom > 0) { - scene.getFitPaddingBottom(fitPaddingBottom); + scene.setFitPaddingBottom(fitPaddingBottom); } if (curtain != null && previousState != null) { diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index 7afe74da3..ab9869aee 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -19,13 +19,13 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; import android.util.SparseArray; import android.view.View; -import com.hippo.ehviewer.ui.AbsActionBarActivity; import com.hippo.util.IntIdGenerator; -public abstract class StageActivity extends AbsActionBarActivity { +public abstract class StageActivity extends AppCompatActivity { private IntIdGenerator mActivityResultIdGenerator = IntIdGenerator.create(); private SparseArray mActivityResultListenerMap = @@ -41,8 +41,6 @@ public abstract class StageActivity extends AbsActionBarActivity { public abstract @NonNull StageLayout getStageLayout(); - // public abstract @NonNull StageBar getStageBar(); - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -65,7 +63,7 @@ public abstract class StageActivity extends AbsActionBarActivity { if (mFitPaddingBottom != b) { mFitPaddingBottom = b; for (Scene scene : sSceneManager.getSceneStack()) { - scene.getFitPaddingBottom(b); + scene.setFitPaddingBottom(b); } } } diff --git a/app/src/main/java/com/hippo/widget/FloatingActionButton.java b/app/src/main/java/com/hippo/widget/FloatingActionButton.java index 9979bd396..999f86629 100644 --- a/app/src/main/java/com/hippo/widget/FloatingActionButton.java +++ b/app/src/main/java/com/hippo/widget/FloatingActionButton.java @@ -87,6 +87,7 @@ public class FloatingActionButton extends View { ViewUtils.getSuitableSize(getSuggestedMinimumHeight(), heightMeasureSpec)); } + @Override protected void onDraw(Canvas canvas) { mGasketDrawer.draw(canvas); diff --git a/app/src/main/res/layout/scene_gallery_list.xml b/app/src/main/res/layout/scene_gallery_list.xml index 579a6d608..00e2de477 100644 --- a/app/src/main/res/layout/scene_gallery_list.xml +++ b/app/src/main/res/layout/scene_gallery_list.xml @@ -15,6 +15,7 @@ --> @@ -39,5 +40,17 @@ android:layout_marginTop="@dimen/search_bar_padding_vertical" auto:forceNoElevation="true"/> + + diff --git a/app/src/main/res/layout/widget_search_layout.xml b/app/src/main/res/layout/widget_search_layout.xml index 8547f4f23..069866884 100644 --- a/app/src/main/res/layout/widget_search_layout.xml +++ b/app/src/main/res/layout/widget_search_layout.xml @@ -27,12 +27,4 @@ auto:spaceRight="@dimen/search_layout_space_vertical" tools:ignore="RtlHardcoded"/> - - diff --git a/app/src/main/res/values-sw600dp/styles.xml b/app/src/main/res/values-sw600dp/styles.xml deleted file mode 100644 index ad887e044..000000000 --- a/app/src/main/res/values-sw600dp/styles.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b55e94a62..7b25015fc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -35,6 +35,10 @@ 8dp 8dp + + 16dp + 16dp + 0dp 0dp