From 7231150115da9245c95829c9082423f58b281539 Mon Sep 17 00:00:00 2001 From: wb9688 Date: Fri, 1 May 2020 16:06:02 +0200 Subject: [PATCH 1/6] Upgrade some dependencies --- .travis.yml | 6 +- app/build.gradle | 117 ++++++++++++----------- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 3 +- 4 files changed, 67 insertions(+), 63 deletions(-) diff --git a/.travis.yml b/.travis.yml index d6f97ab5578..1714c70d563 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,13 +5,13 @@ android: components: # The BuildTools version used by NewPipe - tools - - build-tools-28.0.3 + - build-tools-29.0.3 # The SDK version used to compile NewPipe - - android-28 + - android-29 before_install: - - yes | sdkmanager "platforms;android-28" + - yes | sdkmanager "platforms;android-29" script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest licenses: diff --git a/app/build.gradle b/app/build.gradle index 7127628dbfa..f4619e0457e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,14 +5,14 @@ apply plugin: 'kotlin-kapt' apply plugin: 'checkstyle' android { - compileSdkVersion 28 - buildToolsVersion '28.0.3' + compileSdkVersion 29 + buildToolsVersion '29.0.3' defaultConfig { applicationId "org.schabi.newpipe" resValue "string", "app_name", "NewPipe" minSdkVersion 19 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 930 versionName "0.19.3" @@ -80,22 +80,22 @@ android { } ext { - androidxLibVersion = '1.1.0' - exoPlayerLibVersion = '2.11.4' - roomDbLibVersion = '2.1.0' - leakCanaryLibVersion = '1.5.4' //1.6.1 - okHttpLibVersion = '3.12.6' - icepickLibVersion = '3.2.0' - stethoLibVersion = '1.5.0' - markwonVersion = '4.2.1' - checkstyleVersion = '8.31' + icepickVersion = '3.2.0' + checkstyleVersion = '8.32' + stethoVersion = '1.5.1' + leakCanaryVersion = '1.5.4' + exoPlayerVersion = '2.11.4' + androidxLifecycleVersion = '2.2.0' + androidxRoomVersion = '2.2.5' + groupieVersion = '2.8.0' + markwonVersion = '4.3.1' } checkstyle { configFile rootProject.file('checkstyle.xml') ignoreFailures false showViolations true - toolVersion = "${checkstyleVersion}" + toolVersion = checkstyleVersion } task runCheckstyle(type: Checkstyle) { @@ -140,70 +140,73 @@ afterEvaluate { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "frankiesardo:icepick:${icepickVersion}" + kapt "frankiesardo:icepick-processor:${icepickVersion}" + debugImplementation "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" ktlint "com.pinterest:ktlint:0.35.0" - androidTestImplementation 'androidx.test.ext:junit:1.1.1' - androidTestImplementation "android.arch.persistence.room:testing:1.1.1" - androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { - exclude module: 'support-annotations' - }) + debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" + debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" - implementation 'com.github.TeamNewPipe:NewPipeExtractor:f3913e241e379adf0091319091e8f895c5fcfd07' - testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.23.0' + debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}" + releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${leakCanaryVersion}" - implementation "androidx.appcompat:appcompat:${androidxLibVersion}" - implementation "com.google.android.material:material:${androidxLibVersion}" - implementation "androidx.recyclerview:recyclerview:${androidxLibVersion}" - implementation "androidx.preference:preference:${androidxLibVersion}" - implementation "androidx.cardview:cardview:1.0.0" - implementation "androidx.constraintlayout:constraintlayout:1.1.3" + debugImplementation "androidx.multidex:multidex:2.0.1" - implementation 'com.xwray:groupie:2.7.0' - implementation 'com.xwray:groupie-kotlin-android-extensions:2.7.0' + testImplementation 'junit:junit:4.13' + testImplementation 'org.mockito:mockito-core:3.3.3' - implementation 'androidx.lifecycle:lifecycle-livedata:2.0.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel:2.0.0' - implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + androidTestImplementation "androidx.test.ext:junit:1.1.1" + androidTestImplementation "androidx.room:room-testing:${androidxRoomVersion}" + androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0", { + exclude module: 'support-annotations' + } - // Originally in NewPipeExtractor - implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'org.jsoup:jsoup:1.9.2' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:f3913e241e379adf0091319091e8f895c5fcfd07' - implementation 'ch.acra:acra:4.9.2' //4.11 + implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" + implementation "org.jsoup:jsoup:1.9.2" - implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' - implementation 'de.hdodenhof:circleimageview:2.2.0' - implementation 'com.nononsenseapps:filepicker:4.2.1' + implementation "com.squareup.okhttp3:okhttp:3.12.11" - implementation "com.google.android.exoplayer:exoplayer:${exoPlayerLibVersion}" - implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerLibVersion}" + implementation "com.google.android.exoplayer:exoplayer:${exoPlayerVersion}" + implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerVersion}" - debugImplementation "com.facebook.stetho:stetho:${stethoLibVersion}" - debugImplementation "com.facebook.stetho:stetho-urlconnection:${stethoLibVersion}" - debugImplementation 'androidx.multidex:multidex:2.0.1' + implementation "com.google.android.material:material:1.1.0" - implementation 'io.reactivex.rxjava2:rxjava:2.2.2' - implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' - implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1' - implementation 'org.ocpsoft.prettytime:prettytime:4.0.3.Final' + implementation "androidx.appcompat:appcompat:1.1.0" + implementation "androidx.preference:preference:1.1.1" + implementation "androidx.recyclerview:recyclerview:1.1.0" + implementation "androidx.cardview:cardview:1.0.0" + implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "androidx.room:room-runtime:${roomDbLibVersion}" - implementation "androidx.room:room-rxjava2:${roomDbLibVersion}" - kapt "androidx.room:room-compiler:${roomDbLibVersion}" + implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}" + implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}" + implementation "androidx.lifecycle:lifecycle-extensions:${androidxLifecycleVersion}" - implementation "frankiesardo:icepick:${icepickLibVersion}" - kapt "frankiesardo:icepick-processor:${icepickLibVersion}" + implementation "androidx.room:room-runtime:${androidxRoomVersion}" + implementation "androidx.room:room-rxjava2:${androidxRoomVersion}" + kapt "androidx.room:room-compiler:${androidxRoomVersion}" - debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryLibVersion}" - releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${leakCanaryLibVersion}" + implementation "com.xwray:groupie:${groupieVersion}" + implementation "com.xwray:groupie-kotlin-android-extensions:${groupieVersion}" - implementation "com.squareup.okhttp3:okhttp:${okHttpLibVersion}" - debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoLibVersion}" + implementation "de.hdodenhof:circleimageview:3.1.0" + implementation "com.nostra13.universalimageloader:universal-image-loader:1.9.5" implementation "io.noties.markwon:core:${markwonVersion}" implementation "io.noties.markwon:linkify:${markwonVersion}" + + implementation "com.nononsenseapps:filepicker:4.2.1" + + implementation "ch.acra:acra:4.9.2" + + implementation "io.reactivex.rxjava2:rxjava:2.2.19" + implementation "io.reactivex.rxjava2:rxandroid:2.1.1" + implementation "com.jakewharton.rxbinding2:rxbinding:2.2.0" + + implementation "org.ocpsoft.prettytime:prettytime:4.0.5.Final" } static String getGitWorkingBranch() { diff --git a/build.gradle b/build.gradle index 5ceffb6e7cb..f15900bc6ba 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,13 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.50' + ext.kotlin_version = '1.3.72' repositories { jcenter() google() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:3.6.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d757f3d33fc..5f9210e2756 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Fri May 01 19:39:41 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip From 0cae58ce8ecd06d549d738da513bf375582bf48a Mon Sep 17 00:00:00 2001 From: wb9688 Date: Fri, 1 May 2020 17:16:40 +0200 Subject: [PATCH 2/6] Upgrade LeakCanary --- app/build.gradle | 4 +- .../java/org/schabi/newpipe/DebugApp.java | 107 ------------------ .../debug/java/org/schabi/newpipe/DebugApp.kt | 59 ++++++++++ app/src/main/java/org/schabi/newpipe/App.java | 21 ---- .../java/org/schabi/newpipe/BaseFragment.java | 16 +-- 5 files changed, 69 insertions(+), 138 deletions(-) delete mode 100644 app/src/debug/java/org/schabi/newpipe/DebugApp.java create mode 100644 app/src/debug/java/org/schabi/newpipe/DebugApp.kt diff --git a/app/build.gradle b/app/build.gradle index f4619e0457e..6ffbd16b574 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -83,7 +83,7 @@ ext { icepickVersion = '3.2.0' checkstyleVersion = '8.32' stethoVersion = '1.5.1' - leakCanaryVersion = '1.5.4' + leakCanaryVersion = '2.2' exoPlayerVersion = '2.11.4' androidxLifecycleVersion = '2.2.0' androidxRoomVersion = '2.2.5' @@ -150,7 +150,7 @@ dependencies { debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}" - releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${leakCanaryVersion}" + implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" debugImplementation "androidx.multidex:multidex:2.0.1" diff --git a/app/src/debug/java/org/schabi/newpipe/DebugApp.java b/app/src/debug/java/org/schabi/newpipe/DebugApp.java deleted file mode 100644 index 6bcf710356b..00000000000 --- a/app/src/debug/java/org/schabi/newpipe/DebugApp.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.schabi.newpipe; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -import androidx.annotation.NonNull; -import androidx.multidex.MultiDex; - -import com.facebook.stetho.Stetho; -import com.facebook.stetho.okhttp3.StethoInterceptor; -import com.squareup.leakcanary.AndroidHeapDumper; -import com.squareup.leakcanary.DefaultLeakDirectoryProvider; -import com.squareup.leakcanary.HeapDumper; -import com.squareup.leakcanary.LeakCanary; -import com.squareup.leakcanary.LeakDirectoryProvider; -import com.squareup.leakcanary.RefWatcher; - -import org.schabi.newpipe.extractor.downloader.Downloader; - -import java.io.File; -import java.util.concurrent.TimeUnit; - -import okhttp3.OkHttpClient; - -public class DebugApp extends App { - private static final String TAG = DebugApp.class.toString(); - - @Override - protected void attachBaseContext(final Context base) { - super.attachBaseContext(base); - MultiDex.install(this); - } - - @Override - public void onCreate() { - super.onCreate(); - initStetho(); - } - - @Override - protected Downloader getDownloader() { - DownloaderImpl downloader = DownloaderImpl.init(new OkHttpClient.Builder() - .addNetworkInterceptor(new StethoInterceptor())); - setCookiesToDownloader(downloader); - return downloader; - } - - private void initStetho() { - // Create an InitializerBuilder - Stetho.InitializerBuilder initializerBuilder = - Stetho.newInitializerBuilder(this); - - // Enable Chrome DevTools - initializerBuilder.enableWebKitInspector( - Stetho.defaultInspectorModulesProvider(this) - ); - - // Enable command line interface - initializerBuilder.enableDumpapp( - Stetho.defaultDumperPluginsProvider(getApplicationContext()) - ); - - // Use the InitializerBuilder to generate an Initializer - Stetho.Initializer initializer = initializerBuilder.build(); - - // Initialize Stetho with the Initializer - Stetho.initialize(initializer); - } - - @Override - protected boolean isDisposedRxExceptionsReported() { - return PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.allow_disposed_exceptions_key), false); - } - - @Override - protected RefWatcher installLeakCanary() { - return LeakCanary.refWatcher(this) - .heapDumper(new ToggleableHeapDumper(this)) - // give each object 10 seconds to be gc'ed, before leak canary gets nosy on it - .watchDelay(10, TimeUnit.SECONDS) - .buildAndInstall(); - } - - public static class ToggleableHeapDumper implements HeapDumper { - private final HeapDumper dumper; - private final SharedPreferences preferences; - private final String dumpingAllowanceKey; - - ToggleableHeapDumper(@NonNull final Context context) { - LeakDirectoryProvider leakDirectoryProvider = new DefaultLeakDirectoryProvider(context); - this.dumper = new AndroidHeapDumper(context, leakDirectoryProvider); - this.preferences = PreferenceManager.getDefaultSharedPreferences(context); - this.dumpingAllowanceKey = context.getString(R.string.allow_heap_dumping_key); - } - - private boolean isDumpingAllowed() { - return preferences.getBoolean(dumpingAllowanceKey, false); - } - - @Override - public File dumpHeap() { - return isDumpingAllowed() ? dumper.dumpHeap() : HeapDumper.RETRY_LATER; - } - } -} diff --git a/app/src/debug/java/org/schabi/newpipe/DebugApp.kt b/app/src/debug/java/org/schabi/newpipe/DebugApp.kt new file mode 100644 index 00000000000..5cfde80b82f --- /dev/null +++ b/app/src/debug/java/org/schabi/newpipe/DebugApp.kt @@ -0,0 +1,59 @@ +package org.schabi.newpipe + +import android.content.Context +import androidx.multidex.MultiDex +import androidx.preference.PreferenceManager +import com.facebook.stetho.Stetho +import com.facebook.stetho.okhttp3.StethoInterceptor +import leakcanary.AppWatcher +import leakcanary.LeakCanary +import okhttp3.OkHttpClient +import org.schabi.newpipe.extractor.downloader.Downloader + +class DebugApp : App() { + override fun attachBaseContext(base: Context) { + super.attachBaseContext(base) + MultiDex.install(this) + } + + override fun onCreate() { + super.onCreate() + initStetho() + + // Give each object 10 seconds to be GC'ed, before LeakCanary gets nosy on it + AppWatcher.config = AppWatcher.config.copy(watchDurationMillis = 10000) + LeakCanary.config = LeakCanary.config.copy(dumpHeap = PreferenceManager + .getDefaultSharedPreferences(this).getBoolean(getString( + R.string.allow_heap_dumping_key), false)) + } + + override fun getDownloader(): Downloader { + val downloader = DownloaderImpl.init(OkHttpClient.Builder() + .addNetworkInterceptor(StethoInterceptor())) + setCookiesToDownloader(downloader) + return downloader + } + + private fun initStetho() { + // Create an InitializerBuilder + val initializerBuilder = Stetho.newInitializerBuilder(this) + + // Enable Chrome DevTools + initializerBuilder.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this)) + + // Enable command line interface + initializerBuilder.enableDumpapp( + Stetho.defaultDumperPluginsProvider(applicationContext)) + + // Use the InitializerBuilder to generate an Initializer + val initializer = initializerBuilder.build() + + // Initialize Stetho with the Initializer + Stetho.initialize(initializer) + } + + override fun isDisposedRxExceptionsReported(): Boolean { + return PreferenceManager.getDefaultSharedPreferences(this) + .getBoolean(getString(R.string.allow_disposed_exceptions_key), false) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 8a4ed0607cd..02c816be9c2 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -9,14 +9,11 @@ import android.os.Build; import android.util.Log; -import androidx.annotation.Nullable; import androidx.preference.PreferenceManager; import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; -import com.squareup.leakcanary.LeakCanary; -import com.squareup.leakcanary.RefWatcher; import org.acra.ACRA; import org.acra.config.ACRAConfiguration; @@ -72,13 +69,6 @@ public class App extends Application { private static final Class[] REPORT_SENDER_FACTORY_CLASSES = new Class[]{AcraReportSenderFactory.class}; private static App app; - private RefWatcher refWatcher; - - @Nullable - public static RefWatcher getRefWatcher(final Context context) { - final App application = (App) context.getApplicationContext(); - return application.refWatcher; - } public static App getApp() { return app; @@ -95,13 +85,6 @@ protected void attachBaseContext(final Context base) { public void onCreate() { super.onCreate(); - if (LeakCanary.isInAnalyzerProcess(this)) { - // This process is dedicated to LeakCanary for heap analysis. - // You should not init your app in this process. - return; - } - refWatcher = installLeakCanary(); - app = this; // Initialize settings first because others inits can use its values @@ -280,10 +263,6 @@ private void setUpUpdateNotificationChannel(final int importance) { appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); } - protected RefWatcher installLeakCanary() { - return RefWatcher.DISABLED; - } - protected boolean isDisposedRxExceptionsReported() { return false; } diff --git a/app/src/main/java/org/schabi/newpipe/BaseFragment.java b/app/src/main/java/org/schabi/newpipe/BaseFragment.java index 9a86fd5adfb..54513a0afd1 100644 --- a/app/src/main/java/org/schabi/newpipe/BaseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/BaseFragment.java @@ -11,10 +11,10 @@ import androidx.fragment.app.FragmentManager; import com.nostra13.universalimageloader.core.ImageLoader; -import com.squareup.leakcanary.RefWatcher; import icepick.Icepick; import icepick.State; +import leakcanary.AppWatcher; public abstract class BaseFragment extends Fragment { public static final ImageLoader IMAGE_LOADER = ImageLoader.getInstance(); @@ -78,16 +78,14 @@ public void onSaveInstanceState(final Bundle outState) { Icepick.saveInstanceState(this, outState); } - protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) { } + protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) { + } @Override public void onDestroy() { super.onDestroy(); - RefWatcher refWatcher = App.getRefWatcher(getActivity()); - if (refWatcher != null) { - refWatcher.watch(this); - } + AppWatcher.INSTANCE.getObjectWatcher().watch(this); } @Override @@ -100,9 +98,11 @@ public void setUserVisibleHint(final boolean isVisibleToUser) { // Init //////////////////////////////////////////////////////////////////////////*/ - protected void initViews(final View rootView, final Bundle savedInstanceState) { } + protected void initViews(final View rootView, final Bundle savedInstanceState) { + } - protected void initListeners() { } + protected void initListeners() { + } /*////////////////////////////////////////////////////////////////////////// // Utils From 7b81e985816c5f11875cada3fe39f1bd7fd8954d Mon Sep 17 00:00:00 2001 From: wb9688 Date: Fri, 1 May 2020 18:26:12 +0200 Subject: [PATCH 3/6] Upgrade ACRA --- app/build.gradle | 2 +- app/src/main/java/org/schabi/newpipe/App.java | 6 +++--- .../org/schabi/newpipe/report/AcraReportSender.java | 2 +- .../newpipe/report/AcraReportSenderFactory.java | 4 ++-- .../java/org/schabi/newpipe/report/ErrorActivity.java | 11 ++--------- 5 files changed, 9 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6ffbd16b574..08323560c30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -200,7 +200,7 @@ dependencies { implementation "com.nononsenseapps:filepicker:4.2.1" - implementation "ch.acra:acra:4.9.2" + implementation "ch.acra:acra-core:5.5.0" implementation "io.reactivex.rxjava2:rxjava:2.2.19" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 02c816be9c2..531cb5a388b 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -16,9 +16,9 @@ import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import org.acra.ACRA; -import org.acra.config.ACRAConfiguration; import org.acra.config.ACRAConfigurationException; -import org.acra.config.ConfigurationBuilder; +import org.acra.config.CoreConfiguration; +import org.acra.config.CoreConfigurationBuilder; import org.acra.sender.ReportSenderFactory; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.downloader.Downloader; @@ -202,7 +202,7 @@ private ImageLoaderConfiguration getImageLoaderConfigurations(final int memoryCa private void initACRA() { try { - final ACRAConfiguration acraConfig = new ConfigurationBuilder(this) + final CoreConfiguration acraConfig = new CoreConfigurationBuilder(this) .setReportSenderFactoryClasses(REPORT_SENDER_FACTORY_CLASSES) .setBuildConfigClass(BuildConfig.class) .build(); diff --git a/app/src/main/java/org/schabi/newpipe/report/AcraReportSender.java b/app/src/main/java/org/schabi/newpipe/report/AcraReportSender.java index a6559d54d27..b31e3a31e30 100644 --- a/app/src/main/java/org/schabi/newpipe/report/AcraReportSender.java +++ b/app/src/main/java/org/schabi/newpipe/report/AcraReportSender.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; -import org.acra.collector.CrashReportData; +import org.acra.data.CrashReportData; import org.acra.sender.ReportSender; import org.schabi.newpipe.R; diff --git a/app/src/main/java/org/schabi/newpipe/report/AcraReportSenderFactory.java b/app/src/main/java/org/schabi/newpipe/report/AcraReportSenderFactory.java index 9428df0cb8a..f4c1c4ac8ca 100644 --- a/app/src/main/java/org/schabi/newpipe/report/AcraReportSenderFactory.java +++ b/app/src/main/java/org/schabi/newpipe/report/AcraReportSenderFactory.java @@ -4,7 +4,7 @@ import androidx.annotation.NonNull; -import org.acra.config.ACRAConfiguration; +import org.acra.config.CoreConfiguration; import org.acra.sender.ReportSender; import org.acra.sender.ReportSenderFactory; @@ -31,7 +31,7 @@ public class AcraReportSenderFactory implements ReportSenderFactory { @NonNull public ReportSender create(@NonNull final Context context, - @NonNull final ACRAConfiguration config) { + @NonNull final CoreConfiguration config) { return new AcraReportSender(); } } diff --git a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java index 358c17ad416..20724c02b34 100644 --- a/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java +++ b/app/src/main/java/org/schabi/newpipe/report/ErrorActivity.java @@ -32,7 +32,7 @@ import com.grack.nanojson.JsonWriter; import org.acra.ReportField; -import org.acra.collector.CrashReportData; +import org.acra.data.CrashReportData; import org.schabi.newpipe.ActivityCommunicator; import org.schabi.newpipe.BuildConfig; import org.schabi.newpipe.MainActivity; @@ -149,14 +149,7 @@ public static void reportError(final Handler handler, final Context context, public static void reportError(final Context context, final CrashReportData report, final ErrorInfo errorInfo) { - // get key first (don't ask about this solution) - ReportField key = null; - for (ReportField k : report.keySet()) { - if (k.toString().equals("STACK_TRACE")) { - key = k; - } - } - String[] el = new String[]{report.get(key).toString()}; + String[] el = new String[]{report.getString(ReportField.STACK_TRACE)}; Intent intent = new Intent(context, ErrorActivity.class); intent.putExtra(ERROR_INFO, errorInfo); From e16a2d7cb654040fdb06ba2e04fa274559250522 Mon Sep 17 00:00:00 2001 From: wb9688 Date: Sun, 3 May 2020 11:54:37 +0200 Subject: [PATCH 4/6] Upgrade jsoup --- app/build.gradle | 4 ++-- .../newpipe/info_list/holder/CommentsMiniInfoItemHolder.java | 4 ++-- app/src/main/java/org/schabi/newpipe/util/CookieUtils.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 08323560c30..3794e31bcdf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -163,10 +163,10 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.TeamNewPipe:NewPipeExtractor:f3913e241e379adf0091319091e8f895c5fcfd07' + implementation 'com.github.wb9688:NewPipeExtractor:8f71bde776336c442da66f2656e0141881fa9987' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" - implementation "org.jsoup:jsoup:1.9.2" + implementation "org.jsoup:jsoup:1.13.1" implementation "com.squareup.okhttp3:okhttp:3.12.11" diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java index 68be557cab7..69f08f340dc 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentsMiniInfoItemHolder.java @@ -3,6 +3,7 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.URLSpan; import android.text.util.Linkify; @@ -12,7 +13,6 @@ import androidx.appcompat.app.AppCompatActivity; -import org.jsoup.helper.StringUtil; import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.comments.CommentsInfoItem; @@ -143,7 +143,7 @@ public void updateFromItem(final InfoItem infoItem, } private void openCommentAuthor(final CommentsInfoItem item) { - if (StringUtil.isBlank(item.getUploaderUrl())) { + if (TextUtils.isEmpty(item.getUploaderUrl())) { return; } try { diff --git a/app/src/main/java/org/schabi/newpipe/util/CookieUtils.java b/app/src/main/java/org/schabi/newpipe/util/CookieUtils.java index 4575e7017ec..d8b81b4cef8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/CookieUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/CookieUtils.java @@ -1,6 +1,6 @@ package org.schabi.newpipe.util; -import org.jsoup.helper.StringUtil; +import android.text.TextUtils; import java.util.Arrays; import java.util.Collection; @@ -16,7 +16,7 @@ public static String concatCookies(final Collection cookieStrings) { for (String cookies : cookieStrings) { cookieSet.addAll(splitCookies(cookies)); } - return StringUtil.join(cookieSet, "; ").trim(); + return TextUtils.join("; ", cookieSet).trim(); } public static Set splitCookies(final String cookies) { From a9697a61ada29017ffecc78acc2fb0b33cf9ac71 Mon Sep 17 00:00:00 2001 From: wb9688 Date: Sun, 3 May 2020 14:11:34 +0200 Subject: [PATCH 5/6] Fix viewing licenses --- .../schabi/newpipe/about/LicenseFragment.java | 67 +++++---------- .../newpipe/about/LicenseFragmentHelper.java | 83 ++++++++----------- 2 files changed, 57 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java index 0bda79feefc..bc6310601f0 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java @@ -2,8 +2,6 @@ import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -17,9 +15,9 @@ import androidx.fragment.app.Fragment; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.ShareUtils; import java.util.Arrays; -import java.util.Comparator; /** * Fragment containing the software licenses. @@ -27,7 +25,7 @@ public class LicenseFragment extends Fragment { private static final String ARG_COMPONENTS = "components"; private SoftwareComponent[] softwareComponents; - private SoftwareComponent mComponentForContextMenu; + private SoftwareComponent componentForContextMenu; public static LicenseFragment newInstance(final SoftwareComponent[] softwareComponents) { if (softwareComponents == null) { @@ -46,7 +44,7 @@ public static LicenseFragment newInstance(final SoftwareComponent[] softwareComp * @param context the context to use * @param license the license to show */ - public static void showLicense(final Context context, final License license) { + private static void showLicense(final Context context, final License license) { new LicenseFragmentHelper((Activity) context).execute(license); } @@ -57,45 +55,34 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { .getParcelableArray(ARG_COMPONENTS); // Sort components by name - Arrays.sort(softwareComponents, new Comparator() { - @Override - public int compare(final SoftwareComponent o1, final SoftwareComponent o2) { - return o1.getName().compareTo(o2.getName()); - } - }); + Arrays.sort(softwareComponents, (o1, o2) -> o1.getName().compareTo(o2.getName())); } @Nullable @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_licenses, container, false); - ViewGroup softwareComponentsView = rootView.findViewById(R.id.software_components); + final View rootView = inflater.inflate(R.layout.fragment_licenses, container, false); + final ViewGroup softwareComponentsView = rootView.findViewById(R.id.software_components); - View licenseLink = rootView.findViewById(R.id.app_read_license); - licenseLink.setOnClickListener(new OnReadFullLicenseClickListener()); + final View licenseLink = rootView.findViewById(R.id.app_read_license); + licenseLink.setOnClickListener(v -> + showLicense(getActivity(), StandardLicenses.GPL3)); for (final SoftwareComponent component : softwareComponents) { - View componentView = inflater + final View componentView = inflater .inflate(R.layout.item_software_component, container, false); - TextView softwareName = componentView.findViewById(R.id.name); - TextView copyright = componentView.findViewById(R.id.copyright); + final TextView softwareName = componentView.findViewById(R.id.name); + final TextView copyright = componentView.findViewById(R.id.copyright); softwareName.setText(component.getName()); - copyright.setText(getContext().getString(R.string.copyright, + copyright.setText(getString(R.string.copyright, component.getYears(), component.getCopyrightOwner(), component.getLicense().getAbbreviation())); componentView.setTag(component); - componentView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(final View v) { - Context context = v.getContext(); - if (context != null) { - showLicense(context, component.getLicense()); - } - } - }); + componentView.setOnClickListener(v -> + showLicense(getActivity(), component.getLicense())); softwareComponentsView.addView(componentView); registerForContextMenu(componentView); } @@ -105,40 +92,28 @@ public void onClick(final View v) { @Override public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenu.ContextMenuInfo menuInfo) { - MenuInflater inflater = getActivity().getMenuInflater(); - SoftwareComponent component = (SoftwareComponent) v.getTag(); + final MenuInflater inflater = getActivity().getMenuInflater(); + final SoftwareComponent component = (SoftwareComponent) v.getTag(); menu.setHeaderTitle(component.getName()); inflater.inflate(R.menu.software_component, menu); super.onCreateContextMenu(menu, v, menuInfo); - mComponentForContextMenu = (SoftwareComponent) v.getTag(); + componentForContextMenu = (SoftwareComponent) v.getTag(); } @Override public boolean onContextItemSelected(final MenuItem item) { // item.getMenuInfo() is null so we use the tag of the view - final SoftwareComponent component = mComponentForContextMenu; + final SoftwareComponent component = componentForContextMenu; if (component == null) { return false; } switch (item.getItemId()) { case R.id.action_website: - openWebsite(component.getLink()); + ShareUtils.openUrlInBrowser(getActivity(), component.getLink()); return true; case R.id.action_show_license: - showLicense(getContext(), component.getLicense()); + showLicense(getActivity(), component.getLicense()); } return false; } - - private void openWebsite(final String componentLink) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(componentLink)); - startActivity(browserIntent); - } - - private static class OnReadFullLicenseClickListener implements View.OnClickListener { - @Override - public void onClick(final View v) { - LicenseFragment.showLicense(v.getContext(), StandardLicenses.GPL3); - } - } } diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java index 94a1532f58a..1c425567f56 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.java @@ -3,8 +3,10 @@ import android.app.Activity; import android.content.Context; import android.os.AsyncTask; +import android.util.Base64; import android.webkit.WebView; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -12,6 +14,7 @@ import org.schabi.newpipe.util.ThemeHelper; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStreamReader; import java.lang.ref.WeakReference; import java.nio.charset.StandardCharsets; @@ -26,28 +29,18 @@ public LicenseFragmentHelper(@Nullable final Activity activity) { weakReference = new WeakReference<>(activity); } - private static String getFinishString(final Activity activity) { - return activity.getApplicationContext().getResources().getString(R.string.finish); - } - /** * @param context the context to use * @param license the license * @return String which contains a HTML formatted license page * styled according to the context's theme */ - public static String getFormattedLicense(final Context context, final License license) { - if (context == null) { - throw new NullPointerException("context is null"); - } - if (license == null) { - throw new NullPointerException("license is null"); - } - - StringBuilder licenseContent = new StringBuilder(); - String webViewData; + private static String getFormattedLicense(@NonNull final Context context, + @NonNull final License license) { + final StringBuilder licenseContent = new StringBuilder(); + final String webViewData; try { - BufferedReader in = new BufferedReader(new InputStreamReader( + final BufferedReader in = new BufferedReader(new InputStreamReader( context.getAssets().open(license.getFilename()), StandardCharsets.UTF_8)); String str; while ((str = in.readLine()) != null) { @@ -56,13 +49,11 @@ public static String getFormattedLicense(final Context context, final License li in.close(); // split the HTML file and insert the stylesheet into the HEAD of the file - String[] insert = licenseContent.toString().split(""); - webViewData = insert[0] + "" - + insert[1]; - } catch (Exception e) { - throw new NullPointerException("could not get license file:" - + getLicenseStylesheet(context)); + webViewData = licenseContent.toString().replace("", + ""); + } catch (IOException e) { + throw new IllegalArgumentException( + "Could not get license file: " + license.getFilename(), e); } return webViewData; } @@ -71,21 +62,19 @@ public static String getFormattedLicense(final Context context, final License li * @param context * @return String which is a CSS stylesheet according to the context's theme */ - public static String getLicenseStylesheet(final Context context) { - boolean isLightTheme = ThemeHelper.isLightThemeSelected(context); - return "body{padding:12px 15px;margin:0;background:#" - + getHexRGBColor(context, isLightTheme + private static String getLicenseStylesheet(final Context context) { + final boolean isLightTheme = ThemeHelper.isLightThemeSelected(context); + return "body{padding:12px 15px;margin:0;" + + "background:#" + getHexRGBColor(context, isLightTheme ? R.color.light_license_background_color - : R.color.dark_license_background_color) - + ";color:#" - + getHexRGBColor(context, isLightTheme + : R.color.dark_license_background_color) + ";" + + "color:#" + getHexRGBColor(context, isLightTheme ? R.color.light_license_text_color - : R.color.dark_license_text_color) + ";}" - + "a[href]{color:#" - + getHexRGBColor(context, isLightTheme + : R.color.dark_license_text_color) + "}" + + "a[href]{color:#" + getHexRGBColor(context, isLightTheme ? R.color.light_youtube_primary_color - : R.color.dark_youtube_primary_color) + ";}" - + "pre{white-space: pre-wrap;}"; + : R.color.dark_youtube_primary_color) + "}" + + "pre{white-space:pre-wrap}"; } /** @@ -95,13 +84,13 @@ public static String getLicenseStylesheet(final Context context) { * @param color the color number from R.color * @return a six characters long String with hexadecimal RGB values */ - public static String getHexRGBColor(final Context context, final int color) { + private static String getHexRGBColor(final Context context, final int color) { return context.getResources().getString(color).substring(3); } @Nullable private Activity getActivity() { - Activity activity = weakReference.get(); + final Activity activity = weakReference.get(); if (activity != null && activity.isFinishing()) { return null; @@ -118,22 +107,22 @@ protected Integer doInBackground(final Object... objects) { @Override protected void onPostExecute(final Integer result) { - Activity activity = getActivity(); + final Activity activity = getActivity(); if (activity == null) { return; } - String webViewData = getFormattedLicense(activity, license); - AlertDialog.Builder alert = new AlertDialog.Builder(activity); - alert.setTitle(license.getName()); - - WebView wv = new WebView(activity); - wv.loadData(webViewData, "text/html; charset=UTF-8", null); + final String webViewData = Base64.encodeToString(getFormattedLicense(activity, license) + .getBytes(StandardCharsets.UTF_8), Base64.NO_PADDING); + final WebView webView = new WebView(activity); + webView.loadData(webViewData, "text/html; charset=UTF-8", "base64"); - alert.setView(wv); - assureCorrectAppLanguage(activity.getApplicationContext()); - alert.setNegativeButton(getFinishString(activity), (dialog, which) -> dialog.dismiss()); + final AlertDialog.Builder alert = new AlertDialog.Builder(activity); + alert.setTitle(license.getName()); + alert.setView(webView); + assureCorrectAppLanguage(activity); + alert.setNegativeButton(activity.getString(R.string.finish), + (dialog, which) -> dialog.dismiss()); alert.show(); } - } From 75b377aab3f3027f7a3b1c83b4c3f74969f2af9c Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 28 May 2020 21:56:54 +0200 Subject: [PATCH 6/6] Updatethe extractor version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 3794e31bcdf..0034dcb25f1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -163,7 +163,7 @@ dependencies { exclude module: 'support-annotations' } - implementation 'com.github.wb9688:NewPipeExtractor:8f71bde776336c442da66f2656e0141881fa9987' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:0b4977bb0c7c9928cd8904951cfe94c71b4e81de' implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" implementation "org.jsoup:jsoup:1.13.1"