mirror of https://github.com/NekoX-Dev/NekoX.git
331 lines
14 KiB
Java
331 lines
14 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Paint;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffColorFilter;
|
|
import android.graphics.RectF;
|
|
import android.view.Gravity;
|
|
import android.view.HapticFeedbackConstants;
|
|
import android.view.View;
|
|
import android.widget.FrameLayout;
|
|
|
|
import androidx.core.graphics.ColorUtils;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.messenger.LocaleController;
|
|
import org.telegram.messenger.MessagesController;
|
|
import org.telegram.messenger.R;
|
|
import org.telegram.messenger.SharedConfig;
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
|
|
public class SwipeGestureSettingsView extends FrameLayout {
|
|
|
|
public static final int SWIPE_GESTURE_PIN = 0;
|
|
public static final int SWIPE_GESTURE_READ = 1;
|
|
public static final int SWIPE_GESTURE_ARCHIVE = 2;
|
|
public static final int SWIPE_GESTURE_MUTE = 3;
|
|
public static final int SWIPE_GESTURE_DELETE = 4;
|
|
public static final int SWIPE_GESTURE_FOLDERS = 5;
|
|
|
|
Paint outlinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
Paint filledPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
Paint linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
Paint pickerDividersPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
|
|
RectF rect = new RectF();
|
|
|
|
private NumberPicker picker;
|
|
|
|
String[] strings = new String[6];
|
|
String[] backgroundKeys = new String[6];
|
|
RLottieDrawable[] icons = new RLottieDrawable[6];
|
|
|
|
int currentIconIndex;
|
|
RLottieImageView[] iconViews = new RLottieImageView[2];
|
|
|
|
boolean hasTabs;
|
|
float progressToSwipeFolders;
|
|
float colorProgress = 1f;
|
|
int fromColor;
|
|
String currentColorKey;
|
|
|
|
|
|
public SwipeGestureSettingsView(Context context, int currentAccount) {
|
|
super(context);
|
|
|
|
strings[SWIPE_GESTURE_PIN] = LocaleController.getString("SwipeSettingsPin", R.string.SwipeSettingsPin);
|
|
strings[SWIPE_GESTURE_READ] = LocaleController.getString("SwipeSettingsRead", R.string.SwipeSettingsRead);
|
|
strings[SWIPE_GESTURE_ARCHIVE] = LocaleController.getString("SwipeSettingsArchive", R.string.SwipeSettingsArchive);
|
|
strings[SWIPE_GESTURE_MUTE] = LocaleController.getString("SwipeSettingsMute", R.string.SwipeSettingsMute);
|
|
strings[SWIPE_GESTURE_DELETE] = LocaleController.getString("SwipeSettingsDelete", R.string.SwipeSettingsDelete);
|
|
strings[SWIPE_GESTURE_FOLDERS] = LocaleController.getString("SwipeSettingsFolders", R.string.SwipeSettingsFolders);
|
|
|
|
backgroundKeys[SWIPE_GESTURE_PIN] = Theme.key_chats_archiveBackground;
|
|
backgroundKeys[SWIPE_GESTURE_READ] = Theme.key_chats_archiveBackground;
|
|
backgroundKeys[SWIPE_GESTURE_ARCHIVE] = Theme.key_chats_archiveBackground;
|
|
backgroundKeys[SWIPE_GESTURE_MUTE] = Theme.key_chats_archiveBackground;
|
|
backgroundKeys[SWIPE_GESTURE_DELETE] = Theme.key_dialogSwipeRemove;
|
|
backgroundKeys[SWIPE_GESTURE_FOLDERS] = Theme.key_chats_archivePinBackground;
|
|
|
|
outlinePaint.setStyle(Paint.Style.STROKE);
|
|
outlinePaint.setStrokeWidth(AndroidUtilities.dp(1));
|
|
|
|
linePaint.setStyle(Paint.Style.STROKE);
|
|
linePaint.setStrokeCap(Paint.Cap.ROUND);
|
|
linePaint.setStrokeWidth(AndroidUtilities.dp(5));
|
|
|
|
pickerDividersPaint.setStyle(Paint.Style.STROKE);
|
|
pickerDividersPaint.setStrokeCap(Paint.Cap.ROUND);
|
|
pickerDividersPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
|
|
|
picker = new NumberPicker(context, 13) {
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
super.onDraw(canvas);
|
|
float y = AndroidUtilities.dp(31);
|
|
pickerDividersPaint.setColor(Theme.getColor(Theme.key_radioBackgroundChecked));
|
|
canvas.drawLine(AndroidUtilities.dp(2), y, getMeasuredWidth() - AndroidUtilities.dp(2), y, pickerDividersPaint);
|
|
|
|
y = getMeasuredHeight() - AndroidUtilities.dp(31);
|
|
canvas.drawLine(AndroidUtilities.dp(2), y, getMeasuredWidth() - AndroidUtilities.dp(2), y, pickerDividersPaint);
|
|
}
|
|
};
|
|
picker.setMinValue(0);
|
|
picker.setDrawDividers(false);
|
|
hasTabs = !MessagesController.getInstance(currentAccount).dialogFilters.isEmpty();
|
|
picker.setMaxValue(hasTabs ? strings.length - 1 : strings.length - 2);
|
|
picker.setFormatter(value -> strings[value]);
|
|
picker.setOnValueChangedListener((picker, oldVal, newVal) -> {
|
|
swapIcons();
|
|
|
|
SharedConfig.updateChatListSwipeSetting(newVal);
|
|
invalidate();
|
|
picker.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
|
|
});
|
|
|
|
picker.setValue(SharedConfig.getChatSwipeAction(currentAccount));
|
|
|
|
addView(picker, LayoutHelper.createFrame(132, LayoutHelper.MATCH_PARENT, Gravity.RIGHT, 21, 0, 21, 0));
|
|
|
|
setWillNotDraw(false);
|
|
|
|
currentIconIndex = 0;
|
|
for (int i = 0; i < 2; i++) {
|
|
iconViews[i] = new RLottieImageView(context);
|
|
addView(iconViews[i], LayoutHelper.createFrame(28, 28, Gravity.CENTER_VERTICAL | Gravity.RIGHT, 0, 0, 132 + 21 + 21 + 10, 0));
|
|
}
|
|
|
|
RLottieDrawable currentIcon = getIcon(picker.getValue());
|
|
if (currentIcon != null) {
|
|
iconViews[0].setImageDrawable(currentIcon);
|
|
currentIcon.setCurrentFrame(currentIcon.getFramesCount() - 1);
|
|
}
|
|
AndroidUtilities.updateViewVisibilityAnimated(iconViews[0], true, 0.5f, false);
|
|
AndroidUtilities.updateViewVisibilityAnimated(iconViews[1], false, 0.5f, false);
|
|
|
|
progressToSwipeFolders = picker.getValue() == SWIPE_GESTURE_FOLDERS ? 1f : 0;
|
|
currentIconValue = picker.getValue();
|
|
|
|
}
|
|
|
|
int currentIconValue;
|
|
Runnable swapIconRunnable;
|
|
private void swapIcons() {
|
|
if (swapIconRunnable != null) {
|
|
return;
|
|
}
|
|
int newValue = picker.getValue();
|
|
if (currentIconValue != newValue) {
|
|
currentIconValue = newValue;
|
|
int nextIconIndex = (currentIconIndex + 1) % 2;
|
|
RLottieDrawable drawable = getIcon(newValue);
|
|
if (drawable != null) {
|
|
if (iconViews[nextIconIndex].getVisibility() != View.VISIBLE) {
|
|
drawable.setCurrentFrame(0, false);
|
|
}
|
|
iconViews[nextIconIndex].setAnimation(drawable);
|
|
iconViews[nextIconIndex].playAnimation();
|
|
} else {
|
|
iconViews[nextIconIndex].clearAnimationDrawable();
|
|
}
|
|
AndroidUtilities.updateViewVisibilityAnimated(iconViews[currentIconIndex], false, 0.5f, true);
|
|
AndroidUtilities.updateViewVisibilityAnimated(iconViews[nextIconIndex], true, 0.5f, true);
|
|
currentIconIndex = nextIconIndex;
|
|
|
|
AndroidUtilities.runOnUIThread(swapIconRunnable = () -> {
|
|
swapIconRunnable = null;
|
|
swapIcons();
|
|
}, 150);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(102), MeasureSpec.EXACTLY));
|
|
}
|
|
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
super.onDraw(canvas);
|
|
|
|
boolean changeFolder = picker.getValue() == SWIPE_GESTURE_FOLDERS;
|
|
|
|
if (changeFolder && progressToSwipeFolders != 1f) {
|
|
progressToSwipeFolders += 16 / 300f;
|
|
if (progressToSwipeFolders > 1f) {
|
|
progressToSwipeFolders = 1f;
|
|
} else {
|
|
iconViews[0].invalidate();
|
|
iconViews[1].invalidate();
|
|
invalidate();
|
|
}
|
|
} else if (!changeFolder && progressToSwipeFolders != 0) {
|
|
progressToSwipeFolders -= 16 / 300f;
|
|
if (progressToSwipeFolders < 0f) {
|
|
progressToSwipeFolders = 0f;
|
|
} else {
|
|
iconViews[0].invalidate();
|
|
iconViews[1].invalidate();
|
|
invalidate();
|
|
}
|
|
}
|
|
outlinePaint.setColor(Theme.getColor(Theme.key_switchTrack));
|
|
|
|
linePaint.setColor(Theme.getColor(Theme.key_switchTrack));
|
|
|
|
int right = getMeasuredWidth() - (AndroidUtilities.dp(132) + AndroidUtilities.dp(21) + AndroidUtilities.dp(16));
|
|
int left = AndroidUtilities.dp(21);
|
|
|
|
int verticalPadding = (getMeasuredHeight() - AndroidUtilities.dp(48)) / 2;
|
|
|
|
rect.set(left, verticalPadding, right, getMeasuredHeight() - verticalPadding);
|
|
|
|
|
|
int color;
|
|
if (currentColorKey == null) {
|
|
currentColorKey = backgroundKeys[picker.getValue()];
|
|
colorProgress = 1f;
|
|
color = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(currentColorKey), 0.9f);
|
|
fromColor = color;
|
|
} else if (!backgroundKeys[picker.getValue()].equals(currentColorKey)) {
|
|
fromColor = ColorUtils.blendARGB(fromColor, ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(currentColorKey), 0.9f), colorProgress);
|
|
colorProgress = 0;
|
|
currentColorKey = backgroundKeys[picker.getValue()];
|
|
}
|
|
|
|
if (colorProgress != 1f) {
|
|
colorProgress += 16 / 100f;
|
|
if (colorProgress > 1f) {
|
|
colorProgress = 1f;
|
|
} else {
|
|
invalidate();
|
|
}
|
|
}
|
|
|
|
color = ColorUtils.blendARGB(fromColor, ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(currentColorKey), 0.9f), colorProgress);
|
|
|
|
filledPaint.setColor(color);
|
|
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), filledPaint);
|
|
|
|
filledPaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite));
|
|
filledPaint.setAlpha(255);
|
|
|
|
|
|
//
|
|
// float y = rect.centerY() - AndroidUtilities.dp(6);
|
|
// linePaint.setAlpha((int) (57 * progressToSwipeFolders));
|
|
// canvas.drawLine(rect.left + AndroidUtilities.dp(23) + AndroidUtilities.dp(15 + 8), y, rect.right - AndroidUtilities.dp(50), y, linePaint);
|
|
//
|
|
// y = rect.centerY() + AndroidUtilities.dp(6);
|
|
// canvas.drawLine(rect.left + AndroidUtilities.dp(23) + AndroidUtilities.dp(15 + 8), y, rect.right - AndroidUtilities.dp(16), y, linePaint);
|
|
// //
|
|
|
|
// rect.set(left, verticalPadding, right - AndroidUtilities.dp(58) * (1f - progressToSwipeFolders), getMeasuredHeight() - verticalPadding);
|
|
rect.set(left, verticalPadding, right - AndroidUtilities.dp(58), getMeasuredHeight() - verticalPadding);
|
|
|
|
rect.inset(-AndroidUtilities.dp(1), -AndroidUtilities.dp(1));
|
|
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), filledPaint);
|
|
outlinePaint.setAlpha(31);
|
|
canvas.drawRoundRect(rect, AndroidUtilities.dp(6), AndroidUtilities.dp(6), outlinePaint);
|
|
//
|
|
canvas.save();
|
|
canvas.clipRect(rect);
|
|
|
|
// float leftOffset = AndroidUtilities.dp(15 + 8) * progressToSwipeFolders;
|
|
float leftOffset = 0;
|
|
|
|
filledPaint.setColor(Theme.getColor(Theme.key_switchTrack));
|
|
filledPaint.setAlpha(60);
|
|
canvas.drawCircle(rect.left + leftOffset, rect.centerY(), AndroidUtilities.dp(15), filledPaint);
|
|
|
|
float y = rect.centerY() - AndroidUtilities.dp(6);
|
|
linePaint.setAlpha(57);
|
|
canvas.drawLine(rect.left + AndroidUtilities.dp(23) + leftOffset, y, rect.right - AndroidUtilities.dp(68), y, linePaint);
|
|
|
|
y = rect.centerY() + AndroidUtilities.dp(6);
|
|
canvas.drawLine(rect.left + AndroidUtilities.dp(23) + leftOffset, y, rect.right - AndroidUtilities.dp(23), y, linePaint);
|
|
canvas.restore();
|
|
}
|
|
|
|
public RLottieDrawable getIcon(int i) {
|
|
if (icons[i] == null) {
|
|
int rawId;
|
|
switch (i) {
|
|
default:
|
|
case SWIPE_GESTURE_PIN:
|
|
rawId = R.raw.swipe_pin;
|
|
break;
|
|
case SWIPE_GESTURE_ARCHIVE:
|
|
rawId = R.raw.chats_archive;
|
|
break;
|
|
case SWIPE_GESTURE_DELETE:
|
|
rawId = R.raw.swipe_delete;
|
|
break;
|
|
case SWIPE_GESTURE_MUTE:
|
|
rawId = R.raw.swipe_mute;
|
|
break;
|
|
case SWIPE_GESTURE_READ:
|
|
rawId = R.raw.swipe_read;
|
|
break;
|
|
case SWIPE_GESTURE_FOLDERS:
|
|
rawId = R.raw.swipe_disabled;
|
|
break;
|
|
}
|
|
icons[i] = new RLottieDrawable(rawId, "" + rawId, AndroidUtilities.dp(28), AndroidUtilities.dp(28), true, null);
|
|
updateIconColor(i);
|
|
}
|
|
|
|
return icons[i];
|
|
}
|
|
|
|
public void updateIconColor(int i) {
|
|
if (icons[i] != null) {
|
|
int backgroundColor = ColorUtils.blendARGB(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(Theme.key_chats_archiveBackground), 0.9f);//Theme.getColor(Theme.key_chats_archiveBackground);
|
|
int iconColor = Theme.getColor(Theme.key_chats_archiveIcon);
|
|
if (i == SWIPE_GESTURE_ARCHIVE) {
|
|
icons[i].setLayerColor("Arrow.**", backgroundColor);
|
|
icons[i].setLayerColor("Box2.**",iconColor);
|
|
icons[i].setLayerColor("Box1.**",iconColor);
|
|
} else {
|
|
icons[i].setColorFilter(new PorterDuffColorFilter(iconColor, PorterDuff.Mode.MULTIPLY));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void updateColors() {
|
|
for(int i = 0; i < icons.length; i++) {
|
|
updateIconColor(i);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setBackgroundColor(int color) {
|
|
super.setBackgroundColor(color);
|
|
updateColors();
|
|
picker.setTextColor(Theme.getColor(Theme.key_dialogTextBlack));
|
|
picker.invalidate();
|
|
}
|
|
}
|