diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUrlOpener.java b/app/src/main/java/com/hippo/ehviewer/client/EhUrlOpener.java index ff1a05794..d1880d7b9 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUrlOpener.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUrlOpener.java @@ -49,6 +49,7 @@ public class EhUrlOpener { args.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_LIST_URL_BUILDER); args.putParcelable(GalleryListScene.KEY_LIST_URL_BUILDER, listUrlBuilder); intent = new Intent(activity, MainActivity.class); + intent.setAction(StageActivity.ACTION_START_SCENE); intent.putExtra(StageActivity.KEY_SCENE_NAME, GalleryListScene.class.getName()); intent.putExtra(StageActivity.KEY_SCENE_ARGS, args); activity.startActivity(intent); @@ -62,6 +63,7 @@ public class EhUrlOpener { args.putLong(GalleryDetailScene.KEY_GID, result1.gid); args.putString(GalleryDetailScene.KEY_TOKEN, result1.token); intent = new Intent(activity, MainActivity.class); + intent.setAction(StageActivity.ACTION_START_SCENE); intent.putExtra(StageActivity.KEY_SCENE_NAME, GalleryDetailScene.class.getName()); intent.putExtra(StageActivity.KEY_SCENE_ARGS, args); activity.startActivity(intent); @@ -76,6 +78,7 @@ public class EhUrlOpener { args.putString(ProgressScene.KEY_PTOKEN, result2.pToken); args.putLong(ProgressScene.KEY_PAGE, result2.page); intent = new Intent(activity, MainActivity.class); + intent.setAction(StageActivity.ACTION_START_SCENE); intent.putExtra(StageActivity.KEY_SCENE_NAME, ProgressScene.class.getName()); intent.putExtra(StageActivity.KEY_SCENE_ARGS, args); activity.startActivity(intent); diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java b/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java index 7c69eb5fa..5ee617394 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java @@ -33,6 +33,9 @@ import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.R; import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.dao.DownloadInfo; +import com.hippo.ehviewer.ui.MainActivity; +import com.hippo.ehviewer.ui.scene.DownloadsScene; +import com.hippo.scene.StageActivity; import com.hippo.util.ReadableTime; import com.hippo.yorozuya.FileUtils; import com.hippo.yorozuya.LongList; @@ -222,13 +225,22 @@ public class DownloadService extends Service implements DownloadManager.Download Intent stopAllIntent = new Intent(this, DownloadService.class); stopAllIntent.setAction(ACTION_STOP_ALL); PendingIntent piStopAll = PendingIntent.getService(this, 0, stopAllIntent, 0); + + Intent activityIntent = new Intent(this, MainActivity.class); + activityIntent.setAction(StageActivity.ACTION_START_SCENE); + activityIntent.putExtra(StageActivity.KEY_SCENE_NAME, DownloadsScene.class.getName()); + PendingIntent piActivity = PendingIntent.getActivity(DownloadService.this, 0, + activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); + mDownloadingBuilder = new NotificationCompat.Builder(getApplicationContext()) .setSmallIcon(android.R.drawable.stat_sys_download) .setOngoing(true) .setAutoCancel(false) .setCategory(NotificationCompat.CATEGORY_PROGRESS) .setColor(getResources().getColor(R.color.colorPrimary)) - .addAction(R.drawable.ic_pause_x24, getString(R.string.stat_download_action_stop_all), piStopAll); + .addAction(R.drawable.ic_pause_x24, getString(R.string.stat_download_action_stop_all), piStopAll) + .setShowWhen(false) + .setContentIntent(piActivity); mDownloadingDelay = new NotificationDelay(this, mNotifyManager, mDownloadingBuilder, ID_DOWNLOADING); } @@ -241,13 +253,21 @@ public class DownloadService extends Service implements DownloadManager.Download Intent clearIntent = new Intent(this, DownloadService.class); clearIntent.setAction(ACTION_CLEAR); PendingIntent piClear = PendingIntent.getService(this, 0, clearIntent, 0); + + Intent activityIntent = new Intent(this, MainActivity.class); + activityIntent.setAction(StageActivity.ACTION_START_SCENE); + activityIntent.putExtra(StageActivity.KEY_SCENE_NAME, DownloadsScene.class.getName()); + PendingIntent piActivity = PendingIntent.getActivity(DownloadService.this, 0, + activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); + mDownloadedBuilder = new NotificationCompat.Builder(getApplicationContext()) .setSmallIcon(android.R.drawable.stat_sys_download_done) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) .setContentTitle(getString(R.string.stat_download_done_title)) .setDeleteIntent(piClear) .setOngoing(false) - .setAutoCancel(true); + .setAutoCancel(true) + .setContentIntent(piActivity); mDownloadedDelay = new NotificationDelay(this, mNotifyManager, mDownloadedBuilder, ID_DOWNLOADED); } @@ -291,8 +311,7 @@ public class DownloadService extends Service implements DownloadManager.Download mDownloadingBuilder.setContentTitle(info.title) .setContentText(null) .setContentInfo(null) - .setProgress(0, 0, true) - .setWhen(System.currentTimeMillis()); + .setProgress(0, 0, true); mDownloadingDelay.startForeground(); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index 62ef1716c..774002ed4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -36,6 +36,7 @@ import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.client.EhUrlOpener; import com.hippo.ehviewer.client.EhUtils; +import com.hippo.ehviewer.ui.annotation.WholeLifeCircle; import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.ehviewer.ui.scene.DownloadLabelScene; import com.hippo.ehviewer.ui.scene.DownloadsScene; @@ -52,6 +53,7 @@ import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.scene.StageActivity; import com.hippo.util.PermissionRequester; +import com.hippo.yorozuya.ViewUtils; public final class MainActivity extends StageActivity implements NavigationView.OnNavigationItemSelectedListener { @@ -61,11 +63,15 @@ public final class MainActivity extends StageActivity private static final String KEY_NAV_CHECKED_ITEM = "nav_checked_item"; @Nullable + @WholeLifeCircle private DrawerLayout mDrawerLayout; @Nullable + @WholeLifeCircle private NavigationView mNavView; @Nullable + @WholeLifeCircle private FrameLayout mRightDrawer; + private int mNavCheckedItem = 0; static { @@ -87,35 +93,23 @@ public final class MainActivity extends StageActivity return R.id.fragment_container; } + @Nullable @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - mDrawerLayout = (DrawerLayout) findViewById(R.id.draw_view); - mNavView = (NavigationView) findViewById(R.id.nav_view); - mRightDrawer = (FrameLayout) findViewById(R.id.right_drawer); - - if (mNavView != null) { - mNavView.setNavigationItemSelectedListener(this); - } - - if (savedInstanceState == null) { - onInit(); + protected Announcer getLaunchAnnouncer() { + if (Settings.getShowWarning()) { + //setDrawerLayoutEnable(false); + return new Announcer(WarningScene.class); + } else if (!EhUtils.hasSignedIn(this)) { + //setDrawerLayoutEnable(false); + return new Announcer(LoginScene.class); } else { - onRestore(savedInstanceState); + //setDrawerLayoutEnable(true); + Bundle args = new Bundle(); + args.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_HOMEPAGE); + return new Announcer(GalleryListScene.class).setArgs(args); } } - @Override - protected void onDestroy() { - super.onDestroy(); - - mDrawerLayout = null; - mNavView = null; - mRightDrawer = null; - } - private boolean handleIntent(Intent intent) { if (intent == null) { return false; @@ -130,36 +124,44 @@ public final class MainActivity extends StageActivity } @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - if (!handleIntent(intent) && intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { - Toast.makeText(this, R.string.error_cannot_parse_the_url, Toast.LENGTH_SHORT).show(); + protected void onUnrecognizedIntent(@Nullable Intent intent) { + if (!handleIntent(intent)) { + if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { + Toast.makeText(this, R.string.error_cannot_parse_the_url, Toast.LENGTH_SHORT).show(); + } + if (0 == getSceneCount()) { + finish(); + } + } + } + + @Nullable + @Override + protected Announcer onStartSceneFromIntent(@NonNull Class clazz, @Nullable Bundle args) { + // TODO start login scene or warning scene + return super.onStartSceneFromIntent(clazz, args); + } + + @Override + protected void onCreate2(@Nullable Bundle savedInstanceState) { + setContentView(R.layout.activity_main); + + mDrawerLayout = (DrawerLayout) ViewUtils.$$(this, R.id.draw_view); + mNavView = (NavigationView) ViewUtils.$$(this, R.id.nav_view); + mRightDrawer = (FrameLayout) ViewUtils.$$(this, R.id.right_drawer); + + if (mNavView != null) { + mNavView.setNavigationItemSelectedListener(this); + } + + if (savedInstanceState == null) { + onInit(); + } else { + onRestore(savedInstanceState); } } private void onInit() { - Intent intent = getIntent(); - if (!handleIntent(intent)) { - if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { - Toast.makeText(this, R.string.error_cannot_parse_the_url, Toast.LENGTH_SHORT).show(); - finish(); - return; - } else { - if (Settings.getShowWarning()) { - setDrawerLayoutEnable(false); - startScene(new Announcer(WarningScene.class)); - } else if (!EhUtils.hasSignedIn(this)) { - setDrawerLayoutEnable(false); - startScene(new Announcer(LoginScene.class)); - } else { - setDrawerLayoutEnable(true); - Bundle args = new Bundle(); - args.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_HOMEPAGE); - startScene(new Announcer(GalleryListScene.class).setArgs(args)); - } - } - } - // Check permission PermissionRequester.request(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, getString(R.string.write_rationale), PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); @@ -175,6 +177,15 @@ public final class MainActivity extends StageActivity outState.putInt(KEY_NAV_CHECKED_ITEM, mNavCheckedItem); } + @Override + protected void onDestroy() { + super.onDestroy(); + + mDrawerLayout = null; + mNavView = null; + mRightDrawer = null; + } + @Override protected void onResume() { super.onResume(); diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index 83a685821..2a877304b 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -18,12 +18,12 @@ package com.hippo.scene; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; -import android.text.TextUtils; import android.util.Log; import com.hippo.ehviewer.R; @@ -39,6 +39,8 @@ public abstract class StageActivity extends AppCompatActivity { private static final String TAG = StageActivity.class.getSimpleName(); + public static final String ACTION_START_SCENE = "start_scene"; + public static final String KEY_SCENE_NAME = "stage_activity_scene_name"; public static final String KEY_SCENE_ARGS = "stage_activity_scene_args"; @@ -64,32 +66,74 @@ public abstract class StageActivity extends AppCompatActivity { public abstract int getContainerViewId(); + /** + * @return {@code true} for start scene + */ + private boolean startSceneFromIntent(Intent intent) { + String clazzStr = intent.getStringExtra(KEY_SCENE_NAME); + if (null == clazzStr) { + return false; + } + + Class clazz; + try { + clazz = Class.forName(clazzStr); + } catch (ClassNotFoundException e) { + Log.e(TAG, "Can't find class " + clazzStr, e); + return false; + } + + Bundle args = intent.getBundleExtra(KEY_SCENE_ARGS); + + Announcer announcer = onStartSceneFromIntent(clazz, args); + if (announcer == null) { + return false; + } + + startScene(announcer); + return true; + } + + /** + * Start scene from {@code Intent}, it might be not safe, + * Correct it here. + * + * @return {@code null} for do not start scene + */ + @Nullable + protected Announcer onStartSceneFromIntent(@NonNull Class clazz, @Nullable Bundle args) { + return new Announcer(clazz).setArgs(args); + } + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - if (intent != null) { - String clazzStr = intent.getStringExtra(KEY_SCENE_NAME); - if (TextUtils.isEmpty(clazzStr)) { - return; - } - - Class clazz; - try { - clazz = Class.forName(clazzStr); - } catch (ClassNotFoundException e) { - Log.e(TAG, "Can't find class " + clazzStr, e); - return; - } - - Bundle args = intent.getBundleExtra(KEY_SCENE_ARGS); - - startScene(new Announcer(clazz).setArgs(args)); + if (intent == null || !ACTION_START_SCENE.equals(intent.getAction()) || + !startSceneFromIntent(intent)) { + onUnrecognizedIntent(intent); } } + /** + * Called when launch with action {@code android.intent.action.MAIN} + */ + @Nullable + protected abstract Announcer getLaunchAnnouncer(); + + /** + * Can't recognize intent in first time {@code onCreate} and {@code onNewIntent}, + * null included. + */ + protected void onUnrecognizedIntent(@Nullable Intent intent) {} + + /** + * Call {@code setContentView} here. Do NOT call {@code startScene} here + */ + protected abstract void onCreate2(@Nullable Bundle savedInstanceState); + @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { + protected final void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { @@ -103,6 +147,38 @@ public abstract class StageActivity extends AppCompatActivity { } else { ((SceneApplication) getApplicationContext()).registerStageActivity(this, mStageId); } + + // Create layout + onCreate2(savedInstanceState); + + Intent intent = getIntent(); + if (savedInstanceState == null) { + if (intent != null) { + String action = intent.getAction(); + if (Intent.ACTION_MAIN.equals(action)) { + Announcer announcer = getLaunchAnnouncer(); + if (announcer != null) { + startScene(announcer); + return; + } + } else if (ACTION_START_SCENE.equals(action)) { + if (startSceneFromIntent(intent)) { + return; + } + } + } + + // Can't recognize intent + onUnrecognizedIntent(intent); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(KEY_STAGE_ID, mStageId); + outState.putStringArrayList(KEY_SCENE_TAG_LIST, mSceneTagList); + outState.putInt(KEY_NEXT_ID, mIdGenerator.getAndIncrement()); } @Override @@ -128,6 +204,10 @@ public abstract class StageActivity extends AppCompatActivity { return mStageId; } + public int getSceneCount() { + return mSceneTagList.size(); + } + public int getSceneLaunchMode(Class clazz) { Integer integer = sLaunchModeMap.get(clazz); if (integer == null) { @@ -466,12 +546,4 @@ public abstract class StageActivity extends AppCompatActivity { return null; } } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putInt(KEY_STAGE_ID, mStageId); - outState.putStringArrayList(KEY_SCENE_TAG_LIST, mSceneTagList); - outState.putInt(KEY_NEXT_ID, mIdGenerator.getAndIncrement()); - } } diff --git a/yorozuya b/yorozuya index 5d3219c85..56224dfe3 160000 --- a/yorozuya +++ b/yorozuya @@ -1 +1 @@ -Subproject commit 5d3219c85fca374df728002f578ea34fdd4ccc5a +Subproject commit 56224dfe341dc7de559d375ad69c1a5be9b27f18