Compare commits

..
Author SHA1 Message Date
gdlbo 27dd93efa3 many fixes 2024-03-30 05:47:39 +03:00
gdlbo f4c7cdce8b init
??
2024-03-30 04:56:38 +03:00
16 changed files with 1026 additions and 2344 deletions
+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
uses: nttld/setup-ndk@v1 uses: nttld/setup-ndk@v1
with: with:
ndk-version: r25c ndk-version: r25c
add-to-path: true add-to-path: false
- name: Set up JDK - name: Set up JDK
uses: actions/setup-java@v3 uses: actions/setup-java@v3
+2 -2
View File
@@ -4,7 +4,7 @@ import java.util.zip.ZipFile
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'net.nemerosa.versioning' version '3.1.0' id 'net.nemerosa.versioning' version '2.15.1'
id 'org.mozilla.rust-android-gradle.rust-android' id 'org.mozilla.rust-android-gradle.rust-android'
} }
@@ -95,7 +95,7 @@ dependencies {
implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.4' implementation 'com.microsoft.appcenter:appcenter-crashes:5.0.4'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4' implementation 'net.sourceforge.streamsupport:streamsupport-minifuture:1.7.4'
implementation 'com.google.guava:guava:33.2.1-android' implementation 'com.google.guava:guava:32.0.0-android'
implementation 'com.mpatric:mp3agic:0.9.1' implementation 'com.mpatric:mp3agic:0.9.1'
@@ -1,16 +0,0 @@
package ru.vtosters.hooks;
import com.vtosters.lite.api.execute.GetWallInfo;
import java.util.ArrayList;
/**
* Since June 12, 2024, there are troubles with API method "execute.getUserInfo" in the old versions of VK Client (<6.16),
* to fix that issue we need to upgrade "execute.getUserInfo" for new API versions
* and implement the new API method "newsfeed.getPostTopics" (TODO)*/
@SuppressWarnings("unused")
public class PostTopicsHook {
public static void hook(final GetWallInfo.a model) throws Exception {
model.f = new ArrayList<>();
}
}
@@ -4,6 +4,7 @@ import android.util.Log;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import com.vk.core.util.DeviceIdProvider; import com.vk.core.util.DeviceIdProvider;
import okhttp3.Headers;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import org.json.JSONArray; import org.json.JSONArray;
@@ -57,11 +58,7 @@ public class CatalogJsonInjector {
if (!MusicCacheImpl.isEmpty() && !LibVKXClient.isIntegrationEnabled()) { // inj in playlist list if (!MusicCacheImpl.isEmpty() && !LibVKXClient.isIntegrationEnabled()) { // inj in playlist list
var noPlaylists = !json.has("playlists"); var noPlaylists = !json.has("playlists");
if (noPlaylists) { PlaylistHelper.addCachedPlaylists(json.optJSONArray("playlists"), noPlaylists);
PlaylistHelper.addCachedPlaylists(new JSONArray());
} else {
PlaylistHelper.addCachedPlaylists(json.optJSONArray("playlists"));
}
if (!useOldAppVer || noPlaylists) { if (!useOldAppVer || noPlaylists) {
var newBlocks = new JSONArray(); var newBlocks = new JSONArray();
@@ -102,11 +99,7 @@ public class CatalogJsonInjector {
var noPlaylists = !json.has("playlists"); var noPlaylists = !json.has("playlists");
if (noPlaylists) { PlaylistHelper.addCachedPlaylists(json.optJSONArray("playlists"), noPlaylists);
PlaylistHelper.addCachedPlaylists(new JSONArray());
} else {
PlaylistHelper.addCachedPlaylists(json.optJSONArray("playlists"));
}
if (!useOldAppVer && !noPlaylists) { if (!useOldAppVer && !noPlaylists) {
var newBlocks = new JSONArray(); var newBlocks = new JSONArray();
@@ -220,14 +213,10 @@ public class CatalogJsonInjector {
} }
} }
private static void removeUnsupportedLayouts(JSONArray blocks) { private static void removeUnsupportedLayouts(JSONArray blocks) throws JSONException {
for (int i = blocks.length() - 1; i >= 0; i--) { for (int i = blocks.length() - 1; i >= 0; i--) {
JSONObject block = blocks.optJSONObject(i); JSONObject block = blocks.optJSONObject(i);
if (block == null) continue;
JSONObject layout = block.optJSONObject("layout"); JSONObject layout = block.optJSONObject("layout");
if (layout == null) continue;
String data_type = block.optString("data_type"); String data_type = block.optString("data_type");
if (Objects.equals(data_type, "music_recommended_playlists") || Objects.equals(data_type, "radiostations")) { if (Objects.equals(data_type, "music_recommended_playlists") || Objects.equals(data_type, "radiostations")) {
@@ -237,6 +226,8 @@ public class CatalogJsonInjector {
continue; // Skip to the next iteration after removing continue; // Skip to the next iteration after removing
} }
if (layout == null) continue; // Skip to the next iteration if layout is null
String name = layout.optString("name"); String name = layout.optString("name");
if (!name.equals("header_extended")) { if (!name.equals("header_extended")) {
continue; // Skip to the next iteration if not header_extended continue; // Skip to the next iteration if not header_extended
@@ -245,14 +236,11 @@ public class CatalogJsonInjector {
if (layout.has("top_title")) { if (layout.has("top_title")) {
blocks.remove(i); blocks.remove(i);
} }
try { layout.put("name", "header");
layout.put("name", "header");
} catch (JSONException e) {
e.fillInStackTrace();
}
} }
} }
private static void setDefaultAudioPage(JSONArray jsonArray, JSONObject catalog) throws JSONException { private static void setDefaultAudioPage(JSONArray jsonArray, JSONObject catalog) throws JSONException {
for (int i = 0; i < jsonArray.length(); i++) { for (int i = 0; i < jsonArray.length(); i++) {
var item = jsonArray.optJSONObject(i); var item = jsonArray.optJSONObject(i);
@@ -165,12 +165,12 @@ public class TracklistInjector {
boolean noPlaylists = hasNoPlaylists(blocks); boolean noPlaylists = hasNoPlaylists(blocks);
if (noPlaylists) { if (noPlaylists) {
PlaylistHelper.addCachedPlaylists(new JSONArray()); PlaylistHelper.addCachedPlaylists(catalogNode.optJSONArray("playlists"), true);
firstSection.put("blocks", createNewBlocks(blocks)); firstSection.put("blocks", createNewBlocks(blocks));
} else { } else {
try { try {
PlaylistHelper.addCachedPlaylists(catalogNode.optJSONArray("playlists")); PlaylistHelper.addCachedPlaylists(catalogNode.optJSONArray("playlists"), false);
updatePlaylistsIds(blocks); updatePlaylistsIds(blocks);
} catch (Exception e) { } catch (Exception e) {
@@ -270,7 +270,7 @@ public class TracklistInjector {
return new JSONObject() return new JSONObject()
.put("catalog", catalog) .put("catalog", catalog)
.put("playlists", addCachedPlaylists(new JSONArray())) .put("playlists", addCachedPlaylists(new JSONArray(), false))
.put("audios", TracklistHelper.tracksToJsons(tracks)); .put("audios", TracklistHelper.tracksToJsons(tracks));
} }
@@ -23,8 +23,12 @@ public class PlaylistHelper {
} }
} }
public static JSONArray addCachedPlaylists(JSONArray jsonArray) { public static JSONArray addCachedPlaylists(JSONArray jsonArray, Boolean noPlaylists) {
try { try {
if (noPlaylists) {
jsonArray.put(new JSONArray());
}
if (!PlaylistCacheDbDelegate.isPlaylistEmpty(AndroidUtils.getGlobalContext(), AccountManagerUtils.getUserId() + "_-1")) { if (!PlaylistCacheDbDelegate.isPlaylistEmpty(AndroidUtils.getGlobalContext(), AccountManagerUtils.getUserId() + "_-1")) {
jsonArray.put(getCachedSongsPlaylist()); jsonArray.put(getCachedSongsPlaylist());
} }
View File
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -474,7 +474,7 @@
invoke-virtual {p1, v1, v0}, Ljava/net/HttpURLConnection;->setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V invoke-virtual {p1, v1, v0}, Ljava/net/HttpURLConnection;->setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V
.line 15 .line 15
const-string v0, "48761EEF50EE53AFC4CC9C5F10E6BDE7F8F5B82F" const-string v0, "C8EAB7342DA62B4A229E1BFDEB27B029DD6788A1"
const-string v1, "X-Android-Cert" const-string v1, "X-Android-Cert"
@@ -194,8 +194,6 @@
move-result v0 move-result v0
const v0, 0x0
if-eqz v0, :cond_2 if-eqz v0, :cond_2
const/4 v0, 0x1 const/4 v0, 0x1
@@ -35,7 +35,7 @@
const-string v0, "func_v" const-string v0, "func_v"
const/16 v1, 0x25 const/16 v1, 0x1b
.line 3 .line 3
invoke-virtual {p0, v0, v1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; invoke-virtual {p0, v0, v1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest;
@@ -39,7 +39,7 @@
.line 3 .line 3
invoke-virtual {p0, v0, p1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; invoke-virtual {p0, v0, p1}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest;
const/16 v0, 0x17 const/16 v0, 0xb
const-string v1, "func_v" const-string v1, "func_v"
@@ -476,89 +476,89 @@
invoke-direct {v2}, Landroid/util/SparseArray;-><init>()V invoke-direct {v2}, Landroid/util/SparseArray;-><init>()V
# const-string v4, "cities" const-string v4, "cities"
# .line 20 .line 20
# invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; invoke-virtual {v1, v4}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
# move-result-object v4 move-result-object v4
# const/4 v9, 0x0 const/4 v9, 0x0
# .line 21 .line 21
# :goto_3 :goto_3
# invoke-virtual {v4}, Lorg/json/JSONArray;->length()I invoke-virtual {v4}, Lorg/json/JSONArray;->length()I
# move-result v10 move-result v10
const-string v11, "title" const-string v11, "title"
# if-ge v9, v10, :cond_4 if-ge v9, v10, :cond_4
# .line 22 .line 22
# invoke-virtual {v4, v9}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; invoke-virtual {v4, v9}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject;
# move-result-object v10 move-result-object v10
# .line 23 .line 23
# invoke-virtual {v10, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I invoke-virtual {v10, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
# move-result v12 move-result v12
# invoke-virtual {v10, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; invoke-virtual {v10, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
# move-result-object v10 move-result-object v10
# invoke-virtual {v2, v12, v10}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V invoke-virtual {v2, v12, v10}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V
# add-int/lit8 v9, v9, 0x1 add-int/lit8 v9, v9, 0x1
# goto :goto_3 goto :goto_3
# .line 24 .line 24
# :cond_4 :cond_4
# new-instance v4, Landroid/util/SparseArray; new-instance v4, Landroid/util/SparseArray;
# invoke-direct {v4}, Landroid/util/SparseArray;-><init>()V invoke-direct {v4}, Landroid/util/SparseArray;-><init>()V
# const-string v9, "cities" const-string v9, "cities"
# .line 25 .line 25
# invoke-virtual {v1, v9}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray; invoke-virtual {v1, v9}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
# move-result-object v9 move-result-object v9
# const/4 v10, 0x0 const/4 v10, 0x0
# .line 26 .line 26
# :goto_4 :goto_4
# invoke-virtual {v9}, Lorg/json/JSONArray;->length()I invoke-virtual {v9}, Lorg/json/JSONArray;->length()I
# move-result v12 move-result v12
# if-ge v10, v12, :cond_5 if-ge v10, v12, :cond_5
# .line 27 .line 27
# invoke-virtual {v9, v10}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject; invoke-virtual {v9, v10}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject;
# move-result-object v12 move-result-object v12
# .line 28 .line 28
# invoke-virtual {v12, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I invoke-virtual {v12, v3}, Lorg/json/JSONObject;->getInt(Ljava/lang/String;)I
# move-result v13 move-result v13
# invoke-virtual {v12, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String; invoke-virtual {v12, v11}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
# move-result-object v12 move-result-object v12
# invoke-virtual {v4, v13, v12}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V invoke-virtual {v4, v13, v12}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V
# add-int/lit8 v10, v10, 0x1 add-int/lit8 v10, v10, 0x1
# goto :goto_4 goto :goto_4
# :cond_5 :cond_5
const-string v4, "can_write_private_message" const-string v4, "can_write_private_message"
.line 29 .line 29
@@ -285,8 +285,7 @@
const-string p1, "func_v" const-string p1, "func_v"
#upgrade func_v to 0x16 to fix issue related with outdated gettings of post topics const/16 v0, 0x15
const/16 v0, 0x16
.line 9 .line 9
invoke-virtual {p0, p1, v0}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest; invoke-virtual {p0, p1, v0}, Lcom/vk/api/base/ApiRequest;->b(Ljava/lang/String;I)Lcom/vk/api/base/ApiRequest;
@@ -386,7 +385,6 @@
.end annotation .end annotation
.end param .end param
const/4 v0, 0x0 const/4 v0, 0x0
:try_start_0 :try_start_0
@@ -505,22 +503,18 @@
iput-object v1, v3, Lcom/vtosters/lite/api/execute/GetWallInfo$a;->e:Lcom/vk/auth/api/AccountPhoneVerify; iput-object v1, v3, Lcom/vtosters/lite/api/execute/GetWallInfo$a;->e:Lcom/vk/auth/api/AccountPhoneVerify;
invoke-static {v3}, Lru/vtosters/hooks/PostTopicsHook;->hook(Lcom/vtosters/lite/api/execute/GetWallInfo$a;)V const-string v1, "post_topics"
# const-string v1, "post_topics" .line 17
invoke-virtual {p1, v1}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
# .line 17 move-result-object v1
# invoke-virtual {p1, v1}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
# move-result-object v1 invoke-static {v1}, Lcom/vk/dto/newsfeed/PostTopic;->a(Lorg/json/JSONArray;)Ljava/util/List;
# invoke-static {v1}, Lcom/vk/dto/newsfeed/PostTopic;->a(Lorg/json/JSONArray;)Ljava/util/List;
# move-result-object v1
# iput-object v1, v3, Lcom/vtosters/lite/api/execute/GetWallInfo$a;->f:Ljava/util/List;
move-result-object v1
iput-object v1, v3, Lcom/vtosters/lite/api/execute/GetWallInfo$a;->f:Ljava/util/List;
const-string v1, "special_events" const-string v1, "special_events"