From 008c662209f422d8df0af0b30729e54d64c5c4b1 Mon Sep 17 00:00:00 2001 From: seven332 Date: Sun, 6 Mar 2016 14:33:47 +0800 Subject: [PATCH] Show download state in GalleryDetailScene --- .../ehviewer/download/DownloadManager.java | 127 +++++++++++------- .../ehviewer/ui/scene/DownloadScene.java | 4 +- .../ehviewer/ui/scene/GalleryDetailScene.java | 100 +++++++++++++- .../main/res/layout/gallery_detail_header.xml | 3 +- app/src/main/res/values/strings.xml | 2 + .../ehviewer/daogenerator/EhDaoGenerator.java | 1 + 6 files changed, 182 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java index 6009bf0e3..1df69f756 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java @@ -35,6 +35,7 @@ import com.hippo.yorozuya.SimpleHandler; import com.hippo.yorozuya.sparse.SparseIJArray; import com.hippo.yorozuya.sparse.SparseJLArray; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -68,8 +69,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { @Nullable private DownloadListener mDownloadListener; - @Nullable - private DownloadInfoListener mDownloadInfoListener; + @NonNull + private final List mDownloadInfoListeners; @Nullable private DownloadInfo mCurrentTask; @@ -116,10 +117,9 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { list.add(info); } - // Create wait list mWaitList = new LinkedList<>(); - mSpeedReminder = new SpeedReminder(); + mDownloadInfoListeners = new ArrayList<>(); } @Nullable @@ -164,8 +164,21 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { return mMap.get(label); } - public void setDownloadInfoListener(@Nullable DownloadInfoListener downloadInfoListener) { - mDownloadInfoListener = downloadInfoListener; + public int getDownloadState(long gid) { + DownloadInfo info = mAllInfoMap.get(gid); + if (null != info) { + return info.state; + } else { + return DownloadInfo.STATE_INVALID; + } + } + + public void addDownloadInfoListener(@Nullable DownloadInfoListener downloadInfoListener) { + mDownloadInfoListeners.add(downloadInfoListener); + } + + public void removeDownloadInfoListener(@Nullable DownloadInfoListener downloadInfoListener) { + mDownloadInfoListeners.remove(downloadInfoListener); } public void setDownloadListener(@Nullable DownloadListener listener) { @@ -202,8 +215,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { } // Notify state update List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } } } @@ -226,8 +241,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { EhDB.putDownloadInfo(info); // Notify state update List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } // Make sure download is running ensureDownload(); @@ -257,8 +274,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { EhDB.putDownloadInfo(info); // Notify - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onAdd(info, list, list.size() - 1); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onAdd(info, list, list.size() - 1); } // Make sure download is running ensureDownload(); @@ -291,8 +308,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { if (update) { // Notify Listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdateAll(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdateAll(); } // Ensure download ensureDownload(); @@ -320,8 +337,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { if (update) { // Notify Listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdateAll(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdateAll(); } // Ensure download ensureDownload(); @@ -333,8 +350,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { if (info != null) { // Update listener List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } // Ensure download ensureDownload(); @@ -346,8 +365,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { if (info != null) { // Update listener List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } // Ensure download ensureDownload(); @@ -358,8 +379,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { stopRangeDownloadInternal(gidList); // Update listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdateAll(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdateAll(); } // Ensure download @@ -379,8 +400,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { stopCurrentDownloadInternal(); // Notify mDownloadInfoListener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdateAll(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdateAll(); } } @@ -401,8 +422,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { if (index >= 0) { list.remove(info); // Update listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onRemove(info, list, index); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onRemove(info, list, index); } } } @@ -437,8 +458,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { } // Update listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onReload(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onReload(); } } @@ -566,8 +587,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { changed = true; } - if (changed && mDownloadInfoListener != null) { - mDownloadInfoListener.onReload(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onReload(); } } @@ -579,8 +600,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { mLabelList.add(EhDB.addDownloadLabel(label)); mMap.put(label, new LinkedList()); - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdateLabels(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdateLabels(); } } @@ -589,8 +610,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { mLabelList.add(toPosition, item); EhDB.moveDownloadLabel(fromPosition, toPosition); - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdateLabels(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdateLabels(); } } @@ -625,8 +646,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { mMap.put(to, list); // Notify listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onRenameLabel(from, to); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onRenameLabel(from, to); } } @@ -663,8 +684,8 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { Collections.sort(mDefaultInfoList, sDateAscComparator); // Notify listener - if (mDownloadInfoListener != null) { - mDownloadInfoListener.onChange(); + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onChange(); } } @@ -814,8 +835,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { } else { info.total = mPages; List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } } break; @@ -843,8 +866,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { mDownloadListener.onGetPage(info); } List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } } break; @@ -859,8 +884,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { info.downloaded = mDownloaded; info.total = mTotal; List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } } break; @@ -901,8 +928,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { mDownloadListener.onFinish(info); } List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } // Start next download ensureDownload(); @@ -995,8 +1024,10 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { mDownloadListener.onDownload(info); } List list = getInfoListForLabel(info.label); - if (list != null && mDownloadInfoListener != null) { - mDownloadInfoListener.onUpdate(info, list); + if (list != null) { + for (DownloadInfoListener l: mDownloadInfoListeners) { + l.onUpdate(info, list); + } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java index f7f9dba46..8dc292062 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadScene.java @@ -120,7 +120,7 @@ public class DownloadScene extends ToolbarScene super.onCreate(savedInstanceState); DownloadManager manager = EhApplication.getDownloadManager(getContext()); - manager.setDownloadInfoListener(this); + manager.addDownloadInfoListener(this); if (savedInstanceState == null) { onInit(); @@ -134,7 +134,7 @@ public class DownloadScene extends ToolbarScene super.onDestroy(); mList = null; DownloadManager manager = EhApplication.getDownloadManager(getContext()); - manager.setDownloadInfoListener(null); + manager.removeDownloadInfoListener(null); } private void updateForLabel() { 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 96f4701e9..a17bf586b 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 @@ -31,6 +31,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.support.annotation.IntDef; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; @@ -71,9 +72,11 @@ import com.hippo.ehviewer.client.data.GalleryTagGroup; import com.hippo.ehviewer.client.data.LargePreviewSet; import com.hippo.ehviewer.client.data.ListUrlBuilder; import com.hippo.ehviewer.client.parser.RateGalleryParser; +import com.hippo.ehviewer.dao.DownloadInfo; import com.hippo.ehviewer.ui.CommonOperations; import com.hippo.ehviewer.ui.GalleryActivity; import com.hippo.ehviewer.ui.annotation.ViewLifeCircle; +import com.hippo.ehviewer.ui.annotation.WholeLifeCircle; import com.hippo.rippleold.RippleSalon; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; @@ -97,9 +100,11 @@ import com.hippo.yorozuya.ViewUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; import java.util.Locale; -public class GalleryDetailScene extends BaseScene implements View.OnClickListener { +public class GalleryDetailScene extends BaseScene implements View.OnClickListener, + com.hippo.ehviewer.download.DownloadManager.DownloadInfoListener { @IntDef({STATE_INIT, STATE_NORMAL, STATE_REFRESH, STATE_REFRESH_HEADER, STATE_FAILED}) @Retention(RetentionPolicy.SOURCE) @@ -124,6 +129,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private static final String KEY_GALLERY_DETAIL = "gallery_detail"; private static final String KEY_REQUEST_ID = "request_id"; + private static final String KEY_DOWNLOAD_STATE = "download_state"; @Nullable @ViewLifeCircle @@ -162,7 +168,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private ViewGroup mActionGroup; @Nullable @ViewLifeCircle - private View mDownload; + private TextView mDownload; @Nullable @ViewLifeCircle private View mRead; @@ -250,6 +256,9 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene @ViewLifeCircle private PopupMenu mPopupMenu; + @WholeLifeCircle + private int mDownloadState; + @Nullable private String mAction; @Nullable @@ -361,6 +370,12 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private void onInit() { handleArgs(getArguments()); + long gid = getGid(); + if (gid != -1) { + mDownloadState = EhApplication.getDownloadManager(getContext()).getDownloadState(gid); + } else { + mDownloadState = DownloadInfo.STATE_INVALID; + } } private void onRestore(Bundle savedInstanceState) { @@ -370,6 +385,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene mToken = savedInstanceState.getString(KEY_TOKEN); mGalleryDetail = savedInstanceState.getParcelable(KEY_GALLERY_DETAIL); mRequestId = savedInstanceState.getInt(KEY_REQUEST_ID); + mDownloadState = savedInstanceState.getInt(KEY_DOWNLOAD_STATE); } @Override @@ -390,6 +406,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene outState.putParcelable(KEY_GALLERY_DETAIL, mGalleryDetail); } outState.putInt(KEY_REQUEST_ID, mRequestId); + outState.putInt(KEY_DOWNLOAD_STATE, mDownloadState); } @Nullable @@ -414,7 +431,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene mCategory = (TextView) ViewUtils.$$(mHeader, R.id.category); mOtherActions = (ImageView) ViewUtils.$$(mHeader, R.id.other_actions); mActionGroup = (ViewGroup) ViewUtils.$$(mHeader, R.id.action_card); - mDownload = ViewUtils.$$(mActionGroup, R.id.download); + mDownload = (TextView) ViewUtils.$$(mActionGroup, R.id.download); mRead = ViewUtils.$$(mActionGroup, R.id.read); RippleSalon.addRipple(mOtherActions, false); RippleSalon.addRipple(mDownload, false); @@ -491,6 +508,8 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene adjustViewVisibility(STATE_FAILED, false); } + EhApplication.getDownloadManager(getContext()).addDownloadInfoListener(this); + return view; } @@ -509,6 +528,8 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene public void onDestroyView() { super.onDestroyView(); + EhApplication.getDownloadManager(getContext()).removeDownloadInfoListener(this); + mFailedView = null; mFailedText = null; mViewTransition = null; @@ -703,6 +724,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene mUploader.setText(gi.uploader); mCategory.setText(EhUtils.getCategory(gi.category)); mCategory.setTextColor(EhUtils.getCategoryColor(gi.category)); + updateDownloadText(); } } @@ -742,6 +764,7 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene mUploader.setText(gd.uploader); mCategory.setText(EhUtils.getCategory(gd.category)); mCategory.setTextColor(EhUtils.getCategoryColor(gd.category)); + updateDownloadText(); mLanguage.setText(gd.language); mPages.setText(resources.getQuantityString( @@ -1136,6 +1159,77 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene } } + private void updateDownloadText() { + if (null == mDownload) { + return; + } + switch (mDownloadState) { + default: + case DownloadInfo.STATE_INVALID: + case DownloadInfo.STATE_NONE: + mDownload.setText(R.string.download); + break; + case DownloadInfo.STATE_WAIT: + case DownloadInfo.STATE_DOWNLOAD: + mDownload.setText(R.string.download_state_downloading); + break; + case DownloadInfo.STATE_FINISH: + case DownloadInfo.STATE_FAILED: + mDownload.setText(R.string.download_state_downloaded); + break; + } + } + + private void updateDownloadState() { + long gid = getGid(); + if (-1L == gid) { + return; + } + + int downloadState = EhApplication.getDownloadManager(getContext()).getDownloadState(gid); + if (downloadState == mDownloadState) { + return; + } + mDownloadState = downloadState; + updateDownloadText(); + } + + @Override + public void onAdd(@NonNull DownloadInfo info, @NonNull List list, int position) { + updateDownloadState(); + } + + @Override + public void onUpdate(@NonNull DownloadInfo info, @NonNull List list) { + updateDownloadState(); + } + + @Override + public void onUpdateAll() { + updateDownloadState(); + } + + @Override + public void onReload() { + updateDownloadState(); + } + + @Override + public void onChange() { + updateDownloadState(); + } + + @Override + public void onRemove(@NonNull DownloadInfo info, @NonNull List list, int position) { + updateDownloadState(); + } + + @Override + public void onRenameLabel(String from, String to) {} + + @Override + public void onUpdateLabels() {} + private static class ExitTransaction implements TransitionHelper { private final View mThumb; diff --git a/app/src/main/res/layout/gallery_detail_header.xml b/app/src/main/res/layout/gallery_detail_header.xml index 73034d7c1..63ff57255 100644 --- a/app/src/main/res/layout/gallery_detail_header.xml +++ b/app/src/main/res/layout/gallery_detail_header.xml @@ -135,8 +135,7 @@ style="@style/ButtonInCard" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="1" - android:text="@string/download"/> + android:layout_weight="1"/> No download items Idle Waiting + Downloading + Downloaded Failed %d incomplete Done diff --git a/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java b/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java index 21af0b3ee..050559387 100644 --- a/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java +++ b/daogenerator/src/main/java/com/hippo/ehviewer/daogenerator/EhDaoGenerator.java @@ -228,6 +228,7 @@ public class EhDaoGenerator { "\t};"); javaClass.addImport("android.os.Parcel"); // Add download info stuff + javaClass.addField("public static final int STATE_INVALID = -1"); javaClass.addField("public static final int STATE_NONE = 0"); javaClass.addField("public static final int STATE_WAIT = 1"); javaClass.addField("public static final int STATE_DOWNLOAD = 2");