Compare commits

..
Author SHA1 Message Date
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
15 changed files with 536 additions and 1818 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);
}
}
@@ -11,11 +11,10 @@ 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.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.music.Metrics;
import ru.vtosters.lite.utils.Metrics;
import java.util.Objects;
import java.util.UUID;
@@ -161,22 +160,21 @@ public final class VKMusicStatsTracker implements MusicStatsTracker {
}
private void makeMetricsRequest(MusicPlaybackParams musicPlaybackParams, String str) throws JSONException {
JSONArray events = new JSONArray();
JSONObject event = new JSONObject();
if (str.equals("music_stop_playback")) {
event.put("e", str);
event.put("audio_id", musicPlaybackParams.c());
event.put("start_time", "0");
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());
events.put(event);
} else {
event.put("e", str);
event.put("audio_id", musicPlaybackParams.c());
event.put("start_time", "0");
event.put("start_time", musicPlaybackParams.i());
event.put("shuffle", "false");
event.put("reason", "auto");
event.put("state", "app");
@@ -184,11 +182,9 @@ public final class VKMusicStatsTracker implements MusicStatsTracker {
if (StringExt.a((CharSequence) musicPlaybackParams.e())) {
event.put("prev_audio_id", musicPlaybackParams.e());
}
events.put(event);
}
Metrics.trackEvents(events.toString());
Metrics.trackEvents(event, true);
}
private Analytics.l a(MusicPlaybackParams musicPlaybackParams, String str) {
@@ -100,8 +100,8 @@ public class Preferences {
return getBoolValue("vkme", false);
}
public static boolean autocache() {
return getBoolValue("autocache", false);
public static int autocache() {
return Preferences.getPreferences().getInt("autocaching", 0);
}
public static boolean adsstories() {
@@ -30,6 +30,7 @@ import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.di.singleton.VtOkHttpClient;
import ru.vtosters.lite.downloaders.AudioDownloader;
import ru.vtosters.lite.music.cache.MusicCacheImpl;
import ru.vtosters.lite.utils.AccountManagerUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.music.MusicTrackUtils;
@@ -50,13 +51,14 @@ public class LastFMScrobbler {
var access_key = !TextUtils.isEmpty(musictrack.J) ? musictrack.J : "";
var album_id = musictrack.I;
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) {
Log.d("Scrobbler", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid);
return;
}
if (Preferences.autocache() && !MusicCacheImpl.isCachedTrack(uid)) {
if (needToCache(isOwnTrack) && !MusicCacheImpl.isCachedTrack(uid)) {
if (LibVKXClient.isIntegrationEnabled()) {
LibVKXClient.getInstance().runOnService(service -> {
try {
@@ -73,6 +75,12 @@ public class LastFMScrobbler {
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(
long duration,
String artist,
@@ -1,38 +0,0 @@
package ru.vtosters.lite.music;
import android.util.Log;
import com.vk.core.network.Network;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import static com.vk.core.network.Network.ClientType.CLIENT_API;
import static ru.vtosters.lite.proxy.ProxyUtils.getApi;
import static ru.vtosters.lite.utils.AccountManagerUtils.getUserToken;
public class Metrics {
public static void trackEvents(String object) {
trackEventsRequest(object);
}
private static void trackEventsRequest(String object) {
Request req = new Request.a()
.b("https://" + getApi() + "/method/stats.trackEvents?events=" + object + "&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("MusicMetrics", response.a().g());
}
});
}
}
@@ -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.a;
import com.vk.dto.music.MusicTrack;
import com.vk.dto.music.Playlist;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.List;
@@ -20,7 +22,6 @@ import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import com.vk.dto.music.Playlist;
import ru.vtosters.hooks.other.Preferences;
import ru.vtosters.lite.music.converter.ts.MpegDemuxer;
import ru.vtosters.lite.music.interfaces.Callback;
@@ -37,17 +38,29 @@ public final class Mp3Downloader implements ITrackDownloader {
@Override
public void download(MusicTrack track, Callback callback, Playlist playlist) {
String uri = track.D;
if (Objects.requireNonNull(uri).isEmpty()) {
String msg = "link error: " + track.y1() + ", title: " + Mp3Downloader.getTitle(track);
Log.d("Mp3Downloader", msg);
throw new RuntimeException(msg);
}
var tsParser = new com.google.android.exoplayer2.source.hls.playlist.h(e.a(track.D));
var baseUri = track.D.substring(0, track.D.lastIndexOf("/") + 1);
if (Objects.requireNonNull(uri).contains("master.m3u8?siren=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 {
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);
MpegDemuxer.convert(buff, outputFile.getAbsolutePath());
@@ -3,9 +3,12 @@ package ru.vtosters.lite.ui.fragments;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import bruhcollective.itaysonlab.libvkx.client.LibVKXClient;
import com.vk.core.dialogs.alert.VkAlertDialog;
import com.vk.dto.music.Playlist;
@@ -20,10 +23,13 @@ import ru.vtosters.lite.ui.PreferenceFragmentUtils;
import ru.vtosters.lite.utils.AndroidUtils;
import ru.vtosters.lite.utils.LifecycleUtils;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static ru.vtosters.hooks.other.ThemesUtils.getTextAttr;
public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
private static final ExecutorService executor = Executors.newCachedThreadPool();
@@ -93,15 +99,38 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
}
).setEnabled(!MusicCacheImpl.isEmpty());
PreferenceFragmentUtils.addMaterialSwitchPreference(
PreferenceFragmentUtils.addPreference(
getPreferenceScreen(),
"autocache",
"autocache_params",
getString(com.vtosters.lite.R.string.autocache_title),
getString(com.vtosters.lite.R.string.autocache_summ),
getAutocacheSumm(),
null,
false,
(preference, o) -> {
Preferences.getPreferences().edit().putBoolean("autocache", (boolean) o).apply();
preference -> {
List<String> items = Arrays.asList("Не кешировать", "Только свои", "Все");
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;
}
);
@@ -117,6 +146,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
false,
(preference, o) -> {
Preferences.getPreferences().edit().putBoolean("dldir", (boolean) o).apply();
LifecycleUtils.restartApplicationWithTimer();
return true;
}
);
@@ -165,6 +195,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
return;
}
Preferences.setMetadataSeparator(separator.getText().toString());
findPreference("metadataSeparator").setSummary(separator.getText().toString());
})
.setNegativeButton("Отмена", (dialog, which) -> dialog.cancel())
.show();
@@ -178,7 +209,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
getPreferenceScreen(),
"sendMusicMetrics",
"Отправлять статистику",
"Статистика прослушиваний необходима для работы рекомендаций музыки\n\nЕсли вас не интересуют рекомендации - смело отключайте данную функцию",
"Статистика прослушиваний необходима для работы рекомендаций и истории прослушивания музыки",
null,
true,
(preference, o) -> {
@@ -333,6 +364,15 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
.show();
}
private static String getAutocacheSumm() {
int autocache = Preferences.autocache();
return switch (autocache) {
case 1 -> "Только для своих";
case 2 -> "Кешировать всё";
default -> "Отключено";
};
}
public void updateLastFmPref() {
if (LastFMScrobbler.isLoggedIn()) {
findPreference("lastfm_auth").setSummary(getString(com.vtosters.lite.R.string.lastfm_authorized_as) + " " + LastFMScrobbler.getUserName());
@@ -354,7 +394,8 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
.show();
}
private static void cachedPlaylistsDialog(Context ctx) {
@SuppressLint("DefaultLocale")
private void cachedPlaylistsDialog(Context ctx) {
List<Playlist> playlists = PlaylistCacheDbDelegate.getAllPlaylists(ctx);
String[] playlistNames = new String[playlists.size()];
@@ -369,6 +410,7 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
String playlistId = selectedPlaylist.v1();
PlaylistCacheDbDelegate.deletePlaylist(ctx, playlistId);
AndroidUtils.sendToast("Плейлист удален");
findPreference("cached_playlists").setSummary(String.format("Скачано плейлистов: %d", MusicCacheImpl.getPlaylists().size()));
});
builder.show();
@@ -378,10 +420,11 @@ public class MusicFragment extends TrackedMaterialPreferenceToolbarFragment {
new VkAlertDialog.Builder(ctx)
.setTitle(com.vtosters.lite.R.string.warning)
.setMessage(com.vtosters.lite.R.string.cached_tracks_remove_confirm)
.setPositiveButton(com.vtosters.lite.R.string.yes,
(dialog, which) -> executor.submit(MusicCacheImpl::clear))
.setNeutralButton(com.vtosters.lite.R.string.no,
(dialog, which) -> dialog.cancel())
.setPositiveButton(com.vtosters.lite.R.string.yes, (dialog, which) -> {
executor.submit(MusicCacheImpl::clear);
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();
}
@@ -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());
}
});
}
}
+5
View File
@@ -31,6 +31,11 @@
android:key="__dbg_disable_video_feed"
android:summary="@string/interfacevideorecsum"
android:title="@string/interfacevideorec"/>
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="true"
android:key="sendVideoMetrics"
android:summary="Статистика необходима для работы рекомендаций и истории видео"
android:title="Отправлять статистику"/>
<Preference
android:key="clearvideohistory"
android:summary="@string/clearvideohistory_summ"
@@ -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