diff --git a/src/com/hippo/ehviewer/ui/GalleryActivity.java b/src/com/hippo/ehviewer/ui/GalleryActivity.java index 071e7d7a9..817cfd4ca 100644 --- a/src/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/src/com/hippo/ehviewer/ui/GalleryActivity.java @@ -35,6 +35,7 @@ import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; +import com.hippo.ehviewer.AppHandler; import com.hippo.ehviewer.R; import com.hippo.ehviewer.app.DirSelectDialog; import com.hippo.ehviewer.app.MaterialAlertDialog; @@ -109,6 +110,20 @@ public class GalleryActivity extends AbsActivity private Dialog mSendDialog; + private final Runnable mFullScreenTask = new Runnable() { + @Override public void run() { + mFullScreenHelper.setFullScreen(true); + } + }; + + private void startFullScreenTask() { + AppHandler.getInstance().postDelayed(mFullScreenTask, 2000); + } + + private void cancelFullScreenTask() { + AppHandler.getInstance().removeCallbacks(mFullScreenTask); + } + @Override public void onCopyOver(boolean success, File src, File dst) { MaterialToast.showToast(success ? String.format(getString(R.string.save_successful), dst.getPath()) @@ -371,6 +386,17 @@ public class GalleryActivity extends AbsActivity mGalleryView.free(); } + @Override + public void onBackPressed() { + if (mConfigSliding.isInHideAnimate()) + return; + + if (mConfigSliding.isShowing()) + mConfigSliding.toBaseLevel(); + else + finish(); + } + @Override public void onClick(View v) { if (v == mRefresh) { @@ -391,6 +417,8 @@ public class GalleryActivity extends AbsActivity @Override public void onTapCenter() { if (!mConfigSliding.isShowing()) { + if (mFullScreenHelper.willHideNavBar()) + cancelFullScreenTask(); mFullScreenHelper.setFullScreen(false); boolean firstTime = Config.getBoolean(KEY_FIRST_READ_CONFIG_V1, DEFAULT_FIRST_READ_CONFIG_V1); @@ -461,7 +489,10 @@ public class GalleryActivity extends AbsActivity @Override public void onChildHide() { - mFullScreenHelper.setFullScreen(true); + if (mFullScreenHelper.willHideNavBar()) + startFullScreenTask(); + else + mFullScreenHelper.setFullScreen(true); } @Override diff --git a/src/com/hippo/ehviewer/util/FullScreenHelper.java b/src/com/hippo/ehviewer/util/FullScreenHelper.java index e8c91bca8..e5aa371dd 100644 --- a/src/com/hippo/ehviewer/util/FullScreenHelper.java +++ b/src/com/hippo/ehviewer/util/FullScreenHelper.java @@ -20,6 +20,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.os.Build; import android.view.View; +import android.view.ViewConfiguration; import android.view.Window; import android.view.WindowManager; @@ -57,8 +58,12 @@ public final class FullScreenHelper implements View.OnSystemUiVisibilityChangeLi private final Window mWindow; private final View mDecorView; + private boolean mHasNavBar; + private OnFullScreenBrokenListener mListener; + private final int TEST_SDK = Build.VERSION.SDK_INT; + public interface OnFullScreenBrokenListener { /** * FullScreen state should be fullScreen or not, @@ -69,19 +74,39 @@ public final class FullScreenHelper implements View.OnSystemUiVisibilityChangeLi public void onFullScreenBroken(boolean fullScreen); } - public FullScreenHelper(Activity activity) { mFullScreen = false; mActivity = activity; mWindow = mActivity.getWindow(); mDecorView = mWindow.getDecorView(); mDecorView.setOnSystemUiVisibilityChangeListener(this); + + String mainKey = Utils.getSystemProperties("qemu.hw.mainkeys"); + int resourceId = activity.getResources().getIdentifier("config_showNavigationBar", "bool", "android"); + if (resourceId != 0) { + mHasNavBar = activity.getResources().getBoolean(resourceId); + // check override flag (see static block) + if ("1".equals(mainKey)) { + mHasNavBar = false; + } else if ("0".equals(mainKey)) { + mHasNavBar = true; + } + } else { + mHasNavBar = !ViewConfiguration.get(activity).hasPermanentMenuKey(); + } + } + + public boolean willHideNavBar() { + if (TEST_SDK >= Build.VERSION_CODES.KITKAT && mHasNavBar) + return true; + else + return false; } @Override public void onSystemUiVisibilityChange(int visibility) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && - Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + if (TEST_SDK >= Build.VERSION_CODES.JELLY_BEAN && + TEST_SDK < Build.VERSION_CODES.KITKAT) { if ((mFullScreen && visibility != FULL_SCREEN_FLAG_JELLY_BEAN) || (!mFullScreen && visibility != 0)) { // User or system change visibility @@ -102,25 +127,25 @@ public final class FullScreenHelper implements View.OnSystemUiVisibilityChangeLi public void setFullScreen(boolean fullScreen) { mFullScreen = fullScreen; if (fullScreen) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (TEST_SDK < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { // Empty - } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + } else if (TEST_SDK < Build.VERSION_CODES.JELLY_BEAN) { mWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + } else if (TEST_SDK < Build.VERSION_CODES.KITKAT) { mDecorView.setSystemUiVisibility(FULL_SCREEN_JELLY_BEAN); } else { mDecorView.setSystemUiVisibility(FULL_SCREEN_KITKAT); } } else { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + if (TEST_SDK < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { // Empty - } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + } else if (TEST_SDK < Build.VERSION_CODES.JELLY_BEAN) { mWindow.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + } else if (TEST_SDK < Build.VERSION_CODES.KITKAT) { mDecorView.setSystemUiVisibility(NOT_FULL_SCREEN_JELLY_BEAN); } else { diff --git a/src/com/hippo/ehviewer/util/Utils.java b/src/com/hippo/ehviewer/util/Utils.java index 70a74f6ac..c3bc7abab 100644 --- a/src/com/hippo/ehviewer/util/Utils.java +++ b/src/com/hippo/ehviewer/util/Utils.java @@ -25,6 +25,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.lang.reflect.Method; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; @@ -713,4 +714,53 @@ public final class Utils { } return type; } + + + /** + * If get error return ""; + * + * @param key + * @return + */ + public static String getSystemProperties(String key) { + try { + Class c = Class.forName("android.os.SystemProperties"); + Method m = c.getDeclaredMethod("get", String.class); + m.setAccessible(true); + return (String) m.invoke(null, key); + } catch (Throwable e) { + return ""; + } + } + + /* + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + try { + + + sNavBarOverride = + } catch (Throwable e) { + sNavBarOverride = null; + } + } + + + public static boolean hasNavBar(Context context) { + Resources res = context.getResources(); + int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool", "android"); + if (resourceId != 0) { + boolean hasNav = res.getBoolean(resourceId); + // check override flag (see static block) + if ("1".equals(sNavBarOverride)) { + hasNav = false; + } else if ("0".equals(sNavBarOverride)) { + hasNav = true; + } + return hasNav; + } else { // fallback + return !ViewConfiguration.get(context).hasPermanentMenuKey(); + } + } + + */ } diff --git a/src/com/hippo/ehviewer/widget/SlidingLayout.java b/src/com/hippo/ehviewer/widget/SlidingLayout.java index 5b86138dd..df8f601b9 100644 --- a/src/com/hippo/ehviewer/widget/SlidingLayout.java +++ b/src/com/hippo/ehviewer/widget/SlidingLayout.java @@ -103,6 +103,8 @@ public class SlidingLayout extends ViewGroup { private int m5Top; private int mFullScreenTop; + private boolean mInHideAnimate = false; + private OnChildHideListener mOnChildHideListener; private static final ZInterpolator ZINTERPOLATOR = new ZInterpolator(); @@ -142,7 +144,7 @@ public class SlidingLayout extends ViewGroup { mToBaseLevelAnimate.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { - // Empty + mInHideAnimate = true; } @Override @@ -153,11 +155,13 @@ public class SlidingLayout extends ViewGroup { if (mOnChildHideListener != null) mOnChildHideListener.onChildHide(); + + mInHideAnimate = false; } @Override public void onAnimationCancel(Animator animation) { - // Empty + mInHideAnimate = false; } @Override @@ -476,6 +480,10 @@ public class SlidingLayout extends ViewGroup { return mChild.getVisibility() == View.VISIBLE; } + public boolean isInHideAnimate() { + return mInHideAnimate; + } + public void toReservedLevel(boolean withShake) { cancelAnimator(); // Show child