/*
* Overchan Android (Meta Imageboard Client)
* Copyright (C) 2014-2016 miku-nyan <https://github.com/miku-nyan>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package nya.miku.wishmaster.ui.gallery;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import nya.miku.wishmaster.R;
import nya.miku.wishmaster.common.Async;
import nya.miku.wishmaster.ui.AppearanceUtils;
import nya.miku.wishmaster.ui.theme.ThemeUtils;
public class GalleryFullscreen {
public static final int DELAY = 2000;
public static void initFullscreen(GalleryActivity activity) {
activity.setFullscreenCallback(new GalleryFullscreenImpl(activity));
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static class GalleryFullscreenImpl implements View.OnSystemUiVisibilityChangeListener, GalleryActivity.FullscreenCallback {
@SuppressLint("InlinedApi")
private static final int SYSTEM_UI_VISIBLE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ?
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN :
View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
@SuppressLint("InlinedApi")
private static final int SYSTEM_UI_HIDDEN = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ?
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE |
View.SYSTEM_UI_FLAG_LOW_PROFILE :
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_LOW_PROFILE;
private final Window window;
private final View decorView;
private final ActionBar actionBar;
private ViewGroup galleryNavbarView;
private View navbarOverlay;
private volatile long lastTouchEvent = 0;
private volatile boolean isLocked = false;
private GalleryFullscreenImpl(Activity activity) {
window = activity.getWindow();
decorView = activity.getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(this);
actionBar = activity.getActionBar();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
int color = ThemeUtils.getThemeColor(activity.getTheme(), R.attr.materialPrimary, Color.WHITE);
actionBar.setBackgroundDrawable(new ColorDrawable(color & Color.argb(192, 255, 255, 255)));
}
galleryNavbarView = (ViewGroup) activity.findViewById(R.id.gallery_navigation_bar_container);
galleryNavbarView.setAlpha(0.75f);
setTranslucentPanels();
showUI(true);
fixNavbarOverlay();
}
private final Runnable fixNavbarOverlayRunnable = new Runnable() {
@Override
public void run() {
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
int overlayHeight = decorView.getHeight() - rect.bottom;
if (overlayHeight > 0) {
if (navbarOverlay != null) {
if (!Integer.valueOf(overlayHeight).equals(navbarOverlay.getTag())) {
navbarOverlay.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, overlayHeight));
navbarOverlay.setTag(overlayHeight);
}
navbarOverlay.setVisibility(View.VISIBLE);
} else {
navbarOverlay = new View(galleryNavbarView.getContext());
navbarOverlay.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, overlayHeight));
navbarOverlay.setTag(overlayHeight);
galleryNavbarView.addView(navbarOverlay);
}
} else {
if (navbarOverlay != null) {
navbarOverlay.setVisibility(View.GONE);
}
}
}
};
private void fixNavbarOverlay() {
AppearanceUtils.callWhenLoaded(decorView, fixNavbarOverlayRunnable);
}
@Override
public void onSystemUiVisibilityChange(int visibility) {
fixNavbarOverlay();
boolean visible = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
if (visible) {
setSystemUiVisible();
actionBar.show();
hideUIdelayed();
} else {
actionBar.hide();
}
galleryNavbarView.animate().
alpha(visible ? 0.75f : 0).
translationY(visible ? 0 : galleryNavbarView.getHeight());
}
@Override
public void showUI(boolean hideAfterDelay) {
showUI(hideAfterDelay, false);
}
@Override
public void keepUI(boolean hideAfterDelay) {
showUI(hideAfterDelay, true);
}
private void showUI(boolean hideAfterDelay, boolean onlyKeep) {
if (!onlyKeep) setSystemUiVisible();
if (hideAfterDelay) {
isLocked = false;
lastTouchEvent = System.currentTimeMillis();
hideUIdelayed();
} else {
isLocked = true;
}
}
private final Runnable delayedHideUI = new Runnable() {
@Override
public void run() {
if (isLocked) {
delayedTask = false;
return;
}
long time = System.currentTimeMillis() - lastTouchEvent;
if (time < DELAY) {
Async.runOnUiThreadDelayed(this, DELAY - time);
} else {
setSystemUiHidden();
delayedTask = false;
}
}
};
private boolean delayedTask = false;
private synchronized void hideUIdelayed() {
if (delayedTask) return;
delayedTask = true;
Async.runOnUiThreadDelayed(delayedHideUI, DELAY);
}
private void setSystemUiVisible() {
decorView.setSystemUiVisibility(SYSTEM_UI_VISIBLE);
}
private void setSystemUiHidden() {
decorView.setSystemUiVisibility(SYSTEM_UI_HIDDEN);
}
@TargetApi(Build.VERSION_CODES.KITKAT)
private void setTranslucentPanels() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
}
}