From a81f4b40f1963a1bd80531fb8cf172a3a5abfc96 Mon Sep 17 00:00:00 2001 From: seven332 Date: Mon, 14 Mar 2016 18:36:13 +0800 Subject: [PATCH] Add grid gallery list --- .../com/hippo/drawable/RoundDrawable.java | 68 ++++++ .../com/hippo/drawable/TriangleDrawable.java | 72 +++++++ .../java/com/hippo/ehviewer/Constants.java | 31 +++ .../java/com/hippo/ehviewer/Settings.java | 7 + .../ehviewer/ui/fragment/AboutFragment.java | 1 + .../ehviewer/ui/fragment/EhFragment.java | 20 +- .../ehviewer/ui/scene/DownloadsScene.java | 101 +++------ .../scene/EnterGalleryDetailTransaction.java | 57 +++++ .../ehviewer/ui/scene/FavoritesScene.java | 140 +++--------- .../ehviewer/ui/scene/GalleryAdapter.java | 200 ++++++++++++++++++ .../ehviewer/ui/scene/GalleryDetailScene.java | 53 +---- .../ehviewer/ui/scene/GalleryHolder.java | 48 +++++ .../ehviewer/ui/scene/GalleryInfoScene.java | 37 +++- .../ehviewer/ui/scene/GalleryListScene.java | 143 +++---------- .../ui/scene/GalleryPreviewsScene.java | 23 +- .../hippo/ehviewer/ui/scene/HistoryScene.java | 140 +++--------- .../ehviewer/ui/scene/QuickSearchScene.java | 7 +- .../java/com/hippo/util/LayoutUtils2.java | 39 ++++ app/src/main/res/drawable/tile_background.xml | 24 +++ app/src/main/res/layout/item_gallery_grid.xml | 45 ++++ app/src/main/res/layout/item_gallery_list.xml | 4 +- app/src/main/res/values-zh-rCN/strings.xml | 3 + app/src/main/res/values-zh-rHK/strings.xml | 3 + app/src/main/res/values-zh-rTW/strings.xml | 3 + app/src/main/res/values/arrays.xml | 10 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/dimens.xml | 4 + app/src/main/res/values/drawables.xml | 1 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/eh_settings.xml | 8 + 30 files changed, 814 insertions(+), 482 deletions(-) create mode 100644 app/src/main/java/com/hippo/drawable/RoundDrawable.java create mode 100644 app/src/main/java/com/hippo/drawable/TriangleDrawable.java create mode 100644 app/src/main/java/com/hippo/ehviewer/Constants.java create mode 100644 app/src/main/java/com/hippo/ehviewer/ui/scene/EnterGalleryDetailTransaction.java create mode 100644 app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java create mode 100644 app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.java create mode 100644 app/src/main/java/com/hippo/util/LayoutUtils2.java create mode 100644 app/src/main/res/drawable/tile_background.xml create mode 100644 app/src/main/res/layout/item_gallery_grid.xml diff --git a/app/src/main/java/com/hippo/drawable/RoundDrawable.java b/app/src/main/java/com/hippo/drawable/RoundDrawable.java new file mode 100644 index 000000000..62cf3fab4 --- /dev/null +++ b/app/src/main/java/com/hippo/drawable/RoundDrawable.java @@ -0,0 +1,68 @@ +/* + * 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.drawable; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; + +public class RoundDrawable extends Drawable { + + private final Paint mPaint; + private final RectF mRectF; + + public RoundDrawable(int color) { + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); + mPaint.setColor(color); + mRectF = new RectF(); + } + + public void setColor(int color) { + mPaint.setColor(color); + invalidateSelf(); + } + + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + mRectF.set(bounds); + } + + @Override + public void draw(Canvas canvas) { + canvas.drawOval(mRectF, mPaint); + } + + @Override + public void setAlpha(int alpha) { + mPaint.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + mPaint.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return PixelFormat.OPAQUE; + } +} diff --git a/app/src/main/java/com/hippo/drawable/TriangleDrawable.java b/app/src/main/java/com/hippo/drawable/TriangleDrawable.java new file mode 100644 index 000000000..ca6379b9b --- /dev/null +++ b/app/src/main/java/com/hippo/drawable/TriangleDrawable.java @@ -0,0 +1,72 @@ +/* + * 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.drawable; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; + +public class TriangleDrawable extends Drawable { + + private final Paint mPaint; + private final Path mPath; + + public TriangleDrawable(int color) { + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); + mPaint.setColor(color); + mPath = new Path(); + } + + public void setColor(int color) { + mPaint.setColor(color); + invalidateSelf(); + } + + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + mPath.reset(); + mPath.moveTo(bounds.left, bounds.top); + mPath.lineTo(bounds.right, bounds.top); + mPath.lineTo(bounds.right, bounds.bottom); + mPath.close(); + } + + @Override + public void draw(Canvas canvas) { + canvas.drawPath(mPath, mPaint); + } + + @Override + public void setAlpha(int alpha) { + mPaint.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + mPaint.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return PixelFormat.OPAQUE; + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/Constants.java b/app/src/main/java/com/hippo/ehviewer/Constants.java new file mode 100644 index 000000000..c362405dd --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/Constants.java @@ -0,0 +1,31 @@ +/* + * 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; + +import com.hippo.yorozuya.Messenger; + +public final class Constants { + + public static final int MESSAGE_ID_LIST_MODE; + + static { + Messenger messenger = Messenger.getInstance(); + MESSAGE_ID_LIST_MODE = messenger.newId(); + } + + private Constants(){} +} diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.java b/app/src/main/java/com/hippo/ehviewer/Settings.java index 48eb5bfff..be73f8a8a 100644 --- a/app/src/main/java/com/hippo/ehviewer/Settings.java +++ b/app/src/main/java/com/hippo/ehviewer/Settings.java @@ -197,6 +197,13 @@ public class Settings { /******************** ****** Eh ********************/ + public static final String KEY_LIST_MODE = "list_mode"; + private static final int DEFAULT_LIST_MODE = 0; + + public static int getListMode() { + return getIntFromStr(KEY_LIST_MODE, DEFAULT_LIST_MODE); + } + private static final String KEY_SHOW_JPN_TITLE = "show_jpn_title"; private static final boolean DEFAULT_SHOW_JPN_TITLE = false; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java index 39c6370ac..134ee2637 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java @@ -80,6 +80,7 @@ public class AboutFragment extends PreferenceFragment if (newValue instanceof Boolean && (Boolean) newValue) { Analytics.start(getActivity()); } + return true; } return true; } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java index c07741155..a37c72a20 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/EhFragment.java @@ -17,15 +17,33 @@ package com.hippo.ehviewer.ui.fragment; import android.os.Bundle; +import android.preference.Preference; import android.preference.PreferenceFragment; +import com.hippo.ehviewer.Constants; import com.hippo.ehviewer.R; +import com.hippo.ehviewer.Settings; +import com.hippo.yorozuya.Messenger; -public class EhFragment extends PreferenceFragment { +public class EhFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.eh_settings); + + Preference listMode = findPreference(Settings.KEY_LIST_MODE); + + listMode.setOnPreferenceChangeListener(this); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + String key = preference.getKey(); + if (Settings.KEY_LIST_MODE.equals(key)) { + Messenger.getInstance().notify(Constants.MESSAGE_ID_LIST_MODE, null); + return true; + } + return true; } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java index 8f3f2ce4a..3dee8de87 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java @@ -18,7 +18,6 @@ package com.hippo.ehviewer.ui.scene; import android.annotation.SuppressLint; import android.annotation.TargetApi; -import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; @@ -28,15 +27,12 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SimpleItemAnimator; import android.support.v7.widget.Toolbar; -import android.transition.TransitionInflater; import android.util.SparseBooleanArray; import android.view.Gravity; import android.view.LayoutInflater; @@ -66,12 +62,9 @@ import com.hippo.ehviewer.download.DownloadManager; import com.hippo.ehviewer.download.DownloadService; import com.hippo.ehviewer.spider.SpiderDen; import com.hippo.ehviewer.ui.GalleryActivity; -import com.hippo.ehviewer.ui.annotation.ViewLifeCircle; -import com.hippo.ehviewer.ui.annotation.WholeLifeCircle; import com.hippo.ehviewer.widget.SimpleRatingView; import com.hippo.rippleold.RippleSalon; import com.hippo.scene.Announcer; -import com.hippo.scene.TransitionHelper; import com.hippo.unifile.UniFile; import com.hippo.util.ApiHelper; import com.hippo.util.DrawableManager; @@ -99,27 +92,26 @@ public class DownloadsScene extends ToolbarScene public static final String ACTION_CLEAR_DOWNLOAD_SERVICE = "clear_download_service"; + /*--------------- + Whole life cycle + ---------------*/ @Nullable - @ViewLifeCircle - private EasyRecyclerView mRecyclerView; - @Nullable - @ViewLifeCircle - private ViewTransition mViewTransition; - @Nullable - @ViewLifeCircle - private FabLayout mFabLayout; - - @Nullable - @ViewLifeCircle - private DownloadAdapter mAdapter; - - @Nullable - @WholeLifeCircle private String mLabel; @Nullable - @WholeLifeCircle private List mList; + /*--------------- + View life cycle + ---------------*/ + @Nullable + private EasyRecyclerView mRecyclerView; + @Nullable + private ViewTransition mViewTransition; + @Nullable + private FabLayout mFabLayout; + @Nullable + private DownloadAdapter mAdapter; + @Override public int getNavCheckedItem() { return R.id.nav_downloads; @@ -262,6 +254,21 @@ public class DownloadsScene extends ToolbarScene setNavigationIcon(R.drawable.v_arrow_left_dark_x24); } + @Override + public void onDestroyView() { + super.onDestroyView(); + + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } + + mFabLayout = null; + mViewTransition = null; + mAdapter = null; + } + @Override public void onNavigationClick() { onBackPressed(); @@ -300,16 +307,6 @@ public class DownloadsScene extends ToolbarScene return false; } - @Override - public void onDestroyView() { - super.onDestroyView(); - - mRecyclerView = null; - mFabLayout = null; - mViewTransition = null; - mAdapter = null; - } - public void updateView() { if (mViewTransition != null) { if (mList == null || mList.size() == 0) { @@ -887,8 +884,7 @@ public class DownloadsScene extends ToolbarScene args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, list.get(index)); Announcer announcer = new Announcer(GalleryDetailScene.class).setArgs(args); if (ApiHelper.SUPPORT_TRANSITION) { - DownloadHolder holder = (DownloadHolder) recyclerView.getChildViewHolder(itemView); - announcer.setTranHelper(new EnterGalleryDetailTransaction(holder)); + announcer.setTranHelper(new EnterGalleryDetailTransaction(thumb)); } startScene(announcer); } else if (start == v) { @@ -915,38 +911,6 @@ public class DownloadsScene extends ToolbarScene } } - private static class EnterGalleryDetailTransaction implements TransitionHelper { - - private final DownloadHolder mHolder; - - public EnterGalleryDetailTransaction(DownloadHolder holder) { - mHolder = holder; - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - @Override - public boolean onTransition(Context context, FragmentTransaction transaction, - Fragment exit, Fragment enter) { - if (mHolder == null || !(enter instanceof GalleryDetailScene)) { - return false; - } - - exit.setSharedElementReturnTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - exit.setExitTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - enter.setSharedElementEnterTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - enter.setEnterTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - transaction.addSharedElement(mHolder.thumb, mHolder.thumb.getTransitionName()); - transaction.addSharedElement(mHolder.title, mHolder.title.getTransitionName()); - transaction.addSharedElement(mHolder.uploader, mHolder.uploader.getTransitionName()); - transaction.addSharedElement(mHolder.category, mHolder.category.getTransitionName()); - return true; - } - } - private class DownloadAdapter extends RecyclerView.Adapter { @Override @@ -985,9 +949,6 @@ public class DownloadsScene extends ToolbarScene if (ApiHelper.SUPPORT_TRANSITION) { long gid = info.gid; holder.thumb.setTransitionName(TransitionNameFactory.getThumbTransitionName(gid)); - holder.title.setTransitionName(TransitionNameFactory.getTitleTransitionName(gid)); - holder.uploader.setTransitionName(TransitionNameFactory.getUploaderTransitionName(gid)); - holder.category.setTransitionName(TransitionNameFactory.getCategoryTransitionName(gid)); } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/EnterGalleryDetailTransaction.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/EnterGalleryDetailTransaction.java new file mode 100644 index 000000000..b1d3dca3a --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/EnterGalleryDetailTransaction.java @@ -0,0 +1,57 @@ +/* + * 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.ui.scene; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.transition.TransitionInflater; +import android.view.View; + +import com.hippo.ehviewer.R; +import com.hippo.scene.TransitionHelper; + +@TargetApi(Build.VERSION_CODES.LOLLIPOP) +class EnterGalleryDetailTransaction implements TransitionHelper { + + private final View mThumb; + + public EnterGalleryDetailTransaction(View thumb) { + mThumb = thumb; + } + + @Override + public boolean onTransition(Context context, FragmentTransaction transaction, + Fragment exit, Fragment enter) { + if (mThumb == null || !(enter instanceof GalleryDetailScene)) { + return false; + } + + exit.setSharedElementReturnTransition( + TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); + exit.setExitTransition( + TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); + enter.setSharedElementEnterTransition( + TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); + enter.setEnterTransition( + TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); + transaction.addSharedElement(mThumb, mThumb.getTransitionName()); + return true; + } +} 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 151634196..74b71cd80 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 @@ -16,27 +16,22 @@ package com.hippo.ehviewer.ui.scene; -import android.annotation.TargetApi; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; -import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ImageSpan; -import android.transition.TransitionInflater; import android.util.SparseBooleanArray; import android.view.Gravity; import android.view.LayoutInflater; @@ -46,7 +41,6 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; -import android.widget.TextView; import com.hippo.annotation.Implemented; import com.hippo.drawable.DrawerArrowDrawable; @@ -56,11 +50,9 @@ import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.EhDB; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; -import com.hippo.ehviewer.client.EhCacheKeyFactory; import com.hippo.ehviewer.client.EhClient; import com.hippo.ehviewer.client.EhRequest; import com.hippo.ehviewer.client.EhUrl; -import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.client.data.FavListUrlBuilder; import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.client.exception.NotFoundException; @@ -69,17 +61,14 @@ import com.hippo.ehviewer.ui.annotation.DrawerLifeCircle; import com.hippo.ehviewer.ui.annotation.ViewLifeCircle; import com.hippo.ehviewer.ui.annotation.WholeLifeCircle; import com.hippo.ehviewer.widget.SearchBar; -import com.hippo.ehviewer.widget.SimpleRatingView; import com.hippo.rippleold.RippleSalon; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.scene.StageActivity; -import com.hippo.scene.TransitionHelper; import com.hippo.util.ApiHelper; import com.hippo.util.DrawableManager; import com.hippo.widget.ContentLayout; import com.hippo.widget.FabLayout; -import com.hippo.widget.LoadImageView; import com.hippo.widget.SearchBarMover; import com.hippo.yorozuya.AssertUtils; import com.hippo.yorozuya.ObjectUtils; @@ -253,9 +242,8 @@ public class FavoritesScene extends BaseScene implements contentLayout.setHelper(mHelper); contentLayout.getFastScroller().setOnDragHandlerListener(this); - mAdapter = new FavoritesAdapter(); - mRecyclerView.setAdapter(mAdapter); - mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 1); + mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setSelector(RippleSalon.generateRippleDrawable(false)); mRecyclerView.setDrawSelectorOnTop(true); mRecyclerView.hasFixedSize(); @@ -264,9 +252,9 @@ public class FavoritesScene extends BaseScene implements mRecyclerView.setOnItemLongClickListener(this); mRecyclerView.setChoiceMode(EasyRecyclerView.CHOICE_MODE_MULTIPLE_CUSTOM); mRecyclerView.setCustomCheckedListener(this); - int paddingH = resources.getDimensionPixelOffset(R.dimen.list_content_margin_h); - int paddingV = resources.getDimensionPixelOffset(R.dimen.list_content_margin_v); - mRecyclerView.setPadding(paddingV, paddingH, paddingV, paddingH); + mAdapter = new FavoritesAdapter(LayoutInflater.from(getContext()), + getContext(), mRecyclerView, layoutManager, Settings.getListMode()); + mRecyclerView.setAdapter(mAdapter); mLeftDrawable = new DrawerArrowDrawable(getContext()); mSearchBar.setLeftDrawable(mLeftDrawable); @@ -348,7 +336,12 @@ public class FavoritesScene extends BaseScene implements public void onDestroyView() { super.onDestroyView(); - mRecyclerView = null; + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } + mSearchBar = null; mFabLayout = null; @@ -480,9 +473,9 @@ public class FavoritesScene extends BaseScene implements args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO); args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, gi); Announcer announcer = new Announcer(GalleryDetailScene.class).setArgs(args); - if (ApiHelper.SUPPORT_TRANSITION) { - FavoritesHolder holder = (FavoritesHolder) mRecyclerView.getChildViewHolder(view); - announcer.setTranHelper(new EnterGalleryDetailTransaction(holder)); + View thumb; + if (ApiHelper.SUPPORT_TRANSITION && null != (thumb = view.findViewById(R.id.thumb))) { + announcer.setTranHelper(new EnterGalleryDetailTransaction(thumb)); } startScene(announcer); } @@ -883,103 +876,22 @@ public class FavoritesScene extends BaseScene implements } } - private static class EnterGalleryDetailTransaction implements TransitionHelper { + private class FavoritesAdapter extends GalleryAdapter { - private final FavoritesHolder mHolder; - - public EnterGalleryDetailTransaction(FavoritesHolder holder) { - mHolder = holder; - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - @Override - public boolean onTransition(Context context, FragmentTransaction transaction, - Fragment exit, Fragment enter) { - if (mHolder == null || !(enter instanceof GalleryDetailScene)) { - return false; - } - - exit.setSharedElementReturnTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - exit.setExitTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - enter.setSharedElementEnterTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - enter.setEnterTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - transaction.addSharedElement(mHolder.thumb, mHolder.thumb.getTransitionName()); - transaction.addSharedElement(mHolder.title, mHolder.title.getTransitionName()); - transaction.addSharedElement(mHolder.uploader, mHolder.uploader.getTransitionName()); - transaction.addSharedElement(mHolder.category, mHolder.category.getTransitionName()); - return true; - } - } - - private class FavoritesHolder extends RecyclerView.ViewHolder { - - private final LoadImageView thumb; - private final TextView title; - private final TextView uploader; - private final SimpleRatingView rating; - private final TextView category; - private final TextView posted; - private final TextView simpleLanguage; - - public FavoritesHolder(View itemView) { - super(itemView); - - thumb = (LoadImageView) itemView.findViewById(R.id.thumb); - title = (TextView) itemView.findViewById(R.id.title); - uploader = (TextView) itemView.findViewById(R.id.uploader); - rating = (SimpleRatingView) itemView.findViewById(R.id.rating); - category = (TextView) itemView.findViewById(R.id.category); - posted = (TextView) itemView.findViewById(R.id.posted); - simpleLanguage = (TextView) itemView.findViewById(R.id.simple_language); - } - } - - private class FavoritesAdapter extends RecyclerView.Adapter { - - @Override - public FavoritesHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return new FavoritesHolder(getActivity().getLayoutInflater() - .inflate(R.layout.item_gallery_list, parent, false)); - } - - @Override - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public void onBindViewHolder(FavoritesHolder holder, int position) { - if (mHelper == null) { - return; - } - - GalleryInfo gi = mHelper.getDataAt(position); - holder.thumb.load(EhCacheKeyFactory.getThumbKey(gi.gid), gi.thumb, true); - holder.title.setText(EhUtils.getSuitableTitle(gi)); - holder.uploader.setText(gi.uploader); - holder.rating.setRating(gi.rating); - TextView category = holder.category; - String newCategoryText = EhUtils.getCategory(gi.category); - if (!newCategoryText.equals(category.getText())) { - category.setText(newCategoryText); - category.setBackgroundColor(EhUtils.getCategoryColor(gi.category)); - } - holder.posted.setText(gi.posted); - holder.simpleLanguage.setText(gi.simpleLanguage); - - // Update transition name - if (ApiHelper.SUPPORT_TRANSITION) { - long gid = gi.gid; - holder.thumb.setTransitionName(TransitionNameFactory.getThumbTransitionName(gid)); - holder.title.setTransitionName(TransitionNameFactory.getTitleTransitionName(gid)); - holder.uploader.setTransitionName(TransitionNameFactory.getUploaderTransitionName(gid)); - holder.category.setTransitionName(TransitionNameFactory.getCategoryTransitionName(gid)); - } + public FavoritesAdapter(LayoutInflater inflater, Context context, + RecyclerView recyclerView, GridLayoutManager layoutManager, int type) { + super(inflater, context, recyclerView, layoutManager, type); } @Override public int getItemCount() { - return mHelper != null ? mHelper.size() : 0; + return null != mHelper ? mHelper.size() : 0; + } + + @Nullable + @Override + public GalleryInfo getDataAt(int position) { + return null != mHelper ? mHelper.getDataAt(position) : null; } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java new file mode 100644 index 000000000..725f1f923 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java @@ -0,0 +1,200 @@ +/* + * 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.ui.scene; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.hippo.drawable.TriangleDrawable; +import com.hippo.easyrecyclerview.MarginItemDecoration; +import com.hippo.ehviewer.Constants; +import com.hippo.ehviewer.R; +import com.hippo.ehviewer.Settings; +import com.hippo.ehviewer.client.EhCacheKeyFactory; +import com.hippo.ehviewer.client.EhUtils; +import com.hippo.ehviewer.client.data.GalleryInfo; +import com.hippo.util.ApiHelper; +import com.hippo.util.LayoutUtils2; +import com.hippo.yorozuya.Messenger; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +abstract class GalleryAdapter extends RecyclerView.Adapter implements Messenger.Receiver { + + @IntDef({TYPE_LIST, TYPE_GRID}) + @Retention(RetentionPolicy.SOURCE) + public @interface Type {} + + public static final int TYPE_INVALID = -1; + public static final int TYPE_LIST = 0; + public static final int TYPE_GRID = 1; + + private final LayoutInflater mInflater; + private final Context mContext; + private final Resources mResources; + private final RecyclerView mRecyclerView; + private final GridLayoutManager mLayoutManager; + private RecyclerView.ItemDecoration mGirdDecoration; + private int mType = TYPE_INVALID; + + public GalleryAdapter(LayoutInflater inflater, Context context, + RecyclerView recyclerView, GridLayoutManager layoutManager, int type) { + mInflater = inflater; + mContext = context; + mResources = context.getResources(); + mRecyclerView = recyclerView; + mLayoutManager = layoutManager; + + int paddingH = mResources.getDimensionPixelOffset(R.dimen.list_content_margin_h); + int paddingV = mResources.getDimensionPixelOffset(R.dimen.list_content_margin_v); + mRecyclerView.setPadding(paddingV, paddingH, paddingV, paddingH); + setType(type); + } + + public int getType() { + return mType; + } + + public void setType(int type) { + if (type == mType) { + return; + } + mType = type; + + switch (type) { + default: + case GalleryAdapter.TYPE_LIST: { + int minWidth = mResources.getDimensionPixelOffset(R.dimen.gallery_list_min_width); + int spanCount = LayoutUtils2.calculateSpanCount(mContext, minWidth); + mLayoutManager.setSpanCount(spanCount); + if (null != mGirdDecoration) { + mRecyclerView.removeItemDecoration(mGirdDecoration); + } + notifyDataSetChanged(); + break; + } + case GalleryAdapter.TYPE_GRID: { + int minWidth = mResources.getDimensionPixelOffset(R.dimen.gallery_grid_min_width); + int spanCount = LayoutUtils2.calculateSpanCount(mContext, minWidth); + mLayoutManager.setSpanCount(spanCount); + if (null == mGirdDecoration) { + mGirdDecoration = new MarginItemDecoration( + mResources.getDimensionPixelOffset(R.dimen.list_content_interval)); + } + mRecyclerView.addItemDecoration(mGirdDecoration); + notifyDataSetChanged(); + break; + } + } + } + + @Override + public GalleryHolder onCreateViewHolder(ViewGroup parent, int viewType) { + int layoutId; + switch (viewType) { + default: + case TYPE_LIST: + layoutId = R.layout.item_gallery_list; + break; + case TYPE_GRID: + layoutId = R.layout.item_gallery_grid; + break; + } + return new GalleryHolder(mInflater.inflate(layoutId, parent, false)); + } + + @Override + public int getItemViewType(int position) { + return mType; + } + + @Nullable + public abstract GalleryInfo getDataAt(int position); + + @Override + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public void onBindViewHolder(GalleryHolder holder, int position) { + GalleryInfo gi = getDataAt(position); + if (null == gi) { + return; + } + + switch (mType) { + default: + case TYPE_LIST: + holder.thumb.load(EhCacheKeyFactory.getThumbKey(gi.gid), gi.thumb); + holder.title.setText(EhUtils.getSuitableTitle(gi)); + holder.uploader.setText(gi.uploader); + holder.rating.setRating(gi.rating); + TextView category = holder.category; + String newCategoryText = EhUtils.getCategory(gi.category); + if (!newCategoryText.equals(category.getText())) { + category.setText(newCategoryText); + category.setBackgroundColor(EhUtils.getCategoryColor(gi.category)); + } + holder.posted.setText(gi.posted); + holder.simpleLanguage.setText(gi.simpleLanguage); + break; + case TYPE_GRID: + holder.thumb.load(EhCacheKeyFactory.getThumbKey(gi.gid), gi.thumb); + TextView simpleLanguage = holder.simpleLanguage; + Drawable drawable = simpleLanguage.getBackground(); + int color = EhUtils.getCategoryColor(gi.category); + if (!(drawable instanceof TriangleDrawable)) { + drawable = new TriangleDrawable(color); + simpleLanguage.setBackground(drawable); + } else { + ((TriangleDrawable) drawable).setColor(color); + } + simpleLanguage.setText(gi.simpleLanguage); + break; + } + + // Update transition name + if (ApiHelper.SUPPORT_TRANSITION) { + long gid = gi.gid; + holder.thumb.setTransitionName(TransitionNameFactory.getThumbTransitionName(gid)); + } + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + Messenger.getInstance().register(Constants.MESSAGE_ID_LIST_MODE, this); + } + + @Override + public void onDetachedFromRecyclerView(RecyclerView recyclerView) { + Messenger.getInstance().unregister(Constants.MESSAGE_ID_LIST_MODE, this); + } + + @Override + public void onReceive(int id, Object obj) { + setType(Settings.getListMode()); + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index 4cf4064d2..49287ed94 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -140,119 +140,88 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene @ViewLifeCircle private ViewTransition mViewTransition; + /*--------------- + View life cycle + ---------------*/ // Header @Nullable - @ViewLifeCircle private View mHeader; @Nullable - @ViewLifeCircle private View mColorBg; @Nullable - @ViewLifeCircle private LoadImageView mThumb; @Nullable - @ViewLifeCircle private TextView mTitle; @Nullable - @ViewLifeCircle private TextView mUploader; @Nullable - @ViewLifeCircle private TextView mCategory; @Nullable - @ViewLifeCircle private ImageView mOtherActions; @Nullable - @ViewLifeCircle private ViewGroup mActionGroup; @Nullable - @ViewLifeCircle private TextView mDownload; @Nullable - @ViewLifeCircle private View mRead; // Below header @Nullable - @ViewLifeCircle private View mBelowHeader; // Info @Nullable - @ViewLifeCircle private View mInfo; @Nullable - @ViewLifeCircle private TextView mLanguage; @Nullable - @ViewLifeCircle private TextView mPages; @Nullable - @ViewLifeCircle private TextView mSize; @Nullable - @ViewLifeCircle private TextView mPosted; @Nullable - @ViewLifeCircle private TextView mFavoredTimes; // Actions @Nullable - @ViewLifeCircle private View mActions; @Nullable - @ViewLifeCircle private TextView mRatingText; @Nullable - @ViewLifeCircle private RatingBar mRating; @Nullable - @ViewLifeCircle private View mHeartGroup; @Nullable - @ViewLifeCircle private TextView mHeart; @Nullable - @ViewLifeCircle private TextView mHeartOutline; @Nullable - @ViewLifeCircle private TextView mTorrent; @Nullable - @ViewLifeCircle private TextView mShare; @Nullable - @ViewLifeCircle private TextView mRate; // Tags @Nullable - @ViewLifeCircle private LinearLayout mTags; @Nullable - @ViewLifeCircle private TextView mNoTags; // Comments @Nullable - @ViewLifeCircle private LinearLayout mComments; @Nullable - @ViewLifeCircle private TextView mCommentsText; // Previews + @Nullable private View mPreviews; @Nullable - @ViewLifeCircle private SimpleGridLayout mGridLayout; @Nullable - @ViewLifeCircle private TextView mPreviewText; // Progress @Nullable - @ViewLifeCircle private View mProgress; @Nullable - @ViewLifeCircle private ViewTransition mViewTransition2; @Nullable - @ViewLifeCircle private PopupMenu mPopupMenu; @WholeLifeCircle @@ -1143,11 +1112,10 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene // Only show transaction when thumb can be seen if (location[1] + mThumb.getHeight() > 0) { setTransitionName(); - finish(new ExitTransaction(mThumb, mTitle, mUploader, mCategory)); + finish(new ExitTransaction(mThumb)); return; } } - finish(); } @@ -1251,15 +1219,9 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private static class ExitTransaction implements TransitionHelper { private final View mThumb; - private final View mTitle; - private final View mUploader; - private final View mCategory; - public ExitTransaction(View thumb, View title, View uploader, View category) { + public ExitTransaction(View thumb) { mThumb = thumb; - mTitle = title; - mUploader = uploader; - mCategory = category; } @Override @@ -1280,9 +1242,6 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene enter.setEnterTransition( TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); transaction.addSharedElement(mThumb, mThumb.getTransitionName()); - transaction.addSharedElement(mTitle, mTitle.getTransitionName()); - transaction.addSharedElement(mUploader, mUploader.getTransitionName()); - transaction.addSharedElement(mCategory, mCategory.getTransitionName()); return true; } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.java new file mode 100644 index 000000000..8844cf8e3 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryHolder.java @@ -0,0 +1,48 @@ +/* + * 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.ui.scene; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.TextView; + +import com.hippo.ehviewer.R; +import com.hippo.ehviewer.widget.SimpleRatingView; +import com.hippo.widget.LoadImageView; + +class GalleryHolder extends RecyclerView.ViewHolder { + + public final LoadImageView thumb; + public final TextView title; + public final TextView uploader; + public final SimpleRatingView rating; + public final TextView category; + public final TextView posted; + public final TextView simpleLanguage; + + public GalleryHolder(View itemView) { + super(itemView); + + thumb = (LoadImageView) itemView.findViewById(R.id.thumb); + title = (TextView) itemView.findViewById(R.id.title); + uploader = (TextView) itemView.findViewById(R.id.uploader); + rating = (SimpleRatingView) itemView.findViewById(R.id.rating); + category = (TextView) itemView.findViewById(R.id.category); + posted = (TextView) itemView.findViewById(R.id.posted); + simpleLanguage = (TextView) itemView.findViewById(R.id.simple_language); + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryInfoScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryInfoScene.java index 44f56e8eb..43caf2778 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryInfoScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryInfoScene.java @@ -38,6 +38,7 @@ import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.client.data.GalleryDetail; import com.hippo.rippleold.RippleSalon; import com.hippo.yorozuya.LayoutUtils; +import com.hippo.yorozuya.ViewUtils; import java.util.ArrayList; @@ -47,11 +48,20 @@ public final class GalleryInfoScene extends ToolbarScene implements EasyRecycler public static final String KEY_KEYS = "keys"; public static final String KEY_VALUES = "values"; + /*--------------- + Whole life cycle + ---------------*/ @Nullable private ArrayList mKeys; @Nullable private ArrayList mValues; + /*--------------- + View life cycle + ---------------*/ + @Nullable + private EasyRecyclerView mRecyclerView; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -147,22 +157,33 @@ public final class GalleryInfoScene extends ToolbarScene implements EasyRecycler @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.scene_gallery_info, container, false); - EasyRecyclerView recyclerView = (EasyRecyclerView) view.findViewById(R.id.recycler_view); + mRecyclerView = (EasyRecyclerView) ViewUtils.$$(view, R.id.recycler_view); InfoAdapter adapter = new InfoAdapter(); - recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + mRecyclerView.setAdapter(adapter); + mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); LinearDividerItemDecoration decoration = new LinearDividerItemDecoration( LinearDividerItemDecoration.VERTICAL, getResources().getColor(R.color.divider), LayoutUtils.dp2pix(getContext(), 1)); decoration.setPadding(getResources().getDimensionPixelOffset(R.dimen.keyline_margin)); - recyclerView.addItemDecoration(decoration); - recyclerView.setSelector(RippleSalon.generateRippleDrawable(false)); - recyclerView.setClipToPadding(false); - recyclerView.setHasFixedSize(true); - recyclerView.setOnItemClickListener(this); + mRecyclerView.addItemDecoration(decoration); + mRecyclerView.setSelector(RippleSalon.generateRippleDrawable(false)); + mRecyclerView.setClipToPadding(false); + mRecyclerView.setHasFixedSize(true); + mRecyclerView.setOnItemClickListener(this); return view; } + @Override + public void onDestroyView() { + super.onDestroyView(); + + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } + } + @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); 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 15ba74612..aa56e3e6d 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 @@ -17,29 +17,24 @@ package com.hippo.ehviewer.ui.scene; import android.animation.Animator; -import android.annotation.TargetApi; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; -import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ImageSpan; -import android.transition.TransitionInflater; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; @@ -59,7 +54,6 @@ import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.EhDB; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; -import com.hippo.ehviewer.client.EhCacheKeyFactory; import com.hippo.ehviewer.client.EhClient; import com.hippo.ehviewer.client.EhRequest; import com.hippo.ehviewer.client.EhUtils; @@ -71,17 +65,14 @@ 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.ehviewer.widget.SimpleRatingView; import com.hippo.rippleold.RippleSalon; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.scene.StageActivity; -import com.hippo.scene.TransitionHelper; import com.hippo.util.ApiHelper; import com.hippo.util.DrawableManager; import com.hippo.view.ViewTransition; import com.hippo.widget.ContentLayout; -import com.hippo.widget.LoadImageView; import com.hippo.widget.SearchBarMover; import com.hippo.yorozuya.AnimationUtils; import com.hippo.yorozuya.MathUtils; @@ -341,18 +332,17 @@ public final class GalleryListScene extends BaseScene contentLayout.setHelper(mHelper); contentLayout.getFastScroller().setOnDragHandlerListener(this); - mAdapter = new GalleryListAdapter(); - mRecyclerView.setAdapter(mAdapter); - mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 1); + mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setSelector(RippleSalon.generateRippleDrawable(false)); mRecyclerView.setDrawSelectorOnTop(true); mRecyclerView.hasFixedSize(); mRecyclerView.setClipToPadding(false); mRecyclerView.setOnItemClickListener(this); mRecyclerView.setOnItemLongClickListener(this); - int paddingH = resources.getDimensionPixelOffset(R.dimen.list_content_margin_h); - int paddingV = resources.getDimensionPixelOffset(R.dimen.list_content_margin_v); - mRecyclerView.setPadding(paddingV, paddingH, paddingV, paddingH); + mAdapter = new GalleryListAdapter(LayoutInflater.from(getContext()), + getContext(), mRecyclerView, layoutManager, Settings.getListMode()); + mRecyclerView.setAdapter(mAdapter); mLeftDrawable = new DrawerArrowDrawable(getContext()); mRightDrawable = new AddDeleteDrawable(getContext()); @@ -389,13 +379,17 @@ public final class GalleryListScene extends BaseScene public void onDestroyView() { super.onDestroyView(); - // End animation + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } if (mSearchBarMover != null) { mSearchBarMover.cancelAnimation(); + mSearchBarMover = null; } mFitPaddingLayout = null; - mRecyclerView = null; mSearchLayout = null; mSearchBar = null; mFab = null; @@ -404,7 +398,6 @@ public final class GalleryListScene extends BaseScene mHelper = null; mLeftDrawable = null; mRightDrawable = null; - mSearchBarMover = null; mFabAnimatorListener = null; } @@ -555,38 +548,6 @@ public final class GalleryListScene extends BaseScene } } - private static class EnterGalleryDetailTransaction implements TransitionHelper { - - private final GalleryListHolder mHolder; - - public EnterGalleryDetailTransaction(GalleryListHolder holder) { - mHolder = holder; - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - @Override - public boolean onTransition(Context context, FragmentTransaction transaction, - Fragment exit, Fragment enter) { - if (mHolder == null || !(enter instanceof GalleryDetailScene)) { - return false; - } - - exit.setSharedElementReturnTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - exit.setExitTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - enter.setSharedElementEnterTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - enter.setEnterTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - transaction.addSharedElement(mHolder.thumb, mHolder.thumb.getTransitionName()); - transaction.addSharedElement(mHolder.title, mHolder.title.getTransitionName()); - transaction.addSharedElement(mHolder.uploader, mHolder.uploader.getTransitionName()); - transaction.addSharedElement(mHolder.category, mHolder.category.getTransitionName()); - return true; - } - } - @Override public boolean onItemClick(EasyRecyclerView parent, View view, int position, long id) { if (null == mHelper || null == mRecyclerView) { @@ -598,9 +559,9 @@ public final class GalleryListScene extends BaseScene args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO); args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, gi); Announcer announcer = new Announcer(GalleryDetailScene.class).setArgs(args); - if (ApiHelper.SUPPORT_TRANSITION) { - GalleryListHolder holder = (GalleryListHolder) mRecyclerView.getChildViewHolder(view); - announcer.setTranHelper(new EnterGalleryDetailTransaction(holder)); + View thumb; + if (ApiHelper.SUPPORT_TRANSITION && null != (thumb = view.findViewById(R.id.thumb))) { + announcer.setTranHelper(new EnterGalleryDetailTransaction(thumb)); } startScene(announcer); return true; @@ -921,77 +882,23 @@ public final class GalleryListScene extends BaseScene scene.startScene(new Announcer(GalleryListScene.class).setArgs(args)); } - private class GalleryListHolder extends RecyclerView.ViewHolder { + private class GalleryListAdapter extends GalleryAdapter { - private final LoadImageView thumb; - private final TextView title; - private final TextView uploader; - private final SimpleRatingView rating; - private final TextView category; - private final TextView posted; - private final TextView simpleLanguage; - - public GalleryListHolder(View itemView) { - super(itemView); - - thumb = (LoadImageView) itemView.findViewById(R.id.thumb); - title = (TextView) itemView.findViewById(R.id.title); - uploader = (TextView) itemView.findViewById(R.id.uploader); - rating = (SimpleRatingView) itemView.findViewById(R.id.rating); - category = (TextView) itemView.findViewById(R.id.category); - posted = (TextView) itemView.findViewById(R.id.posted); - simpleLanguage = (TextView) itemView.findViewById(R.id.simple_language); - } - } - - private class GalleryListAdapter extends RecyclerView.Adapter { - - private final LayoutInflater mInflater; - - public GalleryListAdapter() { - mInflater = getActivity().getLayoutInflater(); - } - - @Override - public GalleryListHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return new GalleryListHolder(mInflater.inflate(R.layout.item_gallery_list, parent, false)); - } - - @Override - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public void onBindViewHolder(GalleryListHolder holder, int position) { - if (null == mHelper) { - return; - } - - GalleryInfo gi = mHelper.getDataAt(position); - holder.thumb.load(EhCacheKeyFactory.getThumbKey(gi.gid), gi.thumb, true); - holder.title.setText(EhUtils.getSuitableTitle(gi)); - holder.uploader.setText(gi.uploader); - holder.rating.setRating(gi.rating); - TextView category = holder.category; - String newCategoryText = EhUtils.getCategory(gi.category); - if (!newCategoryText.equals(category.getText())) { - category.setText(newCategoryText); - category.setBackgroundColor(EhUtils.getCategoryColor(gi.category)); - } - holder.posted.setText(gi.posted); - holder.simpleLanguage.setText(gi.simpleLanguage); - - // Update transition name - if (ApiHelper.SUPPORT_TRANSITION) { - long gid = gi.gid; - holder.thumb.setTransitionName(TransitionNameFactory.getThumbTransitionName(gid)); - holder.title.setTransitionName(TransitionNameFactory.getTitleTransitionName(gid)); - holder.uploader.setTransitionName(TransitionNameFactory.getUploaderTransitionName(gid)); - holder.category.setTransitionName(TransitionNameFactory.getCategoryTransitionName(gid)); - } + public GalleryListAdapter(LayoutInflater inflater, Context context, + RecyclerView recyclerView, GridLayoutManager layoutManager, int type) { + super(inflater, context, recyclerView, layoutManager, type); } @Override public int getItemCount() { return null != mHelper ? mHelper.size() : 0; } + + @Nullable + @Override + public GalleryInfo getDataAt(int position) { + return null != mHelper ? mHelper.getDataAt(position) : null; + } } private class GalleryListHelper extends ContentLayout.ContentHelper { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java index ac422d3b8..470013021 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java @@ -75,6 +75,8 @@ public class GalleryPreviewsScene extends ToolbarScene implements EasyRecyclerVi View life cycle ---------------*/ @Nullable + private EasyRecyclerView mRecyclerView; + @Nullable private GalleryPreviewAdapter mAdapter; @Nullable private GalleryPreviewHelper mHelper; @@ -121,16 +123,16 @@ public class GalleryPreviewsScene extends ToolbarScene implements EasyRecyclerVi ContentLayout contentLayout = (ContentLayout) inflater.inflate( R.layout.scene_gallery_previews, container, false); contentLayout.hideFastScroll(); - EasyRecyclerView recyclerView = contentLayout.getRecyclerView(); + mRecyclerView = contentLayout.getRecyclerView(); mAdapter = new GalleryPreviewAdapter(); - recyclerView.setAdapter(mAdapter); - recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3)); // TODO hardcode + mRecyclerView.setAdapter(mAdapter); + mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3)); // TODO hardcode int padding = LayoutUtils.dp2pix(getContext(), 4); - recyclerView.setPadding(padding, padding, padding, padding); - recyclerView.setClipToPadding(false); - recyclerView.addItemDecoration(new MarginItemDecoration(padding)); - recyclerView.setOnItemClickListener(this); + mRecyclerView.setPadding(padding, padding, padding, padding); + mRecyclerView.setClipToPadding(false); + mRecyclerView.addItemDecoration(new MarginItemDecoration(padding)); + mRecyclerView.setOnItemClickListener(this); mHelper = new GalleryPreviewHelper(); contentLayout.setHelper(mHelper); @@ -147,6 +149,13 @@ public class GalleryPreviewsScene extends ToolbarScene implements EasyRecyclerVi @Override public void onDestroyView() { super.onDestroyView(); + + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } + mAdapter = null; mHelper = null; } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java index 2bcabf6ed..055f5576b 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java @@ -16,20 +16,14 @@ package com.hippo.ehviewer.ui.scene; -import android.annotation.TargetApi; import android.content.Context; import android.content.DialogInterface; -import android.content.res.Resources; import android.graphics.drawable.Drawable; -import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AlertDialog; -import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; -import android.transition.TransitionInflater; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -40,21 +34,18 @@ import com.hippo.easyrecyclerview.FastScroller; import com.hippo.easyrecyclerview.HandlerDrawable; import com.hippo.ehviewer.EhDB; import com.hippo.ehviewer.R; -import com.hippo.ehviewer.client.EhCacheKeyFactory; +import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.dao.HistoryInfo; import com.hippo.ehviewer.ui.CommonOperations; -import com.hippo.ehviewer.widget.SimpleRatingView; import com.hippo.rippleold.RippleSalon; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.scene.StageActivity; -import com.hippo.scene.TransitionHelper; import com.hippo.util.ApiHelper; import com.hippo.util.DrawableManager; import com.hippo.view.ViewTransition; -import com.hippo.widget.LoadImageView; import com.hippo.yorozuya.ResourcesUtils; import com.hippo.yorozuya.ViewUtils; @@ -96,21 +87,18 @@ public class HistoryScene extends ToolbarScene drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); tip.setCompoundDrawables(null, drawable, null, null); - Resources resources = getResources(); - mList = EhDB.getHistoryLazyList(); - mAdapter = new HistoryAdapter(); - mRecyclerView.setAdapter(mAdapter); - mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 1); + mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setSelector(RippleSalon.generateRippleDrawable(false)); mRecyclerView.setDrawSelectorOnTop(true); mRecyclerView.hasFixedSize(); mRecyclerView.setClipToPadding(false); mRecyclerView.setOnItemClickListener(this); mRecyclerView.setOnItemLongClickListener(this); - int paddingH = resources.getDimensionPixelOffset(R.dimen.list_content_margin_h); - int paddingV = resources.getDimensionPixelOffset(R.dimen.list_content_margin_v); - mRecyclerView.setPadding(paddingV, paddingH, paddingV, paddingH); + mAdapter = new HistoryAdapter(LayoutInflater.from(getContext()), + getContext(), mRecyclerView, layoutManager, Settings.getListMode()); + mRecyclerView.setAdapter(mAdapter); fastScroller.attachToRecyclerView(mRecyclerView); HandlerDrawable handlerDrawable = new HandlerDrawable(); @@ -137,13 +125,18 @@ public class HistoryScene extends ToolbarScene public void onDestroyView() { super.onDestroyView(); - mRecyclerView = null; - mViewTransition = null; - mAdapter = null; + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } if (null != mList) { mList.close(); mList = null; } + + mViewTransition = null; + mAdapter = null; } @Override @@ -161,9 +154,9 @@ public class HistoryScene extends ToolbarScene args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO); args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, mList.get(position)); Announcer announcer = new Announcer(GalleryDetailScene.class).setArgs(args); - if (ApiHelper.SUPPORT_TRANSITION) { - HistoryHolder holder = (HistoryHolder) mRecyclerView.getChildViewHolder(view); - announcer.setTranHelper(new EnterGalleryDetailTransaction(holder)); + View thumb; + if (ApiHelper.SUPPORT_TRANSITION && null != (thumb = view.findViewById(R.id.thumb))) { + announcer.setTranHelper(new EnterGalleryDetailTransaction(thumb)); } startScene(announcer); return true; @@ -196,103 +189,22 @@ public class HistoryScene extends ToolbarScene return true; } - private class HistoryHolder extends RecyclerView.ViewHolder { + private class HistoryAdapter extends GalleryAdapter { - private final LoadImageView thumb; - private final TextView title; - private final TextView uploader; - private final SimpleRatingView rating; - private final TextView category; - private final TextView posted; - private final TextView simpleLanguage; - - public HistoryHolder(View itemView) { - super(itemView); - - thumb = (LoadImageView) itemView.findViewById(R.id.thumb); - title = (TextView) itemView.findViewById(R.id.title); - uploader = (TextView) itemView.findViewById(R.id.uploader); - rating = (SimpleRatingView) itemView.findViewById(R.id.rating); - category = (TextView) itemView.findViewById(R.id.category); - posted = (TextView) itemView.findViewById(R.id.posted); - simpleLanguage = (TextView) itemView.findViewById(R.id.simple_language); - } - } - - private class HistoryAdapter extends RecyclerView.Adapter { - - @Override - public HistoryHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return new HistoryHolder(getActivity().getLayoutInflater() - .inflate(R.layout.item_gallery_list, parent, false)); + public HistoryAdapter(LayoutInflater inflater, Context context, + RecyclerView recyclerView, GridLayoutManager layoutManager, int type) { + super(inflater, context, recyclerView, layoutManager, type); } + @Nullable @Override - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public void onBindViewHolder(HistoryHolder holder, int position) { - if (null == mList) { - return; - } - - GalleryInfo gi = mList.get(position); - holder.thumb.load(EhCacheKeyFactory.getThumbKey(gi.gid), gi.thumb, true); - holder.title.setText(EhUtils.getSuitableTitle(gi)); - holder.uploader.setText(gi.uploader); - holder.rating.setRating(gi.rating); - TextView category = holder.category; - String newCategoryText = EhUtils.getCategory(gi.category); - if (!newCategoryText.equals(category.getText())) { - category.setText(newCategoryText); - category.setBackgroundColor(EhUtils.getCategoryColor(gi.category)); - } - holder.posted.setText(gi.posted); - holder.simpleLanguage.setText(gi.simpleLanguage); - - // Update transition name - if (ApiHelper.SUPPORT_TRANSITION) { - long gid = gi.gid; - holder.thumb.setTransitionName(TransitionNameFactory.getThumbTransitionName(gid)); - holder.title.setTransitionName(TransitionNameFactory.getTitleTransitionName(gid)); - holder.uploader.setTransitionName(TransitionNameFactory.getUploaderTransitionName(gid)); - holder.category.setTransitionName(TransitionNameFactory.getCategoryTransitionName(gid)); - } + public GalleryInfo getDataAt(int position) { + return null != mList ? mList.get(position) : null; } @Override public int getItemCount() { - return mList != null ? mList.size() : 0; - } - } - - private static class EnterGalleryDetailTransaction implements TransitionHelper { - - private final HistoryHolder mHolder; - - public EnterGalleryDetailTransaction(HistoryHolder holder) { - mHolder = holder; - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - @Override - public boolean onTransition(Context context, FragmentTransaction transaction, - Fragment exit, Fragment enter) { - if (mHolder == null || !(enter instanceof GalleryDetailScene)) { - return false; - } - - exit.setSharedElementReturnTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - exit.setExitTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - enter.setSharedElementEnterTransition( - TransitionInflater.from(context).inflateTransition(R.transition.trans_move)); - enter.setEnterTransition( - TransitionInflater.from(context).inflateTransition(android.R.transition.fade)); - transaction.addSharedElement(mHolder.thumb, mHolder.thumb.getTransitionName()); - transaction.addSharedElement(mHolder.title, mHolder.title.getTransitionName()); - transaction.addSharedElement(mHolder.uploader, mHolder.uploader.getTransitionName()); - transaction.addSharedElement(mHolder.category, mHolder.category.getTransitionName()); - return true; + return null != mList ? mList.size() : 0; } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java index df8c2fc89..e46bc5089 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java @@ -139,7 +139,12 @@ public final class QuickSearchScene extends ToolbarScene { public void onDestroyView() { super.onDestroyView(); - mRecyclerView = null; + if (null != mRecyclerView) { + mRecyclerView.setAdapter(null); + mRecyclerView.setLayoutManager(null); + mRecyclerView = null; + } + mViewTransition = null; mAdapter = null; } diff --git a/app/src/main/java/com/hippo/util/LayoutUtils2.java b/app/src/main/java/com/hippo/util/LayoutUtils2.java new file mode 100644 index 000000000..712e48cc5 --- /dev/null +++ b/app/src/main/java/com/hippo/util/LayoutUtils2.java @@ -0,0 +1,39 @@ +/* + * 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.util; + +import android.content.Context; +import android.graphics.Point; +import android.view.Display; +import android.view.WindowManager; + +import com.hippo.yorozuya.MathUtils; + +public final class LayoutUtils2 { + + private static final Point sPoint = new Point(); + + private LayoutUtils2() {} + + public static int calculateSpanCount(Context context, int minWidth) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display display = wm.getDefaultDisplay(); + display.getSize(sPoint); + int width = sPoint.x; + return MathUtils.clamp(width / minWidth, 1, Integer.MAX_VALUE); + } +} diff --git a/app/src/main/res/drawable/tile_background.xml b/app/src/main/res/drawable/tile_background.xml new file mode 100644 index 000000000..ed5ccdda6 --- /dev/null +++ b/app/src/main/res/drawable/tile_background.xml @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/item_gallery_grid.xml b/app/src/main/res/layout/item_gallery_grid.xml new file mode 100644 index 000000000..7550c9fd2 --- /dev/null +++ b/app/src/main/res/layout/item_gallery_grid.xml @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/item_gallery_list.xml b/app/src/main/res/layout/item_gallery_list.xml index e52afce22..40d18738a 100644 --- a/app/src/main/res/layout/item_gallery_list.xml +++ b/app/src/main/res/layout/item_gallery_list.xml @@ -17,7 +17,7 @@ @@ -25,7 +25,7 @@ android:id="@+id/thumb" android:layout_width="@dimen/list_thumb_width" android:layout_height="@dimen/list_thumb_height" - app:retryType="click"/> + app:retryType="none"/> EH + 列表模式 + 详情 + 缩略图 显示日文标题 尝试显示日文标题。这会使获取画廊列表花费更多时间 显示默认标题。一般是英文标题 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b9471535a..1f601f11b 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -281,6 +281,9 @@ EH + 列表模式 + 詳情 + 縮略圖 顯示日文標題 嘗試顯示日文標題。這會使獲取畫廊列表花費更多時間 顯示默認標題。一般是英文標題 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f4985ecf6..7f658b696 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -281,6 +281,9 @@ EH + 列表模式 + 詳情 + 縮圖 顯示日文標題 嘗試顯示日文標題。這會使獲取畫廊列表花費更多時間 顯示預設標題。一般是英文標題 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9338180ce..982c8efc1 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -17,6 +17,16 @@ + + @string/settings_eh_list_mode_detail + @string/settings_eh_list_mode_thumb + + + + 0 + 1 + + @string/star_2 @string/star_3 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3f3ea3f67..e2dd4b0c0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -52,6 +52,7 @@ #fff9a825 #ffff7043 #ff9e9e9e + #ffe0e0e0 #ffeeeeee #ff795548 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index dc63b1673..b2b88fc05 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -42,8 +42,12 @@ 2dp 4dp 4dp + 4dp 4dp + 320dp + 120dp + 24dp 18dp diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml index 588f17ef0..36cd98b61 100644 --- a/app/src/main/res/values/drawables.xml +++ b/app/src/main/res/values/drawables.xml @@ -18,5 +18,6 @@ @color/grey_200 @android:color/transparent + #7f9c27b0 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b6c15592..2d4fde57d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -320,6 +320,9 @@ Image saved to %s EH + List mode + Detail + Thumb Show Japanese title Try to show Japanese title. It takes more time to get gallery list Show default title. It is usually English title diff --git a/app/src/main/res/xml/eh_settings.xml b/app/src/main/res/xml/eh_settings.xml index dcf1b16a6..7574bcc6a 100644 --- a/app/src/main/res/xml/eh_settings.xml +++ b/app/src/main/res/xml/eh_settings.xml @@ -19,6 +19,14 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + +