NekoX/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/INavigationLayout.java

389 lines
14 KiB
Java

package org.telegram.ui.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import org.telegram.messenger.SharedConfig;
import org.telegram.ui.Components.BackButtonMenu;
import org.telegram.ui.LNavigation.LNavigation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public interface INavigationLayout {
int REBUILD_FLAG_REBUILD_LAST = 1, REBUILD_FLAG_REBUILD_ONLY_LAST = 2;
boolean presentFragment(NavigationParams params);
boolean checkTransitionAnimation();
boolean addFragmentToStack(BaseFragment fragment, int position);
void removeFragmentFromStack(BaseFragment fragment);
List<BaseFragment> getFragmentStack();
void setDelegate(INavigationLayoutDelegate INavigationLayoutDelegate);
void closeLastFragment(boolean animated, boolean forceNoAnimation);
DrawerLayoutContainer getDrawerLayoutContainer();
void setDrawerLayoutContainer(DrawerLayoutContainer drawerLayoutContainer);
void setRemoveActionBarExtraHeight(boolean removeExtraHeight);
void setTitleOverlayText(String title, int titleId, Runnable action);
void animateThemedValues(ThemeAnimationSettings settings, Runnable onDone);
float getThemeAnimationValue();
void setFragmentStackChangedListener(Runnable onFragmentStackChanged);
boolean isTransitionAnimationInProgress();
void resumeDelayedFragmentAnimation();
boolean isInPassivePreviewMode();
void setInBubbleMode(boolean bubbleMode);
boolean isInBubbleMode();
boolean isInPreviewMode();
boolean isPreviewOpenAnimationInProgress();
void movePreviewFragment(float dy);
void expandPreviewFragment();
void finishPreviewFragment();
void setFragmentPanTranslationOffset(int offset);
ViewGroup getOverlayContainerView();
void setHighlightActionButtons(boolean highlight);
float getCurrentPreviewFragmentAlpha();
void drawCurrentPreviewFragment(Canvas canvas, Drawable foregroundDrawable);
void drawHeaderShadow(Canvas canvas, int alpha, int y);
boolean isSwipeInProgress();
void onPause();
void onResume();
void onBackPressed();
void onUserLeaveHint();
void onLowMemory();
boolean extendActionMode(Menu menu);
void onActionModeStarted(Object mode);
void onActionModeFinished(Object mode);
void startActivityForResult(Intent intent, int requestCode);
// TODO: Migrate them to be out of navigation layout
Theme.MessageDrawable getMessageDrawableOutStart();
Theme.MessageDrawable getMessageDrawableOutMediaStart();
// TODO: Make something like FieldsContainer and put them there?
List<BackButtonMenu.PulledDialog> getPulledDialogs();
void setPulledDialogs(List<BackButtonMenu.PulledDialog> pulledDialogs);
static INavigationLayout newLayout(Context context) {
return SharedConfig.useLNavigation ? new LNavigation(context) : new ActionBarLayout(context);
}
default boolean isActionBarInCrossfade() {
return false;
}
default boolean hasIntegratedBlurInPreview() {
return false;
}
default void rebuildFragments(int flags) {
if ((flags & REBUILD_FLAG_REBUILD_ONLY_LAST) != 0) {
showLastFragment();
return;
}
boolean last = (flags & REBUILD_FLAG_REBUILD_LAST) != 0;
rebuildAllFragmentViews(last, last);
}
default void setBackgroundView(View backgroundView) {
// Not always required
}
default void setUseAlphaAnimations(boolean useAlphaAnimations) {
// Not always required
}
/**
* @deprecated Should be replaced with {@link INavigationLayout#rebuildFragments(int)}
*/
@Deprecated
default void rebuildLogout() {
// No-op usually, can contain hackfixes
}
/**
* @deprecated Should be replaced with {@link INavigationLayout#rebuildFragments(int)}
*/
@Deprecated
default void showLastFragment() {}
/**
* @deprecated Should be replaced with {@link INavigationLayout#rebuildFragments(int)}
*/
@Deprecated
default void rebuildAllFragmentViews(boolean last, boolean showLastAfter) {}
default void drawHeaderShadow(Canvas canvas, int y) {
drawHeaderShadow(canvas, 0xFF, y);
}
default BaseFragment getBackgroundFragment() {
return getFragmentStack().size() <= 1 ? null : getFragmentStack().get(getFragmentStack().size() - 2);
}
default BaseFragment getLastFragment() {
return getFragmentStack().isEmpty() ? null : getFragmentStack().get(getFragmentStack().size() - 1);
}
default void animateThemedValues(Theme.ThemeInfo theme, int accentId, boolean nightTheme, boolean instant) {
animateThemedValues(new ThemeAnimationSettings(theme, accentId, nightTheme, instant), null);
}
default void animateThemedValues(Theme.ThemeInfo theme, int accentId, boolean nightTheme, boolean instant, Runnable onDone) {
animateThemedValues(new ThemeAnimationSettings(theme, accentId, nightTheme, instant), onDone);
}
/**
* @deprecated Deprecated in favor of {@link INavigationLayout#bringToFront(int)}
*/
@Deprecated
default void showFragment(int i) {
bringToFront(i);
}
default void bringToFront(int i) {
BaseFragment fragment = getFragmentStack().get(i);
removeFragmentFromStack(fragment);
addFragmentToStack(fragment);
rebuildFragments(REBUILD_FLAG_REBUILD_ONLY_LAST);
}
default void removeAllFragments() {
for (BaseFragment fragment : new ArrayList<>(getFragmentStack())) {
removeFragmentFromStack(fragment);
}
}
default Activity getParentActivity() {
Context ctx = getView().getContext();
if (ctx instanceof Activity) {
return (Activity) ctx;
}
throw new IllegalArgumentException("NavigationLayout added in non-activity context!");
}
default ViewGroup getView() {
if (this instanceof ViewGroup) {
return (ViewGroup) this;
}
throw new IllegalArgumentException("You should override getView() if you're not inheriting from it.");
}
default void closeLastFragment() {
closeLastFragment(true);
}
default void closeLastFragment(boolean animated) {
closeLastFragment(animated, false);
}
default void setFragmentStack(List<BaseFragment> stack) {
init(stack);
}
/**
* @deprecated This method was replaced with {@link INavigationLayout#setFragmentStack(List)}
*/
@Deprecated
default void init(List<BaseFragment> stack) {
throw new RuntimeException("Neither setFragmentStack(...) or init(...) were overriden!");
}
default void removeFragmentFromStack(int i) {
if (i < 0 || i >= getFragmentStack().size()) {
return;
}
removeFragmentFromStack(getFragmentStack().get(i));
}
default boolean addFragmentToStack(BaseFragment fragment) {
return addFragmentToStack(fragment, -1);
}
default boolean presentFragment(BaseFragment fragment) {
return presentFragment(new NavigationParams(fragment));
}
default boolean presentFragment(BaseFragment fragment, boolean removeLast) {
return presentFragment(new NavigationParams(fragment).setRemoveLast(removeLast));
}
default boolean presentFragmentAsPreview(BaseFragment fragment) {
return presentFragment(new NavigationParams(fragment).setPreview(true));
}
default boolean presentFragmentAsPreviewWithMenu(BaseFragment fragment, ActionBarPopupWindow.ActionBarPopupWindowLayout menuView) {
return presentFragment(new NavigationParams(fragment).setPreview(true).setMenuView(menuView));
}
/**
* @deprecated You should use {@link INavigationLayout.NavigationParams} for advanced params
*/
@Deprecated
default boolean presentFragment(BaseFragment fragment, boolean removeLast, boolean forceWithoutAnimation, boolean check, boolean preview) {
return presentFragment(new NavigationParams(fragment).setRemoveLast(removeLast).setNoAnimation(forceWithoutAnimation).setCheckPresentFromDelegate(check).setPreview(preview));
}
/**
* @deprecated You should use {@link INavigationLayout.NavigationParams} for advanced params
*/
@Deprecated
default boolean presentFragment(BaseFragment fragment, boolean removeLast, boolean forceWithoutAnimation, boolean check, boolean preview, ActionBarPopupWindow.ActionBarPopupWindowLayout menuView) {
return presentFragment(new NavigationParams(fragment).setRemoveLast(removeLast).setNoAnimation(forceWithoutAnimation).setCheckPresentFromDelegate(check).setPreview(preview).setMenuView(menuView));
}
default void dismissDialogs() {
List<BaseFragment> fragmentsStack = getFragmentStack();
if (!fragmentsStack.isEmpty()) {
BaseFragment lastFragment = fragmentsStack.get(fragmentsStack.size() - 1);
lastFragment.dismissCurrentDialog();
}
}
interface INavigationLayoutDelegate {
default boolean needPresentFragment(INavigationLayout layout, NavigationParams params) {
return needPresentFragment(params.fragment, params.removeLast, params.noAnimation, layout);
}
/**
* @deprecated You should override {@link INavigationLayoutDelegate#needPresentFragment(INavigationLayout, NavigationParams)} for more fields
*/
default boolean needPresentFragment(BaseFragment fragment, boolean removeLast, boolean forceWithoutAnimation, INavigationLayout layout) {
return true;
}
default boolean needAddFragmentToStack(BaseFragment fragment, INavigationLayout layout) {
return true;
}
default boolean onPreIme() {
return false;
}
default boolean needCloseLastFragment(INavigationLayout layout) {
return true;
}
default void onMeasureOverride(int[] measureSpec) {}
default void onRebuildAllFragments(INavigationLayout layout, boolean last) {}
default void onThemeProgress(float progress) {}
}
class NavigationParams {
public BaseFragment fragment;
public boolean removeLast;
public boolean noAnimation;
public boolean checkPresentFromDelegate = true;
public boolean preview;
public ActionBarPopupWindow.ActionBarPopupWindowLayout menuView;
public boolean needDelayWithoutAnimation;
public boolean isFromDelay;
public boolean delayDone;
public NavigationParams(BaseFragment fragment) {
this.fragment = fragment;
}
public NavigationParams setRemoveLast(boolean removeLast) {
this.removeLast = removeLast;
return this;
}
public NavigationParams setNoAnimation(boolean noAnimation) {
this.noAnimation = noAnimation;
return this;
}
public NavigationParams setCheckPresentFromDelegate(boolean checkPresentFromDelegate) {
this.checkPresentFromDelegate = checkPresentFromDelegate;
return this;
}
public NavigationParams setPreview(boolean preview) {
this.preview = preview;
return this;
}
public NavigationParams setMenuView(ActionBarPopupWindow.ActionBarPopupWindowLayout menuView) {
this.menuView = menuView;
return this;
}
public NavigationParams setNeedDelayWithoutAnimation(boolean needDelayWithoutAnimation) {
this.needDelayWithoutAnimation = needDelayWithoutAnimation;
return this;
}
}
class ThemeAnimationSettings {
public final Theme.ThemeInfo theme;
public final int accentId;
public final boolean nightTheme;
public final boolean instant;
public boolean onlyTopFragment;
public boolean applyTheme = true;
public Runnable afterStartDescriptionsAddedRunnable;
public Runnable beforeAnimationRunnable;
public Runnable afterAnimationRunnable;
public onAnimationProgress animationProgress;
public long duration = 200;
public Theme.ResourcesProvider resourcesProvider;
public ThemeAnimationSettings(Theme.ThemeInfo theme, int accentId, boolean nightTheme, boolean instant) {
this.theme = theme;
this.accentId = accentId;
this.nightTheme = nightTheme;
this.instant = instant;
}
public interface onAnimationProgress {
void setProgress(float p);
}
}
class StartColorsProvider implements Theme.ResourcesProvider {
HashMap<String, Integer> colors = new HashMap<>();
String[] keysToSave = new String[] {
Theme.key_chat_outBubble,
Theme.key_chat_outBubbleGradient1,
Theme.key_chat_outBubbleGradient2,
Theme.key_chat_outBubbleGradient3,
Theme.key_chat_outBubbleGradientAnimated,
Theme.key_chat_outBubbleShadow
};
@Override
public Integer getColor(String key) {
return colors.get(key);
}
@Override
public Integer getCurrentColor(String key) {
return colors.get(key);
}
public void saveColors(Theme.ResourcesProvider fragmentResourceProvider) {
colors.clear();
for (String key : keysToSave) {
colors.put(key, fragmentResourceProvider.getCurrentColor(key));
}
}
}
enum BackButtonState {
BACK,
MENU
}
}