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 48f37757e..723afacc0 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java @@ -377,12 +377,28 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan // System UI helper if (Settings.getReadingFullscreen()) { - int systemUiLevel; - systemUiLevel = SystemUiHelper.LEVEL_IMMERSIVE; - mSystemUiHelper = new SystemUiHelper(this, systemUiLevel, - SystemUiHelper.FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES | SystemUiHelper.FLAG_IMMERSIVE_STICKY); + mSystemUiHelper = new SystemUiHelper(this); mSystemUiHelper.hide(); mShowSystemUi = false; + } else { + Window window = getWindow(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + View decorView = window.getDecorView(); + int flags = decorView.getSystemUiVisibility(); + if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) <= 0) { + flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else { + flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + decorView.setSystemUiVisibility(flags); + window.setStatusBarColor(AttrResources.getAttrColor(this, android.R.attr.colorBackground)); + } else { + if ((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) <= 0) { + window.setStatusBarColor(AttrResources.getAttrColor(this, R.attr.colorPrimaryDark)); + } else { + window.setStatusBarColor(AttrResources.getAttrColor(this, android.R.attr.colorBackground)); + } + } } mMaskView = (ColorView) ViewUtils.$$(this, R.id.mask); diff --git a/app/src/main/java/com/hippo/util/SystemUiHelper.java b/app/src/main/java/com/hippo/util/SystemUiHelper.java index 3fe477c7b..2d727c3b0 100644 --- a/app/src/main/java/com/hippo/util/SystemUiHelper.java +++ b/app/src/main/java/com/hippo/util/SystemUiHelper.java @@ -17,261 +17,30 @@ package com.hippo.util; import android.app.Activity; -import android.os.Handler; -import android.os.Looper; -import android.view.WindowManager; +import android.view.View; -/** - * Helper for controlling the visibility of the System UI across the various API levels. To use - * this API, instantiate an instance of this class with the required level. The level specifies the - * extent to which the System UI's visibility is changed when you call {@link #hide()} - * or {@link #toggle()}. - */ public final class SystemUiHelper { + final View mDecorView; - /** - * In this level, the helper will toggle low profile mode. - */ - public static final int LEVEL_LOW_PROFILE = 0; - - /** - * In this level, the helper will toggle the visibility of the status bar. - * If there is a navigation bar, it will toggle low profile mode. - */ - public static final int LEVEL_HIDE_STATUS_BAR = 1; - - /** - * In this level, the helper will toggle the visibility of the navigation bar - * (if present and if possible) and status bar. In cases where the navigation - * bar is present but cannot be hidden, it will toggle low profile mode. - */ - public static final int LEVEL_LEAN_BACK = 2; - - /** - * In this level, the helper will toggle the visibility of the navigation bar - * (if present and if possible) and status bar, in an immersive mode. This means that the app - * will continue to receive all touch events. The user can reveal the system bars with an - * inward swipe along the region where the system bars normally appear. - * - *

The {@link #FLAG_IMMERSIVE_STICKY} flag can be used to control how the system bars are - * displayed. - */ - public static final int LEVEL_IMMERSIVE = 3; - - /** - * When this flag is set, the - * {@link android.view.WindowManager.LayoutParams#FLAG_LAYOUT_IN_SCREEN} - * flag will be set on older devices, making the status bar "float" on top - * of the activity layout. This is most useful when there are no controls at - * the top of the activity layout. - *

- * This flag isn't used on newer devices because the action - * bar, the most important structural element of an Android app, should - * be visible and not obscured by the system UI. - */ - public static final int FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES = 0x1; - - /** - * Used with {@link #LEVEL_IMMERSIVE}. When this flag is set, an inward swipe in the system - * bars areas will cause the system bars to temporarily appear in a semi-transparent state, - * but no flags are cleared, and your system UI visibility change listeners are not triggered. - * The bars automatically hide again after a short delay, or if the user interacts with the - * middle of the screen. - */ - public static final int FLAG_IMMERSIVE_STICKY = 0x2; - - private static final String LOG_TAG = SystemUiHelper.class.getSimpleName(); - - private final SystemUiHelperImpl mImpl; - - private final Handler mHandler; - private final Runnable mHideRunnable; - - /** - * Construct a new SystemUiHelper. - * - * @param activity The Activity who's system UI should be changed - * @param level The level of hiding. Should be either {@link #LEVEL_LOW_PROFILE}, - * {@link #LEVEL_HIDE_STATUS_BAR}, {@link #LEVEL_LEAN_BACK} or - * {@link #LEVEL_IMMERSIVE} - * @param flags Additional options. See {@link #FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES} and - * {@link #FLAG_IMMERSIVE_STICKY} - */ - public SystemUiHelper(Activity activity, int level, int flags) { - this(activity, level, flags, null); + public SystemUiHelper(Activity activity) { + mDecorView = activity.getWindow().getDecorView(); } - /** - * Construct a new SystemUiHelper. - * - * @param activity The Activity who's system UI should be changed - * @param level The level of hiding. Should be either {@link #LEVEL_LOW_PROFILE}, - * {@link #LEVEL_HIDE_STATUS_BAR}, {@link #LEVEL_LEAN_BACK} or - * {@link #LEVEL_IMMERSIVE} - * @param flags Additional options. See {@link #FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES} and - * {@link #FLAG_IMMERSIVE_STICKY} - * @param listener A listener which is called when the system visibility is changed - */ - public SystemUiHelper(Activity activity, int level, int flags, - OnVisibilityChangeListener listener) { - - mHandler = new Handler(Looper.getMainLooper()); - mHideRunnable = new HideRunnable(); - - // Create impl - mImpl = new SystemUiHelperImplKK(activity, level, flags, listener); - } - - /** - * @return true if the system UI is currently showing. What this means depends on the mode this - * {@link SystemUiHelper} was instantiated with. - */ - public boolean isShowing() { - return mImpl.isShowing(); - } - - /** - * Show the system UI. What this means depends on the mode this {@link SystemUiHelper} was - * instantiated with. - * - *

Any currently queued delayed hide requests will be removed. - */ public void show() { - // Ensure that any currently queued hide calls are removed - removeQueuedRunnables(); - - mImpl.show(); + mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } - /** - * Hide the system UI. What this means depends on the mode this {@link SystemUiHelper} was - * instantiated with. - * - *

Any currently queued delayed hide requests will be removed. - */ public void hide() { - // Ensure that any currently queued hide calls are removed - removeQueuedRunnables(); - - mImpl.hide(); + mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + // Set the content to appear under the system bars so that the + // content doesn't resize when the system bars hide and show. + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + // Hide the nav bar and status bar + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN); } - - /** - * Request that the system UI is hidden after a delay. - * - *

Any currently queued delayed hide requests will be removed. - * - * @param delayMillis The delay (in milliseconds) until the Runnable - * will be executed. - */ - public void delayHide(long delayMillis) { - // Ensure that any currently queued hide calls are removed - removeQueuedRunnables(); - - mHandler.postDelayed(mHideRunnable, delayMillis); - } - - /** - * Toggle whether the system UI is displayed. - */ - public void toggle() { - if (mImpl.isShowing()) { - mImpl.hide(); - } else { - mImpl.show(); - } - } - - private void removeQueuedRunnables() { - // Ensure that any currently queued hide calls are removed - mHandler.removeCallbacks(mHideRunnable); - } - - /** - * A callback interface used to listen for system UI visibility changes. - */ - public interface OnVisibilityChangeListener { - /** - * Called when the system UI visibility has changed. - * - * @param visible True if the system UI is visible. - */ - void onVisibilityChange(boolean visible); - } - - static abstract class SystemUiHelperImpl { - - final Activity mActivity; - final int mLevel; - final int mFlags; - final OnVisibilityChangeListener mOnVisibilityChangeListener; - - boolean mIsShowing = true; - - SystemUiHelperImpl(Activity activity, int level, int flags, - OnVisibilityChangeListener onVisibilityChangeListener) { - mActivity = activity; - mLevel = level; - mFlags = flags; - mOnVisibilityChangeListener = onVisibilityChangeListener; - } - - abstract void show(); - - abstract void hide(); - - boolean isShowing() { - return mIsShowing; - } - - void setIsShowing(boolean isShowing) { - mIsShowing = isShowing; - - if (mOnVisibilityChangeListener != null) { - mOnVisibilityChangeListener.onVisibilityChange(mIsShowing); - } - } - } - - /** - * Base implementation. Used on API level 10 and below. - */ - static class SystemUiHelperImplBase extends SystemUiHelperImpl { - - SystemUiHelperImplBase(Activity activity, int level, int flags, - OnVisibilityChangeListener onVisibilityChangeListener) { - super(activity, level, flags, onVisibilityChangeListener); - - if ((mFlags & SystemUiHelper.FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES) != 0) { - mActivity.getWindow().addFlags( - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); - } - } - - @Override - void show() { - if (mLevel > SystemUiHelper.LEVEL_LOW_PROFILE) { - mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - setIsShowing(true); - } - } - - @Override - void hide() { - if (mLevel > SystemUiHelper.LEVEL_LOW_PROFILE) { - mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - setIsShowing(false); - } - } - } - - private class HideRunnable implements Runnable { - @Override - public void run() { - hide(); - } - } - } diff --git a/app/src/main/java/com/hippo/util/SystemUiHelperImplHC.java b/app/src/main/java/com/hippo/util/SystemUiHelperImplHC.java deleted file mode 100644 index 43e782d84..000000000 --- a/app/src/main/java/com/hippo/util/SystemUiHelperImplHC.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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.util; - -import android.annotation.TargetApi; -import android.app.ActionBar; -import android.app.Activity; -import android.os.Build; -import android.view.View; -import android.view.WindowManager; - -@TargetApi(Build.VERSION_CODES.HONEYCOMB) -class SystemUiHelperImplHC extends SystemUiHelper.SystemUiHelperImpl - implements View.OnSystemUiVisibilityChangeListener { - - final View mDecorView; - - SystemUiHelperImplHC(Activity activity, int level, int flags, - SystemUiHelper.OnVisibilityChangeListener onVisibilityChangeListener) { - super(activity, level, flags, onVisibilityChangeListener); - - mDecorView = activity.getWindow().getDecorView(); - mDecorView.setOnSystemUiVisibilityChangeListener(this); - } - - - @Override - void show() { - mDecorView.setSystemUiVisibility(createShowFlags()); - } - - @Override - void hide() { - mDecorView.setSystemUiVisibility(createHideFlags()); - } - - @Override - public final void onSystemUiVisibilityChange(int visibility) { - if ((visibility & createTestFlags()) != 0) { - onSystemUiHidden(); - } else { - onSystemUiShown(); - } - } - - protected void onSystemUiShown() { - ActionBar ab = mActivity.getActionBar(); - if (ab != null) { - ab.show(); - } - - mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - - setIsShowing(true); - } - - protected void onSystemUiHidden() { - ActionBar ab = mActivity.getActionBar(); - if (ab != null) { - ab.hide(); - } - - mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - - setIsShowing(false); - } - - protected int createShowFlags() { - return View.STATUS_BAR_VISIBLE; - } - - protected int createHideFlags() { - return View.STATUS_BAR_HIDDEN; - } - - protected int createTestFlags() { - return View.STATUS_BAR_HIDDEN; - } -} diff --git a/app/src/main/java/com/hippo/util/SystemUiHelperImplICS.java b/app/src/main/java/com/hippo/util/SystemUiHelperImplICS.java deleted file mode 100644 index 8c88a98c2..000000000 --- a/app/src/main/java/com/hippo/util/SystemUiHelperImplICS.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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.util; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.os.Build; -import android.view.View; - -@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) -class SystemUiHelperImplICS extends SystemUiHelperImplHC { - - SystemUiHelperImplICS(Activity activity, int level, int flags, - SystemUiHelper.OnVisibilityChangeListener onVisibilityChangeListener) { - super(activity, level, flags, onVisibilityChangeListener); - } - - @Override - protected int createShowFlags() { - return View.SYSTEM_UI_FLAG_VISIBLE; - } - - @Override - protected int createTestFlags() { - if (mLevel >= SystemUiHelper.LEVEL_LEAN_BACK) { - // Intentionally override test flags. - return View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; - } - - return View.SYSTEM_UI_FLAG_LOW_PROFILE; - } - - @Override - protected int createHideFlags() { - int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE; - - if (mLevel >= SystemUiHelper.LEVEL_LEAN_BACK) { - flag |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; - } - - return flag; - } -} diff --git a/app/src/main/java/com/hippo/util/SystemUiHelperImplJB.java b/app/src/main/java/com/hippo/util/SystemUiHelperImplJB.java deleted file mode 100644 index b49ffec7a..000000000 --- a/app/src/main/java/com/hippo/util/SystemUiHelperImplJB.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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.util; - -import android.annotation.TargetApi; -import android.app.ActionBar; -import android.app.Activity; -import android.os.Build; -import android.view.View; - -@TargetApi(Build.VERSION_CODES.JELLY_BEAN) -class SystemUiHelperImplJB extends SystemUiHelperImplICS { - - SystemUiHelperImplJB(Activity activity, int level, int flags, - SystemUiHelper.OnVisibilityChangeListener onVisibilityChangeListener) { - super(activity, level, flags, onVisibilityChangeListener); - } - - @Override - protected int createShowFlags() { - int flag = super.createShowFlags(); - - if (mLevel >= SystemUiHelper.LEVEL_HIDE_STATUS_BAR) { - flag |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; - - if (mLevel >= SystemUiHelper.LEVEL_LEAN_BACK) { - flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; - } - } - - return flag; - } - - @Override - protected int createHideFlags() { - int flag = super.createHideFlags(); - - if (mLevel >= SystemUiHelper.LEVEL_HIDE_STATUS_BAR) { - flag |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_FULLSCREEN; - - if (mLevel >= SystemUiHelper.LEVEL_LEAN_BACK) { - flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; - } - } - - return flag; - } - - @Override - protected void onSystemUiShown() { - if (mLevel == SystemUiHelper.LEVEL_LOW_PROFILE) { - // Manually show the action bar when in low profile mode. - ActionBar ab = mActivity.getActionBar(); - if (ab != null) { - ab.show(); - } - } - - setIsShowing(true); - } - - @Override - protected void onSystemUiHidden() { - if (mLevel == SystemUiHelper.LEVEL_LOW_PROFILE) { - // Manually hide the action bar when in low profile mode. - ActionBar ab = mActivity.getActionBar(); - if (ab != null) { - ab.hide(); - } - } - - setIsShowing(false); - } -} diff --git a/app/src/main/java/com/hippo/util/SystemUiHelperImplKK.java b/app/src/main/java/com/hippo/util/SystemUiHelperImplKK.java deleted file mode 100644 index 4198bf322..000000000 --- a/app/src/main/java/com/hippo/util/SystemUiHelperImplKK.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * 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.util; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.os.Build; -import android.view.View; - -@TargetApi(Build.VERSION_CODES.KITKAT) -class SystemUiHelperImplKK extends SystemUiHelperImplJB { - - SystemUiHelperImplKK(Activity activity, int level, int flags, - SystemUiHelper.OnVisibilityChangeListener onVisibilityChangeListener) { - super(activity, level, flags, onVisibilityChangeListener); - } - - @Override - protected int createHideFlags() { - int flag = super.createHideFlags(); - - if (mLevel == SystemUiHelper.LEVEL_IMMERSIVE) { - // If the client requested immersive mode, and we're on Android 4.4 - // or later, add relevant flags. Applying HIDE_NAVIGATION without - // IMMERSIVE prevents the activity from accepting all touch events, - // so we only do this on Android 4.4 and later (where IMMERSIVE is - // present). - flag |= ((mFlags & SystemUiHelper.FLAG_IMMERSIVE_STICKY) != 0) - ? View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - : View.SYSTEM_UI_FLAG_IMMERSIVE; - } - - return flag; - } - -}