made hook and added images for theme toggle animation

This commit is contained in:
Vologhat
2022-08-25 19:03:29 +03:00
parent 9e9617fd16
commit 2cd856e574
46 changed files with 1186 additions and 0 deletions
@@ -0,0 +1,17 @@
package ru.vtosters.lite.hooks;
import com.vk.extensions.ViewExtKt;
import com.vk.navigation.right.RightMenuPresenter;
import ru.vtosters.lite.ui.views.VTLCheckableButton;
public class DayNightButtonHook {
public static void injectOnClick(VTLCheckableButton button, RightMenuPresenter presenter) {
button.postOnAnimationDelayed(() -> {
var rect = ViewExtKt.e(button);
presenter.a(new float[] { rect.centerX(), rect.centerY() });
}, 550); // minimal delay for fix toggle animation
button.toggle();
}
}
@@ -0,0 +1,95 @@
package ru.vtosters.lite.ui.views;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Checkable;
import androidx.appcompat.widget.AppCompatImageButton;
public class VTLCheckableButton extends AppCompatImageButton implements Checkable {
private boolean mIsChecked;
public VTLCheckableButton(Context context) {
super(context);
}
public VTLCheckableButton(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
}
public VTLCheckableButton(Context context, AttributeSet attributeSet, int i) {
super(context, attributeSet, i);
}
@Override
public Parcelable onSaveInstanceState() {
var state = new CustomState(super.onSaveInstanceState());
state.setChecked(mIsChecked);
return state;
}
@Override
public void onRestoreInstanceState(Parcelable state) {
if (state instanceof CustomState) {
var customState = ((CustomState) state);
super.onRestoreInstanceState(customState.getSuperState());
mIsChecked = customState.isChecked();
return;
}
super.onRestoreInstanceState(state);
}
@Override
public boolean isChecked() {
return this.mIsChecked;
}
@Override
public void setChecked(boolean checked) {
mIsChecked = checked;
refreshDrawableState();
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
return mIsChecked
? View.mergeDrawableStates(super.onCreateDrawableState(extraSpace + 1), new int[] { android.R.attr.state_checked })
: super.onCreateDrawableState(extraSpace);
}
@Override
public void toggle() {
setChecked(!mIsChecked);
}
static class CustomState extends View.BaseSavedState {
private boolean checked;
public CustomState(Parcelable source) {
super(source);
}
public CustomState(Parcel source) {
super(source);
checked = source.readInt() != 0;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(checked ? 1 : 0);
}
}
}
@@ -0,0 +1,70 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import androidx.annotation.ColorRes;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.recyclerview.widget.RecyclerView;
import com.vk.core.dialogs.actionspopup.ActionsPopup;
import com.vk.core.dialogs.adapter.ModalAdapter;
public class VKUIActionPopup {
private final ActionsPopup.b mLocalBuilder;
public VKUIActionPopup(Context context, View anchorView, boolean anchor, @ColorRes int color) {
this.mLocalBuilder = new ActionsPopup.b(anchorView, anchor, color).a(context);
}
public VKUIActionPopup setItem(String title, @Nullable Drawable icon, boolean z, onClickListener clickListener) {
mLocalBuilder.a(title, icon, z, () -> {
clickListener.onClick();
return null;
});
return this;
}
public VKUIActionPopup setItem(String title, @Nullable Drawable icon, onClickListener clickListener) {
return setItem(title, icon, false, clickListener);
}
public VKUIActionPopup setItem(String title, onClickListener clickListener) {
return setItem(title, null, false, clickListener);
}
public VKUIActionPopup setActionCheckIcon(Drawable actionCheckItem) {
mLocalBuilder.a(actionCheckItem);
return this;
}
public VKUIActionPopup setMaxWidth(@Px int maxWidth) {
mLocalBuilder.a(Integer.valueOf(maxWidth));
return this;
}
public VKUIActionPopup setAdapter(ModalAdapter adapter) {
mLocalBuilder.a((ModalAdapter<Object>) adapter);
return this;
}
public VKUIActionPopup setAdapter(RecyclerView.Adapter adapter) {
mLocalBuilder.a(adapter);
return this;
}
public ActionsPopup create() {
return mLocalBuilder.a();
}
public ActionsPopup create(boolean cancel) {
return mLocalBuilder.a(cancel);
}
public interface onClickListener {
void onClick();
}
}
@@ -0,0 +1,55 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.vtosters.lite.R;
public class VKUIButton extends TextView /*Yes, yes, it's TextView*/ {
public static final int STYLE_PRIMARY = R.style.VKUIButton_Primary;
public static final int STYLE_PRIMARY_ROUNDED = R.style.VKUIButton_Primary_Rounded;
public static final int STYLE_PRIMARY_SMALL = R.style.VKUIButton_Primary_Small;
public static final int STYLE_PRIMARY_SMALL_FLAT = R.style.VKUIButton_Primary_Small_Flat;
public static final int STYLE_PRIMARY_MEDIUM = R.style.VKUIButton_Primary_Medium;
public static final int STYLE_PRIMARY_BIG = R.style.VKUIButton_Primary_Big;
public static final int STYLE_SECONDARY = R.style.VKUIButton_Secondary;
public static final int STYLE_SECONDARY_ROUNDED = R.style.VKUIButton_Secondary_Rounded;
public static final int STYLE_SECONDARY_SMALL = R.style.VKUIButton_Secondary_Small;
public static final int STYLE_SECONDARY_SMALL_FLAT = R.style.VKUIButton_Secondary_Small_Flat;
public static final int STYLE_SECONDARY_MEDIUM = R.style.VKUIButton_Secondary_Medium;
public static final int STYLE_SECONDARY_BIG = R.style.VKUIButton_Secondary_Big;
public static final int STYLE_MUTED = R.style.VKUIButton_Muted;
public static final int STYLE_MUTED_ROUNDED = R.style.VKUIButton_Muted_Rounded;
public static final int STYLE_TERTIARY = R.style.VKUIButton_Tertiary;
public static final int STYLE_TERTIARY_ROUNDED = R.style.VKUIButton_Tertiary_Rounded;
public static final int STYLE_OUTLINE = R.style.VKUIButton_Outline;
public static final int STYLE_OUTLINE_WHITE = R.style.VKUIButton_Outline_White;
public static final int STYLE_GREEN = R.style.VKUIButton_Green;
public static final int STYLE_COMMERCE = STYLE_GREEN;
public static final int STYLE_FLAT = R.style.VKUIButton_Flat;
public static final int STYLE_WHITE = R.style.VKUIButton_White;
public static final int STYLE_MEDIA_OVERLAY = R.style.VKUIButton_MediaOverlay;
public static final int STYLE_SELECTABLE = R.style.VKUIButton_Selectable;
public static final int STYLE_SELECTABLE_FLAT = R.style.VKUIButton_Selectable_Flat;
public VKUIButton(Context context) {
this(context, STYLE_PRIMARY);
}
public VKUIButton(Context context, int style) {
super(new ContextThemeWrapper(context, style));
}
public VKUIButton(Context context, @Nullable AttributeSet attrs) {
super(new ContextThemeWrapper(context, STYLE_PRIMARY), attrs);
}
public VKUIButton(Context context, @Nullable AttributeSet attrs, int style) {
super(new ContextThemeWrapper(context, style), attrs);
}
}
@@ -0,0 +1,24 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.CheckBox;
public class VKUICheckBox extends CheckBox {
public VKUICheckBox(Context context) {
super(context);
}
public VKUICheckBox(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VKUICheckBox(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public VKUICheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
@@ -0,0 +1,77 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.EditText;
import androidx.annotation.Nullable;
import com.vk.core.drawable.VkUiDrawableHelper;
import com.vk.core.ui.themes.VKThemeHelper;
import com.vtosters.lite.R;
import ru.vtosters.lite.res.VTLColors;
public class VKUIEditText extends EditText {
public VKUIEditText(Context context) {
super(context);
init();
}
public VKUIEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public VKUIEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public VKUIEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
var fieldBackground = VKThemeHelper.d(R.attr.field_background);
var drawable = VkUiDrawableHelper.c.a(getContext(), fieldBackground, fieldBackground, VTLColors.getAccentColor(), fieldBackground);
setBackground(drawable);
}
@Override
public final void setBackground(Drawable background) {
super.setBackground(background);
}
@Override
public final void setBackgroundColor(int color) {
}
@Override
public final void setBackgroundResource(int resid) {
}
@Override
public void setCursorVisible(boolean visible) {
super.setCursorVisible(visible);
}
@Nullable
@Override
public Drawable getTextCursorDrawable() {
return super.getTextCursorDrawable();
}
@Override
public void setTextCursorDrawable(int textCursorDrawable) {
super.setTextCursorDrawable(textCursorDrawable);
}
@Override
public void setTextCursorDrawable(@Nullable Drawable textCursorDrawable) {
super.setTextCursorDrawable(textCursorDrawable);
}
}
@@ -0,0 +1,18 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import androidx.appcompat.widget.AppCompatRadioButton;
public class VKUIRadioCheckbox extends AppCompatRadioButton {
public VKUIRadioCheckbox(Context context) {
super(new ContextThemeWrapper(context, android.R.style.Widget_CompoundButton_RadioButton));
}
public VKUIRadioCheckbox(Context context, AttributeSet attributeSet) {
super(new ContextThemeWrapper(context, android.R.style.Widget_CompoundButton_RadioButton), attributeSet);
}
}
@@ -0,0 +1,83 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.Window;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment;
import com.vk.core.dialogs.snackbar.VkSnackbar;
public class VKUISnackbar {
private VkSnackbar.a mLocalBuilder;
public VKUISnackbar(Context context, boolean darkMode) {
this.mLocalBuilder = new VkSnackbar.a(context, darkMode);
}
public VKUISnackbar setIcon(Drawable icon) {
mLocalBuilder.a(icon);
return this;
}
public VKUISnackbar setIcon(@DrawableRes int iconId) {
mLocalBuilder.b(iconId);
return this;
}
public VKUISnackbar setMessage(String message) {
mLocalBuilder.a((CharSequence) message);
return this;
}
public VKUISnackbar setMessage(@StringRes int resId) {
mLocalBuilder.a(resId);
return this;
}
public VKUISnackbar setShowTime(long time) {
mLocalBuilder.a(time);
return this;
}
public VKUISnackbar setView(View anchorView) {
mLocalBuilder.a(anchorView);
return this;
}
public VKUISnackbar setFragment(Fragment fragment) {
mLocalBuilder.a(fragment);
return this;
}
public VKUISnackbar setActionButton(String text, OnClickListener clickListener) {
mLocalBuilder.a(text, vkSnackbar -> {
clickListener.onClick(vkSnackbar);
return null;
});
return this;
}
public VKUISnackbar setActionButton(@StringRes int textId, OnClickListener clickListener) {
mLocalBuilder.a(textId, vkSnackbar -> {
clickListener.onClick(vkSnackbar);
return null;
});
return this;
}
public VkSnackbar create() {
return mLocalBuilder.d();
}
public VkSnackbar create(Window window) {
return mLocalBuilder.a(window);
}
public interface OnClickListener {
void onClick(VkSnackbar snackbar);
}
}
@@ -0,0 +1,38 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.vtosters.lite.R;
public class VKUITextView extends TextView {
public static final int STYLE_TITLE_1 = R.style.VKUIText_Title1;
public static final int STYLE_TITLE_2 = R.style.VKUIText_Title2;
public static final int STYLE_HEADLINE = R.style.VKUIText_Headline;
public static final int STYLE_DEFAULT = R.style.VKUIText_Text;
public static final int STYLE_SUBHEAD_1 = R.style.VKUIText_Subhead1;
public static final int STYLE_SUBHEAD_2 = R.style.VKUIText_Subhead2;
public static final int STYLE_CAPTION_1 = R.style.VKUIText_Caption1;
public static final int STYLE_CAPTION_2 = R.style.VKUIText_Caption2;
public VKUITextView(Context context) {
this(context, STYLE_DEFAULT);
}
public VKUITextView(Context context, int style) {
super(new ContextThemeWrapper(context, style));
}
public VKUITextView(Context context, @Nullable AttributeSet attrs) {
super(new ContextThemeWrapper(context, STYLE_DEFAULT), attrs);
}
public VKUITextView(Context context, @Nullable AttributeSet attrs, int style) {
super(new ContextThemeWrapper(context, style), attrs);
}
}
@@ -0,0 +1,23 @@
package ru.vtosters.lite.ui.vkui;
import android.content.Context;
import android.text.TextUtils;
import androidx.appcompat.widget.SwitchCompat;
import ru.vtosters.lite.utils.AndroidUtils;
public class VKUiSwitch extends SwitchCompat {
public VKUiSwitch(Context context) {
super(context);
setEllipsize(TextUtils.TruncateAt.END);
setPadding(AndroidUtils.dp2px(8), AndroidUtils.dp2px(8), AndroidUtils.dp2px(8), AndroidUtils.dp2px(8));
setTextSize(16.0f);
}
@Override
public final void setEllipsize(TextUtils.TruncateAt where) {
super.setEllipsize(where);
}
}