diff --git a/app/build.gradle b/app/build.gradle
index a08ece6e..f6f39a83 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -5,12 +5,19 @@ android {
buildToolsVersion "30.0.2"
defaultConfig {
- applicationId "pl.jakubweg"
+ applicationId "vanced.integrations"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
multiDexEnabled false
+
+ Properties properties = new Properties()
+ if (rootProject.file("local.properties").exists()) {
+ properties.load(rootProject.file("local.properties").newDataInputStream())
+ }
+
+ buildConfigField "String", "YT_API_KEY", "\"${properties.getProperty("youtubeAPIKey", "")}\""
}
buildTypes {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 430ba65c..7609a74c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,4 +1,4 @@
+ package="vanced.integrations">
\ No newline at end of file
diff --git a/app/src/main/java/fi/vanced/libraries/youtube/player/VideoInformation.java b/app/src/main/java/fi/vanced/libraries/youtube/player/VideoInformation.java
index 968055b8..e11d5414 100644
--- a/app/src/main/java/fi/vanced/libraries/youtube/player/VideoInformation.java
+++ b/app/src/main/java/fi/vanced/libraries/youtube/player/VideoInformation.java
@@ -10,22 +10,29 @@ public class VideoInformation {
private static final String TAG = "VI - VideoInfo";
public static String currentVideoId;
- public static Integer dislikeCount = null;
- public static String channelName = null;
+ public static Integer dislikeCount;
+ public static String channelName;
public static long lastKnownVideoTime = -1L;
+ private static boolean tempInfoSaved = false;
+ private static String tempVideoId;
+ private static Integer tempDislikeCount;
+
// Call hook in the YT code when the video changes
public static void setCurrentVideoId(final String videoId) {
if (videoId == null) {
if (debug) {
Log.d(TAG, "setCurrentVideoId - new id was null - currentVideoId was" + currentVideoId);
}
- currentVideoId = null;
- dislikeCount = null;
- channelName = null;
+ clearInformation();
return;
}
+ // Restore temporary information that was stored from the last watched video
+ if (tempInfoSaved) {
+ restoreTempInformation();
+ }
+
if (videoId.equals(currentVideoId)) {
if (debug) {
Log.d(TAG, "setCurrentVideoId - new and current video were equal - " + videoId);
@@ -42,4 +49,36 @@ public class VideoInformation {
// New video
ReturnYouTubeDislikes.newVideoLoaded(videoId);
}
+
+ // Call hook in the YT code when the video ends
+ public static void videoEnded() {
+ saveTempInformation();
+ clearInformation();
+ }
+
+ // Information is cleared once a video ends
+ // It's cleared because the setCurrentVideoId isn't called for Shorts
+ // so Shorts would otherwise use the information from the last watched video
+ private static void clearInformation() {
+ currentVideoId = null;
+ dislikeCount = null;
+ channelName = null;
+ }
+
+ // Temporary information is saved once a video ends
+ // so that if the user watches the same video again,
+ // the information can be restored without having to fetch again
+ private static void saveTempInformation() {
+ tempVideoId = currentVideoId;
+ tempDislikeCount = dislikeCount;
+ tempInfoSaved = true;
+ }
+
+ private static void restoreTempInformation() {
+ currentVideoId = tempVideoId;
+ dislikeCount = tempDislikeCount;
+ tempVideoId = null;
+ tempDislikeCount = null;
+ tempInfoSaved = false;
+ }
}
diff --git a/app/src/main/java/fi/vanced/libraries/youtube/whitelisting/requests/WhitelistRequester.java b/app/src/main/java/fi/vanced/libraries/youtube/whitelisting/requests/WhitelistRequester.java
index ab8fe046..8f1bbe4a 100644
--- a/app/src/main/java/fi/vanced/libraries/youtube/whitelisting/requests/WhitelistRequester.java
+++ b/app/src/main/java/fi/vanced/libraries/youtube/whitelisting/requests/WhitelistRequester.java
@@ -22,8 +22,10 @@ import java.nio.charset.StandardCharsets;
import fi.vanced.libraries.youtube.player.ChannelModel;
import fi.vanced.libraries.youtube.whitelisting.Whitelist;
import fi.vanced.libraries.youtube.whitelisting.WhitelistType;
+import fi.vanced.utils.VancedUtils;
import fi.vanced.utils.requests.Requester;
import fi.vanced.utils.requests.Route;
+import vanced.integrations.BuildConfig;
public class WhitelistRequester {
private static final String YT_API_URL = "https://www.youtube.com/youtubei/v1/";
@@ -32,14 +34,14 @@ public class WhitelistRequester {
public static void addChannelToWhitelist(WhitelistType whitelistType, View view, ImageView buttonIcon, Context context) {
try {
- HttpURLConnection connection = getConnectionFromRoute(WhitelistRoutes.GET_CHANNEL_DETAILS, "replaceMeWithTheYouTubeAPIKey");
+ HttpURLConnection connection = getConnectionFromRoute(WhitelistRoutes.GET_CHANNEL_DETAILS, BuildConfig.YT_API_KEY);
connection.setRequestProperty("Content-Type", "application/json; utf-8");
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
connection.setConnectTimeout(2 * 1000);
- // TODO: Actually fetch the version
- String jsonInputString = "{\"context\": {\"client\": { \"clientName\": \"Android\", \"clientVersion\": \"16.49.37\" } }, \"videoId\": \"" + currentVideoId + "\"}";
+ String versionName = VancedUtils.getVersionName(context);
+ String jsonInputString = "{\"context\": {\"client\": { \"clientName\": \"Android\", \"clientVersion\": \"" + versionName + "\" } }, \"videoId\": \"" + currentVideoId + "\"}";
try(OutputStream os = connection.getOutputStream()) {
byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
diff --git a/app/src/main/java/fi/vanced/utils/VancedUtils.java b/app/src/main/java/fi/vanced/utils/VancedUtils.java
index 0c7820fa..0333f642 100644
--- a/app/src/main/java/fi/vanced/utils/VancedUtils.java
+++ b/app/src/main/java/fi/vanced/utils/VancedUtils.java
@@ -2,6 +2,8 @@ package fi.vanced.utils;
import android.content.Context;
import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
@@ -43,6 +45,18 @@ public class VancedUtils {
return count;
}
+ public static String getVersionName(Context context) {
+ try {
+ PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
+ String version = pInfo.versionName;
+ return (version);
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+
+ return ("17.03.35");
+ }
+
public static void runOnMainThread(Runnable runnable) {
new Handler(Looper.getMainLooper()).post(runnable);
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a2ea7edb..24853508 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -320,9 +320,9 @@
Stats
Loading..
SponsorBlock is disabled
- Your username: <b>%s</b>
+ Your username: <b>%s</b>
Click to change your username
- Unable to change username: Status: %d %s
+ Unable to change username: Status: %d %s
Username successfully changed
Submissions: <b>%s</b>
You\'ve saved people from <b>%s</b> segments.
@@ -339,8 +339,8 @@
Change
Reset
- Copy
- TCopy
+ Copy link
+ Timestamp
Ads
Segments
@@ -359,10 +359,14 @@
In player
Under player
Both
- RYD settings
+ Return YouTube Dislike settings
Uses the RYD API
Enable RYD
Switch this on to see the dislike counts again
Return YouTube Dislike Integration
This integration uses the RYD API from https://returnyoutubedislike.com. Tap to learn more
+
+ Tablet style
+ Tablet style is turned on. For example suggested videos are only partially working
+ Tablet style is turned off