From d870c2f98421f35e0ad4fbe62d1133c805d3faec Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 27 Sep 2023 22:12:12 +0300 Subject: [PATCH 001/113] Update VTSettings.java --- app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index dbf654d90..5b2c1cf24 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -108,7 +108,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PowerManager manager = (PowerManager) requireActivity().getSystemService(Context.POWER_SERVICE); boolean isLinksUnverified = AndroidUtils.isLinksUnverified(requireActivity()); boolean isDozingAvailable = Build.VERSION.SDK_INT >= 23 && !manager.isIgnoringBatteryOptimizations(AndroidUtils.getPackageName()); - boolean areNotificationsDisabled = !AndroidUtils.areNotificationsEnabled(); + boolean areNotificationsDisabled = !AndroidUtils.areNotificationsEnabled() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; boolean isGMSNotInstalled = !GmsHook.isAnyServicesInstalled(); if (AccountManagerUtils.isLogin()) { From fea984f6fd0f58428d5d595ed292069180d91fda Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 27 Sep 2023 23:34:37 +0300 Subject: [PATCH 002/113] fixed null foaf crash app --- .../java/ru/vtosters/lite/foaf/FoafBase.java | 44 +++++-------------- 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java b/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java index e09cc3469..d7c0f992a 100644 --- a/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java +++ b/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java @@ -34,43 +34,15 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; public class FoafBase { private static final Pattern FOAF_REGEX = Pattern.compile(" makeText(getGlobalContext(), context.getString(R.string.foaferr), LENGTH_SHORT).show()); + return; + } + + String normalHumanDate = getNormalHumanDate(m); LifecycleUtils.getCurrentActivity().runOnUiThread(() -> new VkAlertDialog.Builder(context) .setTitle(R.string.addinf) @@ -147,17 +126,14 @@ public class FoafBase { .show()); } catch (Exception e) { LifecycleUtils.getCurrentActivity().runOnUiThread(() -> makeText(getGlobalContext(), context.getString(R.string.foaferr), LENGTH_SHORT).show()); - e.printStackTrace(); } } private static long daysPassedFromFoafDate(String str) { try { - @SuppressLint("SimpleDateFormat") Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(str.split(" ")[1]); return TimeUnit.DAYS.convert(new Date().getTime() - parse.getTime(), TimeUnit.MILLISECONDS); } catch (ParseException e) { - e.printStackTrace(); return -1; } } From ae00e72bac1bd572937abdabe7a365a3c48c4d9f Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 27 Sep 2023 23:55:56 +0300 Subject: [PATCH 003/113] added more microg instructions --- smali/res/values-be/strings.xml | 3 ++- smali/res/values-ru/strings.xml | 2 +- smali/res/values-uk/strings.xml | 2 +- smali/res/values/strings.xml | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/smali/res/values-be/strings.xml b/smali/res/values-be/strings.xml index 4238820f8..a5fffc3b9 100644 --- a/smali/res/values-be/strings.xml +++ b/smali/res/values-be/strings.xml @@ -5981,6 +5981,7 @@ Карта любога банка Нумар бягучага месца Гуляе 8 Вашых сяброў + Стужка Інтэрфейс Медыякантэнт @@ -6066,7 +6067,7 @@ Спампаваць MicroG Што рабіць далей? Што рабіць пасля ўстаноўкі MicroG? - 1. Увайдзіце ў свой Google акаўнт \n2. Пераўсталюеце прыкладанне VTLite + 1. Увайдзіце ў свой Google рахунак на наладах MicroG\n2. Уключыце рэгістрацыю прылады\n3. Уключыце воблачны абмен паведамленнямі\n4. Пераўсталюеце VTLite\n5. Дазвольце яму прымаць паведамлення Дапамагчы праекту dd MMMM yyyy у HH:mm:ss dd MMMM у HH:mm:ss diff --git a/smali/res/values-ru/strings.xml b/smali/res/values-ru/strings.xml index b546a439e..e5411ef2c 100644 --- a/smali/res/values-ru/strings.xml +++ b/smali/res/values-ru/strings.xml @@ -5420,7 +5420,7 @@ Скачать MicroG Что делать дальше? Что делать после установки MicroG? - 1. Войдите в свой Google аккаунт в MicroG \n2. Переустановите приложение VTLite + 1. Войдите в свой Google аккаунт в настройках MicroG \n2. Включите регистрацию устройства \n3. Включите облачный обмен сообщениями \n4. Переустановите VTLite \n5. Разрешите ему принимать уведомления Помочь проекту dd MMMM yyyy в HH:mm:ss dd MMMM в HH:mm:ss diff --git a/smali/res/values-uk/strings.xml b/smali/res/values-uk/strings.xml index 42d5e7d90..630b5f0d9 100644 --- a/smali/res/values-uk/strings.xml +++ b/smali/res/values-uk/strings.xml @@ -5347,7 +5347,7 @@ Завантажити MicroG Що робити далі? Що робити після встановлення MicroG? - 1. Увійдіть до свого облікового запису Google \n2. Перевстановіть додаток VTLite" + "1. Увійдіть у свій обліковий запис Google у налаштуваннях MicroG\n2. Увімкніть реєстрацію пристрою\n3. Увімкніть Хмарний обмін повідомленнями\n4. Перевстановіть VTLite\n5. Дозвольте йому приймати повідомлення" Допомогти проекту dd MMMM yyyy в HH:mm:ss dd MMMM в HH:mm:ss diff --git a/smali/res/values/strings.xml b/smali/res/values/strings.xml index 6ba2c3569..86aea7b3d 100644 --- a/smali/res/values/strings.xml +++ b/smali/res/values/strings.xml @@ -5554,7 +5554,7 @@ Filters are not case-sensitive!" Download MicroG What to do next? What to do after installing MicroG? - 1. Log in to your Google account \n2. Reinstall VTLite application + 1. Log in to your Google account in the MicroG settings\n2. Enable device registration\n3. Enable cloud messaging\n4. Reinstall VTLite\n5. Allow him to receive notifications Donate dd MMMM yyyy HH:mm:ss dd MMMM HH:mm:ss From aac86a99527463f27a2102fdd04e8e37afb5f1bc Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 28 Sep 2023 11:09:40 +0300 Subject: [PATCH 004/113] Update InstallGMSFragment.java added inotia00 microg information --- .../ru/vtosters/lite/ui/fragments/InstallGMSFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java index 798a19252..62264c32b 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java @@ -13,13 +13,15 @@ public class InstallGMSFragment extends TrackedMaterialPreferenceToolbarFragment addPreferencesFromResource(R.xml.preferences_gms); findPreference("microg").setOnPreferenceClickListener((preference) -> { - String[] items = {"Уменьшенный MicroG (Vanced MicroG)", "Полноценный MicroG (Замена GMS)"}; + String[] items = {"Уменьшенный MicroG (ReVanced)", "Альтернативный MicroG (ReVanced)", "Полноценный MicroG (Замена GMS)"}; new VkAlertDialog.Builder(requireActivity()).setItems(items, (dialog, which) -> { switch (which) { case 0 -> requireContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://github.com/TeamVanced/VancedMicroG/releases/latest/download/microg.apk"))); case 1 -> + requireContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://github.com/inotia00/mMicroG/releases/latest/download/microg.apk"))); + case 2 -> requireContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://github.com/microg/GmsCore/releases"))); } dismiss(); From bf4cf2be537032b6c9bc9f4b0d616f9405504615 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 28 Sep 2023 16:10:30 +0300 Subject: [PATCH 005/113] adfree + free from server connection (#1481) --- .../vtosters/hooks/MainActivityInjector.java | 2 - .../ru/vtosters/hooks/VerificationsHook.java | 8 +- .../ru/vtosters/lite/ssfs/ProfileButtons.java | 28 ++--- .../java/ru/vtosters/lite/ssfs/UsersList.java | 4 +- .../lite/ui/components/IconManager.java | 6 +- .../lite/ui/dialogs/ServerDialog.java | 108 ------------------ .../ui/fragments/DataSettingsFragment.java | 14 +++ .../lite/ui/fragments/IconsFragment.java | 39 ------- .../lite/ui/fragments/OtherFragment.java | 6 + .../lite/ui/fragments/VTSettings.java | 40 +++---- .../lite/ui/wallpapers/ImageEffect.java | 31 ++--- .../ui/wallpapers/WallpaperMenuFragment.java | 17 --- .../vtosters/lite/utils/VTVerifications.java | 10 +- smali/res/xml/preferences_other.xml | 13 --- 14 files changed, 71 insertions(+), 255 deletions(-) delete mode 100644 app/src/main/java/ru/vtosters/lite/ui/dialogs/ServerDialog.java diff --git a/app/src/main/java/ru/vtosters/hooks/MainActivityInjector.java b/app/src/main/java/ru/vtosters/hooks/MainActivityInjector.java index d1f85c838..3e826e772 100644 --- a/app/src/main/java/ru/vtosters/hooks/MainActivityInjector.java +++ b/app/src/main/java/ru/vtosters/hooks/MainActivityInjector.java @@ -23,14 +23,12 @@ import ru.vtosters.lite.utils.NavigatorUtils; import ru.vtosters.lite.utils.VTVerifications; import static ru.vtosters.hooks.other.Preferences.checkupdates; -import static ru.vtosters.lite.ui.dialogs.ServerDialog.sendRequest; import static ru.vtosters.lite.utils.CacheUtils.getInstance; import static ru.vtosters.lite.utils.NewsFeedFiltersUtils.setupFilters; public class MainActivityInjector { public static void inject(Activity activity) { SystemThemeChangerHook.themeOnStart(activity); - sendRequest(); UsersList.getUsersList(); VTVerifications.load(activity); diff --git a/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java b/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java index 79d59ae1d..e37209392 100644 --- a/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java +++ b/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java @@ -20,7 +20,7 @@ public class VerificationsHook { return true; } - if (!getBoolValue("VT_Verification", true)) { + if (!getBoolValue("VT_Verification", true) || getBoolValue("serverFeaturesDisable", false)) { return false; } @@ -32,7 +32,7 @@ public class VerificationsHook { return true; } - if (!getBoolValue("VT_Fire", true)) { + if (!getBoolValue("VT_Fire", true) || getBoolValue("serverFeaturesDisable", false)) { return false; } @@ -40,10 +40,6 @@ public class VerificationsHook { } public static boolean hasDeveloper(JSONObject jSONObject) { - if (!getBoolValue("VT_Dev", true)) { - return false; - } - return VTVerifications.isDeveloper(VTVerifications.getId(jSONObject)); } diff --git a/app/src/main/java/ru/vtosters/lite/ssfs/ProfileButtons.java b/app/src/main/java/ru/vtosters/lite/ssfs/ProfileButtons.java index 363cfcccc..ab752da8c 100644 --- a/app/src/main/java/ru/vtosters/lite/ssfs/ProfileButtons.java +++ b/app/src/main/java/ru/vtosters/lite/ssfs/ProfileButtons.java @@ -26,20 +26,20 @@ public class ProfileButtons { newItem = orig.getJSONArray("buttons"); } - if (!VTVerifications.haveDonateButton() && id == AccountManagerUtils.getUserId()) { - var map = new HashMap<>(); - map.put("20", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/donate_icon/20.png"); - map.put("40", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/donate_icon/40.png"); - map.put("80", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/donate_icon/80.png"); - - newItem.put(generateJsonObject( - AndroidUtils.getString(com.vtosters.lite.R.string.donate_to_vtl), - "https://vk.com/vtosters_official", - "2D81E0", - "open_url", - map - )); - } +// if (!VTVerifications.haveDonateButton() && id == AccountManagerUtils.getUserId()) { +// var map = new HashMap<>(); +// map.put("20", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/donate_icon/20.png"); +// map.put("40", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/donate_icon/40.png"); +// map.put("80", "https://raw.githubusercontent.com/vtosters/lite/main/.github/images/donate_icon/80.png"); +// +// newItem.put(generateJsonObject( +// AndroidUtils.getString(com.vtosters.lite.R.string.donate_to_vtl), +// "https://vk.com/vtosters_official", +// "2D81E0", +// "open_url", +// map +// )); +// } if (!orig.has("type") && AccountManagerUtils.isVKTester()) { var map = new HashMap<>(); diff --git a/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java b/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java index cfe032c53..8f36a2bcd 100644 --- a/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java +++ b/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java @@ -17,6 +17,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import static ru.vtosters.hooks.other.Preferences.getBoolValue; + public class UsersList { private static final String TAG = "UsersList"; private static final List descriptionsList = new ArrayList<>(); @@ -25,7 +27,7 @@ public class UsersList { public static void getUsersList() { var prefs = AndroidUtils.getGlobalContext().getSharedPreferences("vt_another_data", 0); - if ((!NetworkUtils.isNetworkConnected() || NetworkUtils.isInternetSlow()) && prefs.contains("ids")) { + if ((!NetworkUtils.isNetworkConnected() || NetworkUtils.isInternetSlow()) && prefs.contains("ids") || getBoolValue("serverFeaturesDisable", false)) { return; } diff --git a/app/src/main/java/ru/vtosters/lite/ui/components/IconManager.java b/app/src/main/java/ru/vtosters/lite/ui/components/IconManager.java index a89de8b5d..cd4e5b249 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/components/IconManager.java +++ b/app/src/main/java/ru/vtosters/lite/ui/components/IconManager.java @@ -39,11 +39,11 @@ public class IconManager { ); public static List icons() { - return Preferences.hasVerification() && Preferences.isValidSignature() ? sIconsPlusNames : sIconsNames; // delete later sdk check + return sIconsPlusNames; // delete later sdk check } public static List iconsValues() { - return Preferences.hasVerification() && Preferences.isValidSignature() ? sIconsPlus : sIcons; // delete later sdk check + return sIconsPlus; // delete later sdk check } public static void switchComponent(String icon, String appName) { @@ -55,7 +55,7 @@ public class IconManager { Log.d("IconManager", "iconSwitcher: icon = " + icon + ", appname = " + appName); - List iconsList = (Preferences.hasVerification() && Preferences.isValidSignature()) ? sIconsPlus : sIcons; + List iconsList = sIconsPlus; List labelsList = sLabels; // check if icon is exist diff --git a/app/src/main/java/ru/vtosters/lite/ui/dialogs/ServerDialog.java b/app/src/main/java/ru/vtosters/lite/ui/dialogs/ServerDialog.java deleted file mode 100644 index 1f60ae042..000000000 --- a/app/src/main/java/ru/vtosters/lite/ui/dialogs/ServerDialog.java +++ /dev/null @@ -1,108 +0,0 @@ -package ru.vtosters.lite.ui.dialogs; - -import android.app.Activity; -import android.content.Intent; -import android.net.Uri; -import android.util.Log; -import com.vk.core.dialogs.alert.VkAlertDialog; -import okhttp3.*; -import org.json.JSONObject; -import ru.vtosters.hooks.other.Preferences; -import ru.vtosters.lite.di.singleton.VtOkHttpClient; -import ru.vtosters.lite.utils.LifecycleUtils; - -import java.io.IOException; -import java.util.Random; - -import static android.content.ContentValues.TAG; -import static ru.vtosters.hooks.other.Preferences.getBoolValue; -import static ru.vtosters.hooks.other.Preferences.hasVerification; - -public class ServerDialog { - private static final OkHttpClient client = VtOkHttpClient.getInstance(); - public static Boolean showAlert; - private static String title; - private static String message; - private static String positiveButton; - private static String neutralButton; - private static String link; - private static String key; - private static Boolean cancelable; - private static Boolean isNotForVerified; - - public static void sendRequest() { - if (getBoolValue("dialogrecomm", false)) return; - - if (!getBoolValue("isRoamingState", false)) { - Request request = new Request.a() - .b("https://vtosters.app/dialog.json") - .a(); - - client.a(request).a(new Callback() { - @Override - public void a(Call call, IOException e) { - Log.d(TAG, e.getMessage()); - showAlert = false; - } - - @Override - public void a(Call call, Response response) { - try { - getResponse(response.a().g()); - } catch (Exception e) { - showAlert = false; - } - } - }); - } - } - - private static Boolean showForNotVerified() { - int random = new Random().nextInt(6); - - if (isNotForVerified) { - return !hasVerification() && random != 0; - } - - return true; - } - - private static void getResponse(String body) throws Exception { - JSONObject jSONObject = new JSONObject(body); - - if (jSONObject.getString("title").equals("")) { - showAlert = false; - return; - } - - title = jSONObject.getString("title"); - message = jSONObject.getString("message"); - positiveButton = jSONObject.getString("positiveButton"); - neutralButton = jSONObject.getString("neutralButton"); - link = jSONObject.getString("link"); - key = jSONObject.getString("key"); - cancelable = jSONObject.getBoolean("cancelable"); - isNotForVerified = jSONObject.getBoolean("isNotForVerified"); - - showAlert = true; - - Activity activity = LifecycleUtils.getCurrentActivity(); - if (getBoolValue(key, true) && showForNotVerified() && showAlert) { - activity.runOnUiThread(() -> { - new VkAlertDialog.Builder(activity) - .setTitle(title) - .setMessage(message) - .setCancelable(cancelable) - .setPositiveButton(positiveButton, - (dialogInterface, i) -> Preferences.getPreferences().edit().putBoolean(key, false).apply()) - .setNeutralButton(neutralButton, (dialogInterface, i) -> { - Preferences.getPreferences().edit().putBoolean(key, false).apply(); - Intent intent = new Intent(Intent.ACTION_VIEW) - .setData(Uri.parse(link)); - activity.startActivity(intent); - }) - .show(); - }); - } - } -} diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java index adc1b6936..fd31e1a90 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java @@ -301,6 +301,20 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme } ); + PreferenceFragmentUtils.addMaterialSwitchPreference( + getPreferenceScreen(), + "serverFeaturesDisable", + "Отключить всю работу с сервером", + "Отключает галочки и все дополнительные функции связанные с получением данных с сервера ВТостерс", + null, + false, + (preference, o) -> { + Preferences.getPreferences().edit().putBoolean("serverFeaturesDisable", (boolean) o).apply(); + LifecycleUtils.restartApplicationWithTimer(); + return true; + } + ); + findPreference("analyticsDisabled").setVisible(Preferences.isValidSignature()); } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/IconsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/IconsFragment.java index a6780d4b3..b4b22f4c8 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/IconsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/IconsFragment.java @@ -92,13 +92,6 @@ public class IconsFragment extends TrackedMaterialPreferenceToolbarFragment { this.addPreferencesFromResource(R.xml.empty); - if (!Preferences.hasVerification() && !Preferences.getBoolValue("dialogrecomm", false)) { - PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", requireContext().getString(R.string.icons_warning), requireContext().getString(R.string.icons_warning_info), R.drawable.ic_about_outline_28, preference -> { - getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://vtosters.app/donate/"))); - return false; - }); - } - PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.icons_title)); for (var i = 0; i < IconManager.icons().size(); i++) { @@ -128,37 +121,5 @@ public class IconsFragment extends TrackedMaterialPreferenceToolbarFragment { return false; }); } - - if (!Preferences.hasVerification() && !Preferences.getBoolValue("dialogrecomm", false)) { - PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.unavailable_icons)); - - for (var i = 2; i < IconManager.sIconsPlusNames.size(); i++) { - if (IconManager.sIconsPlusNames.get(i) == null || IconManager.sIconsPlus.get(i) == null) return; - - String iconname = IconManager.sIconsPlusNames.get(i); - String icon = IconManager.sIconsPlus.get(i); - - int iconRes; - - if (icon.equals("vt")) { - iconRes = R.mipmap.vt_launcher_round; - } else if (icon.contains("standard")) { - iconRes = R.mipmap.ic_launcher_round; - } else { - iconRes = AndroidUtils.getIdentifier("ic_launcher_" + icon, "mipmap"); - } - - Drawable drawable = ResourcesCompat.getDrawable(getResources(), iconRes, null); - - if (drawable == null) { - drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_bug_outline_28, null); - } - - PreferenceFragmentUtils.addPreference(getPreferenceScreen(), icon, iconname, "", drawable, preference -> { - AndroidUtils.sendToast(requireContext().getString(R.string.unavailable_icon_warning)); - return false; - }); - } - } } } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java index c07b62380..c1d02f9e1 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java @@ -16,6 +16,8 @@ import ru.vtosters.lite.ssfs.UsersList; import ru.vtosters.lite.ui.activities.VKAdminTokenActivity; import ru.vtosters.lite.utils.*; +import static ru.vtosters.hooks.other.Preferences.getBoolValue; + public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment { private static final int VK_ADMIN_TOKEN_REQUEST_CODE = 1; @@ -110,6 +112,10 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment { return true; }); + findPreference("VT_Verification").setVisible(!getBoolValue("serverFeaturesDisable", false)); + findPreference("VT_Fire").setVisible(!getBoolValue("serverFeaturesDisable", false)); + findPreference("updateverifdata").setVisible(!getBoolValue("serverFeaturesDisable", false)); + var vkAdminTokenPref = findPreference("vk_admin_token"); vkAdminTokenPref.setVisible(Preferences.getPreferences().getBoolean("new_music_downloading_way", false)); if (vkAdminTokenPref.isVisible()) { diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index 5b2c1cf24..ada1c0a6c 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -142,18 +142,20 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { }); }); - PreferenceFragmentUtils.addPreference( - getPreferenceScreen(), - "", - requireContext().getString(R.string.vtssfs), - getSSFSsumm(), - R.drawable.ic_link_circle_outline_28, - preference -> { - VKUIwrapper.setLink(Utils.getVKUILink()); - NavigatorUtils.switchFragment(requireContext(), VKUIwrapper.class); - return false; - } - ); + if (Preferences.hasSpecialVerif()) { + PreferenceFragmentUtils.addPreference( + getPreferenceScreen(), + "", + requireContext().getString(R.string.vtssfs), + getSSFSsumm(), + R.drawable.ic_link_circle_outline_28, + preference -> { + VKUIwrapper.setLink(Utils.getVKUILink()); + NavigatorUtils.switchFragment(requireContext(), VKUIwrapper.class); + return false; + } + ); + } } PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), R.string.appearance_theme_use_system); @@ -649,20 +651,6 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { } ); - if (!Preferences.hasVerification() && !Preferences.getBoolValue("dialogrecomm", false)) { - PreferenceFragmentUtils.addPreference( - getPreferenceScreen(), - "", - "Помочь проекту", - "За донат можно получить приятные бонусы на аккаунт", - R.drawable.ic_money_circle_outline_28, - preference -> { - requireContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://vtosters.app/donate"))); - return false; - } - ); - } - PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java index b8fb22d83..4b6c55b66 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/ImageEffect.java @@ -11,8 +11,7 @@ import java.nio.ByteBuffer; import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; enum ImageEffects { - Blur(true, - AndroidUtils.getArray(R.array.filter_types), + Blur(AndroidUtils.getArray(R.array.filter_types), new String[]{"disabled", "low", "med", "high"}, getGlobalContext().getString(R.string.filter_blur) ) { @@ -40,8 +39,7 @@ enum ImageEffects { }; } }, - Dim(true, - AndroidUtils.getArray(R.array.filter_dim_types), + Dim(AndroidUtils.getArray(R.array.filter_dim_types), new String[]{"disabled", "dim_black", "dim_white"}, getGlobalContext().getString(R.string.filter_dim)) { @Override @@ -66,8 +64,7 @@ enum ImageEffects { }; } }, - Mosaic(true, - AndroidUtils.getArray(R.array.filter_types), + Mosaic(AndroidUtils.getArray(R.array.filter_types), new String[]{"disabled", "low", "med", "high"}, getGlobalContext().getString(R.string.filter_mosaic)) { @Override @@ -94,7 +91,7 @@ enum ImageEffects { }; } }, - Monochrome(false, null, null, + Monochrome(null, null, getGlobalContext().getString(R.string.filter_monochrome)) { @Override public void applyEffect(ByteBuffer bitmap, int height, int width) { @@ -103,7 +100,7 @@ enum ImageEffects { } } }, - Invert(false, null, null, + Invert(null, null, getGlobalContext().getString(R.string.filter_invert_colors)) { @Override public void applyEffect(ByteBuffer bitmap, int height, int width) { @@ -112,7 +109,7 @@ enum ImageEffects { } } }, - Sepia(false, null, null, + Sepia(null, null, getGlobalContext().getString(R.string.filter_sepia)) { @Override public void applyEffect(ByteBuffer bitmap, int height, int width) { @@ -121,7 +118,7 @@ enum ImageEffects { } } }, - Emboss(false, null, null, + Emboss(null, null, getGlobalContext().getString(R.string.filter_emboss)) { @Override public String getSummary() { @@ -135,7 +132,7 @@ enum ImageEffects { } } }, - Engrave(false, null, null, + Engrave(null, null, getGlobalContext().getString(R.string.filter_engrave)) { @Override public String getSummary() { @@ -149,7 +146,7 @@ enum ImageEffects { } } }, - Flea(false, null, null, + Flea(null, null, getGlobalContext().getString(R.string.filter_flea)) { @Override public void applyEffect(ByteBuffer bitmap, int height, int width) { @@ -158,7 +155,7 @@ enum ImageEffects { } } }, - Snow(false, null, null, + Snow(null, null, getGlobalContext().getString(R.string.filter_snow)) { @Override public void applyEffect(ByteBuffer bitmap, int height, int width) { @@ -168,15 +165,13 @@ enum ImageEffects { } }; - private final boolean free; private final String title; @Nullable private final String[] entryValues; @Nullable private final String[] entries; - ImageEffects(boolean free, @Nullable String[] entries, @Nullable String[] entryValues, String title) { - this.free = free; + ImageEffects(@Nullable String[] entries, @Nullable String[] entryValues, String title) { this.entries = entries; this.entryValues = entryValues; this.title = title; @@ -207,10 +202,6 @@ enum ImageEffects { return entryValues != null && entryValues.length > 0; } - public boolean isFree() { - return free; - } - @Nullable public String[] getEntries() { return entries; diff --git a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java index 5d91b4d45..3759e78d9 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/wallpapers/WallpaperMenuFragment.java @@ -80,24 +80,7 @@ public class WallpaperMenuFragment extends MaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.vtlfilters)); - if (!Preferences.hasVerification() && !Preferences.getBoolValue("dialogrecomm", false)) { - PreferenceFragmentUtils.addPreference( - getPreferenceScreen(), - "", - requireContext().getString(R.string.filters_warning), - requireContext().getString(R.string.icons_warning_info), - 0, - preference -> { - requireContext().startActivity( - new Intent(Intent.ACTION_VIEW) - .setData(Uri.parse("https://vtosters.app/donate/")) - ); - return false; - }); - } - Arrays.stream(ImageEffects.values()) - .filter(imageEffects -> imageEffects.isFree() || Preferences.hasVerification()) .forEach(it -> { if (it.isList()) { var pref = PreferenceFragmentUtils.addListPreference( diff --git a/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java b/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java index b71da8786..55ac55509 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java +++ b/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java @@ -12,10 +12,8 @@ import ru.vtosters.lite.di.singleton.VtOkHttpClient; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Random; import static ru.vtosters.hooks.other.Preferences.getBoolValue; -import static ru.vtosters.hooks.other.Preferences.hasVerification; public class VTVerifications { public static final List sVerifications = new ArrayList<>(); @@ -33,7 +31,7 @@ public class VTVerifications { return; } - if ((!NetworkUtils.isNetworkConnected() && NetworkUtils.isInternetSlow() || getBoolValue("isRoamingState", false)) && prefs.contains("ids")) { + if ((!NetworkUtils.isNetworkConnected() && NetworkUtils.isInternetSlow() || getBoolValue("isRoamingState", false)) && prefs.contains("ids") || getBoolValue("serverFeaturesDisable", false)) { parseJson(prefs.getString("ids", "[]")); Log.d("VTVerifications", "load from memory. Roaming or Network issues"); isLoaded = true; @@ -129,7 +127,7 @@ public class VTVerifications { return -id; } - public static boolean haveDonateButton() { - return hasVerification() || new Random().nextInt(6) != 1; - } +// public static boolean haveDonateButton() { +// return hasVerification() || new Random().nextInt(6) != 1; +// } } diff --git a/smali/res/xml/preferences_other.xml b/smali/res/xml/preferences_other.xml index 618dbf492..a4b9d2d69 100644 --- a/smali/res/xml/preferences_other.xml +++ b/smali/res/xml/preferences_other.xml @@ -10,25 +10,12 @@ android:title="@string/microgsett"/> - - - - Date: Thu, 28 Sep 2023 17:01:38 +0300 Subject: [PATCH 006/113] deleted useless summ and updated translation --- app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java | 2 +- smali/res/values-be/strings.xml | 2 +- smali/res/values-ru/strings.xml | 2 +- smali/res/values-uk/strings.xml | 2 +- smali/res/values/strings.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index ada1c0a6c..a01c44f57 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -147,7 +147,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { getPreferenceScreen(), "", requireContext().getString(R.string.vtssfs), - getSSFSsumm(), + "", R.drawable.ic_link_circle_outline_28, preference -> { VKUIwrapper.setLink(Utils.getVKUILink()); diff --git a/smali/res/values-be/strings.xml b/smali/res/values-be/strings.xml index a5fffc3b9..8bab35f27 100644 --- a/smali/res/values-be/strings.xml +++ b/smali/res/values-be/strings.xml @@ -6097,7 +6097,7 @@ Для ўключэння/адключэння вам неабходна ачысціць кэш прыкладання дадатковая інфармацыя Скапіяваць ID - VT Функцыі + Серверныя функцыі Іконка дадатку Выкарыстоўваць арыгінальную іконку Выкарыстанне арыгінальнай назвы і іконкі дадатку як у афіцыйнага кліента VK diff --git a/smali/res/values-ru/strings.xml b/smali/res/values-ru/strings.xml index e5411ef2c..166b850f7 100644 --- a/smali/res/values-ru/strings.xml +++ b/smali/res/values-ru/strings.xml @@ -5446,7 +5446,7 @@ Для включения/отключения вам необходимо очистить кеш приложения Дополнительная информация Скопировать айди - VT Функции + Серверные функции Иконка приложения Использовать оригинальную иконку Использование оригинального названия и иконки приложения как у официального клиента ВК diff --git a/smali/res/values-uk/strings.xml b/smali/res/values-uk/strings.xml index 630b5f0d9..15f77fe72 100644 --- a/smali/res/values-uk/strings.xml +++ b/smali/res/values-uk/strings.xml @@ -5373,7 +5373,7 @@ Для увімкнення/вимкнення вам необхідно очистити кеш додатка додаткова інформація Копіювати ID - VT Функції + Серверні функції Іконка додатку Використовувати оригінальну іконку Використання оригінальної назви та іконки додатку як у офіційного клієнта ВК diff --git a/smali/res/values/strings.xml b/smali/res/values/strings.xml index 86aea7b3d..9d3c6cb08 100644 --- a/smali/res/values/strings.xml +++ b/smali/res/values/strings.xml @@ -5580,7 +5580,7 @@ Does not affect vk.cc links" You need to clear the application cache after toggling this option Additional information Copy ID - VT Features + Server features App Icon Use original icon The original name and icon of VK From bd38cab37726d832a146ac51294001290f129546 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 28 Sep 2023 17:40:49 +0300 Subject: [PATCH 007/113] autoupdated disabler --- .../java/ru/vtosters/hooks/other/Preferences.java | 2 +- .../ru/vtosters/lite/ui/fragments/VTSettings.java | 13 +++++++++++++ .../java/ru/vtosters/lite/utils/LifecycleUtils.java | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ru/vtosters/hooks/other/Preferences.java b/app/src/main/java/ru/vtosters/hooks/other/Preferences.java index 8910c1acd..22b9cfcf7 100644 --- a/app/src/main/java/ru/vtosters/hooks/other/Preferences.java +++ b/app/src/main/java/ru/vtosters/hooks/other/Preferences.java @@ -288,7 +288,7 @@ public class Preferences { @SuppressWarnings("ConstantConditions") public static boolean checkupdates() { - return !getBoolValue("isRoamingState", false) && isValidSignature() && BuildConfig.BUILD_TYPE.equals("release"); + return !getBoolValue("isRoamingState", false) && isValidSignature() && BuildConfig.BUILD_TYPE.equals("release") && getBoolValue("autoupdates", true); } public static boolean isNewBuild() { diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index a01c44f57..81b1d9f8e 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -689,6 +689,19 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { return false; } ); + + PreferenceFragmentUtils.addMaterialSwitchPreference( + getPreferenceScreen(), + "autoupdates", + "Автоматическое обновление", + "Получать уведомление о выходе новой версии приложения", + R.drawable.ic_history_outline_28, + true, + (preference, o) -> { + Preferences.getPreferences().edit().putBoolean("autoupdates", (boolean) o).apply(); + return true; + } + ); } } diff --git a/app/src/main/java/ru/vtosters/lite/utils/LifecycleUtils.java b/app/src/main/java/ru/vtosters/lite/utils/LifecycleUtils.java index 5e6c075bd..fb7d6ea53 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/LifecycleUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/LifecycleUtils.java @@ -52,7 +52,7 @@ public class LifecycleUtils { } public static Activity getCurrentActivity() { - return activities.size() > 0 ? activities.get(activities.size() - 1) : new MainActivity(); + return !activities.isEmpty() ? activities.get(activities.size() - 1) : new MainActivity(); } public static void restartApplication() { From c59f29121f3f43341b7943e00cebf5ce1638294d Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 29 Sep 2023 19:58:33 +0300 Subject: [PATCH 008/113] Refactoted Telegram Stickers downloader and settings (#1485) --- .../aefyr/tsg/g2/TelegramStickersPack.java | 4 +- .../aefyr/tsg/g2/TelegramStickersService.java | 172 +++--- .../TelegramStickersGrabber.java | 506 +++++++----------- .../java/ru/vtosters/lite/foaf/FoafBase.java | 7 - .../java/ru/vtosters/lite/net/NetCall.java | 99 ++-- .../ru/vtosters/lite/net/NetResponse.java | 4 +- .../java/ru/vtosters/lite/net/Request.java | 2 +- .../java/ru/vtosters/lite/tgs/TGPref.java | 51 -- .../java/ru/vtosters/lite/tgs/TGRoot.java | 10 - .../tgstickers/StickersFragment.java | 143 ++--- .../StickersPreferencesFragment.java | 87 --- 11 files changed, 406 insertions(+), 679 deletions(-) delete mode 100644 app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersPreferencesFragment.java diff --git a/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersPack.java b/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersPack.java index 83b1cf2d1..63b2f6de2 100755 --- a/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersPack.java +++ b/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersPack.java @@ -36,8 +36,8 @@ public class TelegramStickersPack extends CustomStickersPack { public HashMap> emojis = new HashMap<>(); public TelegramStickersPack(String id) { - this.id=this.title=id; - this.hash=id.hashCode(); + this.id = this.title = id; + this.hash = id.hashCode(); } public JSONObject encodeEmojis() throws JSONException { diff --git a/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersService.java b/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersService.java index ba7c6281c..936e0e986 100755 --- a/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersService.java +++ b/app/src/main/java/com/aefyr/tsg/g2/TelegramStickersService.java @@ -26,19 +26,13 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; public class TelegramStickersService { private static final String TAG = "TGStickersService"; private static TelegramStickersService instance; - - private final Context c; - private final ArrayList packs; private final ArrayList activePacks; private final ArrayList inactivePacks; private final ArrayList listeners; private final HashSet currentlyDownloading; - private final Handler uiThreadHandler; - private final TelegramStickersGrabber grabber; - private final TelegramStickersDbHelper dbHelper; private final ArrayList queuedTasks; private final ThreadPoolExecutor executor; @@ -48,16 +42,14 @@ public class TelegramStickersService { private TelegramStickersService(Context context) { instance = this; - this.c = context.getApplicationContext(); - listeners = new ArrayList<>(); currentlyDownloading = new HashSet<>(); uiThreadHandler = new Handler(Looper.getMainLooper()); grabber = new TelegramStickersGrabber(null); - dbHelper = new TelegramStickersDbHelper(c); + dbHelper = new TelegramStickersDbHelper(context); queuedTasks = new ArrayList<>(); executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); - notificationsHelper = new NotificationsHelper(c); + notificationsHelper = new NotificationsHelper(context); packs = new ArrayList<>(); activePacks = new ArrayList<>(); @@ -70,11 +62,11 @@ public class TelegramStickersService { return instance == null ? new TelegramStickersService(c) : instance; } - private void updatePacks(final boolean notify) { + private void updatePacks(boolean notify) { packs.clear(); dbHelper.getAllPacks(new TelegramStickersDbHelper.PacksLoadingListener() { @Override - public void onPackLoaded(final TelegramStickersPack pack) { + public void onPackLoaded(TelegramStickersPack pack) { runOnUiThread(() -> { packs.add(pack); @@ -103,14 +95,6 @@ public class TelegramStickersService { }); } - public void addStickersEventsListener(StickersEventsListener listener) { - listeners.add(listener); - } - - public void removeStickersEventsListener(StickersEventsListener listener) { - listeners.remove(listener); - } - private void notifyPackAdded(TelegramStickersPack pack, int atIndex) { getGlobalContext().sendBroadcast(new Intent(StickersFragment.ACTION_RELOAD)); if (listeners.isEmpty()) @@ -188,20 +172,16 @@ public class TelegramStickersService { return inactivePacks; } - public boolean isDoneLoading() { - return ready; - } - - public boolean requestPackDownload(final String id, File packFolder) { + public void requestPackDownload(String id, File packFolder) { if (currentlyDownloading.contains(id)) { Log.e(TAG, String.format("Got request to download pack %s which is already downloading", id)); - return false; + return; } if (!ready) { - final File folder = packFolder; + File folder = packFolder; queuedTasks.add(() -> requestPackDownload(id, folder)); - return true; + return; } TelegramStickersPack pack = new TelegramStickersPack(id); @@ -221,85 +201,86 @@ public class TelegramStickersService { notifyPackAdded(pack, packs.size() - 1); } - final TelegramStickersPack newPack = pack; - final boolean isUpdate = update; + TelegramStickersPack newPack = pack; + boolean isUpdate = update; currentlyDownloading.add(id); notificationsHelper.packStartedDownloading(newPack); - - grabber.enableProxy(); - grabber.grabPack(id, packFolder, pack.version, new TelegramStickersGrabber.PackDownloadListener() { - @Override - public void onPackDownloaded(TelegramStickersPackInfo packInfo, boolean newVersionFound) { - - runOnUiThread(() -> { - newPack.state = TelegramStickersPack.DOWNLOADED; - notifyPackChanged(newPack, packs.indexOf(newPack)); - currentlyDownloading.remove(newPack.id); - syncPack(newPack); - - if (isUpdate) { - if (newPack.enabled) - notifyActivePacksListChanged(); - } else { - activePacks.add(newPack); - notifyActivePacksListChanged(); - } - }); - notificationsHelper.packDoneDownloading(newPack, true, isUpdate, null); - } - - @Override - public void onPackDownloadError(final Exception e) { - runOnUiThread(() -> { - Log.e(TAG, "Error while downloading pack " + newPack.id); - e.printStackTrace(); - - if (!isUpdate) { - int index = packs.indexOf(newPack); - packs.remove(index); - notifyPackRemoved(newPack, index); - } else { + // try-catch block to handle possible timeout exception + try { + grabber.grabPack(id, packFolder, pack.version, new TelegramStickersGrabber.PackDownloadListener() { + @Override + public void onPackDownloaded(TelegramStickersPackInfo packInfo, boolean newVersionFound) { + runOnUiThread(() -> { newPack.state = TelegramStickersPack.DOWNLOADED; notifyPackChanged(newPack, packs.indexOf(newPack)); - } + currentlyDownloading.remove(newPack.id); + syncPack(newPack); - notifyPackDownloadError(newPack, e); - currentlyDownloading.remove(newPack.id); - }); - notificationsHelper.packDoneDownloading(newPack, false, isUpdate, e); - } + if (isUpdate) { + if (newPack.enabled) + notifyActivePacksListChanged(); + } else { + activePacks.add(newPack); + notifyActivePacksListChanged(); + } + }); + notificationsHelper.packDoneDownloading(newPack, true, isUpdate, null); + } - @Override - public void onGotPackInfo(final TelegramStickersPackInfo packInfo) { - runOnUiThread(() -> { - newPack.title = packInfo.title; - newPack.stickersCount = packInfo.stickersCount; - newPack.version = packInfo.version; - notifyPackChanged(newPack, packs.indexOf(newPack)); - }); + @Override + public void onPackDownloadError(Exception e) { + runOnUiThread(() -> { + Log.e(TAG, "Error while downloading pack " + newPack.id); + e.printStackTrace(); - notificationsHelper.packDownloadUpdated(newPack, 0); - } + if (!isUpdate) { + int index = packs.indexOf(newPack); + packs.remove(index); + notifyPackRemoved(newPack, index); + } else { + newPack.state = TelegramStickersPack.DOWNLOADED; + notifyPackChanged(newPack, packs.indexOf(newPack)); + } - @Override - public void onStickerDownloaded(String pack, File sticker, String boundEmoji, int stickerIndex, int downloadedStickersCount, int totalStickersCount) { - stickerIndex--; + notifyPackDownloadError(newPack, e); + currentlyDownloading.remove(newPack.id); + }); + notificationsHelper.packDoneDownloading(newPack, false, isUpdate, e); + } - List list = newPack.emojis.get(boundEmoji); - if (list == null) list = new ArrayList<>(); - list.add(stickerIndex); - newPack.emojis.put(boundEmoji, list); + @Override + public void onGotPackInfo(TelegramStickersPackInfo packInfo) { + runOnUiThread(() -> { + newPack.title = packInfo.title; + newPack.stickersCount = packInfo.stickersCount; + newPack.version = packInfo.version; + notifyPackChanged(newPack, packs.indexOf(newPack)); + }); - notificationsHelper.packDownloadUpdated(newPack, downloadedStickersCount); - } - }); + notificationsHelper.packDownloadUpdated(newPack, 0); + } - return true; + @Override + public void onStickerDownloaded(String pack, File sticker, String boundEmoji, int stickerIndex, int downloadedStickersCount, int totalStickersCount) { + stickerIndex--; + + List list = newPack.emojis.get(boundEmoji); + if (list == null) list = new ArrayList<>(); + list.add(stickerIndex); + newPack.emojis.put(boundEmoji, list); + + notificationsHelper.packDownloadUpdated(newPack, downloadedStickersCount); + } + }); + } catch (Exception e) { + // handle other possible exceptions + e.printStackTrace(); + } } - public void setPackEnabled(final TelegramStickersPack pack, final boolean enabled, final boolean notify) { + public void setPackEnabled(TelegramStickersPack pack, boolean enabled, boolean notify) { if (!ready) { queuedTasks.add(() -> setPackEnabled(pack, enabled, notify)); return; @@ -325,7 +306,7 @@ public class TelegramStickersService { } } - public void deletePack(final TelegramStickersPack pack) { + public void deletePack(TelegramStickersPack pack) { if (!ready) { queuedTasks.add(() -> deletePack(pack)); return; @@ -334,7 +315,6 @@ public class TelegramStickersService { boolean d = dbHelper.deletePack(pack); Log.d(TAG, "Delete from DB=" + d); - int index = packs.indexOf(pack); packs.remove(index); notifyPackRemoved(pack, index); @@ -355,7 +335,7 @@ public class TelegramStickersService { uiThreadHandler.post(r); } - private void syncPack(final TelegramStickersPack pack) { + private void syncPack(TelegramStickersPack pack) { if (!ready) { queuedTasks.add(() -> syncPack(pack)); return; @@ -397,6 +377,4 @@ public class TelegramStickersService { void onInactivePacksListChanged(); } - - } diff --git a/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java b/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java index 6289d37aa..ff8487a93 100644 --- a/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java +++ b/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java @@ -7,23 +7,20 @@ import android.os.Looper; import android.util.Log; import com.aefyr.tsg.g2.stickersgrabber.util.Flag; import com.aefyr.tsg.g2.stickersgrabber.util.GoalCounter; +import okhttp3.*; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; -import ru.vtosters.lite.net.*; +import ru.vtosters.lite.di.singleton.VtOkHttpClient; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.net.PasswordAuthentication; -import java.net.Proxy; -import java.net.Socket; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; /** @@ -31,14 +28,19 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class TelegramStickersGrabber { private static final String TAG = "TSG"; + private static final OkHttpClient sClient = VtOkHttpClient.getInstance(); + private static final int MAX_RETRIES = 5; + private static final int STICKER_QUALITY = 100; + private static final String STICKER_FILE_NAME_FORMAT = "%03d.png"; + private static final String STICKERS_KEY = "stickers"; + private static final String FILE_ID_KEY = "file_id"; + private static final String EMOJI_KEY = "emoji"; + private static final String IS_ANIMATED_KEY = "is_animated"; + private static final String IS_VIDEO_KEY = "is_video"; + private static final String THUMB_KEY = "thumb"; + private static final String NAME_KEY = "name"; + private static final String TITLE_KEY = "title"; public static String REAL_TG_IP = null; - public static String PROXY_IP = null; - public static int PROXY_PORT = -1; - public static String PROXY_USER = null; - public static String PROXY_PASS = null; - public static boolean PROXY_SOCKS = true; - public static boolean HAS_PASS = false; - public static boolean USE_PROXY = false; private static String BOT_API_BASE_URL; private static String GET_STICKER_SET_URL; private static String GET_FILE_URL; @@ -50,12 +52,10 @@ public class TelegramStickersGrabber { private final MessageDigest sha256; private final Handler uiThreadHandler; - private String botApiKey = ""; - private NetClient httpClient; + private String botApiKey; public TelegramStickersGrabber(String botApiKey) { this.botApiKey = botApiKey; - httpClient = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build(); uiThreadHandler = new Handler(Looper.getMainLooper()); try { sha256 = MessageDigest.getInstance("SHA-256"); @@ -69,81 +69,12 @@ public class TelegramStickersGrabber { public static void updateURLs() { BOT_API_BASE_FILE_URL = "https://api.telegram.org/file/bot%s/%s"; - BOT_API_BASE_URL = REAL_TG_IP != null ? "https://" + REAL_TG_IP + "/bot%s/" : "https://api.telegram.org/bot%s/"; GET_STICKER_SET_URL = BOT_API_BASE_URL + "getStickerSet?name=%s"; GET_FILE_URL = BOT_API_BASE_URL + "getFile?file_id=%s"; } - public static boolean isTelegramBlocked() { - NetClient client = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build(); - try { - if (PROXY_IP != null) { - Socket socket = new Socket(PROXY_IP, PROXY_PORT); - Proxy proxy = new Proxy(Proxy.Type.SOCKS, socket.getRemoteSocketAddress()); - NetClient.Builder b = new NetClient.Builder().proxy(proxy); - if (PROXY_USER != null) { - b = b.proxyAuthenticator(new PasswordAuthentication(PROXY_USER, PROXY_PASS.toCharArray())); - } - client = b.build(); - socket.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - - NetRequest req = new NetRequest.Builder().url(REAL_TG_IP != null ? "https://" + REAL_TG_IP + "/test/" : "https://api.telegram.org/test/").build(); - try { - NetResponse res = client.newCall(req).execute(); - String s = res.getDataString(); - - if (!s.equals("{\"ok\":false,\"error_code\":404,\"description\":\"Not Found\"}")) - return true; - } catch (Exception e) { - return true; - } - return false; - } - - public void resetProxy() { - httpClient = new NetClient.Builder().connectTimeout(5, TimeUnit.SECONDS).build(); - } - - public void enableProxy() { - Thread kostil = new Thread() { - @Override - public void run() { - try { - if (PROXY_IP != null) { - Socket socket = new Socket(PROXY_IP, PROXY_PORT); - Proxy proxy = new Proxy(Proxy.Type.SOCKS, socket.getRemoteSocketAddress()); - NetClient.Builder b = httpClient.newBuilder().proxy(proxy); - - if (PROXY_USER != null) { - httpClient = b.proxyAuthenticator(new PasswordAuthentication(PROXY_USER, PROXY_PASS.toCharArray())).build(); - } - - httpClient = b.build(); - socket.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }; - - kostil.start(); - try { - kostil.join(); - Log.d(TAG, "Proxy set"); - } catch (InterruptedException e) { - Log.e(TAG, "Unable to set proxy:"); - e.printStackTrace(); - - } - } - - public void grabPack(String id, File packFolder, String installedVersion, final PackDownloadListener listener) { + public void grabPack(String id, File packFolder, String installedVersion, PackDownloadListener listener) { getPackInfo(id, packFolder, installedVersion, listener); } @@ -151,264 +82,237 @@ public class TelegramStickersGrabber { botApiKey = key; } - public void checkKey(final KeyCheckListener listener) { + public void checkKey(KeyCheckListener listener) { Log.d(TAG, "Checking key: " + botApiKey); - NetRequest request = new NetRequest.Builder().get().url(String.format(BOT_API_BASE_URL + "getMe", botApiKey)).build(); - httpClient.newCall(request).enqueue(new NetCallback() { + // Create a request object with the URL and bot API key + Request request = new Request.a() + .b(String.format(BOT_API_BASE_URL + "getMe", botApiKey)) + .a(); + // Create a new call object and enqueue it to run asynchronously + sClient.a(request).a(new Callback() { @Override - public void onFailure(NetCall call, IOException e) { - e.printStackTrace(); + public void a(Call call, IOException e) { + // Handle the failure case + Log.d(TAG, e.getMessage()); runOnUiThread(listener::onNetError); } @Override - public void onResponse(NetCall call, final NetResponse response) throws IOException { - runOnUiThread(() -> listener.onKeyChecked(response.code() == 200)); + public void a(Call call, Response response) { + Log.d(TAG, response.toString()); + runOnUiThread(() -> listener.onKeyChecked(response.h())); } }); } - private void getPackInfo(final String packName, final File packFolder, final String installedVersion, final PackDownloadListener listener) { - NetRequest packInfoRequest = new NetRequest.Builder().get().url(String.format(GET_STICKER_SET_URL, botApiKey, packName)).build(); - httpClient.newCall(packInfoRequest).enqueue(new NetCallback() { + private void getPack(StickerSet set, File packFolder, TelegramStickersPackInfo packInfo, PackDownloadListener listener) { + GoalCounter downloadedStickers = new GoalCounter(set.stickers.size(), () -> { + Log.d(TAG, String.format("Pack %s has been downloaded to %s", set.id, packFolder.getAbsolutePath())); + listener.onPackDownloaded(packInfo, true); + }); + Flag deathFlag = new Flag(); + + for (int i = 0; i < set.stickers.size(); i++) { + Sticker sticker = set.stickers.get(i); + String getFileUrl = String.format(GET_FILE_URL, botApiKey, sticker.fileId); + Request fileInfoRequest = new Request.a() + .b(getFileUrl) + .a(); + + int stickerIndex = i + 1; + + sClient.a(fileInfoRequest).a(new Callback() { + @Override + public void a(Call call, IOException e) { + handleFailure(deathFlag, listener, e); + } + + @Override + public void a(Call call, Response response) { + if (deathFlag.up()) + return; + + if (!response.h()) { + retryRequest(call, fileInfoRequest, this); + return; + } + + try (ResponseBody responseBody = response.a()) { + JSONObject fileInfoResponse = new JSONObject(responseBody.g()).getJSONObject("result"); + String filePath = fileInfoResponse.getString("file_path"); + + if (botApiKey == null) botApiKey = ""; + + String fileDownloadUrl = String.format(BOT_API_BASE_FILE_URL, botApiKey, filePath); + Request fileDownloadRequest = new Request.a() + .b(fileDownloadUrl) + .a(); + + sClient.a(fileDownloadRequest).a(new Callback() { + @Override + public void a(Call call, IOException e) { + handleFailure(deathFlag, listener, e); + } + + @Override + public void a(Call call, Response response) throws IOException { + if (deathFlag.up()) + return; + + if (!response.h()) { + retryRequest(call, fileDownloadRequest, this); + return; + } + + try (ResponseBody responseBody = response.a()) { + if (responseBody == null) { + handleFailure(deathFlag, listener, new TSGException("Response body for a sticker is null :/")); + return; + } + + InputStream stickerInputStream = responseBody.a(); + Bitmap stickerImage = BitmapFactory.decodeStream(stickerInputStream); + + if (stickerImage == null) { + handleFailure(deathFlag, listener, new TSGException("Unable to decode sticker image")); + return; + } + + File stickerFile = new File(packFolder, String.format(STICKER_FILE_NAME_FORMAT, stickerIndex)); + + try { + saveStickerImage(stickerImage, stickerFile); + } catch (TSGException e) { + throw new RuntimeException(e); + } + + listener.onStickerDownloaded(set.name, stickerFile, sticker.emoji, stickerIndex, + downloadedStickers.value() + 1, set.stickers.size()); + downloadedStickers.increase(); + } + } + }); + } catch (Exception e) { + handleFailure(deathFlag, listener, e); + } + } + }); + } + } + + private void handleFailure(Flag deathFlag, PackDownloadListener listener, Exception e) { + if (deathFlag.up()) + return; + + deathFlag.raise(); + listener.onPackDownloadError(e); + } + + private void retryRequest(Call call, Request request, Callback callback) { + AtomicInteger retryCount = new AtomicInteger(); + retryCount.incrementAndGet(); + + if (retryCount.get() > MAX_RETRIES) { + callback.a(call, new IOException()); + } else { + sClient.a(request).a(callback); + } + } + + private void saveStickerImage(Bitmap stickerImage, File stickerFile) throws IOException, TSGException { + try (FileOutputStream fileOutputStream = new FileOutputStream(stickerFile)) { + if (!stickerImage.compress(Bitmap.CompressFormat.PNG, STICKER_QUALITY, fileOutputStream)) { + throw new TSGException("Unable to compress sticker to a png file at path: " + stickerFile.getAbsolutePath()); + } + } finally { + stickerImage.recycle(); + } + } + + private void getPackInfo(String packName, File packFolder, String installedVersion, PackDownloadListener listener) { + String getStickerSetUrl = String.format(GET_STICKER_SET_URL, botApiKey, packName); + Request packInfoRequest = new Request.a() + .b(getStickerSetUrl) + .a(); + sClient.a(packInfoRequest).a(new Callback() { @Override - public void onFailure(NetCall call, IOException e) { + public void a(Call call, IOException e) { + Log.d(TAG, e.getMessage()); listener.onPackDownloadError(e); } @Override - public void onResponse(NetCall call, NetResponse response) { - if (!response.isSuccessful()) { - if (response.getData() != null) - listener.onPackDownloadError(new TSGException(response.getDataString() + "\nURL: " + call.request().url())); - else - listener.onPackDownloadError(new TSGException("Unknown Exception, no response body")); + public void a(Call call, Response response) throws IOException { + Log.d(TAG, response.toString()); + if (!response.h()) { + String errorMessage = response.a() != null ? response.a().g() + "\nURL: " + call.m0().g() : "Unknown Exception, no response body"; + listener.onPackDownloadError(new TSGException(errorMessage)); return; } - StickerSet set; - try { - JSONObject jPackInfo = new JSONObject(response.getDataString()).getJSONObject("result"); - String packVersion = new String(sha256.digest(jPackInfo.toString().getBytes(StandardCharsets.UTF_8))); + try (ResponseBody responseBody = response.a()) { + JSONObject packInfoResponse = new JSONObject(responseBody.g()).getJSONObject("result"); + String packVersion = new String(sha256.digest(packInfoResponse.toString().getBytes(StandardCharsets.UTF_8))); if (packVersion.equals(installedVersion)) { listener.onPackDownloaded(null, false); return; } - JSONArray jStickers = jPackInfo.getJSONArray("stickers"); + JSONArray stickersArray = packInfoResponse.getJSONArray(STICKERS_KEY); - if (jStickers.length() == 0) { + if (stickersArray.length() == 0) { listener.onPackDownloadError(new TSGException("No stickers in pack")); return; } - ArrayList stickers = new ArrayList<>(jStickers.length()); + ArrayList stickers = parseStickers(stickersArray); - Log.d(TAG, String.format("Parsing stickers in pack %s", packName)); + StickerSet set = new StickerSet(packInfoResponse.getString(NAME_KEY), packInfoResponse.getString(TITLE_KEY), packVersion, stickers); - for (int i = 0; i < jStickers.length(); i++) { - JSONObject jSticker = jStickers.getJSONObject(i); - if (jSticker.optBoolean("is_animated") || jSticker.optBoolean("is_video")) { - if (jSticker.has("thumb")) { - stickers.add(new Sticker(jSticker.getJSONObject("thumb").getString("file_id"), jSticker.getString("emoji"))); - } else { - listener.onPackDownloadError(new TSGException("Animated and video stickerpacks without thumbs are not supported!")); - return; - } - } else { - stickers.add(new Sticker(jSticker.getString("file_id"), jSticker.getString("emoji"))); - } + if (!packFolder.exists() && !packFolder.mkdirs()) { + // Handle the folder creation failure case + listener.onPackDownloadError(new IOException("Can't create folder for the pack!")); + return; } - set = new StickerSet(jPackInfo.getString("name"), jPackInfo.getString("title"), packVersion, stickers); + Log.d(TAG, String.format("Got info for pack %s, now downloading stickers to %s", packName, packFolder.getAbsolutePath())); + + TelegramStickersPackInfo packInfo = new TelegramStickersPackInfo(packName, set.name, set.stickers.size(), set.version); + + listener.onGotPackInfo(packInfo); + + getPack(set, packFolder, packInfo, listener); } catch (Exception e) { listener.onPackDownloadError(e); - return; } - - if (!packFolder.exists() && !packFolder.mkdirs()) { - listener.onPackDownloadError(new IOException("Can't create folder for the pack!")); - return; - } - - Log.d(TAG, String.format("Got info for pack %s, now downloading stickers to %s", packName, packFolder.getAbsolutePath())); - - TelegramStickersPackInfo packInfo = new TelegramStickersPackInfo(packName, set.name, set.stickers.size(), set.version); - listener.onGotPackInfo(packInfo); - getPack(set, packFolder, packInfo, listener); } }); } - private void getPack(final StickerSet set, final File packFolder, final TelegramStickersPackInfo packInfo, final PackDownloadListener listener) { - final GoalCounter downloadedStickers = new GoalCounter(set.stickers.size(), () -> { - Log.d(TAG, String.format("Pack %s has been downloaded to %s", set.id, packFolder.getAbsolutePath())); + private ArrayList parseStickers(JSONArray stickersArray) throws JSONException, TSGException { + ArrayList stickers = new ArrayList<>(stickersArray.length()); - listener.onPackDownloaded(packInfo, true); - }); - final Flag deathFlag = new Flag(); + for (int i = 0; i < stickersArray.length(); i++) { + JSONObject stickerObject = stickersArray.getJSONObject(i); + boolean isAnimated = stickerObject.optBoolean(IS_ANIMATED_KEY); + boolean isVideo = stickerObject.optBoolean(IS_VIDEO_KEY); + String fileId = stickerObject.getString(FILE_ID_KEY); + String emoji = stickerObject.getString(EMOJI_KEY); - AtomicInteger retryed = new AtomicInteger(); - for (int i = 0; i < set.stickers.size(); i++) { - final Sticker sticker = set.stickers.get(i); - NetRequest fileInfoRequest = new NetRequest.Builder().get().url(String.format(GET_FILE_URL, botApiKey, sticker.fileId)).build(); - - final int stickerIndex = i + 1; - - AtomicBoolean sync = new AtomicBoolean(); - httpClient.newCall(fileInfoRequest).enqueue(new NetCallback() { - @Override - public void onFailure(NetCall call, IOException e) { - if (deathFlag.up()) - return; - - deathFlag.raise(); - listener.onPackDownloadError(e); - - sync.set(true); + if (isAnimated || isVideo) { + if (stickerObject.has(THUMB_KEY)) { + fileId = stickerObject.getJSONObject(THUMB_KEY).getString(FILE_ID_KEY); + } else { + throw new TSGException("Animated and video stickerpacks without thumbs are not supported!"); } + } - @Override - public void onResponse(NetCall call, NetResponse response) throws IOException { - if (deathFlag.up()) - return; - - if (response.code() != 200) { - retryed.incrementAndGet(); - - if (retryed.get() > 5) - onFailure(call, new IOException()); - else httpClient.newCall(fileInfoRequest) - .enqueue(this); - - return; - } - - String filePath; - try { - JSONObject jFileInfo = new JSONObject(response.getDataString()).getJSONObject("result"); - filePath = jFileInfo.getString("file_path"); - } catch (Exception e) { - deathFlag.raise(); - listener.onPackDownloadError(e); - sync.set(true); - return; - } - - if (botApiKey == null) botApiKey = ""; - - NetRequest fileDownloadRequest = new NetRequest.Builder().get().url(String.format(BOT_API_BASE_FILE_URL, botApiKey, filePath)).build(); - - httpClient.newCall(fileDownloadRequest).enqueue(new NetCallback() { - @Override - public void onFailure(NetCall call, IOException e) { - if (deathFlag.up()) - return; - - deathFlag.raise(); - listener.onPackDownloadError(e); - - sync.set(true); - } - - @Override - public void onResponse(NetCall call, NetResponse response) throws IOException { - if (deathFlag.up()) - return; - - if (response.code() != 200) { - retryed.incrementAndGet(); - - if (retryed.get() > 5) - onFailure(call, new IOException()); - else httpClient.newCall(fileDownloadRequest) - .enqueue(this); - - return; - } - - if (response.getData() == null) { - deathFlag.raise(); - listener.onPackDownloadError(new TSGException("Response body for a sticker is null :/")); - sync.set(true); - return; - } - - InputStream stickerInputStream = response.getDataStream(); - - Bitmap stickerImage = BitmapFactory.decodeStream(stickerInputStream); - - try { - stickerInputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - - deathFlag.raise(); - listener.onPackDownloadError(e); - sync.set(true); - return; - } - - if (stickerImage == null) { - deathFlag.raise(); - listener.onPackDownloadError(new TSGException("Unable to decode sticker image")); - sync.set(true); - return; - } - - File stickerFile = new File(packFolder, String.format("%03d.png", stickerIndex)); - - FileOutputStream fileOutputStream; - try { - fileOutputStream = new FileOutputStream(stickerFile); - } catch (Exception e) { - e.printStackTrace(); - - deathFlag.raise(); - listener.onPackDownloadError(e); - sync.set(true); - return; - } - - if (!stickerImage.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { - stickerImage.recycle(); - deathFlag.raise(); - listener.onPackDownloadError(new TSGException("Unable to compress sticker to a png file at path: " + stickerFile.getAbsolutePath())); - sync.set(true); - return; - } - - stickerImage.recycle(); - - try { - fileOutputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - - deathFlag.raise(); - listener.onPackDownloadError(e); - sync.set(true); - return; - } - - - listener.onStickerDownloaded(set.name, stickerFile, sticker.emoji, stickerIndex, downloadedStickers.value() + 1, set.stickers.size()); - downloadedStickers.increase(); - - sync.set(true); - } - }); - } - }); - - while (!sync.get()) - try { - Thread.sleep(100); - } catch (InterruptedException e1) { - } + stickers.add(new Sticker(fileId, emoji)); } + + return stickers; } private void runOnUiThread(Runnable r) { @@ -431,7 +335,7 @@ public class TelegramStickersGrabber { void onNetError(); } - public class TSGException extends Exception { + public static class TSGException extends Exception { private static final long serialVersionUID = 7866915509988422944L; private TSGException(String message) { @@ -439,7 +343,7 @@ public class TelegramStickersGrabber { } } - private class StickerSet { + private static class StickerSet { String id; String name; String version; @@ -453,7 +357,7 @@ public class TelegramStickersGrabber { } } - private class Sticker { + private static class Sticker { String emoji; String fileId; diff --git a/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java b/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java index d7c0f992a..0f6781a6a 100644 --- a/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java +++ b/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java @@ -1,13 +1,10 @@ package ru.vtosters.lite.foaf; -import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Context; import android.util.Log; import com.vk.core.dialogs.alert.VkAlertDialog; -import com.vk.core.network.Network; import com.vtosters.lite.R; -import okhttp3.Headers; import okhttp3.OkHttpClient; import org.json.JSONException; import org.json.JSONObject; @@ -15,13 +12,9 @@ import ru.vtosters.lite.di.singleton.VtOkHttpClient; import ru.vtosters.lite.net.Request; import ru.vtosters.lite.utils.LifecycleUtils; -import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.Locale; -import java.util.Objects; -import java.util.TimeZone; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/app/src/main/java/ru/vtosters/lite/net/NetCall.java b/app/src/main/java/ru/vtosters/lite/net/NetCall.java index 236413d8f..617f88b60 100644 --- a/app/src/main/java/ru/vtosters/lite/net/NetCall.java +++ b/app/src/main/java/ru/vtosters/lite/net/NetCall.java @@ -3,16 +3,19 @@ package ru.vtosters.lite.net; import android.util.Base64; import android.util.Log; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.TreeMap; public final class NetCall { + // Constants for the request methods, content types, and encoding + private static final String GET = "GET"; + private static final String POST = "POST"; + private static final String FORM = "application/x-www-form-urlencoded"; + private static final String UTF_8 = "UTF-8"; + private final NetRequest req; private final NetClient cl; @@ -22,13 +25,17 @@ public final class NetCall { } private static String constructArgs(Map args) throws UnsupportedEncodingException { + // Use a TreeMap to sort the arguments by key args = new TreeMap<>(args); - String str = ""; - for (Map.Entry en : args.entrySet()) { - if (!str.isEmpty()) str += "&"; - str += URLEncoder.encode(en.getKey(), "UTF-8") + "=" + URLEncoder.encode(en.getValue(), "UTF-8"); + // Use a StringBuilder to append the arguments + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : args.entrySet()) { + if (sb.length() > 0) sb.append("&"); + sb.append(URLEncoder.encode(entry.getKey(), UTF_8)) + .append("=") + .append(URLEncoder.encode(entry.getValue(), UTF_8)); } - return str; + return sb.toString(); } public NetRequest request() { @@ -38,38 +45,52 @@ public final class NetCall { public NetResponse execute() throws IOException { Proxy proxy = cl.getProxy(); PasswordAuthentication auth = cl.getAuthenticator(); - HttpURLConnection con = (HttpURLConnection) new URL(req.url()).openConnection(proxy != null ? proxy : Proxy.NO_PROXY); + HttpURLConnection connection = (HttpURLConnection) new URL(req.url()).openConnection(proxy != null ? proxy : Proxy.NO_PROXY); if (proxy != null && auth != null) { + // Set the proxy authentication header String authStr = "Basic " + Base64.encodeToString((auth.getUserName() + new String(auth.getPassword())).getBytes(), Base64.NO_WRAP); - con.setRequestProperty("Proxy-Connection", "Keep-Alive"); - con.setRequestProperty("Proxy-Authorization", authStr); + connection.setRequestProperty("Proxy-Connection", "Keep-Alive"); + connection.setRequestProperty("Proxy-Authorization", authStr); } - con.setConnectTimeout((int) cl.getTimeout()); - con.setRequestMethod(req.getRequestMethod()); - if (req.getRequestMethod().equals("POST")) { - con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + connection.setConnectTimeout((int) cl.getTimeout()); + connection.setRequestMethod(req.getRequestMethod()); + if (req.getRequestMethod().equals(POST)) { + // Set the content type for POST requests + connection.setRequestProperty("Content-Type", FORM); } Map params = req.getRequestParams(); if (params != null) { - String strArgs = constructArgs(params); - con.setRequestProperty("Content-Length", String.valueOf(strArgs.getBytes(StandardCharsets.UTF_8).length)); - con.setDoOutput(true); - con.getOutputStream().write(strArgs.getBytes(StandardCharsets.UTF_8)); - con.getOutputStream().close(); + // Write the request parameters to the output stream + writeParams(connection, params); + } + connection.connect(); + InputStream input; + if (connection.getResponseCode() == 200) input = connection.getInputStream(); + else input = connection.getErrorStream(); + // Use try-with-resources to close the streams automatically + try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { + byte[] buffer = new byte[1024 * 1024]; + int count; + while ((count = input.read(buffer)) != -1) output.write(buffer, 0, count); + input.close(); + NetResponse response = new NetResponse(output.toByteArray()); + response.setCode(connection.getResponseCode()); + return response; + } + } + + private void writeParams(HttpURLConnection connection, Map params) throws IOException { + // Get the encoded arguments string + String args = constructArgs(params); + // Set the content length header + connection.setRequestProperty("Content-Length", String.valueOf(args.getBytes(StandardCharsets.UTF_8).length)); + // Enable output mode + connection.setDoOutput(true); + // Write the arguments to the output stream + try (OutputStream output = connection.getOutputStream()) { + output.write(args.getBytes(StandardCharsets.UTF_8)); + output.flush(); } - con.connect(); - InputStream in; - if (con.getResponseCode() == 200) in = con.getInputStream(); - else in = con.getErrorStream(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024 * 1024]; - int c; - while ((c = in.read(buffer)) != -1) bos.write(buffer, 0, c); - in.close(); - bos.close(); - NetResponse r = new NetResponse(bos.toByteArray()); - r.setCode(con.getResponseCode()); - return r; } public void enqueue(NetCallback cb) { @@ -82,12 +103,16 @@ public final class NetCall { } catch (IOException e) { cb.onFailure(NetCall.this, e); } +// try { +//// interrupt(); try { - interrupt(); join(); - } catch (Exception e) { - Log.e("NetCall", "Failed to interrupt and join thread", e); + } catch (InterruptedException e) { + throw new RuntimeException(e); } +// } catch (Exception e) { +// Log.e("NetCall", "Failed to interrupt and join thread", e); +// } } }.start(); } diff --git a/app/src/main/java/ru/vtosters/lite/net/NetResponse.java b/app/src/main/java/ru/vtosters/lite/net/NetResponse.java index b276c4c27..44b00aeac 100755 --- a/app/src/main/java/ru/vtosters/lite/net/NetResponse.java +++ b/app/src/main/java/ru/vtosters/lite/net/NetResponse.java @@ -8,11 +8,11 @@ public final class NetResponse { private final byte[] data; private int code; - NetResponse(byte[] data) { + public NetResponse(byte[] data) { this.data = data; } - void setCode(int code) { + public void setCode(int code) { this.code = code; } diff --git a/app/src/main/java/ru/vtosters/lite/net/Request.java b/app/src/main/java/ru/vtosters/lite/net/Request.java index e3be5fec1..b8460b519 100644 --- a/app/src/main/java/ru/vtosters/lite/net/Request.java +++ b/app/src/main/java/ru/vtosters/lite/net/Request.java @@ -51,7 +51,7 @@ public class Request { httpURLConnection.setRequestProperty("Content-Type", mIsVTostersRequest ? "Content-Type" : "application/x-www-form-urlencoded"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream())); - StringBuffer stringBuffer = new StringBuffer(); + StringBuilder stringBuffer = new StringBuilder(); while (true) { String readLine = bufferedReader.readLine(); if (readLine != null) { diff --git a/app/src/main/java/ru/vtosters/lite/tgs/TGPref.java b/app/src/main/java/ru/vtosters/lite/tgs/TGPref.java index 18cb36cf1..4129bdc44 100644 --- a/app/src/main/java/ru/vtosters/lite/tgs/TGPref.java +++ b/app/src/main/java/ru/vtosters/lite/tgs/TGPref.java @@ -7,22 +7,7 @@ import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; public class TGPref { private static final SharedPreferences Prefs = PreferenceManager.getDefaultSharedPreferences(getGlobalContext()); - - private static final String CNCT_METHOD = "VTGS:CM"; private static final String TG_BOTKEY = "VTGS:BKey"; - private static final String TG_PROXYIP = "VTGS:PIP"; - private static final String TG_PROXYPORT = "VTGS:PPT"; - private static final String TG_PROXYPASS = "VTGS:PPS"; - private static final String TG_PROXYUSER = "VTGS:PUS"; - private static final String TG_PROXYUSEPASS = "VTGS:PUsePassword"; - - public static int getTGConnectMethod() { - return Integer.parseInt(Prefs.getString(CNCT_METHOD, "0")); - } - - public static void setTGConnectMethod(int method) { - Prefs.edit().putString(CNCT_METHOD, String.valueOf(method)).apply(); - } public static String getTGBotKey() { return Prefs.getString(TG_BOTKEY, null); @@ -31,40 +16,4 @@ public class TGPref { public static void setTGBotKey(String key) { Prefs.edit().putString(TG_BOTKEY, key).apply(); } - - public static String getTGProxyIP() { - return Prefs.getString(TG_PROXYIP, null); - } - - public static void setTGProxyIP(String ip) { - Prefs.edit().putString(TG_PROXYIP, ip).apply(); - } - - public static int getTGProxyPort() { - return Prefs.getInt(TG_PROXYPORT, 0); - } - - public static void setTGProxyPort(int port) { - Prefs.edit().putInt(TG_PROXYPORT, port).apply(); - } - - public static String getTGProxyPass() { - return Prefs.getString(TG_PROXYPASS, ""); - } - - public static String getTGProxyUser() { - return Prefs.getString(TG_PROXYUSER, ""); - } - - public static void setTGProxyUserPass(String user, String pass) { - Prefs.edit().putString(TG_PROXYUSER, user).putString(TG_PROXYPASS, pass).apply(); - } - - public static boolean isTGProxyPassEnabled() { - return Prefs.getBoolean(TG_PROXYUSEPASS, false); - } - - public static void setTGProxyPassEnabled(boolean en) { - Prefs.edit().putBoolean(TG_PROXYUSEPASS, en).apply(); - } } diff --git a/app/src/main/java/ru/vtosters/lite/tgs/TGRoot.java b/app/src/main/java/ru/vtosters/lite/tgs/TGRoot.java index 0f8dfa5f1..10598d7fb 100644 --- a/app/src/main/java/ru/vtosters/lite/tgs/TGRoot.java +++ b/app/src/main/java/ru/vtosters/lite/tgs/TGRoot.java @@ -2,11 +2,9 @@ package ru.vtosters.lite.tgs; import com.aefyr.tsg.g2.TelegramStickersPack; import com.vk.dto.stickers.StickerStockItem; -import com.vtosters.lite.R; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import ru.vtosters.lite.utils.AndroidUtils; import java.util.Stack; @@ -15,14 +13,6 @@ public class TGRoot { public static final int X = 976820000; public final static Stack pendingStickers = new Stack<>(); - public static String getSummary() { - return switch (TGPref.getTGConnectMethod()) { - case 0 -> AndroidUtils.getString(R.string.ctypedirect); - case 2 -> AndroidUtils.getString(R.string.ctypesocks); - default -> AndroidUtils.getString(R.string.ctypedisabled); - }; - } - public static StickerStockItem toStickerPack(TelegramStickersPack p) throws JSONException { JSONArray arr = new JSONArray(); diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java index f0881b665..6bda90ad8 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java @@ -28,21 +28,16 @@ import ru.vtosters.lite.ui.adapters.StickerPackAdapter; import ru.vtosters.lite.ui.components.StickerTouchHelperCallback; import ru.vtosters.lite.ui.fragments.BaseToolbarFragment; import ru.vtosters.lite.utils.AndroidUtils; -import ru.vtosters.lite.utils.NavigatorUtils; import java.io.File; public class StickersFragment extends BaseToolbarFragment { - public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST"; - - final static int TYPE_DIRECT = 0; - final static int TYPE_SOCKS = 2; - + public static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST"; TelegramStickersGrabber mGrabber; StickerPackAdapter mAdapter; boolean movePending = false; int from, to; - final BroadcastReceiver mReceiver = new BroadcastReceiver() { + BroadcastReceiver mReceiver = new BroadcastReceiver() { @SuppressLint("NotifyDataSetChanged") @Override public void onReceive(Context context, Intent intent) { @@ -59,13 +54,28 @@ public class StickersFragment extends BaseToolbarFragment { } }; + private static void resetToken(Context ctx) { + if (TGPref.getTGBotKey() == null) AndroidUtils.sendToast("Токен отсутствует"); + new VkAlertDialog.Builder(ctx) + .setTitle("Сбросить токен бота?") + .setNegativeButton(R.string.cancel, (dialog, which) -> { + dialog.cancel(); + }) + .setPositiveButton(R.string.ok, (dialog, which) -> { + TGPref.setTGBotKey(null); + AndroidUtils.sendToast("Токен бота сброшен"); + }) + .show(); + } + @Override protected void onCreateMenu(Menu menu) { menu.add(0, 0, 0, "") .setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_add_outline_28))) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(0, 1, 0, "") - .setIcon(R.drawable.ic_settings_outline_28) + .setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_refresh_outline_28))) + .setTitle("Сбросить токен бота") .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); super.onCreateMenu(menu); } @@ -74,16 +84,11 @@ public class StickersFragment extends BaseToolbarFragment { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0 -> addTgsPack(); - case 1 -> openMenu(null); + case 1 -> resetToken(requireContext()); } return true; } - private void openMenu(String toast) { - if (toast != null) Toast.makeText(requireContext(), toast, Toast.LENGTH_SHORT).show(); - NavigatorUtils.switchFragment(requireContext(), StickersPreferencesFragment.class); - } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -96,14 +101,14 @@ public class StickersFragment extends BaseToolbarFragment { public View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle) { setTitle(R.string.vtltgs); - final var container = new FrameLayout(requireContext()); - final var recycler = new RecyclerView(requireContext()); + var container = new FrameLayout(requireContext()); + var recycler = new RecyclerView(requireContext()); mAdapter = new StickerPackAdapter(); recycler.setAdapter(mAdapter); - final var callback = new StickerTouchHelperCallback(mAdapter); - final var touchHelper = new ItemTouchHelper(callback); + var callback = new StickerTouchHelperCallback(mAdapter); + var touchHelper = new ItemTouchHelper(callback); touchHelper.attachToRecyclerView(recycler); recycler.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); @@ -124,80 +129,50 @@ public class StickersFragment extends BaseToolbarFragment { } private void addTgsPack() { - final var method = TGPref.getTGConnectMethod(); - if (method != -1) { - initGrabber(); - switch (method) { - case TYPE_SOCKS -> { - if (TGPref.getTGProxyIP() == null) openMenu(requireContext().getString(R.string.stickersproxy1)); - } - case TYPE_DIRECT -> { - initGrabber(); - final Runnable lambda = () -> + initGrabber(); + Runnable lambda = () -> { + var container = new LinearLayout(requireContext()); + + var input = new EditText(requireContext()); + var inputLP = new ViewGroup.MarginLayoutParams(-1, -2); + inputLP.setMargins( + AndroidUtils.dp2px(24.f), + 0, + AndroidUtils.dp2px(24.f), + 0); + container.addView(input, inputLP); + + new VkAlertDialog.Builder(requireContext()) + .setTitle(R.string.stickershelp1) + // .setMessage(R.string.stickershelp2) + .setView(container) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { - final var container = new LinearLayout(requireContext()); + var packId = input.getText().toString(); + if (packId.startsWith("https://")) + packId = packId.substring(packId.lastIndexOf('/') + 1); + TelegramStickersService.getInstance(requireContext()) + .requestPackDownload( + packId, + new File(requireContext().getFilesDir(), "VT-Stickers/" + packId)); + }) + .setNeutralButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) + .show(); + }; - final var input = new EditText(requireContext()); - final var inputLP = new ViewGroup.MarginLayoutParams(-1, -2); - inputLP.setMargins( - AndroidUtils.dp2px(24.f), - 0, - AndroidUtils.dp2px(24.f), - 0); - container.addView(input, inputLP); - - new VkAlertDialog.Builder(requireContext()) - .setTitle(R.string.stickershelp1) - // .setMessage(R.string.stickershelp2) - .setView(container) - .setPositiveButton(android.R.string.ok, (dialog, which) -> - { - var packId = input.getText().toString(); - if (packId.startsWith("https://")) - packId = packId.substring(packId.lastIndexOf('/') + 1); - TelegramStickersService.getInstance(requireContext()) - .requestPackDownload( - packId, - new File(requireContext().getFilesDir(), "VT-Stickers/" + packId)); - }) - .setNeutralButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) - .show(); - }; - - if (TGPref.getTGBotKey() == null) enterBotKey(() -> checkApiKey(lambda)); - else checkApiKey(lambda); - } - } - } else openMenu(requireContext().getString(R.string.stickersconnection)); + if (TGPref.getTGBotKey() == null) enterBotKey(() -> checkApiKey(lambda)); + else checkApiKey(lambda); } private void initGrabber() { - switch (TGPref.getTGConnectMethod()) { - case TYPE_DIRECT -> { - TelegramStickersGrabber.USE_PROXY = false; - mGrabber.resetProxy(); - } - case TYPE_SOCKS -> { - if (TGPref.getTGProxyIP() == null) break; - TelegramStickersGrabber.USE_PROXY = true; - TelegramStickersGrabber.PROXY_IP = TGPref.getTGProxyIP(); - TelegramStickersGrabber.PROXY_PORT = TGPref.getTGProxyPort(); - if (TGPref.isTGProxyPassEnabled()) { - TelegramStickersGrabber.HAS_PASS = true; - TelegramStickersGrabber.PROXY_USER = TGPref.getTGProxyUser(); - TelegramStickersGrabber.PROXY_PASS = TGPref.getTGProxyPass(); - } - mGrabber.enableProxy(); - } - } TelegramStickersGrabber.updateURLs(); } private void enterBotKey(Runnable callback) { - final var container = new LinearLayout(requireContext()); + var container = new LinearLayout(requireContext()); - final var input = new EditText(requireContext()); - final var inputLP = new ViewGroup.MarginLayoutParams(-1, -2); + var input = new EditText(requireContext()); + var inputLP = new ViewGroup.MarginLayoutParams(-1, -2); inputLP.setMargins( AndroidUtils.dp2px(24.f), 0, @@ -222,7 +197,7 @@ public class StickersFragment extends BaseToolbarFragment { .setMessage(requireContext().getString(R.string.stickersapi9) + requireContext().getString(R.string.stickersapi10)) .setNeutralButton(AndroidUtils.getString("open_bot"), (dl, i) -> { - final var intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://t.me/botfather")) + var intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://t.me/botfather")) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); requireActivity().startActivity(intent); }) @@ -235,7 +210,7 @@ public class StickersFragment extends BaseToolbarFragment { private void checkApiKey(Runnable callback) { mGrabber.setBotApiKey(TGPref.getTGBotKey()); - final var dialog = new ProgressDialog(requireContext()); + var dialog = new ProgressDialog(requireContext()); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage(requireContext().getString(R.string.stickersapi1)); dialog.show(); diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersPreferencesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersPreferencesFragment.java deleted file mode 100644 index 0c40f5926..000000000 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersPreferencesFragment.java +++ /dev/null @@ -1,87 +0,0 @@ -package ru.vtosters.lite.ui.fragments.tgstickers; - -import android.os.Bundle; -import com.aefyr.tsg.g2.stickersgrabber.TelegramStickersGrabber; -import com.vk.core.util.ToastUtils; -import com.vtosters.lite.R; -import ru.vtosters.lite.tgs.TGPref; -import ru.vtosters.lite.tgs.TGRoot; -import ru.vtosters.lite.ui.PreferenceFragmentUtils; -import ru.vtosters.lite.ui.fragments.TrackedMaterialPreferenceToolbarFragment; - -public class StickersPreferencesFragment extends TrackedMaterialPreferenceToolbarFragment { - - @Override - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - - int vtosterXml = R.xml.empty; - addPreferencesFromResource(vtosterXml); - - PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.sprefsstickers)); - PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", R.string.sprefsdelkey, 0, 0, preference -> { - TGPref.setTGBotKey(null); - ToastUtils.a(requireContext().getString(R.string.sprefsdelkey2)); - return false; - }); - - PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), requireContext().getString(R.string.sprefsnetwork)); - PreferenceFragmentUtils.addListPreference(getPreferenceScreen(), "VTGS:CM", "0", requireContext().getString(R.string.sprefsctype), new CharSequence[]{ - requireContext().getString(R.string.ctypedirect), requireContext().getString(R.string.ctypesocks) - }, new String[]{ - "0", "2" - }); - - findPreference("VTGS:CM").setTitle(TGRoot.getSummary()); - - findPreference("VTGS:CM").setOnPreferenceChangeListener((preference, o) -> { - String newData = (String) o; - TGPref.setTGConnectMethod(Integer.parseInt(newData)); - TelegramStickersGrabber.updateURLs(); - preference.setTitle(TGRoot.getSummary()); - return true; - }); - - PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), R.string.ssocks); - - PreferenceFragmentUtils.addEditTextPreference(getPreferenceScreen(), "tg_proxy_host", R.string.ssockshost, (preference, o) -> { - TGPref.setTGProxyIP(o); - return true; - }); - PreferenceFragmentUtils.addEditTextPreference(getPreferenceScreen(), "tg_proxy_port", R.string.ssocksport, (preference, o) -> { - try { - TGPref.setTGProxyPort(Integer.parseInt(o)); - return true; - } catch (Exception e) { - ToastUtils.a(requireContext().getString(R.string.ssockswport)); - return false; - } - }); - PreferenceFragmentUtils.addMaterialSwitchPreference(getPreferenceScreen(), "tg_proxy_auth", requireContext().getString(R.string.ssocksauth), "", 0, false, (preference, o) -> { - boolean value = (boolean) o; - - findPreference("tg_proxy_login").setEnabled(value); - findPreference("tg_proxy_pass").setEnabled(value); - - TGPref.setTGProxyPassEnabled(value); - return true; - }); - PreferenceFragmentUtils.addEditTextPreference(getPreferenceScreen(), "tg_proxy_login", R.string.ssockslogin, (preference, o) -> { - TGPref.setTGProxyUserPass(o, TGPref.getTGProxyPass()); - return true; - }); - PreferenceFragmentUtils.addEditTextPreference(getPreferenceScreen(), "tg_proxy_pass", R.string.ssockspass, (preference, o) -> { - TGPref.setTGProxyUserPass(TGPref.getTGProxyUser(), o); - return true; - }); - - findPreference("tg_proxy_login").setEnabled(TGPref.isTGProxyPassEnabled()); - findPreference("tg_proxy_pass").setEnabled(TGPref.isTGProxyPassEnabled()); - } - - @Override - public int T4() { - return R.string.vtltgs; - } -} - From 5357c60eaaa956f8730e83849d8a4868b85843b4 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sat, 30 Sep 2023 02:33:52 +0300 Subject: [PATCH 009/113] Update TelegramStickersGrabber.java --- .../aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java b/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java index ff8487a93..46cbf57d3 100644 --- a/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java +++ b/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java @@ -69,7 +69,7 @@ public class TelegramStickersGrabber { public static void updateURLs() { BOT_API_BASE_FILE_URL = "https://api.telegram.org/file/bot%s/%s"; - BOT_API_BASE_URL = REAL_TG_IP != null ? "https://" + REAL_TG_IP + "/bot%s/" : "https://api.telegram.org/bot%s/"; + BOT_API_BASE_URL = "https://api.telegram.org/bot%s/"; GET_STICKER_SET_URL = BOT_API_BASE_URL + "getStickerSet?name=%s"; GET_FILE_URL = BOT_API_BASE_URL + "getFile?file_id=%s"; } From 540fffdcc94fc6e08fd28c32a91c8544b5733c95 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sat, 30 Sep 2023 03:15:14 +0300 Subject: [PATCH 010/113] fixed download issue --- .../TelegramStickersGrabber.java | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java b/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java index 46cbf57d3..0999be525 100644 --- a/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java +++ b/app/src/main/java/com/aefyr/tsg/g2/stickersgrabber/TelegramStickersGrabber.java @@ -29,7 +29,8 @@ import java.util.concurrent.atomic.AtomicInteger; public class TelegramStickersGrabber { private static final String TAG = "TSG"; private static final OkHttpClient sClient = VtOkHttpClient.getInstance(); - private static final int MAX_RETRIES = 5; + private static final int MAX_RETRIES = 2; + private static final AtomicInteger retryCount = new AtomicInteger(); private static final int STICKER_QUALITY = 100; private static final String STICKER_FILE_NAME_FORMAT = "%03d.png"; private static final String STICKERS_KEY = "stickers"; @@ -40,7 +41,6 @@ public class TelegramStickersGrabber { private static final String THUMB_KEY = "thumb"; private static final String NAME_KEY = "name"; private static final String TITLE_KEY = "title"; - public static String REAL_TG_IP = null; private static String BOT_API_BASE_URL; private static String GET_STICKER_SET_URL; private static String GET_FILE_URL; @@ -110,6 +110,7 @@ public class TelegramStickersGrabber { Log.d(TAG, String.format("Pack %s has been downloaded to %s", set.id, packFolder.getAbsolutePath())); listener.onPackDownloaded(packInfo, true); }); + Flag deathFlag = new Flag(); for (int i = 0; i < set.stickers.size(); i++) { @@ -124,7 +125,7 @@ public class TelegramStickersGrabber { sClient.a(fileInfoRequest).a(new Callback() { @Override public void a(Call call, IOException e) { - handleFailure(deathFlag, listener, e); + handleFailure(deathFlag, listener, e, downloadedStickers, call, fileInfoRequest, this); } @Override @@ -151,11 +152,11 @@ public class TelegramStickersGrabber { sClient.a(fileDownloadRequest).a(new Callback() { @Override public void a(Call call, IOException e) { - handleFailure(deathFlag, listener, e); + handleFailure(deathFlag, listener, e, downloadedStickers, call, fileDownloadRequest, this); } @Override - public void a(Call call, Response response) throws IOException { + public void a(Call call, Response response) { if (deathFlag.up()) return; @@ -166,7 +167,7 @@ public class TelegramStickersGrabber { try (ResponseBody responseBody = response.a()) { if (responseBody == null) { - handleFailure(deathFlag, listener, new TSGException("Response body for a sticker is null :/")); + handleFailure(deathFlag, listener, new TSGException("Response body for a sticker is null :/"), downloadedStickers, call, fileDownloadRequest, this); return; } @@ -174,7 +175,7 @@ public class TelegramStickersGrabber { Bitmap stickerImage = BitmapFactory.decodeStream(stickerInputStream); if (stickerImage == null) { - handleFailure(deathFlag, listener, new TSGException("Unable to decode sticker image")); + handleFailure(deathFlag, listener, new TSGException("Unable to decode sticker image"), downloadedStickers, call, fileDownloadRequest, this); return; } @@ -193,39 +194,48 @@ public class TelegramStickersGrabber { } }); } catch (Exception e) { - handleFailure(deathFlag, listener, e); + handleFailure(deathFlag, listener, e, downloadedStickers, call, fileInfoRequest, this); } } }); } } - private void handleFailure(Flag deathFlag, PackDownloadListener listener, Exception e) { - if (deathFlag.up()) + private void handleFailure(Flag deathFlag, PackDownloadListener listener, Exception e, GoalCounter downloadedStickers, Call call, Request request, Callback callback) { + if ((e instanceof IOException || e instanceof TSGException) && retryCount.get() > MAX_RETRIES) { + Log.e(TAG, "Unable to download sticker: " + e.getMessage()); + downloadedStickers.increase(); return; + } else if (retryCount.get() < MAX_RETRIES) { + retryRequest(call, request, callback); + return; + } + + if (deathFlag.up()) { + return; + } deathFlag.raise(); listener.onPackDownloadError(e); } private void retryRequest(Call call, Request request, Callback callback) { - AtomicInteger retryCount = new AtomicInteger(); retryCount.incrementAndGet(); if (retryCount.get() > MAX_RETRIES) { + Log.e(TAG, "retryRequest: max retries"); callback.a(call, new IOException()); } else { + Log.e(TAG, "retryRequest"); sClient.a(request).a(callback); } } - private void saveStickerImage(Bitmap stickerImage, File stickerFile) throws IOException, TSGException { - try (FileOutputStream fileOutputStream = new FileOutputStream(stickerFile)) { - if (!stickerImage.compress(Bitmap.CompressFormat.PNG, STICKER_QUALITY, fileOutputStream)) { - throw new TSGException("Unable to compress sticker to a png file at path: " + stickerFile.getAbsolutePath()); - } - } finally { - stickerImage.recycle(); + private void saveStickerImage(Bitmap image, File file) throws TSGException { + try (FileOutputStream fos = new FileOutputStream(file)) { + image.compress(Bitmap.CompressFormat.PNG, 100, fos); + } catch (IOException e) { + throw new TSGException("Unable to save sticker image"); } } @@ -336,8 +346,6 @@ public class TelegramStickersGrabber { } public static class TSGException extends Exception { - private static final long serialVersionUID = 7866915509988422944L; - private TSGException(String message) { super(message); } From f5180f61d55330a5e3b68229c1c80e6918aba609 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:37:49 +0300 Subject: [PATCH 011/113] fixed empty text from ssfs --- app/src/main/java/ru/vtosters/hooks/ssfs/ProfileHook.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/hooks/ssfs/ProfileHook.java b/app/src/main/java/ru/vtosters/hooks/ssfs/ProfileHook.java index 4838eb8d0..28296945c 100644 --- a/app/src/main/java/ru/vtosters/hooks/ssfs/ProfileHook.java +++ b/app/src/main/java/ru/vtosters/hooks/ssfs/ProfileHook.java @@ -24,7 +24,10 @@ public class ProfileHook { if (UsersList.hasDescription(userID)) { try { - extendedUserProfile.z2 = Handler.getDescription(userID); + String description = Handler.getDescription(userID); + if (!TextUtils.isEmpty(description)) { + extendedUserProfile.z2 = description; + } } catch (NullPointerException e) { Log.e(TAG, "null \"profiles\" node\n" + e); } From 78dca260633a96cefb9b13bee1c301d0a6f689cc Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 2 Oct 2023 14:52:52 +0300 Subject: [PATCH 012/113] fix #1489 --- .../lite/music/downloader/M3UDownloader.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java index bfac2495f..906677d07 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java @@ -48,25 +48,23 @@ public class M3UDownloader var resultMp3 = getResultMp3File(outDir, cache, track); try { CompletableFuture.allOf(createFutures(baseUri, segments, progress, callback, track)) - .thenRun(() -> - { - if (cache) + .thenRun(() -> { + if (cache) { try { ThumbnailDownloader.downloadThumbnails(track); } catch (IOException e) { throw new RuntimeException("Failed to download thumbs", e); } + } }) - .thenRun(() -> - { + .thenRun(() -> { try { TSMerger.merge(getTsesDir(track), resultTs); } catch (Throwable e) { throw new RuntimeException("Failed to merge ts files", e); } }) - .thenRun(() -> - { + .thenRun(() -> { try { FFMpeg.convert(resultTs, resultMp3.getAbsolutePath(), track); } catch (Throwable e) { @@ -74,12 +72,18 @@ public class M3UDownloader } }) .thenRun(() -> callback.onProgress(10 + Math.round(80.0f * progress.addAndGet(1) / segments.size()))) - .thenRun(() -> MusicCacheImpl.addTrack(track)) + .thenRun(() -> { + if (cache) { + MusicCacheImpl.addTrack(track); + } + }) .whenComplete((unused, tr) -> { if (tr != null) { IOUtils.deleteRecursive(MusicCacheStorageUtils.getTrackDirById(track.y1())); callback.onFailure(); - } else callback.onSuccess(); + } else { + callback.onSuccess(); + } IOUtils.deleteRecursive(getTsesDir(track)); }) .join(); From 1117fc19d481000d6ff0a1b8691356f0955cbf1d Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:28:08 +0300 Subject: [PATCH 013/113] added force tablet mode --- .../java/ru/vtosters/hooks/TabletHook.java | 10 ++++++++ .../lite/ui/fragments/InterfaceFragment.java | 7 ++++++ .../ru/vtosters/lite/utils/AndroidUtils.java | 12 ++++++++-- smali/res/xml/preferences_interface.xml | 5 ++++ .../com/vk/core/util/Screen.smali | 23 +------------------ 5 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/ru/vtosters/hooks/TabletHook.java diff --git a/app/src/main/java/ru/vtosters/hooks/TabletHook.java b/app/src/main/java/ru/vtosters/hooks/TabletHook.java new file mode 100644 index 000000000..37db7d876 --- /dev/null +++ b/app/src/main/java/ru/vtosters/hooks/TabletHook.java @@ -0,0 +1,10 @@ +package ru.vtosters.hooks; + +import ru.vtosters.hooks.other.Preferences; +import ru.vtosters.lite.utils.AndroidUtils; + +public class TabletHook { + public static boolean hook() { + return AndroidUtils.isTablet() && !Preferences.getBoolValue("disableForceTabletMode", false); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/InterfaceFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/InterfaceFragment.java index 42b22215c..2ccdac614 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/InterfaceFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/InterfaceFragment.java @@ -67,6 +67,13 @@ public class InterfaceFragment extends TrackedMaterialPreferenceToolbarFragment findPreference("showmenu").setVisible(false); } + var tablet = findPreference("disableForceTabletMode"); + tablet.setVisible(AndroidUtils.isTablet()); + tablet.setOnPreferenceClickListener(preference -> { + LifecycleUtils.restartApplicationWithTimer(); + return true; + }); + findPreference("customrounding").setOnPreferenceClickListener(preference -> { RoundingSeekbarDialog.dialog(getContext()); return true; diff --git a/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java b/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java index b974b0854..ced1bed96 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/AndroidUtils.java @@ -12,13 +12,14 @@ import android.content.res.Resources; import android.net.Uri; import android.os.Build; import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.core.app.NotificationManagerCompat; -import com.vk.core.util.Screen; import com.vk.core.util.ToastUtils; import com.vtosters.lite.general.fragments.WebViewFragment; +import ru.vtosters.hooks.other.Preferences; import java.io.File; import java.io.FileOutputStream; @@ -32,6 +33,12 @@ import java.util.Random; public class AndroidUtils { private static final String ALLOWED_CHARACTERS = "0123456789qwertyuiopasdfghjklzxcvbnm"; + public enum ScreenSize { + small, + normal, + large, + xlarge + } public static boolean isDebuggable() { return 0 != (AndroidUtils.getGlobalContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE); @@ -44,7 +51,8 @@ public class AndroidUtils { } public static boolean isTablet() { - return Screen.l(getGlobalContext()); + String string = getGlobalContext().getResources().getString(b.h.g.d.screen_size); + return TextUtils.equals(string, ScreenSize.large.name()) || TextUtils.equals(string, ScreenSize.xlarge.name()); } @NonNull diff --git a/smali/res/xml/preferences_interface.xml b/smali/res/xml/preferences_interface.xml index 3077df6bd..dc2329eb7 100644 --- a/smali/res/xml/preferences_interface.xml +++ b/smali/res/xml/preferences_interface.xml @@ -94,6 +94,11 @@ android:key="pollresults" android:summary="@string/pollresults_summ" android:title="@string/pollresults_title"/> + f(Landroid/content/Context;)Lcom/vk/core/util/Screen$ScreenSize; - - move-result-object p0 - - invoke-virtual {p0}, Ljava/lang/Enum;->ordinal()I + invoke-static {}, Lru/vtosters/hooks/TabletHook;->hook()Z move-result p0 - sget-object v0, Lcom/vk/core/util/Screen$ScreenSize;->normal:Lcom/vk/core/util/Screen$ScreenSize; - - invoke-virtual {v0}, Ljava/lang/Enum;->ordinal()I - - move-result v0 - - if-le p0, v0, :cond_0 - - const/4 p0, 0x1 - - goto :goto_0 - - :cond_0 - const/4 p0, 0x0 - - :goto_0 return p0 .end method From 099c699702468ff07baf0dbd93789195766c38c7 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:37:07 +0300 Subject: [PATCH 014/113] added vkn online fix disabler --- .../vtosters/hooks/OnlineFormatterHook.java | 23 ++++++++++++------- .../ru/vtosters/hooks/VerificationsHook.java | 5 ++-- .../ru/vtosters/hooks/other/Preferences.java | 4 ++++ .../java/ru/vtosters/lite/ssfs/UsersList.java | 3 ++- .../lite/ui/fragments/ActivityFragment.java | 3 +++ .../lite/ui/fragments/OtherFragment.java | 6 ++--- .../ru/vtosters/lite/utils/OnlineBypass.java | 7 +++--- .../vtosters/lite/utils/VTVerifications.java | 3 ++- smali/res/xml/preferences_activity.xml | 2 +- 9 files changed, 37 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/ru/vtosters/hooks/OnlineFormatterHook.java b/app/src/main/java/ru/vtosters/hooks/OnlineFormatterHook.java index 0fb389137..f519330b8 100644 --- a/app/src/main/java/ru/vtosters/hooks/OnlineFormatterHook.java +++ b/app/src/main/java/ru/vtosters/hooks/OnlineFormatterHook.java @@ -5,6 +5,7 @@ import com.vtosters.lite.R; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.utils.AndroidUtils; import java.io.IOException; @@ -115,14 +116,20 @@ public class OnlineFormatterHook { return AndroidUtils.getString(R.string.custom_online) + " " + appname; } - public static JSONObject onlineHook(JSONObject json) throws ParseException, IOException, JSONException { - if (getBoolValue("onlinefix", false)) JsonInjectors.setOnlineInfo(json); + public static JSONObject onlineHook(JSONObject json) { + if (!getBoolValue("onlinefix", false) || Preferences.serverFeaturesDisable()) return json; + + try { + JsonInjectors.setOnlineInfo(json); + } catch (JSONException e) { + Log.e("onlineHook", e.getMessage()); + } return json; } - public static JSONArray onlineHookList(JSONArray jsonArr) throws ParseException, IOException, JSONException { - if (!getBoolValue("onlinefix", false)) return jsonArr; + public static JSONArray onlineHookList(JSONArray jsonArr) { + if (!getBoolValue("onlinefix", false) || Preferences.serverFeaturesDisable()) return jsonArr; try { JsonInjectors.setOnlineInfoUsers(jsonArr); @@ -134,7 +141,7 @@ public class OnlineFormatterHook { } public static JSONObject onlineHookProfiles(JSONObject json) { - if (!getBoolValue("onlinefix", false)) return json; + if (!getBoolValue("onlinefix", false) || Preferences.serverFeaturesDisable()) return json; try { JsonInjectors.setOnlineInfoUsers(json.optJSONArray("profiles")); @@ -146,7 +153,7 @@ public class OnlineFormatterHook { } public static JSONObject onlineHookItems(JSONObject json) { - if (!getBoolValue("onlinefix", false)) return json; + if (!getBoolValue("onlinefix", false) || Preferences.serverFeaturesDisable()) return json; try { JsonInjectors.setOnlineInfoUsers(json.optJSONArray("items")); @@ -157,8 +164,8 @@ public class OnlineFormatterHook { return json; } - public static JSONObject onlineHookRequestsAndRecommendations(JSONObject json) throws ParseException, IOException, JSONException { - if (!getBoolValue("onlinefix", false)) return json; + public static JSONObject onlineHookRequestsAndRecommendations(JSONObject json) { + if (!getBoolValue("onlinefix", false) || Preferences.serverFeaturesDisable()) return json; try { JsonInjectors.setOnlineInfoUsers(json.optJSONObject("read_requests").optJSONArray("items")); diff --git a/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java b/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java index e37209392..553b195d2 100644 --- a/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java +++ b/app/src/main/java/ru/vtosters/hooks/VerificationsHook.java @@ -2,6 +2,7 @@ package ru.vtosters.hooks; import com.vk.dto.common.VerifyInfo; import org.json.JSONObject; +import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.utils.VTVerifications; import static ru.vtosters.hooks.other.Preferences.getBoolValue; @@ -20,7 +21,7 @@ public class VerificationsHook { return true; } - if (!getBoolValue("VT_Verification", true) || getBoolValue("serverFeaturesDisable", false)) { + if (!getBoolValue("VT_Verification", true) || Preferences.serverFeaturesDisable()) { return false; } @@ -32,7 +33,7 @@ public class VerificationsHook { return true; } - if (!getBoolValue("VT_Fire", true) || getBoolValue("serverFeaturesDisable", false)) { + if (!getBoolValue("VT_Fire", true) || Preferences.serverFeaturesDisable()) { return false; } diff --git a/app/src/main/java/ru/vtosters/hooks/other/Preferences.java b/app/src/main/java/ru/vtosters/hooks/other/Preferences.java index 22b9cfcf7..716938e9a 100644 --- a/app/src/main/java/ru/vtosters/hooks/other/Preferences.java +++ b/app/src/main/java/ru/vtosters/hooks/other/Preferences.java @@ -242,6 +242,10 @@ public class Preferences { return getBoolValue("autoalltranslate", false); } + public static boolean serverFeaturesDisable() { + return getBoolValue("serverFeaturesDisable", false); + } + public static boolean shortinfo() { return getBoolValue("shortinfo", true); } diff --git a/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java b/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java index 8f36a2bcd..e2ef0eb1a 100644 --- a/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java +++ b/app/src/main/java/ru/vtosters/lite/ssfs/UsersList.java @@ -8,6 +8,7 @@ import okhttp3.Response; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.di.singleton.VtOkHttpClient; import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AndroidUtils; @@ -27,7 +28,7 @@ public class UsersList { public static void getUsersList() { var prefs = AndroidUtils.getGlobalContext().getSharedPreferences("vt_another_data", 0); - if ((!NetworkUtils.isNetworkConnected() || NetworkUtils.isInternetSlow()) && prefs.contains("ids") || getBoolValue("serverFeaturesDisable", false)) { + if ((!NetworkUtils.isNetworkConnected() || NetworkUtils.isInternetSlow()) && prefs.contains("ids") || Preferences.serverFeaturesDisable()) { return; } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ActivityFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ActivityFragment.java index 905f5a425..cd54a0712 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ActivityFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ActivityFragment.java @@ -3,7 +3,9 @@ package ru.vtosters.lite.ui.fragments; import android.os.Bundle; import androidx.preference.Preference; import com.vtosters.lite.R; +import ru.vtosters.hooks.other.Preferences; +import static ru.vtosters.hooks.other.Preferences.getBoolValue; import static ru.vtosters.hooks.other.Preferences.offline; public class ActivityFragment extends TrackedMaterialPreferenceToolbarFragment { @@ -12,6 +14,7 @@ public class ActivityFragment extends TrackedMaterialPreferenceToolbarFragment { super.onCreate(bundle); addPreferencesFromResource(R.xml.preferences_activity); findPreference("setoffline").setEnabled(offline()); + findPreference("onlinefixcategory").setVisible(!Preferences.serverFeaturesDisable()); } @Override diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java index c1d02f9e1..7562fbc67 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java @@ -112,9 +112,9 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment { return true; }); - findPreference("VT_Verification").setVisible(!getBoolValue("serverFeaturesDisable", false)); - findPreference("VT_Fire").setVisible(!getBoolValue("serverFeaturesDisable", false)); - findPreference("updateverifdata").setVisible(!getBoolValue("serverFeaturesDisable", false)); + findPreference("VT_Verification").setVisible(!Preferences.serverFeaturesDisable()); + findPreference("VT_Fire").setVisible(!Preferences.serverFeaturesDisable()); + findPreference("updateverifdata").setVisible(!Preferences.serverFeaturesDisable()); var vkAdminTokenPref = findPreference("vk_admin_token"); vkAdminTokenPref.setVisible(Preferences.getPreferences().getBoolean("new_music_downloading_way", false)); diff --git a/app/src/main/java/ru/vtosters/lite/utils/OnlineBypass.java b/app/src/main/java/ru/vtosters/lite/utils/OnlineBypass.java index 293dbed14..b07306477 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/OnlineBypass.java +++ b/app/src/main/java/ru/vtosters/lite/utils/OnlineBypass.java @@ -3,6 +3,7 @@ package ru.vtosters.lite.utils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import ru.vtosters.hooks.other.Preferences; import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo; @@ -13,7 +14,7 @@ public class OnlineBypass { return json; } var onlineinfo = json.optJSONObject("online_info"); - if (onlineinfo != null && !onlineinfo.optBoolean("visible")) { + if (onlineinfo != null && !onlineinfo.optBoolean("visible") && !Preferences.serverFeaturesDisable()) { var bypassed = getBypassedOnlineInfo(id); if (bypassed.optInt("last_seen", 0) != 0) { json.remove("online_info"); @@ -37,7 +38,7 @@ public class OnlineBypass { } public static JSONArray setOnlineInfoUsers(JSONArray profiles) throws JSONException { - if (profiles == null || profiles.length() == 0) return profiles; + if (profiles == null || profiles.length() == 0 || Preferences.serverFeaturesDisable()) return profiles; StringBuilder sb = new StringBuilder(); var curVkId = AccountManagerUtils.getUserId(); for (int i = 0; i < profiles.length(); i++) { @@ -51,7 +52,7 @@ public class OnlineBypass { sb.append(","); } var ids = sb.toString(); - if (ids.length() > 0) { + if (!ids.isEmpty()) { ids = ids.substring(0, ids.length() - 1); } else { return profiles; diff --git a/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java b/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java index 55ac55509..d79bd1cca 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java +++ b/app/src/main/java/ru/vtosters/lite/utils/VTVerifications.java @@ -7,6 +7,7 @@ import okhttp3.*; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.di.singleton.VtOkHttpClient; import java.io.IOException; @@ -31,7 +32,7 @@ public class VTVerifications { return; } - if ((!NetworkUtils.isNetworkConnected() && NetworkUtils.isInternetSlow() || getBoolValue("isRoamingState", false)) && prefs.contains("ids") || getBoolValue("serverFeaturesDisable", false)) { + if ((!NetworkUtils.isNetworkConnected() && NetworkUtils.isInternetSlow() || getBoolValue("isRoamingState", false)) && prefs.contains("ids") || Preferences.serverFeaturesDisable()) { parseJson(prefs.getString("ids", "[]")); Log.d("VTVerifications", "load from memory. Roaming or Network issues"); isLoaded = true; diff --git a/smali/res/xml/preferences_activity.xml b/smali/res/xml/preferences_activity.xml index 617cec80d..2684ac7f2 100644 --- a/smali/res/xml/preferences_activity.xml +++ b/smali/res/xml/preferences_activity.xml @@ -92,7 +92,7 @@ android:key="listen_v" android:title="@string/listen_v_title"/> - + Date: Wed, 4 Oct 2023 13:37:20 +0300 Subject: [PATCH 015/113] upped ver --- smali/apktool.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smali/apktool.yml b/smali/apktool.yml index 5288a800c..01e470ab8 100644 --- a/smali/apktool.yml +++ b/smali/apktool.yml @@ -25,5 +25,5 @@ usesFramework: tag: null version: 2.6.0 versionInfo: - versionCode: '4838' + versionCode: '4839' versionName: 5.56.1 From cf05e051e8b67b4ba56f1b9598038ef37b1688f7 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 4 Oct 2023 13:47:47 +0300 Subject: [PATCH 016/113] added summary for advanced online info --- smali/res/values-be/strings.xml | 2 +- smali/res/values-ru/strings.xml | 2 +- smali/res/values-uk/strings.xml | 2 +- smali/res/values/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/smali/res/values-be/strings.xml b/smali/res/values-be/strings.xml index 8bab35f27..c217d4710 100644 --- a/smali/res/values-be/strings.xml +++ b/smali/res/values-be/strings.xml @@ -6311,7 +6311,7 @@ Схаваць сяброў Схаваць блок рэкамендацый сяброў у сябрах Пашыраны анлайн - Паказваць з якога прыкладання/кліента чалавек у анлайне + Паказваць з якога прыкладання/кліента чалавек у анлайне\n\nНапрыклад: Онлайн З дапамогай Kate Mobile Галасавыя паведамленні Функцыя дазваляе не адпраўляць статут праслухоўвання галасавых паведамленняў чалавека вамі diff --git a/smali/res/values-ru/strings.xml b/smali/res/values-ru/strings.xml index 166b850f7..18dd5c69a 100644 --- a/smali/res/values-ru/strings.xml +++ b/smali/res/values-ru/strings.xml @@ -5640,7 +5640,7 @@ Скрыть друзей Скрыть блок рекомендаций друзей в друзьях Расширенный онлайн - Показывать с какого приложения/клиента человек в онлайне + Показывать с какого приложения/клиента человек в онлайне\n\nНапример: Онлайн с помощью Kate Mobile Голосовые сообщения Функция позволяет не отправлять статус прослушивания голосовых сообщений человека вами Отключить статус прослушивания diff --git a/smali/res/values-uk/strings.xml b/smali/res/values-uk/strings.xml index 15f77fe72..5a7d1545d 100644 --- a/smali/res/values-uk/strings.xml +++ b/smali/res/values-uk/strings.xml @@ -5567,7 +5567,7 @@ Приховати друзів Приховати блок рекомендацій друзів у друзях Розширений онлайн - Показувати з якого додатка/клієнта людина в онлайні + Показувати з якого додатка/клієнта людина в онлайні\n\nНаприклад: Онлайн за допомогою Kate Mobile Голосові повідомлення Функція дозволяє не надсилати статус прослуховування голосових повідомлень вами Вимкнути статус прослуховування diff --git a/smali/res/values/strings.xml b/smali/res/values/strings.xml index 9d3c6cb08..b709d9a49 100644 --- a/smali/res/values/strings.xml +++ b/smali/res/values/strings.xml @@ -5774,7 +5774,7 @@ You need to restart the application to apply proxy settings" Hide friends Hide the block of recommendations of friends in friends section Extended online indicator - Show what app/device a person is online from + Show what app/device a person is online from\n\nFor example: Online using Kate Mobile Voice messages The function allows you not to send the status of listening to the person\'s voice messages by you Disable listening status From b9879f9ed714d80a18248dcbf2882d7b19426edd Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 4 Oct 2023 19:44:24 +0300 Subject: [PATCH 017/113] updated appcenter --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 401291291..a728bca5a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,8 +91,8 @@ task testClasses { } dependencies { - implementation 'com.microsoft.appcenter:appcenter-analytics:5.0.1' - implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.1' + implementation 'com.microsoft.appcenter:appcenter-analytics:5.0.2' + implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.2' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4' implementation 'com.google.guava:guava:23.3-android' From 8cb2c380e74cebee3c0bf33672f1b9637f6955ca Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 6 Oct 2023 12:44:55 +0300 Subject: [PATCH 018/113] fixed adding "null" to track name --- .../java/ru/vtosters/lite/music/downloader/M3UDownloader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java index 906677d07..a1698a9be 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java @@ -136,7 +136,7 @@ public class M3UDownloader } public static String getTitle(MusicTrack track) { - return track.f + (!TextUtils.isEmpty(track.g) ? +'(' + track.g + ')' : null); + return track.f + (!TextUtils.isEmpty(track.g) ? +'(' + track.g + ')' : ""); } static File getTsesDir(MusicTrack track) { From bbbc94e510a1a6ee7d558299fe74c0e868c05d09 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sat, 7 Oct 2023 03:07:31 +0300 Subject: [PATCH 019/113] added facebook graph disabler --- smali/smali/com/facebook/FacebookSdk.smali | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/smali/smali/com/facebook/FacebookSdk.smali b/smali/smali/com/facebook/FacebookSdk.smali index f29937dd8..71f7dfe98 100644 --- a/smali/smali/com/facebook/FacebookSdk.smali +++ b/smali/smali/com/facebook/FacebookSdk.smali @@ -354,6 +354,16 @@ .method static a(Landroid/content/Context;Ljava/lang/String;)V .locals 11 + const-string v0, "hideDeviceInfo" + + sget-object v1, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean; + + invoke-static {v0, v1}, Lru/vtosters/hooks/other/Preferences;->getBoolValue(Ljava/lang/String;Ljava/lang/Boolean;)Z + + move-result v0 + + if-nez v0, :cond_78 + if-eqz p0, :cond_0 if-eqz p1, :cond_0 From b506c56346932c70481e4b309db5b0e20f4b2df7 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sat, 7 Oct 2023 03:13:24 +0300 Subject: [PATCH 020/113] fixed compiling issue --- smali/smali/com/facebook/FacebookSdk.smali | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smali/smali/com/facebook/FacebookSdk.smali b/smali/smali/com/facebook/FacebookSdk.smali index 71f7dfe98..8a3eeb238 100644 --- a/smali/smali/com/facebook/FacebookSdk.smali +++ b/smali/smali/com/facebook/FacebookSdk.smali @@ -362,7 +362,7 @@ move-result v0 - if-nez v0, :cond_78 + if-nez v0, :cond_1 if-eqz p0, :cond_0 From 14c111a3e63ebbdf0b42ea38321a1e72c52a5eb8 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 10 Oct 2023 22:53:16 +0300 Subject: [PATCH 021/113] some music fixes --- .../main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java | 3 ++- .../java/ru/vtosters/lite/music/downloader/M3UDownloader.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java b/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java index 8fb4d423f..6c50a8a1a 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java @@ -1,6 +1,7 @@ package ru.vtosters.lite.music.cache; import android.os.RemoteException; +import android.text.TextUtils; import bruhcollective.itaysonlab.libvkx.ILibVkxService; import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl; @@ -17,7 +18,7 @@ public class MusicCacheImpl { track.y1(), track.I != null ? track.I.getId() + "" : "-1", track.f, - track.g, + !TextUtils.isEmpty(track.g) ? track.g : "", track.C, track.I != null ? track.I.getTitle() : "", track.K, diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java index a1698a9be..d5a15abab 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java @@ -136,7 +136,7 @@ public class M3UDownloader } public static String getTitle(MusicTrack track) { - return track.f + (!TextUtils.isEmpty(track.g) ? +'(' + track.g + ')' : ""); + return track.f + (!TextUtils.isEmpty(track.g) ? + '(' + track.g + ')' : ""); } static File getTsesDir(MusicTrack track) { From cd189b1ddad0158ec7f41c0063e648c84f201186 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 10 Oct 2023 23:15:11 +0300 Subject: [PATCH 022/113] fixed id3v2 meta --- .../lite/music/converter/ts/FFMpeg.java | 40 +++++-------------- 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java b/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java index 99f8cc44a..e8c4cf1dd 100644 --- a/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java +++ b/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java @@ -1,9 +1,14 @@ package ru.vtosters.lite.music.converter.ts; import com.arthenica.ffmpegkit.FFmpegKit; +import com.vk.dto.music.Artist; import com.vk.dto.music.MusicTrack; +import ru.vtosters.lite.music.downloader.M3UDownloader; +import ru.vtosters.lite.utils.IOUtils; import java.io.File; +import java.text.Normalizer; +import java.util.stream.Collectors; public class FFMpeg { @@ -13,47 +18,22 @@ public class FFMpeg { * @param track Track to be converted * @return True if success, else false */ - public static void convert(File in, String out, MusicTrack track) throws Throwable { + public static void convert(File in, String out, MusicTrack track) { // convert .ts file to .mp3 file via ffmpeg var cmd = " -y -i \"" + in.getAbsolutePath() + '"' + " -map 0 -dn" + " -loglevel error" + " -hide_banner" + " -write_id3v2 1" -// +" -metadata title=\""+IOUtils.getValidFileName(M3UDownloader.getTitle(track))+'"' -// +" -metadata artist=\""+normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", ")))+'"' -// +" -metadata album=\""+normalizeMetadata(track.I.getTitle())+'"' + + " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"' + + " -metadata artist=\"" + normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))) + '"' + + " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"' + " -c copy \"" + out + '"'; var ses = FFmpegKit.execute(cmd); if (ses.getReturnCode().isValueCancel()) throw new RuntimeException(ses.getLogsAsString()); } private static String normalizeMetadata(String in) { - return in.replace('"', '‟'); + return in.replaceAll("[\\\\/:*?\"<>|]", ""); } - -// private static void copyAssets() -// throws IOException -// { -// try -// { -// for (var filename:AndroidUtils.getGlobalContext().getAssets().list("ffmpeg")) -// if(filename.endsWith(".so")) -// IOUtils.writeToFile( -// new File(AndroidUtils.getGlobalContext().getFilesDir(),filename), -// IOUtils.readFully(AndroidUtils.getGlobalContext().getAssets().open("ffmpeg"+File.separator+filename))); -// } -// catch(IOException e) -// { throw e; } -// } -// -// private static void checkFFMpegLibs() -// { -// var lib=new File(AndroidUtils.getGlobalContext().getFilesDir(),"libffmpegkit_abidetect.so"); -// if(!lib.exists()) -// { -// ToastUtils.a(R.string.ffmpegkit_copy); -// copyAssets(); -// } -// } } From 589e8928a07f576d4a2e802f89757eb7dc5bc783 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 12 Oct 2023 19:57:00 +0300 Subject: [PATCH 023/113] Bitrate upgrade (#1498) libvkmedia.so armv7/arm64 --- smali/lib/arm64-v8a/libvkmedia.so | Bin 764936 -> 764936 bytes smali/lib/armeabi-v7a/libvkmedia.so | Bin 522824 -> 522824 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/smali/lib/arm64-v8a/libvkmedia.so b/smali/lib/arm64-v8a/libvkmedia.so index 5e70d97f8c75bb4bc7a7fd117ff4069ac28e44b2..ab217b711463c8b099c1379d356f73b461504504 100644 GIT binary patch delta 59 zcmeCUq1SOkZ-dK67AA(7LCqc?+dV!q0x=U1GXpUT5VHa?8xXStF$WNHZuj`ebzm0& DAKM!c delta 59 zcmeCUq1SOkZ-dK6mPgDITFo9G+dV!q0x=U1GXpUT5VHa?8xXStF$WNHZuj`ebzm0& DENmM} diff --git a/smali/lib/armeabi-v7a/libvkmedia.so b/smali/lib/armeabi-v7a/libvkmedia.so index a2741de9ab41b32876e769207020d6636559948e..9ec630aed16e038345c6d52ce12ebd153fc9e442 100644 GIT binary patch delta 55 zcmX@{MgGJW`3RdKCt(3 F0ss)F8kYb7 delta 55 zcmX@{MgGJW`3rF9%(i{rA$Dm!M!W61KCt(3 F0suxr8*cyr From e2775db4e5d4d2f2c365ebac5129eacce2653098 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 12 Oct 2023 20:19:17 +0300 Subject: [PATCH 024/113] fixed english translation --- smali/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smali/res/values/strings.xml b/smali/res/values/strings.xml index b709d9a49..1781a080c 100644 --- a/smali/res/values/strings.xml +++ b/smali/res/values/strings.xml @@ -5615,7 +5615,7 @@ Warning! It can cause long downloads of user lists if there are a lot of users i Socks Do not read Disable status of viewing - Do not write + Do not type Counters in dockbar "Disabling doesn't work in the tablet interface" Show dockbar item titles @@ -5879,7 +5879,7 @@ May look like a fake leaving the online" What is it? Function lets you don\'t send read message status - Function lets you don\'t send write message status + Function lets you don\'t send type message status Function lets you don\'t send read stories status Visually may not work correctly (locally read), but companion will see that it wasn\'t read. From a85e55a5947460776166f248708d42041e2629b3 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 12 Oct 2023 22:45:43 +0300 Subject: [PATCH 025/113] meta data pref --- .../ru/vtosters/lite/music/converter/ts/FFMpeg.java | 11 ++++++++--- smali/res/xml/preferences_media.xml | 5 +++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java b/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java index e8c4cf1dd..c8b3aaa76 100644 --- a/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java +++ b/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java @@ -3,6 +3,7 @@ package ru.vtosters.lite.music.converter.ts; import com.arthenica.ffmpegkit.FFmpegKit; import com.vk.dto.music.Artist; import com.vk.dto.music.MusicTrack; +import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.music.downloader.M3UDownloader; import ru.vtosters.lite.utils.IOUtils; @@ -25,14 +26,18 @@ public class FFMpeg { + " -loglevel error" + " -hide_banner" + " -write_id3v2 1" - + " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"' - + " -metadata artist=\"" + normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))) + '"' - + " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"' + + setMetadata(track) + " -c copy \"" + out + '"'; var ses = FFmpegKit.execute(cmd); if (ses.getReturnCode().isValueCancel()) throw new RuntimeException(ses.getLogsAsString()); } + private static String setMetadata(MusicTrack track) { + return Preferences.getBoolValue("setMetaData", false) ? "" : " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"' + + " -metadata artist=\"" + normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))) + '"' + + " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"'; + } + private static String normalizeMetadata(String in) { return in.replaceAll("[\\\\/:*?\"<>|]", ""); } diff --git a/smali/res/xml/preferences_media.xml b/smali/res/xml/preferences_media.xml index bcfd8b73e..5db8803e7 100644 --- a/smali/res/xml/preferences_media.xml +++ b/smali/res/xml/preferences_media.xml @@ -45,6 +45,11 @@ android:entryValues="@array/musicdefcatalog" android:key="musicdefcatalog" android:title="@string/musicdefcatalog_title"/> + From f2ac845797a16a6c96f990f35fafc35d929b257b Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sat, 14 Oct 2023 16:05:51 +0300 Subject: [PATCH 026/113] Update FFMpeg.java --- .../main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java b/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java index c8b3aaa76..10cbcac2c 100644 --- a/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java +++ b/app/src/main/java/ru/vtosters/lite/music/converter/ts/FFMpeg.java @@ -33,9 +33,9 @@ public class FFMpeg { } private static String setMetadata(MusicTrack track) { - return Preferences.getBoolValue("setMetaData", false) ? "" : " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"' + return Preferences.getBoolValue("setMetaData", false) ? " -metadata title=\"" + IOUtils.getValidFileName(M3UDownloader.getTitle(track)) + '"' + " -metadata artist=\"" + normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", "))) + '"' - + " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"'; + + " -metadata album=\"" + normalizeMetadata(track.I.getTitle()) + '"' : ""; } private static String normalizeMetadata(String in) { From 5360ca6c5efd674d32437088f09fd52f578f78ce Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 13 Dec 2023 23:07:40 +0300 Subject: [PATCH 027/113] updated translations --- app/src/main/java/com/vtosters/lite/R.java | 29 ++++++++++++++++++ .../vtosters/lite/ui/dialogs/OTADialog.java | 4 +-- .../ui/fragments/DataSettingsFragment.java | 4 +-- .../lite/ui/fragments/InstallGMSFragment.java | 3 +- .../lite/ui/fragments/VTSettings.java | 28 ++++++++--------- .../tgstickers/StickersFragment.java | 8 ++--- smali/res/values-be/strings.xml | 30 +++++++++++++++++++ smali/res/values-ru/strings.xml | 30 +++++++++++++++++++ smali/res/values-uk/strings.xml | 30 +++++++++++++++++++ smali/res/values/strings.xml | 29 ++++++++++++++++++ 10 files changed, 172 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/vtosters/lite/R.java b/app/src/main/java/com/vtosters/lite/R.java index ebed0b760..1f912dc3a 100644 --- a/app/src/main/java/com/vtosters/lite/R.java +++ b/app/src/main/java/com/vtosters/lite/R.java @@ -19664,6 +19664,35 @@ public final class R { public static final int invalidate_theme_cache_each_update_title = 0x7f121890; // 2131892368 public static final int invertFilters = 0x7f121891; // 2131892369 public static final int invertFilters_summ = 0x7f121892; // 2131892370 + public static final int invertcached_summ = 0x7f121893; // 2131892371 + public static final int invertcached_title = 0x7f121894; // 2131892372 + public static final int microg_dialog1 = 0x7f121895; // 2131892373 + public static final int microg_dialog2 = 0x7f121896; // 2131892374 + public static final int microg_dialog3 = 0x7f121897; // 2131892375 + public static final int serverFeaturesDisable = 0x7f121898; // 2131892376 + public static final int serverFeaturesDisable_summ = 0x7f121899; // 2131892377 + public static final int sett_autoupdates = 0x7f12189a; // 2131892378 + public static final int sett_autoupdates_summ = 0x7f12189b; // 2131892379 + public static final int sett_battery = 0x7f12189c; // 2131892380 + public static final int sett_battery_summ1 = 0x7f12189d; // 2131892381 + public static final int sett_battery_summ2 = 0x7f12189e; // 2131892382 + public static final int sett_chats = 0x7f12189f; // 2131892383 + public static final int sett_chats_summ = 0x7f1218a0; // 2131892384 + public static final int sett_community = 0x7f1218a1; // 2131892385 + public static final int sett_community_summ = 0x7f1218a2; // 2131892386 + public static final int sett_missing_links = 0x7f1218a3; // 2131892387 + public static final int sett_missing_links_summ = 0x7f1218a4; // 2131892388 + public static final int sett_nogms_summ = 0x7f1218a5; // 2131892389 + public static final int sett_notifs = 0x7f1218a6; // 2131892390 + public static final int sett_notifs_summ = 0x7f1218a7; // 2131892391 + public static final int sett_recommendations = 0x7f1218a8; // 2131892392 + public static final int tgs_token_missing = 0x7f1218aa; // 2131892394 + public static final int tgs_token_reset = 0x7f1218ab; // 2131892395 + public static final int tgs_token_reset_dialog = 0x7f1218ac; // 2131892396 + public static final int tgs_token_reset_menu = 0x7f1218ad; // 2131892397 + public static final int update_err = 0x7f1218ae; // 2131892398 + public static final int update_latest = 0x7f1218af; // 2131892399 + public static final int APKTOOL_DUMMY_18a9 = 0x7f1218a9; // 2131892393 } public static final class style { diff --git a/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java b/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java index 429e9219b..ac2d8f5ff 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java +++ b/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java @@ -64,7 +64,7 @@ public class OTADialog extends ModalBottomSheetWrapper implements OTA public void onUpdateLatest(boolean isManualCheck) { if (isManualCheck) { mActivity.runOnUiThread(() -> { - Toast.makeText(mActivity, "У вас установлена последняя версия приложения", Toast.LENGTH_SHORT).show(); + Toast.makeText(mActivity, AndroidUtils.getString("update_latest"), Toast.LENGTH_SHORT).show(); }); } } @@ -72,7 +72,7 @@ public class OTADialog extends ModalBottomSheetWrapper implements OTA @Override public void onUpdateError() { mActivity.runOnUiThread(() -> { - Toast.makeText(mActivity, "Ошибка проверки обновления", Toast.LENGTH_SHORT).show(); + Toast.makeText(mActivity, AndroidUtils.getString("update_err"), Toast.LENGTH_SHORT).show(); }); } } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java index fd31e1a90..82c1d52e0 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/DataSettingsFragment.java @@ -304,8 +304,8 @@ public class DataSettingsFragment extends TrackedMaterialPreferenceToolbarFragme PreferenceFragmentUtils.addMaterialSwitchPreference( getPreferenceScreen(), "serverFeaturesDisable", - "Отключить всю работу с сервером", - "Отключает галочки и все дополнительные функции связанные с получением данных с сервера ВТостерс", + AndroidUtils.getString("serverFeaturesDisable"), + AndroidUtils.getString("serverFeaturesDisable_summ"), null, false, (preference, o) -> { diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java index 62264c32b..0d8170c87 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/InstallGMSFragment.java @@ -5,6 +5,7 @@ import android.net.Uri; import android.os.Bundle; import com.vk.core.dialogs.alert.VkAlertDialog; import com.vtosters.lite.R; +import ru.vtosters.lite.utils.AndroidUtils; public class InstallGMSFragment extends TrackedMaterialPreferenceToolbarFragment { @Override @@ -13,7 +14,7 @@ public class InstallGMSFragment extends TrackedMaterialPreferenceToolbarFragment addPreferencesFromResource(R.xml.preferences_gms); findPreference("microg").setOnPreferenceClickListener((preference) -> { - String[] items = {"Уменьшенный MicroG (ReVanced)", "Альтернативный MicroG (ReVanced)", "Полноценный MicroG (Замена GMS)"}; + String[] items = {AndroidUtils.getString("microg_dialog1"), AndroidUtils.getString("microg_dialog2"), AndroidUtils.getString("microg_dialog3")}; new VkAlertDialog.Builder(requireActivity()).setItems(items, (dialog, which) -> { switch (which) { diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index 81b1d9f8e..47f3d4f2a 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -196,14 +196,14 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { } if ((isLinksUnverified || isDozingAvailable || areNotificationsDisabled || isGMSNotInstalled) && !Preferences.getBoolValue("dialogrecomm", false)) { - PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Рекомендации"); + PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), AndroidUtils.getString("sett_recommendations")); if (isGMSNotInstalled) { PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", requireContext().getString(R.string.installgms), - "Отсутствие этих сервисов приводит к поломке фоновых уведомлений и проблемам работы компонентов приложения", + AndroidUtils.getString("sett_nogms_summ"), RecolorUtils.recolorDrawable(R.drawable.ic_logo_google_28, ThemesUtils.getColor(R.color.red)), preference -> { NavigatorUtils.switchFragment(requireContext(), InstallGMSFragment.class); @@ -216,8 +216,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", - "Не выбраны ссылки для открытия приложением", - "Это помешает открытию внешних ссылок для их открытия с помощью этого приложения\n\nВ некоторых случаях необходимо отключить открытие ссылок официальным приложениям ВКонтакте", + AndroidUtils.getString("sett_missing_links"), + AndroidUtils.getString("sett_missing_links_summ"), RecolorUtils.recolorDrawable(R.drawable.ic_linked_outline_28, ThemesUtils.getColor(R.color.red)), preference -> { try { @@ -240,8 +240,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", - "Отключите экономию батареи", - "Экономия батареи мешает получению фоновых сообщений, уведомлений и работе музыки" + (OEMDetector.isMIUI() ? "\n\nДля устройств Xiaomi необходимо вручную включить в настройках системы пункт Автозапуск данному приложению" : ""), + AndroidUtils.getString("sett_battery"), + AndroidUtils.getString("sett_battery_summ1") + (OEMDetector.isMIUI() ? AndroidUtils.getString("sett_battery_summ2") : ""), RecolorUtils.recolorDrawable(R.drawable.ic_filter_outline_28, ThemesUtils.getColor(R.color.red)), preference -> { @SuppressLint("BatteryLife") @@ -258,8 +258,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", - "Включите уведомления", - "Без включенных уведомлений не получится получать сообщения и многое другое", + AndroidUtils.getString("sett_notifs"), + AndroidUtils.getString("sett_notifs_summ"), RecolorUtils.recolorDrawable(R.drawable.ic_notifications_outline_28, ThemesUtils.getColor(R.color.red)), preference -> { @SuppressLint("BatteryLife") @@ -616,8 +616,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", - "Наши чаты", - "Активные чаты по обсуждению модификации и многому другому", + AndroidUtils.getString("sett_chats"), + AndroidUtils.getString("sett_chats_summ"), R.drawable.ic_message_outline_28, preference -> { var args = new Bundle(); @@ -635,8 +635,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addPreference( getPreferenceScreen(), "", - "Наши сообщества", - "Самая свежая информация об обновлениях и не только!", + AndroidUtils.getString("sett_community"), + AndroidUtils.getString("sett_community_summ"), R.drawable.users_3_outline_28, preference -> { var args = new Bundle(); @@ -693,8 +693,8 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment { PreferenceFragmentUtils.addMaterialSwitchPreference( getPreferenceScreen(), "autoupdates", - "Автоматическое обновление", - "Получать уведомление о выходе новой версии приложения", + AndroidUtils.getString("sett_autoupdates"), + AndroidUtils.getString("sett_autoupdates_summ"), R.drawable.ic_history_outline_28, true, (preference, o) -> { diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java index 6bda90ad8..16dce71a1 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java @@ -55,15 +55,15 @@ public class StickersFragment extends BaseToolbarFragment { }; private static void resetToken(Context ctx) { - if (TGPref.getTGBotKey() == null) AndroidUtils.sendToast("Токен отсутствует"); + if (TGPref.getTGBotKey() == null) AndroidUtils.sendToast(AndroidUtils.getString("tgs_token_missing")); new VkAlertDialog.Builder(ctx) - .setTitle("Сбросить токен бота?") + .setTitle(AndroidUtils.getString("tgs_token_reset_dialog")) .setNegativeButton(R.string.cancel, (dialog, which) -> { dialog.cancel(); }) .setPositiveButton(R.string.ok, (dialog, which) -> { TGPref.setTGBotKey(null); - AndroidUtils.sendToast("Токен бота сброшен"); + AndroidUtils.sendToast(AndroidUtils.getString("tgs_token_reset")); }) .show(); } @@ -75,7 +75,7 @@ public class StickersFragment extends BaseToolbarFragment { .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(0, 1, 0, "") .setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.ic_refresh_outline_28))) - .setTitle("Сбросить токен бота") + .setTitle(AndroidUtils.getString("tgs_token_reset_menu")) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); super.onCreateMenu(menu); } diff --git a/smali/res/values-be/strings.xml b/smali/res/values-be/strings.xml index c217d4710..b84751328 100644 --- a/smali/res/values-be/strings.xml +++ b/smali/res/values-be/strings.xml @@ -7034,4 +7034,34 @@ Інвертаваць cпіс Інвертаваць cпіс кэшаваных трэкаў + + Рэкамендацыі + Адсутнасць гэтых сэрвісаў прыводзіць да паломкі фонавых апавяшчэнняў і праблемах працы кампанентаў прыкладання + Не абраныя спасылкі для адкрыцця дадаткам + Гэта перашкодзіць адкрыццю знешніх спасылак для іх адкрыцця з дапамогай гэтага прыкладання\n\nБ некаторых выпадках неабходна адключыць адкрыццё спасылак афіцыйным прыкладанням ВКонтакте + Адключыце эканомію батарэі + Эканомія батарэі перашкаджае атрыманню фонавых паведамленняў, апавяшчэнняў і працы музыкі + \n\nДля прылад Xiaomi неабходна ўручную ўключыць у наладах сістэмы пункт Аўтазапуск дадзеным дадаткам + Уключыце апавяшчэння + Без уключаных апавяшчэнняў не атрымаецца атрымліваць паведамленні і многае іншае + Нашы чаты + Актыўныя чаты па абмеркаванні мадыфікацыі і шмат чаму іншаму + Наша група + Самая свежая інфармацыя аб абнаўленнях і не толькі + Аўтаматычнае абнаўленне + Атрымліваць апавяшчэнне аб выхадзе новай версіі прыкладання + + У вас ўстаноўлена АПОШНЯЯ версія прыкладання + Памылка праверкі абнаўлення + Адключыць усю працу з серверам + Адключае верыфікацыі і ўсе дадатковыя функцыі звязаныя з атрыманнем дадзеных з сервера ВТостерс + + Токен адсутнічае + Скінуць токен бота? + Токен бота скінуты + Скінуць токен бота + + Паменшаны MicroG (ReVanced) + Альтэрнатыўны MicroG (ReVanced) + Паўнавартасны MicroG (Замена GMS) \ No newline at end of file diff --git a/smali/res/values-ru/strings.xml b/smali/res/values-ru/strings.xml index 18dd5c69a..2aea24db2 100644 --- a/smali/res/values-ru/strings.xml +++ b/smali/res/values-ru/strings.xml @@ -6417,4 +6417,34 @@ Инвертировать список Инвертировать список кешированных треков + + Рекомендации + Отсутствие этих сервисов приводит к поломке фоновых уведомлений и проблемам работы компонентов приложения + Не выбраны ссылки для открытия приложением + Это помешает открытию внешних ссылок для их открытия с помощью этого приложения\n\nВ некоторых случаях необходимо отключить открытие ссылок официальным приложениям ВКонтакте + Отключите экономию батареи + Экономия батареи мешает получению фоновых сообщений, уведомлений и работе музыки + \n\nДля устройств Xiaomi необходимо вручную включить в настройках системы пункт Автозапуск данному приложению + Включите уведомления + Без включенных уведомлений не получится получать сообщения и многое другое + Наши чаты + Активные чаты по обсуждению модификации и многому другому + Наши сообщества + Самая свежая информация об обновлениях и не только + Автоматическое обновление + Получать уведомление о выходе новой версии приложения + + У вас установлена последняя версия приложения + Ошибка проверки обновления + Отключить всю работу с сервером + Отключает галочки и все дополнительные функции связанные с получением данных с сервера ВТостерс + + Токен отсутствует + Сбросить токен бота? + Токен бота сброшен + Сбросить токен бота + + Уменьшенный MicroG (ReVanced) + Альтернативный MicroG (ReVanced) + Полноценный MicroG (Замена GMS) \ No newline at end of file diff --git a/smali/res/values-uk/strings.xml b/smali/res/values-uk/strings.xml index 5a7d1545d..921799dad 100644 --- a/smali/res/values-uk/strings.xml +++ b/smali/res/values-uk/strings.xml @@ -6342,4 +6342,34 @@ Інвертувати список Інвертувати список кешованих треків + + Рекомендації + Відсутність цих сервісів призводить до поломки фонових сповіщень і проблем роботи компонентів застосунку + Не вибрані посилання для відкриття додатком + Це завадить відкриттю зовнішніх посилань для їхнього відкриття за допомогою цього застосунку\n\пУ деяких випадках необхідно відключити відкриття посилань офіційним застосункам ВКонтакте + Відключіть економію батареї + Економія батареї заважає отриманню фонових повідомлень, сповіщень та роботі музики + \n\nДля пристроїв Xiaomi необхідно вручну увімкнути в налаштуваннях системи пункт Автозапуск цього додатка + Увімкніть сповіщення + Без увімкнених сповіщень не вдасться отримувати повідомлення та багато іншого + Наші чати + Активні чати з обговорення модифікації та багато чого іншого + Наші спільноти + Найсвіжіша інформація про оновлення і не тільки + Автоматичне оновлення + Отримувати повідомлення про вихід нової версії застосунку + + Вас встановлена остання версія програми + Помилка перевірки оновлення + Відключити всю роботу з сервером + Відключає галочки і всі додаткові функції, пов\'язані з отриманням даних з сервера ВТостерс + + Токен відсутній + Відкинути токен бота? + Токен бота скинуто + Скинути токен бота + + Зменшений MicroG (ReVanced) + Альтернативний MicroG (ReVanced) + Повноцінний MicroG (Заміна GMS) diff --git a/smali/res/values/strings.xml b/smali/res/values/strings.xml index 1781a080c..3f6c39e1d 100644 --- a/smali/res/values/strings.xml +++ b/smali/res/values/strings.xml @@ -6555,4 +6555,33 @@ May look like a fake leaving the online" Invert list Invert cached track list + + Recommendations + Missing these services causes background notifications to break and application components to have problems working + There is no links selected to be opened by the application + This will prevent external links from being opened by this app to open them\n\nIn some cases it is necessary to disable the opening of links to official VKontakte applications + Turn off power management + Battery savings prevents background messages, notifications and music from functioning properly + \n\nFor Xiaomi devices, you need to manually enable Autorun to this application in the system settings + Turn on notifications + Without notifications enabled, you won\'t be able to receive messages and many others things + Our chats + Live chats to discuss modification and more + Our communities + Latest information about updates and more + Autoupdate + Receive notification when a new version of the application is released + You have the latest version of the app installed + Error checking for updates + Disable all server processing + Disables verifications and all additional functions related to receiving data from the VTosters server + + Token is missing + Reset the bot token? + The bot token has been reset + Reset the bot token + + Reduced MicroG (ReVanced) + Alternate MicroG (ReVanced) + Full MicroG (GMS Replacement) From a6b56e0e87b69b7c1138c87e7a4062a14a62409e Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Wed, 13 Dec 2023 23:08:32 +0300 Subject: [PATCH 028/113] Profiles/Groups resp fixes (#1532) --- .../lite/api/execute/GetFullUserProfile.java | 505 ++++ .../lite/api/execute/GetFullCommunity.smali | 2 +- .../lite/api/execute/GetFullUserProfile.smali | 2550 ----------------- 3 files changed, 506 insertions(+), 2551 deletions(-) create mode 100644 app/src/main/java/com/vtosters/lite/api/execute/GetFullUserProfile.java delete mode 100644 smali/smali_classes4/com/vtosters/lite/api/execute/GetFullUserProfile.smali diff --git a/app/src/main/java/com/vtosters/lite/api/execute/GetFullUserProfile.java b/app/src/main/java/com/vtosters/lite/api/execute/GetFullUserProfile.java new file mode 100644 index 000000000..a99ef2ba5 --- /dev/null +++ b/app/src/main/java/com/vtosters/lite/api/execute/GetFullUserProfile.java @@ -0,0 +1,505 @@ +package com.vtosters.lite.api.execute; + +import android.annotation.SuppressLint; +import android.graphics.RectF; +import android.text.TextUtils; +import android.util.Log; +import android.util.SparseArray; +import com.vk.api.base.utils.ApiUtils; +import com.vk.core.network.Network; +import com.vk.core.util.AppContextHolder; +import com.vk.core.util.Screen; +import com.vk.dto.common.data.VKList; +import com.vk.dto.gift.GiftItem; +import com.vk.dto.group.Group; +import com.vk.dto.newsfeed.entries.ProfilesRecommendations; +import com.vk.dto.photo.Photo; +import com.vk.dto.user.UserProfile; +import com.vk.dto.user.deactivation.UserDeactivation; +import com.vtosters.lite.api.ExtendedUserProfile; +import com.vtosters.lite.auth.VKAccountManager; +import com.vtosters.lite.utils.Utils; +import okhttp3.Headers; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import ru.vtosters.hooks.OnlineFormatterHook; +import ru.vtosters.hooks.RenameHook; +import ru.vtosters.hooks.ssfs.ProfileHook; +import ru.vtosters.lite.di.singleton.VtOkHttpClient; +import ru.vtosters.lite.proxy.ProxyUtils; +import ru.vtosters.lite.utils.AccountManagerUtils; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; + +public class GetFullUserProfile extends GetFullProfile { + private static final OkHttpClient mClient = VtOkHttpClient.getInstance(); + + public GetFullUserProfile(int i, String str, String str2) { + super(i, "execute.getFullProfileNewNew"); + i = i == 0 ? VKAccountManager.d().D0() : i; + b("user_id", i); + b("func_v", 23); // 11 + this.F = i; + if (!TextUtils.isEmpty(str2)) { + c("source", str2); + } + b("photo_sizes", 1); + b("skip_hidden", 1); + if (TextUtils.isEmpty(str)) { + return; + } + c("access_keys", str); + } + + public JSONArray getCitiesNames(String ids) { + var request = new Request.a() + .b("https://" + ProxyUtils.getApi() + "/method/" + "database.getCitiesById" + + "?v=5.119" + + "&city_ids=" + + ids + + "&access_token=" + + AccountManagerUtils.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()).getJSONArray("response"); + } catch (JSONException | IOException e) { + Log.d(this.getClass().getSimpleName(), e.toString()); + } + + return new JSONArray(); + } + + public JSONArray getCountriesNames(String ids) { + var request = new Request.a() + .b("https://" + ProxyUtils.getApi() + "/method/" + "database.getCountriesById" + + "?v=5.119" + + "&country_ids=" + + ids + + "&access_token=" + + AccountManagerUtils.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()).getJSONArray("response"); + } catch (JSONException | IOException e) { + Log.d(this.getClass().getSimpleName(), e.toString()); + } + + return new JSONArray(); + } + + + protected ExtendedUserProfile o() { + return new ExtendedUserProfile(); + } + + @SuppressLint("ResourceType") + public void a(ExtendedUserProfile extendedUserProfile, JSONObject jSONObject) throws JSONException { + char c; + RenameHook.injectIntoJson(jSONObject); + JSONObject onlineHook = OnlineFormatterHook.onlineHook(jSONObject); + UserProfile userProfile = extendedUserProfile.a; + int i = onlineHook.getInt("id"); + this.F = i; + userProfile.b = i; + ProfileHook.fetchInfo(extendedUserProfile, onlineHook); + + extendedUserProfile.a.c = onlineHook.getString("first_name"); + extendedUserProfile.a.e = onlineHook.getString("last_name"); + extendedUserProfile.a.d = extendedUserProfile.a.c + " " + extendedUserProfile.a.e; + extendedUserProfile.a.f = onlineHook.getString(Screen.a() > 1.0f ? "photo_medium_rec" : "photo_rec"); + extendedUserProfile.a.h = onlineHook.getInt("friend_status") == 3; + extendedUserProfile.j = onlineHook.optString("photo_max", onlineHook.getString("photo_medium_rec")); + extendedUserProfile.m = onlineHook.optString("activity", ""); + extendedUserProfile.a.g = onlineHook.getInt("sex") == 1; + extendedUserProfile.a.E = UserProfile.d(jSONObject); + + if (onlineHook.has("crop_photo")) { + extendedUserProfile.k = new Photo(onlineHook.getJSONObject("crop_photo").getJSONObject("photo")); + JSONObject jSONObject2 = onlineHook.getJSONObject("crop_photo").getJSONObject("rect"); + JSONObject jSONObject3 = onlineHook.getJSONObject("crop_photo").getJSONObject("crop"); + double d = jSONObject3.getDouble("x"); + double d2 = jSONObject3.getDouble("x2"); + double d3 = jSONObject3.getDouble("y"); + double d4 = jSONObject3.getDouble("y2"); + double d5 = jSONObject2.getDouble("x"); + double d6 = jSONObject2.getDouble("x2"); + double d7 = jSONObject2.getDouble("y"); + double d8 = (d2 - d) / 100.0d; + double d9 = (d4 - d3) / 100.0d; + double d10 = (d / 100.0d) + ((d5 / 100.0d) * d8); + double d11 = (d3 / 100.0d) + ((d7 / 100.0d) * d9); + extendedUserProfile.l = new RectF((float) d10, (float) d11, (float) (d10 + (((d6 - d5) / 100.0d) * d8)), (float) (d11 + (((jSONObject2.getDouble("y2") - d7) / 100.0d) * d9))); + } + + SparseArray sparseArray = new SparseArray<>(); + SparseArray sparseArray2 = new SparseArray<>(); + + if (onlineHook.has("cities") && onlineHook.getJSONArray("cities").length() > 0) { + List cityNames = new ArrayList<>(); + + JSONArray cities = onlineHook.getJSONArray("cities"); + + for (int i21 = 0; i21 < cities.length(); i21++) { + cityNames.add(cities.getString(i21)); + } + + JSONArray citiesNamesJSONArray = getCitiesNames(String.join(", ", cityNames)); + + Log.d(this.getClass().getSimpleName(), citiesNamesJSONArray.toString()); + + for (int i22 = 0; i22 < citiesNamesJSONArray.length(); i22++) { + JSONObject cityJSONObject = citiesNamesJSONArray.getJSONObject(i22); + int cityid = cityJSONObject.getInt("id"); + String cityTitle = cityJSONObject.getString("title"); + sparseArray.put(cityid, cityTitle); + } + + extendedUserProfile.i0 = sparseArray.get(cities.getInt(0)); + } + + if (onlineHook.has("countries") && onlineHook.getJSONArray("countries").length() > 0) { + JSONArray countries = onlineHook.getJSONArray("countries"); + List countryList = new ArrayList<>(); + + for (int i23 = 0; i23 < countries.length(); i23++) { + countryList.add(countries.getString(i23)); + } + + JSONArray countryInfo = getCountriesNames(String.join(", ", countryList)); + + Log.d(this.getClass().getSimpleName(), countryInfo.toString()); + + for (int i24 = 0; i24 < countryInfo.length(); i24++) { + JSONObject country = countryInfo.getJSONObject(i24); + int countryid = country.getInt("id"); + String countryTitle = country.getString("title"); + sparseArray2.put(countryid, countryTitle); + } + + extendedUserProfile.j0 = sparseArray2.get(countries.getInt(0)); + } + + extendedUserProfile.U = onlineHook.getInt("can_write_private_message") == 1; + extendedUserProfile.X = onlineHook.getInt("can_post") == 1; + extendedUserProfile.Y = onlineHook.optInt("can_suggest") == 1; + extendedUserProfile.V = onlineHook.optInt("can_see_all_posts") == 1; + extendedUserProfile.f0 = onlineHook.optInt("can_see_archived_posts") == 1; + extendedUserProfile.a0 = "all".equals(onlineHook.optString("wall_default")); + extendedUserProfile.W = onlineHook.optBoolean("can_call", false); + extendedUserProfile.Z = onlineHook.optInt("blacklisted_by_me") == 1; + + if (onlineHook.optInt("blacklisted") == 1) { + extendedUserProfile.Y0 = new ExtendedUserProfile.c(); + } + + extendedUserProfile.u = onlineHook.optInt("relation"); + if (onlineHook.has("relation_partner")) { + extendedUserProfile.v = onlineHook.getJSONObject("relation_partner").getInt("id"); + extendedUserProfile.w = onlineHook.getJSONObject("relation_partner").getString("first_name") + " " + onlineHook.getJSONObject("relation_partner").getString("last_name"); + } + + if (onlineHook.has("bdate")) { + String string = onlineHook.getString("bdate"); + extendedUserProfile.a.I = string; + String[] split = string.split("\\."); + extendedUserProfile.s = Integer.parseInt(split[0]); + extendedUserProfile.t = Integer.parseInt(split[1]); + if (split.length > 2) { + extendedUserProfile.r = Integer.parseInt(split[2]); + } + } + + extendedUserProfile.d = onlineHook.optString("first_name_dat", extendedUserProfile.a.c); + extendedUserProfile.b = onlineHook.optString("first_name_gen", extendedUserProfile.a.c); + extendedUserProfile.c = onlineHook.optString("first_name_ins", extendedUserProfile.a.c); + extendedUserProfile.h = onlineHook.optString("first_name_acc", extendedUserProfile.a.c); + extendedUserProfile.g = onlineHook.optString("last_name_dat", extendedUserProfile.a.e); + extendedUserProfile.e = onlineHook.optString("last_name_gen", extendedUserProfile.a.e); + extendedUserProfile.f = onlineHook.optString("last_name_ins", extendedUserProfile.a.e); + + String optString = onlineHook.optString("last_name_acc", extendedUserProfile.a.e); + extendedUserProfile.i = optString; + + if (onlineHook.has("mobile_phone") && !onlineHook.getString("mobile_phone").isEmpty()) { + extendedUserProfile.l0 = onlineHook.getString("mobile_phone"); + } + + if (onlineHook.has("home_phone") && !onlineHook.getString("home_phone").isEmpty()) { + extendedUserProfile.m0 = onlineHook.getString("home_phone"); + } + + if (onlineHook.has("skype")) { + extendedUserProfile.n0 = onlineHook.getString("skype"); + } + + if (onlineHook.has("twitter")) { + extendedUserProfile.o0 = onlineHook.getString("twitter"); + } + + if (onlineHook.has("livejournal")) { + extendedUserProfile.r0 = onlineHook.getString("livejournal"); + } + + if (onlineHook.has("facebook") && onlineHook.optLong("facebook", -1L) != -1) { + extendedUserProfile.q0 = onlineHook.getLong("facebook"); + extendedUserProfile.p0 = onlineHook.getString("facebook_name"); + } + + if (onlineHook.has("instagram")) { + extendedUserProfile.u0 = onlineHook.getString("instagram"); + } + + extendedUserProfile.R0 = onlineHook.getInt("friend_status"); + JSONArray optJSONArray = onlineHook.optJSONArray("schools"); + extendedUserProfile.v0 = new ArrayList<>(); + + ArrayList arrayList = null; + if (optJSONArray != null) { + for (int i4 = 0; i4 < optJSONArray.length(); i4++) { + ExtendedUserProfile.f fVar = new ExtendedUserProfile.f(); + JSONObject jSONObject6 = optJSONArray.getJSONObject(i4); + fVar.c = sparseArray.get(jSONObject6.optInt(optString)); + fVar.a = jSONObject6.optString("name", "???"); + fVar.g = jSONObject6.optInt("year_from"); + fVar.f = jSONObject6.optInt("year_to"); + fVar.h = jSONObject6.optInt("year_graduated"); + fVar.b = jSONObject6.optString("class", null); + fVar.d = jSONObject6.optString("speciality", null); + fVar.e = jSONObject6.optString("type_str", AppContextHolder.a.getResources().getString(2131889117)); + extendedUserProfile.v0.add(fVar); + } + } + extendedUserProfile.w0 = new ArrayList<>(); + + JSONArray optJSONArray2 = onlineHook.optJSONArray("universities"); + if (optJSONArray2 != null) { + for (int i5 = 0; i5 < optJSONArray2.length(); i5++) { + ExtendedUserProfile.g gVar = new ExtendedUserProfile.g(); + JSONObject jSONObject7 = optJSONArray2.getJSONObject(i5); + gVar.a = jSONObject7.getString("name").trim(); + if (jSONObject7.has("faculty_name")) { + gVar.b = jSONObject7.getString("faculty_name").trim(); + } + if (jSONObject7.has("chair_name")) { + gVar.c = jSONObject7.getString("chair_name").trim(); + } + gVar.d = jSONObject7.optInt("graduation"); + extendedUserProfile.w0.add(gVar); + } + } + + if (onlineHook.has("interests") && onlineHook.getString("interests").length() > 0) { + extendedUserProfile.y0 = onlineHook.getString("interests"); + } + + if (onlineHook.has("movies") && onlineHook.getString("movies").length() > 0) { + extendedUserProfile.A0 = onlineHook.getString("movies"); + } + + if (onlineHook.has("music") && onlineHook.getString("music").length() > 0) { + extendedUserProfile.z0 = onlineHook.getString("music"); + } + + if (onlineHook.has("tv") && onlineHook.getString("tv").length() > 0) { + extendedUserProfile.B0 = onlineHook.getString("tv"); + } + + if (onlineHook.has("books") && onlineHook.getString("books").length() > 0) { + extendedUserProfile.C0 = onlineHook.getString("books"); + } + + if (onlineHook.has("games") && onlineHook.getString("games").length() > 0) { + extendedUserProfile.D0 = onlineHook.getString("games"); + } + + if (onlineHook.has("about") && onlineHook.getString("about").length() > 0) { + extendedUserProfile.F0 = onlineHook.getString("about"); + } + + if (onlineHook.has("quotes") && onlineHook.getString("quotes").length() > 0) { + extendedUserProfile.E0 = onlineHook.getString("quotes"); + } + + if (onlineHook.has("activities") && onlineHook.getString("activities").length() > 0) { + extendedUserProfile.x0 = onlineHook.getString("activities"); + } + + if (onlineHook.has("home_town") && onlineHook.getString("home_town").length() > 0) { + extendedUserProfile.g0 = onlineHook.getString("home_town"); + } + + if (onlineHook.has("site") && onlineHook.getString("site").length() > 0) { + extendedUserProfile.M = onlineHook.getString("site"); + } + + extendedUserProfile.a.Q.b(onlineHook); + + JSONObject optJSONObject = onlineHook.optJSONObject("personal"); + if (optJSONObject != null) { + JSONArray optJSONArray3 = optJSONObject.optJSONArray("langs"); + + if (optJSONArray3 != null) { + ArrayList arrayList2 = new ArrayList<>(); + for (int i6 = 0; i6 < optJSONArray3.length(); i6++) { + arrayList2.add(optJSONArray3.getString(i6)); + } + extendedUserProfile.G0 = TextUtils.join(", ", arrayList2); + } + + extendedUserProfile.J0 = optJSONObject.optInt("political"); + extendedUserProfile.H0 = optJSONObject.optString("religion"); + extendedUserProfile.K0 = optJSONObject.optInt("life_main"); + extendedUserProfile.L0 = optJSONObject.optInt("people_main"); + extendedUserProfile.I0 = optJSONObject.optString("inspired_by"); + extendedUserProfile.M0 = optJSONObject.optInt("smoking"); + extendedUserProfile.N0 = optJSONObject.optInt("alcohol"); + } + + SparseArray sparseArray3 = new SparseArray(); + JSONArray optJSONArray4 = onlineHook.optJSONArray("relatives_profiles"); + if (optJSONArray4 != null) { + for (int i7 = 0; i7 < optJSONArray4.length(); i7++) { + UserProfile userProfile2 = new UserProfile(optJSONArray4.getJSONObject(i7)); + sparseArray3.put(userProfile2.b, userProfile2); + } + } + + JSONArray optJSONArray5 = onlineHook.optJSONArray("relatives"); + if (optJSONArray5 != null) { + ArrayList arrayList3 = null; + ArrayList arrayList4 = null; + ArrayList arrayList5 = null; + ArrayList arrayList6 = null; + for (int i8 = 0; i8 < optJSONArray5.length(); i8++) { + JSONObject jSONObject8 = optJSONArray5.getJSONObject(i8); + int i9 = jSONObject8.getInt("id"); + if (ApiUtils.a(sparseArray3, i9)) { + String valueOf = jSONObject8.getString("type"); + switch (valueOf.hashCode()) { + case -995424086 -> { + if (valueOf.equals("parent")) { + c = 4; + break; + } + c = 65535; + } + case -268316490 -> { + if (valueOf.equals("grandparent")) { + c = 1; + break; + } + c = 65535; + } + case 94631196 -> { + if (valueOf.equals("child")) { + c = 2; + break; + } + c = 65535; + } + case 395180944 -> { + if (valueOf.equals("grandchild")) { + c = 0; + break; + } + c = 65535; + } + case 2083595970 -> { + if (valueOf.equals("sibling")) { + c = 3; + break; + } + c = 65535; + } + default -> c = 65535; + } + switch (c) { + case 0 -> arrayList6 = Utils.a(arrayList6, sparseArray3.get(i9)); + case 1 -> arrayList5 = Utils.a(arrayList5, sparseArray3.get(i9)); + case 2 -> arrayList4 = Utils.a(arrayList4, sparseArray3.get(i9)); + case 3 -> arrayList3 = Utils.a(arrayList3, sparseArray3.get(i9)); + case 4 -> arrayList = Utils.a(arrayList, sparseArray3.get(i9)); + } + } + } + + extendedUserProfile.A = Utils.a((ArrayList) arrayList, UserProfile.CREATOR); + extendedUserProfile.B = Utils.a((ArrayList) arrayList3, UserProfile.CREATOR); + extendedUserProfile.C = Utils.a((ArrayList) arrayList4, UserProfile.CREATOR); + extendedUserProfile.D = Utils.a((ArrayList) arrayList5, UserProfile.CREATOR); + extendedUserProfile.E = Utils.a((ArrayList) arrayList6, UserProfile.CREATOR); + } + + JSONObject optJSONObject2 = onlineHook.optJSONObject("owner_state"); + if (optJSONObject2 != null) { + extendedUserProfile.q = UserDeactivation.CREATOR.a(optJSONObject2); + } + + JSONObject optJSONObject3 = onlineHook.optJSONObject("gifts"); + if (optJSONObject3 != null) { + extendedUserProfile.y1 = new VKList<>(optJSONObject3, GiftItem.C); + } + + JSONArray optJSONArray6 = onlineHook.optJSONArray("friends"); + if (optJSONArray6 != null) { + extendedUserProfile.H = new ArrayList<>(); + for (int i10 = 0; i10 < optJSONArray6.length(); i10++) { + extendedUserProfile.H.add(new UserProfile(optJSONArray6.getJSONObject(i10))); + } + } + + if (onlineHook.has("career")) { + extendedUserProfile.I = new ArrayList<>(); + JSONArray jSONArray3 = onlineHook.getJSONArray("career"); + for (int i11 = 0; i11 < jSONArray3.length(); i11++) { + JSONObject jSONObject9 = jSONArray3.getJSONObject(i11); + ExtendedUserProfile.e eVar = new ExtendedUserProfile.e(); + if (jSONObject9.has("group")) { + eVar.a = new Group(jSONObject9.getJSONObject("group")); + } else { + eVar.c = jSONObject9.getString("company"); + } + eVar.e = jSONObject9.optInt("from"); + eVar.f = jSONObject9.optInt("until"); + eVar.d = jSONObject9.optString("position"); + extendedUserProfile.I.add(eVar); + } + } + + if (onlineHook.has("display_fields")) { + JSONArray jSONArray4 = onlineHook.getJSONArray("display_fields"); + extendedUserProfile.j1 = new ArrayList<>(); + for (int i12 = 0; i12 < jSONArray4.length(); i12++) { + extendedUserProfile.j1.add(jSONArray4.getString(i12)); + } + } + + extendedUserProfile.u1 = onlineHook.getBoolean("all_photos_are_hidden"); + JSONObject optJSONObject4 = onlineHook.optJSONObject("friends_recommendations"); + if (optJSONObject4 != null) { + extendedUserProfile.J = getFriendsRecomms(optJSONObject4); + } + } + + public ProfilesRecommendations getFriendsRecomms(JSONObject json) { + try { + Method method = ProfilesRecommendations.class.getDeclaredMethod("b", JSONObject.class); + return (ProfilesRecommendations) method.invoke(null, json); + } catch (Exception e) { + Log.d(this.getClass().getSimpleName(), e.toString()); + return null; + } + } + + public GetFullProfile.a a(JSONObject jSONObject) { + return super.a(jSONObject); + } +} diff --git a/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullCommunity.smali b/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullCommunity.smali index b69f9cf53..e164d35c3 100644 --- a/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullCommunity.smali +++ b/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullCommunity.smali @@ -35,7 +35,7 @@ const-string v0, "func_v" - const/16 v1, 0x1b + const/16 v1, 0x25 .line 3 invoke-virtual {p0, v0, v1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; diff --git a/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullUserProfile.smali b/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullUserProfile.smali deleted file mode 100644 index 32f768d2e..000000000 --- a/smali/smali_classes4/com/vtosters/lite/api/execute/GetFullUserProfile.smali +++ /dev/null @@ -1,2550 +0,0 @@ -.class public Lcom/vtosters/lite/api/execute/GetFullUserProfile; -.super Lcom/vtosters/lite/api/execute/GetFullProfile; -.source "GetFullUserProfile.java" - - -# annotations -.annotation system Ldalvik/annotation/Signature; - value = { - "Lcom/vtosters/lite/api/execute/GetFullProfile<", - "Lcom/vtosters/lite/api/ExtendedUserProfile;", - ">;" - } -.end annotation - - -# direct methods -.method public constructor (ILjava/lang/String;Ljava/lang/String;)V - .locals 2 - - const-string v0, "execute.getFullProfileNewNew" - - .line 1 - invoke-direct {p0, p1, v0}, Lcom/vtosters/lite/api/execute/GetFullProfile;->(ILjava/lang/String;)V - - if-nez p1, :cond_0 - - .line 2 - invoke-static {}, Lcom/vtosters/lite/auth/VKAccountManager;->d()Lcom/vk/auth/api/VKAccount; - - move-result-object p1 - - invoke-virtual {p1}, Lcom/vk/auth/api/VKAccount;->D0()I - - move-result p1 - - :cond_0 - const-string v0, "user_id" - - .line 3 - invoke-virtual {p0, v0, p1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; - - const/16 v0, 0xb - - const-string v1, "func_v" - - .line 4 - invoke-virtual {p0, v1, v0}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; - - .line 5 - iput p1, p0, Lcom/vtosters/lite/api/execute/GetFullProfile;->F:I - - .line 6 - invoke-static {p3}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z - - move-result p1 - - if-nez p1, :cond_1 - - const-string p1, "source" - - .line 7 - invoke-virtual {p0, p1, p3}, Lcom/vk/api/base/ApiRequest;->c(Ljava/lang/String;Ljava/lang/String;)Lcom/vk/api/base/ApiRequest; - - :cond_1 - const/4 p1, 0x1 - - const-string p3, "photo_sizes" - - .line 8 - invoke-virtual {p0, p3, p1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; - - const-string p3, "skip_hidden" - - .line 9 - invoke-virtual {p0, p3, p1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; - - .line 10 - invoke-static {p2}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z - - move-result p1 - - if-nez p1, :cond_2 - - const-string p1, "access_keys" - - .line 11 - invoke-virtual {p0, p1, p2}, Lcom/vk/api/base/ApiRequest;->c(Ljava/lang/String;Ljava/lang/String;)Lcom/vk/api/base/ApiRequest; - - :cond_2 - return-void -.end method - - -# virtual methods -.method public a(Lorg/json/JSONObject;)Lcom/vtosters/lite/api/execute/GetFullProfile$a; - .locals 0 - - .line 194 - invoke-super {p0, p1}, Lcom/vtosters/lite/api/execute/GetFullProfile;->a(Lorg/json/JSONObject;)Lcom/vtosters/lite/api/execute/GetFullProfile$a; - - move-result-object p1 - - return-object p1 -.end method - -.method public bridge synthetic a(Lorg/json/JSONObject;)Ljava/lang/Object; - .locals 0 - .annotation system Ldalvik/annotation/Throws; - value = { - Ljava/lang/Exception; - } - .end annotation - - .line 1 - invoke-virtual {p0, p1}, Lcom/vtosters/lite/api/execute/GetFullUserProfile;->a(Lorg/json/JSONObject;)Lcom/vtosters/lite/api/execute/GetFullProfile$a; - - move-result-object p1 - - return-object p1 -.end method - -.method public a(Lcom/vtosters/lite/api/ExtendedUserProfile;Lorg/json/JSONObject;)V - .locals 27 - .annotation system Ldalvik/annotation/Throws; - value = { - Lorg/json/JSONException; - } - .end annotation - - invoke-static/range {p2 .. p2}, Lru/vtosters/hooks/RenameHook;->injectIntoJson(Lorg/json/JSONObject;)V - - move-object/from16 v0, p1 - - move-object/from16 v1, p2 - - invoke-static {v1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHook(Lorg/json/JSONObject;)Lorg/json/JSONObject; - - move-result-object v1 - - .line 2 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - const-string v3, "id" - - invoke-virtual {v1, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v4 - - move-object/from16 v5, p0 - - iput v4, v5, Lcom/vtosters/lite/api/execute/GetFullProfile;->F:I - - iput v4, v2, Lcom/vk/dto/user/UserProfile;->b:I - - invoke-static {v0, v1}, Lru/vtosters/hooks/ssfs/ProfileHook;->fetchInfo(Lcom/vtosters/lite/api/ExtendedUserProfile;Lorg/json/JSONObject;)V - - .line 3 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - const-string v4, "first_name" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v2, Lcom/vk/dto/user/UserProfile;->c:Ljava/lang/String; - - .line 4 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - const-string v4, "last_name" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v2, Lcom/vk/dto/user/UserProfile;->e:Ljava/lang/String; - - .line 5 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - new-instance v4, Ljava/lang/StringBuilder; - - invoke-direct {v4}, Ljava/lang/StringBuilder;->()V - - iget-object v6, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v6, v6, Lcom/vk/dto/user/UserProfile;->c:Ljava/lang/String; - - invoke-virtual {v4, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - const-string v6, " " - - invoke-virtual {v4, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - iget-object v6, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v6, v6, Lcom/vk/dto/user/UserProfile;->e:Ljava/lang/String; - - invoke-virtual {v4, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v2, Lcom/vk/dto/user/UserProfile;->d:Ljava/lang/String; - - .line 6 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - invoke-static {}, Lcom/vk/core/util/Screen;->a()F - - move-result v4 - - const/high16 v6, 0x3f800000 # 1.0f - - cmpl-float v4, v4, v6 - - if-lez v4, :cond_0 - - const-string v4, "photo_medium_rec" - - goto :goto_0 - - :cond_0 - const-string v4, "photo_rec" - - :goto_0 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v2, Lcom/vk/dto/user/UserProfile;->f:Ljava/lang/String; - - .line 7 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - const-string v4, "friend_status" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v4 - - const/4 v6, 0x3 - - const/4 v7, 0x0 - - const/4 v8, 0x1 - - if-ne v4, v6, :cond_1 - - const/4 v4, 0x1 - - goto :goto_1 - - :cond_1 - const/4 v4, 0x0 - - :goto_1 - iput-boolean v4, v2, Lcom/vk/dto/user/UserProfile;->h:Z - - const-string v2, "photo_medium_rec" - - .line 8 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v2 - - const-string v4, "photo_max" - - invoke-virtual {v1, v4, v2}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v2 - - iput-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->j:Ljava/lang/String; - - const-string v2, "activity" - - const-string v4, "" - - .line 9 - invoke-virtual {v1, v2, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v2 - - iput-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->m:Ljava/lang/String; - - .line 10 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - const-string v4, "sex" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_2 - - const/4 v4, 0x1 - - goto :goto_2 - - :cond_2 - const/4 v4, 0x0 - - :goto_2 - iput-boolean v4, v2, Lcom/vk/dto/user/UserProfile;->g:Z - - .line 11 - iget-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - invoke-static/range {p2 .. p2}, Lcom/vk/dto/user/UserProfile;->d(Lorg/json/JSONObject;)Lcom/vk/dto/user/OnlineInfo; - - move-result-object v4 - - iput-object v4, v2, Lcom/vk/dto/user/UserProfile;->E:Lcom/vk/dto/user/OnlineInfo; - - const-string v2, "crop_photo" - - .line 12 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_3 - - .line 13 - new-instance v4, Lcom/vk/dto/photo/Photo; - - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v9 - - const-string v10, "photo" - - invoke-virtual {v9, v10}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v9 - - invoke-direct {v4, v9}, Lcom/vk/dto/photo/Photo;->(Lorg/json/JSONObject;)V - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->k:Lcom/vk/dto/photo/Photo; - - .line 14 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v4 - - const-string v9, "rect" - - invoke-virtual {v4, v9}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v4 - - .line 15 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v2 - - const-string v9, "crop" - - invoke-virtual {v2, v9}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v2 - - const-string v9, "x" - - .line 16 - invoke-virtual {v2, v9}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v9 - - const-string v11, "x2" - - invoke-virtual {v2, v11}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v11 - - const-string v13, "y" - - invoke-virtual {v2, v13}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v13 - - const-string v15, "y2" - - invoke-virtual {v2, v15}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v15 - - const-string v2, "x" - - .line 17 - invoke-virtual {v4, v2}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v17 - - const-string v2, "x2" - - invoke-virtual {v4, v2}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v19 - - const-string v2, "y" - - invoke-virtual {v4, v2}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v21 - - const-string v2, "y2" - - invoke-virtual {v4, v2}, Lorg/json/JSONObject;->getDouble(Ljava/lang/String;)D - - move-result-wide v23 - - sub-double/2addr v11, v9 - - const-wide/high16 v25, 0x4059000000000000L # 100.0 - - div-double v11, v11, v25 - - sub-double/2addr v15, v13 - - div-double v15, v15, v25 - - sub-double v19, v19, v17 - - div-double v19, v19, v25 - - sub-double v23, v23, v21 - - div-double v23, v23, v25 - - mul-double v19, v19, v11 - - mul-double v23, v23, v15 - - .line 18 - new-instance v2, Landroid/graphics/RectF; - - div-double v9, v9, v25 - - div-double v17, v17, v25 - - mul-double v17, v17, v11 - - add-double v9, v9, v17 - - double-to-float v4, v9 - - div-double v13, v13, v25 - - div-double v21, v21, v25 - - mul-double v21, v21, v15 - - add-double v13, v13, v21 - - double-to-float v11, v13 - - add-double v9, v9, v19 - - double-to-float v9, v9 - - add-double v13, v13, v23 - - double-to-float v10, v13 - - invoke-direct {v2, v4, v11, v9, v10}, Landroid/graphics/RectF;->(FFFF)V - - iput-object v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->l:Landroid/graphics/RectF; - - .line 19 - :cond_3 - new-instance v2, Landroid/util/SparseArray; - - invoke-direct {v2}, Landroid/util/SparseArray;->()V - - const-string v4, "cities" - - .line 20 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v4 - - const/4 v9, 0x0 - - .line 21 - :goto_3 - invoke-virtual {v4}, Lorg/json/JSONArray;->length()I - - move-result v10 - - const-string v11, "title" - - if-ge v9, v10, :cond_4 - - .line 22 - invoke-virtual {v4, v9}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v10 - - .line 23 - invoke-virtual {v10, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v12 - - invoke-virtual {v10, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - invoke-virtual {v2, v12, v10}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V - - add-int/lit8 v9, v9, 0x1 - - goto :goto_3 - - .line 24 - :cond_4 - new-instance v4, Landroid/util/SparseArray; - - invoke-direct {v4}, Landroid/util/SparseArray;->()V - - const-string v9, "cities" - - .line 25 - invoke-virtual {v1, v9}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v9 - - const/4 v10, 0x0 - - .line 26 - :goto_4 - invoke-virtual {v9}, Lorg/json/JSONArray;->length()I - - move-result v12 - - if-ge v10, v12, :cond_5 - - .line 27 - invoke-virtual {v9, v10}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v12 - - .line 28 - invoke-virtual {v12, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v13 - - invoke-virtual {v12, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v12 - - invoke-virtual {v4, v13, v12}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V - - add-int/lit8 v10, v10, 0x1 - - goto :goto_4 - - :cond_5 - const-string v4, "can_write_private_message" - - .line 29 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_6 - - const/4 v4, 0x1 - - goto :goto_5 - - :cond_6 - const/4 v4, 0x0 - - :goto_5 - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->U:Z - - const-string v4, "can_post" - - .line 30 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_7 - - const/4 v4, 0x1 - - goto :goto_6 - - :cond_7 - const/4 v4, 0x0 - - :goto_6 - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->X:Z - - const-string v4, "can_suggest" - - .line 31 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_8 - - const/4 v4, 0x1 - - goto :goto_7 - - :cond_8 - const/4 v4, 0x0 - - :goto_7 - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->Y:Z - - const-string v4, "can_see_all_posts" - - .line 32 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_9 - - const/4 v4, 0x1 - - goto :goto_8 - - :cond_9 - const/4 v4, 0x0 - - :goto_8 - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->V:Z - - const-string v4, "can_see_archived_posts" - - .line 33 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_a - - const/4 v4, 0x1 - - goto :goto_9 - - :cond_a - const/4 v4, 0x0 - - :goto_9 - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->f0:Z - - const-string v4, "wall_default" - - .line 34 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - const-string v9, "all" - - invoke-virtual {v9, v4}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v4 - - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a0:Z - - const-string v4, "can_call" - - .line 35 - invoke-virtual {v1, v4, v7}, Lorg/json/JSONObject;->optBoolean(Ljava/lang/String;Z)Z - - move-result v4 - - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->W:Z - - const-string v4, "blacklisted_by_me" - - .line 36 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_b - - const/4 v4, 0x1 - - goto :goto_a - - :cond_b - const/4 v4, 0x0 - - :goto_a - iput-boolean v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->Z:Z - - const-string v4, "blacklisted" - - .line 37 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - if-ne v4, v8, :cond_c - - .line 38 - new-instance v4, Lcom/vtosters/lite/api/ExtendedUserProfile$c; - - invoke-direct {v4}, Lcom/vtosters/lite/api/ExtendedUserProfile$c;->()V - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->Y0:Lcom/vtosters/lite/api/ExtendedUserProfile$c; - - :cond_c - const-string v4, "relation" - - .line 39 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - iput v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->u:I - - const-string v4, "relation_partner" - - .line 40 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v9 - - if-eqz v9, :cond_d - - .line 41 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v9 - - invoke-virtual {v9, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v9 - - iput v9, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->v:I - - .line 42 - new-instance v9, Ljava/lang/StringBuilder; - - invoke-direct {v9}, Ljava/lang/StringBuilder;->()V - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v10 - - const-string v12, "first_name" - - invoke-virtual {v10, v12}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - const-string v10, " " - - invoke-virtual {v9, v10}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v4 - - const-string v10, "last_name" - - invoke-virtual {v4, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v9, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; - - invoke-virtual {v9}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->w:Ljava/lang/String; - - :cond_d - const-string v4, "bdate" - - .line 43 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - const/4 v9, 0x2 - - if-eqz v4, :cond_e - - const-string v4, "bdate" - - .line 44 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - .line 45 - iget-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iput-object v4, v10, Lcom/vk/dto/user/UserProfile;->I:Ljava/lang/String; - - const-string v10, "\\." - - .line 46 - invoke-virtual {v4, v10}, Ljava/lang/String;->split(Ljava/lang/String;)[Ljava/lang/String; - - move-result-object v4 - - .line 47 - aget-object v10, v4, v7 - - invoke-static {v10}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I - - move-result v10 - - iput v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->s:I - - .line 48 - aget-object v10, v4, v8 - - invoke-static {v10}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I - - move-result v10 - - iput v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->t:I - - .line 49 - array-length v10, v4 - - if-le v10, v9, :cond_e - - .line 50 - aget-object v4, v4, v9 - - invoke-static {v4}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I - - move-result v4 - - iput v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->r:I - - .line 51 - :cond_e - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->c:Ljava/lang/String; - - const-string v10, "first_name_dat" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->d:Ljava/lang/String; - - .line 52 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->c:Ljava/lang/String; - - const-string v10, "first_name_gen" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->b:Ljava/lang/String; - - .line 53 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->c:Ljava/lang/String; - - const-string v10, "first_name_ins" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->c:Ljava/lang/String; - - .line 54 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->c:Ljava/lang/String; - - const-string v10, "first_name_acc" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->h:Ljava/lang/String; - - .line 55 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->e:Ljava/lang/String; - - const-string v10, "last_name_dat" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->g:Ljava/lang/String; - - .line 56 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->e:Ljava/lang/String; - - const-string v10, "last_name_gen" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->e:Ljava/lang/String; - - .line 57 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->e:Ljava/lang/String; - - const-string v10, "last_name_ins" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->f:Ljava/lang/String; - - .line 58 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->e:Ljava/lang/String; - - const-string v10, "last_name_acc" - - invoke-virtual {v1, v10, v4}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->i:Ljava/lang/String; - - const-string v4, "city" - - .line 59 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v10 - - if-eqz v10, :cond_f - - const-string v10, "country" - - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v10 - - if-eqz v10, :cond_f - - .line 60 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v10 - - invoke-virtual {v10, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->i0:Ljava/lang/String; - - const-string v10, "country" - - .line 61 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v10 - - invoke-virtual {v10, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->j0:Ljava/lang/String; - - :cond_f - const-string v10, "mobile_phone" - - .line 62 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v11 - - if-eqz v11, :cond_10 - - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v11 - - invoke-virtual {v11}, Ljava/lang/String;->length()I - - move-result v11 - - if-lez v11, :cond_10 - - .line 63 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->l0:Ljava/lang/String; - - :cond_10 - const-string v10, "home_phone" - - .line 64 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v11 - - if-eqz v11, :cond_11 - - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v11 - - invoke-virtual {v11}, Ljava/lang/String;->length()I - - move-result v11 - - if-lez v11, :cond_11 - - .line 65 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->m0:Ljava/lang/String; - - :cond_11 - const-string v10, "skype" - - .line 66 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v10 - - if-eqz v10, :cond_12 - - const-string v10, "skype" - - .line 67 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->n0:Ljava/lang/String; - - :cond_12 - const-string v10, "twitter" - - .line 68 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v10 - - if-eqz v10, :cond_13 - - const-string v10, "twitter" - - .line 69 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->o0:Ljava/lang/String; - - :cond_13 - const-string v10, "livejournal" - - .line 70 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v10 - - if-eqz v10, :cond_14 - - const-string v10, "livejournal" - - .line 71 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->r0:Ljava/lang/String; - - :cond_14 - const-string v10, "facebook" - - .line 72 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v11 - - if-eqz v11, :cond_15 - - const-wide/16 v11, -0x1 - - invoke-virtual {v1, v10, v11, v12}, Lorg/json/JSONObject;->optLong(Ljava/lang/String;J)J - - move-result-wide v11 - - const-wide/16 v13, -0x1 - - cmp-long v15, v11, v13 - - if-eqz v15, :cond_15 - - .line 73 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getLong(Ljava/lang/String;)J - - move-result-wide v10 - - iput-wide v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->q0:J - - const-string v10, "facebook_name" - - .line 74 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->p0:Ljava/lang/String; - - :cond_15 - const-string v10, "instagram" - - .line 75 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v10 - - if-eqz v10, :cond_16 - - const-string v10, "instagram" - - .line 76 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v10 - - iput-object v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->u0:Ljava/lang/String; - - :cond_16 - const-string v10, "friend_status" - - .line 77 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v10 - - iput v10, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->R0:I - - const-string v10, "schools" - - .line 78 - invoke-virtual {v1, v10}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v10 - - .line 79 - new-instance v11, Ljava/util/ArrayList; - - invoke-direct {v11}, Ljava/util/ArrayList;->()V - - iput-object v11, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->v0:Ljava/util/ArrayList; - - const/4 v11, 0x0 - - if-eqz v10, :cond_17 - - const/4 v12, 0x0 - - .line 80 - :goto_b - invoke-virtual {v10}, Lorg/json/JSONArray;->length()I - - move-result v13 - - if-ge v12, v13, :cond_17 - - .line 81 - new-instance v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f; - - invoke-direct {v13}, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->()V - - .line 82 - invoke-virtual {v10, v12}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v14 - - .line 83 - invoke-virtual {v14, v4}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v15 - - invoke-virtual {v2, v15}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v15 - - check-cast v15, Ljava/lang/String; - - iput-object v15, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->c:Ljava/lang/String; - - const-string v15, "name" - - const-string v7, "???" - - .line 84 - invoke-virtual {v14, v15, v7}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->a:Ljava/lang/String; - - const-string v7, "year_from" - - .line 85 - invoke-virtual {v14, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->g:I - - const-string v7, "year_to" - - .line 86 - invoke-virtual {v14, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->f:I - - const-string v7, "year_graduated" - - .line 87 - invoke-virtual {v14, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->h:I - - const-string v7, "class" - - .line 88 - invoke-virtual {v14, v7, v11}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->b:Ljava/lang/String; - - const-string v7, "speciality" - - .line 89 - invoke-virtual {v14, v7, v11}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->d:Ljava/lang/String; - - .line 90 - sget-object v7, Lcom/vk/core/util/AppContextHolder;->a:Landroid/content/Context; - - invoke-virtual {v7}, Landroid/content/Context;->getResources()Landroid/content/res/Resources; - - move-result-object v7 - - const v15, 0x7f120bdd - - invoke-virtual {v7, v15}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String; - - move-result-object v7 - - const-string v15, "type_str" - - invoke-virtual {v14, v15, v7}, Lorg/json/JSONObject;->optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v13, Lcom/vtosters/lite/api/ExtendedUserProfile$f;->e:Ljava/lang/String; - - .line 91 - iget-object v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->v0:Ljava/util/ArrayList; - - invoke-virtual {v7, v13}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - - add-int/lit8 v12, v12, 0x1 - - const/4 v7, 0x0 - - goto :goto_b - - .line 92 - :cond_17 - new-instance v7, Ljava/util/ArrayList; - - invoke-direct {v7}, Ljava/util/ArrayList;->()V - - iput-object v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->w0:Ljava/util/ArrayList; - - const-string v7, "universities" - - .line 93 - invoke-virtual {v1, v7}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v7 - - if-eqz v7, :cond_1a - - const/4 v10, 0x0 - - .line 94 - :goto_c - invoke-virtual {v7}, Lorg/json/JSONArray;->length()I - - move-result v12 - - if-ge v10, v12, :cond_1a - - .line 95 - new-instance v12, Lcom/vtosters/lite/api/ExtendedUserProfile$g; - - invoke-direct {v12}, Lcom/vtosters/lite/api/ExtendedUserProfile$g;->()V - - .line 96 - invoke-virtual {v7, v10}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v13 - - .line 97 - invoke-virtual {v13, v4}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v14 - - invoke-virtual {v2, v14}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v14 - - check-cast v14, Ljava/lang/String; - - const-string v14, "name" - - .line 98 - invoke-virtual {v13, v14}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v14 - - invoke-virtual {v14}, Ljava/lang/String;->trim()Ljava/lang/String; - - move-result-object v14 - - iput-object v14, v12, Lcom/vtosters/lite/api/ExtendedUserProfile$g;->a:Ljava/lang/String; - - const-string v14, "faculty_name" - - .line 99 - invoke-virtual {v13, v14}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v14 - - if-eqz v14, :cond_18 - - const-string v14, "faculty_name" - - .line 100 - invoke-virtual {v13, v14}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v14 - - invoke-virtual {v14}, Ljava/lang/String;->trim()Ljava/lang/String; - - move-result-object v14 - - iput-object v14, v12, Lcom/vtosters/lite/api/ExtendedUserProfile$g;->b:Ljava/lang/String; - - :cond_18 - const-string v14, "chair_name" - - .line 101 - invoke-virtual {v13, v14}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v14 - - if-eqz v14, :cond_19 - - const-string v14, "chair_name" - - .line 102 - invoke-virtual {v13, v14}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v14 - - invoke-virtual {v14}, Ljava/lang/String;->trim()Ljava/lang/String; - - move-result-object v14 - - iput-object v14, v12, Lcom/vtosters/lite/api/ExtendedUserProfile$g;->c:Ljava/lang/String; - - :cond_19 - const-string v14, "graduation" - - .line 103 - invoke-virtual {v13, v14}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v13 - - iput v13, v12, Lcom/vtosters/lite/api/ExtendedUserProfile$g;->d:I - - .line 104 - iget-object v13, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->w0:Ljava/util/ArrayList; - - invoke-virtual {v13, v12}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - - add-int/lit8 v10, v10, 0x1 - - goto :goto_c - - :cond_1a - const-string v4, "interests" - - .line 105 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v7 - - if-eqz v7, :cond_1b - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - invoke-virtual {v7}, Ljava/lang/String;->length()I - - move-result v7 - - if-lez v7, :cond_1b - - .line 106 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->y0:Ljava/lang/String; - - :cond_1b - const-string v4, "movies" - - .line 107 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_1c - - const-string v4, "movies" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_1c - - const-string v4, "movies" - - .line 108 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->A0:Ljava/lang/String; - - :cond_1c - const-string v4, "music" - - .line 109 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_1d - - const-string v4, "music" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_1d - - const-string v4, "music" - - .line 110 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->z0:Ljava/lang/String; - - :cond_1d - const-string v4, "tv" - - .line 111 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_1e - - const-string v4, "tv" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_1e - - const-string v4, "tv" - - .line 112 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->B0:Ljava/lang/String; - - :cond_1e - const-string v4, "books" - - .line 113 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_1f - - const-string v4, "books" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_1f - - const-string v4, "books" - - .line 114 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->C0:Ljava/lang/String; - - :cond_1f - const-string v4, "games" - - .line 115 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_20 - - const-string v4, "games" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_20 - - const-string v4, "games" - - .line 116 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->D0:Ljava/lang/String; - - :cond_20 - const-string v4, "about" - - .line 117 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_21 - - const-string v4, "about" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_21 - - const-string v4, "about" - - .line 118 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->F0:Ljava/lang/String; - - :cond_21 - const-string v4, "quotes" - - .line 119 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_22 - - const-string v4, "quotes" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_22 - - const-string v4, "quotes" - - .line 120 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->E0:Ljava/lang/String; - - :cond_22 - const-string v4, "activities" - - .line 121 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_23 - - const-string v4, "activities" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_23 - - const-string v4, "activities" - - .line 122 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->x0:Ljava/lang/String; - - :cond_23 - const-string v4, "home_town" - - .line 123 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_24 - - const-string v4, "home_town" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_24 - - const-string v4, "home_town" - - .line 124 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->g0:Ljava/lang/String; - - :cond_24 - const-string v4, "site" - - .line 125 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v4 - - if-eqz v4, :cond_25 - - const-string v4, "site" - - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - invoke-virtual {v4}, Ljava/lang/String;->length()I - - move-result v4 - - if-lez v4, :cond_25 - - const-string v4, "site" - - .line 126 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v4 - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->M:Ljava/lang/String; - - .line 127 - :cond_25 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->a:Lcom/vk/dto/user/UserProfile; - - iget-object v4, v4, Lcom/vk/dto/user/UserProfile;->Q:Lcom/vk/dto/common/VerifyInfo; - - invoke-virtual {v4, v1}, Lcom/vk/dto/common/VerifyInfo;->b(Lorg/json/JSONObject;)Lcom/vk/dto/common/VerifyInfo; - - const-string v4, "personal" - - .line 128 - invoke-virtual {v1, v4}, Lorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v4 - - if-eqz v4, :cond_28 - - const-string v7, "langs" - - .line 129 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v7 - - if-eqz v7, :cond_27 - - .line 130 - new-instance v10, Ljava/util/ArrayList; - - invoke-direct {v10}, Ljava/util/ArrayList;->()V - - const/4 v12, 0x0 - - .line 131 - :goto_d - invoke-virtual {v7}, Lorg/json/JSONArray;->length()I - - move-result v13 - - if-ge v12, v13, :cond_26 - - .line 132 - invoke-virtual {v7, v12}, Lorg/json/JSONArray;->getString(I)Ljava/lang/String; - - move-result-object v13 - - invoke-virtual {v10, v13}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - - add-int/lit8 v12, v12, 0x1 - - goto :goto_d - - :cond_26 - const-string v7, ", " - - .line 133 - invoke-static {v7, v10}, Landroid/text/TextUtils;->join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->G0:Ljava/lang/String; - - :cond_27 - const-string v7, "political" - - .line 134 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->J0:I - - const-string v7, "religion" - - .line 135 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->H0:Ljava/lang/String; - - const-string v7, "life_main" - - .line 136 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->K0:I - - const-string v7, "people_main" - - .line 137 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->L0:I - - const-string v7, "inspired_by" - - .line 138 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v7 - - iput-object v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->I0:Ljava/lang/String; - - const-string v7, "smoking" - - .line 139 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v7 - - iput v7, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->M0:I - - const-string v7, "alcohol" - - .line 140 - invoke-virtual {v4, v7}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v4 - - iput v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->N0:I - - .line 141 - :cond_28 - new-instance v4, Landroid/util/SparseArray; - - invoke-direct {v4}, Landroid/util/SparseArray;->()V - - const-string v7, "relatives_profiles" - - .line 142 - invoke-virtual {v1, v7}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v7 - - if-eqz v7, :cond_29 - - const/4 v10, 0x0 - - .line 143 - :goto_e - invoke-virtual {v7}, Lorg/json/JSONArray;->length()I - - move-result v12 - - if-ge v10, v12, :cond_29 - - .line 144 - invoke-virtual {v7, v10}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v12 - - .line 145 - new-instance v13, Lcom/vk/dto/user/UserProfile; - - invoke-direct {v13, v12}, Lcom/vk/dto/user/UserProfile;->(Lorg/json/JSONObject;)V - - .line 146 - iget v12, v13, Lcom/vk/dto/user/UserProfile;->b:I - - invoke-virtual {v4, v12, v13}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V - - add-int/lit8 v10, v10, 0x1 - - goto :goto_e - - :cond_29 - const-string v7, "relatives" - - .line 147 - invoke-virtual {v1, v7}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v7 - - if-eqz v7, :cond_32 - - move-object v12, v11 - - move-object v13, v12 - - move-object v14, v13 - - move-object v15, v14 - - const/4 v10, 0x0 - - .line 148 - :goto_f - invoke-virtual {v7}, Lorg/json/JSONArray;->length()I - - move-result v6 - - if-ge v10, v6, :cond_31 - - .line 149 - invoke-virtual {v7, v10}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v6 - - .line 150 - invoke-virtual {v6, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v9 - - .line 151 - invoke-static {v4, v9}, Lcom/vk/api/base/utils/ApiUtils;->a(Landroid/util/SparseArray;I)Z - - move-result v19 - - if-nez v19, :cond_2a - - goto/16 :goto_12 - - :cond_2a - const-string v8, "type" - - .line 152 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v6 - - invoke-static {v6}, Ljava/lang/String;->valueOf(Ljava/lang/Object;)Ljava/lang/String; - - move-result-object v6 - - invoke-virtual {v6}, Ljava/lang/String;->hashCode()I - - move-result v20 - - sparse-switch v20, :sswitch_data_0 - - goto :goto_10 - - :sswitch_0 - const-string v8, "sibling" - - invoke-virtual {v6, v8}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v6 - - if-eqz v6, :cond_2b - - const/4 v6, 0x3 - - goto :goto_11 - - :sswitch_1 - const-string v8, "grandchild" - - invoke-virtual {v6, v8}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v6 - - if-eqz v6, :cond_2b - - const/4 v6, 0x0 - - goto :goto_11 - - :sswitch_2 - const-string v8, "child" - - invoke-virtual {v6, v8}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v6 - - if-eqz v6, :cond_2b - - const/4 v6, 0x2 - - goto :goto_11 - - :sswitch_3 - const-string v8, "grandparent" - - invoke-virtual {v6, v8}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v6 - - if-eqz v6, :cond_2b - - const/4 v6, 0x1 - - goto :goto_11 - - :sswitch_4 - const-string v8, "parent" - - invoke-virtual {v6, v8}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z - - move-result v6 - - if-eqz v6, :cond_2b - - const/4 v6, 0x4 - - goto :goto_11 - - :cond_2b - :goto_10 - const/4 v6, -0x1 - - :goto_11 - if-eqz v6, :cond_30 - - const/4 v8, 0x1 - - if-eq v6, v8, :cond_2f - - const/4 v8, 0x2 - - if-eq v6, v8, :cond_2e - - const/4 v8, 0x3 - - if-eq v6, v8, :cond_2d - - const/4 v8, 0x4 - - if-eq v6, v8, :cond_2c - - goto :goto_12 - - .line 153 - :cond_2c - invoke-virtual {v4, v9}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v6 - - invoke-static {v11, v6}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; - - move-result-object v6 - - move-object v11, v6 - - goto :goto_12 - - .line 154 - :cond_2d - invoke-virtual {v4, v9}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v6 - - invoke-static {v12, v6}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; - - move-result-object v6 - - move-object v12, v6 - - goto :goto_12 - - .line 155 - :cond_2e - invoke-virtual {v4, v9}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v6 - - invoke-static {v13, v6}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; - - move-result-object v6 - - move-object v13, v6 - - goto :goto_12 - - .line 156 - :cond_2f - invoke-virtual {v4, v9}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v6 - - invoke-static {v14, v6}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; - - move-result-object v6 - - move-object v14, v6 - - goto :goto_12 - - .line 157 - :cond_30 - invoke-virtual {v4, v9}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v6 - - invoke-static {v15, v6}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; - - move-result-object v6 - - move-object v15, v6 - - :goto_12 - add-int/lit8 v10, v10, 0x1 - - const/4 v8, 0x1 - - const/4 v9, 0x2 - - goto/16 :goto_f - - .line 158 - :cond_31 - sget-object v3, Lcom/vk/dto/user/UserProfile;->CREATOR:Lcom/vk/core/serialize/Serializer$c; - - invoke-static {v11, v3}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Landroid/os/Parcelable$Creator;)[Ljava/lang/Object; - - move-result-object v3 - - check-cast v3, [Lcom/vk/dto/user/UserProfile; - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->A:[Lcom/vk/dto/user/UserProfile; - - .line 159 - sget-object v3, Lcom/vk/dto/user/UserProfile;->CREATOR:Lcom/vk/core/serialize/Serializer$c; - - invoke-static {v12, v3}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Landroid/os/Parcelable$Creator;)[Ljava/lang/Object; - - move-result-object v3 - - check-cast v3, [Lcom/vk/dto/user/UserProfile; - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->B:[Lcom/vk/dto/user/UserProfile; - - .line 160 - sget-object v3, Lcom/vk/dto/user/UserProfile;->CREATOR:Lcom/vk/core/serialize/Serializer$c; - - invoke-static {v13, v3}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Landroid/os/Parcelable$Creator;)[Ljava/lang/Object; - - move-result-object v3 - - check-cast v3, [Lcom/vk/dto/user/UserProfile; - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->C:[Lcom/vk/dto/user/UserProfile; - - .line 161 - sget-object v3, Lcom/vk/dto/user/UserProfile;->CREATOR:Lcom/vk/core/serialize/Serializer$c; - - invoke-static {v14, v3}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Landroid/os/Parcelable$Creator;)[Ljava/lang/Object; - - move-result-object v3 - - check-cast v3, [Lcom/vk/dto/user/UserProfile; - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->D:[Lcom/vk/dto/user/UserProfile; - - .line 162 - sget-object v3, Lcom/vk/dto/user/UserProfile;->CREATOR:Lcom/vk/core/serialize/Serializer$c; - - invoke-static {v15, v3}, Lcom/vtosters/lite/utils/Utils;->a(Ljava/util/ArrayList;Landroid/os/Parcelable$Creator;)[Ljava/lang/Object; - - move-result-object v3 - - check-cast v3, [Lcom/vk/dto/user/UserProfile; - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->E:[Lcom/vk/dto/user/UserProfile; - - :cond_32 - const-string v3, "owner_state" - - .line 163 - invoke-virtual {v1, v3}, Lorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v3 - - if-eqz v3, :cond_33 - - .line 164 - sget-object v4, Lcom/vk/dto/user/deactivation/UserDeactivation;->CREATOR:Lcom/vk/dto/user/deactivation/UserDeactivation$a; - - invoke-virtual {v4, v3}, Lcom/vk/dto/user/deactivation/UserDeactivation$a;->a(Lorg/json/JSONObject;)Lcom/vk/dto/user/deactivation/UserDeactivation; - - move-result-object v3 - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->q:Lcom/vk/dto/user/deactivation/Deactivation; - - :cond_33 - const-string v3, "gifts" - - .line 165 - invoke-virtual {v1, v3}, Lorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v3 - - if-eqz v3, :cond_34 - - .line 166 - new-instance v4, Lcom/vk/dto/common/data/VKList; - - sget-object v6, Lcom/vk/dto/gift/GiftItem;->C:Lcom/vk/dto/common/data/JsonParser; - - invoke-direct {v4, v3, v6}, Lcom/vk/dto/common/data/VKList;->(Lorg/json/JSONObject;Lcom/vk/dto/common/data/JsonParser;)V - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->y1:Lcom/vk/dto/common/data/VKList; - - :cond_34 - const-string v3, "friends" - - .line 167 - invoke-virtual {v1, v3}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v3 - - if-eqz v3, :cond_35 - - .line 168 - new-instance v4, Ljava/util/ArrayList; - - invoke-direct {v4}, Ljava/util/ArrayList;->()V - - iput-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->H:Ljava/util/ArrayList; - - const/4 v4, 0x0 - - .line 169 - :goto_13 - invoke-virtual {v3}, Lorg/json/JSONArray;->length()I - - move-result v6 - - if-ge v4, v6, :cond_35 - - .line 170 - iget-object v6, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->H:Ljava/util/ArrayList; - - new-instance v7, Lcom/vk/dto/user/UserProfile; - - invoke-virtual {v3, v4}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v8 - - invoke-direct {v7, v8}, Lcom/vk/dto/user/UserProfile;->(Lorg/json/JSONObject;)V - - invoke-virtual {v6, v7}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - - add-int/lit8 v4, v4, 0x1 - - goto :goto_13 - - :cond_35 - const-string v3, "career" - - .line 171 - invoke-virtual {v1, v3}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v3 - - if-eqz v3, :cond_38 - - .line 172 - new-instance v3, Ljava/util/ArrayList; - - invoke-direct {v3}, Ljava/util/ArrayList;->()V - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->I:Ljava/util/ArrayList; - - const-string v3, "career" - - .line 173 - invoke-virtual {v1, v3}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v3 - - const/4 v4, 0x0 - - .line 174 - :goto_14 - invoke-virtual {v3}, Lorg/json/JSONArray;->length()I - - move-result v6 - - if-ge v4, v6, :cond_38 - - .line 175 - invoke-virtual {v3, v4}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; - - move-result-object v6 - - .line 176 - new-instance v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e; - - invoke-direct {v7}, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->()V - - const-string v8, "group" - - .line 177 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v8 - - if-eqz v8, :cond_36 - - .line 178 - new-instance v8, Lcom/vk/dto/group/Group; - - const-string v9, "group" - - invoke-virtual {v6, v9}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v9 - - invoke-direct {v8, v9}, Lcom/vk/dto/group/Group;->(Lorg/json/JSONObject;)V - - iput-object v8, v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->a:Lcom/vk/dto/group/Group; - - goto :goto_15 - - :cond_36 - const-string v8, "company" - - .line 179 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v8 - - iput-object v8, v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->c:Ljava/lang/String; - - :goto_15 - const-string v8, "from" - - .line 180 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v8 - - iput v8, v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->e:I - - const-string v8, "until" - - .line 181 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I - - move-result v8 - - iput v8, v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->f:I - - const-string v8, "position" - - .line 182 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->optString(Ljava/lang/String;)Ljava/lang/String; - - move-result-object v8 - - iput-object v8, v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->d:Ljava/lang/String; - - const-string v8, "city_id" - - .line 183 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v8 - - if-eqz v8, :cond_37 - - const-string v8, "city_id" - - .line 184 - invoke-virtual {v6, v8}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I - - move-result v6 - - invoke-virtual {v2, v6}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object; - - move-result-object v6 - - check-cast v6, Ljava/lang/String; - - iput-object v6, v7, Lcom/vtosters/lite/api/ExtendedUserProfile$e;->b:Ljava/lang/String; - - .line 185 - :cond_37 - iget-object v6, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->I:Ljava/util/ArrayList; - - invoke-virtual {v6, v7}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - - add-int/lit8 v4, v4, 0x1 - - goto :goto_14 - - :cond_38 - const-string v2, "display_fields" - - .line 186 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->has(Ljava/lang/String;)Z - - move-result v2 - - if-eqz v2, :cond_39 - - const-string v2, "display_fields" - - .line 187 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; - - move-result-object v2 - - .line 188 - new-instance v3, Ljava/util/ArrayList; - - invoke-direct {v3}, Ljava/util/ArrayList;->()V - - iput-object v3, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->j1:Ljava/util/ArrayList; - - const/4 v3, 0x0 - - .line 189 - :goto_16 - invoke-virtual {v2}, Lorg/json/JSONArray;->length()I - - move-result v4 - - if-ge v3, v4, :cond_39 - - .line 190 - iget-object v4, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->j1:Ljava/util/ArrayList; - - invoke-virtual {v2, v3}, Lorg/json/JSONArray;->getString(I)Ljava/lang/String; - - move-result-object v6 - - invoke-virtual {v4, v6}, Ljava/util/ArrayList;->add(Ljava/lang/Object;)Z - - add-int/lit8 v3, v3, 0x1 - - goto :goto_16 - - :cond_39 - const-string v2, "all_photos_are_hidden" - - .line 191 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->getBoolean(Ljava/lang/String;)Z - - move-result v2 - - iput-boolean v2, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->u1:Z - - const-string v2, "friends_recommendations" - - .line 192 - invoke-virtual {v1, v2}, Lorg/json/JSONObject;->optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; - - move-result-object v1 - - if-eqz v1, :cond_3a - - .line 193 - invoke-static {v1}, Lcom/vk/dto/newsfeed/entries/ProfilesRecommendations;->b(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/entries/ProfilesRecommendations; - - move-result-object v1 - - iput-object v1, v0, Lcom/vtosters/lite/api/ExtendedUserProfile;->J:Lcom/vk/dto/newsfeed/entries/ProfilesRecommendations; - - :cond_3a - return-void - - :sswitch_data_0 - .sparse-switch - -0x3b54f756 -> :sswitch_4 - -0xffe2f4a -> :sswitch_3 - 0x5a3f51c -> :sswitch_2 - 0x178dfb90 -> :sswitch_1 - 0x7c3126c2 -> :sswitch_0 - .end sparse-switch -.end method - -.method protected o()Lcom/vtosters/lite/api/ExtendedUserProfile; - .locals 1 - - .line 1 - new-instance v0, Lcom/vtosters/lite/api/ExtendedUserProfile; - - invoke-direct {v0}, Lcom/vtosters/lite/api/ExtendedUserProfile;->()V - - return-object v0 -.end method From 3068ff76c175e182b409128e77842566aa0ac2c5 Mon Sep 17 00:00:00 2001 From: Denis <77270222+ayonovdenizs@users.noreply.github.com> Date: Sun, 31 Dec 2023 16:04:55 +0600 Subject: [PATCH 029/113] Fix crash (#1542) --- smali/assets/fonts/TT_Barrels_Light_Italic.ttf | Bin 0 -> 111596 bytes smali/assets/fonts/TT_Barrels_Regular.ttf | Bin 0 -> 111292 bytes smali/assets/fonts/TT_Commons_Bold_Italic.ttf | Bin 0 -> 119632 bytes smali/assets/fonts/TT_Commons_Medium.ttf | Bin 0 -> 117196 bytes smali/assets/fonts/TT_Lovelies_Script.ttf | Bin 0 -> 485872 bytes smali/assets/fonts/TT_Slabs_Regular.ttf | Bin 0 -> 108316 bytes smali/assets/fonts/TT_Travels_Next_Bold.ttf | Bin 0 -> 86976 bytes smali/assets/fonts/Times New Roman.ttf | Bin 0 -> 330412 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 smali/assets/fonts/TT_Barrels_Light_Italic.ttf create mode 100644 smali/assets/fonts/TT_Barrels_Regular.ttf create mode 100644 smali/assets/fonts/TT_Commons_Bold_Italic.ttf create mode 100644 smali/assets/fonts/TT_Commons_Medium.ttf create mode 100644 smali/assets/fonts/TT_Lovelies_Script.ttf create mode 100644 smali/assets/fonts/TT_Slabs_Regular.ttf create mode 100644 smali/assets/fonts/TT_Travels_Next_Bold.ttf create mode 100644 smali/assets/fonts/Times New Roman.ttf diff --git a/smali/assets/fonts/TT_Barrels_Light_Italic.ttf b/smali/assets/fonts/TT_Barrels_Light_Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5731e92f03a3a8840a8efa7bab0ec9d273dcdf59 GIT binary patch literal 111596 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 literal 0 HcmV?d00001 diff --git a/smali/assets/fonts/TT_Barrels_Regular.ttf b/smali/assets/fonts/TT_Barrels_Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f4aaa13db0a39de834bf4f15351264451b8c8e67 GIT binary patch literal 111292 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η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 literal 0 HcmV?d00001 diff --git a/smali/assets/fonts/TT_Commons_Medium.ttf b/smali/assets/fonts/TT_Commons_Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bb15a5b464132257dd685cb16529b0bcb3fb4ade GIT binary patch literal 117196 zcmbTf4|H3{btnAh0R%{b011Ks2oMB800c;oAV@(VND%}n5|l`a6eLTOCD4)~+k_pF ziNoXAN{;2mRg;)$s$^X?+bDI^*40TOH>uinbdo6Btm<`j)F|t$){WI9O4h5hP1Po9 z>Q7%bu|Em?es|_Q;PH>_bSaSl2J`06ojdpc+>w|hNfzl@NhjsE@5=6Z+A`TCvB!T; zl6L&T_C2$s6}B(_xx~KZL#3}|_rx~Y{{BOoCHC+lp33jb%F0qmO9-BY>NYnG5 z2uf`F1(fwYhJwn?)yL4@1U?5Jd;f<%{1-1@pTPHjFG-FMEk6G6;nByR|AoZ1<|WCL zdjH`Mf3V_Z=ECO@)c1Yh@cZWnchCH@#1{WSlH}tbeEf+It$ah;g#I6(?ki>61mphZo$(OHQy-IaV`12>I(QW7=zZ`>G9;@249zky`H7-0Bw z>eJR`&$4y7J==Z;zbCBEd7iUA*PadkS$mdsHoxS#l0BLIE`IQG<;oT2K6z4-nAE=V zdD*7xmXeYb@75*a4UYJxzQpEkePVN3PA1}Zug)IW918d?vc18pw>Ma1qdjmdGP&8i zFgiXt-oN+Zz5U+J+uHM?(O%EOc)vI1ukYXc5DF8Mk-Xg6KNCxBO?8H&EuPqpbZ~UD zUtd@>1pBr}`ZLz%pslT=xw&WO*5DX@fn}HcnDu8lWSml`G%W4GFyk!H>hG3mOz}-# zjKm^`H>L5pTUJIUv-kL3Ht#ADU>KE#( z@&zjJit^>V{o3cLTH4}lv07W47WI`q@}5<&^3j!dGpffZo9=38wmzSVjh}a z_;_Y%>CcYm8a%G4XmhW%q4tEUzRsQ4uCJ{%Mg9J$$zqoM26`mA-PP=Dt!)W(xcupE zkEc8BZ|Vwo%&o^4&Yj6M+3US?c5|)mM4inV_4qfjC-rrXrdn@Tm)F|tu*iO36|h@6 z!Pk)EHt-rqjq?7LAoIyTkQ|t8DBR7&be+m%oDQe)S~TG8?ezwtlOeCWqr>eDOPiN>&i0KCeExyCKN=Y8i*K21nZEyUB60Zs9W9evc&qGF><~t8!Ol#E zlg@D5m~`j^P-DDsU z#|FZ_wg;}BJD11*+qv`SbLV-zmCs72rK6Hf8F^AeJTUCIsk+iy;SCW1@mL#NvsE?K z%{C$;;pWakn*-#A`nt`Iuo+;IWNWpz`q@PB8*C;=-+(Sr>!2W7s+3nKQi&Q-E7D4W zeL}1i?K2k27k`+SFW-4TC{Q~v^q~A2Mj6J|e2*Q*Mh709iAHB09T<3YXEeI=(E;CZ zZ%a$>uupk4^gQs~{r5ljK#%&G_m4e1I{NUa-;Y0|507E%V@>hLj`0{UD`Pkrw+7DU zH+^ktQBI_1kKOG@jds-d6-MO)Rb5?^LC4-g6&37RT}W$wgmIv_8~4gT&X@8*!h5!&qa_te#!=c4TC;{U2Q*VlHqd-sim zLSu8KIXK!AK3`wh(NtI8$i7fGTU}LI6WV$p9^XG2!svmSd>ljKb4WZHfabMci+{C(WF~(%I>%2NHN4U@D zOSC%_Jo>4?G}fAEwFCK&6u-^BUHsva{7_-)?s4oa8ZTi%Sc*&AwIdefOXWw})dz)E zX|lt%mP^@_x#2*-?(z}!^=;W1>&|ZR5v&wkND{h?OiYY8!_9Sd&0(jronG4w{(Vds|aoT~nLg7I4=Q z<`8GKVJ;l@ZA5eftF|;vLKj#!{0fG;{Rl=*T$|De*YvW2Elik z{fK>2$aG0;Co8AQ-z;ut_`R8Dy?NS+nwFw0QDLu$GGFmcwDxe}{YCl ziS~&WKH<%2$Y#Xyn^{03CFt?-mNJ)_##tlg_hlb7^gr~m>FJL>)Zacf7xyJQ8r!!Y9vFCNdwXL?zb`&F)(+Sa6n+a(s38f> zrZSdJmMqQOI{Sv&+Z%7Foh-mGwAU+|wmMg-7?rJn^to1(c^}BsgDuK4Y)5kkG?t_k=RL zxV6;^(FcD6vkPouVWId947m9Btm|$+XX&E8bP@GQ{zKi_1=N6mgl|kML_IEZ>5@pi zqSm2BNGCUYcMtj&)A4wE!MA0%!Ph_26;G$*>~2xlHPa8FN{r+no(IOGWfrdjYvcpb z9|tZbk8|ij*qkW7C;+cKLlQ;>e+FxVaqlUPVo0aCJcYH>8Ss4#ecuGBC1BMBbZ9kK zT*)nbH*OQx~ofsx7 zVL3LnzI)G5FgUcQ`_ux{J3Cu#w$@JPDfu!L#qJvl7Voel4XshPtGl(~*J3U|;d5ys z-TWTh+G%VP>R?h)f6Dr>9J4n$$0F+HqA4~*S{9Ssk$1I6?Qw2q|A4QpIh#3FZ8TPAGE+9UBi*sl?1|3VNE%nD99O(-0bO7X2;9+~Tl~9 zj-ENTz})t*x4zyRCQ|0#vNPJUslCPIwiJIzM3g;SB4xlXT3M1^dKLP$+EBqM%NjEU za}VUwtqWrr#Yo{FzCRJ4P5ZSrionQ0gKuzmFDw+1aMVW@iqQ7{R)1=Dx5he=-5Q!m zLiT2o6$=x=Y{_N=T42WvZ(fsK*A^fz7Ve%#jY*7?b`Izr=bE(Tyx@W0iDLJ$JwziH z8zWo%{w{&y4*Q|M63A+&KEu*`v@f4*@sze5cnI-%_3;jHf-Ri`(!I+xXUvr89;zOE(sooxKbx zdbBuG{27f+NS(ZPQi$1HDmqa7PoUagg2Y`rDZ3zT-xO2=+GrAOD^@X5ZDwyAKYl~L zJa^ZhqxLlVsukQg4~3O$t7HvGNNlRZ*=VPTFxE00K*@GPgc&H#k%jC^^S zb}Do$_C4tQttD9vYJrf^O8TL~Hb}7lN_>TSE}xVZ2*qB{Nt}HP$$QL?k0Lo*x*< zkB9P&U8!I&)zzrJ5|pq{*&V>5ZJnF}Wuq(*l9=I+@2Af8$D=z2!<7r>Ej>-~aARXQ z-qf?jyige)++k3=A_HS*LhYw7(!Oo8mu5^xAZ?7!Pp9WKDHB=hFI2ugWhALlwMj*lk+a}pjp zK^vPnRRZRbR!T6ilak6c1#Ba*&2*Z`j=7<-%3!FdFc|{TrKNfHLf+p#8g=Pqoi0Zz za~E*C_y~vY2quOZN+~h3aNG;)K;IDCNc1PsLZ@&%b*Y&JseSRLO?=foV)Zv)baf5*+>!DAO&r;v!6eY35|}_dScCBpGE^I}H85GIv)6C-lXP7G_ic1V{S6?a9H}7*^@8t& zi2XLScDsr{B>aLfC7tJc9tJm(v9y|GW_~_SMtvw}yA8IA-W(6(f1w2Bom`lIt$qA8`>3l&%r(yF6=*?9Nuj*;$0ouS+dpEY|6;}dck zjKrX6cFgnK(MvauU81?|zkaLu*6rH@LK66_DlJYHh=XuxF@vf866?H)=EwyJfj%X= zu?mVBfM&3F>g&3_!2~u^t<$z8M0#66)jQ_vn*2~en(F4+9ln^Z+IqXazSh;;H`81E z9_w{QymfWnh->wGjFm=2n8#OB84-+ZtHwc{gHnbfQ(`%tZY-zT(+10_QVaPvlnzT| zLZOLqi0(w46g-8gNuh)4>xR@Jv$6vcgDfai3A)0CA=GI5I*W@sGcuWx9R+mCZkfNe zhC(SYReL82eUsIyG*W#fEN;gb%<34{NRmQrw+7bj+%IFh_61cEt!&r%>wBoyipB|YPY1H1k0 zZEiqG5A!ee*Pt|~`DJX}0+V&O^- zr0aS1IM=RGNB#-wtdk-OOH1$`&7XyaIg9!)LL#JJJ*nJi8$Ymnku6WMh2!L_;-b~L zGfVh6^OsA{99v@gU!Ohu>*AdY7icUi+xS=-#L9s*Zt5FmLjJVqjvGxC6^71erS%ex z@C|EgsQUsf{cO-3XFsFS-n|jo60Ac@V(}9>Hk!{B zzn!P~$01ivfck|9u0sq4G<1sBzCmW^9I|AhWtPIRe)-X(D~F1{l~UJi|jto4aN2%t+I48t=Tb zGuQ2IyU#nb8!xTinfq2&Xl3a~HW1eUCCOrDSFq=F>usE?%szFjPWU(HBC^g~IQ2L6P(?j0gktP5R;p)*I`mUv4 z1-xBC6H*zYpcj!#j0_>bt9<@!@kQM;#TQX0y7FQ6bIfy$ED}UJR*^)q!D?L=tEi*a zd!bVtYFu_EuQIERjBjd|^A)|3SXXS@o^3IIL!-CeQe$(+wuaibb~nj+J*a3Tn%R|! zl6TDpms?ZsxQon}L%W(C4K0?|zGZiJI_QrE-L6)Tw>z^rG|=FvtFE(jw0Qd??#9k7 ze)4uU`I}q1$2W%{nb*J&9BuX{BW^ZiG@IHyp`?qy+I${2=IfWIxtErE5VX=%Tx0E5 zJqTY^@UkqVm2gw|;r|7YBdgJjLU&89#PyK|NwTP|!k|^?%RV*n(R?zQ|LDZTv-JAx zMDpROuCA$vlgWqZ^`W8QXs_4XI~w#4M4I&3%4oft~_Z(qy;(JdOhAyeQS4s;?1A75!;AtL#9#lh!m(q8S^l?p zUi@&HbqO&sRA1s|f&lx&;yyO-?J ze)%9v$zSA>IJbqs+9iK+lCRp!_(ri`+BA5!QN+tR#pmf&U(JoSni^Z9S$SnI!y$?< z$?rz5AxEaB!Cgz9l$wU7+FEx57(MY&Cn6RSMA4J+1W`vJ#}Fqy$HNxR6-SSrqsWDG zd8*IeWO`kkXqrugTm<}ryHMa$Ezwf{F|)nVPDbT;+FhB4^~QGG++?*n@Od!e4OSM? zyk|%awP*=ecfwHBq_@h!uJSFdgWYhde>mObb>YYFu{So_?TzS)9Hu5iB?2WXYlqp7 z(s4(#$7=Nq*v(c)qdmsGAq}p|>I$Q&+G~#t@)5`yn~pJ1$mfMkhvcvwTn;0hdX))J zY#CK_&#aQd>g!_7-tM~kTBso#$YESW2Lz+wg`~BCJCxQKc7FPIO^vu=?pz_qo@|N@ z`Kjp6|Bzq58^tb2vo`4hdlB|AtK?ywv>q#4q>I=Q;619IDPp+DM+gH1#4(CWFw8p5 zl}4ixWZUI(8>{qsePGDx4Q;*z@iPwb+HN-6$rv#ktq6Plh{7Yhkj@}B%z$xdoSD<2}Ba@H8t_^-he;sA%`CK+0Ld~3MxNEf85 zlDu*mHfadHpeu-RqF@~LUxFeQp>eWD*jvR5EK+=f?JkZM^T*f^4Hp&f-PyCO7T%+; z0t?$$ws6noI8k_EM_G;ELYySw7DA0qH9e_Dw_3)rpB-3-{{GYl_Qv1c&6(J7C}G`T zk7Nyl`HxQB%lX;6KNFF|d=~+3+-J$x1(GOVmopsxYs;UK-qw`Uy72l~mlJ$lM15Kp z(asU+IEO!Wr*x6G534V=zw*D;c0gSTA4K_6u#o{DR(^@qXwp&pyqxV{d7au{`31^5 zb=1D7e`Mvq@%Cx={0Ygl(*J<%UCieRUJuwV8QCG}46nz1Z@fR)k@!5X@o}sze~KkF zb)mn@Bsl~S(=$d`#VzGwjeN|lBF<7gSD2eMsTLz6o=uolN$R7D?AiG4 z=2rLASe6`Ugi!RkX)==~115bYe;-nGUS z_l_806iFG{&)n(Q)MIU^FTPAtH~T&*qU3?}pwJ4)aGw*0JlQL0=bz^gUR(YYtJahg zxU+@*r=YsGm`KO1dFk1KlHxB;RZuw>(2?;4u#5`?Lo% zu?@2eS5@EV)diL!6E>MHuF98>22#7C(Os#)sUnroH~)$iC0ni+>yrfEDaqkl9fd2( zBFY4B#p3XN4;wGVNkyjzd<``gE5%g#l2eg^0ehRLuFlhDA83S>km{juk%BBEV8Tx! z6h3hHx;nQb(@Tbxe4VG=N%iLGiCD@C2j$%&;4J(+uLC}?Pl79sEtuAo5_B%X!m+M4 z+n=Mg5^cPuw!sc%4W-h{YN>Q2OFK=}eMc!ZvIjs3Ou%21>)OF@#t@wYg9DEa(n$9d zkw|!1GT#c#w(N%}hwl(#tD=7!nakk1y?N;18n;yYfX!jCx$HwB3IZb;q4*`x+Nit1 z-_&4OFozPENXM|lUEk2;98Z)yS8`3|_PDdt?~vic;;t*zheasfSdSPMSWpcXtSp(V zRJR802MUhk-mN;4RPBK`;u$j73vR&uOT+h)c2;o%J|l$%BeVrPg)@U9@d87o*+wFy zu^OU~KeBT$a8F;9^|5Jdb9kMkl+{PZ9!QcaY^{H4`cZR<{uAAjWx|>Xfi+8n9ji+T zYp!yvSzT^m`}2e~qLlDMv~gq>_<ZbnYUaFV|!i5L>SRpVX-oh-*7Fdw;Y z$kP=`A!gawiU5T9?p+OGtF7MS@iZo#`DixW;*L^~&l>5_K+&BPYzU`;BeLD?1yS5& zuCFlYvsI?*CM)6`+mk(?n#&y75zcdg5g|y89Z4=g((VBq0C$?(Zh{UwRG?CVq?yCv zJ^{1RYLrW9HLjOdqg;;FD5$FeuOnLKZLmYM8cNHhQt1e`rVhNioqb<+Vc*u0O*g5r zP3RyIX+IYgvG3p5SBrbzP(HM)5*};IouvaL6a$WS5#huA3jY^8j4#((9_9`XHn{5h z2h!C>Lp5!L;GmsJ@gb;A6bbKedcbP0@AcAl;Lf^q zKR$12#%HWg*HF;xtTt6&fn~pnbyeaoc__?{D5JG1?UDUh72;sa9R6#|)pc22j&)g} zbrGes0@R8@I>J|+TbuccKfv35O1g;EAaD7OvbP*MUYT54U@#?Szuq&Wco0>O5Rbks z{OcObh1cy4v1pB3WJAvkMl8lgBc`!o#2LaQ{6LalL}`$ZcnNg>63PWX_!E@V9ydr! z`FBdSiEH!PEC<+KE!C#Bd2N=<88B-J()7o`vsC#357Hwn1Xy3JcN_Xh45e) zOtL&3AE>FUGKoM(ig}Eh5Yp|nSJpwBtg5p9m%{v|zKFfeQfE1HhFpr~TC>jzGd5## zKlDoW-+4$R`i`P+{78eu;mdssXEH{zhKF&7-?|Zzqe^92>^ov?!V$P(I7NjrSgU~# z_HKzgsbl6Ik_}@l*3P3z6K(kteMnsw zRe4uaUrS^Dic8s|_8haTQZQ=Ms`A#^9Hd~C`e<7}aF5mxa0*6}+i&SkLz4~D7})`m z0Et>*POkwwbg(8MY86JiK>1u1(f@l!Rme}wWzxmhRDa>Sg;pSH=I#Z}=6ILz3US&2 z+6QFJR!D=ePFc%RW;u$Ko6?Ww^BcvIE-$mr0!yw7D7{+vTZPxbVh=C)_`Z=~J;E5C$<5B@ z?*5aAC{ayws;Q3FQfPX#|AnTv1Ua1cKdp`oT}+h%mI}20MQz&uyf*g#3BLbDZNd~T zGq7BqB+a$8=cJn|UMbv?Y8!!9=kbb2Q0&?F13vIrm3AzTYge@Sb^8;+ru`<+i{c~Y zpxo7aP~CZos=sEN@ih^2BBf|&f<~1EJH=H~5@;E$Tx;l-8fr5UA0WdtNp~cMY#4Ck z-Z#8@fa4Ll66I_N=X`I2TJmt z*u4=B{jx4Rf>oi~Qz%#Y9JL{6gQ%T@#z7RneT8b%ii_I00#&m|dZUFU~2CnfCyYN)(}NA?@Vsn@dC>E96}x*`YsIo@QE9=dTrOzve6PB0hcmlKm)OeiNg@;|K8({WaCVhqik}CiZ*9Z!8s- zzE(gpWXFW(R>WkNp0NgU*=!+~D=_z_d>nB%|7RdS0Jpy~rYAV8xII>SiupLKfWHdw zApMtMc!SHK1VdQu07G6M^j*)_B7<`J5&AN%-KEkR35v+;Lsk?NadrC!oXD_ZH28s5 z^>yrx-9S3DvhovbAjlELJKRZ$+6JpZ zT*{eH^1ayGtR)9Y`3Mt;%C}hvdvvBakyQ_2l>}xwO;uob)Pq<;7I;UO2h{teY1(D0 z<>s;?O*UIi{Ik%iiD#@e6sfjHX7Am%wT(+^6OA5QJ)JlaHb=&af2wx{qi(yuiGrj< ziSbD1h|_Jec^W5rUA-ZvGt}#H_u#;6xJRzwmdAigUkcLn*4vvXb-_9rj{J@4mvfEL zbVxmf5lTlJuO`PS;1KX8x%qy+4hdy932zN{0piL?LPHI{%Z`_J8P3I^oY%*0y2*Fb z0HBOGNTog~l~dir_j5|kYh#ZIpAWgoA1SqtJ?5c3Mr$vqCeEhwKCi1d0scc{*{77B zE@_@N-a4-jnPx$iMK$#yUB<20spM~?lQuK7u3|^6^S7z4dXXlCYh-Iq->7aky)dnh1{L=kQ69_(vy>(H4^>{bWBzn+VLn!=i+1%6+++0)L>g|`<3!#UTy_mM>uZq`oO$`kZV`oVc!8A(ZNf``JoQ7{kuiF zJ`VkVV8duvuJ7MF;+2m8J=H?aBKeu0t0ILSXRD4LrPEbMk1nuB@}~=h)A`~HSWz|p z7PbqbJR+nIk5Y7>8oPpcKCH5^VwK`>b4n!cx>($~Tv|lqrgL+ecwE49jZX~T&J$dF zT4QTuhjO%5qBd#n!h^O1y9#jvQJXY(VVPVyN}OPA+d0&}TB=QJ$ZNCQ0_kz0_C>XA zc!RELYX4HHONmJCs~|-Yt1>yhC0ir(;wZj4A;s z9CWc{e+Ux`;i(H&4{p6W!tTWT$#_{lDNv5rF+goFDQ3*dYOAU)aI*}Z30xaWy=H7! z5lCvfXZYUP!Xdez)pELua``8m4(CKUAWwUf$_IJ}MrVbgx_(=2X4X3Es6VvZWJQ^y!cb9HnXx*StV@}?2YCScVOX=X?2+8U>>N2k z593$P;vDh|vpEG4ugkxH)dXC7wM0Zg*E};(TzJY1fqQz)N@tRz+mMCH<7+hN^!i~# zh29toIdF95-Hs_!eiVn(WUH*If*HhZ?Tont-hD|5D%kMkGOgX99D{9dVD*UOo7N1M z*x&j<*zyU!o?T7$D2+4?)z#P?v{|{!=pF}Vkl3llQCW?BNrUY1kB7)7P_{f>BpHN)h~&L#XchivP*mB9gwokla{(v6SZrX!~Ez+&XVD89@O;&Mv# z4m>BZ(h21E8Vf`xHCMoz^BUGNsCpun8l&-^2RJsZ0u%!EijRvE9oUbwdcyy}?R3!l z)VLbh={OxADoY9eG@WLxUk}|v@puQ1)qzOnWB`~!p5 zt$vF;V7CWdmR74a=f%7gCu6J*#{iF;tc>6|0Hvnz+X9iwayAV1GhWGRb+XVhaY^pS z(k;RFK(P{Mr7%S{to$=PT9Bq;gSrg5n&+}MWE7eK`zq&LBJP1G(3h3+L!83#cphH= z^GbP&*B3rgs((S06C?<7MY1B0g_Fy}kj?SEC?`n~NWzgMObbe^ODLAjTp z5t0-j=sZaQ4`4j--_5=Qx?#mS{s8h%qp-27@(jXnl|Wo&=M5o-j>7SuB!tZ67Fh}g zMG6BVp{w{RbXI{CI!=I7UD# zvK!poO@61c>;|DtHJNhWPOJh_9iOh7LUJ;h!tMEtaxTtJvDmkvxAPNE(cEeL;xg@^V?{n2cfaOg7u=4 zYh)K&7IrZC6&SsEFRN-G-ZtRR4fM|ya`G$L>~o^V2ycUA+_H_FB2vzKH-%jKYz2;y zwpC=ScFH3Sfu1HiQbZ+ph$pA{41iNSioXwh4E_)GTtoRh1EA{%b-Dp+$@3tUB8!!v zENxb*a9e0=V-I6{I^~!+vFS!I6jH}vGY{}`>~TI8*lA%C!s?Z+!0~k^ z;1k0ClOge{*}=WU8u4n46s5rT2-e7nE&!Vi&MN8Mez&vM+T1_b<>K!=11TBd2{^1Y zK1PR?nlodB-+p-ncuG18Y9ZLWXR3*v_o@tPWWNb$^Un5=jBYS3$gV zf4sc1Qmn-{33x?e^+%FUcx#GwU0@}qTSR+HcW=`kMjb2aoJ5@*>OfjA>haVFl}JbK z-r$yFj00zXe?bx19P7ZPL@0Jbm_}#;fqj8l3WHE$u?;vDXzuKxD8aNmf~bf_vmKjV zW^q|3>o@rwtu>ZvNiL4+YF1?3cf}f)eY4^~sdkNvFWzI3bv5ewT=g|haq{%L3I+!V z27C`aFP*{p06SqI*#p+H-AS-8gO;bU=fSD^BU&C0>gQh>luoaFT_#VHbmtc+nZ=?d zINfgN^mz=L3)!|rIZ3RdoJYE1B+|-d`H!%^pdD&>AsMrp8B|4hSpusP9R%3(L>QeN zNcD-M4-045H(#TAK94-INCNf#r6(|IG;lQ#J>#0zr;Ane}c~#5%}jX zfY}>G@`CzORv^?Pe}Ig-@91s-o-Op8u#G@cP1=xoNFf>lIIwgUoeFIPc1G zydunAKCQaHi@&<*(fc-UlmDEEKSk=DHqfEg@qR>j-%&H%$PX2tOzi1zUM#1%;Wm2R zk1+f9sO%MM@FIE#nWmqY4QIQzqcTNQO%_TI?wZzl=`Dns)cf2z#mNd zclmsk>@6jP0Sc+PWbqbhynrjthJhd@YFt$P_&muA#}VXgOkTgPo~*g9tbu%x<1+Vr zK(Z-Eb93uFJI--v3>1`b+_dsb8B_zfbpquE-Ov&i4c_)ABCvA7K|vQdUA9b5@INUOy=$8Rp& zJPu@VA1^KxkMj&Rl&eaUuSz+&EV5C)rpA7h?0~C|AeEI^qS~tF#@xv98PYFQO{B&r zkzy#G8W~CTkLVYX;d5_1zBgUY@JUIAkYp=1TFUR4j#G&8M)^HCl)0w_J}c}8o+pb@ z4zL5ch2obeQB67Hl>!?cjW6&^Hzb`?X#)4e8Mr5oXy-e;Ret7LP;tJ~K{~O)HM{!N zg}3=$E^Xku{p!Y5aDuXUVJ)DOsr~cMkSXz*Xd^Ok;d}B|h}i&3IY$P@@O)-+aIyF@ z;WAnV<|wToqY$2g^+{=kVh{}QBhhEYMu^X3rKA(&*ga?!Vy$Y^<^I+3De_Y;hY8jv zWC}%UW9QAKm(DKz8o8!>OlnFE9441#958(L?v+R?R1cJ*vFmEks!Lci+C;>OIHyed zFAgSKEl4a3QXfy_3^R_{vPY($+7*fHdTM%M`Y63QI=#?4)7MNHE=q55`sfs;#+!`l zGZ}q!l5&VmMfG_YYQ4RbqPf>Am*3HRvHxY{Wx{-MOiiH+$e76GukdZFb>giNzGvwokHGDZSoC&GR`6`b#(|^1xxnB_667`|N^-X|gJ{ zbEK)o7mW%^!&_b^HQa+XQZ9W7{#A4JC`v+!#ypA zrRvQy^MguCI74W7Z>(uknH{yR9jnWroBVF8hZCWK2-cZ zVET8XPwd;&clhHwxlJ#;?V-WJhqi@6;uXRkBzycJKe|=&V(m)j*omMZ%^XXVe41Cg zTAO43E!i$+UwG!vj

|Ny!XqXQA3AXLgWM&>{U9&o6gFO)!TYCt_=5>^RsU&?7#} zF2qQ9iH@mKUea#Sy?dVG5Jjwa&7b+m+|dcY!Q!y>cXZDV^DHiEax03O2BZz`yN>Ss zz^R8Q_m?|9lOW@s8uGqAo*fvBaq%o04#;cZgGx3{ElZ-jnhKvUy~*72_qRJK?6ARV zK{DZffAKbjl6?9Z`uhyKLxG2$P>rR^WVJ+j=H}Uu*VT6X4GK1Y278(Mr5qcA>jU5! zw*NL_VMLB7Y2}l$7vFNJV!u)Wk8awp_qr4+Py4`zSS)J7lh{Mv8;>CN*;mV98Gv3*Js) zMUYrB^S28yZ$RSt0(%${VaPZ~5a4ye1420MOA=ywfoMCe#?JwVYQlgL3^Mb7`PARu zc;*rsQ6^4x!SmTq1T>G{F4MtUbgrFkwDdCwts-ys!l-k(F+W>yBmz6fS*l7)% zJI!7^U7#R4-U7G6;TZ$B!V%Zsfzwo%p%aagZ?w!YxouPgJ(m;(5(7jS12`FHrit=l zK(E|NZZaNtLRe%cS&=jR^Q21n<|0}8(o{$KV5jFJ34UjYr~)+*eV!SO(qV+g6##7joVYuHusIxV2BG@e*Gi4wyqOm*3(FHlqLPh^VqCBzH0H|H)~8v``or}>nJNWd zXx5$L58r;9@>g<<0ED?*Kwdv~Mp^v}(2`Xtg33vX5LqFpe9g%-T{^4q0Oa7|ygSaN zd`SA3_N}wv057Q=K!23h1`9-)-G$w*JSUZ2t;%kH^5n^d^XFG-J|#n;Y|hWkmn$2v?W_wGGu>KJ=)xNum1<%<4rfxSq#lqgmgcm=vB z&P}_|RmXi&4Vod+Z@@(1=7sZ5Q6g1(RE`N%bD~FPQXNL{?hdCfnMk&{BenGwW5>|U zAGyT4)J!BYGbE}swxCMMhOMfRdH>+fE+caKS@0xYNCjgd3KZaJ)VA#GqVNWb)uPy7 zc&>iQEhU#oFRX!jh{R<@BWDL z+SAn2=F)Sw3w>Q8a3xM-4@B%bT}4%O6%N75sjV03ENp7T?(amgtgkXbr022Q*n|9j zE0UPkM4iy>D#+e_viZIdo449j<>4_V&EY!A)Oz-3rT=_QB^SNguR)$Jr4zFE;D-u$EnJWP*Q`?38_SnSTD(c zJ=IUm_fLU#DYOUYWWK|>3w;Kaz~?LUmfLzLKe>afhnkx=aDx|Z0-l;5i9!ffNLc4) zah{&vjicrx*^HsOveAMx{kl!rEjWx(O%(W)$kg9Cf;0yQr&z~<`%-zTz&s{{@vyiCBo(U;HHKnP3 zKkB9oVv?ms$?M0#LS8>|P`sPh@A7J=AD=67biRd=fmc_MIfV#~a5AoUG1lUi0AvSo zclzq*VHH6NbsXnG`aB;l`C6Es_9ue%^(|el46G$zvzV&tT8H*02M-RnqMwytt~{Y5 zFNU3Vh>lwVO5O|x$v+_ff6d%|;VwBezO!qd92fkT((;#`8h4Q487+QNegz}vEfQ0~ zrCudliIZA<$WI26tBSeg6T9-a@uS*H&XH#42YsOEZ`j$L-MV|)N)+Rt)>Z=R_>D-W zxA`}5iQrsESAiMZ`ZA&S@QQ@S6M>3P(Yp9oKFO^(y)?3N$o5)SjbgQ@CX9Wr_mG9OzMOCRJn(2fhCds^6wXle@DxSKHyUL;Gs$om5hTk;oZ?7NDgiXUDU?3hFYR2DLU;KVTg34u74 zecyn8YrKVSz^X&)#5Rwso#NXgyN2328k>XqimEzir`2YS*SqW^5l@%ZR#%7XQ4doF zs)m*hyS>9_!>xZ@Hl8|mFl8!KMYbMDQji|(uFV~R#T}!MO@+f#kB#nF40JRj(wMAc zd&yXbq~TSRHs#ZanMiY)QH&8{}sCrx#hP?qwZ z&}@;jn#<6MeOn`y^9FY)?jy0ohAWAp-Ba+)-L0x zc;BBS>oVEUl&sZS(}_SZZa6{LH#@e)z4uHZWoYRh3g)XiM`z;{?7TK%lt0}YFg}GI zt(a{D`_;s$kFa191xf9tlQ8g^B2KBOr~4eN;3Q<}MosAIrJ8R~k+~b@PqKHvdX20v zs6jVW!LE`b5)9pc2hYD=3E4|zUB?BrJlXo+7EFlPp?vVQ7kN$bB+)dI(loiN1Gi3o z`p5jnpC5nv`K_+@7 zEByy%@)s_Mtn_C{?g89&aY6NA{T9%q=o|DazgDce#NN6n9PJ$b!ehjS&0KJu- z!ZZA-MDcwm*ptU^&Z}!74AJOo5^MZN=&PC5IHBt0{G?6ULr)ziX4gCE5j3-*mmW+A zc6sn1;&rQAUSpXjP`*03-Z-DhZ(yAloN5wyKoU6YV%$FhbWbQ}gD5AA9g(#nApm=m zyEf)x)BWDX!N?qUcOb9;>DDaz{G2{Cyf03{1*yrZ!-p#n`d-BY49Xq_Z4XdK#n4M# z2)_ak(w!u$dLbN`v^GJNhG)T`*H`Hto)gXm|7PRCIk_4%g&Yik3`tRRPZ?q&AX}GI z2Jj;_IFlqPN0T!hOx!>0U)U*PB8dHxCxwC{D7q|@B_B%hKVnxAOt{ubcXxvlQ#4&1 zbSfro5tKL#z9Pmy$W;5c!EVq72ig?#3;X%#(FX?f#)%!dCay0!L^=JPaBqW!PWfcuWiB zkrgA99|JXumg1e%0ha9ZB+zSu7u7T>&vx$~ju^L3%{KWA9mBh#J@>D=xQK^^i;Ig8 z4n-Fiwe;`m**4IE?96o9ldLGK5~t9iTjly9J}%mOuffwk1js?_cyGWFsaIk5&E)*f z-uHxEY-CsOJgX{$k5vua|G|-WfnQ{DAY}ZMoLB|HPjU!$QJhi*w2=1zAj3FS819*V zpZPr?=-fS;KQAE2ERWB=3jq7>t9gojp`2@GRs82KAy?*kY~i!OOe12#-sVphtl1@efAblx&a0M6T!DHW52(pLk@@ zO3oB+Tfp~cv2REY{~;~?;3Ggk?7_^+2&c{1gHH8~2`sFjme2vXwibAMcw#Kx*++WN zh4vkTfscM5KRrD%u^DlK@N8e_v2{m(8*NFTp+6A&8B#jMupv1z4^9>VtS~geekDTL z+RHJkufmk2hO?;=s${_8Eq+oS0qumPjaq~>sJ6%>V$mRbHA9~A36jW!=RB9$%UuYn z?;MsYqBScC9%~2N7tSows31~7?n;nsuV@qSBeU<-x^QoVp%Uk7qKaPO?n+&$(CI61 zA52A01OQZZjBsSU*Ue#wdn_L)t!~&Y&*K2eh4n}2gfSp$B;ZWn2K8%Myxk~E+yvnvcRqx^OA^u0) z1YD{uelPxq>9FUs>-pboq42p48DRej!ZC0_?wMZQ_8JaIZ6`D9IpAbIKf8g0`lx`A zZV_Wfd;uWDFD|w6mXOps)(q zLDgUi=sFZ!0h|)thHmeI43{n0JU_y-)&!M3zRb%-925B@Gbl&Y2tSvMx5y}nXk$b+ zk{3wL-Myx^l6RJPCC)gYHnuIN9{?@JK)Qy;->FOI)l!@Qh4pnrQ%lBYw4*%r3a3W+ zp7(uT$v>sEM)lxRMZQe<070X)v#d98^TuZx9eu}rwBY1i1zpb>coRZ}+KSb;P zRJ6`15Sp zTUzCUek6{J6M<;s+<64lJpWQC6Zb+5zQ|Lcq{jQb-7VJ1i~0Q5D*VaG2)V)u!hoOr z1h6xt#F#H3cN^ghFaYa?^JXG~NLpG_^TlZ*h5<>DzgyHMh`lHvmRDErHI562gX61L z&c?0DfvRRZ1$@Q*yWX`oO_%&obOcys-KEp6T5pq~m@>2v&9E9nhj1>n8#eGMAw>jt zBn_!fBp?pQP`c^N2Jc3PSmW{$M-iz=N03#oSNQDByNz zFr0P5r=kP9tcuU74vXwIuwrrlVt-t9UR*gf196{r_BKZTi}h_MNa0o88PxW1du^o= zj=3sh_mtw?$Ye^qcvHJ@bmW&Org*yv&Kp5KR?7~XLouc+sly~Kfk=ImOAtn*x!&um zvYjev$7k#87K5X`uOv%&-R8FD+pF~De{+TXEmmJ&7y=K;Q`>lSsgL^A$Q3v?5@TgG zTHK|u$6jAu$%PAdi`7~vDb>g8J=3L$HQTKr*Y7Jj_C@!wH?@Q2hqWT!4?aqEWTD+- zvH88jSC^MB(9Of&T7K>lzk4`2&${@bp1+?*nmlp)FfA?JHis6-CIJTrq(`*Ck7k}M z6qYHo-gEQwC+Xg~Yq=|D&tA!0UrCSqd91SW2Uqc|ZYFvd6V zzz7ayx_s^itH+<7jmP(-0=OM)B$?W}H5DJoOipG}la-4VZ6o^)tpk%Cy`%QVT7E$# z-6-uFn2yHNsaPbH-`Ybi5A~*XjEN#;L~JT$A6-4B@-2pIhs16~$73!!@=v!8xXRZV zb_Ro;(I`c%M!NKcih~BaTdN6Iepgr5nnUjLt%i<3j*>~Y`*$A@7$Brpvf8eeTGvU} zYlYYKV)kk|R(?X9{3=P@sx(Vj_fx?iS7Y5e`J1|&AeokLQh#)fAnxugXYA@~W?w~E zk0O%`8JB1x7{oLDgckI3P|z_Z@}v<)YO-}8=cvfUzPA2T>{)SgYfb&9STCr7+CE85 zqWvRG&*`~npCqyz@Art3Srz1wdsJZ836={i4=8C@Bqo2)Tb&{Ujpos+)E%kcs7;{}w1E}?uL=UlI#9U(vdqEvrg zk;+8<>uP=7A>^2$?57k}Z`N6r`Uc%0eka1(+LVz-sm3FH_@9E}BwGU77+5{Jz01hKZ*0OXRa-x{;YWTb^h1mXCE56+b zN^h6?I)FAxP||gm`Z~b##fw>&Yv=A!J6Eo)_m$e7TUC3u)b^aFc6rthNaC&@zFwMH zKQKvh3&#e;goH)z@O#V}QZvi#qZ3)HXFUs;C5Zb9Z2>rQo8wG7%IQZ$M-nc5U32P} zaEWUdC0r8P1>w>JKtnio4kKH48WJ1myQr8)wY?mdsC8f- z&sInhMM6_s#XR1&ruKuH+Jt$cZ58uGZNfa!cD`JjW1gt3VxFi?m?vr<=6K4Xs9+v) zzX8hpsWs5#n3pHaqi4%79l)pW^8E>F!eQs+FoNDeC(+RtoX?Qp<~c;CaT5D7Uola8 zPKxlA=|?$5X@)3Dleg|Htt6f4Q!^GKgK(*w;`c?yLK@8lrJV91(h75(fz2Z?672(; zxtWjVK4p|=`FN=OHNFbGKB&c2zDKD%$X9{tW6hRmkFKr#pr*Eu z+O%e(cD`JjubHTQSh`pmiJ9*kQTuRSjARhw7S!SrUo-v`vVv;i!`G}pYevtmhSKZ& zbonTiYx1{HR-V@(jgN_Pv`qYk=B=$irsRF1@^XE|CLb%;#u_l*`l>Y;q%{z&10%|7 z@H&^RMg2q4H%n_qz9Uf|w`g$sLVFvzj!La-XN-(OrPfu9m_&UkRO zh(pyN z%TcMe7COi{gmTfk3LTOtwD&R5C^yj8l>3QHfH7Y|k&Om0eucvr<>UnfEJ?cq?3quL z^VSLWsS=E7_X^#SU@z*=qgR5x7!BsC)ITIW#xZA&uE`F;xQ{3v={DkDW}vI{Gvt2u zy<#t$$%$`t2F*9}|Gw){zTsJ1=vGW62MWY??!XpV$B_$VRsL}H^H6gn)!?)^;VAOj zC?PWMSJ$f|D-pVd7XOXTM z>#NozOrx5m+AtEpXpATLGxXHV)cn-(F93@5xoPMNLmmK z*l|%6$JJM|Tagv>A;89jILZK7E9hPpk?BX9A6)xh%>ZFK zfhzEdFuV6_!eY@;dt+L?KvaEAzh@03iRPnh7r~?(H6rNQB-1l~Yq9orW4hOv)3nmJ z;-*q@M=Af7uR8LvyoOZ|)9GsMs>7cJ&zQz`smDhin-mJ)QdWGw0f~1CzW(Vbze%($ z($-kWyCXq&2?gZ)4Rwt{m&ugamumGT;WzH@Y>RG*n6BIVLjEo@;_4EZM3Q3!{NgNd zGh3X=5(N2svO5{WGXn?V%}>`keNJ7%kSJX;`<6h~tML(F*c#B+#<%4B43 z{Kr>^)6Xm{5JWL1JL&_IZKXhRCBYK%J=p`w2>|3+vdE|7TPrhqx7+UZ+TCvbfb+uf z3V68d%{{4lUl;q)V8rV1y4@{y^QGZ_in>q7-JLD<>fCG5k3;mNSY~L6OZ$V4T8n_G zQxpJPTWzX^6^P>4>V2IqdvmiL*F>`))wguI?VY&3v9L&6o;pZVr!8(bLhwOz;IGo7 zCxf6lNI7->#P#Kj{EOjs5G7yKu+be&@FbbE(EyHBc)j7(^On<;rbkJOnj>%I)g%)z={dOlE3|RtmrJbiKEuQ3a(V zLeM+Y;&!#PxZEv}Is7Z1fz{=oWTX6_CF$lYsy|t=P)DBc3wpmjn=BMuRy>{3Y>$;%v#ABHaR#L}%u zr675t^ONl9;>Ta2q3 z#IgX46ko-I8Yu>hwupK&F#BqBa{@g7xB-$&c^y|S{rWDNYF3hO>heb{gRABVC`fGMZ}dHr|>hfFX3DW?mB*O zo>ey&JOlXs*2(@te}Dg@$t(8gSZw0RHb3U}@i?#Ga;8M|7z67WU%o%I9(W zKsWYeFJ%{|vza8t;+G7@YffQM6ow|HjZG2cFoN^>e7--A1SE}4i?zYywD~;UX+MfC zsslNH&K{x^t|2>u4GM*V*arShNUB@svX8|=TjPPs#X{k`s`Pq;rPMTnAcj1{Cp&~) z+R0ClPykj)pp@EJNS2J+??9 z(-rFqMvw(}78mu@Vb!W2Z?qB~Lh3_qb6sjjZ6hm*;N==Gs3 z%c`F`J+(|cHoeZHKGikzzVy(MnXayxBSY!;&2+IJl3&{$ZEbkwZ%AHQqSa+zCR;D| zIh{rUzH<~O4;(zI;8*rQe)i^U`a*mz7f+}C>0$XZ0|WoWe8+Jf=KS0oj3bQbH?nN; z6Gq86gcvM*dA@>VCy0`3rwxi=4-`)JwAHmVTKWz>J2my}gMGD)-nvliWN}NkE#$55 zntn7j_~>+3eREqw_y5n?w*a(Rp8MxZAlxqjLP#JXB#=NLKnM_S1qvw;D5V$Z1(b%i zL~WpLdP6I%7Hf;v)=RA|YCDhXajVn6JDc6KZmw>wo9mp%?XNv^y1(n0uG{Q3?VMI^ z`u{!e`+Xr?v^@tcyx5^%tf!2V-myswPe7|~@?|&?;;NM^QoJH!I`o2|mtFR?# zL_0r_S4j1k{%LAG&_=>q_Py!K=kkZ;ud;EFB*+3f3gf`{dqeNvHp@6(4152vneWSA z6yK-zpPKUh7BI=m>{ANqc_b@~y!rRjZY|FJ3WzsTDE zQP}%r5j<`F@|VKizjv1Ly%aY7gR`{%lGuJR`X@~{+9&%;|jsGQB^-22(xm>7! zCEI5KQh+YSMftES8YfK9P%u$V)QFJeo{<0ea{Yu`=ogZjCwzw?h!h0Nm2WBBihQao zL|J3-Pi2~+5Cm*Jd!4KVsFW2Mbg|(bV#z$6Hj39q(;&Q$G$7mPz4jlGP zGzUKnemJe|JeLMI(xpL%X!Wo=_~A+SVHys7q%$qGoFI;wTDH1E1CQp-yC*JxDoud* z<32of9(bSn5~m_|C{0J|H!3u#OH%*mWh%v({3*5$AU!}tz@5I$E8PB$@JX{g`W<1X zHyA@J203!5rV9)<3^FT(^TNO07H&t49^n&j@V0k?FhiMAGtUWsEV3Ap%ij*hHdC$J z1HvcnV9eXW+o#oqb-AEH8j_szUi2M|c?U5D?|++B_5#O{ggF&BCSS4==h%;E9x{re ztDLYOh*aqU0*OMb9^;u15!k{Ai281)WsX{#s>~^yYcW)$Wu&EKq*a+KuA7&i+ql$8 zxrI}Id)0A56j7@tly7d$BdGjAplPkOe%C=H8MNEcqL-%woNcVnTW zdSF*a!}{We-ka=>>Q%c|93W&vVRS?e%*;P(noFKGS39*--6+Sq9 zn#31wc>)49V;9F^+YE_2@D`6Lg$*AUzHkTkHp_qh#n0p)Uj|!7mdW=rt_KgAR0UDq zsYJcHFI*5_3EqGHJRD+NRl+u*v)UbeF?c_NB$8ym5hkxjUdK)@ug*eicY|8PsU*5E zmBecYMvi#}V|(z$uH)|D7m9gb43ONcY}WDjIW8Ja=CI^4Ck!dfmjVDGDmP^>MqK_o%>A@3EID5}XON8>E3 z0G-DSXpn79St!^|T^(&E_RHQS-__RP?z%kM)1>>(%#ZlsMnmT!3KMSVT>K7;8s52BETyrV zAcOjyyq3vsv0Job+@Of_;Pt6A&dC?oi8>!s8Tv5x%&c)h7qx?L;%4@kWJRsEAZYvNtFqG+yfWdM^b6 zgD0y`LPsQX;v_0TFSSB{cs+D0L%_C>6>@1@EyXjM6wK)bXE-$l(on)9REuoH!R!Ez z@QHc)rG`XUPJvnEw)q=?1m*!YO^ZB|Y6zu5WLbKGEN=QIS+I%U9Wj?b$Zl zO@-O`oh>|1;g#A8*L_VWqEFd{%5*D#{U~q8nob2CkG`CLqLyd*%3YZ4q1T1yJ=ukY z*@nVkEB(g9*`r6#(Ko1o{ph`NZ$z@f%_wWgR>P?|z6MjJ)2UHbqG9C~tDYL`=oouy z)xgvA_vwN8Pl9sEF#LA_-Soz7g!-;YvtWoD&b#$G_K&9$*Mue8luvM8TVpMce zT7vg*@Rh3%`OPQQMkXnxaOo8DT9<3kCiq~qG<6OrxY}w$we~-W9B|cn&F}1v@kQns zO!%?eva$_2LzXzlyqbb^GJ;bhe5R(b;p)@e*V(8xWMiUTFi_NIsCAA!4KX@dd2tZn zB*f(#Y5w5N!Xc=P=bxH9XtTi(Fb4~90`?oy>#I-d^a}yI-Pe2dAz$bcGK2rJL0fGVVEhrL?~1a&E@K&HB}X6A|R1bXRufd$?B-+NU!P2x8sn; zN0Y#u#*40H@c~y^D!o;&%OxR|5ZmV=u{%k_NLDs&)f>pO?&`1>CYzVAT{zo*^{LUd zM^f=IpHC^>nlwxNyZYwrqcqdZ&GDuE^wC&dr0uop>3uyEom2PgS}+kw&lFe3M7Nz1 z3Qt@MCiw`=Iip}5~E|15(@OBo$8TvFK05q z(`(Yz|0}3V4Zn5Sf=p9xTy^@30cyoMiOPyoM#YTzyb{#$8)#=o`_89UPu?%MSJ?f6 zdqyxyuoeQpQ-5L*3#i4$PTB2ZS(9wR)puLL@4%S{Zc@>8)mh!vV8{I^v{HIra$3o6 zbt3&nYrdtT!eS{ezxp1E7pF42ZmG+)v^G1tmj2dd_s;E{KX>l@&biZYL@m+HGlx9& zb`PhkMG7cH_*`{L^FwnH=Y)A&+g$d2`6Q;{1?RQQVbUgG=9sT_j2FLrNSv=~0k0HE zei-n&PldlhoRC_7&VBBj`z$ot!WxRog}7X6$VV;s9_ZOgtfHG`4lv`^xKuNSo6)_! zxPAsKToPXHapwo0p3*AgJ*VEgt_ob5eke39Muk(( zAGkGJ%?4q{AP4dr3JDXcDUM2dK~0`G)GW|B*;zI_kv)c-NMB6%j8R{t@ZHAzIHa^o zh(lBopgc{UL#NKrtJL}~%plvKZX|1~$$c`AHh=nwfl{P`R5nmrs3`EjG%`5SZV$Y0 zdM2rI3BEGP!S}j)g}U*n>jctwdLNS(BSeF^(4m6m2;p`vd~p;rx*o7J6lGAVo&*hO zjks@LF?l1SqtwZSDnaS`A~FlBW-d!c0rZcMWKgg^Phap~lxZnf2f{-|cfgeOV48|A z8!G}#nlV_?AR6T17GpEVDNznepKpw)2}11>KA+AnT$Hf){+C$1gsDVBIK0hvs!~BA zIA^ZZ%_o9yoO)))T3iygwf6-NO~IRlHJ5zZ4o!z-t~{M>5#atFvQwJ5AQDuQTuHj$ zQ{xkH;e%8!YPjnCe(`^KonOQ5GE=i~1w*Y6^_9EZH-lMtYI#G_KJ_I4$E`^`v^UNSAw=g%u7Y8GyXc#GVcI#|; zTBm5bbdn-cSSxL2TSb0+a2u?Y%sN;p_0&OwonCG-6($I8FsnAQ-GnTkbmYHM!2413 ztPH^aggjiSJb^r1MbFBBpFCWr`7^Q%m^1BTDMIoIX59;&pqQ5z_b@DB$!~-FPk5|( zSYp#zfs|;)NXVmv#sY0D+0+GO``B2xFAQaOgm@5gn}ApHwyj{b^TpZ+LL-;c$hjAQ zEa0Qs+?yG>cZHo)8zbQvf+?0a%k9g(nS~Y3NlSPd32sR?l4+~LZQEshRrnf`oi3}5 zs1T<^*7sqayo!3?`HG9RX$AjIvlI@BBVpO{XeHp8iCGFK#PZ`;qK_uzkFiyud49<1e;?&o!yc+lBY%q7rmthQ*UC;ww&{p$O}6Q<)j{pGUK%;GMPO}D zh;8#6+$cvza~jL@yzO2#5{xjHwasc{p7_gKq5S7kZPAaOWkX?YALebto``u`V}w6v zZ9gaW`3##Uua8v}SbZEB$O+LpX#toAhQR78>dDuIWRbA=LXJF=MY7C+;W!D`(DZzj z!4F|*t5b0U;{t@sV)-f&!@3RLJV|H+LO+rBpDovZ1Wscsa2@L!Rb5NBY;2^5~(6oT`oz zdwZoJIlCyc>rAlUeN5Wx7pMgv3kz>6+1QlY4Ff~`Na#y+L5wYTY zeX#jd!cc$7!de1kVBiipWi4R#kp)5pQVKAoyH-#@Px-P?I100sQ@xNHul1b}GD(Za zVw_dF=P;DMCJRaRemZiLD_C5%DCfoCGHH@kJXew!xw@d{)s1e3csB@D=||4qrAl3h#segfOyrmH`Pl)c+EZ6v9Ae z^h-H-f@{KZ`*NK3F7(F6>Agd1p_*JAS_gD#aCMfb3^1S?9KrINi^l6j!FZC z1c%Q5dg6)do$)-66XwUXOx0wC_+|4Gl}l6CUYztbOnk;p2u9yYtc85j=i^z=21f9A5$1ZLT-7syI-%39WaDFA)R@^To0r8hKrGWqASRdjPqYDkJB zn9hziQBvLk%wbtY(FcGnnSq?Bzk{))Xl;uq1yT|Z`WQiSt@Hi;5rdJ1g|^cCy4JdU zZRxxsIY60Q1RPyehCsm1GGwq^!z8o6u0U@k^F!A>jUf|n+ANj==}qN|MW*~5LwZKC zD!bB7Q3DY0At{dH7LZ`C!F$nUhl@P|Rmmf?h(2)9o2N_7%}SZ)GMY>!c3rMnjpXpj z#tJ)2eg#}g)CIKS38W>SwB0BA!iqf1CqQF(BCQ5}enflB0;AXKo}@F*Q^tv}d|xx| z{pSaon`eE$2mKe!=${L2MD2)Ze<5aRo;t4Ol&T;@9fcUM5hR94vXqb_W3sCNQ;4WE zz$iR*v)!c1ii?L~0iVGVMIT0xH+=*op(K^;RNeO}tVw%BzTRMs^h9^bb*4<6Dlx69 z#G*B2;ZtgL@npwGlT(w^HFXu@AEG7+-g*FU{nFh_c6M}l!Qub!AdS27NHH-&DHfuW zk;wqJ8D%*Ipk+@3w8D(O0=t@N@f4Wty zy?a`17ZSaTwNHENLzTtaw<=&WKzxRn4_=fe%nCkYD?tix3%H5paFY(Wi6yw96!M-g z0~vytTG&;zqc>2pQg5?@%051~Gqb_S_eYzX4^IORqAWjCc!4h~D54LK_z^YzDxo+z z98w5u!s2E!GlHo?cKNWym7-46cqVV0@QVmxohx%iQm1N~3zw3T6gb0gr0~1yQ<$u) zLWww}-Io4hPcV~+otR0NZ1q>ngz$U#Y{ICAYn`HEzojZ{iu@v&h2ogJG7{A^Yfz*h z^s296)G(iL$qxQ5G; zO^Pxa1(A+gQrZRInhFjg6?UbCQ7P?|S89617#b!0chyav-1!{XwaddLSMuvK5D1DW z$0(DXXp>oXcRD>O7*XPpBwJF*D7y(Ut{C|^+m6m4`7U27Xe`c9C__>&aW9*&mvgUe zFI6yGN+lcYY4qULcTWtuf6Y4ENGM5iek(a7-KjKg5nyT`-nONk>&&2H()(x$~LO?GfYZVKOrR0(C2PGH6e80SZ3LBV%vWk_Dv zDBnfad*aIQ4ph=mzGO9`X*GCH;!t4x(k(3m(cydRwabwkeTo+YUEuVtl@vMF=^~2|DJNcV9u0*qGfuy; zq+1yGb#hrS!buKhGevY1;ruhfi1ETpgjp)WdORFT&J#=En`B1VBFM8Z|6!7);H%!q zV%>_X&Lx@kFk_@CFi8xxYvA5-^b!7XMtfVOImVYzQIciPNl8+tRG7%UaFEPe>2C2M zHP0zTCo}16LHYCYS*(relpGu0~l0fniv3#rS+$`mg$uOM+ zZw1n7RvU3e{3J7)Rw`Q?R{F8jvTz;zW|gRo=*(O;q}ae_x>d&G&hT<-o5~?&59tS( z=7skt3yeyVdZtSd$I&~YWDr?{(<6s;sfErD=?pP6OtIqy(cX zT~DH)D)2J6)kVHS`inK9UEcuNy0p9f;x2M%fc`_=-2mi8q!-}jpa zF!&StWIhIe?4&aIUN7!?6@z0Bh%uaC%!taBiaJv9uyaj#NCE63gD<>ULGsXPr(00> zy6YpS9dY^3$1k5Glt1;DV~uD8x1&woQxrya4q6bBvwtQyP@ctc2uvy~T@k!`z36y!ANWk>3YH#(4FuXDY(s71DQqTlN05>k3wd06}hLdsS&zL(- zX6P;GkHmApqv^68#yTl!=V$IXBCm#@b2;kKIj7n292`-==qw1PAg165e&ACHf2AB8 zm%Gp&tH<`?KDH0Y(}~h)CtFcJGE1p=-gyf&Zq|aRQ=8UqC=x72#jp;mE3EA0xTqFd zR>b*YW2YVZA&V5mM}deyV!0Ikh{{>4HC8UgT4S{-nwMD0W2*5|XQ-6NPUEGBktWvV zG14gN6mTL%-y12Fc_h4ULUbjZlu&t}>_)a`)3K}+VTvMQ?SOWILl@RqcsHy*tubL= zii!tKD%zihm4*HlRLXaiZVlSMNewq!Pts5F`A)&s(j6n+B~#l#DU;0O_)BqoNp(d3 zL0n2=Et>zI*ZFkbHRXs4w^hhxraD8iTFXgRab5ijM#4_ zXr&%JYp&cv@kQ_)&z?;}8%65Db259jU->P*rE!?qbI+B#1sC#3DdA0aFVx9SLRTGyJ0nYIno?ss>x*PkxLD2R+zj2fg2#fhmdjEk%El;`CZApTWTBab2@UnUKiR-0Dy zLt0Jwx7e8Rtbp4Ko}XgR;{x)#2!F-%3E+7?#|WCE{5f79bLP*_V@8t^asG$)CSh}m zmxAK-=n8Um&ex32aBuGSxX1R)_UP5l7ftxF>~JHo_lEC0BmN#~hJ}5}F0oQB$3WB(Ve>g-|DS zq9mD@T>0~rZ^scLGDzG|KqGKhX`FRQ6(y_PHVhQ0& z3oAj$=}^nO4)jl{%oGI<&~ScqaTro-HBCCqx8JpAL}sB(he#jni0@Xb{LX#80DvE0mAK|o^c=h$|Cy<7f@~)DfAeW_Gr2JhP z!nZ+)W%ee6G4mR;ou*VW&ZxE|#SzQ?yrZ z2CG}qU6XA{QD@Rlrx>^e8k)Cf%^-AG9Y73G02+mN=mVzo(T0%lbTC=kN z$)pJHGl&FiC@Bu7^i0$ai_3|uBLOOhl{%eG1Tr~V zEQ0*EScED4TfStR;<`v3UuBe7D_|e&3|S_r$)22|2g0e8g3^eN>t=*}!7*eg!6~%a zVR$flZq(9PqSKW$S}0b^sH?K&W_5eYlENFz#rYg4pPMx(@C6W*I zD6O@f_Trufi>0BbSW}Xx(d3nA#J?;h%o#+0SxxdINx(2eLIyY|%RoW#HO6gv5Xl!@ zr@R(_EhM!Aj<+N44Mm7?Q-pl*Jj8Kl;r_zOQJKTDSs<$vlYA+_jgykojZ}DHIt(8~ zpJPy_L+OcMIA@{!40e+|N)$Zr8;55hx8+O4x>zaB9LYIJz=~WcOwI~|-^5G~3@k+b zj0G~1mP=burZtrq64be6dN?!xE5D#=iA`N>(UM^n;tpvvR%e!|`c;xam#xK>pP