diff --git a/app/src/main/java/com/hippo/ehviewer/Crash.java b/app/src/main/java/com/hippo/ehviewer/Crash.java index ab1fd51b1..13b08135c 100644 --- a/app/src/main/java/com/hippo/ehviewer/Crash.java +++ b/app/src/main/java/com/hippo/ehviewer/Crash.java @@ -69,14 +69,17 @@ public final class Crash { } // Runtime - String topActivityClazzName = null; - String topSceneClazzName = null; + String topActivityClazzName = "null"; + String topSceneClazzName = "null"; try { Activity topActivity = ((EhApplication) context.getApplicationContext()).getTopActivity(); if (null != topActivity) { topActivityClazzName = topActivity.getClass().getName(); if (topActivity instanceof StageActivity) { - topSceneClazzName = ((StageActivity) topActivity).getTopSceneClazzName(); + Class clazz = ((StageActivity) topActivity).getTopSceneClass(); + if (clazz != null) { + topSceneClazzName = clazz.getName(); + } } } } catch (Throwable e) { 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 91e1a982d..f0032a5c9 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -33,7 +33,6 @@ import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v7.app.AlertDialog; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.view.MenuItem; import android.view.View; @@ -67,6 +66,7 @@ import com.hippo.ehviewer.ui.scene.QuickSearchScene; import com.hippo.ehviewer.ui.scene.SecurityScene; import com.hippo.ehviewer.ui.scene.SelectSiteScene; import com.hippo.ehviewer.ui.scene.SignInScene; +import com.hippo.ehviewer.ui.scene.SolidScene; import com.hippo.ehviewer.ui.scene.WarningScene; import com.hippo.ehviewer.ui.scene.WebViewSignInScene; import com.hippo.ehviewer.widget.EhDrawerLayout; @@ -91,24 +91,12 @@ import java.io.OutputStream; public final class MainActivity extends StageActivity implements NavigationView.OnNavigationItemSelectedListener { - private static final String TAG = MainActivity.class.getSimpleName(); - private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; private static final int REQUEST_CODE_SETTINGS = 0; private static final String KEY_NAV_CHECKED_ITEM = "nav_checked_item"; - public static final int CHECK_STEP_SECURITY = 0; - public static final int CHECK_STEP_WARNING = 1; - public static final int CHECK_STEP_ANALYTICS = 2; - public static final int CHECK_STEP_CRASH = 3; - public static final int CHECK_STEP_SIGN_IN = 4; - public static final int CHECK_STEP_SELECT_SITE = 5; - - public static final String KEY_TARGET_SCENE = "target_scene"; - public static final String KEY_TARGET_ARGS = "target_args"; - /*--------------- Whole life cycle ---------------*/ @@ -147,61 +135,6 @@ public final class MainActivity extends StageActivity registerLaunchMode(ProgressScene.class, SceneFragment.LAUNCH_MODE_STANDARD); } - public void startSceneForCheckStep(int checkStep, Bundle args) { - switch (checkStep) { - case CHECK_STEP_SECURITY: - if (Settings.getShowWarning()) { - startScene(new Announcer(WarningScene.class).setArgs(args)); - break; - } - case CHECK_STEP_WARNING: - if (Settings.getAskAnalytics()) { - startScene(new Announcer(AnalyticsScene.class).setArgs(args)); - break; - } - case CHECK_STEP_ANALYTICS: - if (Crash.hasCrashFile()) { - startScene(new Announcer(CrashScene.class).setArgs(args)); - break; - } - case CHECK_STEP_CRASH: - if (EhUtils.needSignedIn(this)) { - startScene(new Announcer(SignInScene.class).setArgs(args)); - break; - } - case CHECK_STEP_SIGN_IN: - if (Settings.getSelectSite()) { - startScene(new Announcer(SelectSiteScene.class).setArgs(args)); - break; - } - case CHECK_STEP_SELECT_SITE: - String targetScene = null; - Bundle targetArgs = null; - if (null != args) { - targetScene = args.getString(KEY_TARGET_SCENE); - targetArgs = args.getBundle(KEY_TARGET_ARGS); - } - - Class clazz = null; - if (targetScene != null) { - try { - clazz = Class.forName(targetScene); - } catch (ClassNotFoundException e) { - Log.e(TAG, "Can't find class with name: " + targetScene); - } - } - - if (clazz != null) { - startScene(new Announcer(clazz).setArgs(targetArgs)); - } else { - Bundle newArgs = new Bundle(); - newArgs.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_HOMEPAGE); - startScene(new Announcer(GalleryListScene.class).setArgs(newArgs)); - } - break; - } - } - @Override public int getContainerViewId() { return R.id.fragment_container; @@ -234,33 +167,33 @@ public final class MainActivity extends StageActivity if (0 == getSceneCount()) { if (!TextUtils.isEmpty(Settings.getSecurity())) { Bundle newArgs = new Bundle(); - newArgs.putString(KEY_TARGET_SCENE, announcer.getClazz().getName()); - newArgs.putBundle(KEY_TARGET_ARGS, announcer.getArgs()); + newArgs.putString(SecurityScene.KEY_TARGET_SCENE, announcer.getClazz().getName()); + newArgs.putBundle(SecurityScene.KEY_TARGET_ARGS, announcer.getArgs()); return new Announcer(SecurityScene.class).setArgs(newArgs); } else if (Settings.getShowWarning()) { Bundle newArgs = new Bundle(); - newArgs.putString(KEY_TARGET_SCENE, announcer.getClazz().getName()); - newArgs.putBundle(KEY_TARGET_ARGS, announcer.getArgs()); + newArgs.putString(WarningScene.KEY_TARGET_SCENE, announcer.getClazz().getName()); + newArgs.putBundle(WarningScene.KEY_TARGET_ARGS, announcer.getArgs()); return new Announcer(WarningScene.class).setArgs(newArgs); } else if (Settings.getAskAnalytics()) { Bundle newArgs = new Bundle(); - newArgs.putString(KEY_TARGET_SCENE, announcer.getClazz().getName()); - newArgs.putBundle(KEY_TARGET_ARGS, announcer.getArgs()); + newArgs.putString(AnalyticsScene.KEY_TARGET_SCENE, announcer.getClazz().getName()); + newArgs.putBundle(AnalyticsScene.KEY_TARGET_ARGS, announcer.getArgs()); return new Announcer(AnalyticsScene.class).setArgs(newArgs); } else if (Crash.hasCrashFile()) { Bundle newArgs = new Bundle(); - newArgs.putString(KEY_TARGET_SCENE, announcer.getClazz().getName()); - newArgs.putBundle(KEY_TARGET_ARGS, announcer.getArgs()); + newArgs.putString(CrashScene.KEY_TARGET_SCENE, announcer.getClazz().getName()); + newArgs.putBundle(CrashScene.KEY_TARGET_ARGS, announcer.getArgs()); return new Announcer(CrashScene.class).setArgs(newArgs); } else if (EhUtils.needSignedIn(this)) { Bundle newArgs = new Bundle(); - newArgs.putString(KEY_TARGET_SCENE, announcer.getClazz().getName()); - newArgs.putBundle(KEY_TARGET_ARGS, announcer.getArgs()); + newArgs.putString(SignInScene.KEY_TARGET_SCENE, announcer.getClazz().getName()); + newArgs.putBundle(SignInScene.KEY_TARGET_ARGS, announcer.getArgs()); return new Announcer(SignInScene.class).setArgs(newArgs); } else if (Settings.getSelectSite()) { Bundle newArgs = new Bundle(); - newArgs.putString(KEY_TARGET_SCENE, announcer.getClazz().getName()); - newArgs.putBundle(KEY_TARGET_ARGS, announcer.getArgs()); + newArgs.putString(SelectSiteScene.KEY_TARGET_SCENE, announcer.getClazz().getName()); + newArgs.putBundle(SelectSiteScene.KEY_TARGET_ARGS, announcer.getArgs()); return new Announcer(SelectSiteScene.class).setArgs(newArgs); } } @@ -341,6 +274,12 @@ public final class MainActivity extends StageActivity @Override protected void onUnrecognizedIntent(@Nullable Intent intent) { + Class clazz = getTopSceneClass(); + if (clazz != null && SolidScene.class.isAssignableFrom(clazz)) { + // TODO the intent lost + return; + } + if (!handleIntent(intent)) { boolean handleUrl = false; if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/AnalyticsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/AnalyticsScene.java index feba15ec8..183f32924 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/AnalyticsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/AnalyticsScene.java @@ -32,7 +32,7 @@ import com.hippo.text.Html; import com.hippo.text.LinkMovementMethod2; import com.hippo.yorozuya.ViewUtils; -public class AnalyticsScene extends BaseScene implements View.OnClickListener { +public class AnalyticsScene extends SolidScene implements View.OnClickListener { @Nullable private View mReject; @@ -90,7 +90,7 @@ public class AnalyticsScene extends BaseScene implements View.OnClickListener { // Start new scene and finish it self MainActivity activity = getActivity2(); if (null != activity) { - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_ANALYTICS, getArguments()); + startSceneForCheckStep(CHECK_STEP_ANALYTICS, getArguments()); } finish(); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java index e443d9a4e..adb44e44c 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java @@ -41,7 +41,7 @@ import com.hippo.yorozuya.ViewUtils; import okhttp3.Cookie; -public class CookieSignInScene extends BaseScene implements EditText.OnEditorActionListener, +public class CookieSignInScene extends SolidScene implements EditText.OnEditorActionListener, View.OnClickListener { /*--------------- diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/CrashScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/CrashScene.java index a63c0e9da..ddaae1bde 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/CrashScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/CrashScene.java @@ -30,7 +30,7 @@ import com.hippo.ripple.Ripple; import com.hippo.util.AppHelper; import com.hippo.yorozuya.ViewUtils; -public class CrashScene extends BaseScene implements View.OnClickListener { +public class CrashScene extends SolidScene implements View.OnClickListener { /*--------------- Whole life cycle @@ -88,7 +88,7 @@ public class CrashScene extends BaseScene implements View.OnClickListener { // Start new scene and finish it self if (null != activity) { - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_CRASH, getArguments()); + startSceneForCheckStep(CHECK_STEP_CRASH, getArguments()); } finish(); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java index c7a953d09..5a7aed9fe 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java @@ -37,7 +37,7 @@ import com.hippo.yorozuya.ViewUtils; import java.util.List; -public class SecurityScene extends BaseScene implements +public class SecurityScene extends SolidScene implements LockPatternView.OnPatternListener, ShakeDetector.OnShakeListener { private static final int MAX_RETRY_TIMES = 5; @@ -152,7 +152,7 @@ public class SecurityScene extends BaseScene implements String targetPatter = Settings.getSecurity(); if (ObjectUtils.equal(enteredPatter, targetPatter)) { - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_SECURITY, getArguments()); + startSceneForCheckStep(CHECK_STEP_SECURITY, getArguments()); finish(); } else { mPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); @@ -171,7 +171,7 @@ public class SecurityScene extends BaseScene implements return; } Settings.putSecurity(""); - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_SECURITY, getArguments()); + startSceneForCheckStep(CHECK_STEP_SECURITY, getArguments()); finish(); } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SelectSiteScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SelectSiteScene.java index 76fc86d05..c0bda1bc7 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SelectSiteScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SelectSiteScene.java @@ -30,7 +30,7 @@ import com.hippo.ehviewer.client.EhUrl; import com.hippo.ehviewer.ui.MainActivity; import com.hippo.yorozuya.ViewUtils; -public class SelectSiteScene extends BaseScene implements View.OnClickListener { +public class SelectSiteScene extends SolidScene implements View.OnClickListener { private RadioGroup mRadioGroup; private View mOk; @@ -75,13 +75,13 @@ public class SelectSiteScene extends BaseScene implements View.OnClickListener { case R.id.site_e: Settings.putSelectSite(false); Settings.putGallerySite(EhUrl.SITE_G); - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_SELECT_SITE, getArguments()); + startSceneForCheckStep(CHECK_STEP_SELECT_SITE, getArguments()); finish(); break; case R.id.site_ex: Settings.putSelectSite(false); Settings.putGallerySite(EhUrl.SITE_EX); - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_SELECT_SITE, getArguments()); + startSceneForCheckStep(CHECK_STEP_SELECT_SITE, getArguments()); finish(); break; default: diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java index c24c9b212..cfacbc02d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java @@ -45,7 +45,7 @@ import com.hippo.scene.SceneFragment; import com.hippo.yorozuya.AssertUtils; import com.hippo.yorozuya.ViewUtils; -public final class SignInScene extends BaseScene implements EditText.OnEditorActionListener, +public final class SignInScene extends SolidScene implements EditText.OnEditorActionListener, View.OnClickListener { private static final String KEY_REQUEST_ID = "request_id"; @@ -313,7 +313,7 @@ public final class SignInScene extends BaseScene implements EditText.OnEditorAct Settings.putNeedSignIn(false); MainActivity activity = getActivity2(); if (null != activity) { - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_SIGN_IN, getArguments()); + startSceneForCheckStep(CHECK_STEP_SIGN_IN, getArguments()); } finish(); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SolidScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SolidScene.java new file mode 100644 index 000000000..4bba3cb0a --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SolidScene.java @@ -0,0 +1,98 @@ +/* + * Copyright 2016 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.ui.scene; + +import android.os.Bundle; +import android.util.Log; + +import com.hippo.ehviewer.Crash; +import com.hippo.ehviewer.Settings; +import com.hippo.ehviewer.client.EhUtils; +import com.hippo.scene.Announcer; + +/** + * Scene for safety, can't be covered + */ +public class SolidScene extends BaseScene { + + private static final String TAG = SolidScene.class.getSimpleName(); + + public static final int CHECK_STEP_SECURITY = 0; + public static final int CHECK_STEP_WARNING = 1; + public static final int CHECK_STEP_ANALYTICS = 2; + public static final int CHECK_STEP_CRASH = 3; + public static final int CHECK_STEP_SIGN_IN = 4; + public static final int CHECK_STEP_SELECT_SITE = 5; + + public static final String KEY_TARGET_SCENE = "target_scene"; + public static final String KEY_TARGET_ARGS = "target_args"; + + public void startSceneForCheckStep(int checkStep, Bundle args) { + switch (checkStep) { + case CHECK_STEP_SECURITY: + if (Settings.getShowWarning()) { + startScene(new Announcer(WarningScene.class).setArgs(args)); + break; + } + case CHECK_STEP_WARNING: + if (Settings.getAskAnalytics()) { + startScene(new Announcer(AnalyticsScene.class).setArgs(args)); + break; + } + case CHECK_STEP_ANALYTICS: + if (Crash.hasCrashFile()) { + startScene(new Announcer(CrashScene.class).setArgs(args)); + break; + } + case CHECK_STEP_CRASH: + if (EhUtils.needSignedIn(getContext2())) { + startScene(new Announcer(SignInScene.class).setArgs(args)); + break; + } + case CHECK_STEP_SIGN_IN: + if (Settings.getSelectSite()) { + startScene(new Announcer(SelectSiteScene.class).setArgs(args)); + break; + } + case CHECK_STEP_SELECT_SITE: + String targetScene = null; + Bundle targetArgs = null; + if (null != args) { + targetScene = args.getString(KEY_TARGET_SCENE); + targetArgs = args.getBundle(KEY_TARGET_ARGS); + } + + Class clazz = null; + if (targetScene != null) { + try { + clazz = Class.forName(targetScene); + } catch (ClassNotFoundException e) { + Log.e(TAG, "Can't find class with name: " + targetScene); + } + } + + if (clazz != null) { + startScene(new Announcer(clazz).setArgs(targetArgs)); + } else { + Bundle newArgs = new Bundle(); + newArgs.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_HOMEPAGE); + startScene(new Announcer(GalleryListScene.class).setArgs(newArgs)); + } + break; + } + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/WarningScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/WarningScene.java index 928b66f21..d0e0dcb8d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/WarningScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/WarningScene.java @@ -28,7 +28,7 @@ import com.hippo.ehviewer.ui.MainActivity; import com.hippo.ehviewer.ui.annotation.ViewLifeCircle; import com.hippo.yorozuya.ViewUtils; -public final class WarningScene extends BaseScene implements View.OnClickListener { +public final class WarningScene extends SolidScene implements View.OnClickListener { @Nullable private View mReject; @@ -75,7 +75,7 @@ public final class WarningScene extends BaseScene implements View.OnClickListene // Start new scene and finish it self MainActivity activity = getActivity2(); if (null != activity) { - activity.startSceneForCheckStep(MainActivity.CHECK_STEP_WARNING, getArguments()); + startSceneForCheckStep(CHECK_STEP_WARNING, getArguments()); } finish(); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java index bc99e13c1..b958d0171 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/WebViewSignInScene.java @@ -42,7 +42,7 @@ import java.util.List; import okhttp3.Cookie; import okhttp3.HttpUrl; -public class WebViewSignInScene extends BaseScene { +public class WebViewSignInScene extends SolidScene { /*--------------- View life cycle diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index fda9735cc..85f83da54 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -593,7 +593,7 @@ public abstract class StageActivity extends EhActivity { } @Nullable - public String getTopSceneClazzName() { + public Class getTopSceneClass() { int index = mSceneTagList.size() - 1; if (index < 0) { return null; @@ -603,6 +603,6 @@ public abstract class StageActivity extends EhActivity { if (null == fragment) { return null; } - return fragment.getClass().getName(); + return fragment.getClass(); } }