made hook and added images for theme toggle animation
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user