Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c155e560ba | ||
|
|
f92dd71d35 | ||
|
|
474f9f0197 | ||
|
|
aee76ba2ff | ||
|
|
398b6fc37b | ||
|
|
454cea3556 | ||
|
|
90816b5c67 | ||
|
|
7c1ac4b267 | ||
|
|
c145b64441 | ||
|
|
2ad5ab7a87 | ||
|
|
95fd69c5da | ||
|
|
1a3f18cbc2 | ||
|
|
f4031ead02 | ||
|
|
37b7783b40 | ||
|
|
8059743e0b | ||
|
|
2c1beedf8b | ||
|
|
484510da77 | ||
|
|
ddf046cd20 | ||
|
|
1c5316ba4e | ||
|
|
5503caed79 | ||
|
|
1f11530d04 | ||
|
|
95b5fca205 | ||
|
|
7432fe7aba | ||
|
|
c4630042c7 | ||
|
|
16f4178e36 | ||
|
|
421d080ec7 | ||
|
|
381a759c4b | ||
|
|
08bb1e1174 | ||
|
|
7fec602f34 | ||
|
|
1f9aca7399 |
@@ -28,4 +28,4 @@ smali2/build/resources.zip
|
||||
/smali/VTLite.apk.cache/
|
||||
smali/build/resources.zip
|
||||
smali/assets/version.properties
|
||||
smali/assets/version.properties
|
||||
*.keystore
|
||||
|
||||
@@ -48,8 +48,6 @@ public class LibVKXClient{
|
||||
return false;
|
||||
}
|
||||
|
||||
Log.d("LibVKXClient", "playing: " + musicTrack.toString());
|
||||
|
||||
LibVKXClientImpl.LibVKXAction action = iLibVkxService -> LibVKXClient.lambdaplay(list, musicTrack, iLibVkxService);
|
||||
|
||||
return getInstance().runOnService(action);
|
||||
@@ -64,7 +62,7 @@ public class LibVKXClient{
|
||||
if (indexOf == -1) {
|
||||
indexOf = 0;
|
||||
}
|
||||
Log.d("LibVKXClient", "tracks: " + ids.toString());
|
||||
|
||||
try {
|
||||
iLibVkxService.play(ids, indexOf, "");
|
||||
} catch (RemoteException e) {
|
||||
|
||||
@@ -0,0 +1,322 @@
|
||||
package com.vtosters.lite.ui.bottomnavigation;
|
||||
|
||||
import static ru.vtosters.lite.utils.Themes.getCSTDock;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.view.menu.MenuItemImpl;
|
||||
import androidx.appcompat.view.menu.MenuView;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.graphics.drawable.DrawableCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import com.vk.core.ui.themes.Themable;
|
||||
import com.vk.core.ui.themes.VKThemeHelper;
|
||||
import com.vtosters.lite.R;
|
||||
|
||||
import me.grishka.appkit.utils.V;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
import ru.vtosters.lite.utils.Themes;
|
||||
|
||||
public class BottomNavigationItemView extends FrameLayout implements MenuView.ItemView {
|
||||
private final TextView mSmallLabel;
|
||||
private final TextView mLargeLabel;
|
||||
private final View mCounterContainer;
|
||||
private final TextView mCounter;
|
||||
private final View mDot;
|
||||
private int mItemPos;
|
||||
private MenuItemImpl mItemData;
|
||||
private ColorStateList mColorStateList;
|
||||
private final int mMargin;
|
||||
private final int mDiff;
|
||||
private final float mSmallScale;
|
||||
private final float mLargeScale;
|
||||
private boolean mShiftingModeEnabled;
|
||||
private boolean mIconsModeEnabled;
|
||||
private boolean mStaticModeEnabled;
|
||||
private ImageView mIcon;
|
||||
private ImageView mActionIcon;
|
||||
|
||||
public BottomNavigationItemView(@NonNull Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public BottomNavigationItemView(@NonNull Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public BottomNavigationItemView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
this.mItemPos = -1;
|
||||
|
||||
var textSize = (float) getResources().getDimensionPixelSize(R.dimen.design_bottom_navigation_text_size);
|
||||
var activeTextSize = (float) getResources().getDimensionPixelSize(R.dimen.design_bottom_navigation_active_text_size);
|
||||
this.mMargin = getResources().getDimensionPixelSize(R.dimen.design_bottom_navigation_margin);
|
||||
this.mDiff = (int) (textSize - activeTextSize);
|
||||
this.mSmallScale = activeTextSize / textSize;
|
||||
this.mLargeScale = textSize / activeTextSize;
|
||||
|
||||
LayoutInflater.from(context).inflate(R.layout.design_bottom_navigation_item, this, true);
|
||||
this.setBackgroundResource(R.drawable.design_bottom_navigation_item_background);
|
||||
this.mIcon = this.findViewById(R.id.icon);
|
||||
this.mIcon.getLayoutParams().width = V.a(28.0F);
|
||||
this.mIcon.getLayoutParams().height = V.a(28.0F);
|
||||
|
||||
var colorStateList = getCSTDock();
|
||||
this.mSmallLabel = this.findViewById(R.id.smallLabel);
|
||||
mSmallLabel.setTextColor(colorStateList);
|
||||
|
||||
this.mLargeLabel = this.findViewById(R.id.largeLabel);
|
||||
mLargeLabel.setTextColor(colorStateList);
|
||||
|
||||
LayoutInflater.from(this.getContext()).inflate(R.layout.navigation_bottom_counter, this, true);
|
||||
this.mCounterContainer = this.findViewById(R.id.counter_container);
|
||||
this.mCounter = this.findViewById(R.id.counter);
|
||||
this.mDot = this.findViewById(R.id.dot);
|
||||
|
||||
LayoutInflater.from(this.getContext()).inflate(R.layout.navigation_bottom_action, this, true);
|
||||
this.mActionIcon = this.findViewById(R.id.action_icon);
|
||||
VKThemeHelper.a(this.mActionIcon, R.attr.tabbar_active_icon, PorterDuff.Mode.MULTIPLY);
|
||||
}
|
||||
|
||||
public void a() {
|
||||
this.mActionIcon.setVisibility(GONE);
|
||||
}
|
||||
|
||||
public void b() {
|
||||
this.mActionIcon.setVisibility(VISIBLE);
|
||||
}
|
||||
|
||||
public MenuItemImpl getItemData() {
|
||||
return this.mItemData;
|
||||
}
|
||||
|
||||
public int getItemPosition() {
|
||||
return this.mItemPos;
|
||||
}
|
||||
|
||||
public void initialize(MenuItemImpl impl, int i) {
|
||||
this.mItemData = impl;
|
||||
this.setCheckable(impl.isCheckable());
|
||||
this.setChecked(impl.isChecked());
|
||||
this.setEnabled(impl.isEnabled());
|
||||
this.setIcon(impl.getIcon());
|
||||
this.setTitle(impl.getTitle());
|
||||
this.setId(impl.getItemId());
|
||||
this.setContentDescription(impl.getTitle());
|
||||
}
|
||||
|
||||
public int[] onCreateDrawableState(int extraSpace) {
|
||||
int[] baseState = super.onCreateDrawableState(extraSpace + 1);
|
||||
if (this.mItemData != null && this.mItemData.isCheckable() && this.mItemData.isChecked()) {
|
||||
FrameLayout.mergeDrawableStates(baseState, new int[]{android.R.attr.state_checked});
|
||||
}
|
||||
|
||||
return baseState;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
if (/*this.mShiftingModeEnabled &&*/ this.mCounterContainer.getVisibility() != GONE) {
|
||||
left = this.mCounterContainer.getMeasuredWidth() / 2
|
||||
+ V.a(4.0F)
|
||||
+ Math.min(this.getMeasuredWidth() / 2
|
||||
- this.mCounterContainer.getWidth()
|
||||
- V.a(4.0F), 0);
|
||||
this.mCounterContainer.layout(this.mCounterContainer.getLeft() + left,
|
||||
this.mCounterContainer.getTop(),
|
||||
this.mCounterContainer.getRight() + left,
|
||||
this.mCounterContainer.getBottom());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean prefersCondensedTitle() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setCheckable(boolean var1) {
|
||||
this.refreshDrawableState();
|
||||
}
|
||||
|
||||
public void setChecked(boolean checked) {
|
||||
this.mItemData.setChecked(checked);
|
||||
|
||||
ViewCompat.setPivotX(mLargeLabel, mLargeLabel.getWidth() / 2);
|
||||
ViewCompat.setPivotY(mLargeLabel, mLargeLabel.getBaseline());
|
||||
ViewCompat.setPivotX(mSmallLabel, mSmallLabel.getWidth() / 2);
|
||||
ViewCompat.setPivotY(mSmallLabel, mSmallLabel.getBaseline());
|
||||
|
||||
if (this.mIconsModeEnabled) {
|
||||
var iconParams = (LayoutParams) this.mIcon.getLayoutParams();
|
||||
iconParams.gravity = Gravity.CENTER;
|
||||
iconParams.topMargin = 0;
|
||||
iconParams.bottomMargin = 0;
|
||||
this.mIcon.setLayoutParams(iconParams);
|
||||
|
||||
var counterContainerParams = (LayoutParams) this.mCounterContainer.getLayoutParams();
|
||||
counterContainerParams.gravity = Gravity.CENTER;
|
||||
counterContainerParams.topMargin = this.mMargin + V.a(1.5F);
|
||||
counterContainerParams.bottomMargin = this.mMargin + V.a(1.5F);
|
||||
this.mCounterContainer.setLayoutParams(counterContainerParams);
|
||||
this.mCounterContainer.setTranslationY((float)(-V.a(5.5F)));
|
||||
|
||||
this.mLargeLabel.setVisibility(GONE);
|
||||
this.mSmallLabel.setVisibility(GONE);
|
||||
} else {
|
||||
if (mShiftingModeEnabled) {
|
||||
if (checked) {
|
||||
var iconParams = (LayoutParams)this.mIcon.getLayoutParams();
|
||||
iconParams.gravity = Gravity.TOP|Gravity.CENTER_HORIZONTAL;
|
||||
iconParams.topMargin = this.mMargin;
|
||||
this.mIcon.setLayoutParams(iconParams);
|
||||
|
||||
var counterContainerParams = (LayoutParams)this.mCounterContainer.getLayoutParams();
|
||||
counterContainerParams.gravity = Gravity.TOP|Gravity.CENTER_HORIZONTAL;
|
||||
counterContainerParams.topMargin = this.mMargin + V.a(1.5F);
|
||||
counterContainerParams.bottomMargin = this.mMargin + V.a(1.5F);
|
||||
|
||||
this.mCounterContainer.setLayoutParams(counterContainerParams);
|
||||
this.mCounterContainer.setTranslationY(-V.a(5.5F));
|
||||
|
||||
this.mLargeLabel.setVisibility(VISIBLE);
|
||||
ViewCompat.setScaleX(this.mLargeLabel, 1.0F);
|
||||
ViewCompat.setScaleY(this.mLargeLabel, 1.0F);
|
||||
} else {
|
||||
var iconParams = (LayoutParams)this.mIcon.getLayoutParams();
|
||||
iconParams.gravity = Gravity.CENTER;
|
||||
iconParams.topMargin = this.mMargin;
|
||||
this.mIcon.setLayoutParams(iconParams);
|
||||
|
||||
var counterContainerParams = (LayoutParams)this.mCounterContainer.getLayoutParams();
|
||||
counterContainerParams.gravity = Gravity.CENTER;
|
||||
counterContainerParams.topMargin = this.mMargin + V.a(1.5F);
|
||||
counterContainerParams.bottomMargin = this.mMargin + V.a(1.5F);
|
||||
this.mCounterContainer.setLayoutParams(counterContainerParams);
|
||||
this.mCounterContainer.setTranslationY((float)(-V.a(5.5F)));
|
||||
|
||||
this.mLargeLabel.setVisibility(INVISIBLE);
|
||||
ViewCompat.setScaleX(this.mLargeLabel, 0.5F);
|
||||
ViewCompat.setScaleY(this.mLargeLabel, 0.5F);
|
||||
}
|
||||
mSmallLabel.setVisibility(INVISIBLE);
|
||||
} else {
|
||||
// ViewCompat.setScaleX(mLargeLabel, !mStaticModeEnabled && !checked ? mLargeScale : 1.0f);
|
||||
// ViewCompat.setScaleY(mLargeLabel, !mStaticModeEnabled && !checked ? mLargeScale : 1.0f);
|
||||
ViewCompat.setScaleX(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
|
||||
ViewCompat.setScaleY(mSmallLabel, !mStaticModeEnabled && checked ? mSmallScale : 1.0f);
|
||||
mLargeLabel.setVisibility(/*checked ? VISIBLE :*/ INVISIBLE);
|
||||
mSmallLabel.setVisibility(VISIBLE);//checked ? INVISIBLE : VISIBLE);
|
||||
|
||||
var iconParams = (LayoutParams) this.mIcon.getLayoutParams();
|
||||
iconParams.gravity = Gravity.CENTER;
|
||||
iconParams.topMargin = 0;
|
||||
iconParams.bottomMargin = V.a(6);
|
||||
this.mIcon.setLayoutParams(iconParams);
|
||||
|
||||
var counterContainerParams = (LayoutParams)this.mCounterContainer.getLayoutParams();
|
||||
counterContainerParams.gravity = Gravity.CENTER;
|
||||
counterContainerParams.topMargin = 0;
|
||||
counterContainerParams.bottomMargin = V.a(8);
|
||||
this.mCounterContainer.setLayoutParams(counterContainerParams);
|
||||
this.mCounterContainer.setTranslationY(-V.a(5.5F));
|
||||
}
|
||||
}
|
||||
|
||||
this.refreshDrawableState();
|
||||
}
|
||||
|
||||
public void setCounterText(@Nullable CharSequence text) {
|
||||
this.mCounter.setText(text);
|
||||
if (text == null) {
|
||||
this.mCounterContainer.setVisibility(GONE);
|
||||
} else if (TextUtils.isEmpty(text)) {
|
||||
this.mCounterContainer.setVisibility(VISIBLE);
|
||||
this.mCounter.setVisibility(GONE);
|
||||
this.mDot.setVisibility(VISIBLE);
|
||||
} else {
|
||||
this.mCounterContainer.setVisibility(VISIBLE);
|
||||
this.mCounter.setVisibility(VISIBLE);
|
||||
this.mDot.setVisibility(mItemPos);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setEnabled(boolean b) {
|
||||
super.setEnabled(b);
|
||||
this.mSmallLabel.setEnabled(b);
|
||||
this.mLargeLabel.setEnabled(b);
|
||||
this.mIcon.setEnabled(b);
|
||||
}
|
||||
|
||||
public void setIcon(Drawable drawable) {
|
||||
if (drawable != null) {
|
||||
if (drawable.getConstantState() != null)
|
||||
drawable = drawable.getConstantState().newDrawable();
|
||||
|
||||
drawable = DrawableCompat.wrap(drawable).mutate();
|
||||
DrawableCompat.setTintList(drawable, this.mColorStateList);
|
||||
}
|
||||
|
||||
this.mIcon.setImageDrawable(drawable);
|
||||
}
|
||||
|
||||
public void setIconTintList(ColorStateList colorStateList) {
|
||||
this.mColorStateList = colorStateList;
|
||||
MenuItemImpl impl = this.mItemData;
|
||||
if (impl != null) {
|
||||
this.setIcon(impl.getIcon());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setIconsMode(boolean enabled) {
|
||||
this.mIconsModeEnabled = enabled;
|
||||
}
|
||||
|
||||
public void setStaticMode(boolean enabled) {
|
||||
this.mStaticModeEnabled = enabled;
|
||||
}
|
||||
|
||||
public void setItemBackground(int resId) {
|
||||
ViewCompat.setBackground(this, resId != 0 ? ContextCompat.getDrawable(this.getContext(), resId) : null);
|
||||
}
|
||||
|
||||
public void setItemPosition(int pos) {
|
||||
this.mItemPos = pos;
|
||||
}
|
||||
|
||||
public void setShiftingMode(boolean var1) {
|
||||
this.mShiftingModeEnabled = var1;
|
||||
}
|
||||
|
||||
public void setShortcut(boolean b, char c) {
|
||||
}
|
||||
|
||||
public void setTextColor(ColorStateList colorStateList) {
|
||||
}
|
||||
|
||||
public void setTitle(CharSequence title) {
|
||||
this.mSmallLabel.setText(title);
|
||||
this.mLargeLabel.setText(title);
|
||||
}
|
||||
|
||||
public boolean showsIcon() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import static ru.vtosters.lite.dnr.DNRModule.isDnrEnabledFor;
|
||||
import static ru.vtosters.lite.dnr.DNRModule.isDntEnabledFor;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
|
||||
import com.vk.core.util.ToastUtils;
|
||||
import com.vk.im.engine.models.dialogs.Dialog;
|
||||
import com.vk.im.ui.components.common.DialogAction;
|
||||
|
||||
@@ -40,6 +41,10 @@ public class DNRInjector{
|
||||
public static boolean onClick(Dialog dialog, DialogAction action){
|
||||
var id = dialog.getId();
|
||||
|
||||
if (action == DialogAction.valueOf("MARK_AS_READ")) {
|
||||
DNRModule.hookRead(dialog);
|
||||
}
|
||||
|
||||
if (action == DialogAction.valueOf("DNR_ON")) {
|
||||
setDnr(dialog, true);
|
||||
return true;
|
||||
|
||||
@@ -51,8 +51,7 @@ public class DNRModule{
|
||||
}
|
||||
|
||||
public static void hookRead(Dialog dialog){
|
||||
makeRequest("https://" + getApi() + "/method/messages.markAsRead?start_message_id=" + dialog.F1() + "&peer_id=" + dialog.getId() + "&v=5.91&access_token=" + getUserToken(), response -> {
|
||||
ToastUtils.a("Чат помечен как прочитанный!");
|
||||
makeRequest("https://" + getApi() + "/method/messages.markAsRead?start_message_id=" + dialog.F1() + "&peer_id=" + dialog.getId() + "&v=5.119&access_token=" + getUserToken(), response -> {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
public class LogWriterService extends Service{
|
||||
public LogWriterService(){
|
||||
@@ -28,7 +31,9 @@ public class LogWriterService extends Service{
|
||||
super.onStartCommand(intent, flags, startId);
|
||||
|
||||
Log.d("LogWriterService", "The service has been started");
|
||||
var file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/VTL_log.txt");
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd.HH-mm-ss", Locale.getDefault());
|
||||
|
||||
var file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/VTL_log_" + dateFormat.format(new Date()) + ".txt");
|
||||
try {
|
||||
var exists = file.createNewFile();
|
||||
|
||||
|
||||
@@ -1,23 +1,34 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
package ru.vtosters.lite.hooks;
|
||||
|
||||
import static android.graphics.Color.*;
|
||||
import static com.vtosters.lite.R.id.menu_fave;
|
||||
import static com.vtosters.lite.R.id.menu_feedback;
|
||||
import static com.vtosters.lite.R.id.menu_friends;
|
||||
import static com.vtosters.lite.R.id.menu_games;
|
||||
import static com.vtosters.lite.R.id.menu_groups;
|
||||
import static com.vtosters.lite.R.id.menu_messages;
|
||||
import static com.vtosters.lite.R.id.menu_newsfeed;
|
||||
import static com.vtosters.lite.R.id.menu_photos;
|
||||
import static com.vtosters.lite.R.id.menu_search;
|
||||
import static com.vtosters.lite.R.id.menu_videos;
|
||||
import static com.vtosters.lite.R.id.menu_vk_pay;
|
||||
import static com.vtosters.lite.R.id.tab_discover;
|
||||
import static com.vtosters.lite.R.id.tab_feedback;
|
||||
import static com.vtosters.lite.R.id.tab_menu;
|
||||
import static com.vtosters.lite.R.id.tab_messages;
|
||||
import static com.vtosters.lite.R.id.tab_news;
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||
import static ru.vtosters.lite.utils.Preferences.*;
|
||||
import static ru.vtosters.lite.utils.Themes.getCSTDock;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.vk.apps.AppsFragment;
|
||||
import com.vk.core.drawable.RecoloredDrawable;
|
||||
@@ -41,12 +52,15 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import ru.vtosters.lite.ui.components.DockBarEditorManager;
|
||||
import ru.vtosters.lite.ui.items.DockBarTab;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
import ru.vtosters.lite.utils.Preferences;
|
||||
|
||||
public class DockBarInjector{
|
||||
private static final DockBarManager sManager = DockBarManager.getInstance();
|
||||
public class DockBarInjector {
|
||||
private static final DockBarEditorManager sManager = DockBarEditorManager.getInstance();
|
||||
|
||||
public static Map<Class<? extends FragmentImpl>, Integer> injectMap(){
|
||||
public static Map<Class<? extends FragmentImpl>, Integer> injectMap() {
|
||||
LinkedHashMap<Class<? extends FragmentImpl>, Integer> map = new LinkedHashMap<>();
|
||||
for (DockBarTab tab : sManager.getSelectedTabs()) {
|
||||
map.put(tab.fragmentClass, tab.id);
|
||||
@@ -54,7 +68,8 @@ public class DockBarInjector{
|
||||
return map;
|
||||
}
|
||||
|
||||
public static void inject(BottomNavigationView navigationView){
|
||||
@SuppressLint("RestrictedApi")
|
||||
public static void inject(BottomNavigationView navigationView) {
|
||||
Menu menu = navigationView.getMenu();
|
||||
menu.clear();
|
||||
try {
|
||||
@@ -67,7 +82,7 @@ public class DockBarInjector{
|
||||
Method acquire = synchronisedPoolCls.getDeclaredMethod("acquire");
|
||||
if (synchronizedPool != null) {
|
||||
do {
|
||||
} while(acquire.invoke(synchronizedPool) != null);
|
||||
} while (acquire.invoke(synchronizedPool) != null);
|
||||
}
|
||||
|
||||
} catch (NoSuchFieldException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) {
|
||||
@@ -78,24 +93,31 @@ public class DockBarInjector{
|
||||
MenuItem add = menu.add(0, tab.id, 0, tab.titleID);
|
||||
Drawable drawable = getResources().getDrawable(tab.iconID);
|
||||
|
||||
ColorStateList dockcolors = new ColorStateList(
|
||||
new int[][] {
|
||||
new int[] {android.R.attr.state_checked},
|
||||
new int[] {-android.R.attr.state_checked}
|
||||
},
|
||||
new int[] {
|
||||
Color.parseColor("#ff528bcc"),
|
||||
Color.parseColor("#ffaaaeb3")
|
||||
}
|
||||
);
|
||||
|
||||
add.setIcon(new RecoloredDrawable(drawable, dockcolors));
|
||||
add.setShowAsAction(1);
|
||||
add.setIcon(new RecoloredDrawable(drawable, getCSTDock()));
|
||||
add.setTitle(getContext().getString(tab.titleID));
|
||||
add.setCheckable(true);
|
||||
}
|
||||
if (getBoolValue("dockbar_tab_titles", false)) {
|
||||
var menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
|
||||
for (int i = 0; i < menuView.getChildCount(); i++) {
|
||||
var item = (com.vtosters.lite.ui.bottomnavigation.BottomNavigationItemView) menuView.getChildAt(i);
|
||||
item.setStaticMode(true);
|
||||
item.setIconsMode(false);
|
||||
item.setShiftingMode(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static int injectId(String tag){
|
||||
private static void removeAllChildren(ViewGroup view) {
|
||||
for (int i = 0; i < view.getChildCount(); i++) {
|
||||
if (view instanceof ViewGroup) {
|
||||
removeAllChildren((ViewGroup) view.getChildAt(i));
|
||||
view.removeAllViews();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static int injectId(String tag) {
|
||||
for (DockBarTab tab : sManager.getSelectedTabs()) {
|
||||
if (tag.equals(tab.tag))
|
||||
return tab.id;
|
||||
@@ -103,7 +125,7 @@ public class DockBarInjector{
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static void injectMenuFragment(Menu menu){
|
||||
public static void injectMenuFragment(Menu menu) {
|
||||
List<MenuItem> menuItems = new ArrayList<>();
|
||||
for (int i = 0; i < menu.size(); i++) {
|
||||
menuItems.add(menu.getItem(i));
|
||||
@@ -160,25 +182,41 @@ public class DockBarInjector{
|
||||
}
|
||||
}
|
||||
|
||||
public static void setCounter(int tabId, BottomNavigationView navigationView){
|
||||
navigationView.a(tabId, counters(tabId, navigationView));
|
||||
public static void setCounter(int tabId, BottomNavigationView navigationView) {
|
||||
navigationView.a(tabId, counters(tabId));
|
||||
}
|
||||
|
||||
private static CharSequence counters(int tabId, BottomNavigationView navigationView){
|
||||
if (!Preferences.dockcounter()) return null;
|
||||
@SuppressLint("NonConstantResourceId")
|
||||
private static CharSequence counters(int tabId) {
|
||||
if (!dockcounter()) return null;
|
||||
|
||||
int val = 0;
|
||||
switch (tabId) {
|
||||
case tab_messages:
|
||||
val = MenuCountersState.j();
|
||||
break;
|
||||
case menu_groups:
|
||||
val = MenuCountersState.h();
|
||||
break;
|
||||
case menu_fave:
|
||||
val = MenuCountersState.c();
|
||||
break;
|
||||
case menu_games:
|
||||
val = MenuCountersState.a();
|
||||
break;
|
||||
case menu_photos:
|
||||
val = MenuCountersState.l();
|
||||
break;
|
||||
case menu_videos:
|
||||
val = MenuCountersState.n();
|
||||
break;
|
||||
case tab_feedback:
|
||||
if (Preferences.milkshake())
|
||||
val = MenuCountersState.k();
|
||||
if (milkshake())
|
||||
val = MenuCountersState.k();
|
||||
break;
|
||||
case menu_friends:
|
||||
if (!Preferences.milkshake())
|
||||
val = MenuCountersState.k();
|
||||
if (!milkshake())
|
||||
val = MenuCountersState.k();
|
||||
break;
|
||||
}
|
||||
//
|
||||
@@ -199,7 +237,7 @@ public class DockBarInjector{
|
||||
return val > 0 ? StringUtils.a(val) : null;
|
||||
}
|
||||
|
||||
public static JSONArray injectMenuJSON(JSONArray arr){
|
||||
public static JSONArray injectMenuJSON(JSONArray arr) {
|
||||
List<String> arrayList = new ArrayList(Arrays.asList(
|
||||
"news",
|
||||
"messages",
|
||||
@@ -232,15 +270,15 @@ public class DockBarInjector{
|
||||
}
|
||||
}
|
||||
|
||||
public static int getItemCount(){
|
||||
public static int getItemCount() {
|
||||
return sManager.getSelectedTabs().size();
|
||||
}
|
||||
|
||||
public static boolean isDockOpenAllowed(FragmentImpl fragment){
|
||||
public static boolean isDockOpenAllowed(FragmentImpl fragment) {
|
||||
return isDockOpenAllowed(fragment.getClass());
|
||||
}
|
||||
|
||||
public static boolean isDockOpenAllowed(Class<?> cls){
|
||||
public static boolean isDockOpenAllowed(Class<?> cls) {
|
||||
for (DockBarTab tab : sManager.getSelectedTabs())
|
||||
if (tab.fragmentClass == cls)
|
||||
return false;
|
||||
@@ -250,7 +288,7 @@ public class DockBarInjector{
|
||||
return true;
|
||||
}
|
||||
|
||||
public static Class<?> interceptClick(int id, RightMenu rightMenu){
|
||||
public static Class<?> interceptClick(int id, RightMenu rightMenu) {
|
||||
if (id == tab_menu) {
|
||||
rightMenu.a();
|
||||
}
|
||||
@@ -3,20 +3,41 @@ package ru.vtosters.lite.hooks;
|
||||
import static ru.vtosters.lite.f0x1d.VTVerifications.isDeveloper;
|
||||
import static ru.vtosters.lite.f0x1d.VTVerifications.isPrometheus;
|
||||
import static ru.vtosters.lite.f0x1d.VTVerifications.isVerified;
|
||||
import static ru.vtosters.lite.hooks.DateHook.getLocale;
|
||||
import static ru.vtosters.lite.utils.Base64Utils.decode;
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getUserToken;
|
||||
import static ru.vtosters.lite.utils.Preferences.dev;
|
||||
import static ru.vtosters.lite.utils.Preferences.friendsblock;
|
||||
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||
import static ru.vtosters.lite.utils.Preferences.hasVerification;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import com.vk.core.network.Network;
|
||||
import com.vk.core.util.DeviceIdProvider;
|
||||
import com.vtosters.lite.fragments.messages.chat.vc.MsgSendVc;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Objects;
|
||||
import java.util.Random;
|
||||
|
||||
import okhttp3.Call;
|
||||
import okhttp3.Callback;
|
||||
import okhttp3.Headers;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
public class JsonInjectors{
|
||||
private static final OkHttpClient mClient = new OkHttpClient();
|
||||
|
||||
public static JSONObject profileButton(JSONObject orig) throws JSONException{
|
||||
if (haveDonateButton()) return orig;
|
||||
|
||||
@@ -83,21 +104,114 @@ public class JsonInjectors{
|
||||
return orig;
|
||||
}
|
||||
|
||||
public static JSONObject superapp(JSONObject json) throws JSONException{
|
||||
public static JSONObject superapp(JSONObject json) throws JSONException {
|
||||
var superApps = Globals.getPreferences().getString("superapp_items", "").split(",");
|
||||
if (superApps.length == 0) return json;
|
||||
|
||||
var oldItems = json.optJSONArray("items");
|
||||
var newItems = new JSONArray();
|
||||
if (oldItems != null) {
|
||||
for (int i = 0; i < oldItems.length(); i++) {
|
||||
var item = oldItems.optJSONObject(i);
|
||||
var type = item.optString("type");
|
||||
if (!getBoolValue("superapp_" + type, false))
|
||||
newItems.put(item);
|
||||
for (String superApp : superApps) {
|
||||
if (type.equals(superApp))
|
||||
newItems.put(item);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < superApps.length; i++) {
|
||||
for (int j = i; j < newItems.length(); j++) {
|
||||
var item = newItems.optJSONObject(j);
|
||||
if (superApps[i].equals(item.optString("type")))
|
||||
newItems.put(j, newItems.getJSONObject(i))
|
||||
.put(i, item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return json.putOpt("items", newItems);
|
||||
}
|
||||
|
||||
public static JSONObject musiclink(JSONObject json){
|
||||
var oldItems = json.optJSONArray("links");
|
||||
|
||||
if (oldItems != null) {
|
||||
if (oldItems.optJSONObject(0).optString("url").contains("?section=recent")) {
|
||||
json.remove("links");
|
||||
}
|
||||
}
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
public static JSONObject music(JSONObject json) throws JSONException{
|
||||
var oldItems = json.optJSONObject("catalog").optJSONArray("sections");
|
||||
|
||||
if (oldItems != null) {
|
||||
var playlists = fetchCatalogId("https://vk.com/audio?section=my_playlists");
|
||||
if (playlists != null) {
|
||||
var catalogarr = playlists.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
|
||||
|
||||
var title = catalogarr.optString("title");
|
||||
var id = catalogarr.optString("id");
|
||||
var url = catalogarr.optString("url");
|
||||
|
||||
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
|
||||
}
|
||||
|
||||
var albums = fetchCatalogId("https://vk.com/audio?section=albums");
|
||||
if (albums != null) {
|
||||
var catalogarr = albums.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
|
||||
|
||||
var title = catalogarr.optString("title");
|
||||
var id = catalogarr.optString("id");
|
||||
var url = catalogarr.optString("url");
|
||||
|
||||
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
|
||||
}
|
||||
|
||||
var recent = fetchCatalogId("https://vk.com/audio?section=recent");
|
||||
if (recent != null) {
|
||||
var catalogarr = recent.optJSONObject("catalog").optJSONArray("sections").optJSONObject(0);
|
||||
|
||||
var title = catalogarr.optString("title");
|
||||
var id = catalogarr.optString("id");
|
||||
var url = catalogarr.optString("url");
|
||||
|
||||
oldItems.put(new JSONObject().put("id", id).put("title", title).put("url", url));
|
||||
}
|
||||
}
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
|
||||
public static JSONObject fetchCatalogId(String section){
|
||||
if (section == null) return null;
|
||||
|
||||
var request = new Request.a()
|
||||
.b("https://api.vk.com/method/catalog.getAudio"
|
||||
+ "?v=5.119"
|
||||
+ "&https=1"
|
||||
+ "&need_blocks=1"
|
||||
+ "&lang="
|
||||
+ getLocale()
|
||||
+ "&device_id="
|
||||
+ DeviceIdProvider.d(getContext())
|
||||
+ "&url="
|
||||
+ section
|
||||
+ "&access_token="
|
||||
+ getUserToken())
|
||||
.a(Headers.a("User-Agent", Network.l.c().a(), "Content-Type", "application/x-www-form-urlencoded; charset=utf-8")).a();
|
||||
try {
|
||||
return new JSONObject(mClient.a(request).execute().a().g()).getJSONObject("response");
|
||||
} catch (JSONException | IOException e) {
|
||||
Log.d("VTLMusic", "Error: " + e.getMessage());
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static JSONObject friends(JSONObject json) throws JSONException{
|
||||
JSONObject catalog = json;
|
||||
boolean sectionexecute = true;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
package ru.vtosters.lite.hooks;
|
||||
import static ru.vtosters.lite.ui.fragments.dockbar.DockBarManager.getInstance;
|
||||
import static ru.vtosters.lite.ui.components.DockBarEditorManager.getInstance;
|
||||
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||
import static ru.vtosters.lite.utils.Preferences.milkshake;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
package ru.vtosters.lite.hooks;
|
||||
import static ru.vtosters.lite.utils.Preferences.*;
|
||||
import static ru.vtosters.lite.utils.Preferences.feedcache;
|
||||
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||
import static ru.vtosters.lite.utils.Preferences.milkshake;
|
||||
@@ -9,6 +10,8 @@ import static ru.vtosters.lite.utils.Preferences.superapp;
|
||||
import com.vk.toggle.FeatureManager;
|
||||
import com.vk.toggle.Features;
|
||||
|
||||
import ru.vtosters.lite.utils.Preferences;
|
||||
|
||||
public class TogglesHook{
|
||||
public static boolean shouldPatch(Features.Type feature){
|
||||
switch(feature) {
|
||||
@@ -144,6 +147,8 @@ public class TogglesHook{
|
||||
return !getBoolValue("compressPhotos", true);
|
||||
case FEATURE_MUSIC_STOP_PLAYER_ON_TASK_REMOVAL:
|
||||
return getBoolValue("musictask", false);
|
||||
case FEATURE_MENU_GAMES_CAROUSEL:
|
||||
return miniapps();
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,281 @@
|
||||
package ru.vtosters.lite.ui.adapters;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getString;
|
||||
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Typeface;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import ru.vtosters.lite.ui.components.IItemMovingListener;
|
||||
import ru.vtosters.lite.utils.Themes;
|
||||
|
||||
public class CategorizedAdapter extends RecyclerView.Adapter<CategorizedAdapter.CategorizedViewHolder> implements IItemMovingListener {
|
||||
|
||||
// Adapter item types
|
||||
public static final int MOVING_ITEM = -0x1;
|
||||
public static final int CATEGORY_TITLE = -0x2;
|
||||
|
||||
// Item states
|
||||
public static final int SELECTED_STATE = -0x1;
|
||||
public static final int DISABLED_STATE = -0x2;
|
||||
|
||||
private List mSelectedItems;
|
||||
private List mDisabledItems;
|
||||
private List mUnmovedItems;
|
||||
private IViewHolderBinder mBinder;
|
||||
|
||||
private int mMinSelectedItems = -1;
|
||||
private int mMaxSelectedItems = -1;
|
||||
|
||||
public CategorizedAdapter(List selectedItems, List disabledItems, IViewHolderBinder binder) {
|
||||
this.mSelectedItems = selectedItems;
|
||||
this.mDisabledItems = disabledItems;
|
||||
this.mUnmovedItems = new ArrayList();
|
||||
this.mBinder = binder;
|
||||
}
|
||||
|
||||
public void setMinAndMaxCounts(int min, int max) {
|
||||
this.mMinSelectedItems = min;
|
||||
this.mMaxSelectedItems = max;
|
||||
}
|
||||
|
||||
public void addUnmovedItem(Object item) {
|
||||
mUnmovedItems.add(item);
|
||||
}
|
||||
|
||||
public int getItemViewType(int i) {
|
||||
return i == 0 || mSelectedItems.size() + 1 == i ? CATEGORY_TITLE : MOVING_ITEM;
|
||||
}
|
||||
|
||||
public int getTabType(int i) {
|
||||
return i <= mSelectedItems.size() ? SELECTED_STATE : DISABLED_STATE;
|
||||
}
|
||||
|
||||
public boolean isUnmovedItem(int index) {
|
||||
if (getItemViewType(index) == MOVING_ITEM) {
|
||||
Object curr;
|
||||
if (getTabType(index) == SELECTED_STATE) {
|
||||
curr = mSelectedItems.get(index - 1);
|
||||
return mUnmovedItems.contains(curr);
|
||||
} else {
|
||||
curr = mDisabledItems.get(index - mSelectedItems.size() - 2);
|
||||
return mUnmovedItems.contains(curr);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public CategorizedViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
|
||||
FrameLayout container = new FrameLayout(getContext());
|
||||
container.addView(newCategoryTitle(), new FrameLayout.LayoutParams(-1, -2));
|
||||
container.addView(newMovingItem(), new FrameLayout.LayoutParams(-1, -2));
|
||||
return new CategorizedViewHolder(container);
|
||||
}
|
||||
|
||||
private View newMovingItem() {
|
||||
LinearLayout container = new LinearLayout(getContext());
|
||||
container.setTag("container");
|
||||
container.setGravity(Gravity.CENTER_VERTICAL);
|
||||
container.setOrientation(LinearLayout.HORIZONTAL);
|
||||
container.setPadding(
|
||||
convertDpToPixel(12),
|
||||
convertDpToPixel(12),
|
||||
convertDpToPixel(12),
|
||||
convertDpToPixel(12)
|
||||
);
|
||||
container.setLayoutParams(new LinearLayout.LayoutParams(-1, convertDpToPixel(48)));
|
||||
container.setVisibility(View.INVISIBLE);
|
||||
|
||||
ImageView icon = new ImageView(getContext());
|
||||
icon.setTag("icon");
|
||||
icon.setImageTintList(ColorStateList.valueOf(Themes.getAccentColor()));
|
||||
icon.setLayoutParams(new LinearLayout.LayoutParams(
|
||||
convertDpToPixel(24),
|
||||
convertDpToPixel(24)));
|
||||
container.addView(icon);
|
||||
|
||||
TextView name = new TextView(getContext());
|
||||
name.setTag("name");
|
||||
name.setTextSize(16.0f);
|
||||
name.setTypeface(Typeface.DEFAULT_BOLD);
|
||||
name.setTextColor(Themes.getTextAttr());
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -2);
|
||||
params.weight = 1;
|
||||
params.leftMargin = convertDpToPixel(16);
|
||||
container.addView(name, params);
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
private View newCategoryTitle() {
|
||||
LinearLayout container = new LinearLayout(getContext());
|
||||
container.setTag("category_title_container");
|
||||
container.setLayoutParams(new LinearLayout.LayoutParams(-1, -2));
|
||||
container.setVisibility(View.INVISIBLE);
|
||||
|
||||
TextView title = new TextView(getContext());
|
||||
title.setTag("category_title");
|
||||
title.setTextSize(13.0f);
|
||||
title.setPadding(
|
||||
convertDpToPixel(16),
|
||||
convertDpToPixel(13),
|
||||
convertDpToPixel(16),
|
||||
convertDpToPixel(13)
|
||||
);
|
||||
title.setAllCaps(true);
|
||||
title.setTextColor(Themes.getTextAttr());
|
||||
container.addView(title, new LinearLayout.LayoutParams(-2, -2));
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull CategorizedViewHolder viewHolder, int i) {
|
||||
try {
|
||||
Log.d("TAG", i + "");
|
||||
if (getItemViewType(i) == MOVING_ITEM)
|
||||
mBinder.bind(viewHolder, i);
|
||||
else
|
||||
viewHolder.bindCategory(i == 0);
|
||||
} catch (Exception e) {
|
||||
Log.d("TAG", e + "");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mSelectedItems.size() + mDisabledItems.size() + 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemDismiss(int index) {
|
||||
if (getItemViewType(index) == MOVING_ITEM ) {
|
||||
Object curr;
|
||||
if (getTabType(index) == SELECTED_STATE) {
|
||||
curr = mSelectedItems.get(index - 1);
|
||||
if (!mUnmovedItems.contains(curr)) return;
|
||||
mSelectedItems.remove(curr);
|
||||
mDisabledItems.add(0, curr);
|
||||
notifyItemMoved(index, mSelectedItems.size() + 1);
|
||||
} else {
|
||||
curr = mDisabledItems.get(index - mSelectedItems.size() - 2);
|
||||
if (!mUnmovedItems.contains(curr)) return;
|
||||
mDisabledItems.remove(curr);
|
||||
mSelectedItems.add(0, curr);
|
||||
notifyItemRemoved(index);
|
||||
notifyItemInserted(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onItemMove(int fromPosition, int toPosition) {
|
||||
if (toPosition == 0 || isUnmovedItem(toPosition))
|
||||
return false;
|
||||
|
||||
Object curr;
|
||||
if (getTabType(fromPosition) == SELECTED_STATE) {
|
||||
var min = mSelectedItems.size() == mMinSelectedItems;
|
||||
if (getTabType(toPosition) == DISABLED_STATE && min)
|
||||
return false;
|
||||
curr = mSelectedItems.get(fromPosition - 1);
|
||||
if (mUnmovedItems.contains(curr))
|
||||
return false;
|
||||
if (getItemViewType(toPosition) == CATEGORY_TITLE) {
|
||||
if (min)
|
||||
return false;
|
||||
mSelectedItems.remove(fromPosition - 1);
|
||||
mDisabledItems.add(0, curr);
|
||||
} else {
|
||||
Collections.swap(mSelectedItems, fromPosition - 1, toPosition - 1);
|
||||
}
|
||||
} else if (getTabType(fromPosition) == DISABLED_STATE) {
|
||||
var max = mSelectedItems.size() == mMaxSelectedItems;
|
||||
if (getTabType(toPosition) == SELECTED_STATE && max)
|
||||
return false;
|
||||
curr = mDisabledItems.get(fromPosition - mSelectedItems.size() - 2);
|
||||
if (mUnmovedItems.contains(curr))
|
||||
return false;
|
||||
if (getItemViewType(toPosition) == CATEGORY_TITLE) {
|
||||
if (max)
|
||||
return false;
|
||||
mDisabledItems.remove(0);
|
||||
mSelectedItems.add(curr);
|
||||
} else {
|
||||
Collections.swap(mDisabledItems,
|
||||
fromPosition - mSelectedItems.size() - 2,
|
||||
toPosition - mSelectedItems.size() - 2);
|
||||
}
|
||||
}
|
||||
|
||||
notifyItemMoved(fromPosition, toPosition);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static class CategorizedViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final LinearLayout mMovingItemContainer;
|
||||
private final ImageView mIcon;
|
||||
private final TextView mName;
|
||||
|
||||
private final LinearLayout mCategoryTitleContainer;
|
||||
private final TextView mCategoryTitle;
|
||||
|
||||
public CategorizedViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
|
||||
mMovingItemContainer = itemView.findViewWithTag("container");
|
||||
mCategoryTitleContainer = itemView.findViewWithTag("category_title_container");
|
||||
|
||||
mIcon = mMovingItemContainer.findViewWithTag("icon");
|
||||
mName = mMovingItemContainer.findViewWithTag("name");
|
||||
|
||||
mCategoryTitle = mCategoryTitleContainer.findViewWithTag("category_title");
|
||||
}
|
||||
|
||||
public void bindMovingItem(int iconId, int textId) {
|
||||
if (iconId != -1)
|
||||
mIcon.setImageResource(iconId);
|
||||
else
|
||||
mIcon.setVisibility(View.GONE);
|
||||
mName.setText(textId);
|
||||
mMovingItemContainer.setVisibility(View.VISIBLE);
|
||||
mCategoryTitleContainer.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
public void bindMovingItem(String text) {
|
||||
mIcon.setVisibility(View.GONE);
|
||||
mName.setText(text);
|
||||
mMovingItemContainer.setVisibility(View.VISIBLE);
|
||||
mCategoryTitleContainer.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
public void bindCategory(boolean fist) {
|
||||
mCategoryTitle.setText(getString(fist ? "selected_items" : "unselected_items"));
|
||||
mCategoryTitleContainer.setVisibility(View.VISIBLE);
|
||||
mMovingItemContainer.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
public interface IViewHolderBinder {
|
||||
void bind(CategorizedViewHolder holder, int pos);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.vtosters.lite.ui.components;
|
||||
package ru.vtosters.lite.ui.adapters;
|
||||
|
||||
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
||||
|
||||
@@ -12,7 +12,6 @@ import android.widget.ArrayAdapter;
|
||||
import android.widget.CheckedTextView;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ListView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -0,0 +1,96 @@
|
||||
package ru.vtosters.lite.ui.adapters;
|
||||
|
||||
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.vk.core.widget.BubbleFluidLayout;
|
||||
import com.vk.im.ui.views.msg.bubble.MsgBubbleView;
|
||||
import com.vtosters.lite.R;
|
||||
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
public class MessagesPreviewAdapter extends RecyclerView.Adapter<MessagesPreviewAdapter.MessagePreviewViewHolder> {
|
||||
|
||||
private static final int ME = 0x0;
|
||||
private static final int ANONYMOUS = -0x1;
|
||||
|
||||
private final String[] mMessages = {
|
||||
"Доброе время", "Доброе утро, день, вечер. ночь", "Как живёшь?", "Не мёртвый, и то хорошо"
|
||||
};
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int i) {
|
||||
return i % 2 == 0 ? ANONYMOUS : ME;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public MessagePreviewViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
|
||||
Context context = viewGroup.getContext();
|
||||
|
||||
var bubbleFluidLayout = (BubbleFluidLayout) LayoutInflater.from(context).inflate(R.layout.vkim_msg_list_item_msg_from_user, viewGroup, false);
|
||||
|
||||
bubbleFluidLayout.findViewById(R.id.avatar).setVisibility(View.GONE);
|
||||
bubbleFluidLayout.findViewById(R.id.avatar_space).setVisibility(View.GONE);
|
||||
bubbleFluidLayout.findViewById(R.id.vkim_channel_share).setVisibility(View.GONE);
|
||||
bubbleFluidLayout.findViewById(R.id.status).setVisibility(View.GONE);
|
||||
bubbleFluidLayout.findViewById(R.id.status_space).setVisibility(View.GONE);
|
||||
|
||||
var messageBubbleView = (MsgBubbleView) bubbleFluidLayout.findViewById(R.id.bubble);
|
||||
messageBubbleView.setContentPaddingLeft(Globals.convertDpToPixel(5));
|
||||
messageBubbleView.setContentPaddingTop(Globals.convertDpToPixel(5));
|
||||
messageBubbleView.setContentPaddingRight(Globals.convertDpToPixel(5));
|
||||
messageBubbleView.setContentPaddingBottom(Globals.convertDpToPixel(5));
|
||||
bubbleFluidLayout.setGravity(viewType == ME ? Gravity.RIGHT : Gravity.LEFT);
|
||||
|
||||
var message = new TextView(context);
|
||||
message.setTag("message");
|
||||
message.setGravity(Gravity.LEFT);
|
||||
message.setTextColor(getTextAttr());
|
||||
|
||||
messageBubbleView.setContentView(message);
|
||||
|
||||
return new MessagePreviewViewHolder(bubbleFluidLayout);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull MessagePreviewViewHolder viewHolder, int pos) {
|
||||
viewHolder.bind(mMessages[pos]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mMessages.length;
|
||||
}
|
||||
|
||||
private static int getColorFromAttribute(Context context, int attrId) {
|
||||
TypedValue typedValue = new TypedValue();
|
||||
context.getTheme().resolveAttribute(attrId, typedValue, true);
|
||||
return typedValue.data;
|
||||
}
|
||||
|
||||
protected static class MessagePreviewViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final TextView mMessage;
|
||||
|
||||
public MessagePreviewViewHolder(@NonNull View view) {
|
||||
super(view);
|
||||
|
||||
mMessage = view.findViewWithTag("message");
|
||||
}
|
||||
|
||||
public void bind(String text) {
|
||||
mMessage.setText(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.vtosters.lite.ui.fragments.tgstickers;
|
||||
package ru.vtosters.lite.ui.adapters;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
@@ -1,8 +1,7 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
package ru.vtosters.lite.ui.components;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||
import static ru.vtosters.lite.utils.Globals.getString;
|
||||
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||
import static ru.vtosters.lite.utils.Preferences.milkshake;
|
||||
import static ru.vtosters.lite.utils.Preferences.superapp;
|
||||
@@ -43,38 +42,39 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import ru.vtosters.lite.ui.items.DockBarTab;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
public class DockBarManager {
|
||||
public class DockBarEditorManager {
|
||||
|
||||
public static final int MIN_SELECTED_TABS_LIMIT = 3;
|
||||
public static final int MAX_SELECTED_TABS_LIMIT = 9;
|
||||
|
||||
private static DockBarManager sInstance = new DockBarManager();
|
||||
public static final int MIN_SELECTED_TABS = 3;
|
||||
public static final int MAX_SELECTED_TABS = 9;
|
||||
|
||||
private final List<DockBarTab> mSelectedTabs = new ArrayList<>();
|
||||
private final List<DockBarTab> mDisabledTabs = new ArrayList<>();
|
||||
private final String[] mCategoryTitles = {
|
||||
getString("dockbar_selected_items"),
|
||||
getString("dockbar_unselected_items")
|
||||
};
|
||||
|
||||
private static DockBarEditorManager sInstance;
|
||||
|
||||
public static DockBarManager getInstance() {
|
||||
public static DockBarEditorManager getInstance() {
|
||||
return sInstance == null
|
||||
? (sInstance = new DockBarManager())
|
||||
? (sInstance = new DockBarEditorManager())
|
||||
: sInstance;
|
||||
}
|
||||
|
||||
public DockBarManager() {
|
||||
public DockBarEditorManager() {
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
if (vkme()) {
|
||||
mSelectedTabs.add(getTabByTag("tab_settings"));
|
||||
if (vkme_notifs())
|
||||
mSelectedTabs.add(getTabByTag("tab_feedback"));
|
||||
if (vkme_notifs()) {
|
||||
if (milkshake()) {
|
||||
mSelectedTabs.add(getTabByTag("tab_feedback"));
|
||||
} else {
|
||||
mSelectedTabs.add(getTabByTag("tab_friends"));
|
||||
}
|
||||
}
|
||||
mSelectedTabs.add(getTabByTag("tab_messages"));
|
||||
mSelectedTabs.add(getTabByTag("tab_profile"));
|
||||
return;
|
||||
@@ -104,12 +104,17 @@ public class DockBarManager {
|
||||
}
|
||||
|
||||
public void save() {
|
||||
Globals.getPreferences().edit().putString("dockbar_tabs", mSelectedTabs.stream().map(tab -> tab.tag)
|
||||
.collect(Collectors.joining(","))).commit();
|
||||
Globals.getPreferences().edit().putString("dockbar_tabs", mSelectedTabs.stream()
|
||||
.map(tab -> tab.tag)
|
||||
.collect(Collectors.joining(",")))
|
||||
.commit();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
Globals.getPreferences().edit().putString("dockbar_tabs", "tab_news,tab_superapps,tab_messages,tab_friends,tab_profile").commit();
|
||||
Globals.getPreferences()
|
||||
.edit()
|
||||
.putString("dockbar_tabs", "tab_news,tab_superapps,tab_messages,tab_friends,tab_profile")
|
||||
.commit();
|
||||
}
|
||||
|
||||
public List<DockBarTab> getSelectedTabs() {
|
||||
@@ -120,10 +125,6 @@ public class DockBarManager {
|
||||
return mDisabledTabs;
|
||||
}
|
||||
|
||||
public String[] getCategoryTitles() {
|
||||
return mCategoryTitles;
|
||||
}
|
||||
|
||||
private DockBarTab getTabByTag(String tag) {
|
||||
switch (tag) {
|
||||
case "tab_news":
|
||||
@@ -1,6 +1,6 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
package ru.vtosters.lite.ui.components;
|
||||
|
||||
public interface IItemTouchHelper{
|
||||
public interface IItemMovingListener {
|
||||
|
||||
void onItemDismiss(int index);
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package ru.vtosters.lite.ui.components;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
|
||||
|
||||
public class ItemMovingCallback extends ItemTouchHelper.Callback {
|
||||
|
||||
private final CategorizedAdapter mAdapter;
|
||||
|
||||
public ItemMovingCallback(CategorizedAdapter adapter){
|
||||
this.mAdapter = adapter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLongPressDragEnabled(){
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemViewSwipeEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMovementFlags(@NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder){
|
||||
int dragFlags = mAdapter.getItemViewType(viewHolder.getAdapterPosition()) == CategorizedAdapter.MOVING_ITEM
|
||||
? ItemTouchHelper.UP | ItemTouchHelper.DOWN
|
||||
: 0;
|
||||
int swipeFlags = mAdapter.getItemViewType(viewHolder.getAdapterPosition()) == CategorizedAdapter.MOVING_ITEM
|
||||
&& mAdapter.isUnmovedItem(viewHolder.getAdapterPosition())
|
||||
? ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT
|
||||
: 0;
|
||||
return makeMovementFlags(dragFlags, swipeFlags);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
|
||||
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target){
|
||||
return mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
package ru.vtosters.lite.ui.components;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import ru.vtosters.lite.ui.items.SuperAppItem;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
public class SuperAppEditorManager {
|
||||
|
||||
private final List<SuperAppItem> mSelectedItems = new ArrayList<>();
|
||||
private final List<SuperAppItem> mDisabledItems = new ArrayList<>();
|
||||
|
||||
private static SuperAppEditorManager sInstance;
|
||||
|
||||
public static SuperAppEditorManager getInstance() {
|
||||
return sInstance == null
|
||||
? (sInstance = new SuperAppEditorManager())
|
||||
: sInstance;
|
||||
}
|
||||
|
||||
public SuperAppEditorManager() {
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
var tmp = getPreferences().getString("superapp_items", "menu,promo,miniapps,vkpay_slim,greeting,holiday,weather,sport,games,informer,food,event,music,vk_run");
|
||||
var selectedTags = !tmp.isEmpty() ? tmp.split(",") : new String[0];
|
||||
parseSelectedItems(selectedTags);
|
||||
}
|
||||
|
||||
private void parseSelectedItems(String[] selectedTabsTags) {
|
||||
List<String> allTags = new ArrayList<>(Arrays.asList( "menu", "promo", "miniapps", "vkpay_slim", "greeting", "holiday",
|
||||
"weather", "sport", "games", "informer", "food", "event", "music", "vk_run" ));
|
||||
for (String tag : selectedTabsTags) {
|
||||
mSelectedItems.add(getItemByTag(tag));
|
||||
allTags.remove(tag);
|
||||
}
|
||||
allTags.forEach(tag -> mDisabledItems.add(getItemByTag(tag)));
|
||||
}
|
||||
|
||||
public void save() {
|
||||
if (mSelectedItems.size() > 0)
|
||||
getPreferences().edit().putString("superapp_items", mSelectedItems.stream()
|
||||
.map(item -> item.type)
|
||||
.collect(Collectors.joining(",")))
|
||||
.commit();
|
||||
else
|
||||
reset();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
Globals.getPreferences()
|
||||
.edit()
|
||||
.putString("superapp_items", "menu,promo,vkpay_slim,greeting,holiday,informer,event,miniapps,weather,sport,games,food,music,vk_run")
|
||||
.commit();
|
||||
}
|
||||
|
||||
public List<SuperAppItem> getSelectedTabs() {
|
||||
return mSelectedItems;
|
||||
}
|
||||
|
||||
public List<SuperAppItem> getDisabledTabs() {
|
||||
return mDisabledItems;
|
||||
}
|
||||
|
||||
private SuperAppItem getItemByTag(String tag) {
|
||||
switch (tag) {
|
||||
case "menu":
|
||||
return SuperAppItem.valuesOf("menu", "Меню приложения");
|
||||
case "promo":
|
||||
return SuperAppItem.valuesOf("promo", "Mini Apps: промо");
|
||||
case "miniapps":
|
||||
return SuperAppItem.valuesOf("miniapps", "Mini Apps: виджет");
|
||||
case "vkpay_slim":
|
||||
return SuperAppItem.valuesOf("vkpay_slim", "VK Pay");
|
||||
case "greeting":
|
||||
return SuperAppItem.valuesOf("greeting", "Приветствие");
|
||||
case "holiday":
|
||||
return SuperAppItem.valuesOf("holiday", "Дни рождения у друзей");
|
||||
case "weather":
|
||||
return SuperAppItem.valuesOf("weather", "Погода");
|
||||
case "sport":
|
||||
return SuperAppItem.valuesOf("sport", "Спортивные события");
|
||||
case "games":
|
||||
return SuperAppItem.valuesOf("games", "Игры");
|
||||
case "informer":
|
||||
return SuperAppItem.valuesOf("informer", "Информер");
|
||||
case "food":
|
||||
return SuperAppItem.valuesOf("food", "Еда");
|
||||
case "event":
|
||||
return SuperAppItem.valuesOf("event", "Мероприятия");
|
||||
case "music":
|
||||
return SuperAppItem.valuesOf("music", "Музыка");
|
||||
case "vk_run":
|
||||
return SuperAppItem.valuesOf("vk_run", "VK Run");
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,8 @@ public class OTADialog implements OTAHelper.OTAListener{
|
||||
mActivity.runOnUiThread(() -> {
|
||||
// Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show();
|
||||
new ModalBottomSheetWrapper(mActivity)
|
||||
.setUpdateInfoView(mHelper.getNewVersionName(), mHelper.getUpdateDescription())
|
||||
.setTitle(getString("newversion") + " " + mHelper.getNewVersionName())
|
||||
.setUpdateInfoView(mHelper.getUpdateDescription())
|
||||
.setPositiveButton(getString("updateanddownload"), () -> {
|
||||
OTADownloader.downloadBuild(mHelper.getDownloadUrl());
|
||||
})
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
@@ -13,22 +13,23 @@ import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import ru.vtosters.lite.ui.fragments.BaseToolbarFragment;
|
||||
import com.vtosters.lite.R;
|
||||
|
||||
import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
|
||||
import ru.vtosters.lite.ui.components.DockBarEditorManager;
|
||||
import ru.vtosters.lite.ui.components.ItemMovingCallback;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
public class DockBarEditorFragment extends BaseToolbarFragment {
|
||||
|
||||
private RecyclerView mRecycler;
|
||||
private DockBarEditorAdapter mAdapter;
|
||||
private ItemTouchHelperCallback mCallback;
|
||||
private ItemTouchHelper mItemTouchHelper;
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
|
||||
setTitle(getIdentifier("dockbar_editor", "string"));
|
||||
@@ -48,10 +49,10 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
|
||||
);
|
||||
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
|
||||
|
||||
TextView save = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary));
|
||||
save.setText(Globals.getString("dockbar_save"));
|
||||
TextView save = new TextView(new ContextThemeWrapper(getContext(), R.style.VKUIButton_Primary));
|
||||
save.setText(Globals.getString("save"));
|
||||
save.setOnClickListener(v -> {
|
||||
DockBarManager.getInstance().save();
|
||||
DockBarEditorManager.getInstance().save();
|
||||
restartApplication();
|
||||
});
|
||||
|
||||
@@ -62,10 +63,10 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
|
||||
View divider = new View(getContext());
|
||||
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(convertDpToPixel(10), 0));
|
||||
|
||||
TextView reset = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary));
|
||||
reset.setText(Globals.getString("dockbar_reset"));
|
||||
TextView reset = new TextView(new ContextThemeWrapper(getContext(), R.style.VKUIButton_Primary));
|
||||
reset.setText(Globals.getString("reset"));
|
||||
reset.setOnClickListener(v -> {
|
||||
DockBarManager.getInstance().reset();
|
||||
DockBarEditorManager.getInstance().reset();
|
||||
restartApplication();
|
||||
});
|
||||
|
||||
@@ -73,19 +74,25 @@ public class DockBarEditorFragment extends BaseToolbarFragment {
|
||||
resetParams.weight = 1.0f;
|
||||
buttonsContainer.addView(reset, resetParams);
|
||||
|
||||
mRecycler = new RecyclerView(getContext());
|
||||
mRecycler.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
mRecycler.setAdapter((mAdapter = new DockBarEditorAdapter()));
|
||||
mRecycler.setHasFixedSize(true);
|
||||
DockBarEditorManager manager = DockBarEditorManager.getInstance();
|
||||
var adapter = new CategorizedAdapter(manager.getSelectedTabs(), manager.getDisabledTabs(), (holder, pos) -> {
|
||||
var tab = pos <= manager.getSelectedTabs().size()
|
||||
? manager.getSelectedTabs().get(pos - 1)
|
||||
: manager.getDisabledTabs().get(pos - manager.getSelectedTabs().size() - 2);
|
||||
holder.bindMovingItem(tab.iconID, tab.titleID);
|
||||
});
|
||||
adapter.setMinAndMaxCounts(DockBarEditorManager.MIN_SELECTED_TABS, DockBarEditorManager.MAX_SELECTED_TABS);
|
||||
|
||||
var recyclerView = new RecyclerView(getContext());
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
recyclerView.setAdapter(adapter);
|
||||
recyclerView.setHasFixedSize(true);
|
||||
var params = new LinearLayout.LayoutParams(-1, -1);
|
||||
params.gravity = Gravity.CENTER;
|
||||
container.addView(mRecycler, params);
|
||||
container.addView(recyclerView, params);
|
||||
|
||||
mCallback = new ItemTouchHelperCallback(mAdapter);
|
||||
|
||||
mItemTouchHelper = new ItemTouchHelper(mCallback);
|
||||
mItemTouchHelper.attachToRecyclerView(mRecycler);
|
||||
new ItemTouchHelper(new ItemMovingCallback(adapter)).attachToRecyclerView(recyclerView);
|
||||
|
||||
return content;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,14 @@
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import static ru.vtosters.lite.ui.PreferencesUtil.*;
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Globals.edit;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
import static ru.vtosters.lite.utils.Globals.sendToast;
|
||||
import static ru.vtosters.lite.utils.IconManager.icons;
|
||||
import static ru.vtosters.lite.utils.IconManager.iconsValues;
|
||||
import static ru.vtosters.lite.utils.IconManager.sIconsPlus;
|
||||
import static ru.vtosters.lite.utils.IconManager.sIconsPlusNames;
|
||||
import static ru.vtosters.lite.utils.IconManager.switchComponent;
|
||||
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||
import static ru.vtosters.lite.utils.Preferences.hasVerification;
|
||||
@@ -18,6 +22,7 @@ import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.TypedValue;
|
||||
@@ -26,56 +31,13 @@ import android.widget.RadioGroup;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.view.ContextThemeWrapper;
|
||||
import androidx.core.content.res.ResourcesCompat;
|
||||
|
||||
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
|
||||
|
||||
import ru.vtosters.lite.ui.PreferencesUtil;
|
||||
|
||||
public class IconsFragment extends MaterialPreferenceToolbarFragment{
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
@Override
|
||||
public void onCreate(Bundle bundle){
|
||||
super.onCreate(bundle);
|
||||
|
||||
int vtosterXml = getIdentifier("empty", "xml");
|
||||
this.addPreferencesFromResource(vtosterXml);
|
||||
|
||||
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
|
||||
PreferencesUtil.addPreference(this, "", "Доступны не все иконки!", "Для разблокировки необходимо сделать пожертование от 99р", "ic_about_outline_28", preference -> {
|
||||
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app")));
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
PreferencesUtil.addPreferenceCategory(this, "Иконочки");
|
||||
|
||||
for (var i = 0; i < icons().size(); i++) {
|
||||
if (icons().get(i) == null || iconsValues().get(i) == null) return;
|
||||
|
||||
String iconname = icons().get(i);
|
||||
String icon = iconsValues().get(i);
|
||||
|
||||
// String icondrawable;
|
||||
//
|
||||
// if (icon.contains("vt")) {
|
||||
// icondrawable = "vt_launcher_round";
|
||||
// } else if (icon.contains("standard")) {
|
||||
// icondrawable = "ic_launcher_round";
|
||||
// } else {
|
||||
// icondrawable = "ic_launcher_" + icon;
|
||||
// }
|
||||
//
|
||||
// Drawable drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier(icondrawable, "mipmap"), null);
|
||||
//
|
||||
// PreferencesUtil.addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
|
||||
|
||||
PreferencesUtil.addPreference(this, icon, iconname, "", "ic_bug_outline_28", preference -> {
|
||||
callSelectDialog(this.getContext(), icon);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
public static void callSelectDialog(Context ctx, String appicon){
|
||||
RadioGroup rg = new RadioGroup(ctx);
|
||||
@@ -86,10 +48,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment{
|
||||
|
||||
rg.addView(rgDefault);
|
||||
rg.addView(rgVK);
|
||||
|
||||
if (hasVerification()) {
|
||||
rg.addView(rgVKontakte);
|
||||
}
|
||||
rg.addView(rgVKontakte);
|
||||
|
||||
rgDefault.setTextSize(TypedValue.COMPLEX_UNIT_PX, convertDpToPixel(14f));
|
||||
rgVK.setTextSize(TypedValue.COMPLEX_UNIT_PX, convertDpToPixel(14f));
|
||||
@@ -103,7 +62,7 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment{
|
||||
rgVK.setText("VK");
|
||||
rgVK.setTextColor(getTextAttr());
|
||||
|
||||
rgVKontakte.setText("VKontakte");
|
||||
rgVKontakte.setText("ВКонтакте");
|
||||
rgVKontakte.setTextColor(getTextAttr());
|
||||
|
||||
rgVKontakte.setChecked(isZaboronaEnabled());
|
||||
@@ -145,4 +104,82 @@ public class IconsFragment extends MaterialPreferenceToolbarFragment{
|
||||
alert.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getAccentColor());
|
||||
alert.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(getAccentColor());
|
||||
}
|
||||
|
||||
@SuppressLint("UseCompatLoadingForDrawables")
|
||||
@Override
|
||||
public void onCreate(Bundle bundle){
|
||||
super.onCreate(bundle);
|
||||
|
||||
int vtosterXml = getIdentifier("empty", "xml");
|
||||
this.addPreferencesFromResource(vtosterXml);
|
||||
|
||||
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
|
||||
addPreference(this, "", "Доступны не все функции!", "Для разблокировки необходимо сделать пожертование от 99р", "ic_about_outline_28", preference -> {
|
||||
getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://vtosters.app")));
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
addPreferenceCategory(this, "Иконки");
|
||||
|
||||
for (var i = 0; i < icons().size(); i++) {
|
||||
if (icons().get(i) == null || iconsValues().get(i) == null) return;
|
||||
|
||||
String iconname = icons().get(i);
|
||||
String icon = iconsValues().get(i);
|
||||
|
||||
String icondrawable;
|
||||
|
||||
if (icon.equals("vt")) {
|
||||
icondrawable = "vt_launcher_round";
|
||||
} else if (icon.contains("standard")) {
|
||||
icondrawable = "ic_launcher_round";
|
||||
} else {
|
||||
icondrawable = "ic_launcher_" + icon;
|
||||
}
|
||||
|
||||
Drawable drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier(icondrawable, "mipmap"), null);
|
||||
|
||||
if (drawable == null) {
|
||||
drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier("ic_bug_outline_28", "drawable"), null);
|
||||
}
|
||||
|
||||
addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
|
||||
callSelectDialog(this.getContext(), icon);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
if (!hasVerification() && !getBoolValue("dialogrecomm", false)) {
|
||||
addPreferenceCategory(this, "Недоступные иконки");
|
||||
|
||||
for (var i = 2; i < sIconsPlusNames.size(); i++) {
|
||||
if (sIconsPlusNames.get(i) == null || sIconsPlus.get(i) == null) return;
|
||||
|
||||
String iconname = sIconsPlusNames.get(i);
|
||||
String icon = sIconsPlus.get(i);
|
||||
|
||||
String icondrawable;
|
||||
|
||||
if (icon.equals("vt")) {
|
||||
icondrawable = "vt_launcher_round";
|
||||
} else if (icon.contains("standard")) {
|
||||
icondrawable = "ic_launcher_round";
|
||||
} else {
|
||||
icondrawable = "ic_launcher_" + icon;
|
||||
}
|
||||
|
||||
Drawable drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier(icondrawable, "mipmap"), null);
|
||||
|
||||
if (drawable == null) {
|
||||
drawable = ResourcesCompat.getDrawable(getResources(), getIdentifier("ic_bug_outline_28", "drawable"), null);
|
||||
}
|
||||
|
||||
addPreferenceDrawable(this, icon, iconname, "", drawable, preference -> {
|
||||
sendToast("Иконка доступна только обладателям верификации");
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||
import static ru.vtosters.lite.utils.Globals.restartApplicationWithTimer;
|
||||
|
||||
import android.os.Bundle;
|
||||
@@ -9,6 +10,8 @@ import androidx.preference.Preference;
|
||||
|
||||
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
|
||||
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
public class InterfaceFragment extends MaterialPreferenceToolbarFragment{
|
||||
@Override
|
||||
public void onCreate(Bundle bundle){
|
||||
@@ -20,7 +23,6 @@ public class InterfaceFragment extends MaterialPreferenceToolbarFragment{
|
||||
private void prefs(){
|
||||
findPreference("stories").setOnPreferenceClickListener(new restart());
|
||||
findPreference("swipe").setOnPreferenceClickListener(new restart());
|
||||
findPreference("dockcounter").setOnPreferenceClickListener(new restart());
|
||||
}
|
||||
|
||||
public boolean restart(Preference preference){
|
||||
|
||||
@@ -26,7 +26,7 @@ import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
|
||||
import java.util.Arrays;
|
||||
|
||||
import ru.vtosters.lite.downloaders.VideoDownloader;
|
||||
import ru.vtosters.lite.ui.components.ImagineArrayAdapter;
|
||||
import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter;
|
||||
|
||||
public class MediaFragment extends MaterialPreferenceToolbarFragment{
|
||||
public static void download(Context ctx){
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
import static ru.vtosters.lite.utils.Globals.restartApplication;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.ContextThemeWrapper;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import ru.vtosters.lite.ui.adapters.CategorizedAdapter;
|
||||
import ru.vtosters.lite.ui.components.ItemMovingCallback;
|
||||
import ru.vtosters.lite.ui.components.SuperAppEditorManager;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
import ru.vtosters.lite.utils.LayoutHelper;
|
||||
import ru.vtosters.lite.utils.Themes;
|
||||
|
||||
public class SuperAppEditorFragment extends BaseToolbarFragment {
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) {
|
||||
setTitle(getIdentifier("superapp_editor", "string"));
|
||||
|
||||
FrameLayout content = new FrameLayout(getContext());
|
||||
|
||||
LinearLayout container = new LinearLayout(getContext());
|
||||
container.setOrientation(LinearLayout.VERTICAL);
|
||||
content.addView(container, new FrameLayout.LayoutParams(-1, -1));
|
||||
|
||||
TextView message = new TextView(getContext());
|
||||
message.setText(Globals.getString("superapp_editor_message"));
|
||||
message.setTextSize(16.0f);
|
||||
message.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
|
||||
message.setTextColor(Themes.getTextAttr());
|
||||
message.setPadding(
|
||||
Globals.convertDpToPixel(10),
|
||||
Globals.convertDpToPixel(10),
|
||||
Globals.convertDpToPixel(10),
|
||||
0
|
||||
);
|
||||
container.addView(message, LayoutHelper.createLinear(-1, -2));
|
||||
|
||||
LinearLayout buttonsContainer = new LinearLayout(getContext());
|
||||
buttonsContainer.setPadding(
|
||||
convertDpToPixel(13),
|
||||
convertDpToPixel(10),
|
||||
convertDpToPixel(13),
|
||||
convertDpToPixel(10)
|
||||
);
|
||||
container.addView(buttonsContainer, new LinearLayout.LayoutParams(-1, -2));
|
||||
|
||||
TextView save = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary));
|
||||
save.setText(Globals.getString("save"));
|
||||
save.setOnClickListener(v -> {
|
||||
SuperAppEditorManager.getInstance().save();
|
||||
restartApplication();
|
||||
});
|
||||
|
||||
LinearLayout.LayoutParams saveParams = new LinearLayout.LayoutParams(0, -2);
|
||||
saveParams.weight = 1.0f;
|
||||
buttonsContainer.addView(save, saveParams);
|
||||
|
||||
View divider = new View(getContext());
|
||||
buttonsContainer.addView(divider, new LinearLayout.LayoutParams(convertDpToPixel(10), 0));
|
||||
|
||||
TextView reset = new TextView(new ContextThemeWrapper(getContext(), com.vtosters.lite.R.style.VKUIButton_Primary));
|
||||
reset.setText(Globals.getString("reset"));
|
||||
reset.setOnClickListener(v -> {
|
||||
SuperAppEditorManager.getInstance().reset();
|
||||
restartApplication();
|
||||
});
|
||||
|
||||
LinearLayout.LayoutParams resetParams = new LinearLayout.LayoutParams(0, -2);
|
||||
resetParams.weight = 1.0f;
|
||||
buttonsContainer.addView(reset, resetParams);
|
||||
|
||||
SuperAppEditorManager manager = SuperAppEditorManager.getInstance();
|
||||
var adapter = new CategorizedAdapter(manager.getSelectedTabs(), manager.getDisabledTabs(), (holder, pos) -> {
|
||||
var item = pos <= manager.getSelectedTabs().size()
|
||||
? manager.getSelectedTabs().get(pos - 1)
|
||||
: manager.getDisabledTabs().get(pos - manager.getSelectedTabs().size() - 2);
|
||||
holder.bindMovingItem(item.title);
|
||||
});
|
||||
manager.getSelectedTabs().forEach(item -> {
|
||||
if (item.type.equals("menu"))
|
||||
adapter.addUnmovedItem(item);
|
||||
});
|
||||
manager.getDisabledTabs().forEach(item -> {
|
||||
if (item.type.equals("menu"))
|
||||
adapter.addUnmovedItem(item);
|
||||
});
|
||||
|
||||
var recyclerView = new RecyclerView(getContext());
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
recyclerView.setAdapter(adapter);
|
||||
recyclerView.setHasFixedSize(true);
|
||||
var params = new LinearLayout.LayoutParams(-1, -1);
|
||||
params.gravity = Gravity.CENTER;
|
||||
container.addView(recyclerView, params);
|
||||
|
||||
new ItemTouchHelper(new ItemMovingCallback(adapter)).attachToRecyclerView(recyclerView);
|
||||
|
||||
return content;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package ru.vtosters.lite.ui.fragments;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.*;
|
||||
import static ru.vtosters.lite.utils.Globals.edit;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||
import static ru.vtosters.lite.utils.Globals.restartApplicationWithTimer;
|
||||
|
||||
import android.content.Context;
|
||||
@@ -13,6 +15,8 @@ import androidx.preference.Preference;
|
||||
import com.vk.navigation.Navigator;
|
||||
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
|
||||
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
|
||||
public class ThemesFragment extends MaterialPreferenceToolbarFragment{
|
||||
|
||||
@@ -29,6 +33,13 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment{
|
||||
findPreference("darktheme").setOnPreferenceChangeListener(new restartdark());
|
||||
findPreference("lighttheme").setOnPreferenceChangeListener(new restartlight());
|
||||
findPreference("iconmanager").setOnPreferenceClickListener(new openicons());
|
||||
// findPreference("dockbar_tab_titles").setOnPreferenceChangeListener((preference, o) -> {
|
||||
// getPreferences().edit().putBoolean("dockbar_tab_titles", (boolean) o).commit();
|
||||
// restartApplication();
|
||||
// return false;
|
||||
// });
|
||||
findPreference("dockbar_accent").setOnPreferenceClickListener(new restart());
|
||||
findPreference("dockcounter").setOnPreferenceClickListener(new restart());
|
||||
}
|
||||
|
||||
public class openicons implements Preference.OnPreferenceClickListener{
|
||||
|
||||
@@ -7,9 +7,6 @@ import static ru.vtosters.lite.ui.PreferencesUtil.addMaterialSwitchPreference;
|
||||
import static ru.vtosters.lite.ui.PreferencesUtil.addPreference;
|
||||
import static ru.vtosters.lite.ui.PreferencesUtil.addPreferenceCategory;
|
||||
import static ru.vtosters.lite.ui.PreferencesUtil.addPreferenceDrawable;
|
||||
import static ru.vtosters.lite.ui.vkui.VBListBuilder.VBListItem;
|
||||
import static ru.vtosters.lite.ui.vkui.VBListBuilder.buildListOf;
|
||||
import static ru.vtosters.lite.ui.vkui.VBottomSheetBuilder.VBSContent;
|
||||
import static ru.vtosters.lite.utils.About.getBuildNumber;
|
||||
import static ru.vtosters.lite.utils.About.getCommitLink;
|
||||
import static ru.vtosters.lite.utils.CacheUtils.humanReadableByteCountBin;
|
||||
@@ -61,21 +58,17 @@ import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
|
||||
import com.vtosters.lite.general.fragments.SettingsAccountFragment;
|
||||
import com.vtosters.lite.general.fragments.SettingsGeneralFragment;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import ru.vtosters.lite.ui.components.DockBarEditorManager;
|
||||
import ru.vtosters.lite.ui.components.SuperAppEditorManager;
|
||||
import ru.vtosters.lite.ui.dialogs.OTADialog;
|
||||
import ru.vtosters.lite.ui.fragments.dockbar.DockBarEditorFragment;
|
||||
import ru.vtosters.lite.ui.fragments.dockbar.DockBarManager;
|
||||
import ru.vtosters.lite.ui.fragments.tgstickers.StickersFragment;
|
||||
import ru.vtosters.lite.ui.vkui.VBottomSheetBuilder;
|
||||
import ru.vtosters.lite.utils.CacheUtils;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
import ru.vtosters.lite.utils.SSFS;
|
||||
import ru.vtosters.lite.utils.VKUIwrapper;
|
||||
|
||||
public class VTSettings extends MaterialPreferenceToolbarFragment{
|
||||
public static int hideitems = 0;
|
||||
public int hideitems = 0;
|
||||
|
||||
public static String getValAsString(String stringid, Boolean value){
|
||||
if (disableSettingsSumms()) return null;
|
||||
@@ -99,7 +92,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment{
|
||||
public static String getDocksumm(){
|
||||
if (disableSettingsSumms()) return null;
|
||||
|
||||
return Globals.getString("vtldocksumm") + ": " + DockBarManager.getInstance().getSelectedTabs().size();
|
||||
return Globals.getString("vtldocksumm") + ": " + DockBarEditorManager.getInstance().getSelectedTabs().size();
|
||||
}
|
||||
|
||||
public static String getTGSsumm(){
|
||||
@@ -125,7 +118,7 @@ public class VTSettings extends MaterialPreferenceToolbarFragment{
|
||||
public static String getSuperappsumm(){
|
||||
if (disableSettingsSumms()) return null;
|
||||
|
||||
return "Скрыто элементов" + ": " + preferences.getInt("superappitems", 0);
|
||||
return "Скрыто элементов" + ": " + SuperAppEditorManager.getInstance().getDisabledTabs().size();
|
||||
}
|
||||
|
||||
public static String getCachesumm(){
|
||||
@@ -315,11 +308,23 @@ public class VTSettings extends MaterialPreferenceToolbarFragment{
|
||||
|
||||
addPreference(this, "", Globals.getString("dockbar_editor"), docksumm, !DoNotUseOldIcons() ? "ic_list_24" : "ic_list_outline_28", preference -> {
|
||||
Context context = getContext();
|
||||
Intent a2 = new Navigator(DockBarEditorFragment.class).b(context);
|
||||
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(a2);
|
||||
Intent intent = new Navigator(DockBarEditorFragment.class).b(context);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(intent);
|
||||
return false;
|
||||
});
|
||||
|
||||
if (milkshake() && superapp()) {
|
||||
addPreference(this, "", "Редактор Superapp", superapp, "ic_explore_outline_28", (preference) -> {
|
||||
Context context = getContext();
|
||||
Intent intent = new Navigator(SuperAppEditorFragment.class).b(context);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(intent);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
} else {
|
||||
addPreference(this, "", "Внимание!", "Некоторые пункты настроек были скрыты из-за режима VK Me \n\nДля отключения режима перейдите в настройки Сообщений", !DoNotUseOldIcons() ? "ic_about_24" : "ic_about_outline_28", preference -> false);
|
||||
}
|
||||
|
||||
addPreference(this, "", Globals.getString("vtlmedia"), mediasumm, "ic_media_outline_28", preference -> {
|
||||
@@ -370,13 +375,6 @@ public class VTSettings extends MaterialPreferenceToolbarFragment{
|
||||
return false;
|
||||
});
|
||||
|
||||
if (milkshake() && superapp()) {
|
||||
addPreference(this, "", "Настроить Superapp", superapp, "ic_explore_outline_28", (preference) -> {
|
||||
callEditorPopup();
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
addPreference(this, "", Globals.getString("vtlproxy"), proxysumm, !DoNotUseOldIcons() ? "ic_globe_20" : "ic_globe_outline_28", preference -> {
|
||||
Context context = getContext();
|
||||
Intent a2 = new Navigator(ProxySettingsFragment.class).b(context);
|
||||
@@ -442,45 +440,6 @@ public class VTSettings extends MaterialPreferenceToolbarFragment{
|
||||
}
|
||||
}
|
||||
|
||||
private void callEditorPopup(){
|
||||
hideitems = 0;
|
||||
|
||||
List<VBListItem> list = Arrays.asList(
|
||||
new VBListItem("promo", "Mini Apps: промо"),
|
||||
new VBListItem("miniapps", "Mini Apps: виджет"),
|
||||
new VBListItem("vkpay_slim", "VK Pay"),
|
||||
new VBListItem("greeting", "Приветствие"),
|
||||
new VBListItem("holiday", "Дни рождения у друзей"),
|
||||
new VBListItem("weather", "Погода"),
|
||||
new VBListItem("sport", "Спортивные события"),
|
||||
new VBListItem("games", "Игры"),
|
||||
new VBListItem("informer", "Информер"),
|
||||
new VBListItem("food", "Еда"),
|
||||
new VBListItem("event", "Мероприятия"),
|
||||
new VBListItem("music", "Музыка"),
|
||||
new VBListItem("vk_run", "VK Run")
|
||||
);
|
||||
|
||||
VBottomSheetBuilder.show(getActivity(), new VBSContent(
|
||||
null,
|
||||
null,
|
||||
buildListOf(getActivity(), list),
|
||||
|
||||
new VBSContent.VBSButton(
|
||||
"Сохранить",
|
||||
() -> {
|
||||
for (VBListItem item : list) {
|
||||
edit().putBoolean("superapp_" + item.id, item.checked).commit();
|
||||
if (item.checked) {
|
||||
hideitems++;
|
||||
edit().putInt("superappitems", hideitems).commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume(){
|
||||
super.onResume();
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
|
||||
public class AdapterHelper{
|
||||
|
||||
// Adapter item types
|
||||
public static final int TAB_TYPE = 1;
|
||||
public static final int CATEGORY_TITLE_TYPE = 2;
|
||||
|
||||
// Tab types
|
||||
public static final int SELECTED = 3;
|
||||
public static final int DISABLED = 4;
|
||||
|
||||
private static final DockBarManager sManager = DockBarManager.getInstance();
|
||||
|
||||
public static int getItemViewType(int i){
|
||||
return i == 0 || sManager.getSelectedTabs().size() + 1 == i ? CATEGORY_TITLE_TYPE : TAB_TYPE;
|
||||
}
|
||||
|
||||
public static int getTabType(int i){
|
||||
return i <= sManager.getSelectedTabs().size() ? SELECTED : DISABLED;
|
||||
}
|
||||
|
||||
public static boolean needTransfer(int from, int to){
|
||||
return getItemViewType(from) == TAB_TYPE && getItemViewType(to) == CATEGORY_TITLE_TYPE;
|
||||
}
|
||||
|
||||
public static int getItemCount(){
|
||||
return sManager.getSelectedTabs().size() + sManager.getDisabledTabs().size() + 2;
|
||||
}
|
||||
}
|
||||
@@ -1,190 +0,0 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Typeface;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import ru.vtosters.lite.utils.Themes;
|
||||
|
||||
public class DockBarEditorAdapter extends RecyclerView.Adapter<DockBarEditorAdapter.ItemViewHolder>
|
||||
implements IItemTouchHelper{
|
||||
|
||||
private final DockBarManager mDockBarManager = DockBarManager.getInstance();
|
||||
|
||||
@Override
|
||||
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
|
||||
FrameLayout container = new FrameLayout(getContext());
|
||||
container.addView(newGroupTitle(), new FrameLayout.LayoutParams(-1, -2));
|
||||
container.addView(newTabItem(), new FrameLayout.LayoutParams(-1, -2));
|
||||
return new ItemViewHolder(container);
|
||||
}
|
||||
|
||||
private View newTabItem(){
|
||||
LinearLayout container = new LinearLayout(getContext());
|
||||
container.setTag("tab_container");
|
||||
container.setGravity(Gravity.CENTER_VERTICAL);
|
||||
container.setOrientation(LinearLayout.HORIZONTAL);
|
||||
container.setPadding(
|
||||
convertDpToPixel(12),
|
||||
convertDpToPixel(12),
|
||||
convertDpToPixel(12),
|
||||
convertDpToPixel(12)
|
||||
);
|
||||
container.setLayoutParams(new LinearLayout.LayoutParams(-1, convertDpToPixel(48)));
|
||||
container.setVisibility(View.INVISIBLE);
|
||||
|
||||
ImageView icon = new ImageView(getContext());
|
||||
icon.setTag("tab_icon");
|
||||
icon.setImageTintList(ColorStateList.valueOf(Themes.getAccentColor()));
|
||||
icon.setLayoutParams(new LinearLayout.LayoutParams(
|
||||
convertDpToPixel(24),
|
||||
convertDpToPixel(24)));
|
||||
container.addView(icon);
|
||||
|
||||
TextView name = new TextView(getContext());
|
||||
name.setTag("tab_name");
|
||||
name.setTextSize(16.0f);
|
||||
name.setTypeface(Typeface.DEFAULT_BOLD);
|
||||
name.setTextColor(Themes.getTextAttr());
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -2);
|
||||
params.weight = 1;
|
||||
params.leftMargin = convertDpToPixel(16);
|
||||
container.addView(name, params);
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
private View newGroupTitle(){
|
||||
LinearLayout container = new LinearLayout(getContext());
|
||||
container.setTag("category_title_container");
|
||||
container.setLayoutParams(new LinearLayout.LayoutParams(-1, -2));
|
||||
container.setVisibility(View.INVISIBLE);
|
||||
|
||||
TextView title = new TextView(getContext());
|
||||
title.setTag("category_title");
|
||||
title.setTextSize(13.0f);
|
||||
title.setPadding(
|
||||
convertDpToPixel(16),
|
||||
convertDpToPixel(13),
|
||||
convertDpToPixel(16),
|
||||
convertDpToPixel(13)
|
||||
);
|
||||
title.setAllCaps(true);
|
||||
title.setTextColor(Themes.getTextAttr());
|
||||
container.addView(title, new LinearLayout.LayoutParams(-2, -2));
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ItemViewHolder holder, int position){
|
||||
holder.bind(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount(){
|
||||
return AdapterHelper.getItemCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemDismiss(int index){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onItemMove(int fromPosition, int toPosition){
|
||||
if (toPosition == 0)
|
||||
return false;
|
||||
|
||||
var selectedTabs = mDockBarManager.getSelectedTabs();
|
||||
var disabledTabs = mDockBarManager.getDisabledTabs();
|
||||
|
||||
DockBarTab curr;
|
||||
if (AdapterHelper.getTabType(fromPosition) == AdapterHelper.SELECTED) {
|
||||
curr = selectedTabs.get(fromPosition - 1);
|
||||
var min = selectedTabs.size() == DockBarManager.MIN_SELECTED_TABS_LIMIT;
|
||||
if (AdapterHelper.getItemViewType(toPosition) == AdapterHelper.CATEGORY_TITLE_TYPE) {
|
||||
if (min)
|
||||
return false;
|
||||
selectedTabs.remove(fromPosition - 1);
|
||||
disabledTabs.add(curr);
|
||||
for (int i = disabledTabs.size() - 2; i >= 0; i--) {
|
||||
var tmp = disabledTabs.get(i + 1);
|
||||
disabledTabs.set(i + 1, disabledTabs.get(i));
|
||||
disabledTabs.set(i, tmp);
|
||||
}
|
||||
} else if (AdapterHelper.getTabType(toPosition) == AdapterHelper.DISABLED && min) {
|
||||
return false;
|
||||
} else {
|
||||
Collections.swap(selectedTabs, fromPosition - 1, toPosition - 1);
|
||||
}
|
||||
} else if (AdapterHelper.getTabType(fromPosition) == AdapterHelper.DISABLED) {
|
||||
curr = disabledTabs.get(fromPosition - selectedTabs.size() - 2);
|
||||
var max = selectedTabs.size() == DockBarManager.MAX_SELECTED_TABS_LIMIT;
|
||||
if (AdapterHelper.getItemViewType(toPosition) == AdapterHelper.CATEGORY_TITLE_TYPE) {
|
||||
if (max)
|
||||
return false;
|
||||
disabledTabs.remove(0);
|
||||
selectedTabs.add(curr);
|
||||
} else if (AdapterHelper.getTabType(toPosition) == AdapterHelper.SELECTED && max) {
|
||||
return false;
|
||||
} else {
|
||||
Collections.swap(disabledTabs, fromPosition - selectedTabs.size() - 2, toPosition - selectedTabs.size() - 2);
|
||||
}
|
||||
}
|
||||
|
||||
notifyItemMoved(fromPosition, toPosition);
|
||||
return true;
|
||||
}
|
||||
|
||||
protected class ItemViewHolder extends RecyclerView.ViewHolder{
|
||||
|
||||
private final LinearLayout mTabContainer;
|
||||
private final ImageView mTabIcon;
|
||||
private final TextView mTabName;
|
||||
|
||||
private final LinearLayout mCategoryTitleContainer;
|
||||
private final TextView mCategoryTitle;
|
||||
|
||||
public ItemViewHolder(View itemView){
|
||||
super(itemView);
|
||||
|
||||
mTabContainer = itemView.findViewWithTag("tab_container");
|
||||
mCategoryTitleContainer = itemView.findViewWithTag("category_title_container");
|
||||
|
||||
mTabIcon = mTabContainer.findViewWithTag("tab_icon");
|
||||
mTabName = mTabContainer.findViewWithTag("tab_name");
|
||||
|
||||
mCategoryTitle = mCategoryTitleContainer.findViewWithTag("category_title");
|
||||
}
|
||||
|
||||
public void bind(int pos){
|
||||
if (AdapterHelper.getItemViewType(pos) == AdapterHelper.TAB_TYPE) {
|
||||
DockBarTab tab = AdapterHelper.getTabType(pos) == AdapterHelper.SELECTED
|
||||
? mDockBarManager.getSelectedTabs().get(pos - 1)
|
||||
: mDockBarManager.getDisabledTabs().get(pos - mDockBarManager.getSelectedTabs().size() - 2);
|
||||
mTabIcon.setImageResource(tab.iconID);
|
||||
mTabName.setText(tab.titleID);
|
||||
mTabContainer.setVisibility(View.VISIBLE);
|
||||
mCategoryTitleContainer.setVisibility(View.INVISIBLE);
|
||||
} else {
|
||||
mCategoryTitle.setText(mDockBarManager.getCategoryTitles()[pos == 0 ? 0 : 1]);
|
||||
mCategoryTitleContainer.setVisibility(View.VISIBLE);
|
||||
mTabContainer.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
|
||||
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback{
|
||||
|
||||
private final DockBarEditorAdapter mAdapter;
|
||||
|
||||
public ItemTouchHelperCallback(DockBarEditorAdapter mAdapter){
|
||||
this.mAdapter = mAdapter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLongPressDragEnabled(){
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isItemViewSwipeEnabled(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMovementFlags(@NonNull RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder){
|
||||
int dragFlags = AdapterHelper.getItemViewType(viewHolder.getAdapterPosition()) != AdapterHelper.CATEGORY_TITLE_TYPE
|
||||
? ItemTouchHelper.UP | ItemTouchHelper.DOWN
|
||||
: 0;
|
||||
return makeMovementFlags(dragFlags, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction){
|
||||
mAdapter.onItemDismiss(viewHolder.getItemViewType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target){
|
||||
return mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
@@ -30,7 +29,6 @@ import android.widget.LinearLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
||||
|
||||
@@ -43,6 +41,7 @@ import java.io.File;
|
||||
|
||||
import ru.vtosters.lite.tgs.TGPref;
|
||||
import ru.vtosters.lite.ui.PreferencesUtil;
|
||||
import ru.vtosters.lite.ui.adapters.StickerPackAdapter;
|
||||
import ru.vtosters.lite.ui.fragments.BaseToolbarFragment;
|
||||
import ru.vtosters.lite.utils.Globals;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package ru.vtosters.lite.ui.fragments.dockbar;
|
||||
package ru.vtosters.lite.ui.items;
|
||||
|
||||
import com.vk.core.fragments.FragmentImpl;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package ru.vtosters.lite.ui.items;
|
||||
|
||||
public class SuperAppItem {
|
||||
|
||||
public String type;
|
||||
public String title;
|
||||
|
||||
public SuperAppItem(String type, String title) {
|
||||
this.type = type;
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public static SuperAppItem valuesOf(String type, String title) {
|
||||
return new SuperAppItem(type, title);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
package ru.vtosters.lite.ui.vkui;
|
||||
|
||||
import static ru.vtosters.lite.utils.Globals.*;
|
||||
import static ru.vtosters.lite.utils.Globals.getString;
|
||||
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.graphics.Typeface;
|
||||
import android.view.View;
|
||||
@@ -21,27 +23,19 @@ public class ModalBottomSheetWrapper{
|
||||
}
|
||||
|
||||
public ModalBottomSheetWrapper setTitle(String title){
|
||||
builder.b(title);
|
||||
builder.d(title);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ModalBottomSheetWrapper setUpdateInfoView(String version, String changelog){
|
||||
var context = Globals.getContext();
|
||||
@SuppressLint("SetTextI18n")
|
||||
public ModalBottomSheetWrapper setUpdateInfoView(String changelog){
|
||||
var context = getContext();
|
||||
var container = new LinearLayout(context);
|
||||
var title = new TextView(context);
|
||||
var changelogView = new TextView(context);
|
||||
|
||||
container.setOrientation(LinearLayout.VERTICAL);
|
||||
|
||||
title.setText(getString("newversion") + " " + version);
|
||||
title.setTypeface(title.getTypeface(), Typeface.BOLD);
|
||||
title.setSingleLine(true);
|
||||
title.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
|
||||
title.setTextColor(getTextAttr());
|
||||
title.setTextSize(24.0f);
|
||||
container.addView(title, new LinearLayout.LayoutParams(-1, -2));
|
||||
|
||||
changelogView.setPadding(0, Globals.convertDpToPixel(8), 0, 0);
|
||||
changelogView.setPadding(0, convertDpToPixel(8), 0, 0);
|
||||
changelogView.setText(getString("changelog") + ": \n" + changelog);
|
||||
changelogView.setTextColor(getTextAttr());
|
||||
container.addView(changelogView, new LinearLayout.LayoutParams(-1, -2));
|
||||
@@ -51,15 +45,6 @@ public class ModalBottomSheetWrapper{
|
||||
return this;
|
||||
}
|
||||
|
||||
// try to call a true function and you will understand my pain
|
||||
public ModalBottomSheetWrapper setMessage(
|
||||
String text
|
||||
){
|
||||
builder.a(text, listener -> {
|
||||
});
|
||||
return this;
|
||||
}
|
||||
|
||||
public ModalBottomSheetWrapper setClickableMessage(
|
||||
String text,
|
||||
Runnable callback
|
||||
@@ -76,11 +61,6 @@ public class ModalBottomSheetWrapper{
|
||||
return this;
|
||||
}
|
||||
|
||||
public ModalBottomSheetWrapper setSubtitle(String text){
|
||||
builder.b((CharSequence) text);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ModalBottomSheetWrapper setView(View view){
|
||||
builder.a(view);
|
||||
return this;
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
package ru.vtosters.lite.ui.vkui;
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Preferences.getBoolValue;
|
||||
import static ru.vtosters.lite.utils.Themes.getTextAttr;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.TypedValue;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.appcompat.widget.AppCompatCheckBox;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class VBListBuilder{
|
||||
public static ViewGroup buildListOf(Context ctx, List<VBListItem> items){
|
||||
LinearLayout mainView = new LinearLayout(ctx);
|
||||
mainView.setOrientation(LinearLayout.VERTICAL);
|
||||
mainView.setPadding(convertDpToPixel(8f), 0, convertDpToPixel(8f), 0);
|
||||
|
||||
for (VBListItem item : items) {
|
||||
AppCompatCheckBox mcb = new AppCompatCheckBox(ctx, null);
|
||||
mcb.setPadding(0, convertDpToPixel(8f), 0, convertDpToPixel(8f));
|
||||
|
||||
mcb.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14f);
|
||||
mcb.setTextColor(getTextAttr());
|
||||
|
||||
mcb.setChecked(item.checked);
|
||||
mcb.setText(item.title);
|
||||
|
||||
mcb.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||
item.checked = isChecked;
|
||||
});
|
||||
|
||||
mainView.addView(mcb);
|
||||
}
|
||||
|
||||
return mainView;
|
||||
}
|
||||
|
||||
public static class VBListItem{
|
||||
public String id;
|
||||
public String title;
|
||||
public boolean checked;
|
||||
|
||||
public VBListItem(String id, String title){
|
||||
this(id, title, getBoolValue("superapp_" + id, false));
|
||||
}
|
||||
|
||||
public VBListItem(String id, String title, boolean checked){
|
||||
this.id = id;
|
||||
this.title = title;
|
||||
this.checked = checked;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,8 @@ public class VBottomSheetBuilder{
|
||||
|
||||
builder.setView(content.view);
|
||||
|
||||
builder.setTitle(content.title);
|
||||
|
||||
builder.setPositiveButton(content.button.title, () -> {
|
||||
// Button OnClick
|
||||
new Handler(Looper.getMainLooper()).post(content.button.action);
|
||||
@@ -23,13 +25,11 @@ public class VBottomSheetBuilder{
|
||||
public static class VBSContent{
|
||||
public String title;
|
||||
@Nullable
|
||||
public String subtitle;
|
||||
public View view;
|
||||
public VBSButton button;
|
||||
|
||||
public VBSContent(String title, @Nullable String subtitle, View view, VBSButton button){
|
||||
public VBSContent(String title, @Nullable View view, VBSButton button){
|
||||
this.title = title;
|
||||
this.subtitle = subtitle;
|
||||
this.view = view;
|
||||
this.button = button;
|
||||
}
|
||||
|
||||
@@ -1,167 +1,71 @@
|
||||
package ru.vtosters.lite.ui.wallpapers;
|
||||
|
||||
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaper;
|
||||
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaperFile;
|
||||
import static ru.vtosters.lite.utils.Globals.convertDpToPixel;
|
||||
import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
import static ru.vtosters.lite.utils.Themes.getSTextAttr;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
import ru.vtosters.lite.ui.adapters.MessagesPreviewAdapter;
|
||||
|
||||
import ru.vtosters.lite.utils.Themes;
|
||||
public class WallpaperPreferences extends Preference {
|
||||
|
||||
public class WallpaperPreferences extends Preference{
|
||||
private final Executor mExecutor = Executors.newSingleThreadExecutor();
|
||||
RecyclerView preview;
|
||||
ImageView bg;
|
||||
private Handler mUIHandler;
|
||||
private MessagesPreviewAdapter mAdapter;
|
||||
RecyclerView mRecyclerView;
|
||||
ImageView mChatBackground;
|
||||
|
||||
public WallpaperPreferences(Context context){
|
||||
public WallpaperPreferences(Context context) {
|
||||
this(context, null, -1, -1);
|
||||
}
|
||||
|
||||
public WallpaperPreferences(Context context, AttributeSet attributeSet){
|
||||
public WallpaperPreferences(Context context, AttributeSet attributeSet) {
|
||||
this(context, attributeSet, -1, -1);
|
||||
}
|
||||
|
||||
public WallpaperPreferences(Context context, AttributeSet attributeSet, int defStyleAttr){
|
||||
public WallpaperPreferences(Context context, AttributeSet attributeSet, int defStyleAttr) {
|
||||
this(context, attributeSet, defStyleAttr, -1);
|
||||
}
|
||||
|
||||
public WallpaperPreferences(Context context, AttributeSet attributeSet, int defStyleAttr, int i1){
|
||||
public WallpaperPreferences(Context context, AttributeSet attributeSet, int defStyleAttr, int i1) {
|
||||
super(context, attributeSet, defStyleAttr, i1);
|
||||
setLayoutResource(getIdentifier("wppreview", "layout"));
|
||||
}
|
||||
|
||||
public static int getMsgInColor(Context ctx){
|
||||
TypedValue typedValue = new TypedValue();
|
||||
ctx.getTheme().resolveAttribute(com.vtosters.lite.R.attr.im_bubble_incoming, typedValue, true);
|
||||
return typedValue.data;
|
||||
}
|
||||
|
||||
public static int getMsgOutColor(Context ctx){
|
||||
TypedValue typedValue = new TypedValue();
|
||||
ctx.getTheme().resolveAttribute(com.vtosters.lite.R.attr.im_bubble_outgoing, typedValue, true);
|
||||
return typedValue.data;
|
||||
}
|
||||
|
||||
public static int getSTextColor(Context ctx){
|
||||
TypedValue typedValue = new TypedValue();
|
||||
ctx.getTheme().resolveAttribute(getSTextAttr(), typedValue, true);
|
||||
return typedValue.data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(PreferenceViewHolder preferenceViewHolder){
|
||||
public void onBindViewHolder(PreferenceViewHolder preferenceViewHolder) {
|
||||
super.onBindViewHolder(preferenceViewHolder);
|
||||
|
||||
preview = (RecyclerView) preferenceViewHolder.findViewById(getIdentifier("install_btn_container", "id"));
|
||||
preview.setPadding(0, convertDpToPixel(8), 0, 0);
|
||||
preview.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
preview.setAdapter(new PreviewAdapter());
|
||||
preview.setClickable(false);
|
||||
preview.setFocusable(false);
|
||||
mRecyclerView = (RecyclerView) preferenceViewHolder.findViewById(getIdentifier("install_btn_container", "id"));
|
||||
mRecyclerView.setPadding(0, convertDpToPixel(8), 0, 0);
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
mRecyclerView.setAdapter((mAdapter = new MessagesPreviewAdapter()));
|
||||
mRecyclerView.setClickable(false);
|
||||
mRecyclerView.setFocusable(false);
|
||||
|
||||
mUIHandler = new Handler();
|
||||
|
||||
bg = (ImageView) preferenceViewHolder.findViewById(getIdentifier("author", "id"));
|
||||
mChatBackground = (ImageView) preferenceViewHolder.findViewById(getIdentifier("author", "id"));
|
||||
requestBg();
|
||||
}
|
||||
|
||||
private void requestBg(){
|
||||
mExecutor.execute(() -> {
|
||||
final Drawable drawable = getWallpaper();
|
||||
private void requestBg() {
|
||||
final Drawable drawable = getWallpaper();
|
||||
|
||||
mUIHandler.post(() -> {
|
||||
if (drawable != null && getWallpaperFile().exists())
|
||||
bg.setImageDrawable(drawable);
|
||||
else
|
||||
bg.setImageDrawable(null);
|
||||
});
|
||||
});
|
||||
if (drawable != null && getWallpaperFile().exists())
|
||||
mChatBackground.setImageDrawable(drawable);
|
||||
else
|
||||
mChatBackground.setImageDrawable(null);
|
||||
}
|
||||
|
||||
void redraw(){
|
||||
preview.getAdapter().notifyDataSetChanged();
|
||||
void redraw() {
|
||||
mAdapter.notifyDataSetChanged();
|
||||
requestBg();
|
||||
}
|
||||
|
||||
private static class PreviewAdapter extends RecyclerView.Adapter<PreviewAdapter.PreviewVH>{
|
||||
private final CharSequence[] previews = new CharSequence[] {
|
||||
" Привет ", " Привет ", " Ты кто? "
|
||||
};
|
||||
|
||||
private final boolean[] isOut = new boolean[] {
|
||||
false, true, false
|
||||
};
|
||||
|
||||
@Override
|
||||
public int getItemCount(){
|
||||
return previews.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull PreviewAdapter.PreviewVH previewVH, int i){
|
||||
TextView bubble = previewVH.itemView.findViewById(getIdentifier("author", "id"));
|
||||
|
||||
bubble.setText(previews[previewVH.getAdapterPosition()]);
|
||||
|
||||
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
|
||||
if (isOut[previewVH.getAdapterPosition()]) {
|
||||
params.addRule(RelativeLayout.ALIGN_PARENT_END);
|
||||
bubble.setPadding(convertDpToPixel(16), convertDpToPixel(16), convertDpToPixel(24), 0);
|
||||
bubble.setBackgroundResource(com.vtosters.lite.R.drawable.vkim_msg_new_out_light_full);
|
||||
bubble.setBackgroundTintList(ColorStateList.valueOf(getMsgOutColor(previewVH.itemView.getContext())));
|
||||
} else {
|
||||
params.addRule(RelativeLayout.ALIGN_PARENT_START);
|
||||
bubble.setPadding(convertDpToPixel(24), convertDpToPixel(16), convertDpToPixel(16), 0);
|
||||
bubble.setBackgroundResource(com.vtosters.lite.R.drawable.vkim_msg_new_in_light_full);
|
||||
bubble.setBackgroundTintList(ColorStateList.valueOf(getMsgInColor(previewVH.itemView.getContext())));
|
||||
}
|
||||
|
||||
bubble.setTextColor(Themes.getTextAttr());
|
||||
bubble.setLayoutParams(params);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public PreviewAdapter.PreviewVH onCreateViewHolder(@NonNull ViewGroup viewGroup, int i){
|
||||
Context ctx = viewGroup.getContext();
|
||||
|
||||
RelativeLayout root = new RelativeLayout(ctx);
|
||||
root.setLayoutParams(new RelativeLayout.LayoutParams(
|
||||
RelativeLayout.LayoutParams.MATCH_PARENT,
|
||||
RelativeLayout.LayoutParams.MATCH_PARENT));
|
||||
|
||||
TextView bubble = new TextView(ctx);
|
||||
bubble.setId(getIdentifier("author", "id"));
|
||||
root.addView(bubble);
|
||||
|
||||
return new PreviewVH(root);
|
||||
}
|
||||
|
||||
private static class PreviewVH extends RecyclerView.ViewHolder{
|
||||
public PreviewVH(@NonNull View view){
|
||||
super(view);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getMonochrome;
|
||||
import static ru.vtosters.lite.ui.wallpapers.ImageFilters.getMosaic;
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getPreferences;
|
||||
import static ru.vtosters.lite.utils.Preferences.hasVerification;
|
||||
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
@@ -55,11 +56,13 @@ public class WallpapersHooks{
|
||||
mWallpaper = getMosaic(mWallpaper);
|
||||
}
|
||||
|
||||
if (getPreferences().getBoolean("msg_monochrome", false)) {
|
||||
mWallpaper = getMonochrome(mWallpaper);
|
||||
}
|
||||
if (hasVerification()) {
|
||||
if (getPreferences().getBoolean("msg_monochrome", false)) {
|
||||
mWallpaper = getMonochrome(mWallpaper);
|
||||
}
|
||||
|
||||
mWallpaper = getFilteredDrawable(mWallpaper);
|
||||
mWallpaper = getFilteredDrawable(mWallpaper);
|
||||
}
|
||||
|
||||
mUpdateWallpaperRequested = false;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,8 @@ import android.graphics.RectF;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
@@ -39,6 +41,7 @@ import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.RequiresApi;
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
import com.vk.dto.user.UserProfile;
|
||||
@@ -361,10 +364,23 @@ public class Globals{
|
||||
|
||||
var isConnectionSucks = false;
|
||||
var cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
var nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
|
||||
|
||||
if (cm == null) return false;
|
||||
|
||||
NetworkCapabilities nc;
|
||||
Network[] networks = cm.getAllNetworks();
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
|
||||
} else {
|
||||
nc = cm.getNetworkCapabilities(networks[0]);
|
||||
}
|
||||
|
||||
var downSpeed = nc.getLinkDownstreamBandwidthKbps();
|
||||
var info = cm.getActiveNetworkInfo();
|
||||
|
||||
if (info == null) return false;
|
||||
|
||||
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
|
||||
switch(info.getSubtype()) {
|
||||
case TelephonyManager.NETWORK_TYPE_1xRTT:
|
||||
|
||||
@@ -37,11 +37,11 @@ public class IconManager {
|
||||
|
||||
// available icons list for verified users
|
||||
public static List<String> sIconsPlus = Arrays.asList(
|
||||
"standard", "vt", "navy", "tiger", "spring", "sea", "sakura", "party", "paint", "flamingo"
|
||||
"standard", "vt", "navy", "tiger", "spring", "sea", "sakura", "party", "paint", "flamingo", "old", "vt_navy", "vt_tiger", "vt_spring", "vt_sea", "vt_sakura", "vt_party", "vt_paint", "vt_flamingo"
|
||||
);
|
||||
|
||||
public static List<String> sIconsPlusNames = Arrays.asList(
|
||||
"VK", "VTLite", "Navy", "Tiger", "Spring", "Sea", "Sakura", "Party", "Paint", "Flamingo"
|
||||
"VK", "VTLite", "Navy", "Tiger", "Spring", "Sea", "Sakura", "Party", "Paint", "Flamingo", "Old Logo", "Navy alter", "Tiger alter", "Spring alter", "Sea alter", "Sakura alter", "Party alter", "Paint alter", "Flamingo alter"
|
||||
);
|
||||
|
||||
// available labels list for verified users
|
||||
@@ -54,11 +54,11 @@ public class IconManager {
|
||||
);
|
||||
|
||||
public static List<String> icons() {
|
||||
return hasVerification() && isValidSignature() && Build.VERSION.SDK_INT >= 26 ? sIconsPlusNames : sIconsNames; // delete later sdk check
|
||||
return hasVerification() && isValidSignature() ? sIconsPlusNames : sIconsNames; // delete later sdk check
|
||||
}
|
||||
|
||||
public static List<String> iconsValues() {
|
||||
return hasVerification() && isValidSignature() && Build.VERSION.SDK_INT >= 26 ? sIconsPlus : sIcons; // delete later sdk check
|
||||
return hasVerification() && isValidSignature() ? sIconsPlus : sIcons; // delete later sdk check
|
||||
}
|
||||
|
||||
public static void switchComponent(String icon, String appName, String oldIcon, String oldAppName) {
|
||||
|
||||
@@ -190,6 +190,10 @@ public class Preferences{
|
||||
return getBoolValue("superapp", true);
|
||||
}
|
||||
|
||||
public static boolean vkpay(){
|
||||
return getBoolValue("vkpay", true);
|
||||
}
|
||||
|
||||
public static boolean miniapps(){
|
||||
return getBoolValue("miniapps", true);
|
||||
}
|
||||
@@ -198,6 +202,10 @@ public class Preferences{
|
||||
return getBoolValue("friendsblock", false);
|
||||
}
|
||||
|
||||
public static boolean dockbar_accent(){
|
||||
return getBoolValue("dockbar_accent", true);
|
||||
}
|
||||
|
||||
public static boolean milkshake(){
|
||||
return getBoolValue("milkshake", false);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
package ru.vtosters.lite.utils;
|
||||
|
||||
import static java.lang.System.clearProperty;
|
||||
import static java.lang.System.getProperties;
|
||||
import static ru.vtosters.lite.utils.Globals.getContext;
|
||||
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Properties;
|
||||
|
||||
public class Proxy{
|
||||
public static String getApi(){
|
||||
var proxyapi = getPrefsValue("proxyapi");
|
||||
@@ -19,60 +29,124 @@ public class Proxy{
|
||||
return getPrefsValue("proxy").equals("zaborona");
|
||||
}
|
||||
|
||||
public static void setProxy(){
|
||||
var type = getPrefsValue("proxy");
|
||||
var properties = getProperties();
|
||||
private static void setProxyRefl() {
|
||||
Log.d("Proxy", "Setting proxy...");
|
||||
try {
|
||||
var context = getContext().getApplicationContext();
|
||||
Class<?> applicationClass = Class.forName("android.app.Application");
|
||||
@SuppressLint("DiscouragedPrivateApi") @SuppressWarnings("JavaReflectionMemberAccess")
|
||||
Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
|
||||
mLoadedApkField.setAccessible(true);
|
||||
Object mLoadedApkObject = mLoadedApkField.get(context);
|
||||
|
||||
resetProxy(type);
|
||||
@SuppressLint("PrivateApi")
|
||||
Class<?> loadedApkClass = Class.forName("android.app.LoadedApk");
|
||||
@SuppressLint("DiscouragedPrivateApi") Field mReceiversField = loadedApkClass.getDeclaredField("mReceivers");
|
||||
mReceiversField.setAccessible(true);
|
||||
ArrayMap<?, ?> receivers = (ArrayMap<?, ?>) mReceiversField.get(mLoadedApkObject);
|
||||
for (Object receiverMap : receivers.values()) {
|
||||
for (Object receiver : ((ArrayMap<?, ?>) receiverMap).keySet()) {
|
||||
Class<?> receiverClass = receiver.getClass();
|
||||
|
||||
switch(type) {
|
||||
if (receiverClass.getName().contains("ProxyChangeListener")) {
|
||||
Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class);
|
||||
Intent intent = new Intent(android.net.Proxy.PROXY_CHANGE_ACTION);
|
||||
onReceiveMethod.invoke(receiver, context, intent);
|
||||
} else {
|
||||
for (Field field : receiverClass.getDeclaredFields()) {
|
||||
if (field.getType().getName().contains("ProxyChangeListener")) {
|
||||
Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class);
|
||||
Intent intent = new Intent(android.net.Proxy.PROXY_CHANGE_ACTION);
|
||||
onReceiveMethod.invoke(receiver, context, intent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Log.d("Proxy", "Setting proxy successful!");
|
||||
} catch (Exception e) {
|
||||
Log.d("Proxy", "Setting proxy failed!");
|
||||
}
|
||||
}
|
||||
|
||||
public static void setProxy() {
|
||||
switch (getPrefsValue("proxy")) {
|
||||
case "zaborona":
|
||||
properties.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
|
||||
properties.setProperty("socksProxyPort", "1488");
|
||||
System.setProperty("socksProxyHost", "socks.zaboronahelp.pp.ua");
|
||||
System.setProperty("socksProxyPort", "1488");
|
||||
setProxyRefl();
|
||||
resetProxySocks();
|
||||
break;
|
||||
case "socks":
|
||||
properties.setProperty("socksProxyHost", proxyHostSocks());
|
||||
properties.setProperty("socksProxyPort", proxyPortSocks());
|
||||
System.setProperty("socksProxyHost", proxyHostSocks());
|
||||
System.setProperty("socksProxyPort", proxyPortSocks());
|
||||
setProxyRefl();
|
||||
resetProxySocks();
|
||||
break;
|
||||
case "http":
|
||||
properties.setProperty("http.proxyHost", proxyHostHTTP());
|
||||
properties.setProperty("http.proxyPort", proxyPortHTTP());
|
||||
properties.setProperty("http.proxyUser", proxyUserHTTP());
|
||||
properties.setProperty("http.proxyPassword", proxyPassHTTP());
|
||||
System.setProperty("http.proxyHost", proxyHostHTTP());
|
||||
System.setProperty("http.proxyPort", proxyPortHTTP());
|
||||
System.setProperty("http.proxyUser", proxyUserHTTP());
|
||||
System.setProperty("http.proxyPassword", proxyPassHTTP());
|
||||
setProxyRefl();
|
||||
resetProxyHttp();
|
||||
break;
|
||||
case "https":
|
||||
properties.setProperty("https.proxyHost", proxyHostHTTPS());
|
||||
properties.setProperty("https.proxyPort", proxyPortHTTPS());
|
||||
properties.setProperty("https.proxyUser", proxyUserHTTPS());
|
||||
properties.setProperty("https.proxyPassword", proxyPassHTTPS());
|
||||
System.setProperty("https.proxyHost", proxyHostHTTPS());
|
||||
System.setProperty("https.proxyPort", proxyPortHTTPS());
|
||||
System.setProperty("https.proxyUser", proxyUserHTTPS());
|
||||
System.setProperty("https.proxyPassword", proxyPassHTTPS());
|
||||
setProxyRefl();
|
||||
resetProxyHttps();
|
||||
break;
|
||||
default:
|
||||
resetProxy();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static void resetProxy(String except){
|
||||
if (!except.equals("https")) {
|
||||
clearProperty("https.proxyHost");
|
||||
clearProperty("https.proxyPort");
|
||||
clearProperty("https.proxyUser");
|
||||
clearProperty("https.proxyPassword");
|
||||
}
|
||||
|
||||
if (!except.equals("http")) {
|
||||
clearProperty("http.proxyHost");
|
||||
clearProperty("http.proxyPort");
|
||||
clearProperty("http.proxyUser");
|
||||
clearProperty("http.proxyPassword");
|
||||
}
|
||||
|
||||
if (except.equals("socks") || except.equals("zaborona")) {
|
||||
return;
|
||||
}
|
||||
|
||||
public static void resetProxy() {
|
||||
clearProperty("https.proxyHost");
|
||||
clearProperty("https.proxyPort");
|
||||
clearProperty("https.proxyUser");
|
||||
clearProperty("https.proxyPassword");
|
||||
clearProperty("http.proxyHost");
|
||||
clearProperty("http.proxyPort");
|
||||
clearProperty("http.proxyUser");
|
||||
clearProperty("http.proxyPassword");
|
||||
clearProperty("socksProxyHost");
|
||||
clearProperty("socksPortHost");
|
||||
} // Reset proxy
|
||||
} // Reset all proxies
|
||||
|
||||
public static void resetProxySocks() {
|
||||
clearProperty("https.proxyHost");
|
||||
clearProperty("https.proxyPort");
|
||||
clearProperty("https.proxyUser");
|
||||
clearProperty("https.proxyPassword");
|
||||
clearProperty("http.proxyHost");
|
||||
clearProperty("http.proxyPort");
|
||||
clearProperty("http.proxyUser");
|
||||
clearProperty("http.proxyPassword");
|
||||
} // Reset all except socks
|
||||
|
||||
public static void resetProxyHttp() {
|
||||
clearProperty("https.proxyHost");
|
||||
clearProperty("https.proxyPort");
|
||||
clearProperty("https.proxyUser");
|
||||
clearProperty("https.proxyPassword");
|
||||
clearProperty("socksProxyHost");
|
||||
clearProperty("socksPortHost");
|
||||
} // Reset all except http
|
||||
|
||||
public static void resetProxyHttps() {
|
||||
clearProperty("http.proxyHost");
|
||||
clearProperty("http.proxyPort");
|
||||
clearProperty("http.proxyUser");
|
||||
clearProperty("http.proxyPassword");
|
||||
clearProperty("socksProxyHost");
|
||||
clearProperty("socksPortHost");
|
||||
} // Reset all except https
|
||||
|
||||
private static String proxyHostHTTP(){
|
||||
var string = getPrefsValue("proxyHostHTTP");
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.vtosters.lite.utils;
|
||||
|
||||
import static android.graphics.Color.parseColor;
|
||||
import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
import static ru.vtosters.lite.hooks.VKUIHook.isLoaded;
|
||||
import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaper;
|
||||
@@ -10,6 +11,7 @@ import static ru.vtosters.lite.utils.Globals.getIdentifier;
|
||||
import static ru.vtosters.lite.utils.Globals.getPrefsValue;
|
||||
import static ru.vtosters.lite.utils.Globals.getResources;
|
||||
import static ru.vtosters.lite.utils.Preferences.color_grishka;
|
||||
import static ru.vtosters.lite.utils.Preferences.dockbar_accent;
|
||||
import static ru.vtosters.lite.utils.Preferences.milkshake;
|
||||
import static ru.vtosters.lite.utils.Preferences.navbar;
|
||||
import static ru.vtosters.lite.utils.Preferences.systemtheme;
|
||||
@@ -367,6 +369,19 @@ public class Themes{
|
||||
return vkme() ? VKME : Default;
|
||||
}
|
||||
|
||||
public static ColorStateList getCSTDock(){
|
||||
return new ColorStateList(
|
||||
new int[][]{
|
||||
new int[]{android.R.attr.state_checked},
|
||||
new int[]{-android.R.attr.state_checked}
|
||||
},
|
||||
new int[]{
|
||||
dockbar_accent() ? parseColor("#ff528bcc") : (isDarkTheme() ? parseColor("#ffefefef") : parseColor("#ff545454")),
|
||||
dockbar_accent() ? parseColor("#ffaaaeb3") : (isDarkTheme() ? parseColor("#ff8a8d92") : parseColor("#ffaaaeb3"))
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public static void systemThemeChanger(Activity activity){ // ded
|
||||
boolean isDarkTheme = isDarkTheme();
|
||||
|
||||
|
||||
@@ -227,7 +227,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher"
|
||||
android:icon="@mipmap/ic_launcher_round"
|
||||
android:name=".id01"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -239,7 +239,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher"
|
||||
android:icon="@mipmap/ic_launcher_round"
|
||||
android:name=".id02"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -275,7 +275,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_navy"
|
||||
android:icon="@mipmap/ic_launcher_navy"
|
||||
android:name=".id20"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -287,7 +287,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_navy"
|
||||
android:icon="@mipmap/ic_launcher_navy"
|
||||
android:name=".id21"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -299,7 +299,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_navy"
|
||||
android:icon="@mipmap/ic_launcher_navy"
|
||||
android:name=".id22"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -311,7 +311,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_tiger"
|
||||
android:icon="@mipmap/ic_launcher_tiger"
|
||||
android:name=".id30"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -323,7 +323,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_tiger"
|
||||
android:icon="@mipmap/ic_launcher_tiger"
|
||||
android:name=".id31"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -335,7 +335,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_tiger"
|
||||
android:icon="@mipmap/ic_launcher_tiger"
|
||||
android:name=".id32"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -347,7 +347,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_spring"
|
||||
android:icon="@mipmap/ic_launcher_spring"
|
||||
android:name=".id40"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -359,7 +359,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_spring"
|
||||
android:icon="@mipmap/ic_launcher_spring"
|
||||
android:name=".id41"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -371,7 +371,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_spring"
|
||||
android:icon="@mipmap/ic_launcher_spring"
|
||||
android:name=".id42"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -383,7 +383,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_sea"
|
||||
android:icon="@mipmap/ic_launcher_sea"
|
||||
android:name=".id50"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -395,7 +395,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_sea"
|
||||
android:icon="@mipmap/ic_launcher_sea"
|
||||
android:name=".id51"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -407,7 +407,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_sea"
|
||||
android:icon="@mipmap/ic_launcher_sea"
|
||||
android:name=".id52"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -419,7 +419,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_sakura"
|
||||
android:icon="@mipmap/ic_launcher_sakura"
|
||||
android:name=".id60"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -431,7 +431,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_sakura"
|
||||
android:icon="@mipmap/ic_launcher_sakura"
|
||||
android:name=".id61"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -443,7 +443,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_sakura"
|
||||
android:icon="@mipmap/ic_launcher_sakura"
|
||||
android:name=".id62"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -455,7 +455,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_party"
|
||||
android:icon="@mipmap/ic_launcher_party"
|
||||
android:name=".id70"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -467,7 +467,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_party"
|
||||
android:icon="@mipmap/ic_launcher_party"
|
||||
android:name=".id71"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -479,7 +479,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_party"
|
||||
android:icon="@mipmap/ic_launcher_party"
|
||||
android:name=".id72"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -491,7 +491,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_paint"
|
||||
android:icon="@mipmap/ic_launcher_paint"
|
||||
android:name=".id80"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -503,7 +503,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_paint"
|
||||
android:icon="@mipmap/ic_launcher_paint"
|
||||
android:name=".id81"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -515,7 +515,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_paint"
|
||||
android:icon="@mipmap/ic_launcher_paint"
|
||||
android:name=".id82"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -527,7 +527,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/mp_launcher_flamingo"
|
||||
android:icon="@mipmap/ic_launcher_flamingo"
|
||||
android:name=".id90"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -539,7 +539,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/mp_launcher_flamingo"
|
||||
android:icon="@mipmap/ic_launcher_flamingo"
|
||||
android:name=".id91"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -551,7 +551,7 @@
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/mp_launcher_flamingo"
|
||||
android:icon="@mipmap/ic_launcher_flamingo"
|
||||
android:name=".id92"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
@@ -561,6 +561,330 @@
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_old"
|
||||
android:name=".id100"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_old"
|
||||
android:name=".id101"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_old"
|
||||
android:name=".id102"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_navy"
|
||||
android:name=".id110"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_navy"
|
||||
android:name=".id111"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_navy"
|
||||
android:name=".id112"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_tiger"
|
||||
android:name=".id120"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_tiger"
|
||||
android:name=".id121"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_tiger"
|
||||
android:name=".id122"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_spring"
|
||||
android:name=".id130"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_spring"
|
||||
android:name=".id131"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_spring"
|
||||
android:name=".id132"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_sea"
|
||||
android:name=".id140"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_sea"
|
||||
android:name=".id141"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_sea"
|
||||
android:name=".id142"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_sakura"
|
||||
android:name=".id150"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_sakura"
|
||||
android:name=".id151"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_sakura"
|
||||
android:name=".id152"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_party"
|
||||
android:name=".id160"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_party"
|
||||
android:name=".id161"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_party"
|
||||
android:name=".id162"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_paint"
|
||||
android:name=".id170"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_paint"
|
||||
android:name=".id171"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_paint"
|
||||
android:name=".id172"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_orig"
|
||||
android:icon="@mipmap/ic_launcher_vt_flamingo"
|
||||
android:name=".id180"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name"
|
||||
android:icon="@mipmap/ic_launcher_vt_flamingo"
|
||||
android:name=".id181"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity-alias
|
||||
android:label="@string/app_name_alter"
|
||||
android:icon="@mipmap/ic_launcher_vt_flamingo"
|
||||
android:name=".id182"
|
||||
android:enabled="false"
|
||||
android:targetActivity="com.vtosters.lite.MainActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity-alias>
|
||||
<activity
|
||||
android:name="com.vtosters.lite.FragmentWrapperActivity"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
||||
@@ -588,7 +912,6 @@
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
||||
android:label=""
|
||||
android:theme="@style/TransparentTheme" />
|
||||
|
||||
<activity
|
||||
android:name="com.vk.sharing.PortraitSharingActivity"
|
||||
android:label=""
|
||||
|
||||
@@ -15,9 +15,10 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|center"
|
||||
android:clipChildren="false"
|
||||
android:clipToPadding="false"
|
||||
android:duplicateParentState="true"
|
||||
android:paddingBottom="10.0dip">
|
||||
android:paddingBottom="5.0dip">
|
||||
|
||||
<TextView
|
||||
android:id="@id/smallLabel"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/adaptive_launcher_background_old" />
|
||||
<foreground android:drawable="@mipmap/adaptive_launcher_foreground_old" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_flamingo_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_fresh_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_navy_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_paint_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_party_background" />
|
||||
<foreground android:drawable="@mipmap/vt_party_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_sakura_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_sea_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_spring_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_tiger_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/adaptive_launcher_background_old" />
|
||||
<foreground android:drawable="@mipmap/adaptive_launcher_foreground_old" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_flamingo_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_fresh_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_navy_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_paint_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_party_background" />
|
||||
<foreground android:drawable="@mipmap/vt_party_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_sakura_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_sea_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_spring_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@mipmap/ic_launcher_tiger_background" />
|
||||
<foreground android:drawable="@mipmap/vt_changeable_foreground" />
|
||||
</adaptive-icon>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 8.3 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 1.5 KiB |