diff --git a/README.md b/README.md
index 537516f..0409400 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,7 @@
# YouTubeAdAway
-Xposed module to block YouTube ads on the official YouTube apps (+TV, Music, Games, Kids, Go)
+Xposed module to block YouTube in-video ads and enable background playback on the official YouTube app
+Tested against YouTube 17.40.40, but it should support newer updates.
+Feel free to raise an issue if a newer YouTube update is not supported, and please make sure you provide your xposed logs.
+
+YouTube videos ad cards are not hidden, and there is not ETA on when it will be supported.
+You are more than welcome to contribute with pull requests!
\ No newline at end of file
diff --git a/YoutubeAdAway.iml b/YoutubeAdAway.iml
deleted file mode 100644
index 400cb15..0000000
--- a/YoutubeAdAway.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 9aaed2f..cc22471 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,31 +1,36 @@
-apply plugin: 'com.android.application'
+plugins {
+ id 'com.android.application'
+}
android {
- compileSdkVersion 26
- buildToolsVersion '26.0.2'
+ compileSdk 31
defaultConfig {
applicationId "ma.wanam.youtubeadaway"
- minSdkVersion 9
- targetSdkVersion 26
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
- }
+ minSdk 27
+ targetSdk 31
+ versionCode 500
+ versionName "5.0.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
-}
-
-repositories {
- jcenter();
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
}
dependencies {
- provided 'de.robv.android.xposed:api:82'
-}
+ compileOnly 'de.robv.android.xposed:api:82'
+ compileOnly 'de.robv.android.xposed:api:82:sources'
+
+ // used for debugging only
+ // implementation 'org.apache.commons:commons-lang3:3.12.0'
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 043a8ef..0de2377 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,39 +1,34 @@
-
-
+ package="ma.wanam.youtubeadaway">
+ android:roundIcon="@mipmap/ic_launcher_round"
+ android:supportsRtl="true"
+ android:theme="@style/Theme.MyApplication">
+ android:value="82+" />
-
-
+
+
-
-
+
\ No newline at end of file
diff --git a/app/src/main/java/ma/wanam/youtubeadaway/BFAsync.java b/app/src/main/java/ma/wanam/youtubeadaway/BFAsync.java
index cac3a92..5000464 100644
--- a/app/src/main/java/ma/wanam/youtubeadaway/BFAsync.java
+++ b/app/src/main/java/ma/wanam/youtubeadaway/BFAsync.java
@@ -1,119 +1,162 @@
package ma.wanam.youtubeadaway;
+import android.content.Context;
import android.os.AsyncTask;
-import android.os.Parcel;
-import android.os.Parcelable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import java.util.Calendar;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.regex.Pattern;
import de.robv.android.xposed.XC_MethodHook;
+import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
-public class BFAsync extends AsyncTask {
- private static ClassLoader cl;
- private static boolean found = false;
+public class BFAsync extends AsyncTask {
+ private boolean DEBUG = BuildConfig.DEBUG;
+ private volatile boolean sigAdFound = false;
+ private volatile boolean sigBgFound = false;
- private void debug(String msg) {
- if (BuildConfig.DEBUG) {
- XposedBridge.log(msg);
- }
+ @Override
+ protected Boolean doInBackground(XC_LoadPackage.LoadPackageParam... params) {
+ ClassLoader cl = params[0].classLoader;
+
+ boolean foundBGClass = bruteForceBGP(cl);
+ boolean foundInVideoAds = bruteForceInVideoAds(cl);
+
+ return foundBGClass && foundInVideoAds;
}
- private void debug(Throwable msg) {
- if (BuildConfig.DEBUG) {
- XposedBridge.log(msg);
+ private boolean bruteForceInVideoAds(ClassLoader cl) {
+ Instant start = Instant.now();
+ for (char a2 = 'a'; a2 <= 'z'; a2++) {
+ for (char a3 = 'a'; a3 <= 'z'; a3++) {
+ for (char a4 = 'a'; a4 <= 'z'; a4++) {
+ findAndHookInvideoAds('a', a2, a3, a4, cl);
+ if (sigAdFound) {
+ XposedBridge.log("In-Video ads hooks applied in " + Duration.between(start, Instant.now()).getSeconds() + " seconds!");
+ return true;
+ }
+ }
+ }
}
+ return false;
}
- @Override
- protected Boolean doInBackground(ClassLoader... params) {
- cl = params[0];
-
+ private boolean bruteForceBGP(ClassLoader cl) {
+ Instant start = Instant.now();
for (char a1 = 'z'; a1 >= 'a'; a1--) {
for (char a2 = 'z'; a2 >= 'a'; a2--) {
for (char a3 = 'z'; a3 >= 'a'; a3--) {
- findAndHookYouTubeAds(a1, a2, a3);
+ findAndHookVideoBGP(a1, a2, a3, cl);
+ if (sigBgFound) {
+ XposedBridge.log("Video BG playback hooks applied in " + Duration.between(start, Instant.now()).getSeconds() + " seconds!");
+ return true;
+ }
}
}
}
-
- return found;
+ return false;
}
-
- /**
- * @param a1
- * @param a2
- * @param a3
- * @return true if a hook was found
- */
- private void findAndHookYouTubeAds(char a1, char a2, char a3) {
- Class> classObj;
- Class> paramObj;
+ private void findAndHookInvideoAds(char a1, char a2, char a3, char a4, ClassLoader cl) {
+ Class> aClass;
+ Field[] fields;
+ Method[] methods;
final String lCRegex = "[a-z]+";
final Pattern lCPatern = Pattern.compile(lCRegex);
try {
- classObj = XposedHelpers.findClass(new StringBuffer().append(a1).append(a2).append(a3).toString(), cl);
+ aClass = XposedHelpers.findClass(new StringBuffer().append(a1).append(a2).append(a3).append(a4).toString(), cl);
+ fields = aClass.getDeclaredFields();
+ methods = aClass.getDeclaredMethods();
} catch (Throwable e1) {
return;
}
try {
- XposedHelpers.findConstructorExact(classObj);
- XposedHelpers.findConstructorExact(classObj, Parcel.class);
- if (XposedHelpers.findFirstFieldByExactType(classObj, Parcelable.Creator.class).getName().equals("CREATOR")) {
- try {
- Method[] methods = classObj.getDeclaredMethods();
- for (Method m : methods) {
- if (m.getName().equals("b") && m.getReturnType().equals(boolean.class)
- && m.getParameterTypes().length == 1) {
- paramObj = m.getParameterTypes()[0];
-
- if (lCPatern.matcher(paramObj.getName()).matches()) {
- Method mClass = XposedHelpers.findMethodExact(classObj, "a", paramObj);
-
- if (mClass.getReturnType().equals(boolean.class)) {
- try {
- XposedBridge.hookAllConstructors(classObj, new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam param) throws Throwable {
- Field[] fields = param.thisObject.getClass().getDeclaredFields();
- for (Field f : fields) {
- if (f.getType().equals(long.class)) {
- long timestamp = Calendar.getInstance().getTimeInMillis();
- debug("class: " + param.thisObject.getClass().getName());
- debug("set expiry timestamp: " + f.getName() + " = " + timestamp);
- XposedHelpers.setLongField(param.thisObject, f.getName(), timestamp);
- break;
- }
- }
- }
- });
-
- found = true;
-
- debug("YouTube AdAway: Successfully hooked ads wrapper " + classObj.getName()
- + " param=" + paramObj.getName());
- } catch (Throwable e) {
- debug("YouTube AdAway: Failed to hook " + classObj.getName()
- + " param=" + paramObj.getName() + " error: " + e);
- }
- }
+ if (!sigAdFound) {
+ sigAdFound = fields.length < 10 && (int) Arrays.asList(fields).parallelStream().filter(field -> field.getType().equals(Executor.class)
+ || field.getType().equals(LinkedBlockingQueue.class)
+ || field.getType().equals(Runnable.class)).count() == 3;
+
+ if (sigAdFound) {
+ Optional fMethod = Arrays.asList(methods).parallelStream().filter(method -> method.getParameterTypes().length == 1
+ && method.getParameterTypes()[0].equals(boolean.class)
+ && method.getReturnType().equals(void.class)
+ && java.lang.reflect.Modifier.isFinal(method.getModifiers())
+ ).findAny();
+
+ sigAdFound = sigAdFound && fMethod.isPresent();
+ if (sigAdFound) {
+ XposedBridge.hookMethod(fMethod.get(), new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ param.args[0] = false;
}
- }
+ });
+ XposedBridge.log("Hooked ad class: " + aClass.getName() + "." + fMethod.get().getName());
}
+ }
+ }
- } catch (Throwable e) {
- debug("YouTube AdAway: Failed to hook " + classObj.getName() + " methods!");
- debug(e);
+ } catch (Throwable e) {
+ XposedBridge.log("YouTube AdAway: Failed to hook in-video ads class: " + aClass.getName());
+ XposedBridge.log(e);
+ }
+ }
+
+ private void findAndHookVideoBGP(char a1, char a2, char a3, ClassLoader cl) {
+ Class> aClass;
+ Field[] fields;
+ Method[] methods;
+ final String lCRegex = "[a-z]+";
+ final Pattern lCPatern = Pattern.compile(lCRegex);
+
+ try {
+ aClass = XposedHelpers.findClass(new StringBuffer().append(a1).append(a2).append(a3).toString(), cl);
+ fields = aClass.getDeclaredFields();
+ methods = aClass.getDeclaredMethods();
+ } catch (Throwable e1) {
+ return;
+ }
+
+ try {
+ if (!sigBgFound) {
+ Class cListenableFuture = XposedHelpers.findClass("com.google.common.util.concurrent.ListenableFuture", cl);
+ Optional fMethod = Arrays.asList(methods).parallelStream().filter(method -> method.getParameterTypes().length == 2
+ && method.getParameterTypes()[0].equals(Context.class)
+ && method.getParameterTypes()[1].equals(Executor.class)
+ && method.getReturnType().equals(cListenableFuture)
+ && java.lang.reflect.Modifier.isStatic(method.getModifiers())
+ ).findAny();
+
+ sigBgFound = fMethod.isPresent();
+
+ if (sigBgFound) {
+ fMethod = Arrays.asList(methods).parallelStream().filter(method -> method.getParameterTypes().length == 1
+ && method.getReturnType().equals(boolean.class)
+ && lCPatern.matcher(method.getName()).matches()
+ && java.lang.reflect.Modifier.isStatic(method.getModifiers())
+ ).findFirst();
+
+ sigBgFound = sigBgFound && fMethod.isPresent();
+ if (sigBgFound) {
+ XposedBridge.hookMethod(fMethod.get(), XC_MethodReplacement.returnConstant(true));
+ XposedBridge.log("Hooked bg class: " + aClass.getName() + "." + fMethod.get().getName());
+ }
}
}
} catch (Throwable e) {
+ XposedBridge.log("YouTube AdAway: Failed to hook video bg playback class: " + aClass.getName());
+ XposedBridge.log(e);
}
}
diff --git a/app/src/main/java/ma/wanam/youtubeadaway/MainActivity.java b/app/src/main/java/ma/wanam/youtubeadaway/MainActivity.java
index 0396dcd..16c1e88 100644
--- a/app/src/main/java/ma/wanam/youtubeadaway/MainActivity.java
+++ b/app/src/main/java/ma/wanam/youtubeadaway/MainActivity.java
@@ -32,7 +32,7 @@ protected void onCreate(Bundle savedInstanceState) {
+ " "
+ (XChecker.isEnabled() ? res.getString(R.string.module_active) : res
.getString(R.string.module_inactive));
- TextView tvStatus = ((TextView) findViewById(R.id.moduleStatus));
+ TextView tvStatus = ((TextView) findViewById(id.moduleStatus));
tvStatus.setText(status);
tvStatus.setTextColor((XChecker.isEnabled() ? Color.GREEN : Color.RED));
diff --git a/app/src/main/java/ma/wanam/youtubeadaway/Xposed.java b/app/src/main/java/ma/wanam/youtubeadaway/Xposed.java
index b0e1a5d..8dd348c 100644
--- a/app/src/main/java/ma/wanam/youtubeadaway/Xposed.java
+++ b/app/src/main/java/ma/wanam/youtubeadaway/Xposed.java
@@ -1,100 +1,37 @@
package ma.wanam.youtubeadaway;
-import android.content.Context;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
import de.robv.android.xposed.IXposedHookLoadPackage;
-import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import ma.wanam.youtubeadaway.utils.Constants;
+import ma.wanam.youtubeadaway.utils.Utils;
public class Xposed implements IXposedHookLoadPackage {
- private static final String HIDE_MY_PARENT = "hide_my_parent";
- private static final String AD_BADGE = "ad_badge";
- private static Context context = null;
@Override
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
- if (lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_PACKAGE)
- || lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_KIDS_PACKAGE)
- || lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_GAMING)
- || lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_MUSIC)
- || lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_MANGO)
- || lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_TV1_PACKAGE)
- || lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_TV2_PACKAGE)) {
+ if (lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_PACKAGE)) {
try {
+ String ytVersion = Utils.getPackageVersion(lpparam);
+ XposedBridge.log("Hooking YouTube version: " + lpparam.packageName + " " + ytVersion);
- if (context == null) {
- Object activityThread = XposedHelpers.callStaticMethod(
- XposedHelpers.findClass("android.app.ActivityThread", null), "currentActivityThread");
- context = (Context) XposedHelpers.callMethod(activityThread, "getSystemContext");
- }
-
- String versionCode = context.getPackageManager().getPackageInfo(lpparam.packageName, 0).versionName;
- String moduleVersionCode = context.getPackageManager().getPackageInfo(Constants.GOOGLE_YOUTUBE_XPOSED,
- 0).versionName;
-
- hookViews(lpparam);
-
- new BFAsync().execute(lpparam.classLoader);
-
- XposedBridge.log("YouTube: " + lpparam.packageName + " " + versionCode + " loaded with module version " + moduleVersionCode);
+ new BFAsync().execute(lpparam);
} catch (Throwable t) {
XposedBridge.log(t);
}
}
- if (lpparam.packageName.equals(Constants.GOOGLE_YOUTUBE_XPOSED)) {
+ if (lpparam.packageName.equals(BuildConfig.APPLICATION_ID)) {
+ XposedBridge.log("YouTube AdAway version: " + Utils.getPackageVersion(lpparam));
try {
- XposedHelpers.findAndHookMethod(Constants.GOOGLE_YOUTUBE_XPOSED + ".XChecker", lpparam.classLoader,
+ XposedHelpers.findAndHookMethod(BuildConfig.APPLICATION_ID + ".XChecker", lpparam.classLoader,
"isEnabled", XC_MethodReplacement.returnConstant(Boolean.TRUE));
} catch (Throwable t) {
XposedBridge.log(t);
}
}
}
-
- private void hookViews(final LoadPackageParam lpparam) {
- final Class> mViewGroup = XposedHelpers.findClass("android.view.ViewGroup", lpparam.classLoader);
- XposedBridge.hookAllMethods(mViewGroup, "addView", new XC_MethodHook() {
- @Override
- protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
- checkAndHideAdViewCards(param, lpparam);
- }
- });
- }
-
- private void checkAndHideAdViewCards(XC_MethodHook.MethodHookParam param, LoadPackageParam lpparam) {
- try {
- View view = (View) param.args[0];
- if (view.getTag() != null && view.getTag().equals(HIDE_MY_PARENT)) {
- debug("hide ad badge grand parent");
- ViewGroup vg = (ViewGroup) param.thisObject;
- vg.setVisibility(View.GONE);
- } else if (view.getVisibility() == View.VISIBLE && view instanceof TextView) {
- int adBadge = view.getResources().getIdentifier(AD_BADGE, "string", lpparam.packageName);
- String adBadgeStr = view.getResources().getString(adBadge);
- if (((TextView) view).getText().equals(adBadgeStr)) {
- debug("hide ad badge parent");
- ViewGroup vg = (ViewGroup) param.thisObject;
- vg.setVisibility(View.GONE);
- vg.setTag(HIDE_MY_PARENT);
- }
- }
- } catch (Throwable ignored) {
- }
- }
-
- private void debug(String msg) {
- if (BuildConfig.DEBUG) {
- XposedBridge.log(msg);
- }
- }
-
}
diff --git a/app/src/main/java/ma/wanam/youtubeadaway/utils/Constants.java b/app/src/main/java/ma/wanam/youtubeadaway/utils/Constants.java
index 822c211..162d4a2 100644
--- a/app/src/main/java/ma/wanam/youtubeadaway/utils/Constants.java
+++ b/app/src/main/java/ma/wanam/youtubeadaway/utils/Constants.java
@@ -2,12 +2,4 @@
public class Constants {
public static final String GOOGLE_YOUTUBE_PACKAGE = "com.google.android.youtube";
- public static final String GOOGLE_YOUTUBE_KIDS_PACKAGE = "com.google.android.apps.youtube.kids";
- public static final String GOOGLE_YOUTUBE_TV1_PACKAGE = "com.google.android.youtube.tv";
- public static final String GOOGLE_YOUTUBE_TV2_PACKAGE = "com.google.android.youtube.googletv";
- public static final String GOOGLE_YOUTUBE_GAMING = "com.google.android.apps.youtube.gaming";
- public static final String GOOGLE_YOUTUBE_MUSIC = "com.google.android.apps.youtube.music";
- public static final String GOOGLE_YOUTUBE_MANGO = "com.google.android.apps.youtube.mango";
- public static final String GOOGLE_YOUTUBE_XPOSED = "ma.wanam.youtubeadaway";
- public static final String MAIN_PREFS = "main_prefs";
}
diff --git a/app/src/main/java/ma/wanam/youtubeadaway/utils/Utils.java b/app/src/main/java/ma/wanam/youtubeadaway/utils/Utils.java
index 1f03e75..f692fbc 100644
--- a/app/src/main/java/ma/wanam/youtubeadaway/utils/Utils.java
+++ b/app/src/main/java/ma/wanam/youtubeadaway/utils/Utils.java
@@ -1,26 +1,21 @@
package ma.wanam.youtubeadaway.utils;
-import java.util.List;
+import java.io.File;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
+import de.robv.android.xposed.XposedHelpers;
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Utils {
- public static PackageInfo pInfo;
-
- public static boolean isPackageInstalled(Context context, String targetPackage) {
- List packages;
- PackageManager pm;
- pm = context.getPackageManager();
- packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
- for (ApplicationInfo packageInfo : packages) {
- if (packageInfo.packageName.equals(targetPackage))
- return true;
- }
- return false;
- }
-
+ public static String getPackageVersion(XC_LoadPackage.LoadPackageParam lpparam) {
+ try {
+ Class> parserCls = XposedHelpers.findClass("android.content.pm.PackageParser", lpparam.classLoader);
+ Object parser = parserCls.newInstance();
+ File apkPath = new File(lpparam.appInfo.sourceDir);
+ Object pkg = XposedHelpers.callMethod(parser, "parsePackage", apkPath, 0);
+ return (String) XposedHelpers.getObjectField(pkg, "mVersionName");
+ } catch (Throwable e) {
+ return null;
+ }
+ }
}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 39f5f31..fd19f97 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,18 +4,35 @@
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
+ android:padding="10dp"
tools:context=".MainActivity">
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4f6f60e..7caa895 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,10 +1,10 @@
-
YouTube AdAway
is active!
- is NOT active!\nMake sure it is enabled on Xposed Installer.\nIf it is already checked, uncheck and recheck it again and REBOOT.
+ is NOT active!\nMake sure it is enabled and REBOOT.
Donate
No thanks
-
+ "What's in:\nBlock in-video ads\nEnable background play"
+ "TODO: Block ad video cards (No ETA!)\nThis project is open source, feel free to contribute."
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 8585242..5eb9f86 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,15 +1,18 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
+ mavenCentral()
+ google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.0.0'
- }
-}
+ classpath 'com.android.tools.build:gradle:4.2.2'
-allprojects {
- repositories {
- jcenter()
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
}
}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/gradlew b/gradlew
index 9d82f78..4f906e0 100644
--- a/gradlew
+++ b/gradlew
@@ -1,4 +1,20 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
##############################################################################
##
@@ -6,20 +22,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +64,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,28 +75,14 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -85,7 +106,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -105,10 +126,11 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
@@ -134,27 +156,30 @@ if $cygwin ; then
else
eval `echo args$i`="\"$arg\""
fi
- i=$((i+1))
+ i=`expr $i + 1`
done
case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 8a0b282..107acd3 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -8,20 +24,23 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,34 +64,14 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/local.properties b/local.properties
deleted file mode 100644
index e3dcea5..0000000
--- a/local.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-## This file must *NOT* be checked into Version Control Systems,
-# as it contains information specific to your local configuration.
-#
-# Location of the SDK. This is only used by Gradle.
-#
-#Mon Aug 28 12:42:10 WEST 2017
-sdk.dir=D\:\\PortableApps\\Android\\AS\\sdk
diff --git a/settings.gradle b/settings.gradle
index e7b4def..58d85ee 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,10 @@
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ mavenCentral()
+ google()
+ jcenter()
+ }
+}
+rootProject.name = "YouTube AdAway"
include ':app'