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
gdlbo adc5bb2b8c some more global renames 2024-03-29 15:16:33 +03:00
gdlbo 34f49a9b42 fixed rename in wall 2024-03-29 15:12:56 +03:00
gdlbo 84ad75e948 fixed disabler for playlist catalog 2024-03-29 13:45:28 +03:00
gdlbo e049b5f989 Update OEMDetector.java 2024-03-29 13:41:55 +03:00
Artur Skubei 5de52ed6b5 Rename Profiles/Groups v2 (#1596) 2024-03-29 13:38:30 +03:00
gdlbo 46c4f1c6dc hyperos support + gms refactored 2024-03-29 13:37:25 +03:00
gdlbo 126f5259d1 fixes 2024-03-29 10:47:18 +03:00
gdlbo 2d1867197f fixes of sponsorpost sdk
also added force update of filters
2024-03-28 22:20:07 +03:00
gdlbo c1d4216416 music stats catalog disabler 2024-03-28 20:16:39 +03:00
gdlbo 0f45a8d175 Update strings.xml 2024-03-28 20:10:08 +03:00
gdlbo 15ed01b4d3 fixed cache playlist shuffle 2024-03-28 20:05:10 +03:00
aliveoutside 41763a4b54 master.m3u8 fix 2024-03-26 22:59:32 +03:00
gdlbo d98d81f105 fixed autocache text dialog with dark theme 2024-03-26 17:47:10 +03:00
Artur Skubei 899554a571 Music autocaching v2 (#1591) 2024-03-26 17:36:34 +03:00
Artur Skubei 87b1a89bd8 Video metrics impl (#1590) 2024-03-25 23:45:42 +03:00
gdlbo c2b51338e8 Update MusicFragment.java 2024-03-24 22:55:58 +03:00
gdlbo 1d03182a1f fixed pause for music track stats 2024-03-24 22:40:01 +03:00
Artur Skubei bbad64c0aa Music metrics impl for recommendations (#1587) 2024-03-24 22:00:26 +03:00
Artur Skubei 53081115cc Fixed bypass online in profiles and messages (#1584) 2024-03-21 21:40:49 +03:00
53 changed files with 1498 additions and 3095 deletions
@@ -0,0 +1,336 @@
package com.vk.libvideo;
import android.os.Bundle;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import com.vk.bridges.StatisticsBridge1;
import com.vk.dto.common.VideoFile;
import com.vk.media.player.PlayerTypes;
import com.vk.navigation.NavigatorKeys;
import com.vk.statistic.Statistic;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.utils.Metrics;
import java.util.Locale;
import java.util.Objects;
/* loaded from: classes3.dex */
public class VideoTracker {
private final VideoFile a;
/* renamed from: b reason: collision with root package name */
private Statistic f15638b;
/* renamed from: c reason: collision with root package name */
private String f15639c;
/* renamed from: d reason: collision with root package name */
private String f15640d;
/* renamed from: e reason: collision with root package name */
private final boolean f15641e;
/* renamed from: f reason: collision with root package name */
private int f15642f = -1;
private final int g;
private final int h;
private final int i;
private final int j;
private final int k;
private int l;
private PlayerType m;
private Screen n;
/* loaded from: classes3.dex */
public enum FullscreenTransition {
TAP,
SCREEN_ROTATION
}
/* loaded from: classes3.dex */
public enum PlayerType {
INLINE,
CAROUSEL,
FULLSCREEN
}
/* loaded from: classes3.dex */
public enum ResizeAction {
BUTTON,
GESTURE
}
/* loaded from: classes3.dex */
public enum RewindType {
SLIDER,
DOUBLE_TAP
}
/* loaded from: classes3.dex */
public enum Screen {
INLINE,
CAROUSEL,
PORTRAIT,
LANDSCAPE
}
public VideoTracker(VideoFile videoFile, @Nullable Statistic statistic, String str, boolean z, @Nullable String str2) {
this.a = videoFile;
this.f15638b = statistic;
int i = videoFile.d;
this.g = (int) (i * 0.25f);
this.h = (int) (i * 0.5f);
this.i = (int) (i * 0.75f);
this.j = (int) (i * 0.95f);
this.k = i - 1;
this.f15639c = str;
this.f15641e = z;
this.f15640d = str2;
}
private static boolean a(int i, int i2, int i3) {
return i3 > i && i3 <= i2;
}
public void a(String str) {
this.f15640d = str;
}
public boolean b() {
return this.f15638b != null;
}
public void c() {
this.f15642f = -1;
}
public void d() {
c("video_fullscreen_off");
}
public void e() {
c("video_fullscreen_on");
}
public void f() {
c("video_pause");
c("pause", "pause");
}
public void g() {
c("video_resume");
c("pause", "resume");
}
public void h() {
c("video_volume_off");
c("volume", "off");
}
public void i() {
c("video_volume_on");
c("volume", "on");
}
private void c(String str, String str2) {
a(b(str, str2));
}
public String a() {
return this.f15640d;
}
public void b(String str) {
if (Objects.equals(this.f15639c, str)) {
return;
}
this.f15639c = str;
}
private void c(String str) {
if (this.f15638b != null) {
StatisticsBridge1.a().a(this.f15638b, str);
}
}
public void a(@Nullable Statistic statistic) {
this.f15638b = statistic;
}
private Bundle b(String str, String str2) {
Bundle bundle = new Bundle();
bundle.putString(NotificationCompat.CATEGORY_EVENT, str);
bundle.putString("value", str2);
bundle.putInt("position", this.f15642f);
return bundle;
}
public void a(PlayerType playerType) {
if (this.m != playerType) {
this.m = playerType;
}
}
public void a(int i, int i2) {
int i3 = this.f15642f;
if (i == i3) {
return;
}
if (a(i3, i, 0)) {
a("start", i2);
c("video_start");
}
// if (this.a.d > 0) {
// if (a(this.f15642f, i, 3)) {
// a("3s", i2);
// c("video_play_3s");
// }
// if (a(this.f15642f, i, 10)) {
// a("10s", i2);
// c("video_play_10s");
// }
// if (a(this.f15642f, i, this.g)) {
// a("25", i2);
// c("video_play_25");
// }
// if (a(this.f15642f, i, this.h)) {
// a("50", i2);
// c("video_play_50");
// }
// if (a(this.f15642f, i, this.i)) {
// a("75", i2);
// c("video_play_75");
// }
// if (a(this.f15642f, i, this.j)) {
// a("95", i2);
// c("video_play_95");
// }
// if (a(this.f15642f, i, this.k)) {
// a("100", i2);
// c("video_play_100");
// }
// }
this.f15642f = i;
}
public void a(int i) {
a("continue", i);
c("video_start");
}
public void a(@NonNull Screen screen) {
if (this.n != screen) {
this.n = screen;
c("screen", screen.toString().toLowerCase());
}
}
public void a(@NonNull FullscreenTransition fullscreenTransition) {
c("full_screen_transition", fullscreenTransition.toString().toLowerCase());
}
public void a(int i, boolean z) {
if (this.l != i) {
this.l = i;
c(z ? "auto_quality" : "quality", PlayerTypes.c(i));
}
}
public void a(@Nullable String str, boolean z) {
String str2 = z ? "auto_subtitles" : "subtitles";
if (str == null) {
str = "off";
}
c(str2, str);
}
public void a(int i, int i2, @NonNull RewindType rewindType) {
Bundle b2 = b("rewind", i <= i2 ? "forward" : "backward");
b2.putString("rewind_type", rewindType.toString().toLowerCase());
b2.putInt("rewind_start", i);
b2.putInt("rewind_end", i2);
a(b2);
}
public void a(float f2) {
String format;
if (f2 == 1.0f) {
format = "normal";
} else {
int i = (int) f2;
format = f2 == ((float) i) ? String.format(Locale.US, "%s", i) : String.format(Locale.US, "%.2f", f2);
}
c("speed", format);
}
public void a(boolean z, @NonNull ResizeAction resizeAction) {
Bundle b2 = b("resize", z ? "widen" : "narrow");
b2.putString("resize_action", resizeAction.toString().toLowerCase());
a(b2);
}
public void a(String str, String str2) {
Bundle bundle = new Bundle();
bundle.putString("link_type", str);
bundle.putString("value", str2);
bundle.putString(NotificationCompat.CATEGORY_EVENT, "show_link");
a(bundle);
}
private void a(String str, int i) {
Bundle bundle = new Bundle();
bundle.putString("autoplay", this.f15641e ? "1" : "0");
bundle.putString("position", str);
if (i >= 0) {
bundle.putInt("quality", i - 2);
}
PlayerType playerType = this.m;
if (playerType != null) {
bundle.putString("player_type", playerType.toString().toLowerCase());
}
a("video_play", bundle);
}
private void a(Bundle bundle) {
a("video_event", bundle);
}
private void a(String str, Bundle bundle) {
bundle.putString("video_id", this.a.a + "_" + this.a.b);
bundle.putString(NavigatorKeys.V, this.f15639c);
bundle.putString(NavigatorKeys.Z, this.f15639c);
if (!TextUtils.isEmpty(this.f15640d)) {
bundle.putString("context", this.f15640d);
}
if (!TextUtils.isEmpty(this.a.l0)) {
bundle.putString(NavigatorKeys.l0, this.a.l0);
}
bundle.putLong("ts", System.currentTimeMillis());
StatisticsBridge1.a().a(str, bundle);
if (Preferences.getBoolValue("sendVideoMetrics", true) && str.equals("video_play")) {
try {
sendMetrics(str);
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}
public void sendMetrics(String event) throws JSONException {
JSONObject jsonObject = new JSONObject();
jsonObject.put("e", event);
jsonObject.put("source", this.f15639c);
jsonObject.put("ref", this.f15639c);
jsonObject.put("video_id", this.a.a + "_" + this.a.b);
jsonObject.put("position", "start");
jsonObject.put("position_sec", 0);
jsonObject.put("cur_quality", "auto");
Metrics.trackEvents(jsonObject, false);
}
}
@@ -0,0 +1,256 @@
package com.vk.music.stats;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.NotificationCompat;
import com.vk.core.extensions.StringExt;
import com.vk.music.common.MusicPlaybackLaunchContext;
import com.vk.music.logger.MusicLogger;
import com.vk.music.stats.i.MusicPlaybackParams;
import com.vk.navigation.NavigatorKeys;
import com.vtosters.lite.data.Analytics;
import kotlin.jvm.b.Functions2;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.utils.Metrics;
import java.util.Objects;
import java.util.UUID;
public final class VKMusicStatsTracker implements MusicStatsTracker {
private String a;
private final Functions2<String, Analytics.l> b;
private static final a c = new a();
public VKMusicStatsTracker(Functions2<String, Analytics.l> functions2) {
this.b = functions2;
}
private String e(MusicPlaybackParams musicPlaybackParams) {
String g = musicPlaybackParams.g();
if (g == null) {
g = this.a;
}
if (g == null) {
g = "auto";
}
this.a = g;
return g;
}
@Override
public void a(boolean z) {
MusicStatsTracker.a.a(this, z);
}
@Override
public void b(MusicPlaybackParams musicPlaybackParams) {
c.a(a(musicPlaybackParams, "music_start_playback"));
if (Preferences.sendMusicMetrics()) {
try {
makeMetricsRequest(musicPlaybackParams, "music_start_playback");
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void b(boolean z) {
}
@Override
public void c(MusicPlaybackParams musicPlaybackParams) {
MusicStatsTracker.a.b(this, musicPlaybackParams);
}
@Override
public void d() {
MusicStatsTracker.a.a(this);
}
@Override
public void a(Intent intent, String str) {
MusicStatsTracker.a.a(this, intent, str);
}
@Override
public void b(String str, @NonNull String str2) {
Analytics.l invoke = this.b.invoke("music_subscription_action");
invoke.a("popup", str);
invoke.a("action", str2);
c.a(invoke);
}
@Override
public void c(boolean z) {
MusicStatsTracker.a.b(this, z);
}
@Override
public void d(MusicPlaybackParams musicPlaybackParams) {
if (Objects.equals("pause", this.a)) {
a(musicPlaybackParams);
}
}
@Override
public void a(long j) {
MusicStatsTracker.a.a(this, j);
}
@Override
public void c() {
Analytics.l invoke = this.b.invoke("music_subscription_push");
invoke.a("action", "open");
c.a(invoke);
}
@Override
public void a(String str, MusicStatsRefer musicStatsRefer) {
Analytics.l invoke = this.b.invoke("music_subscription_show");
invoke.a("popup", str);
c.a(invoke);
}
@Override
public void b() {
Analytics.l invoke = this.b.invoke("music_subscription_push");
invoke.a("action", "send");
c.a(invoke);
}
@Override
public void a(MusicPlaybackParams musicPlaybackParams) {
c.a(a(musicPlaybackParams, "music_stop_playback"));
if (Preferences.sendMusicMetrics()) {
try {
makeMetricsRequest(musicPlaybackParams, "music_stop_playback");
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void a(PlayerStateChangedParams playerStateChangedParams) {
Analytics.l invoke = this.b.invoke("audio_player");
invoke.a(NavigatorKeys.t0, playerStateChangedParams.a());
invoke.a("prev_state", playerStateChangedParams.c());
invoke.a("duration", playerStateChangedParams.b());
c.a(invoke);
}
@Override
public void b(String str) {
Analytics.l invoke = this.b.invoke("music_subscription_free_displayed");
invoke.a("popup", str);
c.a(invoke);
}
@Override
public void a(String str) {
Analytics.l invoke = this.b.invoke("playlist_start");
invoke.a(NavigatorKeys.e, str);
c.a(invoke);
}
private void makeMetricsRequest(MusicPlaybackParams musicPlaybackParams, String str) throws JSONException {
JSONObject event = new JSONObject();
if (str.equals("music_stop_playback")) {
event.put("e", str);
event.put("audio_id", musicPlaybackParams.c());
event.put("duration", musicPlaybackParams.a());
event.put("start_time", musicPlaybackParams.i());
event.put("shuffle", "false");
event.put("reason", "new");
event.put("state", "app");
event.put("duration", musicPlaybackParams.a());
} else {
event.put("e", str);
event.put("audio_id", musicPlaybackParams.c());
event.put("start_time", musicPlaybackParams.i());
event.put("shuffle", "false");
event.put("reason", "auto");
event.put("state", "app");
if (StringExt.a((CharSequence) musicPlaybackParams.e())) {
event.put("prev_audio_id", musicPlaybackParams.e());
}
}
Metrics.trackEvents(event, true);
}
private Analytics.l a(MusicPlaybackParams musicPlaybackParams, String str) {
Analytics.l invoke = this.b.invoke(str);
invoke.a("audio_id", musicPlaybackParams.c());
invoke.a("uuid", UUID.randomUUID().hashCode());
invoke.a("shuffle", musicPlaybackParams.l());
invoke.a("reason", e(musicPlaybackParams));
invoke.a("start_time", musicPlaybackParams.i());
invoke.a("playback_started_at", musicPlaybackParams.d());
invoke.a(NavigatorKeys.l0, musicPlaybackParams.j());
if (!Objects.equals("music_start_playback", str)) {
invoke.a("duration", musicPlaybackParams.a());
}
int i = h.$EnumSwitchMapping$0[musicPlaybackParams.b().ordinal()];
if (i == 1) {
invoke.a("repeat", "one");
} else if (i == 2) {
invoke.a("repeat", "all");
}
invoke.a(NavigatorKeys.t0, musicPlaybackParams.m());
MusicPlaybackLaunchContext h = musicPlaybackParams.h();
invoke.a(NavigatorKeys.V, h.v0());
if (h.v1()) {
invoke.a("playlist_id", h.u1());
}
if (h.i(4) || h.i(8)) {
invoke.a("expanded", h.i(4));
}
if (StringExt.a((CharSequence) musicPlaybackParams.e())) {
invoke.a("prev_audio_id", musicPlaybackParams.e());
}
if (StringExt.a((CharSequence) musicPlaybackParams.f())) {
invoke.a("prev_playlist_id", musicPlaybackParams.f());
}
return invoke;
}
@Override
public void a(String str, String str2) {
boolean a2 = Objects.equals("success", str2);
Analytics.l builder = this.b.invoke("music_subscription_purchase_result");
builder.a("popup", str);
builder.a(NotificationCompat.CATEGORY_STATUS, a2 ? "success" : "fail");
if (!a2) {
builder.a("reason", str2);
}
c.a(builder);
}
@Override
public void a() {
Analytics.l invoke = this.b.invoke("music_subscription");
invoke.a("popup", "background_v2");
invoke.a("action", "link");
c.a(invoke);
}
public static final class a {
private a() {
}
@VisibleForTesting
public void a(Analytics.l lVar) {
MusicLogger.a("MusicStats", "[VK_TRACKER]", lVar);
lVar.b();
}
}
}
@@ -11,37 +11,37 @@ import com.vtosters.lite.R;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
public class GmsHook { public class GmsHook {
private static final boolean needToSpoof = !isGmsInstalled() && (isFakeGmsInstalled() || isFakeGms2Installed()); private static final String[] spoofPackages = {"com.mgoogle", "app.revanced"};
private static final String currentGms;
static {
currentGms = getSpoofPackagePrefix();
}
private static boolean isPackageInstalled(String packageName) {
try {
AndroidUtils.getGlobalContext().getPackageManager().getPackageInfo(packageName, 0);
return true;
} catch (Exception unused) {
return false;
}
}
public static boolean isGmsInstalled() { public static boolean isGmsInstalled() {
try { return isPackageInstalled("com.google.android.gms");
AndroidUtils.getGlobalContext().getPackageManager().getPackageInfo("com.google.android.gms", 0); }
return true;
} catch (Exception unused) {
return false;
}
} // Google Market Services check
public static boolean isFakeGmsInstalled() { public static boolean isSpoofPackageInstalled(String packageName) {
try { return isPackageInstalled(packageName + ".android.gms");
AndroidUtils.getGlobalContext().getPackageManager().getPackageInfo("com.mgoogle.android.gms", 0); }
return true;
} catch (Exception unused) {
return false;
}
} // Microg Google Market Services check
public static boolean isFakeGms2Installed() {
try {
AndroidUtils.getGlobalContext().getPackageManager().getPackageInfo("app.revanced.android.gms", 0);
return true;
} catch (Exception unused) {
return false;
}
} // Microg Google Market Services check
public static boolean isAnyServicesInstalled() { public static boolean isAnyServicesInstalled() {
return isGmsInstalled() || isFakeGmsInstalled() || isFakeGms2Installed(); for (String packageName : spoofPackages) {
if (isSpoofPackageInstalled(packageName)) {
return true;
}
}
return false;
} }
public static void fixGapps() { public static void fixGapps() {
@@ -52,10 +52,10 @@ public class GmsHook {
notificationManager.createNotificationChannel(new NotificationChannel("audio_playback_channel", AndroidUtils.getResources().getString(R.string.audio_message_play_error), NotificationManager.IMPORTANCE_LOW)); notificationManager.createNotificationChannel(new NotificationChannel("audio_playback_channel", AndroidUtils.getResources().getString(R.string.audio_message_play_error), NotificationManager.IMPORTANCE_LOW));
} }
} }
} // Music channels fix }
public static String replaceGMSPackage(String str) { public static String replaceGMSPackage(String str) {
return needToSpoof ? str.replaceAll("com.google", (isFakeGms2Installed() ? "app.revanced" : "com.mgoogle")) : str; return shouldSpoof() ? str.replaceAll("com.google", currentGms) : str;
} }
public static String getFirebaseInstanceIdReceiver() { public static String getFirebaseInstanceIdReceiver() {
@@ -63,6 +63,37 @@ public class GmsHook {
} }
public static Class getFirebaseInstanceIdReceiverClass() { public static Class getFirebaseInstanceIdReceiverClass() {
return needToSpoof ? (isFakeGms2Installed() ? FirebaseInstanceIdReceiver3.class : FirebaseInstanceIdReceiver2.class) : FirebaseInstanceIdReceiver.class; return getSpoofFirebaseInstanceIdReceiverClass();
} }
}
public static String getCurrentGms() {
return currentGms;
}
private static boolean shouldSpoof() {
return !isGmsInstalled() && (isSpoofPackageInstalled("com.mgoogle") || isSpoofPackageInstalled("app.revanced"));
}
private static String getSpoofPackagePrefix() {
for (String packageName : spoofPackages) {
if (isSpoofPackageInstalled(packageName)) {
return packageName;
}
}
return "com.google";
}
private static Class getSpoofFirebaseInstanceIdReceiverClass() {
switch (currentGms) {
case "com.mgoogle" -> {
return FirebaseInstanceIdReceiver2.class;
}
case "app.revanced" -> {
return FirebaseInstanceIdReceiver3.class;
}
default -> {
return FirebaseInstanceIdReceiver.class;
}
}
}
}
@@ -1,7 +1,10 @@
package ru.vtosters.hooks; package ru.vtosters.hooks;
import android.util.Log; import android.util.Log;
import android.util.SparseArray;
import com.vk.core.network.Network; import com.vk.core.network.Network;
import com.vk.im.engine.internal.api_parsers.UserApiParser;
import com.vk.im.engine.models.users.User;
import com.vtosters.lite.R; import com.vtosters.lite.R;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;
@@ -10,8 +13,6 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import ru.vtosters.hooks.other.Preferences; import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.proxy.ProxyUtils;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import java.io.IOException; import java.io.IOException;
@@ -146,16 +147,36 @@ public class OnlineFormatterHook {
return json; return json;
} }
public static JSONArray onlineHookList(JSONArray jsonArr) { public static SparseArray<User> onlineHookList(String str) {
if (!getBoolValue("onlinefix", false) || Preferences.serverFeaturesDisable()) return jsonArr; JSONArray jSONArray;
try { try {
JsonInjectors.setOnlineInfoUsers(jsonArr); jSONArray = new JSONObject(str).getJSONArray("response");
} catch (Exception e) { } catch (JSONException e) {
Log.e("onlineHookProfiles", e.getMessage()); throw new RuntimeException(e);
}
SparseArray<User> sparseArray = new SparseArray<>(jSONArray.length());
int length = jSONArray.length();
if (getBoolValue("onlinefix", false) || !Preferences.serverFeaturesDisable()) {
try {
jSONArray = JsonInjectors.setOnlineInfoUsers(jSONArray);
} catch (JSONException e) {
throw new RuntimeException(e);
}
} }
return jsonArr; for (int i = 0; i < length; i++) {
JSONObject jSONObject;
try {
jSONObject = jSONArray.getJSONObject(i);
} catch (JSONException e) {
throw new RuntimeException(e);
}
User b = UserApiParser.b(jSONObject);
sparseArray.put(b.getId(), b);
}
return sparseArray;
} }
public static JSONObject onlineHookProfiles(JSONObject json) { public static JSONObject onlineHookProfiles(JSONObject json) {
@@ -188,19 +209,19 @@ public class OnlineFormatterHook {
try { try {
JsonInjectors.setOnlineInfoUsers(json.optJSONObject("read_requests").optJSONArray("items")); JsonInjectors.setOnlineInfoUsers(json.optJSONObject("read_requests").optJSONArray("items"));
} catch (Exception e) { } catch (Exception e) {
Log.e("onlineHookItems", e.getMessage()); Log.e("onlineHookItemsRec", e.getMessage());
} }
try { try {
JsonInjectors.setOnlineInfoUsers(json.optJSONObject("recommendations").optJSONArray("items")); JsonInjectors.setOnlineInfoUsers(json.optJSONObject("recommendations").optJSONArray("items"));
} catch (Exception e) { } catch (Exception e) {
Log.e("onlineHookItems", e.getMessage()); Log.e("onlineHookItemsRec", e.getMessage());
} }
try { try {
JsonInjectors.setOnlineInfoUsers(json.optJSONArray("profiles")); JsonInjectors.setOnlineInfoUsers(json.optJSONArray("profiles"));
} catch (Exception e) { } catch (Exception e) {
Log.e("onlineHookItems", e.getMessage()); Log.e("onlineHookItemsRec", e.getMessage());
} }
return json; return json;
@@ -1,29 +1,40 @@
package ru.vtosters.hooks; package ru.vtosters.hooks;
import androidx.core.util.Pair;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.utils.RenameTool;
public class RenameHook { public class RenameHook {
public static void injectIntoJson(JSONObject obj) throws JSONException { public static void injectIntoJson(JSONObject obj) throws JSONException {
// int i = obj.getInt("id"); if (isEnabled()) {
// if (RenameTool.updateRequested) { int i = obj.getInt("id");
// RenameTool.reloadDB(); if (RenameTool.updateRequested) {
// } RenameTool.reloadDB();
// }
// Pair<String, String> user = RenameTool.renamedUsers.get(i);
// if (user == null) return; Pair<String, String> user = RenameTool.renamedUsers.get(i);
// obj.put(RenameTool.COLUMN_FIRSTNAME, user.first).put(RenameTool.COLUMN_LASTNAME, user.second); if (user == null) return;
obj.put(RenameTool.COLUMN_FIRSTNAME, user.first).put(RenameTool.COLUMN_LASTNAME, user.second);
}
}
public static boolean isEnabled() {
return Preferences.getBoolValue("unstableNameChanger", true);
} }
public static void injectIntoJsonGroup(JSONObject obj) throws JSONException { public static void injectIntoJsonGroup(JSONObject obj) throws JSONException {
// int i = obj.getInt("id"); if (isEnabled()) {
// int i = obj.getInt("id");
// if (RenameTool.updateRequested) {
// RenameTool.reloadDB(); if (RenameTool.updateRequested) {
// } RenameTool.reloadDB();
// }
// String user = RenameTool.renamedGroups.get(i);
// if (user == null) return; String user = RenameTool.renamedGroups.get(i);
// obj.put("name", user); if (user == null) return;
obj.put("name", user);
}
} }
} }
@@ -42,9 +42,15 @@ public class CatalogJsonInjector {
removeUnsupportedLayouts(blocks); removeUnsupportedLayouts(blocks);
fetchCatalogId("https://vk.com/audio?section=my_playlists", oldItems); if (Preferences.getBoolValue("playlistsCatalogs", true)) {
fetchCatalogId("https://vk.com/audio?section=my_playlists", oldItems);
fetchCatalogId("https://vk.com/audio?section=albums", oldItems); fetchCatalogId("https://vk.com/audio?section=albums", oldItems);
}
if (Preferences.sendMusicMetrics() && Preferences.getBoolValue("playStatCatalog", false)) {
fetchCatalogId("https://vk.com/audio?section=recent", oldItems);
}
setDefaultAudioPage(oldItems, catalog); setDefaultAudioPage(oldItems, catalog);
} }
@@ -15,6 +15,7 @@ import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.MusicCacheImpl; import ru.vtosters.lite.music.cache.MusicCacheImpl;
import ru.vtosters.lite.music.cache.helpers.PlaylistHelper; import ru.vtosters.lite.music.cache.helpers.PlaylistHelper;
import ru.vtosters.lite.music.cache.helpers.TracklistHelper; import ru.vtosters.lite.music.cache.helpers.TracklistHelper;
import ru.vtosters.lite.utils.AccountManagerUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -36,8 +37,10 @@ public class PlaylistInjector {
public static Observable<AudioGetPlaylist.c> injectGetPlaylist(AudioGetPlaylist audioGetPlaylist) { public static Observable<AudioGetPlaylist.c> injectGetPlaylist(AudioGetPlaylist audioGetPlaylist) {
try { try {
if (MusicCacheImpl.isEmpty()) if (MusicCacheImpl.isEmpty()) {
return null; return null;
}
var requestArgs = audioGetPlaylist.b(); var requestArgs = audioGetPlaylist.b();
var id = requestArgs.get("id"); var id = requestArgs.get("id");
@@ -45,9 +48,11 @@ public class PlaylistInjector {
var accessKey = requestArgs.get("access_key"); var accessKey = requestArgs.get("access_key");
boolean isVirtualPlaylist = accessKey != null && (accessKey.equals("cache")); boolean isVirtualPlaylist = accessKey != null && (accessKey.equals("cache"));
boolean isAlbumVirtualPlaylist = accessKey != null && (accessKey.equals("cacheAlbum")); boolean isAlbumVirtualPlaylist = accessKey != null && (accessKey.equals("cacheAlbum"));
boolean isOwnCachePlaylist = Objects.equals(ownerId, String.valueOf(AccountManagerUtils.getUserId())) && Objects.equals(id, "-1");
if (TextUtils.isEmpty(id) || (!isVirtualPlaylist && !isAlbumVirtualPlaylist)) if (TextUtils.isEmpty(id) || (!isVirtualPlaylist && !isAlbumVirtualPlaylist)) {
return null; return null;
}
return Observable.a((ObservableOnSubscribe<AudioGetPlaylist.c>) observableEmitter -> { return Observable.a((ObservableOnSubscribe<AudioGetPlaylist.c>) observableEmitter -> {
AudioGetPlaylist.c response = new AudioGetPlaylist.c(); AudioGetPlaylist.c response = new AudioGetPlaylist.c();
@@ -81,13 +86,11 @@ public class PlaylistInjector {
return; return;
} }
response.c = (ArrayList<MusicTrack>) MusicCacheImpl.getPlaylistSongs(ownerId, id); if (isOwnCachePlaylist) {
response.c = (ArrayList<MusicTrack>) TracklistHelper.getMyCachedMusicTracks();
Log.d("Playlist", "Open playlist " + ownerId + "_" + id);
if (Objects.equals(id, "-1")) {
response.b = PlaylistHelper.createCachedPlaylistMetadata(); response.b = PlaylistHelper.createCachedPlaylistMetadata();
} else { } else {
response.c = (ArrayList<MusicTrack>) MusicCacheImpl.getPlaylistSongs(ownerId, id);
response.b = MusicCacheImpl.getPlaylist(id, ownerId); response.b = MusicCacheImpl.getPlaylist(id, ownerId);
} }
@@ -42,7 +42,7 @@ public class TracklistInjector {
Log.d("TracklistInjector", "Using vkx cache catalog"); Log.d("TracklistInjector", "Using vkx cache catalog");
observableEmitter.b(parser.c(new JSONObject(service.getCacheCatalog()))); observableEmitter.b(parser.c(new JSONObject(service.getCacheCatalog())));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.fillInStackTrace();
List<MusicTrack> tracks = new ArrayList<>(); List<MusicTrack> tracks = new ArrayList<>();
List<String> cache = service.getCache(); List<String> cache = service.getCache();
@@ -55,16 +55,14 @@ public class TracklistInjector {
observableEmitter.b(parser.c(createVirtualCatalog(tracks))); observableEmitter.b(parser.c(createVirtualCatalog(tracks)));
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.fillInStackTrace();
} }
}); });
} else { } else {
if (MusicCacheImpl.isEmpty()) { if (MusicCacheImpl.isEmpty()) {
observableEmitter.b(parser.c(getEmptyCatalog())); observableEmitter.b(parser.c(getEmptyCatalog()));
} else { } else {
observableEmitter.b(parser.c(createVirtualCatalog( observableEmitter.b(parser.c(createVirtualCatalog(TracklistHelper.getMyCachedMusicTracks())));
PlaylistCacheDbDelegate.getTracksInPlaylist(AndroidUtils.getGlobalContext(),
AccountManagerUtils.getUserId() + "_-1"))));
} }
} }
}); });
@@ -248,7 +246,7 @@ public class TracklistInjector {
.put(getCatalogPlaylist()); .put(getCatalogPlaylist());
} }
if (!MusicCacheImpl.getAllOwnTracks().isEmpty()) { if (!PlaylistCacheDbDelegate.isPlaylistEmpty(AndroidUtils.getGlobalContext(), AccountManagerUtils.getUserId() + "_-1")) {
if (MusicCacheImpl.hasPlaylist()) blocks.put(getCatalogSeparator()); if (MusicCacheImpl.hasPlaylist()) blocks.put(getCatalogSeparator());
blocks.put(getCatalogHeader(AndroidUtils.getString(R.string.cached_tracks_title))) blocks.put(getCatalogHeader(AndroidUtils.getString(R.string.cached_tracks_title)))
.put(getShuffleButton()) .put(getShuffleButton())
@@ -100,8 +100,8 @@ public class Preferences {
return getBoolValue("vkme", false); return getBoolValue("vkme", false);
} }
public static boolean autocache() { public static int autocache() {
return getBoolValue("autocache", false); return Preferences.getPreferences().getInt("autocaching", 0);
} }
public static boolean adsstories() { public static boolean adsstories() {
@@ -292,6 +292,10 @@ public class Preferences {
return getBoolValue("vkme_notifs", false); return getBoolValue("vkme_notifs", false);
} }
public static boolean sendMusicMetrics() {
return getBoolValue("sendMusicMetrics", true);
}
public static boolean screenshotdetect() { public static boolean screenshotdetect() {
return getBoolValue("screenshotdetect", true); return getBoolValue("screenshotdetect", true);
} }
@@ -115,7 +115,7 @@ public class Device {
+ "- Manufacturer: " + this.manufacturerName + "\n" + "- Manufacturer: " + this.manufacturerName + "\n"
+ "- Brand: " + this.brandName + "\n" + "- Brand: " + this.brandName + "\n"
+ "- Model: " + this.modelName + "\n" + "- Model: " + this.modelName + "\n"
+ (isMIUI() ? "- Miui Version Code: " + this.MiuiUiVersionCode + "\n" + "- Miui Version Name: " + this.MiuiUiVersionName + "\n" : "") + (isMIUI() || isHyperOs() ? "- Miui/HyperOS Version Code: " + this.MiuiUiVersionCode + "\n" + "- Miui/HyperOS Version Name: " + this.MiuiUiVersionName + "\n" : "")
+ (isSamsung() ? "- OneUi Major Version: " + this.OneUiMajorVersion + "\n" + "- OneUi Minor Version: " + this.OneUiMinorVersion + "\n" : "") + (isSamsung() ? "- OneUi Major Version: " + this.OneUiMajorVersion + "\n" + "- OneUi Minor Version: " + this.OneUiMinorVersion + "\n" : "")
+ (hasMiuiIncrCode() ? "- Miui Version Incremental Code: " + this.MiuiIncrementalCode + "\n" : "") + (hasMiuiIncrCode() ? "- Miui Version Incremental Code: " + this.MiuiIncrementalCode + "\n" : "")
+ (isEMUI() ? "- Emui Version: " + this.EmuiVersion : ""); + (isEMUI() ? "- Emui Version: " + this.EmuiVersion : "");
@@ -56,7 +56,7 @@ public class OEMDetector {
} }
public static boolean isOEM() { public static boolean isOEM() {
return isMIUI() || isEMUI() || isFlyme() || isZenUI() || isSamsung() || isVivo() || isOneUi(); return isMIUI() || isEMUI() || isFlyme() || isZenUI() || isSamsung() || isVivo() || isOneUi() || isHyperOs();
} }
public static boolean isMIUI() { public static boolean isMIUI() {
@@ -68,6 +68,15 @@ public class OEMDetector {
} }
} }
public static boolean isHyperOs() {
try {
int miuiVer = Integer.parseInt(getMiuiUiVersionCode()); // cuz hyperos gives 816 and etc
return miuiVer > 14 && isMIUI();
} catch (Exception unused) {
return false;
}
}
public static boolean isIntentResolved(Context ctx, Intent intent) { public static boolean isIntentResolved(Context ctx, Intent intent) {
return (intent != null && ctx.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null); return (intent != null && ctx.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null);
} }
@@ -124,7 +133,6 @@ public class OEMDetector {
try { try {
return (String) getPropMtd.invoke(null, prop); return (String) getPropMtd.invoke(null, prop);
} catch (Throwable e) { } catch (Throwable e) {
e.printStackTrace();
return null; return null;
} }
} }
@@ -30,6 +30,7 @@ import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.di.singleton.VtOkHttpClient; import ru.vtosters.lite.di.singleton.VtOkHttpClient;
import ru.vtosters.lite.downloaders.AudioDownloader; import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.MusicCacheImpl; import ru.vtosters.lite.music.cache.MusicCacheImpl;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.music.MusicTrackUtils; import ru.vtosters.lite.utils.music.MusicTrackUtils;
@@ -50,13 +51,14 @@ public class LastFMScrobbler {
var access_key = !TextUtils.isEmpty(musictrack.J) ? musictrack.J : ""; var access_key = !TextUtils.isEmpty(musictrack.J) ? musictrack.J : "";
var album_id = musictrack.I; var album_id = musictrack.I;
var album = album_id != null ? album_id.getTitle() : null; var album = album_id != null ? album_id.getTitle() : null;
var isOwnTrack = musictrack.e == AccountManagerUtils.getUserId();
if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) { if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) {
Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid); Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid);
return; return;
} }
if (Preferences.autocache() && !MusicCacheImpl.isCachedTrack(uid)) { if (needToCache(isOwnTrack) && !MusicCacheImpl.isCachedTrack(uid)) {
if (LibVKXClient.isIntegrationEnabled()) { if (LibVKXClient.isIntegrationEnabled()) {
LibVKXClient.getInstance().runOnService(service -> { LibVKXClient.getInstance().runOnService(service -> {
try { try {
@@ -73,6 +75,12 @@ public class LastFMScrobbler {
scrobbleTrack(duration, artist, title, uid, album); scrobbleTrack(duration, artist, title, uid, album);
} }
private static boolean needToCache(boolean isOwnTrack) {
int autocache = Preferences.autocache();
return autocache == 2 || (autocache == 1 && isOwnTrack);
}
public static void scrobbleTrack( public static void scrobbleTrack(
long duration, long duration,
String artist, String artist,
@@ -59,12 +59,12 @@ public class MusicCacheImpl {
} }
public static boolean hasPlaylist() { public static boolean hasPlaylist() {
return PlaylistCacheDbDelegate.getPlaylistsCount(AndroidUtils.getGlobalContext()) != 0; // has playlists or not return !PlaylistCacheDbDelegate.isPlaylistsDbEmpty(AndroidUtils.getGlobalContext()); // has playlists or not
} }
public static long getTracksCount() { public static long getTracksCount() {
return !LibVKXClient.isIntegrationEnabled() return !LibVKXClient.isIntegrationEnabled()
? MusicCacheDbDelegate.getTracksCount(AndroidUtils.getGlobalContext()) ? PlaylistCacheDbDelegate.getTracksCountInPlaylist(AndroidUtils.getGlobalContext(),AccountManagerUtils.getUserId() + "_-1")
: LibVKXClient.getInstance().runOnServiceSync( : LibVKXClient.getInstance().runOnServiceSync(
new LibVKXClientImpl.LibVKXActionGeneric<Long>() { new LibVKXClientImpl.LibVKXActionGeneric<Long>() {
@Override @Override
@@ -89,7 +89,7 @@ public class MusicCacheImpl {
} }
public static boolean isEmpty() { public static boolean isEmpty() {
return !LibVKXClient.isIntegrationEnabled() && getTracksCount() == 0L; return !LibVKXClient.isIntegrationEnabled() && MusicCacheDbDelegate.isEmpty(AndroidUtils.getGlobalContext());
} }
public static void clear() { public static void clear() {
@@ -174,6 +174,15 @@ public class MusicCacheDb extends SQLiteOpenHelper implements AutoCloseable { //
return DatabaseUtils.queryNumEntries(getReadableDatabase(), Constants.TABLE_NAME); return DatabaseUtils.queryNumEntries(getReadableDatabase(), Constants.TABLE_NAME);
} }
public boolean isDatabaseEmpty() {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT EXISTS(SELECT 1 FROM " + Constants.TABLE_NAME + " LIMIT 1)", null);
cursor.moveToFirst();
boolean isEmpty = cursor.getInt(0) == 0;
cursor.close();
return isEmpty;
}
public MusicTrack getTrackById(String trackId) { public MusicTrack getTrackById(String trackId) {
SQLiteDatabase db = getReadableDatabase(); SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query(Constants.TABLE_NAME, null, Constants.COLUMN_TRACK_ID + " = ?", new String[]{trackId}, null, null, null); Cursor cursor = db.query(Constants.TABLE_NAME, null, Constants.COLUMN_TRACK_ID + " = ?", new String[]{trackId}, null, null, null);
@@ -53,8 +53,7 @@ public class PlaylistCacheDb extends SQLiteOpenHelper implements AutoCloseable {
Boolean.parseBoolean(cur.getString(cur.getColumnIndex(Constants.COLUMN_IS_EXPLICIT))), Boolean.parseBoolean(cur.getString(cur.getColumnIndex(Constants.COLUMN_IS_EXPLICIT))),
cur.getString(cur.getColumnIndex(Constants.COLUMN_TITLE)), cur.getString(cur.getColumnIndex(Constants.COLUMN_TITLE)),
cur.getString(cur.getColumnIndex(Constants.COLUMN_DESCRIPTION)), cur.getString(cur.getColumnIndex(Constants.COLUMN_DESCRIPTION)),
photo, photo);
0);
Log.d("Playlist", "generated " + Playlist.U.a(playlist).v1()); Log.d("Playlist", "generated " + Playlist.U.a(playlist).v1());
@@ -170,6 +169,50 @@ public class PlaylistCacheDb extends SQLiteOpenHelper implements AutoCloseable {
return playlists; return playlists;
} }
public long getTracksCountInPlaylist(String playlistId) {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query(
Constants.TABLE_PLAYLIST_TRACKS,
new String[]{Constants.COLUMN_TRACK_ID},
Constants.COLUMN_PLAYLIST_ID + " = ?",
new String[]{playlistId},
null, null, null
);
long count = cursor.getCount();
cursor.close();
return count;
}
public List<String> getAllPlaylistIds() {
SQLiteDatabase db = getReadableDatabase();
List<String> playlistIds = new ArrayList<>();
Cursor cursor = db.query(
Constants.TABLE_NAME,
new String[]{Constants.COLUMN_ID, Constants.COLUMN_OWNER_ID},
null, null, null, null, null
);
if (cursor.moveToFirst()) {
do {
String playlistId = cursor.getString(cursor.getColumnIndexOrThrow(Constants.COLUMN_OWNER_ID)) + "_" + cursor.getString(cursor.getColumnIndexOrThrow(Constants.COLUMN_ID));
playlistIds.add(playlistId);
} while (cursor.moveToNext());
}
cursor.close();
return playlistIds;
}
public boolean isPlaylistsDbEmpty() {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT EXISTS(SELECT 1 FROM " + Constants.TABLE_NAME + " LIMIT 1)", null);
cursor.moveToFirst();
boolean isEmpty = cursor.getInt(0) == 0;
cursor.close();
return isEmpty;
}
public void addTrackToPlaylist(String playlistId, String trackId) { public void addTrackToPlaylist(String playlistId, String trackId) {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(Constants.COLUMN_PLAYLIST_ID, playlistId); values.put(Constants.COLUMN_PLAYLIST_ID, playlistId);
@@ -181,6 +224,15 @@ public class PlaylistCacheDb extends SQLiteOpenHelper implements AutoCloseable {
getWritableDatabase().delete(Constants.TABLE_PLAYLIST_TRACKS, Constants.COLUMN_PLAYLIST_ID + " = ? AND " + Constants.COLUMN_TRACK_ID + " = ?", new String[]{playlistId, trackId}); getWritableDatabase().delete(Constants.TABLE_PLAYLIST_TRACKS, Constants.COLUMN_PLAYLIST_ID + " = ? AND " + Constants.COLUMN_TRACK_ID + " = ?", new String[]{playlistId, trackId});
} }
public boolean isPlaylistEmpty(String playlistId) {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT EXISTS(SELECT 1 FROM " + Constants.TABLE_PLAYLIST_TRACKS + " WHERE " + Constants.COLUMN_PLAYLIST_ID + " = ? LIMIT 1)", new String[]{playlistId});
cursor.moveToFirst();
boolean isEmpty = cursor.getInt(0) == 0;
cursor.close();
return isEmpty;
}
public List<MusicTrack> getTracksInPlaylist(String playlistId) { public List<MusicTrack> getTracksInPlaylist(String playlistId) {
SQLiteDatabase db = getReadableDatabase(); SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query( Cursor cursor = db.query(
@@ -55,6 +55,12 @@ public class MusicCacheDbDelegate {
} }
} }
public static boolean isEmpty(Context context) {
try (var db = connectToDb(context)) {
return db.isDatabaseEmpty();
}
}
public static boolean isCachedTrack(Context context, String trackId) { public static boolean isCachedTrack(Context context, String trackId) {
try (var db = connectToDb(context)) { try (var db = connectToDb(context)) {
return db.isCachedTrack(trackId); return db.isCachedTrack(trackId);
@@ -62,6 +62,31 @@ public class PlaylistCacheDbDelegate {
} }
} }
public static long getTracksCountInPlaylist(Context context, String playlistId) {
try (var db = connectToDb(context)) {
return db.getTracksCountInPlaylist(playlistId);
}
}
public static boolean isPlaylistsDbEmpty(Context context) {
try (var db = connectToDb(context)) {
return db.isPlaylistsDbEmpty();
}
}
public static void removeAllPlaylists(Context context) {
List<String> playlistIds = getAllPlaylistIds(context);
for (String playlistId : playlistIds) {
deletePlaylist(context, playlistId);
}
}
public static List<String> getAllPlaylistIds(Context context) {
try (var db = connectToDb(context)) {
return db.getAllPlaylistIds();
}
}
public static boolean isCachedPlaylist(Context context, String id) { public static boolean isCachedPlaylist(Context context, String id) {
try (var db = connectToDb(context)) { try (var db = connectToDb(context)) {
String[] parts = id.split("_"); String[] parts = id.split("_");
@@ -112,6 +137,12 @@ public class PlaylistCacheDbDelegate {
} }
} }
public static boolean isPlaylistEmpty(Context context, String playlistId) {
try (var db = connectToDb(context)) {
return db.isPlaylistEmpty(playlistId);
}
}
public static void drop(Context context) { public static void drop(Context context) {
context.deleteDatabase(PlaylistCacheDb.Constants.DB_NAME); context.deleteDatabase(PlaylistCacheDb.Constants.DB_NAME);
} }
@@ -7,6 +7,7 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import ru.vtosters.lite.music.cache.MusicCacheImpl; import ru.vtosters.lite.music.cache.MusicCacheImpl;
import ru.vtosters.lite.music.cache.delegate.PlaylistCacheDbDelegate;
import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.NetworkUtils; import ru.vtosters.lite.utils.NetworkUtils;
@@ -25,19 +26,19 @@ public class PlaylistHelper {
public static JSONArray addCachedPlaylists(JSONArray jsonArray, Boolean noPlaylists) { public static JSONArray addCachedPlaylists(JSONArray jsonArray, Boolean noPlaylists) {
try { try {
if (noPlaylists) { if (noPlaylists) {
jsonArray.put(new JSONArray().put(getCachedSongsPlaylist())); jsonArray.put(new JSONArray());
} else { }
if (!PlaylistCacheDbDelegate.isPlaylistEmpty(AndroidUtils.getGlobalContext(), AccountManagerUtils.getUserId() + "_-1")) {
jsonArray.put(getCachedSongsPlaylist()); jsonArray.put(getCachedSongsPlaylist());
} }
for (Playlist playlist : MusicCacheImpl.getPlaylists()) { if (MusicCacheImpl.hasPlaylist()) {
if (noPlaylists) { for (Playlist playlist : MusicCacheImpl.getPlaylists()) {
jsonArray.put(new JSONArray().put(generatePlaylist(playlist.a, playlist.b, playlist.C, playlist.g, playlist.B, PlaylistUtils.getThumb(playlist), playlist.O))); jsonArray.put(generatePlaylist(playlist.a, playlist.b, playlist.C, playlist.g, playlist.B, PlaylistUtils.getThumb(playlist)));
} else {
jsonArray.put(generatePlaylist(playlist.a, playlist.b, playlist.C, playlist.g, playlist.B, PlaylistUtils.getThumb(playlist), playlist.O));
}
Log.d("PlaylistHelper", "Playlist cache added: " + playlist.a + " " + playlist.b + " " + playlist.C + " " + playlist.g + " " + playlist.B); Log.d("PlaylistHelper", "Playlist cache added: " + playlist.a + " " + playlist.b + " " + playlist.C + " " + playlist.g + " " + playlist.B);
}
} }
} catch (JSONException e) { } catch (JSONException e) {
e.fillInStackTrace(); e.fillInStackTrace();
@@ -45,7 +46,7 @@ public class PlaylistHelper {
return jsonArray; return jsonArray;
} }
public static JSONObject generatePlaylist(int id, int owner_id, boolean is_explicit, String title, String description, JSONObject photo, int count) throws JSONException { public static JSONObject generatePlaylist(int id, int owner_id, boolean is_explicit, String title, String description, JSONObject photo) throws JSONException {
JSONObject playlist = new JSONObject() JSONObject playlist = new JSONObject()
.put("id", id) .put("id", id)
.put("owner_id", owner_id) .put("owner_id", owner_id)
@@ -64,7 +65,7 @@ public class PlaylistHelper {
.put("subtitle", "") .put("subtitle", "")
.put("meta", new JSONObject() .put("meta", new JSONObject()
.put("view", "compact")) .put("view", "compact"))
.put("count", count); .put("count", 0);
if (photo != null) { if (photo != null) {
playlist.put("photo", photo); playlist.put("photo", photo);
@@ -101,18 +102,18 @@ public class PlaylistHelper {
.put("height", 600)) .put("height", 600))
.put("meta", new JSONObject() .put("meta", new JSONObject()
.put("view", "compact")) .put("view", "compact"))
.put("count", MusicCacheImpl.getAllOwnTracks().size()); .put("count", 0);
} }
public static JSONArray getCachedPlaylistsIds() { public static JSONArray getCachedPlaylistsIds() {
JSONArray arr = new JSONArray(); JSONArray arr = new JSONArray();
if (NetworkUtils.isNetworkConnected() && !MusicCacheImpl.getAllOwnTracks().isEmpty()) { if (NetworkUtils.isNetworkConnected() && !PlaylistCacheDbDelegate.isPlaylistEmpty(AndroidUtils.getGlobalContext(), AccountManagerUtils.getUserId() + "_-1")) {
arr.put(AccountManagerUtils.getUserId() + "_-1"); arr.put(AccountManagerUtils.getUserId() + "_-1");
} }
for (var playlist : MusicCacheImpl.getPlaylists()) { for (String playlist : PlaylistCacheDbDelegate.getAllPlaylistIds(AndroidUtils.getGlobalContext())) {
arr.put(playlist.v1()); arr.put(playlist);
} }
return arr; return arr;
@@ -28,7 +28,7 @@ public class TracklistHelper {
boolean doNotinvertOrder = Preferences.getBoolValue("invertCachedTracks", false); boolean doNotinvertOrder = Preferences.getBoolValue("invertCachedTracks", false);
if (!doNotinvertOrder) { if (doNotinvertOrder) {
Collections.reverse(tracks); Collections.reverse(tracks);
} }
@@ -8,9 +8,11 @@ import com.google.android.exoplayer2.source.hls.playlist.e;
import com.google.android.exoplayer2.source.hls.playlist.f; import com.google.android.exoplayer2.source.hls.playlist.f;
import com.google.android.exoplayer2.source.hls.playlist.f.a; import com.google.android.exoplayer2.source.hls.playlist.f.a;
import com.vk.dto.music.MusicTrack; import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@@ -20,7 +22,6 @@ import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import com.vk.dto.music.Playlist;
import ru.vtosters.hooks.other.Preferences; import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.music.converter.ts.MpegDemuxer; import ru.vtosters.lite.music.converter.ts.MpegDemuxer;
import ru.vtosters.lite.music.interfaces.Callback; import ru.vtosters.lite.music.interfaces.Callback;
@@ -37,17 +38,29 @@ public final class Mp3Downloader implements ITrackDownloader {
@Override @Override
public void download(MusicTrack track, Callback callback, Playlist playlist) { public void download(MusicTrack track, Callback callback, Playlist playlist) {
String uri = track.D; String uri = track.D;
if (Objects.requireNonNull(uri).isEmpty()) { if (Objects.requireNonNull(uri).isEmpty()) {
String msg = "link error: " + track.y1() + ", title: " + Mp3Downloader.getTitle(track); String msg = "link error: " + track.y1() + ", title: " + Mp3Downloader.getTitle(track);
Log.d("Mp3Downloader", msg); Log.d("Mp3Downloader", msg);
throw new RuntimeException(msg); throw new RuntimeException(msg);
} }
var tsParser = new com.google.android.exoplayer2.source.hls.playlist.h(e.a(track.D)); if (Objects.requireNonNull(uri).contains("master.m3u8?siren=1")) {
var baseUri = track.D.substring(0, track.D.lastIndexOf("/") + 1); try {
String content = IOUtils.readAllLines(new URL(uri).openStream());
String replacement = content.split("\n")[2].trim();
uri = uri.replace("master.m3u8?siren=1", replacement);
} catch (IOException e) {
callback.onFailure(e);
return;
}
}
var tsParser = new com.google.android.exoplayer2.source.hls.playlist.h(e.a(uri));
var baseUri = uri.substring(0, uri.lastIndexOf("/") + 1);
try { try {
var segments = ((f) tsParser.a(Uri.parse(baseUri), IOUtils.openStream(track.D))).o; var segments = ((f) tsParser.a(Uri.parse(baseUri), IOUtils.openStream(uri))).o;
byte[] buff = getMergedTs(baseUri, segments, callback); byte[] buff = getMergedTs(baseUri, segments, callback);
MpegDemuxer.convert(buff, outputFile.getAbsolutePath()); MpegDemuxer.convert(buff, outputFile.getAbsolutePath());
@@ -10,7 +10,7 @@ import ru.vtosters.lite.utils.NavigatorUtils;
public class InstallGMS { public class InstallGMS {
public static void alert(final Activity activity) { public static void alert(final Activity activity) {
if (!GmsHook.isAnyServicesInstalled() && Preferences.getBoolValue("showAlertGms", true)) { if (!GmsHook.isAnyServicesInstalled() && !GmsHook.isGmsInstalled() && Preferences.getBoolValue("showAlertGms", true)) {
new VkAlertDialog.Builder(activity) new VkAlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.warning)) .setTitle(activity.getString(R.string.warning))
.setMessage(activity.getString(R.string.gmsissuesumm)) .setMessage(activity.getString(R.string.gmsissuesumm))
@@ -3,9 +3,12 @@ package ru.vtosters.lite.ui.fragments;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText; import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.dto.music.Playlist; import com.vk.dto.music.Playlist;
@@ -17,13 +20,18 @@ import ru.vtosters.lite.music.LastFMScrobbler;
import ru.vtosters.lite.music.cache.MusicCacheImpl; import ru.vtosters.lite.music.cache.MusicCacheImpl;
import ru.vtosters.lite.music.cache.delegate.PlaylistCacheDbDelegate; import ru.vtosters.lite.music.cache.delegate.PlaylistCacheDbDelegate;
import ru.vtosters.lite.ui.PreferenceFragmentUtils; import ru.vtosters.lite.ui.PreferenceFragmentUtils;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils; import ru.vtosters.lite.utils.LifecycleUtils;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr;
public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment { public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
private static final ExecutorService executor = Executors.newCachedThreadPool(); private static final ExecutorService executor = Executors.newCachedThreadPool();
@@ -48,7 +56,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
if (MusicCacheImpl.isEmpty()) { if (MusicCacheImpl.isEmpty()) {
AndroidUtils.sendToast(requireContext().getString(com.vtosters.lite.R.string.no_cache_error)); AndroidUtils.sendToast(requireContext().getString(com.vtosters.lite.R.string.no_cache_error));
} else { } else {
delcache(requireContext()); delcache(requireContext(), false);
} }
return true; return true;
} }
@@ -66,6 +74,18 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
return true; return true;
} }
); );
PreferenceFragmentUtils.addPreference(
getPreferenceScreen(),
"cached_playlists",
"Удалить все скачанные плейлисты",
null,
null,
preference -> {
delcache(requireContext(), true);
return true;
}
);
} }
PreferenceFragmentUtils.addPreference( PreferenceFragmentUtils.addPreference(
@@ -93,15 +113,38 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
} }
).setEnabled(!MusicCacheImpl.isEmpty()); ).setEnabled(!MusicCacheImpl.isEmpty());
PreferenceFragmentUtils.addMaterialSwitchPreference( PreferenceFragmentUtils.addPreference(
getPreferenceScreen(), getPreferenceScreen(),
"autocache", "autocache_params",
getString(com.vtosters.lite.R.string.autocache_title), getString(com.vtosters.lite.R.string.autocache_title),
getString(com.vtosters.lite.R.string.autocache_summ), getAutocacheSumm(),
null, null,
false, preference -> {
(preference, o) -> { List<String> items = Arrays.asList("Не кешировать", "Только свои", "Все");
Preferences.getPreferences().edit().putBoolean("autocache", (boolean) o).apply();
ArrayAdapter<String> adapter = new ArrayAdapter<>(requireContext(), android.R.layout.simple_list_item_1, items) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) super.getView(position, convertView, parent);
textView.setTextColor(getTextAttr());
return textView;
}
};
int selectedItem = Preferences.getPreferences().getInt("autocaching", 0);
if (selectedItem >= 0 && selectedItem < items.size()) {
adapter.getItem(selectedItem);
}
new VkAlertDialog.Builder(getActivity())
.setAdapter(adapter, (dialog, which) -> {
adapter.getItem(which);
Preferences.getPreferences().edit().putInt("autocaching", which).apply();
findPreference("autocache_params").setSummary(getAutocacheSumm());
dialog.cancel();
})
.show();
return true; return true;
} }
); );
@@ -117,6 +160,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
false, false,
(preference, o) -> { (preference, o) -> {
Preferences.getPreferences().edit().putBoolean("dldir", (boolean) o).apply(); Preferences.getPreferences().edit().putBoolean("dldir", (boolean) o).apply();
LifecycleUtils.restartApplicationWithTimer();
return true; return true;
} }
); );
@@ -165,6 +209,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
return; return;
} }
Preferences.setMetadataSeparator(separator.getText().toString()); Preferences.setMetadataSeparator(separator.getText().toString());
findPreference("metadataSeparator").setSummary(separator.getText().toString());
}) })
.setNegativeButton("Отмена", (dialog, which) -> dialog.cancel()) .setNegativeButton("Отмена", (dialog, which) -> dialog.cancel())
.show(); .show();
@@ -173,6 +218,33 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
} }
); );
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Рекомендации музыки");
PreferenceFragmentUtils.addMaterialSwitchPreference(
getPreferenceScreen(),
"sendMusicMetrics",
"Отправлять статистику",
"Статистика прослушиваний необходима для работы рекомендаций и истории прослушивания музыки",
null,
true,
(preference, o) -> {
Preferences.getPreferences().edit().putBoolean("sendMusicMetrics", (boolean) o).apply();
return true;
}
);
PreferenceFragmentUtils.addMaterialSwitchPreference(
getPreferenceScreen(),
"playStatCatalog",
"Список истории прослушиваний",
"Показывать вкладку истории прослушиваний в музыкальном разделе\n\nОтключение ускорит открытие музыкального раздела при медленном интернете",
null,
false,
(preference, o) -> {
Preferences.getPreferences().edit().putBoolean("playStatCatalog", (boolean) o).apply();
return true;
}
).setVisible(Preferences.sendMusicMetrics() && !getBoolValue("useOldAppVer", false));
if (!Preferences.serverFeaturesDisable()) { if (!Preferences.serverFeaturesDisable()) {
PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Интеграция Genius"); PreferenceFragmentUtils.addPreferenceCategory(getPreferenceScreen(), "Интеграция Genius");
PreferenceFragmentUtils.addMaterialSwitchPreference( PreferenceFragmentUtils.addMaterialSwitchPreference(
@@ -280,6 +352,19 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
list.setVisible(!Preferences.getBoolValue("useOldAppVer", false)); list.setVisible(!Preferences.getBoolValue("useOldAppVer", false));
getPreferenceScreen().addPreference(list); getPreferenceScreen().addPreference(list);
PreferenceFragmentUtils.addMaterialSwitchPreference(
getPreferenceScreen(),
"playlistsCatalogs",
"Списки плейлистов",
"Показывать вкладку плейлистов и альбомов прослушиваний в музыкальном разделе\n\nОтключение ускорит открытие музыкального раздела при медленном интернете",
null,
true,
(preference, o) -> {
Preferences.getPreferences().edit().putBoolean("playlistsCatalogs", (boolean) o).apply();
return true;
}
).setVisible(!getBoolValue("useOldAppVer", false));
} }
private void lastfmAuth(Context ctx) { private void lastfmAuth(Context ctx) {
@@ -319,6 +404,15 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
.show(); .show();
} }
private static String getAutocacheSumm() {
int autocache = Preferences.autocache();
return switch (autocache) {
case 1 -> "Только для своих";
case 2 -> "Кешировать всё";
default -> "Отключено";
};
}
public void updateLastFmPref() { public void updateLastFmPref() {
if (LastFMScrobbler.isLoggedIn()) { if (LastFMScrobbler.isLoggedIn()) {
findPreference("lastfm_auth").setSummary(getString(com.vtosters.lite.R.string.lastfm_authorized_as) + " " + LastFMScrobbler.getUserName()); findPreference("lastfm_auth").setSummary(getString(com.vtosters.lite.R.string.lastfm_authorized_as) + " " + LastFMScrobbler.getUserName());
@@ -340,7 +434,8 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
.show(); .show();
} }
private static void cachedPlaylistsDialog(Context ctx) { @SuppressLint("DefaultLocale")
private void cachedPlaylistsDialog(Context ctx) {
List<Playlist> playlists = PlaylistCacheDbDelegate.getAllPlaylists(ctx); List<Playlist> playlists = PlaylistCacheDbDelegate.getAllPlaylists(ctx);
String[] playlistNames = new String[playlists.size()]; String[] playlistNames = new String[playlists.size()];
@@ -355,19 +450,27 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
String playlistId = selectedPlaylist.v1(); String playlistId = selectedPlaylist.v1();
PlaylistCacheDbDelegate.deletePlaylist(ctx, playlistId); PlaylistCacheDbDelegate.deletePlaylist(ctx, playlistId);
AndroidUtils.sendToast("Плейлист удален"); AndroidUtils.sendToast("Плейлист удален");
findPreference("cached_playlists").setSummary(String.format("Скачано плейлистов: %d", MusicCacheImpl.getPlaylists().size()));
}); });
builder.show(); builder.show();
} }
private void delcache(Context ctx) { private void delcache(Context ctx, boolean isPlaylists) {
new VkAlertDialog.Builder(ctx) new VkAlertDialog.Builder(ctx)
.setTitle(com.vtosters.lite.R.string.warning) .setTitle(com.vtosters.lite.R.string.warning)
.setMessage(com.vtosters.lite.R.string.cached_tracks_remove_confirm) .setMessage(com.vtosters.lite.R.string.cached_tracks_remove_confirm)
.setPositiveButton(com.vtosters.lite.R.string.yes, .setPositiveButton(com.vtosters.lite.R.string.yes, (dialog, which) -> {
(dialog, which) -> executor.submit(MusicCacheImpl::clear)) executor.submit(() -> {
.setNeutralButton(com.vtosters.lite.R.string.no, if (isPlaylists) {
(dialog, which) -> dialog.cancel()) PlaylistCacheDbDelegate.removeAllPlaylists(ctx);
} else {
PlaylistCacheDbDelegate.deletePlaylist(ctx, AccountManagerUtils.getUserId() + "_-1");
}
});
findPreference("cached_tracks").setSummary(String.format(requireContext().getString(com.vtosters.lite.R.string.cached_tracks_counter), MusicCacheImpl.getTracksCount()));
})
.setNeutralButton(com.vtosters.lite.R.string.no, (dialog, which) -> dialog.cancel())
.show(); .show();
} }
@@ -60,12 +60,12 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
return true; return true;
}); });
findPreference("microgsettings").setVisible(GmsHook.isFakeGmsInstalled() && !GmsHook.isGmsInstalled()); findPreference("microgsettings").setVisible(GmsHook.isAnyServicesInstalled() && !GmsHook.isGmsInstalled());
findPreference("microgsettings").setOnPreferenceClickListener(preference -> { findPreference("microgsettings").setOnPreferenceClickListener(preference -> {
try { try {
Intent intent = new Intent(Intent.ACTION_MAIN); Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName((GmsHook.isFakeGms2Installed() ? "app.revanced.android.gms" : "com.mgoogle.android.gms"), "org.microg.gms.ui.SettingsActivity")); intent.setComponent(new ComponentName(GmsHook.getCurrentGms() + ".android.gms", "org.microg.gms.ui.SettingsActivity"));
startActivity(intent); startActivity(intent);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@@ -81,6 +81,17 @@ public class OtherFragment extends TrackedMaterialPreferenceToolbarFragment {
return true; return true;
}); });
findPreference("unstableNameChangerDrop").setOnPreferenceClickListener(preference -> {
RenameTool.clearDatabase();
LifecycleUtils.restartApplicationWithTimer();
return true;
});
findPreference("unstableNameChanger").setOnPreferenceChangeListener((preference, o) -> {
LifecycleUtils.restartApplicationWithTimer();
return true;
});
findPreference("copydebuginfo").setOnPreferenceClickListener(preference -> { findPreference("copydebuginfo").setOnPreferenceClickListener(preference -> {
copyText(new DeviceInfoCollector().collect().forLogging()); copyText(new DeviceInfoCollector().collect().forLogging());
Toast.makeText(requireContext(), AndroidUtils.getString("device_info_copied"), Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), AndroidUtils.getString("device_info_copied"), Toast.LENGTH_SHORT).show();
@@ -227,6 +227,23 @@ public class SponsorPostFragment extends TrackedMaterialPreferenceToolbarFragmen
} }
); );
if (NetworkUtils.isNetworkConnected()) {
PreferenceFragmentUtils.addPreference(
getPreferenceScreen(),
"",
"Обновить списки фильтров",
null,
null,
preference -> {
this.requireActivity().runOnUiThread(() -> {
FiltersPreferences.forceUpdateFilters();
AndroidUtils.sendToast("Обновлено");
});
return false;
}
);
}
PreferenceFragmentUtils.addPreference( PreferenceFragmentUtils.addPreference(
getPreferenceScreen(), getPreferenceScreen(),
"", "",
@@ -13,6 +13,8 @@ import ru.vtosters.lite.ui.PreferenceFragmentUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.VersionReader; import ru.vtosters.lite.utils.VersionReader;
import static ru.vtosters.hooks.GmsHook.isSpoofPackageInstalled;
public class SystemInfo extends TrackedMaterialPreferenceToolbarFragment { public class SystemInfo extends TrackedMaterialPreferenceToolbarFragment {
@Override @Override
@@ -46,11 +48,11 @@ public class SystemInfo extends TrackedMaterialPreferenceToolbarFragment {
boolean isZenUI = OEMDetector.isZenUI(); boolean isZenUI = OEMDetector.isZenUI();
boolean isEMUI = OEMDetector.isEMUI(); boolean isEMUI = OEMDetector.isEMUI();
boolean hasMiuiIncrCode = OEMDetector.hasMiuiIncrCode(); boolean hasMiuiIncrCode = OEMDetector.hasMiuiIncrCode();
boolean isHyperOS = OEMDetector.isHyperOs();
boolean hasGMS = GmsHook.isGmsInstalled(); boolean hasGMS = GmsHook.isGmsInstalled();
boolean hasVancedMicroG = GmsHook.isFakeGmsInstalled(); boolean hasVancedMicroG = GmsHook.isAnyServicesInstalled();
boolean hasReVancedMicroG = GmsHook.isFakeGms2Installed(); String GMSPackageName = hasGMS ? "com.google.android.gms" : hasVancedMicroG ? GmsHook.getCurrentGms() + ".android.gms" : "no gms or microg";
String GMSPackageName = hasGMS ? "com.google.android.gms" : hasVancedMicroG ? "com.mgoogle.android.gms" : hasReVancedMicroG ? "app.revanced.android.gms" : "no gms or microg";
boolean isValidSignature = Preferences.isValidSignature(); boolean isValidSignature = Preferences.isValidSignature();
boolean isTablet = AndroidUtils.isTablet(); boolean isTablet = AndroidUtils.isTablet();
@@ -104,9 +106,7 @@ public class SystemInfo extends TrackedMaterialPreferenceToolbarFragment {
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isInstalledGoogleGMS", "Value: " + hasGMS, 0, null); PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isInstalledGoogleGMS", "Value: " + hasGMS, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isInstalledVancedMicroG", "Value: " + hasVancedMicroG, 0, null); PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isInstalledMicroG", "Value: " + hasVancedMicroG, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isInstalledReVancedMicroG", "Value: " + hasReVancedMicroG, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "Product Name", productName, 0, preference -> { PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "Product Name", productName, 0, preference -> {
((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", productName)); ((ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("MBH-ST", productName));
@@ -194,6 +194,8 @@ public class SystemInfo extends TrackedMaterialPreferenceToolbarFragment {
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isMiui", "Value: " + isMiui, 0, null); PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isMiui", "Value: " + isMiui, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isHyperOS", "Value: " + isHyperOS, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isEMUI", "Value: " + isEMUI, 0, null); PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isEMUI", "Value: " + isEMUI, 0, null);
PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isFlyme", "Value: " + isFlyme, 0, null); PreferenceFragmentUtils.addPreference(getPreferenceScreen(), "", "isFlyme", "Value: " + isFlyme, 0, null);
@@ -108,7 +108,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
boolean isLinksUnverified = AndroidUtils.isLinksUnverified(requireActivity()); boolean isLinksUnverified = AndroidUtils.isLinksUnverified(requireActivity());
boolean isDozingAvailable = Build.VERSION.SDK_INT >= 23 && !manager.isIgnoringBatteryOptimizations(AndroidUtils.getPackageName()); boolean isDozingAvailable = Build.VERSION.SDK_INT >= 23 && !manager.isIgnoringBatteryOptimizations(AndroidUtils.getPackageName());
boolean areNotificationsDisabled = !AndroidUtils.areNotificationsEnabled() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; boolean areNotificationsDisabled = !AndroidUtils.areNotificationsEnabled() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
boolean isGMSNotInstalled = !GmsHook.isAnyServicesInstalled(); boolean isGMSNotInstalled = !GmsHook.isAnyServicesInstalled() && !GmsHook.isGmsInstalled();
if (AccountManagerUtils.isLogin()) { if (AccountManagerUtils.isLogin()) {
Preference accountSwitcher = PreferenceFragmentUtils.addPreference( Preference accountSwitcher = PreferenceFragmentUtils.addPreference(
@@ -584,7 +584,7 @@ public class VTSettings extends TrackedMaterialPreferenceToolbarFragment {
} }
); );
if (Build.VERSION.SDK_INT >= 33 && !OEMDetector.isMIUI()) { if (Build.VERSION.SDK_INT >= 33 && (!OEMDetector.isMIUI() || OEMDetector.isHyperOs())) {
PreferenceFragmentUtils.addPreference( PreferenceFragmentUtils.addPreference(
getPreferenceScreen(), getPreferenceScreen(),
"", "",
@@ -14,10 +14,12 @@ import com.vtosters.lite.api.ExtendedCommunityProfile;
import com.vtosters.lite.api.ExtendedUserProfile; import com.vtosters.lite.api.ExtendedUserProfile;
import kotlin.Unit; import kotlin.Unit;
import kotlin.jvm.b.Functions; import kotlin.jvm.b.Functions;
import ru.vtosters.hooks.RenameHook;
import ru.vtosters.hooks.other.Preferences; import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.foaf.FoafBase; import ru.vtosters.lite.foaf.FoafBase;
import ru.vtosters.lite.utils.AccountManagerUtils; import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.RenameTool;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@@ -66,10 +68,12 @@ public class MenuBuilder {
return Unit.a; return Unit.a;
}); });
// addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> { if (RenameHook.isEnabled()) {
// RenameTool.createDialog(eup, ctx); addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
// return Unit.a; RenameTool.createDialog(eup, ctx);
// }); return Unit.a;
});
}
addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> { addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> {
setWhitelistedFilter(eup, !isPageWhitelistedFilter); setWhitelistedFilter(eup, !isPageWhitelistedFilter);
@@ -83,7 +87,7 @@ public class MenuBuilder {
return Unit.a; return Unit.a;
}); });
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace(); e.fillInStackTrace();
} }
} }
@@ -100,10 +104,12 @@ public class MenuBuilder {
return Unit.a; return Unit.a;
}); });
// addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> { if (RenameHook.isEnabled()) {
// RenameTool.createDialogGroup(ecp, ctx); addItem(builder, AndroidUtils.getString(R.string.menu_change_name), () -> {
// return Unit.a; RenameTool.createDialogGroup(ecp, ctx);
// }); return Unit.a;
});
}
addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> { addItem(builder, AndroidUtils.getString(isPageWhitelistedFilter ? R.string.remove_from_filter_whitelist : R.string.add_to_filter_whitelist), () -> {
setWhitelistedFilter(ecp, !isPageWhitelistedFilter); setWhitelistedFilter(ecp, !isPageWhitelistedFilter);
@@ -123,7 +129,7 @@ public class MenuBuilder {
return Unit.a; return Unit.a;
}); });
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace(); e.fillInStackTrace();
} }
} }
@@ -0,0 +1,107 @@
package ru.vtosters.lite.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.os.Build;
import android.util.Log;
import com.vk.core.network.Network;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Request;
import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import static com.vk.core.network.Network.ClientType.CLIENT_API;
import static ru.vtosters.hooks.other.Preferences.getBoolValue;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
public class Metrics {
private static JSONArray events = new JSONArray();
public static void trackEvents(JSONObject object, boolean isMusic) {
if (NetworkUtils.isNetworkConnected()) {
handleNetworkConnected(object, isMusic);
} else {
handleNetworkDisconnected(object, isMusic);
}
}
private static void handleNetworkConnected(JSONObject object, boolean isMusic) {
if (isMusic || shouldSaveUserTraffic() || events.length() > 0) {
trackEventsImmediately(object);
} else {
trackEventList(object);
}
}
private static void handleNetworkDisconnected(JSONObject object, boolean isMusic) {
if (!isMusic) {
events.put(object);
}
}
private static boolean shouldSaveUserTraffic() {
return getBoolValue("isRoamingState", false) || isMobileNetwork();
}
private static void trackEventList(JSONObject object) {
events.put(object);
if (events.length() > 2) {
trackEventsRequest(events);
resetEvents();
}
}
private static void trackEventsImmediately(JSONObject object) {
JSONArray eventsToTrack = new JSONArray();
eventsToTrack.put(object);
trackEventsRequest(eventsToTrack);
}
private static void resetEvents() {
events = new JSONArray();
}
@SuppressWarnings("deprecation")
private static boolean isMobileNetwork() {
ConnectivityManager connectivityManager = (ConnectivityManager) AndroidUtils.getGlobalContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
android.net.Network network = connectivityManager.getActiveNetwork();
if (network != null) {
NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
return networkCapabilities != null && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
}
} else {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return networkInfo != null && networkInfo.isConnected();
}
return false;
}
private static void trackEventsRequest(JSONArray object) {
Request req = new Request.a()
.b("https://" + getApi() + "/method/stats.trackEvents?events=" + object.toString() + "&v=5.119&access_token=" + getUserToken())
.a();
Network.b(CLIENT_API).a(req).a(new Callback() {
@Override
public void a(Call call, IOException e) {
e.fillInStackTrace();
}
@Override
public void a(Call call, Response response) throws IOException {
Log.d("Metrics", response.a().g());
}
});
}
}
@@ -9,24 +9,24 @@ import static ru.vtosters.lite.foaf.FoafBase.getBypassedOnlineInfo;
public class OnlineBypass { public class OnlineBypass {
public static JSONObject setOnlineInfo(JSONObject json) throws JSONException { public static JSONObject setOnlineInfo(JSONObject json) throws JSONException {
var id = json.optInt("id"); int id = json.optInt("id");
if (id == AccountManagerUtils.getUserId()) { if (id == AccountManagerUtils.getUserId()) {
return json; return json;
} }
var onlineinfo = json.optJSONObject("online_info"); JSONObject onlineinfo = json.optJSONObject("online_info");
if (onlineinfo != null && !onlineinfo.optBoolean("visible") && !Preferences.serverFeaturesDisable()) { if (onlineinfo != null && !onlineinfo.optBoolean("visible") && !Preferences.serverFeaturesDisable()) {
var bypassed = getBypassedOnlineInfo(id); var bypassed = getBypassedOnlineInfo(id);
if (bypassed.optInt("last_seen", 0) != 0) { if (bypassed.optInt("last_seen", 0) != 0) {
json.remove("online_info"); json.remove("online_info");
var online_info = new JSONObject() JSONObject online_info = new JSONObject()
.put("visible", true) .put("visible", true)
.put("last_seen", bypassed.optInt("last_seen")) .put("last_seen", bypassed.optInt("last_seen"))
.put("is_online", bypassed.optBoolean("is_online")) .put("is_online", bypassed.optBoolean("is_online"))
.put("app_id", bypassed.optInt("app_id")) .put("app_id", bypassed.optInt("app_id"))
.put("is_mobile", bypassed.optBoolean("is_mobile")); .put("is_mobile", bypassed.optBoolean("is_mobile"));
var last_seen = new JSONObject() JSONObject last_seen = new JSONObject()
.put("platform", bypassed.optInt("platform")) .put("platform", bypassed.optInt("platform"))
.put("time", bypassed.optInt("last_seen")); .put("time", bypassed.optInt("last_seen"));
@@ -37,51 +37,95 @@ public class OnlineBypass {
return json; return json;
} }
public static JSONArray setOnlineInfoUsers(JSONArray profiles) throws JSONException { public static JSONArray setOnlineInfoUsers(JSONArray profiles) {
if (profiles == null || profiles.length() == 0 || Preferences.serverFeaturesDisable()) return profiles; if (shouldReturnProfiles(profiles)) return profiles;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
var curVkId = AccountManagerUtils.getUserId(); int curVkId = AccountManagerUtils.getUserId();
for (int i = 0; i < profiles.length(); i++) { for (int i = 0; i < profiles.length(); i++) {
JSONObject profile = profiles.getJSONObject(i); JSONObject profile = getProfile(profiles, i);
int id = profile.optInt("id", -1); int id = profile.optInt("id", -1);
JSONObject onlinfo = profile.optJSONObject("online_info"); JSONObject onlinfo = profile.optJSONObject("online_info");
if (id == curVkId || id < 0 || onlinfo == null || onlinfo.optBoolean("visible")) {
continue; if (shouldSkipProfile(id, curVkId, onlinfo)) continue;
}
sb.append(id); sb.append(id).append(",");
sb.append(",");
}
var ids = sb.toString();
if (!ids.isEmpty()) {
ids = ids.substring(0, ids.length() - 1);
} else {
return profiles;
} }
String ids = prepareIds(sb);
if (ids.isEmpty()) return profiles;
JSONObject bypassedObj = getBypassedOnlineInfo(ids); JSONObject bypassedObj = getBypassedOnlineInfo(ids);
for (int i = 0; i < profiles.length(); i++) { for (int i = 0; i < profiles.length(); i++) {
JSONObject profile = profiles.getJSONObject(i); JSONObject profile = getProfile(profiles, i);
int id = profile.optInt("id"); int id = profile.optInt("id");
JSONObject bypassed = bypassedObj.optJSONObject(Integer.toString(id)); JSONObject bypassed = bypassedObj.optJSONObject(Integer.toString(id));
if (bypassed == null) {
continue;
}
profile.remove("online_info");
var online_info = new JSONObject() if (bypassed == null) continue;
JSONObject online_info = createOnlineInfo(bypassed);
JSONObject last_seen = createLastSeen(bypassed);
updateProfile(profile, online_info, last_seen);
}
return profiles;
}
private static boolean shouldReturnProfiles(JSONArray profiles) {
return profiles == null || profiles.length() == 0 || Preferences.serverFeaturesDisable();
}
private static JSONObject getProfile(JSONArray profiles, int i) {
try {
return profiles.getJSONObject(i);
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
private static boolean shouldSkipProfile(int id, int curVkId, JSONObject onlinfo) {
return id == curVkId || id < 0 || onlinfo == null || onlinfo.optBoolean("visible");
}
private static String prepareIds(StringBuilder sb) {
String ids = sb.toString();
if (!ids.isEmpty()) {
ids = ids.substring(0, ids.length() - 1);
}
return ids;
}
private static JSONObject createOnlineInfo(JSONObject bypassed) {
try {
return new JSONObject()
.put("visible", true) .put("visible", true)
.put("last_seen", bypassed.optInt("last_seen")) .put("last_seen", bypassed.optInt("last_seen"))
.put("is_online", bypassed.optBoolean("is_online")) .put("is_online", bypassed.optBoolean("is_online"))
.put("app_id", bypassed.optInt("app_id")) .put("app_id", bypassed.optInt("app_id"))
.put("is_mobile", bypassed.optBoolean("is_mobile")); .put("is_mobile", bypassed.optBoolean("is_mobile"));
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
var last_seen = new JSONObject() private static JSONObject createLastSeen(JSONObject bypassed) {
try {
return new JSONObject()
.put("platform", bypassed.optInt("platform")) .put("platform", bypassed.optInt("platform"))
.put("time", bypassed.optInt("last_seen")); .put("time", bypassed.optInt("last_seen"));
} catch (JSONException e) {
profile.put("last_seen", last_seen).put("online_info", online_info); throw new RuntimeException(e);
} }
}
return profiles; private static void updateProfile(JSONObject profile, JSONObject online_info, JSONObject last_seen) {
try {
profile.remove("online_info");
profile.put("last_seen", last_seen).put("online_info", online_info);
} catch (JSONException e) {
throw new RuntimeException(e);
}
} }
} }
@@ -1,5 +1,6 @@
package ru.vtosters.lite.utils; package ru.vtosters.lite.utils;
import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
@@ -12,15 +13,15 @@ import android.widget.LinearLayout;
import androidx.core.util.Pair; import androidx.core.util.Pair;
import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.dto.user.UserProfile; import com.vk.dto.user.UserProfile;
import com.vk.im.engine.models.users.User;
import com.vtosters.lite.R; import com.vtosters.lite.R;
import com.vtosters.lite.api.ExtendedCommunityProfile; import com.vtosters.lite.api.ExtendedCommunityProfile;
import com.vtosters.lite.api.ExtendedUserProfile; import com.vtosters.lite.api.ExtendedUserProfile;
import ru.vtosters.hooks.other.ThemesUtils; import ru.vtosters.hooks.other.ThemesUtils;
import java.lang.reflect.Field; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.function.BiConsumer;
import static ru.vtosters.hooks.other.ThemesUtils.getSTextAttr; import static ru.vtosters.hooks.other.ThemesUtils.getSTextAttr;
import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr; import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr;
@@ -47,69 +48,40 @@ public class RenameTool {
return helperInstance; return helperInstance;
} }
public static String getCurrentModifiedUser() {
Cursor rawQuery = getHelper().getReadableDatabase().rawQuery(String.format("SELECT * FROM %s WHERE %s=%s", TABLE_NAME, COLUMN_VKID, AccountManagerUtils.getUserId()), new String[0]);
if (rawQuery.moveToFirst()) {
try {
String decode = URLDecoder.decode(rawQuery.getString(rawQuery.getColumnIndexOrThrow(COLUMN_FIRSTNAME)), "UTF-8");
return decode + " " + URLDecoder.decode(rawQuery.getString(rawQuery.getColumnIndexOrThrow(COLUMN_LASTNAME)), "UTF-8");
} catch (java.io.UnsupportedEncodingException | java.lang.IllegalArgumentException e) {
e.printStackTrace();
} finally {
rawQuery.close();
}
} else rawQuery.close();
return null;
}
// Reload all values from DB
public static void reloadDB() { public static void reloadDB() {
renamedGroups.clear(); renamedGroups.clear();
renamedUsers.clear(); renamedUsers.clear();
updateRequested = false; updateRequested = false;
try (Cursor cursor = getHelper().getReadableDatabase().rawQuery(String.format("SELECT * FROM %s", TABLE_NAME), new String[0])) { loadData(TABLE_NAME, (cursor, vkID) -> {
while (cursor.moveToNext()) { String firstName = decode(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_FIRSTNAME)));
String firstName = URLDecoder.decode(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_FIRSTNAME)), "UTF-8"); String lastName = decode(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_LASTNAME)));
String lastName = URLDecoder.decode(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_LASTNAME)), "UTF-8"); renamedUsers.put(vkID, new Pair<>(firstName, lastName));
int vkID = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_VKID)); });
renamedUsers.put(vkID, new Pair<>(firstName, lastName));
}
} catch (Exception e) {
e.printStackTrace();
}
try (Cursor cursor = getHelper().getReadableDatabase().rawQuery(String.format("SELECT * FROM %s", TABLE_NAME_GROUP), new String[0])) { loadData(TABLE_NAME_GROUP, (cursor, vkID) -> {
String name = decode(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_NAME)));
renamedGroups.put(vkID, name);
});
}
// Generic method to load data from the database
private static void loadData(String tableName, BiConsumer<Cursor, Integer> consumer) {
try (Cursor cursor = getHelper().getReadableDatabase().rawQuery("SELECT * FROM " + tableName, null)) {
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
String name = URLDecoder.decode(cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_NAME)), "UTF-8");
int vkID = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_VKID)); int vkID = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_VKID));
renamedGroups.put(vkID, name); consumer.accept(cursor, vkID);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); throw new RuntimeException("Failed to load data from " + tableName, e);
} }
} }
public static void injectIntoChat(User u) { private static String decode(String value) {
int id = u.getId();
if (updateRequested) {
reloadDB();
}
Pair<String, String> user = renamedUsers.get(id);
if (user == null) return;
setObject(u, "I", user.first);
setObject(u, "J", user.second);
}
public static void setObject(User instance, String name, Object obj) {
try { try {
Field f = User.class.getDeclaredField(name); return URLDecoder.decode(value, "UTF-8");
f.setAccessible(true); } catch (UnsupportedEncodingException e) {
f.set(instance, obj); throw new RuntimeException("UTF-8 encoding not supported", e);
} catch (Exception e) {
e.printStackTrace();
} }
} }
@@ -117,7 +89,7 @@ public class RenameTool {
LinearLayout linearLayout = new LinearLayout(ctx); LinearLayout linearLayout = new LinearLayout(ctx);
linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx); EditText fn = new EditText(ctx);
fn.setHint(R.string.vk_auth_sign_up_first_name); fn.setHint(R.string.vk_auth_sign_up_first_name);
fn.setTextColor(getTextAttr()); fn.setTextColor(getTextAttr());
fn.setHintTextColor(getSTextAttr()); fn.setHintTextColor(getSTextAttr());
@@ -128,7 +100,7 @@ public class RenameTool {
margin.setMargins(dp2px(20f), 0, dp2px(20f), 0); margin.setMargins(dp2px(20f), 0, dp2px(20f), 0);
fn.setLayoutParams(margin); fn.setLayoutParams(margin);
final EditText ln = new EditText(ctx); EditText ln = new EditText(ctx);
ln.setHint(R.string.vk_auth_sign_up_last_name); ln.setHint(R.string.vk_auth_sign_up_last_name);
ln.setTextColor(getTextAttr()); ln.setTextColor(getTextAttr());
ln.setHintTextColor(getSTextAttr()); ln.setHintTextColor(getSTextAttr());
@@ -137,69 +109,93 @@ public class RenameTool {
ln.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ln.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
ln.setLayoutParams(margin); ln.setLayoutParams(margin);
final UserProfile profile = AccountManagerUtils.fromEup(eup); UserProfile profile = AccountManagerUtils.fromEup(eup);
fn.setText(AccountManagerUtils.getUserFirstName(profile)); fn.setText(AccountManagerUtils.getUserFirstName(profile));
ln.setText(AccountManagerUtils.getUserLastName(profile)); ln.setText(AccountManagerUtils.getUserLastName(profile));
int id = AccountManagerUtils.getUserID(profile); int id = AccountManagerUtils.getUserID(profile);
var builder = new VkAlertDialog.Builder(ctx) VkAlertDialog.Builder builder = new VkAlertDialog.Builder(ctx)
.setTitle(R.string.rename_title) .setTitle(R.string.rename_title)
.setMessage(R.string.rename_message) .setMessage(R.string.rename_message)
.setView(linearLayout) .setView(linearLayout)
.setPositiveButton("OK", (dialog, which) -> { .setPositiveButton("OK", (dialog, which) -> updateName(ctx, fn.getText().toString(), ln.getText().toString(), id));
String firstName = fn.getText().toString();
String lastName = ln.getText().toString(); if (isChangedName(id)) {
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase(); builder.setNeutralButton(R.string.rename_reset, (dialog, which) -> deleteUser(ctx, id));
try { }
if (isChangedName(id)) {
writableDatabase.execSQL(
String.format("UPDATE %s SET %s='%s', %s='%s' WHERE %s='%s'",
TABLE_NAME,
COLUMN_FIRSTNAME, URLEncoder.encode(firstName, "UTF-8"),
COLUMN_LASTNAME, URLEncoder.encode(lastName, "UTF-8"),
COLUMN_VKID, id));
} else {
writableDatabase.execSQL(
String.format("INSERT INTO %s (%s, %s, %s) VALUES (%s, '%s', '%s')",
TABLE_NAME,
COLUMN_VKID, COLUMN_FIRSTNAME, COLUMN_LASTNAME,
id, URLEncoder.encode(firstName, "UTF-8"), URLEncoder.encode(lastName, "UTF-8")));
}
updateRequested = true;
if (id == AccountManagerUtils.getUserId()) {
ctx.sendBroadcast(new Intent("com.vkontakte.android.USER_NAME_CHANGED"));
}
ctx.sendBroadcast(new Intent("com.vkontakte.android.ACTION_PROFILE_UPDATED").putExtra("uid", id));
sendToast(ctx.getString(R.string.rename_success));
} catch (Exception e) {
e.printStackTrace();
sendToast(ctx.getString(R.string.rename_error));
}
});
if (isChangedName(id))
builder.setNeutralButton(R.string.rename_reset, (dialog, which) -> {
getHelper().getWritableDatabase().execSQL(
String.format(
"DELETE FROM %s WHERE %s='%s'",
TABLE_NAME,
COLUMN_VKID, id));
if (id == AccountManagerUtils.getUserId()) {
ctx.sendBroadcast(new Intent("com.vkontakte.android.USER_NAME_CHANGED"));
}
updateRequested = true;
ctx.sendBroadcast(new Intent("com.vkontakte.android.ACTION_PROFILE_UPDATED").putExtra("uid", id));
sendToast(ctx.getString(R.string.rename_remove_from_bd_success));
});
builder.show(); builder.show();
} }
public static void deleteUser(Context ctx, int id) {
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase();
writableDatabase.delete(TABLE_NAME, COLUMN_VKID + "=?", new String[]{String.valueOf(id)});
updateRequested = true;
notifyUser(ctx, id);
sendToast(ctx.getString(R.string.rename_remove_from_bd_success));
}
public static void clearDatabase() {
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase();
writableDatabase.delete(TABLE_NAME, null, null);
writableDatabase.delete(TABLE_NAME_GROUP, null, null);
renamedGroups.clear();
renamedUsers.clear();
updateRequested = true;
}
public static void updateName(Context ctx, String firstName, String lastName, int id) {
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase();
try {
ContentValues values = new ContentValues();
values.put(COLUMN_FIRSTNAME, encode(firstName));
values.put(COLUMN_LASTNAME, encode(lastName));
if (isChangedName(id)) {
// Update existing record
writableDatabase.update(TABLE_NAME, values, COLUMN_VKID + "=?", new String[]{String.valueOf(id)});
} else {
// Insert new record
values.put(COLUMN_VKID, id);
writableDatabase.insert(TABLE_NAME, null, values);
}
updateRequested = true;
notifyUser(ctx, id);
sendToast(ctx.getString(R.string.rename_success));
} catch (Exception e) {
throw new RuntimeException("Database operation failed", e);
}
}
private static String encode(String value) {
try {
return URLEncoder.encode(value, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("UTF-8 encoding not supported", e);
}
}
private static void notifyUser(Context ctx, int id) {
if (id == AccountManagerUtils.getUserId()) {
ctx.sendBroadcast(new Intent("com.vkontakte.android.USER_NAME_CHANGED"));
}
ctx.sendBroadcast(new Intent("com.vkontakte.android.ACTION_PROFILE_UPDATED").putExtra("uid", id));
}
public static void createDialogGroup(ExtendedCommunityProfile eup, final Context ctx) { public static void createDialogGroup(ExtendedCommunityProfile eup, final Context ctx) {
LinearLayout linearLayout = new LinearLayout(ctx); LinearLayout linearLayout = new LinearLayout(ctx);
linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setOrientation(LinearLayout.VERTICAL);
final EditText fn = new EditText(ctx); EditText fn = new EditText(ctx);
fn.setHint(R.string.vk_auth_sign_up_first_name); fn.setHint(R.string.vk_auth_sign_up_first_name);
fn.setHintTextColor(getSTextAttr()); fn.setHintTextColor(getSTextAttr());
fn.setTextColor(getTextAttr()); fn.setTextColor(getTextAttr());
@@ -210,52 +206,61 @@ public class RenameTool {
margin.setMargins(dp2px(20f), 0, dp2px(20f), 0); margin.setMargins(dp2px(20f), 0, dp2px(20f), 0);
fn.setLayoutParams(margin); fn.setLayoutParams(margin);
final UserProfile profile = AccountManagerUtils.fromEup(eup); UserProfile profile = AccountManagerUtils.fromEup(eup);
fn.setText(AccountManagerUtils.getGroupName(profile)); fn.setText(AccountManagerUtils.getGroupName(profile));
int fid = AccountManagerUtils.getUserID(profile); int fid = AccountManagerUtils.getUserID(profile);
if (fid < 0) fid = -fid; if (fid < 0) fid = -fid;
final int id = fid; int id = fid;
var builder = new VkAlertDialog.Builder(ctx) VkAlertDialog.Builder builder = new VkAlertDialog.Builder(ctx)
.setTitle(R.string.rename_title) .setTitle(R.string.rename_title)
.setMessage(R.string.rename_message) .setMessage(R.string.rename_message)
.setView(linearLayout) .setView(linearLayout)
.setPositiveButton("OK", (dialog, which) -> { .setPositiveButton("OK", (dialog, which) -> updateGroupName(ctx, fn.getText().toString(), id));
String firstName = fn.getText().toString();
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase(); if (isChangedNameGroup(id)) {
try { builder.setNeutralButton(R.string.rename_reset, (dialog, which) -> deleteGroupName(ctx, id));
if (isChangedNameGroup(id)) { }
writableDatabase.execSQL(
String.format(
"UPDATE %s SET %s='%s' WHERE %s='%s'",
TABLE_NAME_GROUP,
COLUMN_NAME, URLEncoder.encode(firstName, "UTF-8"),
COLUMN_VKID, id));
} else {
writableDatabase.execSQL(
String.format(
"INSERT INTO %s (%s, %s) VALUES (%s, '%s')",
TABLE_NAME_GROUP,
COLUMN_VKID, COLUMN_NAME,
id, URLEncoder.encode(firstName, "UTF-8")));
}
updateRequested = true;
sendToast(AndroidUtils.getString(R.string.rename_group_success));
} catch (Exception e) {
e.printStackTrace();
}
});
if (isChangedNameGroup(id))
builder.setNeutralButton(R.string.rename_reset, (dialog, which) -> {
getHelper().getWritableDatabase().execSQL(String.format("DELETE FROM %s WHERE %s='%s'", TABLE_NAME_GROUP, COLUMN_VKID, id));
updateRequested = true;
sendToast(ctx.getString(R.string.rename_remove_group_from_bd_success));
});
builder.show(); builder.show();
} }
public static void deleteGroupName(Context ctx, int id) {
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase();
writableDatabase.delete(TABLE_NAME_GROUP, COLUMN_VKID + "=?", new String[]{String.valueOf(id)});
updateRequested = true;
sendToast(ctx.getString(R.string.rename_remove_group_from_bd_success));
}
public static void updateGroupName(Context ctx, String groupName, int id) {
SQLiteDatabase writableDatabase = getHelper().getWritableDatabase();
try {
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, encode(groupName));
if (isChangedNameGroup(id)) {
// Update existing record
writableDatabase.update(TABLE_NAME_GROUP, values, COLUMN_VKID + "=?", new String[]{String.valueOf(id)});
} else {
// Insert new record
values.put(COLUMN_VKID, id);
writableDatabase.insert(TABLE_NAME_GROUP, null, values);
}
updateRequested = true;
sendToast(AndroidUtils.getString(R.string.rename_group_success));
} catch (Exception e) {
throw new RuntimeException("Database operation failed", e);
}
}
public static boolean isChangedName(int uid) { public static boolean isChangedName(int uid) {
return renamedUsers.get(uid) != null; return renamedUsers.get(uid) != null;
} }
@@ -264,10 +269,6 @@ public class RenameTool {
return renamedGroups.get(uid) != null; return renamedGroups.get(uid) != null;
} }
public static boolean isIdInList(UserProfile profile) {
return true;
}
private static class DbHelper extends SQLiteOpenHelper { private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) { public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION); super(context, DB_NAME, null, DB_VERSION);
@@ -61,6 +61,18 @@ public class FiltersPreferences {
editor.apply(); editor.apply();
} }
public static void forceUpdateFilters() {
SharedPreferences.Editor editor = preferences.edit();
preferences.getAll().keySet().stream()
.filter(key -> key.endsWith(":" + PREF_KEY_VERSION))
.forEach(key -> editor.putString(key, "0"));
editor.apply();
Updates.updateFilters();
}
public static boolean getSavedKeyValue(int id) { public static boolean getSavedKeyValue(int id) {
return getFilter(id) != null; return getFilter(id) != null;
} }
@@ -1,5 +1,6 @@
package ru.vtosters.sponsorpost.utils; package ru.vtosters.sponsorpost.utils;
import android.util.Log;
import ru.vtosters.lite.utils.NetworkUtils; import ru.vtosters.lite.utils.NetworkUtils;
import ru.vtosters.lite.utils.newsfeed.NewsFeedFiltersUtils; import ru.vtosters.lite.utils.newsfeed.NewsFeedFiltersUtils;
import ru.vtosters.sponsorpost.data.Filter; import ru.vtosters.sponsorpost.data.Filter;
@@ -31,14 +32,17 @@ public class Updates {
for (Filter filter : filters) { for (Filter filter : filters) {
Filter localFilter = findLocalFilterById(localFilters, filter.getId()); Filter localFilter = findLocalFilterById(localFilters, filter.getId());
if (localFilter == null) { if (localFilter == null) {
Log.d("Updates", "local filter is not exist, adding new: " + filter.getId());
FiltersPreferences.saveFilter(filter); FiltersPreferences.saveFilter(filter);
} else { } else {
String remoteVersion = filter.getVersion(); String remoteVersion = filter.getVersion();
String localVersion = localFilter.getVersion(); String localVersion = localFilter.getVersion();
if (Objects.equals(remoteVersion, localVersion)) { if (Objects.equals(remoteVersion, localVersion)) {
FiltersPreferences.saveFilter(filter); Log.d("Updates", "saved local filter: " + localFilter.getId());
} else {
FiltersPreferences.saveFilter(localFilter); FiltersPreferences.saveFilter(localFilter);
} else {
Log.d("Updates", "saved remote filter: " + filter.getId());
FiltersPreferences.saveFilter(filter);
} }
} }
} }
+1 -1
View File
@@ -6437,7 +6437,7 @@
<string name="update_latest">У вас установлена последняя версия приложения</string> <string name="update_latest">У вас установлена последняя версия приложения</string>
<string name="update_err">Ошибка проверки обновления</string> <string name="update_err">Ошибка проверки обновления</string>
<string name="serverFeaturesDisable">Отключить все внешние подключения</string> <string name="serverFeaturesDisable">Отключить все внешние подключения</string>
<string name="serverFeaturesDisable_summ">Отключает галочки и все дополнительные функции связанные с получением данных с сервера ВТостерс.\n\nАктульно для тех у кого безлимитный интернет на ВКонтакте</string> <string name="serverFeaturesDisable_summ">Отключает галочки и все дополнительные функции связанные с получением данных с сервера ВТостерс.\n\nАктуально для тех у кого безлимитный интернет на ВКонтакте</string>
<string name="tgs_token_missing">Токен отсутствует</string> <string name="tgs_token_missing">Токен отсутствует</string>
<string name="tgs_token_reset_dialog">Сбросить токен бота?</string> <string name="tgs_token_reset_dialog">Сбросить токен бота?</string>
+5
View File
@@ -31,6 +31,11 @@
android:key="__dbg_disable_video_feed" android:key="__dbg_disable_video_feed"
android:summary="@string/interfacevideorecsum" android:summary="@string/interfacevideorecsum"
android:title="@string/interfacevideorec"/> android:title="@string/interfacevideorec"/>
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="true"
android:key="sendVideoMetrics"
android:summary="Статистика необходима для работы рекомендаций и истории видео"
android:title="Отправлять статистику"/>
<Preference <Preference
android:key="clearvideohistory" android:key="clearvideohistory"
android:summary="@string/clearvideohistory_summ" android:summary="@string/clearvideohistory_summ"
+11 -1
View File
@@ -8,11 +8,21 @@
<Preference <Preference
android:key="microgsettings" android:key="microgsettings"
android:title="@string/microgsett"/> android:title="@string/microgsett"/>
</PreferenceCategory>
<PreferenceCategory android:title="Экспериментальные функции">
<com.vtosters.lite.ui.MaterialSwitchPreference <com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="batchmessages" android:key="batchmessages"
android:summary="Поможет исправить показ онлайна в чатах, но возможны проблемы с загрузкой сообщений в целом" android:summary="Поможет исправить скорость загрузки сообщений, но работает нестабильно"
android:title="Альтернативная загрузка сообщений"/> android:title="Альтернативная загрузка сообщений"/>
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="true"
android:key="unstableNameChanger"
android:title="Редактор имен"
android:summary="Редактор имен групп и профилей людей\n\nПри проблемах с работой сообщений лучше отключить данную функцию"/>
<Preference
android:key="unstableNameChangerDrop"
android:title="Сбросить информацию о переименованиях"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/vtverify"> <PreferenceCategory android:title="@string/vtverify">
<Preference <Preference
@@ -82,10 +82,6 @@
move-result-object p1 move-result-object p1
invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookProfiles(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object p1
const-string v0, "items" const-string v0, "items"
.line 3 .line 3
@@ -40,31 +40,33 @@
.method public a(Lorg/json/JSONObject;)Lcom/vk/dto/music/CurrentAccountInformation; .method public a(Lorg/json/JSONObject;)Lcom/vk/dto/music/CurrentAccountInformation;
.locals 1 .locals 1
const-string v0, "response" # const-string v0, "response"
.line 2 # .line 2
invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject; # invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;
move-result-object p1 # move-result-object p1
const-string v0, "has_music_subscription" # const-string v0, "has_music_subscription"
.line 3 # .line 3
invoke-virtual {p1, v0}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I # invoke-virtual {p1, v0}, Lorg/json/JSONObject;->optInt(Ljava/lang/String;)I
move-result p1 # move-result p1
# const/4 v0, 0x1
# if-ne p1, v0, :cond_0
# goto :goto_0
# :cond_0
# const/4 v0, 0x1
# .line 4
# :goto_0
const/4 v0, 0x1 const/4 v0, 0x1
if-ne p1, v0, :cond_0
goto :goto_0
:cond_0
const/4 v0, 0x1
.line 4
:goto_0
new-instance p1, Lcom/vk/dto/music/CurrentAccountInformation; new-instance p1, Lcom/vk/dto/music/CurrentAccountInformation;
invoke-direct {p1, v0}, Lcom/vk/dto/music/CurrentAccountInformation;-><init>(Z)V invoke-direct {p1, v0}, Lcom/vk/dto/music/CurrentAccountInformation;-><init>(Z)V
@@ -390,6 +390,8 @@
.method public static final b(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner; .method public static final b(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner;
.locals 1 .locals 1
invoke-static {p0}, Lru/vtosters/hooks/RenameHook;->injectIntoJsonGroup(Lorg/json/JSONObject;)V
sget-object v0, Lcom/vk/dto/newsfeed/Owner;->h:Lcom/vk/dto/newsfeed/Owner$b; sget-object v0, Lcom/vk/dto/newsfeed/Owner;->h:Lcom/vk/dto/newsfeed/Owner$b;
invoke-virtual {v0, p0}, Lcom/vk/dto/newsfeed/Owner$b;->b(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner; invoke-virtual {v0, p0}, Lcom/vk/dto/newsfeed/Owner$b;->b(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner;
@@ -402,6 +404,8 @@
.method public static final c(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner; .method public static final c(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner;
.locals 1 .locals 1
invoke-static {p0}, Lru/vtosters/hooks/RenameHook;->injectIntoJson(Lorg/json/JSONObject;)V
sget-object v0, Lcom/vk/dto/newsfeed/Owner;->h:Lcom/vk/dto/newsfeed/Owner$b; sget-object v0, Lcom/vk/dto/newsfeed/Owner;->h:Lcom/vk/dto/newsfeed/Owner$b;
invoke-virtual {v0, p0}, Lcom/vk/dto/newsfeed/Owner$b;->c(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner; invoke-virtual {v0, p0}, Lcom/vk/dto/newsfeed/Owner$b;->c(Lorg/json/JSONObject;)Lcom/vk/dto/newsfeed/Owner;
@@ -50,10 +50,6 @@
move-result-object p1 move-result-object p1
invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookProfiles(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object p1
const-string v0, "items" const-string v0, "items"
.line 2 .line 2
@@ -50,9 +50,6 @@
move-result-object p1 move-result-object p1
invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookProfiles(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object p1
const-string v0, "items" const-string v0, "items"
.line 2 .line 2
@@ -50,10 +50,6 @@
move-result-object p1 move-result-object p1
invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookProfiles(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object p1
const-string v0, "items" const-string v0, "items"
.line 2 .line 2
@@ -60,6 +60,10 @@
move-result-object p1 move-result-object p1
invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookProfiles(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object p1
const-string v0, "JSONObject(response).getJSONObject(\"response\")" const-string v0, "JSONObject(response).getJSONObject(\"response\")"
invoke-static {p1, v0}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V invoke-static {p1, v0}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
@@ -76,6 +80,10 @@
move-object/from16 v0, p1 move-object/from16 v0, p1
invoke-static {v0}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookProfiles(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object v0
.line 3 .line 3
new-instance v1, Lcom/vk/im/engine/models/ProfilesSimpleInfo; new-instance v1, Lcom/vk/im/engine/models/ProfilesSimpleInfo;
@@ -164,6 +164,10 @@
invoke-static {v0}, Lru/vtosters/hooks/RenameHook;->injectIntoJson(Lorg/json/JSONObject;)V invoke-static {v0}, Lru/vtosters/hooks/RenameHook;->injectIntoJson(Lorg/json/JSONObject;)V
invoke-static {v0}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHook(Lorg/json/JSONObject;)Lorg/json/JSONObject;
move-result-object v0
const-string v2, "" const-string v2, ""
.line 1 .line 1
@@ -52,79 +52,11 @@
} }
.end annotation .end annotation
.line 2 invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookList(Ljava/lang/String;)Landroid/util/SparseArray;
:try_start_0
new-instance v0, Lorg/json/JSONObject;
invoke-direct {v0, p1}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V move-result-object v0
const-string p1, "response"
invoke-virtual {v0, p1}, Lorg/json/JSONObject;->getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
move-result-object p1
invoke-static {p1}, Lru/vtosters/hooks/OnlineFormatterHook;->onlineHookList(Lorg/json/JSONArray;)Lorg/json/JSONArray;
move-result-object p1
.line 3
new-instance v0, Landroid/util/SparseArray;
invoke-virtual {p1}, Lorg/json/JSONArray;->length()I
move-result v1
invoke-direct {v0, v1}, Landroid/util/SparseArray;-><init>(I)V
const/4 v1, 0x0
.line 4
invoke-virtual {p1}, Lorg/json/JSONArray;->length()I
move-result v2
:goto_0
if-ge v1, v2, :cond_0
.line 5
invoke-virtual {p1, v1}, Lorg/json/JSONArray;->getJSONObject(I)Lorg/json/JSONObject;
move-result-object v3
const-string v4, "ja.getJSONObject(i)"
invoke-static {v3, v4}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
invoke-static {v3}, Lcom/vk/im/engine/internal/api_parsers/UserApiParser;->b(Lorg/json/JSONObject;)Lcom/vk/im/engine/models/users/User;
move-result-object v3
.line 6
invoke-virtual {v3}, Lcom/vk/im/engine/models/users/User;->getId()I
move-result v4
invoke-virtual {v0, v4, v3}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V
:try_end_0
.catch Lorg/json/JSONException; {:try_start_0 .. :try_end_0} :catch_0
add-int/lit8 v1, v1, 0x1
goto :goto_0
:cond_0
return-object v0 return-object v0
:catch_0
move-exception p1
.line 7
new-instance v0, Lcom/vk/api/sdk/exceptions/VKApiIllegalResponseException;
invoke-direct {v0, p1}, Lcom/vk/api/sdk/exceptions/VKApiIllegalResponseException;-><init>(Ljava/lang/Throwable;)V
throw v0
.end method .end method
.method public bridge synthetic a(Ljava/lang/String;)Ljava/lang/Object; .method public bridge synthetic a(Ljava/lang/String;)Ljava/lang/Object;
@@ -1,118 +0,0 @@
.class public final enum Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
.super Ljava/lang/Enum;
.source "VideoTracker.java"
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/vk/libvideo/VideoTracker;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x4019
name = "FullscreenTransition"
.end annotation
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Enum<",
"Lcom/vk/libvideo/VideoTracker$FullscreenTransition;",
">;"
}
.end annotation
# static fields
.field private static final synthetic $VALUES:[Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
.field public static final enum SCREEN_ROTATION:Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
.field public static final enum TAP:Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
# direct methods
.method static constructor <clinit>()V
.locals 4
.line 1
new-instance v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
const/4 v1, 0x0
const-string v2, "TAP"
invoke-direct {v0, v2, v1}, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->TAP:Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
new-instance v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
const/4 v2, 0x1
const-string v3, "SCREEN_ROTATION"
invoke-direct {v0, v3, v2}, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->SCREEN_ROTATION:Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
const/4 v0, 0x2
new-array v0, v0, [Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
.line 2
sget-object v3, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->TAP:Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
aput-object v3, v0, v1
sget-object v1, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->SCREEN_ROTATION:Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
aput-object v1, v0, v2
sput-object v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->$VALUES:[Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
return-void
.end method
.method private constructor <init>(Ljava/lang/String;I)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
.line 1
invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
return-void
.end method
.method public static valueOf(Ljava/lang/String;)Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
.locals 1
.line 1
const-class v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
move-result-object p0
check-cast p0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
return-object p0
.end method
.method public static values()[Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
.locals 1
.line 1
sget-object v0, Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->$VALUES:[Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
invoke-virtual {v0}, [Lcom/vk/libvideo/VideoTracker$FullscreenTransition;->clone()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Lcom/vk/libvideo/VideoTracker$FullscreenTransition;
return-object v0
.end method
@@ -1,134 +0,0 @@
.class public final enum Lcom/vk/libvideo/VideoTracker$PlayerType;
.super Ljava/lang/Enum;
.source "VideoTracker.java"
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/vk/libvideo/VideoTracker;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x4019
name = "PlayerType"
.end annotation
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Enum<",
"Lcom/vk/libvideo/VideoTracker$PlayerType;",
">;"
}
.end annotation
# static fields
.field private static final synthetic $VALUES:[Lcom/vk/libvideo/VideoTracker$PlayerType;
.field public static final enum CAROUSEL:Lcom/vk/libvideo/VideoTracker$PlayerType;
.field public static final enum FULLSCREEN:Lcom/vk/libvideo/VideoTracker$PlayerType;
.field public static final enum INLINE:Lcom/vk/libvideo/VideoTracker$PlayerType;
# direct methods
.method static constructor <clinit>()V
.locals 5
.line 1
new-instance v0, Lcom/vk/libvideo/VideoTracker$PlayerType;
const/4 v1, 0x0
const-string v2, "INLINE"
invoke-direct {v0, v2, v1}, Lcom/vk/libvideo/VideoTracker$PlayerType;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$PlayerType;->INLINE:Lcom/vk/libvideo/VideoTracker$PlayerType;
new-instance v0, Lcom/vk/libvideo/VideoTracker$PlayerType;
const/4 v2, 0x1
const-string v3, "CAROUSEL"
invoke-direct {v0, v3, v2}, Lcom/vk/libvideo/VideoTracker$PlayerType;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$PlayerType;->CAROUSEL:Lcom/vk/libvideo/VideoTracker$PlayerType;
new-instance v0, Lcom/vk/libvideo/VideoTracker$PlayerType;
const/4 v3, 0x2
const-string v4, "FULLSCREEN"
invoke-direct {v0, v4, v3}, Lcom/vk/libvideo/VideoTracker$PlayerType;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$PlayerType;->FULLSCREEN:Lcom/vk/libvideo/VideoTracker$PlayerType;
const/4 v0, 0x3
new-array v0, v0, [Lcom/vk/libvideo/VideoTracker$PlayerType;
.line 2
sget-object v4, Lcom/vk/libvideo/VideoTracker$PlayerType;->INLINE:Lcom/vk/libvideo/VideoTracker$PlayerType;
aput-object v4, v0, v1
sget-object v1, Lcom/vk/libvideo/VideoTracker$PlayerType;->CAROUSEL:Lcom/vk/libvideo/VideoTracker$PlayerType;
aput-object v1, v0, v2
sget-object v1, Lcom/vk/libvideo/VideoTracker$PlayerType;->FULLSCREEN:Lcom/vk/libvideo/VideoTracker$PlayerType;
aput-object v1, v0, v3
sput-object v0, Lcom/vk/libvideo/VideoTracker$PlayerType;->$VALUES:[Lcom/vk/libvideo/VideoTracker$PlayerType;
return-void
.end method
.method private constructor <init>(Ljava/lang/String;I)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
.line 1
invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
return-void
.end method
.method public static valueOf(Ljava/lang/String;)Lcom/vk/libvideo/VideoTracker$PlayerType;
.locals 1
.line 1
const-class v0, Lcom/vk/libvideo/VideoTracker$PlayerType;
invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
move-result-object p0
check-cast p0, Lcom/vk/libvideo/VideoTracker$PlayerType;
return-object p0
.end method
.method public static values()[Lcom/vk/libvideo/VideoTracker$PlayerType;
.locals 1
.line 1
sget-object v0, Lcom/vk/libvideo/VideoTracker$PlayerType;->$VALUES:[Lcom/vk/libvideo/VideoTracker$PlayerType;
invoke-virtual {v0}, [Lcom/vk/libvideo/VideoTracker$PlayerType;->clone()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Lcom/vk/libvideo/VideoTracker$PlayerType;
return-object v0
.end method
@@ -1,118 +0,0 @@
.class public final enum Lcom/vk/libvideo/VideoTracker$ResizeAction;
.super Ljava/lang/Enum;
.source "VideoTracker.java"
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/vk/libvideo/VideoTracker;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x4019
name = "ResizeAction"
.end annotation
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Enum<",
"Lcom/vk/libvideo/VideoTracker$ResizeAction;",
">;"
}
.end annotation
# static fields
.field private static final synthetic $VALUES:[Lcom/vk/libvideo/VideoTracker$ResizeAction;
.field public static final enum BUTTON:Lcom/vk/libvideo/VideoTracker$ResizeAction;
.field public static final enum GESTURE:Lcom/vk/libvideo/VideoTracker$ResizeAction;
# direct methods
.method static constructor <clinit>()V
.locals 4
.line 1
new-instance v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;
const/4 v1, 0x0
const-string v2, "BUTTON"
invoke-direct {v0, v2, v1}, Lcom/vk/libvideo/VideoTracker$ResizeAction;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;->BUTTON:Lcom/vk/libvideo/VideoTracker$ResizeAction;
new-instance v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;
const/4 v2, 0x1
const-string v3, "GESTURE"
invoke-direct {v0, v3, v2}, Lcom/vk/libvideo/VideoTracker$ResizeAction;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;->GESTURE:Lcom/vk/libvideo/VideoTracker$ResizeAction;
const/4 v0, 0x2
new-array v0, v0, [Lcom/vk/libvideo/VideoTracker$ResizeAction;
.line 2
sget-object v3, Lcom/vk/libvideo/VideoTracker$ResizeAction;->BUTTON:Lcom/vk/libvideo/VideoTracker$ResizeAction;
aput-object v3, v0, v1
sget-object v1, Lcom/vk/libvideo/VideoTracker$ResizeAction;->GESTURE:Lcom/vk/libvideo/VideoTracker$ResizeAction;
aput-object v1, v0, v2
sput-object v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;->$VALUES:[Lcom/vk/libvideo/VideoTracker$ResizeAction;
return-void
.end method
.method private constructor <init>(Ljava/lang/String;I)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
.line 1
invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
return-void
.end method
.method public static valueOf(Ljava/lang/String;)Lcom/vk/libvideo/VideoTracker$ResizeAction;
.locals 1
.line 1
const-class v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;
invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
move-result-object p0
check-cast p0, Lcom/vk/libvideo/VideoTracker$ResizeAction;
return-object p0
.end method
.method public static values()[Lcom/vk/libvideo/VideoTracker$ResizeAction;
.locals 1
.line 1
sget-object v0, Lcom/vk/libvideo/VideoTracker$ResizeAction;->$VALUES:[Lcom/vk/libvideo/VideoTracker$ResizeAction;
invoke-virtual {v0}, [Lcom/vk/libvideo/VideoTracker$ResizeAction;->clone()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Lcom/vk/libvideo/VideoTracker$ResizeAction;
return-object v0
.end method
@@ -1,118 +0,0 @@
.class public final enum Lcom/vk/libvideo/VideoTracker$RewindType;
.super Ljava/lang/Enum;
.source "VideoTracker.java"
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/vk/libvideo/VideoTracker;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x4019
name = "RewindType"
.end annotation
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Enum<",
"Lcom/vk/libvideo/VideoTracker$RewindType;",
">;"
}
.end annotation
# static fields
.field private static final synthetic $VALUES:[Lcom/vk/libvideo/VideoTracker$RewindType;
.field public static final enum DOUBLE_TAP:Lcom/vk/libvideo/VideoTracker$RewindType;
.field public static final enum SLIDER:Lcom/vk/libvideo/VideoTracker$RewindType;
# direct methods
.method static constructor <clinit>()V
.locals 4
.line 1
new-instance v0, Lcom/vk/libvideo/VideoTracker$RewindType;
const/4 v1, 0x0
const-string v2, "SLIDER"
invoke-direct {v0, v2, v1}, Lcom/vk/libvideo/VideoTracker$RewindType;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$RewindType;->SLIDER:Lcom/vk/libvideo/VideoTracker$RewindType;
new-instance v0, Lcom/vk/libvideo/VideoTracker$RewindType;
const/4 v2, 0x1
const-string v3, "DOUBLE_TAP"
invoke-direct {v0, v3, v2}, Lcom/vk/libvideo/VideoTracker$RewindType;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$RewindType;->DOUBLE_TAP:Lcom/vk/libvideo/VideoTracker$RewindType;
const/4 v0, 0x2
new-array v0, v0, [Lcom/vk/libvideo/VideoTracker$RewindType;
.line 2
sget-object v3, Lcom/vk/libvideo/VideoTracker$RewindType;->SLIDER:Lcom/vk/libvideo/VideoTracker$RewindType;
aput-object v3, v0, v1
sget-object v1, Lcom/vk/libvideo/VideoTracker$RewindType;->DOUBLE_TAP:Lcom/vk/libvideo/VideoTracker$RewindType;
aput-object v1, v0, v2
sput-object v0, Lcom/vk/libvideo/VideoTracker$RewindType;->$VALUES:[Lcom/vk/libvideo/VideoTracker$RewindType;
return-void
.end method
.method private constructor <init>(Ljava/lang/String;I)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
.line 1
invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
return-void
.end method
.method public static valueOf(Ljava/lang/String;)Lcom/vk/libvideo/VideoTracker$RewindType;
.locals 1
.line 1
const-class v0, Lcom/vk/libvideo/VideoTracker$RewindType;
invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
move-result-object p0
check-cast p0, Lcom/vk/libvideo/VideoTracker$RewindType;
return-object p0
.end method
.method public static values()[Lcom/vk/libvideo/VideoTracker$RewindType;
.locals 1
.line 1
sget-object v0, Lcom/vk/libvideo/VideoTracker$RewindType;->$VALUES:[Lcom/vk/libvideo/VideoTracker$RewindType;
invoke-virtual {v0}, [Lcom/vk/libvideo/VideoTracker$RewindType;->clone()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Lcom/vk/libvideo/VideoTracker$RewindType;
return-object v0
.end method
@@ -1,150 +0,0 @@
.class public final enum Lcom/vk/libvideo/VideoTracker$Screen;
.super Ljava/lang/Enum;
.source "VideoTracker.java"
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/vk/libvideo/VideoTracker;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x4019
name = "Screen"
.end annotation
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Enum<",
"Lcom/vk/libvideo/VideoTracker$Screen;",
">;"
}
.end annotation
# static fields
.field private static final synthetic $VALUES:[Lcom/vk/libvideo/VideoTracker$Screen;
.field public static final enum CAROUSEL:Lcom/vk/libvideo/VideoTracker$Screen;
.field public static final enum INLINE:Lcom/vk/libvideo/VideoTracker$Screen;
.field public static final enum LANDSCAPE:Lcom/vk/libvideo/VideoTracker$Screen;
.field public static final enum PORTRAIT:Lcom/vk/libvideo/VideoTracker$Screen;
# direct methods
.method static constructor <clinit>()V
.locals 6
.line 1
new-instance v0, Lcom/vk/libvideo/VideoTracker$Screen;
const/4 v1, 0x0
const-string v2, "INLINE"
invoke-direct {v0, v2, v1}, Lcom/vk/libvideo/VideoTracker$Screen;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$Screen;->INLINE:Lcom/vk/libvideo/VideoTracker$Screen;
new-instance v0, Lcom/vk/libvideo/VideoTracker$Screen;
const/4 v2, 0x1
const-string v3, "CAROUSEL"
invoke-direct {v0, v3, v2}, Lcom/vk/libvideo/VideoTracker$Screen;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$Screen;->CAROUSEL:Lcom/vk/libvideo/VideoTracker$Screen;
new-instance v0, Lcom/vk/libvideo/VideoTracker$Screen;
const/4 v3, 0x2
const-string v4, "PORTRAIT"
invoke-direct {v0, v4, v3}, Lcom/vk/libvideo/VideoTracker$Screen;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$Screen;->PORTRAIT:Lcom/vk/libvideo/VideoTracker$Screen;
new-instance v0, Lcom/vk/libvideo/VideoTracker$Screen;
const/4 v4, 0x3
const-string v5, "LANDSCAPE"
invoke-direct {v0, v5, v4}, Lcom/vk/libvideo/VideoTracker$Screen;-><init>(Ljava/lang/String;I)V
sput-object v0, Lcom/vk/libvideo/VideoTracker$Screen;->LANDSCAPE:Lcom/vk/libvideo/VideoTracker$Screen;
const/4 v0, 0x4
new-array v0, v0, [Lcom/vk/libvideo/VideoTracker$Screen;
.line 2
sget-object v5, Lcom/vk/libvideo/VideoTracker$Screen;->INLINE:Lcom/vk/libvideo/VideoTracker$Screen;
aput-object v5, v0, v1
sget-object v1, Lcom/vk/libvideo/VideoTracker$Screen;->CAROUSEL:Lcom/vk/libvideo/VideoTracker$Screen;
aput-object v1, v0, v2
sget-object v1, Lcom/vk/libvideo/VideoTracker$Screen;->PORTRAIT:Lcom/vk/libvideo/VideoTracker$Screen;
aput-object v1, v0, v3
sget-object v1, Lcom/vk/libvideo/VideoTracker$Screen;->LANDSCAPE:Lcom/vk/libvideo/VideoTracker$Screen;
aput-object v1, v0, v4
sput-object v0, Lcom/vk/libvideo/VideoTracker$Screen;->$VALUES:[Lcom/vk/libvideo/VideoTracker$Screen;
return-void
.end method
.method private constructor <init>(Ljava/lang/String;I)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
.line 1
invoke-direct {p0, p1, p2}, Ljava/lang/Enum;-><init>(Ljava/lang/String;I)V
return-void
.end method
.method public static valueOf(Ljava/lang/String;)Lcom/vk/libvideo/VideoTracker$Screen;
.locals 1
.line 1
const-class v0, Lcom/vk/libvideo/VideoTracker$Screen;
invoke-static {v0, p0}, Ljava/lang/Enum;->valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
move-result-object p0
check-cast p0, Lcom/vk/libvideo/VideoTracker$Screen;
return-object p0
.end method
.method public static values()[Lcom/vk/libvideo/VideoTracker$Screen;
.locals 1
.line 1
sget-object v0, Lcom/vk/libvideo/VideoTracker$Screen;->$VALUES:[Lcom/vk/libvideo/VideoTracker$Screen;
invoke-virtual {v0}, [Lcom/vk/libvideo/VideoTracker$Screen;->clone()Ljava/lang/Object;
move-result-object v0
check-cast v0, [Lcom/vk/libvideo/VideoTracker$Screen;
return-object v0
.end method
File diff suppressed because it is too large Load Diff
@@ -196,6 +196,21 @@
.method public a(Lcom/vk/dto/music/MusicTrack;)V .method public a(Lcom/vk/dto/music/MusicTrack;)V
.locals 3 .locals 3
invoke-static {}, Lru/vtosters/hooks/other/Preferences;->sendMusicMetrics()Z
move-result v1
if-nez v1, :cond_228
const/4 v0, 0x1
new-instance p1, Lcom/vk/dto/music/CurrentAccountInformation;
invoke-direct {p1, v0}, Lcom/vk/dto/music/CurrentAccountInformation;-><init>(Z)V
return-void
:cond_228
const/4 v0, 0x2 const/4 v0, 0x2
new-array v0, v0, [Ljava/lang/Object; new-array v0, v0, [Ljava/lang/Object;
@@ -224,41 +239,41 @@
.line 14 .line 14
:cond_0 :cond_0
# new-instance v0, Lcom/vk/api/audio/AudioSendStartEvent; new-instance v0, Lcom/vk/api/audio/AudioSendStartEvent;
# invoke-virtual {p1}, Lcom/vk/dto/music/MusicTrack;->y1()Ljava/lang/String; invoke-virtual {p1}, Lcom/vk/dto/music/MusicTrack;->y1()Ljava/lang/String;
# move-result-object p1 move-result-object p1
# sget-object v2, Lcom/vk/api/base/ApiConfig;->d:Lcom/vk/api/base/ApiConfig$a; sget-object v2, Lcom/vk/api/base/ApiConfig;->d:Lcom/vk/api/base/ApiConfig$a;
# invoke-interface {v2}, Lcom/vk/api/base/ApiConfig$a;->O1()Ljava/lang/String; invoke-interface {v2}, Lcom/vk/api/base/ApiConfig$a;->O1()Ljava/lang/String;
# move-result-object v2 move-result-object v2
# invoke-direct {v0, p1, v2}, Lcom/vk/api/audio/AudioSendStartEvent;-><init>(Ljava/lang/String;Ljava/lang/String;)V invoke-direct {v0, p1, v2}, Lcom/vk/api/audio/AudioSendStartEvent;-><init>(Ljava/lang/String;Ljava/lang/String;)V
# const/4 p1, 0x0 const/4 p1, 0x0
# .line 15 .line 15
# invoke-static {v0, p1, v1, p1}, Lcom/vk/api/base/ApiRequest;->d(Lcom/vk/api/base/ApiRequest;Lcom/vk/api/base/ApiThreadHolder;ILjava/lang/Object;)Lio/reactivex/Observable; invoke-static {v0, p1, v1, p1}, Lcom/vk/api/base/ApiRequest;->d(Lcom/vk/api/base/ApiRequest;Lcom/vk/api/base/ApiThreadHolder;ILjava/lang/Object;)Lio/reactivex/Observable;
# move-result-object p1 move-result-object p1
# .line 16 .line 16
# new-instance v0, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$d; new-instance v0, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$d;
# invoke-direct {v0, p0}, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$d;-><init>(Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl;)V invoke-direct {v0, p0}, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$d;-><init>(Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl;)V
# .line 17 .line 17
# sget-object v1, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$e;->a:Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$e; sget-object v1, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$e;->a:Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl$e;
# .line 18 .line 18
# invoke-virtual {p1, v0, v1}, Lio/reactivex/Observable;->a(Lio/reactivex/functions/Consumer;Lio/reactivex/functions/Consumer;)Lio/reactivex/disposables/Disposable; invoke-virtual {p1, v0, v1}, Lio/reactivex/Observable;->a(Lio/reactivex/functions/Consumer;Lio/reactivex/functions/Consumer;)Lio/reactivex/disposables/Disposable;
# move-result-object p1 move-result-object p1
# iput-object p1, p0, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl;->a:Lio/reactivex/disposables/Disposable; iput-object p1, p0, Lcom/vk/music/notifications/restriction/MusicRestrictionModelImpl;->a:Lio/reactivex/disposables/Disposable;
return-void return-void
.end method .end method
@@ -1,70 +0,0 @@
.class public final Lcom/vk/music/stats/VKMusicStatsTracker$a;
.super Ljava/lang/Object;
.source "VKMusicStatsTracker.kt"
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/vk/music/stats/VKMusicStatsTracker;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x19
name = "a"
.end annotation
# direct methods
.method private constructor <init>()V
.locals 0
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public synthetic constructor <init>(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
.locals 0
.line 2
invoke-direct {p0}, Lcom/vk/music/stats/VKMusicStatsTracker$a;-><init>()V
return-void
.end method
# virtual methods
.method public final a(Lcom/vtosters/lite/data/Analytics$l;)V
.locals 3
.annotation build Landroidx/annotation/VisibleForTesting;
.end annotation
const/4 v0, 0x3
new-array v0, v0, [Ljava/lang/Object;
const/4 v1, 0x0
const-string v2, "MusicStats"
aput-object v2, v0, v1
const/4 v1, 0x1
const-string v2, "[VK_TRACKER]"
aput-object v2, v0, v1
const/4 v1, 0x2
aput-object p1, v0, v1
.line 1
invoke-static {v0}, Lcom/vk/music/logger/MusicLogger;->a([Ljava/lang/Object;)V
.line 2
invoke-virtual {p1}, Lcom/vtosters/lite/data/Analytics$l;->b()Lcom/vtosters/lite/data/Analytics$l;
return-void
.end method
@@ -1,841 +0,0 @@
.class public final Lcom/vk/music/stats/VKMusicStatsTracker;
.super Ljava/lang/Object;
.source "VKMusicStatsTracker.kt"
# interfaces
.implements Lcom/vk/music/stats/MusicStatsTracker;
# annotations
.annotation system Ldalvik/annotation/MemberClasses;
value = {
Lcom/vk/music/stats/VKMusicStatsTracker$a;
}
.end annotation
# static fields
.field public static final c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
# instance fields
.field private a:Ljava/lang/String;
.field private final b:Lkotlin/jvm/b/Functions2;
.annotation system Ldalvik/annotation/Signature;
value = {
"Lkotlin/jvm/b/Functions2<",
"Ljava/lang/String;",
"Lcom/vtosters/lite/data/Analytics$l;",
">;"
}
.end annotation
.end field
# direct methods
.method static constructor <clinit>()V
.locals 2
new-instance v0, Lcom/vk/music/stats/VKMusicStatsTracker$a;
const/4 v1, 0x0
invoke-direct {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;-><init>(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
sput-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
return-void
.end method
.method public constructor <init>(Lkotlin/jvm/b/Functions2;)V
.locals 0
.annotation system Ldalvik/annotation/Signature;
value = {
"(",
"Lkotlin/jvm/b/Functions2<",
"-",
"Ljava/lang/String;",
"+",
"Lcom/vtosters/lite/data/Analytics$l;",
">;)V"
}
.end annotation
.line 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
iput-object p1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
return-void
.end method
.method private final a(Lcom/vk/music/stats/i/MusicPlaybackParams;Ljava/lang/String;)Lcom/vtosters/lite/data/Analytics$l;
.locals 4
.line 16
iget-object v0, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
invoke-interface {v0, p2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/vtosters/lite/data/Analytics$l;
.line 17
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->c()Ljava/lang/String;
move-result-object v1
const-string v2, "audio_id"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 18
invoke-static {}, Ljava/util/UUID;->randomUUID()Ljava/util/UUID;
move-result-object v1
invoke-virtual {v1}, Ljava/util/UUID;->hashCode()I
move-result v1
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
move-result-object v1
const-string v2, "uuid"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 19
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->l()Z
move-result v1
invoke-static {v1}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
move-result-object v1
const-string v2, "shuffle"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 20
invoke-direct {p0, p1}, Lcom/vk/music/stats/VKMusicStatsTracker;->e(Lcom/vk/music/stats/i/MusicPlaybackParams;)Ljava/lang/String;
move-result-object v1
const-string v2, "reason"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 21
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->i()J
move-result-wide v1
invoke-static {v1, v2}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
move-result-object v1
const-string v2, "start_time"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 22
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->d()J
move-result-wide v1
invoke-static {v1, v2}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
move-result-object v1
const-string v2, "playback_started_at"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 23
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->j()Ljava/lang/String;
move-result-object v1
const-string v2, "track_code"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string v1, "music_start_playback"
.line 24
invoke-static {v1, p2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/Object;)Z
move-result p2
const/4 v1, 0x1
xor-int/2addr p2, v1
if-eqz p2, :cond_0
.line 25
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->a()J
move-result-wide v2
invoke-static {v2, v3}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
move-result-object p2
const-string v2, "duration"
invoke-virtual {v0, v2, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 26
:cond_0
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->b()Lcom/vk/music/player/LoopMode;
move-result-object p2
sget-object v2, Lcom/vk/music/stats/h;->$EnumSwitchMapping$0:[I
invoke-virtual {p2}, Ljava/lang/Enum;->ordinal()I
move-result p2
aget p2, v2, p2
const-string v2, "repeat"
if-eq p2, v1, :cond_2
const/4 v1, 0x2
if-eq p2, v1, :cond_1
goto :goto_0
:cond_1
const-string p2, "all"
.line 27
invoke-virtual {v0, v2, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
goto :goto_0
:cond_2
const-string p2, "one"
.line 28
invoke-virtual {v0, v2, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 29
:goto_0
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->m()Ljava/lang/String;
move-result-object p2
const-string v1, "state"
invoke-virtual {v0, v1, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 30
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->h()Lcom/vk/music/common/MusicPlaybackLaunchContext;
move-result-object p2
.line 31
invoke-virtual {p2}, Lcom/vk/music/common/MusicPlaybackLaunchContext;->v0()Ljava/lang/String;
move-result-object v1
const-string v2, "source"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 32
invoke-virtual {p2}, Lcom/vk/music/common/MusicPlaybackLaunchContext;->v1()Z
move-result v1
if-eqz v1, :cond_3
.line 33
invoke-virtual {p2}, Lcom/vk/music/common/MusicPlaybackLaunchContext;->u1()Ljava/lang/String;
move-result-object v1
const-string v2, "playlist_id"
invoke-virtual {v0, v2, v1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
:cond_3
const/4 v1, 0x4
.line 34
invoke-virtual {p2, v1}, Lcom/vk/music/common/MusicPlaybackLaunchContext;->i(I)Z
move-result v2
if-nez v2, :cond_4
const/16 v2, 0x8
invoke-virtual {p2, v2}, Lcom/vk/music/common/MusicPlaybackLaunchContext;->i(I)Z
move-result v2
if-eqz v2, :cond_5
.line 35
:cond_4
invoke-virtual {p2, v1}, Lcom/vk/music/common/MusicPlaybackLaunchContext;->i(I)Z
move-result p2
invoke-static {p2}, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;
move-result-object p2
const-string v1, "expanded"
invoke-virtual {v0, v1, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 36
:cond_5
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->e()Ljava/lang/String;
move-result-object p2
invoke-static {p2}, Lcom/vk/core/extensions/StringExt;->a(Ljava/lang/CharSequence;)Z
move-result p2
if-eqz p2, :cond_6
.line 37
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->e()Ljava/lang/String;
move-result-object p2
const-string v1, "prev_audio_id"
invoke-virtual {v0, v1, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 38
:cond_6
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->f()Ljava/lang/String;
move-result-object p2
invoke-static {p2}, Lcom/vk/core/extensions/StringExt;->a(Ljava/lang/CharSequence;)Z
move-result p2
if-eqz p2, :cond_7
.line 39
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->f()Ljava/lang/String;
move-result-object p1
const-string p2, "prev_playlist_id"
invoke-virtual {v0, p2, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
:cond_7
return-object v0
.end method
.method private final e(Lcom/vk/music/stats/i/MusicPlaybackParams;)Ljava/lang/String;
.locals 0
.line 1
invoke-virtual {p1}, Lcom/vk/music/stats/i/MusicPlaybackParams;->g()Ljava/lang/String;
move-result-object p1
if-nez p1, :cond_0
.line 2
iget-object p1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->a:Ljava/lang/String;
:cond_0
if-nez p1, :cond_1
const-string p1, "auto"
.line 3
:cond_1
iput-object p1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->a:Ljava/lang/String;
return-object p1
.end method
# virtual methods
.method public a()V
.locals 4
.line 46
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "music_subscription"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "popup"
const-string v3, "background_v2"
.line 47
invoke-virtual {v1, v2, v3}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "action"
const-string v3, "link"
.line 48
invoke-virtual {v1, v2, v3}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "newEventBuilder.invoke(T\u2026ION_POPUP_ACTION, \"link\")"
invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 49
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public a(J)V
.locals 0
.line 3
invoke-static {p0, p1, p2}, Lcom/vk/music/stats/MusicStatsTracker$a;->a(Lcom/vk/music/stats/MusicStatsTracker;J)V
return-void
.end method
.method public a(Landroid/content/Intent;Ljava/lang/String;)V
.locals 0
.line 2
invoke-static {p0, p1, p2}, Lcom/vk/music/stats/MusicStatsTracker$a;->a(Lcom/vk/music/stats/MusicStatsTracker;Landroid/content/Intent;Ljava/lang/String;)V
return-void
.end method
.method public a(Lcom/vk/music/stats/PlayerStateChangedParams;)V
.locals 4
.line 8
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "audio_player"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
.line 9
invoke-virtual {p1}, Lcom/vk/music/stats/PlayerStateChangedParams;->a()Ljava/lang/String;
move-result-object v2
const-string v3, "state"
invoke-virtual {v1, v3, v2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 10
invoke-virtual {p1}, Lcom/vk/music/stats/PlayerStateChangedParams;->c()Ljava/lang/String;
move-result-object v2
const-string v3, "prev_state"
invoke-virtual {v1, v3, v2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 11
invoke-virtual {p1}, Lcom/vk/music/stats/PlayerStateChangedParams;->b()J
move-result-wide v2
invoke-static {v2, v3}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;
move-result-object p1
const-string v2, "duration"
invoke-virtual {v1, v2, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string p1, "newEventBuilder.invoke(T\u2026TION, params.durationSec)"
invoke-static {v1, p1}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 12
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public a(Lcom/vk/music/stats/i/MusicPlaybackParams;)V
.locals 2
.line 7
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
const-string v1, "music_stop_playback"
invoke-direct {p0, p1, v1}, Lcom/vk/music/stats/VKMusicStatsTracker;->a(Lcom/vk/music/stats/i/MusicPlaybackParams;Ljava/lang/String;)Lcom/vtosters/lite/data/Analytics$l;
move-result-object p1
invoke-virtual {v0, p1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public a(Ljava/lang/String;)V
.locals 3
.line 13
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "playlist_start"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "type"
.line 14
invoke-virtual {v1, v2, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string p1, "newEventBuilder.invoke(T\u2026ING_STARTED_TYPE, source)"
invoke-static {v1, p1}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 15
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public a(Ljava/lang/String;Lcom/vk/music/stats/MusicStatsRefer;)V
.locals 2
.line 4
sget-object p2, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v0, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v1, "music_subscription_show"
invoke-interface {v0, v1}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v0
check-cast v0, Lcom/vtosters/lite/data/Analytics$l;
const-string v1, "popup"
.line 5
invoke-virtual {v0, v1, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string p1, "newEventBuilder.invoke(T\u2026ION_POPUP_SOURCE, source)"
invoke-static {v0, p1}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 6
invoke-virtual {p2, v0}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public a(Ljava/lang/String;Ljava/lang/String;)V
.locals 4
const-string v0, "success"
.line 40
invoke-static {v0, p2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/Object;)Z
move-result v1
.line 41
iget-object v2, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v3, "music_subscription_purchase_result"
invoke-interface {v2, v3}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v2
check-cast v2, Lcom/vtosters/lite/data/Analytics$l;
const-string v3, "popup"
.line 42
invoke-virtual {v2, v3, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
if-eqz v1, :cond_0
goto :goto_0
:cond_0
const-string v0, "fail"
:goto_0
const-string p1, "status"
.line 43
invoke-virtual {v2, p1, v0}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
if-nez v1, :cond_1
const-string p1, "reason"
.line 44
invoke-virtual {v2, p1, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
.line 45
:cond_1
sget-object p1, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
const-string p2, "builder"
invoke-static {v2, p2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
invoke-virtual {p1, v2}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public a(Z)V
.locals 0
.line 1
invoke-static {p0, p1}, Lcom/vk/music/stats/MusicStatsTracker$a;->a(Lcom/vk/music/stats/MusicStatsTracker;Z)V
return-void
.end method
.method public b()V
.locals 4
.line 6
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "music_subscription_push"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "action"
const-string v3, "send"
.line 7
invoke-virtual {v1, v2, v3}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "newEventBuilder.invoke(T\u2026ION_POPUP_ACTION, \"send\")"
invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 8
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public b(Lcom/vk/music/stats/i/MusicPlaybackParams;)V
.locals 2
.line 1
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
const-string v1, "music_start_playback"
invoke-direct {p0, p1, v1}, Lcom/vk/music/stats/VKMusicStatsTracker;->a(Lcom/vk/music/stats/i/MusicPlaybackParams;Ljava/lang/String;)Lcom/vtosters/lite/data/Analytics$l;
move-result-object p1
invoke-virtual {v0, p1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public b(Ljava/lang/String;)V
.locals 3
.line 9
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "music_subscription_free_displayed"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "popup"
.line 10
invoke-virtual {v1, v2, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string p1, "newEventBuilder.invoke(T\u2026ION_POPUP_SOURCE, source)"
invoke-static {v1, p1}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 11
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public b(Ljava/lang/String;Ljava/lang/String;)V
.locals 3
.line 2
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "music_subscription_action"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "popup"
.line 3
invoke-virtual {v1, v2, p1}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string p1, "action"
.line 4
invoke-virtual {v1, p1, p2}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string p1, "newEventBuilder.invoke(T\u2026ION_POPUP_ACTION, action)"
invoke-static {v1, p1}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 5
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public b(Z)V
.locals 0
return-void
.end method
.method public c()V
.locals 4
.line 3
sget-object v0, Lcom/vk/music/stats/VKMusicStatsTracker;->c:Lcom/vk/music/stats/VKMusicStatsTracker$a;
iget-object v1, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->b:Lkotlin/jvm/b/Functions2;
const-string v2, "music_subscription_push"
invoke-interface {v1, v2}, Lkotlin/jvm/b/Functions2;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
move-result-object v1
check-cast v1, Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "action"
const-string v3, "open"
.line 4
invoke-virtual {v1, v2, v3}, Lcom/vtosters/lite/data/Analytics$l;->a(Ljava/lang/String;Ljava/lang/Object;)Lcom/vtosters/lite/data/Analytics$l;
const-string v2, "newEventBuilder.invoke(T\u2026ION_POPUP_ACTION, \"open\")"
invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V
.line 5
invoke-virtual {v0, v1}, Lcom/vk/music/stats/VKMusicStatsTracker$a;->a(Lcom/vtosters/lite/data/Analytics$l;)V
return-void
.end method
.method public c(Lcom/vk/music/stats/i/MusicPlaybackParams;)V
.locals 0
.line 1
invoke-static {p0, p1}, Lcom/vk/music/stats/MusicStatsTracker$a;->b(Lcom/vk/music/stats/MusicStatsTracker;Lcom/vk/music/stats/i/MusicPlaybackParams;)V
return-void
.end method
.method public c(Z)V
.locals 0
.line 2
invoke-static {p0, p1}, Lcom/vk/music/stats/MusicStatsTracker$a;->b(Lcom/vk/music/stats/MusicStatsTracker;Z)V
return-void
.end method
.method public d()V
.locals 0
.line 1
invoke-static {p0}, Lcom/vk/music/stats/MusicStatsTracker$a;->a(Lcom/vk/music/stats/MusicStatsTracker;)V
return-void
.end method
.method public d(Lcom/vk/music/stats/i/MusicPlaybackParams;)V
.locals 2
.line 2
iget-object v0, p0, Lcom/vk/music/stats/VKMusicStatsTracker;->a:Ljava/lang/String;
const-string v1, "pause"
invoke-static {v1, v0}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_0
.line 3
invoke-virtual {p0, p1}, Lcom/vk/music/stats/VKMusicStatsTracker;->a(Lcom/vk/music/stats/i/MusicPlaybackParams;)V
:cond_0
return-void
.end method