From fd9f1bd21928a68d8c37e78ef9bfb708d9259e02 Mon Sep 17 00:00:00 2001 From: seven332 Date: Thu, 21 Mar 2019 23:17:09 +0800 Subject: [PATCH] Add FavouriteStatusRouter to forward the favourite status --- .../com/hippo/ehviewer/EhApplication.java | 21 +++++++++ .../hippo/ehviewer/FavouriteStatusRouter.java | 43 +++++++++++++++++++ .../hippo/ehviewer/ui/CommonOperations.java | 29 ++++++------- .../ehviewer/ui/scene/GalleryListScene.java | 6 +++ 4 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.java diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.java b/app/src/main/java/com/hippo/ehviewer/EhApplication.java index d871c583b..af54f6f84 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.java +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.java @@ -92,6 +92,7 @@ public class EhApplication extends RecordingApplication { private SimpleDiskCache mSpiderInfoCache; private DownloadManager mDownloadManager; private Hosts mHosts; + private FavouriteStatusRouter mFavouriteStatusRouter; private final List mActivityList = new ArrayList<>(); @@ -342,6 +343,12 @@ public class EhApplication extends RecordingApplication { if (application.mGalleryDetailCache == null) { // Max size 25, 3 min timeout application.mGalleryDetailCache = new LruCache<>(25); + application.mFavouriteStatusRouter.addListener((gid, slot) -> { + GalleryDetail gd = application.mGalleryDetailCache.get(gid); + if (gd != null) { + gd.favoriteSlot = slot; + } + }); } return application.mGalleryDetailCache; } @@ -379,6 +386,20 @@ public class EhApplication extends RecordingApplication { return application.mHosts; } + @NonNull + public static FavouriteStatusRouter getFavouriteStatusRouter() { + return getFavouriteStatusRouter(getInstance()); + } + + @NonNull + public static FavouriteStatusRouter getFavouriteStatusRouter(@NonNull Context context) { + EhApplication application = ((EhApplication) context.getApplicationContext()); + if (application.mFavouriteStatusRouter == null) { + application.mFavouriteStatusRouter = new FavouriteStatusRouter(); + } + return application.mFavouriteStatusRouter; + } + @NonNull public static String getDeveloperEmail() { return "ehviewersu$gmail.com".replace('$', '@'); diff --git a/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.java b/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.java new file mode 100644 index 000000000..fa543bb96 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/FavouriteStatusRouter.java @@ -0,0 +1,43 @@ +/* + * Copyright 2019 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 java.util.ArrayList; +import java.util.List; + +public class FavouriteStatusRouter { + + private List listeners = new ArrayList<>(); + + public void modifyFavourites(long gid, int slot) { + for (Listener listener : listeners) { + listener.onModifyFavourites(gid, slot); + } + } + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + public interface Listener { + void onModifyFavourites(long gid, int slot); + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java index c72628286..25d84296c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java @@ -33,7 +33,6 @@ import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.UrlOpener; import com.hippo.ehviewer.client.EhClient; import com.hippo.ehviewer.client.EhRequest; -import com.hippo.ehviewer.client.data.GalleryDetail; import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.dao.DownloadLabel; import com.hippo.ehviewer.download.DownloadManager; @@ -219,17 +218,13 @@ public final class CommonOperations { System.arraycopy(favCat, 0, items, 1, 10); if (slot >= -1 && slot <= 9) { String newFavoriteName = slot >= 0 ? items[slot + 1] : null; - doAddToFavorites(activity, galleryInfo, slot, galleryInfo instanceof GalleryDetail - ? new UpdateFavoriteNameCallback(listener, (GalleryDetail) galleryInfo, newFavoriteName) - : listener); + doAddToFavorites(activity, galleryInfo, slot, new DelegateFavoriteCallback(listener, galleryInfo, newFavoriteName, slot)); } else { new ListCheckBoxDialogBuilder(activity, items, (builder, dialog, position) -> { int slot1 = position - 1; String newFavoriteName = (slot1 >= 0 && slot1 <= 9) ? items[slot1+1] : null; - doAddToFavorites(activity, galleryInfo, slot1, galleryInfo instanceof GalleryDetail - ? new UpdateFavoriteNameCallback(listener, (GalleryDetail) galleryInfo, newFavoriteName) - : listener); + doAddToFavorites(activity, galleryInfo, slot1, new DelegateFavoriteCallback(listener, galleryInfo, newFavoriteName, slot1)); if (builder.isChecked()) { Settings.putDefaultFavSlot(slot1); } else { @@ -248,29 +243,31 @@ public final class CommonOperations { EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_ADD_FAVORITES); request.setArgs(galleryInfo.gid, galleryInfo.token, -1, ""); - request.setCallback(galleryInfo instanceof GalleryDetail - ? new UpdateFavoriteNameCallback(listener, (GalleryDetail) galleryInfo, null) - : listener); + request.setCallback(new DelegateFavoriteCallback(listener, galleryInfo, null, -2)); client.execute(request); } - private static class UpdateFavoriteNameCallback implements EhClient.Callback { + private static class DelegateFavoriteCallback implements EhClient.Callback { private final EhClient.Callback delegate; - private final GalleryDetail detail; + private final GalleryInfo info; private final String newFavoriteName; + private final int slot; - UpdateFavoriteNameCallback(EhClient.Callback delegate, GalleryDetail detail, - String newFavoriteName) { + DelegateFavoriteCallback(EhClient.Callback delegate, GalleryInfo info, + String newFavoriteName, int slot) { this.delegate = delegate; - this.detail = detail; + this.info = info; this.newFavoriteName = newFavoriteName; + this.slot = slot; } @Override public void onSuccess(Void result) { - detail.favoriteName = newFavoriteName; + info.favoriteName = newFavoriteName; + info.favoriteSlot = slot; delegate.onSuccess(result); + EhApplication.getFavouriteStatusRouter().modifyFavourites(info.gid, slot); } @Override 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 27f7417d9..d51d42b7b 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 @@ -309,6 +309,12 @@ public final class GalleryListScene extends BaseScene public void onUpdateLabels() { } }); + EhApplication.getFavouriteStatusRouter(context).addListener((gid, slot) -> { + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + }); + if (savedInstanceState == null) { onInit(); } else {