Add grid gallery list

This commit is contained in:
seven332 committed 2016-03-14 18:36:13 +08:00
1 parent 94a838f4b7
commit a81f4b40f1
30 files changed
+814 -482

No files matched your search

@@ -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;
}
}
@@ -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;
}
}
@@ -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(){}
}
@@ -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;
@@ -80,6 +80,7 @@ public class AboutFragment extends PreferenceFragment
if (newValue instanceof Boolean && (Boolean) newValue) {
Analytics.start(getActivity());
}
return true;
}
return true;
}
@@ -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;
}
}
@@ -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<DownloadInfo> 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<DownloadHolder> {
@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));
}
}
@@ -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;
}
}
@@ -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<FavoritesHolder> {
@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;
}
}
@@ -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<GalleryHolder> 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();
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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<String> mKeys;
@Nullable
private ArrayList<String> 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);
@@ -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<GalleryListHolder> {
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<GalleryInfo> {
@@ -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;
}
@@ -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<HistoryHolder> {
@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;
}
}
@@ -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;
}
@@ -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);
}
}