From 9360d2f61c7f0555f3dddc5a20b2ef3c2f3a992c Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 29 Apr 2026 14:43:26 +0200 Subject: [PATCH 1/4] Cleanup KeepAndroidOpen dialog code --- .../java/org/schabi/newpipe/MainActivity.java | 75 +++++++++---------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 00f1a62af..e50be4389 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -984,55 +984,48 @@ public class MainActivity extends AppCompatActivity { private void showKeepAndroidDialog() { final var prefs = PreferenceManager.getDefaultSharedPreferences(this); - + final var lastCheckKey = getString(R.string.kao_last_checked_key); + final var lastCheck = Instant.ofEpochMilli(prefs.getLong(lastCheckKey, 0)); final var now = Instant.now(); - final var kaoLastCheck = Instant.ofEpochMilli(prefs.getLong( - getString(R.string.kao_last_checked_key), - 0 - )); - final var supportedLannguages = List.of("fr", "de", "ca", "es", "id", "it", "pl", - "pt", "cs", "sk", "fa", "ar", "tr", "el", "th", "ru", "uk", "ko", "zh", "ja"); - final var locale = Localization.getAppLocale(); - final String kaoBaseUrl = "https://keepandroidopen.org/"; - final String kaoURI; - if (supportedLannguages.contains(locale.getLanguage())) { - if ("zh".equals(locale.getLanguage())) { - kaoURI = kaoBaseUrl + ("TW".equals(locale.getCountry()) ? "zh-TW" : "zh-CN"); - } else { - kaoURI = kaoBaseUrl + locale.getLanguage(); - } - } else { - kaoURI = kaoBaseUrl; - } - final var solutionURI = - "https://github.com/woheller69/FreeDroidWarn?tab=readme-ov-file#solutions"; + if (lastCheck.plus(30, ChronoUnit.DAYS).isBefore(now)) { + final String detailsUrl = getKeepAndroidOpenDetailsUrl(); + final var solutionUrl = "https://github.com/woheller69/FreeDroidWarn#solutions"; - if (kaoLastCheck.plus(30, ChronoUnit.DAYS).isBefore(now)) { final var dialog = new AlertDialog.Builder(this) .setTitle("Keep Android Open") .setCancelable(false) - .setMessage(this.getString(R.string.kao_dialog_warning)) - .setPositiveButton(this.getString(android.R.string.ok), (d, w) -> { - prefs.edit() - .putLong( - getString(R.string.kao_last_checked_key), - now.toEpochMilli() - ) - .apply(); - }) - .setNeutralButton(this.getString(R.string.kao_solution), null) - .setNegativeButton(this.getString(R.string.kao_dialog_more_info), null) + .setMessage(R.string.kao_dialog_warning) + .setPositiveButton(android.R.string.ok, (d, w) -> prefs.edit() + .putLong(lastCheckKey, now.toEpochMilli()) + .apply()) + .setNeutralButton(R.string.kao_solution, null) + .setNegativeButton(R.string.kao_dialog_more_info, null) .show(); - // If we use setNeutralButton and etc. dialog will close after pressing the buttons, - // but we want it to close only when positive button is pressed - dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v -> - ShareUtils.openUrlInBrowser(this, kaoURI) - ); - dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v -> - ShareUtils.openUrlInBrowser(this, solutionURI) - ); + // If we use setNeutralButton/setNegativeButton, dialog will close after pressing the + // buttons, but we want it to close only when positive button is pressed + dialog.getButton(AlertDialog.BUTTON_NEGATIVE) + .setOnClickListener(v -> ShareUtils.openUrlInBrowser(this, detailsUrl)); + dialog.getButton(AlertDialog.BUTTON_NEUTRAL) + .setOnClickListener(v -> ShareUtils.openUrlInBrowser(this, solutionUrl)); + } + } + + @NonNull + private static String getKeepAndroidOpenDetailsUrl() { + final var supportedLanguages = List.of("fr", "de", "ca", "es", "id", "it", "pl", + "pt", "cs", "sk", "fa", "ar", "tr", "el", "th", "ru", "uk", "ko", "zh", "ja"); + final String kaoBaseUrl = "https://keepandroidopen.org/"; + final var locale = Localization.getAppLocale(); + if (supportedLanguages.contains(locale.getLanguage())) { + if ("zh".equals(locale.getLanguage())) { + return kaoBaseUrl + ("TW".equals(locale.getCountry()) ? "zh-TW" : "zh-CN"); + } else { + return kaoBaseUrl + locale.getLanguage(); + } + } else { + return kaoBaseUrl; } } } From 6d5252252346a92d71bb025149987e8a5f09bac2 Mon Sep 17 00:00:00 2001 From: Stypox Date: Wed, 29 Apr 2026 16:30:31 +0200 Subject: [PATCH 2/4] Add popup for NewPipe dropping support for Android 5 --- .../java/org/schabi/newpipe/MainActivity.java | 30 +++++++++++++++++++ app/src/main/res/values/settings_keys.xml | 1 + app/src/main/res/values/strings.xml | 3 ++ 3 files changed, 34 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index e50be4389..6aa87b4bd 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -27,6 +27,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -203,6 +204,7 @@ public class MainActivity extends AppCompatActivity { // We want every release build (nightly, nightly-refactor) to show the popup if (!DEBUG) { showKeepAndroidDialog(); + showApi23RequirementDialog(); } MigrationManager.showUserInfoIfPresent(this); @@ -1028,4 +1030,32 @@ public class MainActivity extends AppCompatActivity { return kaoBaseUrl; } } + + private void showApi23RequirementDialog() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return; // only show dialog on the devices that will stop being supported + } + + final var prefs = PreferenceManager.getDefaultSharedPreferences(this); + final var shownKey = getString(R.string.api23_requirement_dialog_shown_key); + if (prefs.getBoolean(shownKey, false)) { + return; // dialog was already shown in the past, no need to show it again + } + + final var dialog = new AlertDialog.Builder(this) + .setTitle(R.string.api23_requirement_dialog_title) + .setCancelable(false) + .setMessage(R.string.api23_requirement_dialog_message) + .setPositiveButton(android.R.string.ok, (d, w) -> prefs.edit() + .putBoolean(shownKey, true) + .apply()) + .setNegativeButton(R.string.api23_requirement_dialog_blogpost, null) + .show(); + + // If we use setNegativeButton, dialog will close after pressing the button, + // but we want it to close only when positive button is pressed + final var blogpostUrl = "https://newpipe.net/blog/pinned/announcement/drop-android-5/"; + dialog.getButton(AlertDialog.BUTTON_NEGATIVE) + .setOnClickListener(v -> ShareUtils.openUrlInBrowser(this, blogpostUrl)); + } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f49ed3dad..60ac20d0a 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -11,6 +11,7 @@ kao_last_checked + api23_requirement_dialog_shown download_path download_path_audio diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3ec84bfff..912ad3f36 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -900,4 +900,7 @@ In August 2025, Google announced that as of September 2026, installing apps will require developer verification for all Android apps on certified devices, including those installed outside of the Play Store. Since the developers of NewPipe do not agree to this requirement, NewPipe will no longer work on certified Android devices after that time. Details Solution + NewPipe is dropping support for Android 5 + Unfortunately NewPipe depends on a few libraries that dropped support for Android 5.0 and 5.1. The next NewPipe release will therefore only work on devices with Android 6 or higher, sadly. Read more in the blogpost. + Blogpost From 9373a6c40d223f321afc57853a9d7a76f9ba6441 Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 1 May 2026 14:33:51 +0200 Subject: [PATCH 3/4] Add changelog for v0.28.6 (1011) --- fastlane/metadata/android/en-US/changelogs/1011.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/1011.txt diff --git a/fastlane/metadata/android/en-US/changelogs/1011.txt b/fastlane/metadata/android/en-US/changelogs/1011.txt new file mode 100644 index 000000000..e3c61febb --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1011.txt @@ -0,0 +1 @@ +Add popup to inform users that v0.28.7 will drop support for Android 5 \ No newline at end of file From d4941c44248ba210f44dd37ddc053accaab1ff8b Mon Sep 17 00:00:00 2001 From: Stypox Date: Fri, 1 May 2026 14:34:35 +0200 Subject: [PATCH 4/4] Release v0.28.6 (1011) --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 063eeb95c..fd2954c0a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -45,9 +45,9 @@ configure { minSdk = 21 targetSdk = 35 - versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1010 + versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1011 - versionName = "0.28.5" + versionName = "0.28.6" System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"