diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c3ad241bc..aedd93cdd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,7 +34,7 @@ android:label="@string/app_name" android:theme="@style/AppTheme.Content" android:windowSoftInputMode="stateAlwaysHidden" - android:launchMode="singleTask"> + android:launchMode="singleTop"> diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java b/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java index 788048311..b36f437ce 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java @@ -78,6 +78,9 @@ public class GallerySpider implements GalleryProvider, SpiderQueen.SpiderListene mMap.put(key, gs); // The spider add to db in the construct of GallerySpider } else { + if (mode == ImageHandler.Mode.DOWNLOAD) { + gs.setMode(ImageHandler.Mode.DOWNLOAD); + } // Touch the date DBUtils.touchDirname(galleryBase.gid); } @@ -101,6 +104,7 @@ public class GallerySpider implements GalleryProvider, SpiderQueen.SpiderListene mGalleryBase = galleryBase; mMode = mode; + // TODO let imagehandler handle download dir mDownloadDirname = DBUtils.getDirname(galleryBase.gid); if (mDownloadDirname == null) { mDownloadDirname = downloadDirname(galleryBase); diff --git a/app/src/main/java/com/hippo/ehviewer/service/DownloadManager.java b/app/src/main/java/com/hippo/ehviewer/service/DownloadManager.java index d1d2c8c91..351fb9c3e 100644 --- a/app/src/main/java/com/hippo/ehviewer/service/DownloadManager.java +++ b/app/src/main/java/com/hippo/ehviewer/service/DownloadManager.java @@ -153,6 +153,15 @@ public class DownloadManager { } } + public boolean isInDownloadList(int gid) { + for (DownloadInfo info : mDownloadInfos) { + if (info.galleryBase.gid == gid) { + return true; + } + } + return false; + } + // Make sure is downloading private void ensureDownload() { if (mCurrentTask != null) { diff --git a/app/src/main/java/com/hippo/ehviewer/service/DownloadService.java b/app/src/main/java/com/hippo/ehviewer/service/DownloadService.java index 79a8b350b..88b8cf9b7 100644 --- a/app/src/main/java/com/hippo/ehviewer/service/DownloadService.java +++ b/app/src/main/java/com/hippo/ehviewer/service/DownloadService.java @@ -27,6 +27,8 @@ import android.support.v4.app.NotificationCompat; import com.hippo.ehviewer.R; import com.hippo.ehviewer.client.data.GalleryBase; +import com.hippo.ehviewer.ui.ContentActivity; +import com.hippo.ehviewer.ui.scene.DownloadScene; import com.hippo.yorozuya.FileUtils; public class DownloadService extends Service implements DownloadManager.DownloadUpdateListener { @@ -37,6 +39,8 @@ public class DownloadService extends Service implements DownloadManager.Download public static final String KEY_TAG = "tag"; public static final String KEY_GID = "gid"; + public static final String KEY_CLEAR = "clear"; + public static final String ACTION_START = "com.hippo.ehviewer.service.DownloadService.START"; public static final String ACTION_START_ALL = "com.hippo.ehviewer.service.DownloadService.START_ALL"; public static final String ACTION_STOP = "com.hippo.ehviewer.service.DownloadService.STOP"; @@ -57,6 +61,11 @@ public class DownloadService extends Service implements DownloadManager.Download private DownloadManager mDownloadManager; + public static void clear() { + sSucceeCount = 0; + sFailedCount = 0; + } + @Override public void onCreate() { super.onCreate(); @@ -119,6 +128,14 @@ public class DownloadService extends Service implements DownloadManager.Download checkStop = true; } else if (ACTION_DELETE.equals(action)) { // TODO + int gid = intent.getIntExtra(KEY_GID, 0); + if (gid != 0) { + mDownloadManager.stopDownload(gid); + } + checkStop = true; + + + } else if (ACTION_CLEAR.equals(action)) { sSucceeCount = 0; sFailedCount = 0; @@ -153,6 +170,13 @@ public class DownloadService extends Service implements DownloadManager.Download stopAllIntent.setAction(ACTION_STOP_ALL); PendingIntent piStopAll = PendingIntent.getService(this, 0, stopAllIntent, 0); mDownloadingBuilder.addAction(R.drawable.ic_close_x24, getString(R.string.stop_all), piStopAll); + + Intent intent = new Intent(DownloadService.this, ContentActivity.class); + intent.setAction(ContentActivity.ACTION_START_SCENE); + intent.putExtra(ContentActivity.KEY_SCENE, DownloadScene.class); + PendingIntent pendingIntent = PendingIntent.getActivity(DownloadService.this, 0, + intent, PendingIntent.FLAG_UPDATE_CURRENT); + mDownloadingBuilder.setContentIntent(pendingIntent); } private void ensureDownloadedNotification() { @@ -166,6 +190,14 @@ public class DownloadService extends Service implements DownloadManager.Download mDownloadedBuilder = new NotificationCompat.Builder(getApplicationContext()); mDownloadedBuilder.setSmallIcon(android.R.drawable.stat_sys_download_done) .setDeleteIntent(piClear).setOngoing(false).setAutoCancel(true); + + Intent intent = new Intent(DownloadService.this, ContentActivity.class); + intent.setAction(ContentActivity.ACTION_START_SCENE); + intent.putExtra(ContentActivity.KEY_SCENE, DownloadScene.class); + intent.putExtra(DownloadService.KEY_CLEAR, true); + PendingIntent pendingIntent = PendingIntent.getActivity(DownloadService.this, 0, + intent, PendingIntent.FLAG_UPDATE_CURRENT); + mDownloadedBuilder.setContentIntent(pendingIntent); } private void setPendingIntent() { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java index 6ee4aeca9..53da83cb7 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java @@ -18,16 +18,19 @@ package com.hippo.ehviewer.ui; import android.annotation.SuppressLint; import android.content.Context; +import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.view.Gravity; import android.view.View; import android.widget.AdapterView; import com.hippo.ehviewer.Constants; import com.hippo.ehviewer.R; +import com.hippo.ehviewer.service.DownloadService; import com.hippo.ehviewer.ui.scene.DownloadScene; import com.hippo.ehviewer.ui.scene.DrawerProvider; import com.hippo.ehviewer.ui.scene.GalleryListScene; @@ -38,7 +41,6 @@ import com.hippo.ehviewer.widget.DrawerLeftPanel; import com.hippo.ehviewer.widget.DrawerRightPanel; import com.hippo.ehviewer.widget.FitStageLayout; import com.hippo.scene.Announcer; -import com.hippo.scene.OffsetCurtain; import com.hippo.scene.Scene; import com.hippo.scene.SceneManager; import com.hippo.scene.StageActivity; @@ -49,10 +51,18 @@ import com.hippo.widget.DrawerLayout; import com.hippo.widget.DrawerListView; import com.hippo.yorozuya.Messenger; +import java.io.Serializable; + public final class ContentActivity extends StageActivity implements FitStageLayout.OnFitPaddingBottomListener, DrawerLeftPanel.Helper { + public static final String TAG = ContentActivity.class.getSimpleName(); + + public static final String ACTION_START_SCENE = "com.hippo.ehviewer.ui.ContentActivity.START_SCENE"; + + public static final String KEY_SCENE = "scene"; + public static final int DRAWER_LIST_NONE = -1; public static final int DRAWER_LIST_HOMEPAGE = 0; public static final int DRAWER_LIST_WHATS_HOT = 1; @@ -78,22 +88,22 @@ public final class ContentActivity extends StageActivity case DRAWER_LIST_HOMEPAGE: announcer = new Announcer(); announcer.putExtra(GalleryListScene.KEY_MODE, GalleryListScene.MODE_HOMEPAGE); - startScene(GalleryListScene.class, announcer, new OffsetCurtain(OffsetCurtain.DIRECTION_BOTTOM)); + startScene(GalleryListScene.class); break; case DRAWER_LIST_WHATS_HOT: announcer = new Announcer(); announcer.putExtra(GalleryListScene.KEY_MODE, GalleryListScene.MODE_POPULAR); - startScene(GalleryListScene.class, announcer, new OffsetCurtain(OffsetCurtain.DIRECTION_BOTTOM)); + startScene(GalleryListScene.class); break; case DRAWER_LIST_HISTORY: break; case DRAWER_LIST_FAVORITE: break; case DRAWER_LIST_DOWNLOAD: - startScene(DownloadScene.class, null, new OffsetCurtain(OffsetCurtain.DIRECTION_BOTTOM)); + startScene(DownloadScene.class); break; case DRAWER_LIST_SETTINGS: - startScene(MainSettingsScene.class, null, new OffsetCurtain(OffsetCurtain.DIRECTION_BOTTOM)); + startScene(MainSettingsScene.class); break; } @@ -166,6 +176,45 @@ public final class ContentActivity extends StageActivity } }; + private void handleIntent(@Nullable Intent intent, boolean fromOnCreate) { + String action; + if (intent == null) { + action = null; + } else { + action = intent.getAction(); + } + + if (ACTION_START_SCENE.equals(action)) { + Serializable serializable = intent.getSerializableExtra(KEY_SCENE); + if (serializable instanceof Class) { + Class sceneClazz = (Class) serializable; + try { + startScene(sceneClazz); + } catch (Exception e) { + e.printStackTrace(); + } + } + boolean clear = intent.getBooleanExtra(DownloadService.KEY_CLEAR, false); + if (clear) { + DownloadService.clear(); + } + } + + if (getSceneCount() == 0) { + if (fromOnCreate) { + startScene(GalleryListScene.class); + } else { + finish(); + } + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + handleIntent(intent, false); + } + @SuppressLint("RtlHardcoded") @SuppressWarnings("deprecation") @Override @@ -218,10 +267,7 @@ public final class ContentActivity extends StageActivity mDrawerListView.setData(drawerListDrawables, drawerListStrings); mDrawerListView.setOnItemClickListener(mDrawerListListener); - // First time - if (savedInstanceState == null) { - startScene(GalleryListScene.class, null); - } + handleIntent(getIntent(), true); } @Override @@ -286,7 +332,7 @@ public final class ContentActivity extends StageActivity @Override public void onClickSignIn() { mDrawerLayout.closeDrawers(); - startScene(SignInScene.class, null, new OffsetCurtain(OffsetCurtain.DIRECTION_BOTTOM)); + startScene(SignInScene.class); } @Override diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java index ea51181d1..d553970ed 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java @@ -51,6 +51,7 @@ import com.hippo.ehviewer.gallery.ui.GalleryLayout; import com.hippo.ehviewer.gallery.ui.GalleryPageView; import com.hippo.ehviewer.gallery.ui.GalleryPanel; import com.hippo.ehviewer.gallery.ui.GalleryView; +import com.hippo.ehviewer.service.DownloadManager; import com.hippo.ehviewer.util.Settings; import com.hippo.util.SystemUiHelper; import com.hippo.vectorold.content.VectorContext; @@ -110,8 +111,9 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre GalleryBase galleryBase = intent.getParcelableExtra(KEY_GALLERY_BASE); if (galleryBase != null) { try { - // TODO get mode - mGalleryProvider = GallerySpider.obtain(galleryBase, ImageHandler.Mode.DOWNLOAD); + mGalleryProvider = GallerySpider.obtain(galleryBase, + DownloadManager.getInstance().isInDownloadList(galleryBase.gid) ? + ImageHandler.Mode.DOWNLOAD : ImageHandler.Mode.READ); return true; } catch (IOException e) { e.printStackTrace(); 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 d6db5891d..16b8f0861 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 @@ -38,6 +38,7 @@ import com.hippo.ehviewer.util.EhUtils; import com.hippo.ehviewer.widget.LoadImageView; import com.hippo.ehviewer.widget.SimpleRatingView; import com.hippo.rippleold.RippleSalon; +import com.hippo.scene.Announcer; import com.hippo.scene.Scene; import com.hippo.widget.recyclerview.EasyRecyclerView; import com.hippo.yorozuya.FileUtils; @@ -56,8 +57,15 @@ public class DownloadScene extends Scene implements DrawerProvider, private GidPositionMap mGidPositionMap; + private int mOriginalPaddingBottom; + private int mLastUpdateSize = -1; + @Override + public int getLaunchMode() { + return LAUNCH_MODE_SINGLE_TOP; + } + @Override protected void onInit() { super.onInit(); @@ -89,6 +97,8 @@ public class DownloadScene extends Scene implements DrawerProvider, mRecyclerView.setLayoutManager(new LinearLayoutManager(getStageActivity())); mRecyclerView.setOnItemClickListener(this); mRecyclerView.setHasFixedSize(true); + + mOriginalPaddingBottom = mRecyclerView.getPaddingBottom(); } @@ -99,6 +109,14 @@ public class DownloadScene extends Scene implements DrawerProvider, ((ContentActivity) getStageActivity()).setDrawerListActivatedPosition(ContentActivity.DRAWER_LIST_DOWNLOAD); } + @Override + protected void onGetFitPaddingBottom(int b) { + super.onGetFitPaddingBottom(b); + + mRecyclerView.setPadding(mRecyclerView.getPaddingLeft(), mRecyclerView.getPaddingTop(), + mRecyclerView.getPaddingRight(), b + mOriginalPaddingBottom); + } + @Override public boolean showLeftDrawer() { return true; @@ -112,7 +130,12 @@ public class DownloadScene extends Scene implements DrawerProvider, @Override public boolean onItemClick(EasyRecyclerView parent, View view, int position, long id) { - return false; + DownloadInfo info = mDownloadInfos.get(position); + Announcer announcer = new Announcer(); + announcer.setAction(GalleryDetailScene.ACTION_GALLERY_BASE); + announcer.putExtra(GalleryDetailScene.KEY_GALLERY_BASE, info.galleryBase); + startScene(GalleryDetailScene.class, announcer); + return true; } private View.OnClickListener mStartListener = new View.OnClickListener() { 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 76cb8e0bc..aaa40d797 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 @@ -79,11 +79,11 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener, private static final String TAG = GalleryDetailScene.class.getSimpleName(); - public static final String ACTION_GALLERY_INFO = "action_gallery_info"; + public static final String ACTION_GALLERY_BASE = "key_gallery_base"; public static final String ACTION_GID_TOKEN = "action_gid_token"; public static final String ACTION_URL = "action_url"; - public static final String KEY_GALLERY_INFO = "key_gallery_info"; + public static final String KEY_GALLERY_BASE = "key_gallery_base"; public static final String KEY_GID = "key_gid"; public static final String KEY_TOKEN = "key_token"; public static final String KEY_URL = "key_url"; @@ -484,8 +484,8 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener, if (announcer != null) { String action = announcer.getAction(); mActionStr = action; - if (ACTION_GALLERY_INFO.equals(action)) { - mGalleryBase = announcer.getExtra(KEY_GALLERY_INFO, GalleryBase.class); + if (ACTION_GALLERY_BASE.equals(action)) { + mGalleryBase = announcer.getExtra(KEY_GALLERY_BASE, GalleryBase.class); if (mGalleryBase != null) { bindGalleryInfo(mGalleryBase); return; @@ -553,7 +553,7 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener, mViewTransition.showView(1); // Show progress view mState = STATE_TOTALLY_LOADING; mAdapter.notifyDataSetChanged(); - if (ACTION_GALLERY_INFO.equals(mActionStr)) { + if (ACTION_GALLERY_BASE.equals(mActionStr)) { requestGalleryDetail(mGalleryBase.gid, mGalleryBase.token); } else { requestGalleryDetail(mGid, mToken); 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 c33472b17..2d30912c3 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 @@ -901,8 +901,8 @@ public final class GalleryListScene extends Scene implements ListSearchBar.Helpe public boolean onItemClick(EasyRecyclerView parent, View view, int position, long id) { GalleryInfo gi = mGalleryListHelper.getDataAt(position); Announcer announcer = new Announcer(); - announcer.setAction(GalleryDetailScene.ACTION_GALLERY_INFO); - announcer.putExtra(GalleryDetailScene.KEY_GALLERY_INFO, gi); + announcer.setAction(GalleryDetailScene.ACTION_GALLERY_BASE); + announcer.putExtra(GalleryDetailScene.KEY_GALLERY_BASE, gi); Curtain curtain = new ElementsSharedCurtain(new TransitonHelper(position)); diff --git a/app/src/main/java/com/hippo/scene/Scene.java b/app/src/main/java/com/hippo/scene/Scene.java index f6d2d0745..4b1af14f8 100644 --- a/app/src/main/java/com/hippo/scene/Scene.java +++ b/app/src/main/java/com/hippo/scene/Scene.java @@ -22,7 +22,6 @@ import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; @@ -30,7 +29,6 @@ import android.view.ViewParent; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; -import com.hippo.ehviewer.client.data.DownloadInfo; import com.hippo.yorozuya.AssertUtils; /** @@ -137,7 +135,7 @@ public abstract class Scene { startScene(sceneClass, announcer, getDefaultCurtain()); } - public Curtain getDefaultCurtain() { + static Curtain getDefaultCurtain() { return new OffsetCurtain(OffsetCurtain.DIRECTION_BOTTOM); } diff --git a/app/src/main/java/com/hippo/scene/SceneManager.java b/app/src/main/java/com/hippo/scene/SceneManager.java index e2dd67a42..67bbbc995 100644 --- a/app/src/main/java/com/hippo/scene/SceneManager.java +++ b/app/src/main/java/com/hippo/scene/SceneManager.java @@ -170,12 +170,12 @@ public class SceneManager { scene.setSceneManager(this); return scene; } catch (InstantiationException e) { - throw new IllegalStateException("Can't instance " + sceneClass.getName()); + throw new IllegalStateException("Can't instance " + sceneClass.getName(), e); } catch (IllegalAccessException e) { throw new IllegalStateException("The constructor of " + - sceneClass.getName() + " is not visible"); + sceneClass.getName() + " is not visible", e); } catch (ClassCastException e) { - throw new IllegalStateException(sceneClass.getName() + " can not cast to scene"); + throw new IllegalStateException(sceneClass.getName() + " can not cast to scene", e); } } diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index 5494fec2a..8d282a161 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -76,6 +76,10 @@ public abstract class StageActivity extends StatsActivity { mSceneManager = null; } + public int getSceneCount() { + return mSceneManager.getSceneCount(); + } + public int getFitPaddingBottom() { return mFitPaddingBottom; } @@ -100,11 +104,11 @@ public abstract class StageActivity extends StatsActivity { } public void startScene(@NonNull Class sceneClass) { - mSceneManager.startScene(sceneClass, null, null); + startScene(sceneClass, null); } public void startScene(@NonNull Class sceneClass, @Nullable Announcer announcer) { - mSceneManager.startScene(sceneClass, announcer, null); + startScene(sceneClass, announcer, Scene.getDefaultCurtain()); } public void startScene(@NonNull Class sceneClass, @Nullable Announcer announcer, diff --git a/app/src/main/res/layout/scene_download.xml b/app/src/main/res/layout/scene_download.xml index 8dbd40aab..0b201e784 100644 --- a/app/src/main/res/layout/scene_download.xml +++ b/app/src/main/res/layout/scene_download.xml @@ -25,7 +25,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:clipChildren="false" auto:space="@dimen/search_layout_space" auto:spaceLeft="@dimen/search_layout_space_horizontal" auto:spaceRight="@dimen/search_layout_space_horizontal"/>