From 7c2adf2bf40c29b115f4017ca28f773dad61d398 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 12:48:31 -0500 Subject: [PATCH 01/31] Changed compileSdkVersion to 35 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3074f2a867dc..c9089dbf0c7b 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ plugins { ext { minSdkVersion = 26 - compileSdkVersion = 34 + compileSdkVersion = 35 targetSdkVersion = 34 secretProperties = loadSecrets( From 605b25a6eed1975ba021c479d5866e65f6aa8745 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 12:54:50 -0500 Subject: [PATCH 02/31] Fixed bitmap.config nullability issues --- .../android/ui/accounts/signup/SignupEpilogueFragment.kt | 4 +++- .../src/main/java/org/wordpress/android/ui/main/MeFragment.kt | 4 +++- .../org/wordpress/android/ui/main/WPMainNavigationView.kt | 4 +++- .../ui/mysite/items/listitem/MySiteListItemViewHolder.kt | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt index db4275a1e781..440314539931 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt @@ -671,7 +671,9 @@ class SignupEpilogueFragment : LoginBaseFormFragment(), if (newAvatarUploaded && resource is BitmapDrawable) { var bitmap = resource.bitmap // create a copy since the original bitmap may by automatically recycled - bitmap = bitmap.copy(bitmap.config, true) + bitmap.config?.let { config -> + bitmap = bitmap.copy(config, true) + } getBitmapCache().put((avatarUrl), bitmap) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt index 0b8ad6687560..71333b178927 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt @@ -556,7 +556,9 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { if (newAvatarSelected && resource is BitmapDrawable) { var bitmap = resource.bitmap // create a copy since the original bitmap may by automatically recycled - bitmap = bitmap.copy(bitmap.config, true) + bitmap.config?.let { config -> + bitmap = bitmap.copy(config, true) + } WordPress.getBitmapCache().put( avatarUrl, bitmap diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt index 9281b67bf82f..5add1ebb9a5f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/WPMainNavigationView.kt @@ -188,7 +188,9 @@ class WPMainNavigationView @JvmOverloads constructor( if (resource is BitmapDrawable) { var bitmap = resource.bitmap // create a copy since the original bitmap may by automatically recycled - bitmap = bitmap.copy(bitmap.config, true) + bitmap.config?.let { config -> + bitmap = bitmap.copy(config, true) + } WordPress.getBitmapCache().put( avatarUrl, bitmap diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/items/listitem/MySiteListItemViewHolder.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/items/listitem/MySiteListItemViewHolder.kt index a27315b01d19..1deaf5c7b791 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/items/listitem/MySiteListItemViewHolder.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/items/listitem/MySiteListItemViewHolder.kt @@ -73,7 +73,9 @@ class MySiteListItemViewHolder( if (resource is BitmapDrawable) { var bitmap = resource.bitmap // create a copy since the original bitmap may by automatically recycled - bitmap = bitmap.copy(bitmap.config, true) + bitmap.config?.let { config -> + bitmap = bitmap.copy(config, true) + } WordPress.getBitmapCache().put( avatarUrl, bitmap From bd20c43429eaeb12923c8f3b4e691582e71eb611 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 13:24:06 -0500 Subject: [PATCH 03/31] Fixed signing nullabiliy issues --- .../wordpress/android/util/signature/SignatureUtils.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt b/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt index 2095bf4aedc8..7165c12dc127 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt @@ -35,12 +35,12 @@ class SignatureUtils @Inject constructor( PackageManager.GET_SIGNING_CERTIFICATES ) ).signingInfo - if (signingInfo.hasMultipleSigners()) { + if (signingInfo?.hasMultipleSigners() == true) { throw SignatureNotFoundException() } - val allSignaturesMatch = signingInfo.signingCertificateHistory.all { + val allSignaturesMatch = signingInfo?.signingCertificateHistory?.all { toHexStringWithColons(messageDigest.digest(it.toByteArray())) == trustedSignatureHash - } + } ?: false if (allSignaturesMatch) { true } else throw SignatureNotFoundException() @@ -56,9 +56,9 @@ class SignatureUtils @Inject constructor( try { val signatures = contextProvider.getContext().packageManager .getPackageInfo(trustedPackageId, PackageManager.GET_SIGNATURES).signatures - val allSignaturesMatch = signatures.all { + val allSignaturesMatch = signatures?.all { toHexStringWithColons(messageDigest.digest(it.toByteArray())) == trustedSignatureHash - } + } ?: false return if (allSignaturesMatch) { true } else throw SignatureNotFoundException() From 84ad5017b3632c8658d446a4fb99550c5b5a0215 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 13:24:18 -0500 Subject: [PATCH 04/31] Marked onLowMemory as deprecated --- WordPress/src/main/java/org/wordpress/android/AppInitializer.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt b/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt index a5af3e64975a..6e2361fc19a8 100644 --- a/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt +++ b/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt @@ -952,6 +952,7 @@ class AppInitializer @Inject constructor( // Do nothing } + @Deprecated("Deprecated in Java") override fun onLowMemory() { // Do nothing } From 7033fa4fe7fb955c1c4d711b70e992dd7f89c49e Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 13:48:34 -0500 Subject: [PATCH 05/31] Temporarily commented out deprecated status/navbar code --- .../android/support/SupportWebViewActivity.kt | 2 +- .../org/wordpress/android/ui/mysite/MySiteFragment.kt | 2 +- .../ui/stats/refresh/lists/widget/utils/WidgetUtils.kt | 4 ++-- .../android/util/extensions/WindowExtensions.kt | 10 +++++----- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt b/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt index 54775236ae88..cc1d7f404620 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt @@ -55,7 +55,7 @@ class SupportWebViewActivity : WPWebViewActivity(), SupportWebViewClient.Support supportActionBar?.title = getString(R.string.help) supportActionBar?.subtitle = "" - window.navigationBarColor = getColor(R.color.docsbot_chat_container) + // TODO window.navigationBarColor = getColor(R.color.docsbot_chat_container) // Prevent AppBar scrolling away val toolbar = findViewById(R.id.toolbar) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index ef8c9647d3ef..37f16255ace6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -828,7 +828,7 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), val context = activity ?: return val options = UCrop.Options() options.setShowCropGrid(false) - options.setStatusBarColor(context.getColorFromAttribute(android.R.attr.statusBarColor)) + // TODO options.setStatusBarColor(context.getColorFromAttribute(android.R.attr.statusBarColor)) options.setToolbarColor(context.getColorFromAttribute(R.attr.wpColorAppBar)) options.setToolbarWidgetColor(context.getColorFromAttribute(com.google.android.material.R.attr.colorOnSurface)) options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt index ae336e122ccc..87f0adbabbe4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt @@ -167,8 +167,8 @@ class WidgetUtils listIntent.data = Uri.parse( listIntent.toUri(Intent.URI_INTENT_SCHEME) ) - views.setRemoteAdapter(R.id.widget_content, listIntent) - appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_content) + // TODO views.setRemoteAdapter(R.id.widget_content, listIntent) + // TODO appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_content) appWidgetManager.updateAppWidget(appWidgetId, views) } diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index fc2b01af23a0..ec4e8d8fa97c 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -60,19 +60,19 @@ fun Window.showFullScreen() { fun Window.setWindowStatusBarColor(color: Int) { val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - statusBarColor = color - windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) + // TODO statusBarColor = color + // TODO windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) // we need to set the light navigation appearance here because, for some reason, changing the status bar also // changes the navigation bar appearance but this method is supposed to only change the status bar - windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + // TODO windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) } fun Window.setWindowNavigationBarColor(color: Int) { val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - navigationBarColor = color - windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + // TODO navigationBarColor = color + // TODO windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) } private fun Window.isLightTheme() = !context.resources.configuration.isDarkTheme() From 482cd57086742000beb3d3eef3d1998e06b67677 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 14:07:36 -0500 Subject: [PATCH 06/31] Changed targetSdkVersion to 35 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c9089dbf0c7b..fcc3036ea438 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ plugins { ext { minSdkVersion = 26 compileSdkVersion = 35 - targetSdkVersion = 34 + targetSdkVersion = 35 secretProperties = loadSecrets( logger, From 9ebe411ce927e98166c7070522e2f33d7eca2d9b Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 14:29:30 -0500 Subject: [PATCH 07/31] Added detectNonSdkApiUsage to StrictMode --- .../java/org/wordpress/android/WordPressDebug.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java index 3d8d460b0530..03f2786f0d9a 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java @@ -1,6 +1,8 @@ package org.wordpress.android; +import android.os.Build; import android.os.StrictMode; +import android.os.StrictMode.VmPolicy; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; @@ -34,14 +36,16 @@ private void enableStrictMode() { .penaltyFlashScreen() .build()); - StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() + VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder() .detectActivityLeaks() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .detectLeakedRegistrationObjects() // <-- requires Jelly Bean - .penaltyLog() - .build()); - + .penaltyLog(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + builder.detectNonSdkApiUsage(); + } + StrictMode.setVmPolicy(builder.build()); AppLog.w(T.UTILS, "Strict mode enabled"); } } From f71572a57017893e5ecd181cee8f6e1150235a19 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 14:37:56 -0500 Subject: [PATCH 08/31] Re-enabled StrictMode --- .../src/debug/java/org/wordpress/android/WordPressDebug.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java index 03f2786f0d9a..6315ee9ff75b 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java @@ -15,7 +15,7 @@ public class WordPressDebug extends WordPressApp { public void onCreate() { super.onCreate(); - // enableStrictMode() + enableStrictMode(); } /** From f7718f8603963d9e4eca75b14b315ae447629b02 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 14:43:19 -0500 Subject: [PATCH 09/31] Temporarily disabled StrictMode disk read/write --- .../src/debug/java/org/wordpress/android/WordPressDebug.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java index 6315ee9ff75b..192e15c632d4 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java @@ -29,8 +29,8 @@ private void enableStrictMode() { } StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - .detectDiskReads() - .detectDiskWrites() + // TODO .detectDiskReads() + // TODO .detectDiskWrites() .detectNetwork() .penaltyLog() .penaltyFlashScreen() From 0c8f322b43b109848b3697eeeee49f67f723ac9d Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 14:45:06 -0500 Subject: [PATCH 10/31] Re-enabled StrictMode disk read/write --- .../src/debug/java/org/wordpress/android/WordPressDebug.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java index 192e15c632d4..6315ee9ff75b 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java @@ -29,8 +29,8 @@ private void enableStrictMode() { } StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - // TODO .detectDiskReads() - // TODO .detectDiskWrites() + .detectDiskReads() + .detectDiskWrites() .detectNetwork() .penaltyLog() .penaltyFlashScreen() From 9005ac0bf909de1fe4ab83e6563cbd0871cf904e Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 15:18:55 -0500 Subject: [PATCH 11/31] Added Android 15+ version of setWindowStatusBarColor --- .../util/extensions/WindowExtensions.kt | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index ec4e8d8fa97c..e270d8457b04 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -1,10 +1,12 @@ package org.wordpress.android.util.extensions +import android.os.Build import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN import android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE import android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR import android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR import android.view.Window +import android.view.WindowInsets import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat @@ -57,22 +59,33 @@ fun Window.showFullScreen() { } } +@Suppress("DEPRECATION") fun Window.setWindowStatusBarColor(color: Int) { - val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - - // TODO statusBarColor = color - // TODO windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { // Android 15+ + decorView.setOnApplyWindowInsetsListener { view, insets -> + val statusBarInsets = insets.getInsets(WindowInsets.Type.statusBars()) + view.setBackgroundColor(color) + // Adjust padding to avoid overlap + view.setPadding(0, statusBarInsets.top, 0, 0) + insets + } + } else { + // For Android 14 and below + statusBarColor = color + val windowInsetsController = WindowInsetsControllerCompat(this, decorView) + windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) - // we need to set the light navigation appearance here because, for some reason, changing the status bar also - // changes the navigation bar appearance but this method is supposed to only change the status bar - // TODO windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + // we need to set the light navigation appearance here because, for some reason, changing the status bar also + // changes the navigation bar appearance but this method is supposed to only change the status bar + windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + } } fun Window.setWindowNavigationBarColor(color: Int) { val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - // TODO navigationBarColor = color - // TODO windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + navigationBarColor = color + windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) } private fun Window.isLightTheme() = !context.resources.configuration.isDarkTheme() From fc308cf73c123de794d6fb3d2f45af2f16a170be Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 15:20:34 -0500 Subject: [PATCH 12/31] Added Android 15+ version of setWindowNavigationBarColor --- .../util/extensions/WindowExtensions.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index e270d8457b04..af3f756872e3 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -81,11 +81,22 @@ fun Window.setWindowStatusBarColor(color: Int) { } } +@Suppress("DEPRECATION") fun Window.setWindowNavigationBarColor(color: Int) { - val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - - navigationBarColor = color - windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { // Android 15+ + decorView.setOnApplyWindowInsetsListener { view, insets -> + view.setBackgroundColor(color) + // Adjust padding to avoid overlap + val navBarInsets = insets.getInsets(WindowInsets.Type.navigationBars()) + view.setPadding(0, navBarInsets.top, 0, 0) + insets + } + } else { + // For Android 14 and below + val windowInsetsController = WindowInsetsControllerCompat(this, decorView) + navigationBarColor = color + windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) + } } private fun Window.isLightTheme() = !context.resources.configuration.isDarkTheme() From e1aac0d323ea32b407ac62fc6012bd89a69e7561 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 15:33:38 -0500 Subject: [PATCH 13/31] Minor formatting changes --- .../util/extensions/WindowExtensions.kt | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index af3f756872e3..379af333fd91 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -1,8 +1,6 @@ package org.wordpress.android.util.extensions import android.os.Build -import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN -import android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE import android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR import android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR import android.view.Window @@ -52,16 +50,10 @@ fun Window.setEdgeToEdgeContentDisplay(isEnabled: Boolean) { WindowCompat.setDecorFitsSystemWindows(this, decorFitsSystemWindows) } -@Suppress("DEPRECATION") -fun Window.showFullScreen() { - decorView.systemUiVisibility = decorView.systemUiVisibility.let { - it or SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or SYSTEM_UI_FLAG_LAYOUT_STABLE - } -} - @Suppress("DEPRECATION") fun Window.setWindowStatusBarColor(color: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { // Android 15+ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + // Android 15+ decorView.setOnApplyWindowInsetsListener { view, insets -> val statusBarInsets = insets.getInsets(WindowInsets.Type.statusBars()) view.setBackgroundColor(color) @@ -70,7 +62,7 @@ fun Window.setWindowStatusBarColor(color: Int) { insets } } else { - // For Android 14 and below + // Android 14- statusBarColor = color val windowInsetsController = WindowInsetsControllerCompat(this, decorView) windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) @@ -83,7 +75,8 @@ fun Window.setWindowStatusBarColor(color: Int) { @Suppress("DEPRECATION") fun Window.setWindowNavigationBarColor(color: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { // Android 15+ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + // Android 15+ decorView.setOnApplyWindowInsetsListener { view, insets -> view.setBackgroundColor(color) // Adjust padding to avoid overlap @@ -92,7 +85,7 @@ fun Window.setWindowNavigationBarColor(color: Int) { insets } } else { - // For Android 14 and below + // Android 14- val windowInsetsController = WindowInsetsControllerCompat(this, decorView) navigationBarColor = color windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) From add57e5c26d94294fd766e3b3175a10efd784bae Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 16:00:05 -0500 Subject: [PATCH 14/31] Replaced deprecated removeLast --- .../mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt index ffdd2c1641c0..db50920257dd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt @@ -231,7 +231,7 @@ class QuickLinksItemViewModelSlice @Inject constructor( this@QuickLinksItemViewModelSlice::onMoreClick ) ) - quickLinkItems.removeLast() + quickLinkItems.removeAt(quickLinkItems.lastIndex) quickLinkItems.add(lastItem) quickLinks.copy(quickLinkItems = quickLinkItems, showMoreFocusPoint = true) } else { From 504f6d3b7ea3fff114d05898657e38d09a279323 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 16:05:15 -0500 Subject: [PATCH 15/31] Don't remove quick link if empty --- .../cards/quicklinksitem/QuickLinksItemViewModelSlice.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt index db50920257dd..a27355922ceb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/cards/quicklinksitem/QuickLinksItemViewModelSlice.kt @@ -231,7 +231,9 @@ class QuickLinksItemViewModelSlice @Inject constructor( this@QuickLinksItemViewModelSlice::onMoreClick ) ) - quickLinkItems.removeAt(quickLinkItems.lastIndex) + if (quickLinkItems.isNotEmpty()) { + quickLinkItems.removeAt(quickLinkItems.lastIndex) + } quickLinkItems.add(lastItem) quickLinks.copy(quickLinkItems = quickLinkItems, showMoreFocusPoint = true) } else { From 6c2d3beecdb3807e5234420b64b5c1a85c649e76 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 16:20:28 -0500 Subject: [PATCH 16/31] Fixed test --- .../wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt b/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt index 3bbe93c21ab9..ad134539f92b 100644 --- a/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt +++ b/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt @@ -239,9 +239,9 @@ class CommentSqlUtilsTest { val remoteComments = generateCommentModels(50, ALL) // exclude first 3 comments - remoteComments.removeFirst() - remoteComments.removeFirst() - remoteComments.removeFirst() + remoteComments.removeAt(0) + remoteComments.removeAt(0) + remoteComments.removeAt(0) commentsInDb.forEach { CommentSqlUtils.insertOrUpdateComment(it) From 47f44bcce97f88fa76574ebf4a9a66ea642a1470 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 16 Jan 2025 16:37:22 -0500 Subject: [PATCH 17/31] Fixed failing test due to unsupported removeLast --- .../wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt b/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt index ad134539f92b..f7de0d5a2bca 100644 --- a/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt +++ b/libs/fluxc/src/test/java/org/wordpress/android/fluxc/comment/CommentSqlUtilsTest.kt @@ -179,9 +179,9 @@ class CommentSqlUtilsTest { val commentsInDb = generateCommentModels(60, ALL) val remoteComments = generateCommentModels(30, ALL) - remoteComments.removeLast() - remoteComments.removeLast() - remoteComments.removeLast() + remoteComments.removeAt(remoteComments.lastIndex) + remoteComments.removeAt(remoteComments.lastIndex) + remoteComments.removeAt(remoteComments.lastIndex) commentsInDb.forEach { CommentSqlUtils.insertOrUpdateComment(it) From c38241e0c6b56c4928b8f515c37010587d29b134 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 17 Jan 2025 08:16:15 -0500 Subject: [PATCH 18/31] Don't shadow resource references --- .../wordpress/android/util/extensions/WindowExtensions.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index 379af333fd91..886e8f73361d 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -9,8 +9,6 @@ import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat import org.wordpress.android.util.ColorUtils -import android.R as AndroidR -import com.google.android.material.R as MaterialR @Suppress("DEPRECATION") fun Window.setLightStatusBar(showInLightMode: Boolean) { @@ -37,9 +35,9 @@ fun Window.setLightNavigationBar(showInLightMode: Boolean, applyDefaultColors: B } if (applyDefaultColors) { navigationBarColor = if (showInLightMode) { - context.getColorFromAttribute(MaterialR.attr.colorSurface) + context.getColorFromAttribute(com.google.android.material.R.attr.colorOnSurface) } else { - ContextCompat.getColor(context, AndroidR.color.black) + ContextCompat.getColor(context, android.R.color.black) } } } From 24acbefaa124e322c87b470c898c0792a85a1135 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 17 Jan 2025 08:22:57 -0500 Subject: [PATCH 19/31] Removed unused deprecated window extension functions --- .../android/util/WPActivityUtils.java | 28 -------------- .../util/extensions/WindowExtensions.kt | 38 ------------------- 2 files changed, 66 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java b/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java index d5acabcdc659..4aae2ad19ca0 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/util/WPActivityUtils.java @@ -11,7 +11,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; -import android.view.Window; import android.widget.ListView; import androidx.annotation.NonNull; @@ -25,7 +24,6 @@ import org.wordpress.android.R; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.extensions.DialogExtensionsKt; -import org.wordpress.android.util.extensions.WindowExtensionsKt; import java.util.ArrayList; import java.util.List; @@ -182,30 +180,4 @@ public static void enableReaderDeeplinks(Context context) { pm.setComponentEnabledSetting(new ComponentName(context, READER_DEEPLINK_ACTIVITY_ALIAS), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } - - /** - * @deprecated Use {@link WindowExtensionsKt} instead. - */ - @Deprecated - public static void setLightStatusBar(Window window, boolean showInLightMode) { - WindowExtensionsKt.setLightStatusBar(window, showInLightMode); - } - - /** - * @deprecated Use {@link WindowExtensionsKt} instead. - */ - @Deprecated - public static void setLightNavigationBar(Window window, boolean showInLightMode) { - WindowExtensionsKt.setLightNavigationBar(window, showInLightMode, true); - } - - /** - * @deprecated Use {@link WindowExtensionsKt} instead. - */ - @Deprecated - public static void showFullScreen(View decorView) { - int flags = decorView.getSystemUiVisibility(); - flags = flags | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; - decorView.setSystemUiVisibility(flags); - } } diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index 886e8f73361d..30c52f0d7e57 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -1,48 +1,12 @@ package org.wordpress.android.util.extensions import android.os.Build -import android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR -import android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR import android.view.Window import android.view.WindowInsets -import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat import org.wordpress.android.util.ColorUtils -@Suppress("DEPRECATION") -fun Window.setLightStatusBar(showInLightMode: Boolean) { - if (isLightTheme()) { - decorView.systemUiVisibility = decorView.systemUiVisibility.let { - if (showInLightMode) { - it or SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - } else { - it and SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() - } - } - } -} - -@Suppress("DEPRECATION") -fun Window.setLightNavigationBar(showInLightMode: Boolean, applyDefaultColors: Boolean = false) { - if (isLightTheme()) { - decorView.systemUiVisibility = decorView.systemUiVisibility.let { - if (showInLightMode) { - it or SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR - } else { - it and SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR.inv() - } - } - if (applyDefaultColors) { - navigationBarColor = if (showInLightMode) { - context.getColorFromAttribute(com.google.android.material.R.attr.colorOnSurface) - } else { - ContextCompat.getColor(context, android.R.color.black) - } - } - } -} - fun Window.setEdgeToEdgeContentDisplay(isEnabled: Boolean) { val decorFitsSystemWindows = !isEnabled WindowCompat.setDecorFitsSystemWindows(this, decorFitsSystemWindows) @@ -89,5 +53,3 @@ fun Window.setWindowNavigationBarColor(color: Int) { windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) } } - -private fun Window.isLightTheme() = !context.resources.configuration.isDarkTheme() From 744b6d157bb08861d467e64761b7987d16a09803 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 17 Jan 2025 10:22:02 -0500 Subject: [PATCH 20/31] Revert to targetSdkVersion to prevent system bar overlap --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index fcc3036ea438..c9089dbf0c7b 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ plugins { ext { minSdkVersion = 26 compileSdkVersion = 35 - targetSdkVersion = 35 + targetSdkVersion = 34 secretProperties = loadSecrets( logger, From 745bcdd38098eb74c623c85705dedfb5b2b0bca5 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Mon, 20 Jan 2025 08:23:38 -0500 Subject: [PATCH 21/31] Use WindowExtensions.setWindowNavigationBarColor --- .../org/wordpress/android/support/SupportWebViewActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt b/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt index cc1d7f404620..a4a565e19e2b 100644 --- a/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/support/SupportWebViewActivity.kt @@ -27,6 +27,7 @@ import org.wordpress.android.ui.WPWebViewActivity import org.wordpress.android.ui.accounts.HelpActivity import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.extensions.getSerializableCompat +import org.wordpress.android.util.extensions.setWindowNavigationBarColor import org.wordpress.android.widgets.WPSnackbar import java.util.UUID import javax.inject.Inject @@ -55,7 +56,7 @@ class SupportWebViewActivity : WPWebViewActivity(), SupportWebViewClient.Support supportActionBar?.title = getString(R.string.help) supportActionBar?.subtitle = "" - // TODO window.navigationBarColor = getColor(R.color.docsbot_chat_container) + window.setWindowNavigationBarColor(getColor(R.color.docsbot_chat_container)) // Prevent AppBar scrolling away val toolbar = findViewById(R.id.toolbar) From e933fb282452dcfe07af4eb1dcc47f7b7d57697a Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Mon, 20 Jan 2025 08:36:32 -0500 Subject: [PATCH 22/31] Perform version check when setting crop activity status bar color --- .../java/org/wordpress/android/ui/mysite/MySiteFragment.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index 37f16255ace6..149194fcc68a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -828,7 +828,10 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), val context = activity ?: return val options = UCrop.Options() options.setShowCropGrid(false) - // TODO options.setStatusBarColor(context.getColorFromAttribute(android.R.attr.statusBarColor)) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) { + @Suppress("DEPRECATION") + options.setStatusBarColor(context.getColorFromAttribute(android.R.attr.statusBarColor)) + } options.setToolbarColor(context.getColorFromAttribute(R.attr.wpColorAppBar)) options.setToolbarWidgetColor(context.getColorFromAttribute(com.google.android.material.R.attr.colorOnSurface)) options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE) From 102b3ca8f5da32b8cc39c35eed80cc08a169ec37 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Mon, 20 Jan 2025 08:40:03 -0500 Subject: [PATCH 23/31] Suppress DEPRECATION in WidgetUtils.kt --- .../ui/stats/refresh/lists/widget/utils/WidgetUtils.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt index 87f0adbabbe4..66d8017fe044 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/utils/WidgetUtils.kt @@ -144,7 +144,7 @@ class WidgetUtils ) } - @Suppress("LongParameterList") + @Suppress("LongParameterList", "DEPRECATION") fun showList( appWidgetManager: AppWidgetManager, views: RemoteViews, @@ -167,8 +167,8 @@ class WidgetUtils listIntent.data = Uri.parse( listIntent.toUri(Intent.URI_INTENT_SCHEME) ) - // TODO views.setRemoteAdapter(R.id.widget_content, listIntent) - // TODO appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_content) + views.setRemoteAdapter(R.id.widget_content, listIntent) + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_content) appWidgetManager.updateAppWidget(appWidgetId, views) } From 6b0953c18ba5e15aa9b91428c03f447179cb77de Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Mon, 20 Jan 2025 08:54:49 -0500 Subject: [PATCH 24/31] Added strict mode comment --- .../src/debug/java/org/wordpress/android/WordPressDebug.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java index 6315ee9ff75b..05365be7ee12 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java @@ -14,7 +14,7 @@ public class WordPressDebug extends WordPressApp { @Override public void onCreate() { super.onCreate(); - + // TODO we'll want to comment this out before merging the Android 15 feature branch enableStrictMode(); } From 136600528d7755685525eaa75b3699f1e89f4638 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Mon, 20 Jan 2025 11:34:33 -0500 Subject: [PATCH 25/31] Rename .java to .kt --- .../wordpress/android/{WordPressDebug.java => WordPressDebug.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename WordPress/src/debug/java/org/wordpress/android/{WordPressDebug.java => WordPressDebug.kt} (100%) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt similarity index 100% rename from WordPress/src/debug/java/org/wordpress/android/WordPressDebug.java rename to WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt From 360bf778f1e4c7195a3f106c1f11cb1a7ed3b6ed Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Mon, 20 Jan 2025 11:34:33 -0500 Subject: [PATCH 26/31] Convert WordPressDebug to Kotlin --- .../org/wordpress/android/WordPressDebug.kt | 76 ++++++++++--------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt index 05365be7ee12..f53c5d03cc85 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt @@ -1,51 +1,55 @@ -package org.wordpress.android; +package org.wordpress.android -import android.os.Build; -import android.os.StrictMode; -import android.os.StrictMode.VmPolicy; - -import org.wordpress.android.util.AppLog; -import org.wordpress.android.util.AppLog.T; - -import dagger.hilt.android.HiltAndroidApp; +import android.os.Build +import android.os.StrictMode +import android.os.StrictMode.ThreadPolicy +import android.os.StrictMode.VmPolicy +import dagger.hilt.android.HiltAndroidApp +import org.wordpress.android.util.AppLog @HiltAndroidApp -public class WordPressDebug extends WordPressApp { - @Override - public void onCreate() { - super.onCreate(); - // TODO we'll want to comment this out before merging the Android 15 feature branch - enableStrictMode(); +class WordPressDebug : WordPressApp() { + override fun onCreate() { + super.onCreate() + // TODO comment this out before merging the Android 15 feature branch + enableStrictMode() } /** * enables "strict mode" for testing - should NEVER be used in release builds */ - private void enableStrictMode() { + private fun enableStrictMode() { // return if the build is not a debug build if (!BuildConfig.DEBUG) { - AppLog.e(T.UTILS, "You should not call enableStrictMode() on a non debug build"); - return; + AppLog.e(AppLog.T.UTILS, "You should not call enableStrictMode() on a non debug build") + return } - StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() - .detectDiskReads() - .detectDiskWrites() - .detectNetwork() - .penaltyLog() - .penaltyFlashScreen() - .build()); + StrictMode.setThreadPolicy( + ThreadPolicy.Builder() + .detectDiskReads() + .detectDiskWrites() + .detectNetwork() + .penaltyLog() + .penaltyFlashScreen() + .build() + ) - VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder() - .detectActivityLeaks() - .detectLeakedSqlLiteObjects() - .detectLeakedClosableObjects() - .detectLeakedRegistrationObjects() // <-- requires Jelly Bean - .penaltyLog(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - builder.detectNonSdkApiUsage(); - } - StrictMode.setVmPolicy(builder.build()); - AppLog.w(T.UTILS, "Strict mode enabled"); + StrictMode.setVmPolicy( + VmPolicy.Builder() + .detectActivityLeaks() + .detectLeakedSqlLiteObjects() + .detectLeakedClosableObjects() + .detectLeakedRegistrationObjects() + .penaltyLog() + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + detectNonSdkApiUsage() + } + } + .build() + ) + + AppLog.w(AppLog.T.UTILS, "Strict mode enabled") } } From 478af968f8bfb2946badf0c694e359ddd02a0d4c Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 21 Jan 2025 10:53:13 -0500 Subject: [PATCH 27/31] Comment out enableStrictMode --- .../src/debug/java/org/wordpress/android/WordPressDebug.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt index f53c5d03cc85..18f1b49c5394 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt @@ -11,8 +11,7 @@ import org.wordpress.android.util.AppLog class WordPressDebug : WordPressApp() { override fun onCreate() { super.onCreate() - // TODO comment this out before merging the Android 15 feature branch - enableStrictMode() + // enableStrictMode() } /** From 42e21690072014ab019a80082fabf4682fa0e1c0 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 21 Jan 2025 12:04:57 -0500 Subject: [PATCH 28/31] Set uCrop status bar color based on SDK version --- .../java/org/wordpress/android/ui/mysite/MySiteFragment.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt index 149194fcc68a..30cd1a647adc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/MySiteFragment.kt @@ -828,9 +828,10 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), val context = activity ?: return val options = UCrop.Options() options.setShowCropGrid(false) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) { - @Suppress("DEPRECATION") - options.setStatusBarColor(context.getColorFromAttribute(android.R.attr.statusBarColor)) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + options.setStatusBarColor(com.google.android.material.R.attr.colorSurface) + } else { + options.setStatusBarColor(com.google.android.material.R.attr.colorOnSurface) } options.setToolbarColor(context.getColorFromAttribute(R.attr.wpColorAppBar)) options.setToolbarWidgetColor(context.getColorFromAttribute(com.google.android.material.R.attr.colorOnSurface)) From 85f9f01cb80731747e6396a9d10fcb6d31616ae0 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 21 Jan 2025 12:20:48 -0500 Subject: [PATCH 29/31] Use fun setWindowBarColor to set either status or navBar colors --- .../util/extensions/WindowExtensions.kt | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt index 30c52f0d7e57..825b9493d6cd 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt @@ -12,44 +12,48 @@ fun Window.setEdgeToEdgeContentDisplay(isEnabled: Boolean) { WindowCompat.setDecorFitsSystemWindows(this, decorFitsSystemWindows) } -@Suppress("DEPRECATION") fun Window.setWindowStatusBarColor(color: Int) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { - // Android 15+ - decorView.setOnApplyWindowInsetsListener { view, insets -> - val statusBarInsets = insets.getInsets(WindowInsets.Type.statusBars()) - view.setBackgroundColor(color) - // Adjust padding to avoid overlap - view.setPadding(0, statusBarInsets.top, 0, 0) - insets - } - } else { - // Android 14- - statusBarColor = color - val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) + setWindowBarColor(color, InsetsType.STATUS_BAR) +} - // we need to set the light navigation appearance here because, for some reason, changing the status bar also - // changes the navigation bar appearance but this method is supposed to only change the status bar - windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) - } +fun Window.setWindowNavigationBarColor(color: Int) { + setWindowBarColor(color, InsetsType.NAVIGATION_BAR) } +/** + * Sets the status bar or navigation bar color + * TODO Setting both the status bar color and navigation bar color causes the insets to be set twice + */ @Suppress("DEPRECATION") -fun Window.setWindowNavigationBarColor(color: Int) { +private fun Window.setWindowBarColor(color: Int, insetsType: InsetsType) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { // Android 15+ decorView.setOnApplyWindowInsetsListener { view, insets -> view.setBackgroundColor(color) + val barInsets = insets.getInsets( + when (insetsType) { + InsetsType.STATUS_BAR -> WindowInsets.Type.statusBars() + InsetsType.NAVIGATION_BAR -> WindowInsets.Type.navigationBars() + } + ) // Adjust padding to avoid overlap - val navBarInsets = insets.getInsets(WindowInsets.Type.navigationBars()) - view.setPadding(0, navBarInsets.top, 0, 0) + view.setPadding(0, barInsets.top, 0, 0) insets } } else { - // Android 14- + when(insetsType) { + InsetsType.STATUS_BAR -> statusBarColor = color + InsetsType.NAVIGATION_BAR -> navigationBarColor = color + } val windowInsetsController = WindowInsetsControllerCompat(this, decorView) - navigationBarColor = color + if (insetsType == InsetsType.STATUS_BAR) { + windowInsetsController.isAppearanceLightStatusBars = ColorUtils.isColorLight(statusBarColor) + } windowInsetsController.isAppearanceLightNavigationBars = ColorUtils.isColorLight(navigationBarColor) } } + +private enum class InsetsType { + STATUS_BAR, + NAVIGATION_BAR +} From b8b9a3bfa4a2ce290b8c1904bad14d3371c41bd4 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 21 Jan 2025 12:25:44 -0500 Subject: [PATCH 30/31] Added recommended changes to SignatureUtils --- .../android/util/signature/SignatureUtils.kt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt b/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt index 7165c12dc127..a65ea89ab0c8 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt @@ -33,12 +33,12 @@ class SignatureUtils @Inject constructor( contextProvider.getContext().packageManager.getPackageInfoCompat( trustedPackageId, PackageManager.GET_SIGNING_CERTIFICATES - ) - ).signingInfo - if (signingInfo?.hasMultipleSigners() == true) { + )?.signingInfo + ) + if (signingInfo.hasMultipleSigners()) { throw SignatureNotFoundException() } - val allSignaturesMatch = signingInfo?.signingCertificateHistory?.all { + val allSignaturesMatch = signingInfo.signingCertificateHistory?.all { toHexStringWithColons(messageDigest.digest(it.toByteArray())) == trustedSignatureHash } ?: false if (allSignaturesMatch) { @@ -54,11 +54,13 @@ class SignatureUtils @Inject constructor( trustedSignatureHash: String ): Boolean { try { - val signatures = contextProvider.getContext().packageManager - .getPackageInfo(trustedPackageId, PackageManager.GET_SIGNATURES).signatures - val allSignaturesMatch = signatures?.all { + val signatures = requireNotNull( + contextProvider.getContext().packageManager + .getPackageInfo(trustedPackageId, PackageManager.GET_SIGNATURES).signatures + ) + val allSignaturesMatch = signatures.all { toHexStringWithColons(messageDigest.digest(it.toByteArray())) == trustedSignatureHash - } ?: false + } return if (allSignaturesMatch) { true } else throw SignatureNotFoundException() From 17ca78f846965dab0ae7ccc7e520c44562a8b891 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Tue, 21 Jan 2025 12:50:35 -0500 Subject: [PATCH 31/31] Added detectUnsafeIntentLaunch() to strict mode --- .../src/debug/java/org/wordpress/android/WordPressDebug.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt index 18f1b49c5394..c42bfcb6b9a4 100644 --- a/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt +++ b/WordPress/src/debug/java/org/wordpress/android/WordPressDebug.kt @@ -45,6 +45,9 @@ class WordPressDebug : WordPressApp() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { detectNonSdkApiUsage() } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + detectUnsafeIntentLaunch() + } } .build() )