diff --git a/app/src/main/java/com/hippo/ehviewer/AppContext.java b/app/src/main/java/com/hippo/ehviewer/AppContext.java index c26836d9c..113b4be0d 100644 --- a/app/src/main/java/com/hippo/ehviewer/AppContext.java +++ b/app/src/main/java/com/hippo/ehviewer/AppContext.java @@ -32,7 +32,7 @@ import com.hippo.ehviewer.cache.ImageCache; import com.hippo.ehviewer.util.Config; import com.hippo.ehviewer.util.Crash; import com.hippo.ehviewer.util.EhUtils; -import com.hippo.ehviewer.util.Favorite; +import com.hippo.ehviewer.miscellaneous.FavoriteHelper; import com.hippo.ehviewer.util.Log; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.Utils; @@ -72,7 +72,7 @@ public class AppContext extends Application implements UncaughtExceptionHandler Log.init(mContextThemeWrapper); Crash.init(mContextThemeWrapper); EhClient.createInstance(mContextThemeWrapper); - Favorite.init(mContextThemeWrapper); + FavoriteHelper.init(mContextThemeWrapper); Data.createInstance(mContextThemeWrapper); ExDownloaderManager.createInstance(mContextThemeWrapper); MaterialToast.setContext(mContextThemeWrapper); diff --git a/app/src/main/java/com/hippo/ehviewer/util/Favorite.java b/app/src/main/java/com/hippo/ehviewer/miscellaneous/FavoriteHelper.java similarity index 74% rename from app/src/main/java/com/hippo/ehviewer/util/Favorite.java rename to app/src/main/java/com/hippo/ehviewer/miscellaneous/FavoriteHelper.java index a75afa76f..dec18b535 100644 --- a/app/src/main/java/com/hippo/ehviewer/util/Favorite.java +++ b/app/src/main/java/com/hippo/ehviewer/miscellaneous/FavoriteHelper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.hippo.ehviewer.util; +package com.hippo.ehviewer.miscellaneous; import android.annotation.SuppressLint; import android.app.AlertDialog; @@ -31,9 +31,11 @@ import com.hippo.ehviewer.app.MaterialAlertDialog; import com.hippo.ehviewer.data.Data; import com.hippo.ehviewer.data.GalleryInfo; import com.hippo.ehviewer.ehclient.EhClient; +import com.hippo.ehviewer.util.Config; +import com.hippo.ehviewer.util.ViewUtils; import com.hippo.ehviewer.widget.MaterialToast; -public class Favorite { +public class FavoriteHelper { private static Context mContext; private static Resources mResources; @@ -53,15 +55,19 @@ public class Favorite { } } - public static void addToFavorite(final Context context, GalleryInfo gi) { - int defaultFavorite = Config.getDefaultFavorite(); + public static void addToFavorite(final Context context, final GalleryInfo gi, + final OnAddToFavoriteListener listener) { + final int defaultFavorite = Config.getDefaultFavorite(); switch (defaultFavorite) { case -2: - Favorite.getAddToFavoriteDialog(context, gi).show(); + FavoriteHelper.getAddToFavoriteDialog(context, gi, listener).show(); break; case -1: Data.getInstance().addLocalFavourite(gi); MaterialToast.showToast(R.string.toast_add_favourite); + if (listener != null) { + listener.onSuccess(gi, -1); + } break; default: EhClient.getInstance().addToFavorite(gi.gid, @@ -69,19 +75,24 @@ public class Favorite { @Override public void onSuccess() { MaterialToast.showToast(R.string.toast_add_favourite); + if (listener != null) { + listener.onSuccess(gi, defaultFavorite); + } } @Override public void onFailure(String eMsg) { MaterialToast.showToast(R.string.failed_to_add); + if (listener != null) { + listener.onFailure(eMsg, gi, defaultFavorite); + } } }); } } @SuppressLint("InflateParams") - public static AlertDialog getAddToFavoriteDialog(final Context context, final GalleryInfo gi) { - - // TODO List do not work final + public static AlertDialog getAddToFavoriteDialog(final Context context, final GalleryInfo gi, + final OnAddToFavoriteListener listener) { View view = ViewUtils.inflateDialogView(R.layout.add_to_favorite, false); final CheckBox cb = (CheckBox) view.findViewById(R.id.set_default); @@ -97,10 +108,14 @@ public class Favorite { if (cb.isChecked()) Config.setDefaultFavorite(position - 1); + final int favoriteSlot = position - 1; switch (position) { case 0: Data.getInstance().addLocalFavourite(gi); + if (listener != null) { + listener.onSuccess(gi, favoriteSlot); + } MaterialToast.showToast(R.string.toast_add_favourite); break; default: @@ -109,10 +124,16 @@ public class Favorite { @Override public void onSuccess() { MaterialToast.showToast(R.string.toast_add_favourite); + if (listener != null) { + listener.onSuccess(gi, favoriteSlot); + } } @Override public void onFailure(String eMsg) { MaterialToast.showToast(R.string.failed_to_add); + if (listener != null) { + listener.onFailure(eMsg, gi, favoriteSlot); + } } }); } @@ -124,4 +145,9 @@ public class Favorite { .setView(view, false).setNegativeButton(android.R.string.cancel) .setPositiveButton(android.R.string.ok).create(); } + + public interface OnAddToFavoriteListener { + void onSuccess(GalleryInfo gi, int slot); + void onFailure(String eMsg, GalleryInfo gi, int slot); + } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/FavouriteActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/FavouriteActivity.java index e3a3b71ca..58511d6da 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/FavouriteActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/FavouriteActivity.java @@ -59,7 +59,7 @@ import com.hippo.ehviewer.drawable.MaterialIndicatorDrawable; import com.hippo.ehviewer.drawable.MaterialIndicatorDrawable.Stroke; import com.hippo.ehviewer.ehclient.EhClient; import com.hippo.ehviewer.util.Config; -import com.hippo.ehviewer.util.Favorite; +import com.hippo.ehviewer.miscellaneous.FavoriteHelper; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.widget.ActionableToastBar; import com.hippo.ehviewer.widget.ActionableToastBar.ActionClickedListener; @@ -127,14 +127,14 @@ public class FavouriteActivity extends AbsTranslucentActivity private void initLocalFavorite() { mGalleryListView.setEnabledHeader(false); mGalleryListView.setEnabledFooter(false); - setTitle(Favorite.FAVORITE_TITLES[mMenuIndex]); + setTitle(FavoriteHelper.FAVORITE_TITLES[mMenuIndex]); mGalleryListView.refresh(); } private void initFavorite() { mGalleryListView.setEnabledHeader(true); mGalleryListView.setEnabledFooter(true); - setTitle(Favorite.FAVORITE_TITLES[mMenuIndex]); + setTitle(FavoriteHelper.FAVORITE_TITLES[mMenuIndex]); mGalleryListView.refresh(); } @@ -211,7 +211,7 @@ public class FavouriteActivity extends AbsTranslucentActivity if (convertView == null) convertView = LayoutInflater.from(FavouriteActivity.this).inflate(R.layout.menu_item, parent, false); TextView tv = (TextView)convertView; - tv.setText(Favorite.FAVORITE_TITLES[position]); + tv.setText(FavoriteHelper.FAVORITE_TITLES[position]); if (position == 0) { Drawable dr = mResources.getDrawable(R.drawable.ic_setting_panda_light); dr.setBounds(0, 0, Ui.dp2pix(36), Ui.dp2pix(36)); @@ -236,7 +236,7 @@ public class FavouriteActivity extends AbsTranslucentActivity return; mMenuIndex = position; - setTitle(Favorite.FAVORITE_TITLES[mMenuIndex]); + setTitle(FavoriteHelper.FAVORITE_TITLES[mMenuIndex]); if (mMenuIndex == 0) initLocalFavorite(); else @@ -417,7 +417,7 @@ public class FavouriteActivity extends AbsTranslucentActivity private AlertDialog createMoveDialog(final ActionMode mode) { return new MaterialAlertDialog.Builder(this).setTitle(R.string.where_to_move) - .setItems(Favorite.FAVORITE_TITLES, new MaterialAlertDialog.OnClickListener() { + .setItems(FavoriteHelper.FAVORITE_TITLES, new MaterialAlertDialog.OnClickListener() { @Override public boolean onClick(MaterialAlertDialog dialog, int position) { if (mMenuIndex == position) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryDetailActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/GalleryDetailActivity.java index 1cf2cd24e..e7b8aac22 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryDetailActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryDetailActivity.java @@ -86,12 +86,11 @@ import com.hippo.ehviewer.ehclient.DetailUrlParser; import com.hippo.ehviewer.ehclient.EhClient; import com.hippo.ehviewer.miscellaneous.ActivityHelper; import com.hippo.ehviewer.miscellaneous.Downloader; +import com.hippo.ehviewer.miscellaneous.FavoriteHelper; import com.hippo.ehviewer.service.DownloadService; import com.hippo.ehviewer.util.AppConfig; import com.hippo.ehviewer.util.Config; import com.hippo.ehviewer.util.Constants; -import com.hippo.ehviewer.util.Favorite; -import com.hippo.ehviewer.util.Log; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.ViewUtils; import com.hippo.ehviewer.widget.AutoWrapLayout; @@ -123,17 +122,22 @@ public class GalleryDetailActivity extends AbsTranslucentActivity ProgressiveRatingBar.OnUserRateListener, PreviewList.PreviewHolder, View.OnLayoutChangeListener, EasyRecyclerView.OnItemClickListener, EasyRecyclerView.OnItemLongClickListener, RefreshTextView.OnRefreshListener, - FitWindowView.OnFitSystemWindowsListener { + FitWindowView.OnFitSystemWindowsListener, FavoriteHelper.OnAddToFavoriteListener { @SuppressWarnings("unused") private static final String TAG = GalleryDetailActivity.class.getSimpleName(); public static final String KEY_G_INFO = "gallery_info"; + private static final int FAVORITE_NONE = 0x0; + private static final int FAVORITE_LOCAL = 0x1; + private static final int FAVORITE_ACCOUNT = 0x2; + private AppContext mAppContext; private Resources mResources; private EhClient mClient; private WindowsAnimate mWindowsAnimate; + private Data mData; private GalleryInfo mGalleryInfo; private int mRunningAnimateNum = 0; @@ -187,6 +191,8 @@ public class GalleryDetailActivity extends AbsTranslucentActivity private FloatingActionButton mReply; private OvalDrawable mCategoryDrawable; + private Drawable mFavoriteDrawable; + private Drawable mFavoriteOutlineDrawable; private Drawable mRateDrawable; private Drawable mCheckmarkDrawable; @@ -201,6 +207,9 @@ public class GalleryDetailActivity extends AbsTranslucentActivity private String mOldReply; private boolean mReplyPositive; + private int mFavoriteState = FAVORITE_NONE; + private boolean mIsDoingFavorite = false; + private AlertDialog createGoToDialog() { CharSequence[] items = new CharSequence[((PreviewImpl)mGalleryInfo).getPreviewPageNum()]; for (int i = 0; i < items.length; i++) @@ -307,6 +316,7 @@ public class GalleryDetailActivity extends AbsTranslucentActivity mClient = EhClient.getInstance(); mWindowsAnimate = new WindowsAnimate(); mWindowsAnimate.init(this); + mData = Data.getInstance(); mResources = getResources(); @@ -377,9 +387,10 @@ public class GalleryDetailActivity extends AbsTranslucentActivity Drawable similarDrawable = mResources.getDrawable(R.drawable.ic_similar); similarDrawable.setBounds(rect); mSimilar.setCompoundDrawables(null, similarDrawable, null, null); - Drawable favoriteDrawable = mResources.getDrawable(R.drawable.ic_favorite); - favoriteDrawable.setBounds(rect); - mFavorite.setCompoundDrawables(null, favoriteDrawable, null, null); + mFavoriteDrawable = mResources.getDrawable(R.drawable.ic_favorite); + mFavoriteDrawable.setBounds(rect); + mFavoriteOutlineDrawable = mResources.getDrawable(R.drawable.ic_favorite_outline); + mFavoriteOutlineDrawable.setBounds(rect); Drawable shareDrawable = mResources.getDrawable(R.drawable.ic_share); shareDrawable.setBounds(rect); mShare.setCompoundDrawables(null, shareDrawable, null, null); @@ -626,6 +637,16 @@ public class GalleryDetailActivity extends AbsTranslucentActivity } } + private void updateFavoriteButton() { + if (mFavoriteState == FAVORITE_NONE) { + mFavorite.setText(R.string.add_to_favorites); + mFavorite.setCompoundDrawables(null, mFavoriteOutlineDrawable, null, null); + } else { + mFavorite.setText(R.string.remove_from_favorites); + mFavorite.setCompoundDrawables(null, mFavoriteDrawable, null, null); + } + } + /** * GalleryDetail * LofiGalleryDetail @@ -663,21 +684,26 @@ public class GalleryDetailActivity extends AbsTranslucentActivity // Detail mDividerAM.setVisibility(View.VISIBLE); mDetailMore.setVisibility(View.VISIBLE); + + // Favorite + if (mData.containsLocalFavourite(mGalleryInfo.gid)) { + mFavoriteState |= FAVORITE_LOCAL; + } + if (mGalleryInfo instanceof GalleryDetail) { GalleryDetail galleryDetail = (GalleryDetail)mGalleryInfo; - // TODO handle favorite - Log.d("TAG", "favorite " + galleryDetail.isFavorite); + if (galleryDetail.isFavorite) { + mFavoriteState |= FAVORITE_ACCOUNT; + } if (galleryDetail.torrents.length > 0) { mTorrent.setVisibility(View.VISIBLE); } - ((TextView)mDetailMore.findViewById(R.id.language)).setText( - getString(R.string.language) + ": " + galleryDetail.language); - ((TextView)mDetailMore.findViewById(R.id.posted)).setText(galleryDetail.posted); - ((TextView)mDetailMore.findViewById(R.id.pages)).setText( - getString(R.string.pages) + ": " + String.valueOf(galleryDetail.pages)); + ((TextView)mDetailMore.findViewById(R.id.language)).setText(getString(R.string.language) + ": " + galleryDetail.language); + ((TextView) mDetailMore.findViewById(R.id.posted)).setText(galleryDetail.posted); + ((TextView) mDetailMore.findViewById(R.id.pages)).setText(getString(R.string.pages) + ": " + String.valueOf(galleryDetail.pages)); ((TextView)mDetailMore.findViewById(R.id.size)).setText( getString(R.string.size) + ": " + galleryDetail.size); StringBuilder sb = new StringBuilder(); @@ -700,9 +726,10 @@ public class GalleryDetailActivity extends AbsTranslucentActivity ((TextView)mMoreDetailScroll.findViewById(R.id.more_detail)).setText(sb.toString()); } else if (mGalleryInfo instanceof LofiGalleryDetail) { LofiGalleryDetail lofiGalleryDetail = (LofiGalleryDetail)mGalleryInfo; - ((TextView)mDetailMore.findViewById(R.id.language)).setVisibility(View.GONE); - ((TextView)mDetailMore.findViewById(R.id.posted)).setVisibility(View.GONE); - ((TextView)mDetailMore.findViewById(R.id.pages)).setVisibility(View.GONE); + + (mDetailMore.findViewById(R.id.language)).setVisibility(View.GONE); + (mDetailMore.findViewById(R.id.posted)).setVisibility(View.GONE); + (mDetailMore.findViewById(R.id.pages)).setVisibility(View.GONE); ((TextView)mDetailMore.findViewById(R.id.size)).setText(lofiGalleryDetail.posted); StringBuilder sb = new StringBuilder(); sb.append("gid: ").append(lofiGalleryDetail.gid).append("\n\n") @@ -719,6 +746,8 @@ public class GalleryDetailActivity extends AbsTranslucentActivity // TODO } + updateFavoriteButton(); + // Rate mDividerMR.setVisibility(View.VISIBLE); mDetailRate.setVisibility(View.VISIBLE); @@ -906,7 +935,36 @@ public class GalleryDetailActivity extends AbsTranslucentActivity intent.putExtra(GalleryListActivity.KEY_IMAGE_URL, mGalleryInfo.thumb); startActivity(intent); } else if (v == mFavorite) { - Favorite.addToFavorite(this, mGalleryInfo); + if (!mIsDoingFavorite) { + if (mFavoriteState == FAVORITE_NONE) { + mIsDoingFavorite = true; + FavoriteHelper.addToFavorite(this, mGalleryInfo, this); + } else { + if ((mFavoriteState & FAVORITE_LOCAL) != 0) { + mData.deleteLocalFavourite(mGalleryInfo.gid); + mFavoriteState &= ~FAVORITE_LOCAL; + + updateFavoriteButton(); + } + if ((mFavoriteState & FAVORITE_ACCOUNT) != 0) { + mIsDoingFavorite = true; + mClient.addToFavorite(mGalleryInfo.gid, mGalleryInfo.token, -1, null, new EhClient.OnAddToFavoriteListener() { + @Override + public void onSuccess() { + mIsDoingFavorite = false; + mFavoriteState &= ~FAVORITE_ACCOUNT; + updateFavoriteButton(); + } + + @Override + public void onFailure(String eMsg) { + mIsDoingFavorite = false; + updateFavoriteButton(); + } + }); + } + } + } } else if (v == mShare) { ActivityHelper.share(this, EhClient.getDetailUrl(mGalleryInfo.gid, mGalleryInfo.token)); } else if (v == mRate) { @@ -1288,6 +1346,18 @@ public class GalleryDetailActivity extends AbsTranslucentActivity } } + @Override + public void onSuccess(GalleryInfo gi, int slot) { + mIsDoingFavorite = false; + mFavoriteState |= slot == -1 ? FAVORITE_LOCAL : FAVORITE_ACCOUNT; + updateFavoriteButton(); + } + + @Override + public void onFailure(String eMsg, GalleryInfo gi, int slot) { + mIsDoingFavorite = false; + } + private class GDetailGetListener implements EhClient.OnGetGDetailListener { @Override @@ -1418,7 +1488,5 @@ public class GalleryDetailActivity extends AbsTranslucentActivity return 0; } } - } - } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryListActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/GalleryListActivity.java index 8a5e96693..305010221 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryListActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryListActivity.java @@ -73,7 +73,7 @@ import com.hippo.ehviewer.network.HttpHelper; import com.hippo.ehviewer.service.DownloadService; import com.hippo.ehviewer.util.Config; import com.hippo.ehviewer.util.DialogUtils; -import com.hippo.ehviewer.util.Favorite; +import com.hippo.ehviewer.miscellaneous.FavoriteHelper; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.Utils; import com.hippo.ehviewer.util.ViewUtils; @@ -551,7 +551,7 @@ public class GalleryListActivity extends AbsTranslucentActivity implements View. final GalleryInfo gi = mGalleryListView.getGalleryInfo(longClickItemIndex); switch (position) { case 0: // Add favourite item - Favorite.addToFavorite(GalleryListActivity.this, gi); + FavoriteHelper.addToFavorite(GalleryListActivity.this, gi, null); break; case 1: Intent it = new Intent(GalleryListActivity.this, DownloadService.class); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java index 6f465d1b5..c1c35140b 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java @@ -65,7 +65,7 @@ import com.hippo.ehviewer.util.BgThread; import com.hippo.ehviewer.util.Config; import com.hippo.ehviewer.util.DialogUtils; import com.hippo.ehviewer.util.EhUtils; -import com.hippo.ehviewer.util.Favorite; +import com.hippo.ehviewer.miscellaneous.FavoriteHelper; import com.hippo.ehviewer.util.Secret; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.Utils; @@ -234,9 +234,9 @@ public class SettingsActivity extends AbsPreferenceActivity { mHAHProxyConfig.setOnPreferenceClickListener(this); int i = 0; - String[] entrise = new String[Favorite.FAVORITE_TITLES.length + 1]; + String[] entrise = new String[FavoriteHelper.FAVORITE_TITLES.length + 1]; entrise[i++] = getString(R.string.none); - for (String str : Favorite.FAVORITE_TITLES) + for (String str : FavoriteHelper.FAVORITE_TITLES) entrise[i++] = str; mDefaultFavorite.setEntries(entrise); } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 310e5ed36..5f021851d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -94,6 +94,8 @@ 开始保存种子 保存种子至 %s 保存种子失败 + 添加至收藏 + 从收藏中移除 点击重试 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 41f49f431..ce813b1ea 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -82,6 +82,8 @@ 開始保存種子 保存種子至 %s 保存種子失敗 + 添加至收藏 + 從收藏中移除 點擊重試 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 3e7c3b317..d5192c68d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -82,6 +82,8 @@ 開始儲存種子 儲存種子至 %s 儲存種子失敗 + 新增至收藏 + 從收藏中移除 點選重試 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48a8af805..921a3932b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,6 +98,8 @@ Start saving torrent Save torrent to %s Failed to save torrent + Add to favorites + Remove from Favorites Click to retry