From 10be172e14ea3d3ac774c7051f022887f6627875 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:47:49 -0600 Subject: [PATCH 01/26] Move UiHelpers.kt and WPSwitch.kt to `:libs:core-ui` Pure file moves with no modifications, to preserve git history. Co-Authored-By: Claude Opus 4.6 --- .../wordpress/android/ui/compose/components/buttons/WPSwitch.kt | 0 .../src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt From 9035f6d6802e623b24cf0e675e7a78b3840334b5 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:48:13 -0600 Subject: [PATCH 02/26] Extract `:libs:core-ui` module from `:WordPress` Move foundational UI components, Compose theme, ViewModel base classes, and shared utilities into the new core-ui library module. This is the first step toward modularizing the codebase to improve compilation and linting speed. Moved to core-ui: - Compose theme (AppThemeM3, AppColor, JetpackColors) - Compose components (buttons, cards, text, dialogs, etc.) - Compose utilities (ComposeUtils, MarkdownUtils, SpannedTextUtils, etc.) - UI utilities (UiHelpers, UiString, UiDimen, ListItemInteraction, etc.) - ViewModel base classes (ScopedViewModel, Event, ResourceProvider, etc.) - Coroutine dispatcher constants (APPLICATION_SCOPE, UI_THREAD, etc.) Notable changes: - AppThemeM3 now uses `LocalIsJetpackApp` CompositionLocal instead of BuildConfig.IS_JETPACK_APP, decoupling it from the app module - UiHelpers animation methods moved to UiHelpersExt.kt in :WordPress (they depend on app-specific AniUtils) - WPSwitch preview simplified to remove WPSwitchCompat dependency - ComposeUtils inlines locale/RTL helpers previously from util.extensions Co-Authored-By: Claude Opus 4.6 --- WordPress/build.gradle | 1 + .../android/modules/ApplicationModule.java | 2 +- .../wordpress/android/modules/ThreadModule.kt | 6 - .../android/ui/media/MediaGridAdapter.java | 2 +- .../ui/mlp/ModalLayoutPickerFragment.kt | 1 + .../ui/prefs/DetailListPreference.java | 4 +- .../ui/prefs/SiteSettingsFormatDialog.java | 4 +- .../theme/HomePagePickerFragment.kt | 1 + .../verticals/SiteCreationIntentsFragment.kt | 1 + .../android/ui/utils/UiHelpersExt.kt | 60 +++ libs/core-ui/build.gradle | 86 +++++ libs/core-ui/src/main/AndroidManifest.xml | 2 + .../android/modules/CoroutineDispatchers.kt | 7 + .../wordpress/android/ui/compose/TestTags.kt | 0 .../ui/compose/components/ButtonsColumn.kt | 2 +- .../ColumnWithFrostedGlassBackground.kt | 0 .../ui/compose/components/EmptyContentM3.kt | 2 +- .../ui/compose/components/MainTopAppBar.kt | 2 +- .../ui/compose/components/ProgressDialog.kt | 2 +- .../components/ScreenWithTopAppBarM3.kt | 2 +- .../components/SingleChoiceAlertDialog.kt | 2 +- .../ui/compose/components/SolidCircle.kt | 0 .../ui/compose/components/TrainOfIcons.kt | 10 +- .../compose/components/VerticalScrollBox.kt | 0 .../compose/components/buttons/ButtonSize.kt | 0 .../components/buttons/ImageButtonM3.kt | 2 +- .../components/buttons/PrimaryButtonM3.kt | 2 +- .../components/buttons/SecondaryButtonM3.kt | 2 +- .../ui/compose/components/buttons/WPSwitch.kt | 93 +---- .../compose/components/card/UnelevatedCard.kt | 0 .../ui/compose/components/text/MessageM3.kt | 2 +- .../ui/compose/components/text/SubtitleM3.kt | 0 .../ui/compose/components/text/TitleM3.kt | 0 .../android/ui/compose/modifiers/Modifiers.kt | 0 .../compose/styles/DashboardCardTypography.kt | 0 .../android/ui/compose/theme/AppColor.kt | 0 .../android/ui/compose/theme/AppThemeM3.kt | 17 +- .../android/ui/compose/theme/JetpackColors.kt | 0 .../android/ui/compose/unit/FontSize.kt | 0 .../android/ui/compose/unit/Margin.kt | 0 .../android/ui/compose/utils/ComposeUtils.kt | 10 +- .../ui/compose/utils/FadingEdgesModifier.kt | 0 .../android/ui/compose/utils/MarkdownUtils.kt | 0 .../ui/compose/utils/SpannedTextUtils.kt | 0 .../android/ui/compose/utils/UiStringText.kt | 0 ...actAllowedUrlsWebViewNavigationDelegate.kt | 0 .../ui/utils/ConcurrentContinuationWrapper.kt | 0 .../android/ui/utils/ContinuationWrapper.kt | 0 .../android/ui/utils/HtmlMessageUtils.kt | 0 .../android/ui/utils/ListItemInteraction.kt | 0 .../ui/utils/PaddingBackgroundColorSpan.kt | 0 .../ui/utils/RecyclerViewExtensions.kt | 0 .../org/wordpress/android/ui/utils/UiDimen.kt | 0 .../wordpress/android/ui/utils/UiHelpers.kt | 77 +--- .../wordpress/android/ui/utils/UiString.kt | 0 .../android/viewmodel/ContextProvider.kt | 0 .../org/wordpress/android/viewmodel/Event.kt | 0 .../viewmodel/ReactiveMutableLiveData.kt | 0 .../android/viewmodel/ResourceProvider.kt | 0 .../android/viewmodel/ScopedViewModel.kt | 0 .../viewmodel/SingleEventObservable.kt | 0 .../android/viewmodel/SingleLiveEvent.kt | 0 .../viewmodel/SingleMediatorLiveEvent.kt | 0 .../android/viewmodel/ViewModelFactory.java | 0 .../android/viewmodel/ViewModelKey.java | 0 .../viewmodel/uistate/ProgressBarUiState.kt | 0 .../main/res/drawable/ic_pages_white_24dp.xml | 9 + .../img_illustration_empty_results_216dp.xml | 357 ++++++++++++++++++ libs/core-ui/src/main/res/values/colors.xml | 12 + libs/core-ui/src/main/res/values/dimens.xml | 4 + libs/core-ui/src/main/res/values/strings.xml | 8 + settings.gradle | 1 + 72 files changed, 620 insertions(+), 175 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/utils/UiHelpersExt.kt create mode 100644 libs/core-ui/build.gradle create mode 100644 libs/core-ui/src/main/AndroidManifest.xml create mode 100644 libs/core-ui/src/main/java/org/wordpress/android/modules/CoroutineDispatchers.kt rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/TestTags.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt (95%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/ColumnWithFrostedGlassBackground.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt (99%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt (99%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt (99%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt (98%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt (99%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/SolidCircle.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt (96%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/VerticalScrollBox.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/buttons/ButtonSize.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt (99%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt (98%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt (98%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/card/UnelevatedCard.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt (96%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/text/SubtitleM3.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/components/text/TitleM3.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/modifiers/Modifiers.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/styles/DashboardCardTypography.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/theme/AppColor.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt (92%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/theme/JetpackColors.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/unit/FontSize.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/unit/Margin.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt (90%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/utils/FadingEdgesModifier.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/utils/MarkdownUtils.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/utils/SpannedTextUtils.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/compose/utils/UiStringText.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/AbstractAllowedUrlsWebViewNavigationDelegate.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/ConcurrentContinuationWrapper.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/ContinuationWrapper.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/HtmlMessageUtils.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/ListItemInteraction.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/PaddingBackgroundColorSpan.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/RecyclerViewExtensions.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/UiDimen.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/utils/UiString.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/ContextProvider.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/Event.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/ReactiveMutableLiveData.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/ResourceProvider.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/ScopedViewModel.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/SingleEventObservable.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/SingleLiveEvent.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/SingleMediatorLiveEvent.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/ViewModelFactory.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/ViewModelKey.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt (100%) create mode 100644 libs/core-ui/src/main/res/drawable/ic_pages_white_24dp.xml create mode 100644 libs/core-ui/src/main/res/drawable/img_illustration_empty_results_216dp.xml create mode 100644 libs/core-ui/src/main/res/values/colors.xml create mode 100644 libs/core-ui/src/main/res/values/dimens.xml create mode 100644 libs/core-ui/src/main/res/values/strings.xml diff --git a/WordPress/build.gradle b/WordPress/build.gradle index 412031709c9b..dc616eaff836 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -366,6 +366,7 @@ dependencies { } } implementation project(":libs:posttypes") + implementation project(":libs:core-ui") implementation("$gradle.ext.aboutAutomatticBinaryPath:${libs.versions.automattic.about.get()}") implementation("$gradle.ext.gutenbergKitBinaryPath:${libs.versions.gutenberg.kit.get()}") diff --git a/WordPress/src/main/java/org/wordpress/android/modules/ApplicationModule.java b/WordPress/src/main/java/org/wordpress/android/modules/ApplicationModule.java index befd8f846506..d17c9b0685c7 100644 --- a/WordPress/src/main/java/org/wordpress/android/modules/ApplicationModule.java +++ b/WordPress/src/main/java/org/wordpress/android/modules/ApplicationModule.java @@ -56,7 +56,7 @@ import kotlinx.coroutines.CoroutineScope; import rs.wordpress.api.kotlin.WpLoginClient; -import static org.wordpress.android.modules.ThreadModuleKt.APPLICATION_SCOPE; +import static org.wordpress.android.modules.CoroutineDispatchersKt.APPLICATION_SCOPE; @InstallIn(SingletonComponent.class) @Module(includes = AndroidInjectionModule.class) diff --git a/WordPress/src/main/java/org/wordpress/android/modules/ThreadModule.kt b/WordPress/src/main/java/org/wordpress/android/modules/ThreadModule.kt index f79a2881c190..42ecf68ddb41 100644 --- a/WordPress/src/main/java/org/wordpress/android/modules/ThreadModule.kt +++ b/WordPress/src/main/java/org/wordpress/android/modules/ThreadModule.kt @@ -10,12 +10,6 @@ import kotlinx.coroutines.Dispatchers import org.wordpress.android.util.helpers.Debouncer import javax.inject.Named -const val APPLICATION_SCOPE = "APPLICATION_SCOPE" - -const val UI_THREAD = "UI_THREAD" -const val BG_THREAD = "BG_THREAD" -const val IO_THREAD = "IO_THREAD" - @InstallIn(SingletonComponent::class) @Module class ThreadModule { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java index 9411e15d685d..07a28ad3f613 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java @@ -55,7 +55,7 @@ import kotlinx.coroutines.CoroutineScope; -import static org.wordpress.android.modules.ThreadModuleKt.APPLICATION_SCOPE; +import static org.wordpress.android.modules.CoroutineDispatchersKt.APPLICATION_SCOPE; /** * An adapter for the media gallery grid. diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mlp/ModalLayoutPickerFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mlp/ModalLayoutPickerFragment.kt index 0279c6cecbde..407600849f9b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mlp/ModalLayoutPickerFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mlp/ModalLayoutPickerFragment.kt @@ -26,6 +26,7 @@ import org.wordpress.android.ui.layoutpicker.LayoutPickerViewModel.DesignPreview import org.wordpress.android.ui.layoutpicker.LayoutPickerViewModel.DesignPreviewAction.Show import org.wordpress.android.ui.mlp.BlockLayoutPreviewFragment.Companion.BLOCK_LAYOUT_PREVIEW_TAG import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.ui.utils.fadeInfadeOutViews import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.extensions.setVisible import org.wordpress.android.viewmodel.mlp.ModalLayoutPickerViewModel diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java index 7bad8bfd62e5..c24666b09666 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/DetailListPreference.java @@ -23,7 +23,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.wordpress.android.R; -import org.wordpress.android.ui.utils.UiHelpers; +import org.wordpress.android.ui.utils.UiHelpersExtKt; import org.wordpress.android.util.ArrayUtils; import java.util.ArrayList; @@ -141,7 +141,7 @@ protected void showDialog(Bundle state) { listView.setPadding(0, 0, 0, res.getDimensionPixelSize(R.dimen.site_settings_divider_height)); } - UiHelpers.Companion.adjustDialogSize(mDialog); + UiHelpersExtKt.adjustDialogSize(mDialog); } @Override diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFormatDialog.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFormatDialog.java index bb3a9526a959..c0ec4e88461a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFormatDialog.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFormatDialog.java @@ -24,7 +24,7 @@ import org.wordpress.android.Constants; import org.wordpress.android.R; import org.wordpress.android.ui.ActivityLauncher; -import org.wordpress.android.ui.utils.UiHelpers; +import org.wordpress.android.ui.utils.UiHelpersExtKt; import org.wordpress.android.util.EditTextUtils; /** @@ -178,7 +178,7 @@ private String getSelectedFormatValue() { @Override public void onResume() { super.onResume(); - UiHelpers.Companion.adjustDialogSize(getDialog()); + UiHelpersExtKt.adjustDialogSize(getDialog()); } @Override diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/HomePagePickerFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/HomePagePickerFragment.kt index 21264708a2fd..994d63d5587a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/HomePagePickerFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/HomePagePickerFragment.kt @@ -20,6 +20,7 @@ import org.wordpress.android.ui.layoutpicker.LayoutPickerViewModel.DesignPreview import org.wordpress.android.ui.layoutpicker.LayoutPickerViewModel.DesignPreviewAction.Show import org.wordpress.android.ui.sitecreation.theme.DesignPreviewFragment.Companion.DESIGN_PREVIEW_TAG import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.ui.utils.fadeInfadeOutViews import org.wordpress.android.util.DisplayUtilsWrapper import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.config.SiteNameFeatureConfig diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/verticals/SiteCreationIntentsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/verticals/SiteCreationIntentsFragment.kt index 0aeeec7750f1..d3f323e7e404 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/verticals/SiteCreationIntentsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/verticals/SiteCreationIntentsFragment.kt @@ -14,6 +14,7 @@ import org.wordpress.android.R import org.wordpress.android.databinding.SiteCreationIntentsFragmentBinding import org.wordpress.android.ui.sitecreation.verticals.SiteCreationIntentsViewModel.IntentsUiState import org.wordpress.android.ui.utils.UiHelpers +import org.wordpress.android.ui.utils.fadeInfadeOutViews import org.wordpress.android.util.DisplayUtilsWrapper import javax.inject.Inject diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/UiHelpersExt.kt b/WordPress/src/main/java/org/wordpress/android/ui/utils/UiHelpersExt.kt new file mode 100644 index 000000000000..4be2ae632505 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/utils/UiHelpersExt.kt @@ -0,0 +1,60 @@ +package org.wordpress.android.ui.utils + +import android.app.Dialog +import android.graphics.Point +import android.view.View +import android.view.WindowManager.LayoutParams +import androidx.core.view.isVisible +import org.wordpress.android.R +import org.wordpress.android.util.AniUtils +import org.wordpress.android.util.AniUtils.Duration + +/** + * Sets the [firstView] visible and the [secondView] invisible + * with a fade in/out animation and vice versa. + * @param visible if true the [firstView] is shown and the + * [secondView] is hidden else the other way round + */ +fun UiHelpers.fadeInfadeOutViews( + firstView: View?, + secondView: View?, + visible: Boolean +) { + if (firstView == null || + secondView == null || + visible == firstView.isVisible + ) return + if (visible) { + AniUtils.fadeIn(firstView, Duration.SHORT) + AniUtils.fadeOut( + secondView, Duration.SHORT, View.INVISIBLE + ) + } else { + AniUtils.fadeIn(secondView, Duration.SHORT) + AniUtils.fadeOut( + firstView, Duration.SHORT, View.INVISIBLE + ) + } +} + +@Suppress("DEPRECATION") +fun adjustDialogSize(dialog: Dialog) { + val window = requireNotNull(dialog.window) + val size = Point() + + val display = window.windowManager.defaultDisplay + display.getSize(size) + + val width = size.x + + val maximumWidth = window.context.resources + .getDimension(R.dimen.alert_dialog_max_width).toInt() + @Suppress("MagicNumber") + var proposedWidth = (width * 0.8).toInt() + + if (proposedWidth > maximumWidth) { + proposedWidth = maximumWidth + } + + window.setLayout(proposedWidth, LayoutParams.WRAP_CONTENT) +} diff --git a/libs/core-ui/build.gradle b/libs/core-ui/build.gradle new file mode 100644 index 000000000000..3ef60f920a20 --- /dev/null +++ b/libs/core-ui/build.gradle @@ -0,0 +1,86 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.google.dagger.hilt) + alias(libs.plugins.ksp) + alias(libs.plugins.dependency.analysis) +} + +android { + namespace "org.wordpress.android.coreui" + + defaultConfig { + compileSdk rootProject.compileSdkVersion + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + targetCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + } + + buildFeatures { + compose true + } +} + +dependencies { + // AndroidX + implementation libs.androidx.appcompat.main + implementation libs.androidx.recyclerview + + // Lifecycle + implementation libs.androidx.lifecycle.common + implementation libs.androidx.lifecycle.livedata.core + implementation libs.androidx.lifecycle.viewmodel.main + implementation libs.androidx.lifecycle.runtime + implementation libs.androidx.lifecycle.viewmodel.compose + + // Compose + implementation platform(libs.androidx.compose.bom) + implementation libs.androidx.compose.ui.main + implementation libs.androidx.compose.ui.graphics + implementation libs.androidx.compose.ui.text + implementation libs.androidx.compose.ui.unit + implementation libs.androidx.compose.ui.tooling.preview + implementation libs.androidx.compose.foundation.main + implementation libs.androidx.compose.material + implementation libs.androidx.compose.material3 + implementation libs.androidx.compose.material.icons.extended + implementation libs.androidx.compose.runtime.main + implementation libs.androidx.activity.compose + implementation libs.androidx.constraintlayout.compose + + // Google Material (for WPSwitch color resources) + implementation libs.google.material + + // Coil (for AsyncImage in TrainOfIcons) + implementation libs.coil.compose + + // CommonMark (for MarkdownUtils) + implementation libs.commonmark + + // Coroutines + implementation libs.kotlinx.coroutines.core + implementation libs.kotlinx.coroutines.android + + // WordPress utils (StringUtils, DisplayUtils) + implementation("$gradle.ext.wputilsBinaryPath") { + version { + strictly libs.wordpress.utils.get().version + } + } + + // Dagger / Hilt + implementation libs.google.dagger.hilt.android.main + ksp libs.google.dagger.hilt.compiler + + // Debug + debugImplementation libs.androidx.compose.ui.tooling.main +} diff --git a/libs/core-ui/src/main/AndroidManifest.xml b/libs/core-ui/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..8072ee00dbf1 --- /dev/null +++ b/libs/core-ui/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/libs/core-ui/src/main/java/org/wordpress/android/modules/CoroutineDispatchers.kt b/libs/core-ui/src/main/java/org/wordpress/android/modules/CoroutineDispatchers.kt new file mode 100644 index 000000000000..6988566cacc0 --- /dev/null +++ b/libs/core-ui/src/main/java/org/wordpress/android/modules/CoroutineDispatchers.kt @@ -0,0 +1,7 @@ +package org.wordpress.android.modules + +const val APPLICATION_SCOPE = "APPLICATION_SCOPE" + +const val UI_THREAD = "UI_THREAD" +const val BG_THREAD = "BG_THREAD" +const val IO_THREAD = "IO_THREAD" diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/TestTags.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/TestTags.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/TestTags.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/TestTags.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt similarity index 95% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt index 94ff75eabfbd..74a6ff4c6fe3 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ButtonsColumn.kt @@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.colorResource import androidx.compose.ui.unit.dp -import org.wordpress.android.R +import org.wordpress.android.coreui.R @Composable fun ButtonsColumn( diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ColumnWithFrostedGlassBackground.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ColumnWithFrostedGlassBackground.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/ColumnWithFrostedGlassBackground.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ColumnWithFrostedGlassBackground.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt index 6600e2272ba0..978033d40f51 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/EmptyContentM3.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 import org.wordpress.android.ui.compose.unit.FontSize import org.wordpress.android.ui.compose.unit.Margin diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt index 76c3ac7e6550..8b4418fafa1f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/MainTopAppBar.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 typealias NavigationIcon = @Composable () -> Unit diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt index 6f9f5d45fad1..767910623e8d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ProgressDialog.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import kotlinx.coroutines.flow.Flow -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 @Composable diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt index 548fbb29862c..d8882e996f5f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/ScreenWithTopAppBarM3.kt @@ -17,7 +17,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 /** diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt index 3f336498ca96..e890adc1f3f5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/SingleChoiceAlertDialog.kt @@ -19,7 +19,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 /** diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/SolidCircle.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/SolidCircle.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/SolidCircle.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/SolidCircle.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt similarity index 96% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt index 394de4f1defe..c584c337679c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/TrainOfIcons.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import coil.compose.AsyncImage -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 private const val DEFAULT_ICON_SIZE = 32 @@ -117,10 +117,10 @@ fun TrainOfIconsPreview() { AppThemeM3 { TrainOfIcons( iconModels = listOf( - R.mipmap.app_icon, - R.mipmap.app_icon, - R.mipmap.app_icon, - R.mipmap.app_icon + R.color.placeholder, + R.color.placeholder, + R.color.placeholder, + R.color.placeholder ).map { TrainOfIconsModel(it) }, contentDescription = "Train of icons", ) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/VerticalScrollBox.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/VerticalScrollBox.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/VerticalScrollBox.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/VerticalScrollBox.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/ButtonSize.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/ButtonSize.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/ButtonSize.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/ButtonSize.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt index 07c19434707d..27ad43b9bf2c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/ImageButtonM3.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.utils.uiStringText import org.wordpress.android.ui.utils.UiString diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt index c6c1fa8cca29..5094c840441a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/PrimaryButtonM3.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.modifiers.conditionalThen import org.wordpress.android.ui.compose.theme.AppColor import org.wordpress.android.ui.compose.theme.AppThemeM3 diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt index c83f97395657..71254b6d52d2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/SecondaryButtonM3.kt @@ -18,7 +18,7 @@ import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 @Composable diff --git a/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt index e696efdb78ca..d759a9a6f23b 100644 --- a/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/buttons/WPSwitch.kt @@ -1,6 +1,5 @@ package org.wordpress.android.ui.compose.components.buttons -import android.annotation.SuppressLint import android.content.res.Configuration.UI_MODE_NIGHT_YES import androidx.compose.foundation.interaction.Interaction import androidx.compose.foundation.interaction.MutableInteractionSource @@ -8,13 +7,13 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch import androidx.compose.material3.SwitchColors import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text -import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -25,10 +24,8 @@ import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.res.colorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.viewinterop.AndroidView import org.wordpress.android.ui.compose.theme.AppThemeM3 import org.wordpress.android.ui.compose.utils.isLightTheme -import org.wordpress.android.widgets.WPSwitchCompat import com.google.android.material.R as MaterialR /** @@ -113,9 +110,6 @@ object WPSwitchDefaults { } } -/** - * Compose for previewing against the Android View-based [WPSwitchCompat]. - */ @Composable private fun StatefulWPSwitchWithText( text: String, @@ -132,7 +126,11 @@ private fun StatefulWPSwitchWithText( text, modifier = Modifier.weight(1f), style = MaterialTheme.typography.bodyMedium, - color = if (enabled) Color.Unspecified else LocalContentColor.current.copy(alpha = 0.38f), + color = if (enabled) { + Color.Unspecified + } else { + LocalContentColor.current.copy(alpha = 0.38f) + }, ) WPSwitch( checked = checkedState.value, @@ -142,112 +140,41 @@ private fun StatefulWPSwitchWithText( } } -@SuppressLint("SetTextI18n") @Preview(name = "Light mode") @Preview(name = "Dark mode", uiMode = UI_MODE_NIGHT_YES) @Composable private fun WPSwitchPreview() { AppThemeM3 { Column(modifier = Modifier.fillMaxWidth()) { - val viewModifier = Modifier - .fillMaxWidth() - .padding(8.dp) - val composeModifier = Modifier .fillMaxWidth() .padding(horizontal = 8.dp) - // compose enabled checked StatefulWPSwitchWithText( - text = "Compose enabled checked", + text = "Enabled checked", modifier = composeModifier, initialCheckedState = true, ) - HorizontalDivider() - - // view enabled checked - AndroidView( - factory = { context -> - WPSwitchCompat(context).apply { - isChecked = true - isEnabled = true - text = "View enabled checked" - } - }, - modifier = viewModifier - ) - - HorizontalDivider() - - // compose enabled unchecked StatefulWPSwitchWithText( - text = "Compose enabled unchecked", + text = "Enabled unchecked", modifier = composeModifier, initialCheckedState = false, ) - HorizontalDivider() - - // view enabled unchecked - AndroidView( - factory = { context -> - WPSwitchCompat(context).apply { - isChecked = false - isEnabled = true - text = "View enabled unchecked" - } - }, - modifier = viewModifier - ) - - HorizontalDivider() - - // compose disabled checked StatefulWPSwitchWithText( - text = "Compose disabled checked", + text = "Disabled checked", modifier = composeModifier, initialCheckedState = true, enabled = false, ) - - HorizontalDivider() - - // view disabled checked - AndroidView( - factory = { context -> - WPSwitchCompat(context).apply { - isChecked = true - isEnabled = false - text = "View disabled checked" - } - }, - modifier = viewModifier - ) - HorizontalDivider() - - // compose disabled unchecked StatefulWPSwitchWithText( - text = "Compose disabled unchecked", + text = "Disabled unchecked", modifier = composeModifier, initialCheckedState = false, enabled = false, ) - - HorizontalDivider() - - // view disabled unchecked - AndroidView( - factory = { context -> - WPSwitchCompat(context).apply { - isChecked = false - isEnabled = false - text = "View disabled unchecked" - } - }, - modifier = viewModifier - ) } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/card/UnelevatedCard.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/card/UnelevatedCard.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/card/UnelevatedCard.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/card/UnelevatedCard.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt similarity index 96% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt index f41bbd280517..9f8a9190c17a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/MessageM3.kt @@ -8,7 +8,7 @@ import androidx.compose.ui.res.colorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import org.wordpress.android.R +import org.wordpress.android.coreui.R import org.wordpress.android.ui.compose.theme.AppThemeM3 @Composable diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/SubtitleM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/SubtitleM3.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/SubtitleM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/SubtitleM3.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/TitleM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/TitleM3.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/components/text/TitleM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/components/text/TitleM3.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/modifiers/Modifiers.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/modifiers/Modifiers.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/modifiers/Modifiers.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/modifiers/Modifiers.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/styles/DashboardCardTypography.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/styles/DashboardCardTypography.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/styles/DashboardCardTypography.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/styles/DashboardCardTypography.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/theme/AppColor.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/AppColor.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/theme/AppColor.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/AppColor.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt similarity index 92% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt index ce2a00f50890..ec203dc9f228 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/AppThemeM3.kt @@ -12,14 +12,21 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.graphics.Color -import org.wordpress.android.BuildConfig -private val localColors = staticCompositionLocalOf { extraPaletteJPLight } +private val localColors = + staticCompositionLocalOf { extraPaletteJPLight } + +/** + * Composition local for the Jetpack app flag. Defaults to false + * (WordPress). The app module should provide + * `BuildConfig.IS_JETPACK_APP` at the root of the composition. + */ +val LocalIsJetpackApp = staticCompositionLocalOf { false } @Composable fun AppThemeM3( isDarkTheme: Boolean = isSystemInDarkTheme(), - isJetpackApp: Boolean = BuildConfig.IS_JETPACK_APP, + isJetpackApp: Boolean = LocalIsJetpackApp.current, content: @Composable () -> Unit ) { AppThemeM3WithoutBackground(isDarkTheme, isJetpackApp) { @@ -30,7 +37,7 @@ fun AppThemeM3( @Composable fun AppThemeM3WithoutBackground( isDarkTheme: Boolean = isSystemInDarkTheme(), - isJetpackApp: Boolean = BuildConfig.IS_JETPACK_APP, + isJetpackApp: Boolean = LocalIsJetpackApp.current, content: @Composable () -> Unit ) { val extraColors = getExtraColors( @@ -55,7 +62,7 @@ fun AppThemeM3WithoutBackground( @Composable fun AppThemeM3Editor( isDarkTheme: Boolean = isSystemInDarkTheme(), - isJetpackApp: Boolean = BuildConfig.IS_JETPACK_APP, + isJetpackApp: Boolean = LocalIsJetpackApp.current, content: @Composable () -> Unit ) { androidx.compose.material3.MaterialTheme( diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/theme/JetpackColors.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/JetpackColors.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/theme/JetpackColors.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/theme/JetpackColors.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/unit/FontSize.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/unit/FontSize.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/unit/FontSize.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/unit/FontSize.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/unit/Margin.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/unit/Margin.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/unit/Margin.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/unit/Margin.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt similarity index 90% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt index 5a065729e442..9cc612ba2ebe 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/ComposeUtils.kt @@ -1,7 +1,9 @@ package org.wordpress.android.ui.compose.utils import android.annotation.SuppressLint +import android.content.Context import android.content.res.Configuration +import android.view.View import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -9,10 +11,14 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.LayoutDirection -import org.wordpress.android.util.extensions.isRtl -import org.wordpress.android.util.extensions.primaryLocale import java.util.Locale +private val Context.primaryLocale: Locale + get() = resources.configuration.locales[0] + +private fun Configuration.isRtl(): Boolean = + layoutDirection == View.LAYOUT_DIRECTION_RTL + /** * Utility function that wraps the [content] inside a [CompositionLocalProvider] overriding the [LocalContext] * configuration with the specified [locale] when the specified language should apply. diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/utils/FadingEdgesModifier.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/FadingEdgesModifier.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/utils/FadingEdgesModifier.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/FadingEdgesModifier.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/utils/MarkdownUtils.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/MarkdownUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/utils/MarkdownUtils.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/MarkdownUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/utils/SpannedTextUtils.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/SpannedTextUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/utils/SpannedTextUtils.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/SpannedTextUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/compose/utils/UiStringText.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/UiStringText.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/compose/utils/UiStringText.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/compose/utils/UiStringText.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/AbstractAllowedUrlsWebViewNavigationDelegate.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/AbstractAllowedUrlsWebViewNavigationDelegate.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/AbstractAllowedUrlsWebViewNavigationDelegate.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/AbstractAllowedUrlsWebViewNavigationDelegate.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/ConcurrentContinuationWrapper.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/ConcurrentContinuationWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/ConcurrentContinuationWrapper.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/ConcurrentContinuationWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/ContinuationWrapper.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/ContinuationWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/ContinuationWrapper.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/ContinuationWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/HtmlMessageUtils.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/HtmlMessageUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/HtmlMessageUtils.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/HtmlMessageUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/ListItemInteraction.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/ListItemInteraction.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/ListItemInteraction.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/ListItemInteraction.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/PaddingBackgroundColorSpan.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/PaddingBackgroundColorSpan.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/PaddingBackgroundColorSpan.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/PaddingBackgroundColorSpan.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/RecyclerViewExtensions.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/RecyclerViewExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/RecyclerViewExtensions.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/RecyclerViewExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/UiDimen.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiDimen.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/UiDimen.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiDimen.kt diff --git a/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt index 587958f7feda..1af40b8df021 100644 --- a/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt +++ b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiHelpers.kt @@ -1,51 +1,44 @@ package org.wordpress.android.ui.utils -import android.app.Dialog import android.content.Context -import android.graphics.Point import android.view.View -import androidx.core.view.isVisible -import android.view.WindowManager.LayoutParams import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import org.wordpress.android.R import org.wordpress.android.ui.utils.UiDimen.UIDimenDPInt import org.wordpress.android.ui.utils.UiDimen.UIDimenRes import org.wordpress.android.ui.utils.UiString.UiStringPluralRes import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.ui.utils.UiString.UiStringResWithParams import org.wordpress.android.ui.utils.UiString.UiStringText -import org.wordpress.android.util.AniUtils -import org.wordpress.android.util.AniUtils.Duration import org.wordpress.android.util.DisplayUtils import org.wordpress.android.util.StringUtils import javax.inject.Inject -class UiHelpers @Inject constructor() { +open class UiHelpers @Inject constructor() { fun getPxOfUiDimen(context: Context, uiDimen: UiDimen): Int = when (uiDimen) { - is UIDimenRes -> context.resources.getDimensionPixelSize(uiDimen.dimenRes) - is UIDimenDPInt -> DisplayUtils.dpToPx(context, uiDimen.dimensionDP) + is UIDimenRes -> + context.resources.getDimensionPixelSize(uiDimen.dimenRes) + is UIDimenDPInt -> + DisplayUtils.dpToPx(context, uiDimen.dimensionDP) } - fun getTextOfUiString(context: Context, uiString: UiString): CharSequence = + fun getTextOfUiString( + context: Context, + uiString: UiString + ): CharSequence = when (uiString) { is UiStringRes -> context.getString(uiString.stringRes) is UiStringText -> uiString.text - is UiStringResWithParams -> context.getString( + is UiStringResWithParams -> @Suppress("SpreadOperator") + context.getString( uiString.stringRes, *uiString.params.map { value -> - getTextOfUiString( - context, - value - ) + getTextOfUiString(context, value) }.toTypedArray() ) - // Current localization process does not support resource strings, - // so we need to use multiple string resources. Switch to @PluralRes in UiStringPluralRes and - // use context.resources.getQuantityString here when is supported by localization process. is UiStringPluralRes -> StringUtils.getQuantityString( context, uiString.zeroRes, @@ -61,7 +54,9 @@ class UiHelpers @Inject constructor() { fun setTextOrHide(view: TextView?, uiString: UiString?) { view?.let { - val text = uiString?.let { getTextOfUiString(view.context, uiString) } + val text = uiString?.let { + getTextOfUiString(view.context, uiString) + } setTextOrHide(view, text) } } @@ -78,47 +73,13 @@ class UiHelpers @Inject constructor() { } } - fun setImageOrHide(imageView: ImageView, @DrawableRes resId: Int?) { + fun setImageOrHide( + imageView: ImageView, + @DrawableRes resId: Int? + ) { updateVisibility(imageView, resId != null) resId?.let { imageView.setImageResource(resId) } } - - /** - * Sets the [firstView] visible and the [secondView] invisible with a fade in/out animation and vice versa - * @param visible if true the [firstView] is shown and the [secondView] is hidden else the other way round - */ - fun fadeInfadeOutViews(firstView: View?, secondView: View?, visible: Boolean) { - if (firstView == null || secondView == null || visible == firstView.isVisible) return - if (visible) { - AniUtils.fadeIn(firstView, Duration.SHORT) - AniUtils.fadeOut(secondView, Duration.SHORT, View.INVISIBLE) - } else { - AniUtils.fadeIn(secondView, Duration.SHORT) - AniUtils.fadeOut(firstView, Duration.SHORT, View.INVISIBLE) - } - } - - companion object { - @Suppress("DEPRECATION") - fun adjustDialogSize(dialog: Dialog) { - val window = requireNotNull(dialog.window) - val size = Point() - - val display = window.windowManager.defaultDisplay - display.getSize(size) - - val width = size.x - - val maximumWidth = window.context.resources.getDimension(R.dimen.alert_dialog_max_width).toInt() - var proposedWidth = (width * 0.8).toInt() - - if (proposedWidth > maximumWidth) { - proposedWidth = maximumWidth - } - - window.setLayout(proposedWidth, LayoutParams.WRAP_CONTENT) - } - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/utils/UiString.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiString.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/utils/UiString.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/utils/UiString.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/ContextProvider.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ContextProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/ContextProvider.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ContextProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/Event.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/Event.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/Event.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/Event.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/ReactiveMutableLiveData.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ReactiveMutableLiveData.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/ReactiveMutableLiveData.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ReactiveMutableLiveData.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/ResourceProvider.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ResourceProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/ResourceProvider.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ResourceProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/ScopedViewModel.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ScopedViewModel.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/ScopedViewModel.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ScopedViewModel.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/SingleEventObservable.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/SingleEventObservable.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/SingleEventObservable.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/SingleEventObservable.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/SingleLiveEvent.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/SingleLiveEvent.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/SingleLiveEvent.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/SingleLiveEvent.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/SingleMediatorLiveEvent.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/SingleMediatorLiveEvent.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/SingleMediatorLiveEvent.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/SingleMediatorLiveEvent.kt diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/ViewModelFactory.java b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ViewModelFactory.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/ViewModelFactory.java rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ViewModelFactory.java diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/ViewModelKey.java b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ViewModelKey.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/ViewModelKey.java rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/ViewModelKey.java diff --git a/WordPress/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt b/libs/core-ui/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt rename to libs/core-ui/src/main/java/org/wordpress/android/viewmodel/uistate/ProgressBarUiState.kt diff --git a/libs/core-ui/src/main/res/drawable/ic_pages_white_24dp.xml b/libs/core-ui/src/main/res/drawable/ic_pages_white_24dp.xml new file mode 100644 index 000000000000..c79d049ea640 --- /dev/null +++ b/libs/core-ui/src/main/res/drawable/ic_pages_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/libs/core-ui/src/main/res/drawable/img_illustration_empty_results_216dp.xml b/libs/core-ui/src/main/res/drawable/img_illustration_empty_results_216dp.xml new file mode 100644 index 000000000000..65eb7879ffaa --- /dev/null +++ b/libs/core-ui/src/main/res/drawable/img_illustration_empty_results_216dp.xml @@ -0,0 +1,357 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libs/core-ui/src/main/res/values/colors.xml b/libs/core-ui/src/main/res/values/colors.xml new file mode 100644 index 000000000000..c70a204748f9 --- /dev/null +++ b/libs/core-ui/src/main/res/values/colors.xml @@ -0,0 +1,12 @@ + + + #1A000000 + #c3c4c7 + #646970 + #005b18 + #bbe0fa + #91caf2 + #68b3e8 + #399ce3 + #0675c4 + diff --git a/libs/core-ui/src/main/res/values/dimens.xml b/libs/core-ui/src/main/res/values/dimens.xml new file mode 100644 index 000000000000..b10989c645da --- /dev/null +++ b/libs/core-ui/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 20dp + diff --git a/libs/core-ui/src/main/res/values/strings.xml b/libs/core-ui/src/main/res/values/strings.xml new file mode 100644 index 000000000000..f523135f7fbe --- /dev/null +++ b/libs/core-ui/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + + Close + navigate up + close + Cancel + Uploading… + diff --git a/settings.gradle b/settings.gradle index 72aa1c28526f..870021754113 100644 --- a/settings.gradle +++ b/settings.gradle @@ -105,6 +105,7 @@ include ':libs:mocks' include ':libs:fluxc', ':libs:fluxc-annotations', ':libs:fluxc-processor' include ':libs:posttypes' +include ':libs:core-ui' apply from: './config/gradle/included_builds.gradle' apply from: './config/gradle/gradle_build_scan.gradle' From cc084fceee82985ec9ca9b7775956651afe5211b Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:48:27 -0600 Subject: [PATCH 03/26] Move canonical string ownership to `:libs:core-ui` Make core-ui the single source of truth for shared UI strings (close, cancel, uploading, navigate_up_desc, close_desc). Move all existing translations (54 locales) from :WordPress to core-ui and remove the duplicates from the app module. Register core-ui in the fastlane localization pipeline so GlotPress translations flow directly to the library module. Co-Authored-By: Claude Opus 4.6 --- WordPress/src/main/res/values-ar/strings.xml | 5 ----- WordPress/src/main/res/values-az/strings.xml | 1 - WordPress/src/main/res/values-bg/strings.xml | 2 -- WordPress/src/main/res/values-cs/strings.xml | 4 ---- WordPress/src/main/res/values-cy/strings.xml | 2 -- WordPress/src/main/res/values-da/strings.xml | 2 -- WordPress/src/main/res/values-de/strings.xml | 5 ----- WordPress/src/main/res/values-el/strings.xml | 2 -- WordPress/src/main/res/values-en-rAU/strings.xml | 3 --- WordPress/src/main/res/values-en-rCA/strings.xml | 5 ----- WordPress/src/main/res/values-en-rGB/strings.xml | 5 ----- WordPress/src/main/res/values-es-rCL/strings.xml | 5 ----- WordPress/src/main/res/values-es-rCO/strings.xml | 5 ----- WordPress/src/main/res/values-es-rMX/strings.xml | 4 ---- WordPress/src/main/res/values-es-rVE/strings.xml | 3 --- WordPress/src/main/res/values-es/strings.xml | 5 ----- WordPress/src/main/res/values-eu/strings.xml | 2 -- WordPress/src/main/res/values-fr-rCA/strings.xml | 5 ----- WordPress/src/main/res/values-fr/strings.xml | 5 ----- WordPress/src/main/res/values-gd/strings.xml | 2 -- WordPress/src/main/res/values-gl/strings.xml | 5 ----- WordPress/src/main/res/values-he/strings.xml | 5 ----- WordPress/src/main/res/values-hi/strings.xml | 2 -- WordPress/src/main/res/values-hr/strings.xml | 3 --- WordPress/src/main/res/values-hu/strings.xml | 2 -- WordPress/src/main/res/values-id/strings.xml | 5 ----- WordPress/src/main/res/values-is/strings.xml | 2 -- WordPress/src/main/res/values-it/strings.xml | 5 ----- WordPress/src/main/res/values-ja/strings.xml | 5 ----- WordPress/src/main/res/values-kmr/strings.xml | 3 --- WordPress/src/main/res/values-ko/strings.xml | 5 ----- WordPress/src/main/res/values-lv/strings.xml | 5 ----- WordPress/src/main/res/values-mk/strings.xml | 1 - WordPress/src/main/res/values-ms/strings.xml | 2 -- WordPress/src/main/res/values-nb/strings.xml | 3 --- WordPress/src/main/res/values-nl/strings.xml | 5 ----- WordPress/src/main/res/values-pl/strings.xml | 5 ----- WordPress/src/main/res/values-pt-rBR/strings.xml | 5 ----- WordPress/src/main/res/values-ro/strings.xml | 5 ----- WordPress/src/main/res/values-ru/strings.xml | 5 ----- WordPress/src/main/res/values-sk/strings.xml | 3 --- WordPress/src/main/res/values-sq/strings.xml | 5 ----- WordPress/src/main/res/values-sr/strings.xml | 2 -- WordPress/src/main/res/values-sv/strings.xml | 5 ----- WordPress/src/main/res/values-th/strings.xml | 2 -- WordPress/src/main/res/values-tr/strings.xml | 5 ----- WordPress/src/main/res/values-uz/strings.xml | 2 -- WordPress/src/main/res/values-vi/strings.xml | 3 --- WordPress/src/main/res/values-zh-rCN/strings.xml | 5 ----- WordPress/src/main/res/values-zh-rHK/strings.xml | 5 ----- WordPress/src/main/res/values-zh-rTW/strings.xml | 5 ----- WordPress/src/main/res/values/strings.xml | 5 ----- fastlane/lanes/localization.rb | 3 ++- libs/core-ui/src/main/res/values-ar/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-az/strings.xml | 4 ++++ libs/core-ui/src/main/res/values-bg/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-cs/strings.xml | 7 +++++++ libs/core-ui/src/main/res/values-cy/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-da/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-de/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-el/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-en-rAU/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-en-rCA/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-en-rGB/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-es-rCL/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-es-rCO/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-es-rMX/strings.xml | 7 +++++++ libs/core-ui/src/main/res/values-es-rVE/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-es/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-eu/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-fr-rCA/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-fr/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-gd/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-gl/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-he/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-hi/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-hr/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-hu/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-id/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-in/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-is/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-it/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-iw/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-ja/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-kmr/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-ko/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-lv/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-mk/strings.xml | 4 ++++ libs/core-ui/src/main/res/values-ms/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-nb/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-nl/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-pl/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-pt-rBR/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-ro/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-ru/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-sk/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-sq/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-sr/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-sv/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-th/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-tr/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-uz/strings.xml | 5 +++++ libs/core-ui/src/main/res/values-vi/strings.xml | 6 ++++++ libs/core-ui/src/main/res/values-zh-rCN/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-zh-rHK/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-zh-rTW/strings.xml | 8 ++++++++ libs/core-ui/src/main/res/values-zh/strings.xml | 8 ++++++++ 107 files changed, 371 insertions(+), 198 deletions(-) create mode 100644 libs/core-ui/src/main/res/values-ar/strings.xml create mode 100644 libs/core-ui/src/main/res/values-az/strings.xml create mode 100644 libs/core-ui/src/main/res/values-bg/strings.xml create mode 100644 libs/core-ui/src/main/res/values-cs/strings.xml create mode 100644 libs/core-ui/src/main/res/values-cy/strings.xml create mode 100644 libs/core-ui/src/main/res/values-da/strings.xml create mode 100644 libs/core-ui/src/main/res/values-de/strings.xml create mode 100644 libs/core-ui/src/main/res/values-el/strings.xml create mode 100644 libs/core-ui/src/main/res/values-en-rAU/strings.xml create mode 100644 libs/core-ui/src/main/res/values-en-rCA/strings.xml create mode 100644 libs/core-ui/src/main/res/values-en-rGB/strings.xml create mode 100644 libs/core-ui/src/main/res/values-es-rCL/strings.xml create mode 100644 libs/core-ui/src/main/res/values-es-rCO/strings.xml create mode 100644 libs/core-ui/src/main/res/values-es-rMX/strings.xml create mode 100644 libs/core-ui/src/main/res/values-es-rVE/strings.xml create mode 100644 libs/core-ui/src/main/res/values-es/strings.xml create mode 100644 libs/core-ui/src/main/res/values-eu/strings.xml create mode 100644 libs/core-ui/src/main/res/values-fr-rCA/strings.xml create mode 100644 libs/core-ui/src/main/res/values-fr/strings.xml create mode 100644 libs/core-ui/src/main/res/values-gd/strings.xml create mode 100644 libs/core-ui/src/main/res/values-gl/strings.xml create mode 100644 libs/core-ui/src/main/res/values-he/strings.xml create mode 100644 libs/core-ui/src/main/res/values-hi/strings.xml create mode 100644 libs/core-ui/src/main/res/values-hr/strings.xml create mode 100644 libs/core-ui/src/main/res/values-hu/strings.xml create mode 100644 libs/core-ui/src/main/res/values-id/strings.xml create mode 100644 libs/core-ui/src/main/res/values-in/strings.xml create mode 100644 libs/core-ui/src/main/res/values-is/strings.xml create mode 100644 libs/core-ui/src/main/res/values-it/strings.xml create mode 100644 libs/core-ui/src/main/res/values-iw/strings.xml create mode 100644 libs/core-ui/src/main/res/values-ja/strings.xml create mode 100644 libs/core-ui/src/main/res/values-kmr/strings.xml create mode 100644 libs/core-ui/src/main/res/values-ko/strings.xml create mode 100644 libs/core-ui/src/main/res/values-lv/strings.xml create mode 100644 libs/core-ui/src/main/res/values-mk/strings.xml create mode 100644 libs/core-ui/src/main/res/values-ms/strings.xml create mode 100644 libs/core-ui/src/main/res/values-nb/strings.xml create mode 100644 libs/core-ui/src/main/res/values-nl/strings.xml create mode 100644 libs/core-ui/src/main/res/values-pl/strings.xml create mode 100644 libs/core-ui/src/main/res/values-pt-rBR/strings.xml create mode 100644 libs/core-ui/src/main/res/values-ro/strings.xml create mode 100644 libs/core-ui/src/main/res/values-ru/strings.xml create mode 100644 libs/core-ui/src/main/res/values-sk/strings.xml create mode 100644 libs/core-ui/src/main/res/values-sq/strings.xml create mode 100644 libs/core-ui/src/main/res/values-sr/strings.xml create mode 100644 libs/core-ui/src/main/res/values-sv/strings.xml create mode 100644 libs/core-ui/src/main/res/values-th/strings.xml create mode 100644 libs/core-ui/src/main/res/values-tr/strings.xml create mode 100644 libs/core-ui/src/main/res/values-uz/strings.xml create mode 100644 libs/core-ui/src/main/res/values-vi/strings.xml create mode 100644 libs/core-ui/src/main/res/values-zh-rCN/strings.xml create mode 100644 libs/core-ui/src/main/res/values-zh-rHK/strings.xml create mode 100644 libs/core-ui/src/main/res/values-zh-rTW/strings.xml create mode 100644 libs/core-ui/src/main/res/values-zh/strings.xml diff --git a/WordPress/src/main/res/values-ar/strings.xml b/WordPress/src/main/res/values-ar/strings.xml index 0e9f5f693808..a7f3f027a6b5 100644 --- a/WordPress/src/main/res/values-ar/strings.xml +++ b/WordPress/src/main/res/values-ar/strings.xml @@ -240,7 +240,6 @@ Language: ar ملاحظاتك محل تقدير! ملاحظات إرسال - إغلاق إرسال لا تتوفر تدوينة من ملف صوتي في الوقت الحالي، يرجى المحاولة مجددًا في وقت لاحق. تم @@ -780,7 +779,6 @@ Language: ar 0 من الإجابات ✓ تم الرد المطالبات - إغلاق هل تريد حذف تصنيف \"%s\" بشكل دائم؟ نجح حذف التصنيف فشل حذف التصنيف @@ -2257,7 +2255,6 @@ Language: ar %1$s من غير المحدود إضافة %d إنشاء وسم - الانتقال إلى أعلى الإشعارات فتح الرابط الخارجي إظهار المزيد @@ -3340,7 +3337,6 @@ Language: ar تم موافق الرابط URL - جاري الرفع… المحاذاة تجديد بدون عنوان @@ -3372,7 +3368,6 @@ Language: ar مسح أضف حفظ - إلغاء مرة واحدة مرتان diff --git a/WordPress/src/main/res/values-az/strings.xml b/WordPress/src/main/res/values-az/strings.xml index 4cee6c862807..0bf03c3dbe97 100644 --- a/WordPress/src/main/res/values-az/strings.xml +++ b/WordPress/src/main/res/values-az/strings.xml @@ -238,7 +238,6 @@ Language: az Bəli Cavabla Xəta - İmtina Qeyd et Əlavə et Önizləmə diff --git a/WordPress/src/main/res/values-bg/strings.xml b/WordPress/src/main/res/values-bg/strings.xml index 33935e9a5e5d..ecae3d013c61 100644 --- a/WordPress/src/main/res/values-bg/strings.xml +++ b/WordPress/src/main/res/values-bg/strings.xml @@ -947,7 +947,6 @@ Language: bg ОК готово URL - Качва се… Подравняване Презареждане Неозаглавен @@ -966,7 +965,6 @@ Language: bg Няма Не Грешка - Отказ Изчистване Да на diff --git a/WordPress/src/main/res/values-cs/strings.xml b/WordPress/src/main/res/values-cs/strings.xml index 6f1508e1f87c..45b387aba599 100644 --- a/WordPress/src/main/res/values-cs/strings.xml +++ b/WordPress/src/main/res/values-cs/strings.xml @@ -148,7 +148,6 @@ Language: cs_CZ 0 odpovědí ✓ Odpovězeno Výzvy - zavřít Trvale smazat rubriku \'%s\'? Rubrika byla úspěšně odstraněna Mazání rubriky se nepodařilo. @@ -1617,7 +1616,6 @@ Language: cs_CZ přehrát náhled obrázku náhled - přejít nahoru Upozornění ukázat více audio @@ -2676,7 +2674,6 @@ Language: cs_CZ OK hotovo URL - Nahrávám… Zarovnání Obnovit Bez názvu @@ -2699,7 +2696,6 @@ Language: cs_CZ Odpovědět Náhled na - Zrušit Uložit Přidat Vymazat diff --git a/WordPress/src/main/res/values-cy/strings.xml b/WordPress/src/main/res/values-cy/strings.xml index f806d127d1ce..dd6323f8eb6b 100644 --- a/WordPress/src/main/res/values-cy/strings.xml +++ b/WordPress/src/main/res/values-cy/strings.xml @@ -532,7 +532,6 @@ Language: cy_GB Di-enw Iawn URL - Llwytho… Alinio Adnewyddu Dideitl @@ -549,7 +548,6 @@ Language: cy_GB Cymeradwyo Dim Gwall - Diddymu Cadw Ychwanegu Gwall adnewyddu categori diff --git a/WordPress/src/main/res/values-da/strings.xml b/WordPress/src/main/res/values-da/strings.xml index d9195541de38..a69f0155428f 100644 --- a/WordPress/src/main/res/values-da/strings.xml +++ b/WordPress/src/main/res/values-da/strings.xml @@ -274,7 +274,6 @@ Language: da_DK Inkluder billede i indhold OK URL - Uploader Justering Genindlæs Ikke-navngivet @@ -298,7 +297,6 @@ Language: da_DK Gem Tilføj Ryd - Annuller Kategori opdateringsfejl Ja Nej diff --git a/WordPress/src/main/res/values-de/strings.xml b/WordPress/src/main/res/values-de/strings.xml index 04d7eb055958..17d7742d5288 100644 --- a/WordPress/src/main/res/values-de/strings.xml +++ b/WordPress/src/main/res/values-de/strings.xml @@ -264,7 +264,6 @@ Language: de Wir wissen dein Feedback zu schätzen! Feedback Absenden - Schließen Wird gesendet Es ist derzeit nicht möglich, Beiträge aus Audio zu erstellen. Bitte versuche es später noch einmal. Fertig @@ -804,7 +803,6 @@ Language: de 0 Antworten ✓ Geantwortet Schreibanregungen - Tag schließen Kategorie „%s“ dauerhaft löschen? Kategorie erfolgreich gelöscht Löschen der Kategorie fehlgeschlagen @@ -2281,7 +2279,6 @@ Language: de %1$s von unbegrenzt %d hinzufügen Schlagwort erstellen - nach oben Benachrichtigungen Externen Link öffnen weitere anzeigen @@ -3365,7 +3362,6 @@ Language: de erledigt OK URL - Lädt hoch… Ausrichtung Aktualisieren Ohne Titel @@ -3397,7 +3393,6 @@ Language: de Leeren Hinzufügen Speichern - Abbrechen Einmalig Zweimal diff --git a/WordPress/src/main/res/values-el/strings.xml b/WordPress/src/main/res/values-el/strings.xml index 8f2d7217ba44..0ac6ade7140d 100644 --- a/WordPress/src/main/res/values-el/strings.xml +++ b/WordPress/src/main/res/values-el/strings.xml @@ -1101,7 +1101,6 @@ Language: el_GR ΟΚ Ολοκληρώθηκε URL - Γίνεται μεταφόρτωση Στοίχιση Ανανέωση Χωρίς τίτλο @@ -1126,7 +1125,6 @@ Language: el_GR Όχι Προεπισκόπηση Σφάλμα - Ακύρωση Αποθήκευση Πρόσθεση Σφάλμα ανανέωσης κατηγοριών diff --git a/WordPress/src/main/res/values-en-rAU/strings.xml b/WordPress/src/main/res/values-en-rAU/strings.xml index bce05cdf8590..5e2c06167743 100644 --- a/WordPress/src/main/res/values-en-rAU/strings.xml +++ b/WordPress/src/main/res/values-en-rAU/strings.xml @@ -529,7 +529,6 @@ Language: en_AU %1$s of unlimited %1$d of %2$d Create Tag - navigate up Notifications show more photo @@ -1571,7 +1570,6 @@ Language: en_AU Anonymous OK URL - Uploading… Alignment Refresh Untitled @@ -1590,7 +1588,6 @@ Language: en_AU Approve None Error - Cancel Save Add Category refresh error diff --git a/WordPress/src/main/res/values-en-rCA/strings.xml b/WordPress/src/main/res/values-en-rCA/strings.xml index b19900a739e4..6e116e3d478b 100644 --- a/WordPress/src/main/res/values-en-rCA/strings.xml +++ b/WordPress/src/main/res/values-en-rCA/strings.xml @@ -161,7 +161,6 @@ Language: en_CA Your feedback is appreciated! Feedback Submit - Close Sending Post from audio is unavailable at the moment, please try again later. Done @@ -701,7 +700,6 @@ Language: en_CA 0 answers ✓ Answered Prompts - close Permanently delete \'%s\' Category? Category deleted successfully Deleting category failed @@ -2176,7 +2174,6 @@ Language: en_CA %1$s of unlimited Add %d Create Tag - navigate up Notifications Open external link show more @@ -3258,7 +3255,6 @@ Language: en_CA done OK URL - Uploading… Alignment Refresh Untitled @@ -3290,7 +3286,6 @@ Language: en_CA Clear Add Save - Cancel Once Twice diff --git a/WordPress/src/main/res/values-en-rGB/strings.xml b/WordPress/src/main/res/values-en-rGB/strings.xml index dd94387be97c..3b1d42ffb3cd 100644 --- a/WordPress/src/main/res/values-en-rGB/strings.xml +++ b/WordPress/src/main/res/values-en-rGB/strings.xml @@ -181,7 +181,6 @@ Language: en_GB Your feedback is appreciated! Feedback Submit - Close Sending Post from audio is unavailable at the moment, please try again later. Done @@ -721,7 +720,6 @@ Language: en_GB 0 answers ✓ Answered Prompts - close Permanently delete \'%s\' Category? Category deleted successfully Deleting category failed @@ -2198,7 +2196,6 @@ Language: en_GB %1$s of unlimited Add %d Create Tag - navigate up Notifications Open external link show more @@ -3282,7 +3279,6 @@ Language: en_GB done OK URL - Uploading… Alignment Refresh Untitled @@ -3314,7 +3310,6 @@ Language: en_GB Clear Add Save - Cancel Once Twice diff --git a/WordPress/src/main/res/values-es-rCL/strings.xml b/WordPress/src/main/res/values-es-rCL/strings.xml index e074a3167980..5d3e275183fd 100644 --- a/WordPress/src/main/res/values-es-rCL/strings.xml +++ b/WordPress/src/main/res/values-es-rCL/strings.xml @@ -53,7 +53,6 @@ Language: es_CL ¡Agradecemos tus comentarios! Comentarios Enviar - Cerrar Enviando La entrada de audio no está disponible en este momento. Inténtalo más tarde. Hecho @@ -593,7 +592,6 @@ Language: es_CL 0 respuestas ✓ Respondido Peticiones - cerrar ¿Borrar permanentemente la categoría \'%s\'? Categoría borrada correctamente Borrando la categoría que ha fallado @@ -2070,7 +2068,6 @@ Language: es_CL %1$s de ilimitado Agregar %d Crear Etiqueta - navegar hacia arriba Notificaciones Abrir enlace externo ver más @@ -3154,7 +3151,6 @@ Language: es_CL hecho OK URL - Subiendo… Alineamiento Refrescar Sin Título @@ -3185,7 +3181,6 @@ Language: es_CL Ajustes de avisos Añadir Guardar - Cancelar Una vez Dos veces diff --git a/WordPress/src/main/res/values-es-rCO/strings.xml b/WordPress/src/main/res/values-es-rCO/strings.xml index 3405271011b1..2447694ffcf5 100644 --- a/WordPress/src/main/res/values-es-rCO/strings.xml +++ b/WordPress/src/main/res/values-es-rCO/strings.xml @@ -180,7 +180,6 @@ Language: es_CO ¡Agradecemos tus comentarios! Comentarios Enviar - Cerrar Enviando Enviar comentarios La entrada de audio no está disponible en este momento. Inténtalo más tarde. @@ -721,7 +720,6 @@ Language: es_CO 0 respuestas ✓ Respondido Peticiones - cerrar ¿Borrar permanentemente la categoría \'%s\'? Categoría borrada correctamente Borrando la categoría que ha fallado @@ -2198,7 +2196,6 @@ Language: es_CO Añadir %d Búsqueda en la biblioteca de fotos gratuitas Crear etiqueta - navegar hacia arriba Avisos Abrir enlace externo mostrar más @@ -3282,7 +3279,6 @@ Language: es_CO OK hecho URL - Subiendo… Alineación Refrescar Sin Título @@ -3303,7 +3299,6 @@ Language: es_CO Ninguno Actualizando la categoría que falló Error - Cancelar No Guardar Vista previa diff --git a/WordPress/src/main/res/values-es-rMX/strings.xml b/WordPress/src/main/res/values-es-rMX/strings.xml index b82964bd10df..335d94f7e8a5 100644 --- a/WordPress/src/main/res/values-es-rMX/strings.xml +++ b/WordPress/src/main/res/values-es-rMX/strings.xml @@ -9,7 +9,6 @@ Language: es_MX Añadir adjuntos Adjunto ya añadido Retroalimentación - Cerrar Enviar Enviando Hecho @@ -894,7 +893,6 @@ Language: es_MX %1$s de ilimitado Añadir %d Crear etiqueta - navegar hacia arriba Notificaciones mostrar más foto @@ -1949,7 +1947,6 @@ Language: es_MX OK hecho URL - Subiendo… Alineamiento Refrescar Sin Título @@ -1968,7 +1965,6 @@ Language: es_MX Eliminar Ninguno Añadir - Cancelar Error de actualización de categorías Error No diff --git a/WordPress/src/main/res/values-es-rVE/strings.xml b/WordPress/src/main/res/values-es-rVE/strings.xml index 8bdbf784461a..8746f30bcd46 100644 --- a/WordPress/src/main/res/values-es-rVE/strings.xml +++ b/WordPress/src/main/res/values-es-rVE/strings.xml @@ -1388,7 +1388,6 @@ Language: es_VE %1$s de ilimitado Añadir %d Crear etiqueta - navegar hacia arriba Avisos Abrir enlace externo mostrar más @@ -2451,7 +2450,6 @@ Language: es_VE hecho OK URL - Subiendo… Alineación Refrescar Sin Título @@ -2480,7 +2478,6 @@ Language: es_VE Ajustes de avisos Añadir Guardar - Cancelar Una vez Dos veces diff --git a/WordPress/src/main/res/values-es/strings.xml b/WordPress/src/main/res/values-es/strings.xml index 9f70b7888c44..09526ab30cd6 100644 --- a/WordPress/src/main/res/values-es/strings.xml +++ b/WordPress/src/main/res/values-es/strings.xml @@ -264,7 +264,6 @@ Language: es ¡Agradecemos tus comentarios! Comentarios Enviar - Cerrar Enviando La entrada de audio no está disponible en este momento. Inténtalo más tarde. Hecho @@ -804,7 +803,6 @@ Language: es 0 respuestas ✓ Respondido Peticiones - cerrar ¿Borrar permanentemente la categoría \'%s\'? Categoría borrada correctamente Borrando la categoría que ha fallado @@ -2281,7 +2279,6 @@ Language: es %1$s de ilimitado Añadir %d Crear etiqueta - navegar hacia arriba Avisos Abrir enlace externo mostrar más @@ -3365,7 +3362,6 @@ Language: es hecho OK URL - Subiendo… Alineación Refrescar Sin Título @@ -3397,7 +3393,6 @@ Language: es Borrar Añadir Guardar - Cancelar Una vez Dos veces diff --git a/WordPress/src/main/res/values-eu/strings.xml b/WordPress/src/main/res/values-eu/strings.xml index b4c33cc9c547..90462d940376 100644 --- a/WordPress/src/main/res/values-eu/strings.xml +++ b/WordPress/src/main/res/values-eu/strings.xml @@ -526,7 +526,6 @@ Language: eu_ES Ados egina URL - Igotzen… Lerrokatzea Freskatu Izenbururik gabe @@ -545,7 +544,6 @@ Language: eu_ES Onartu Bat ere ez Errorea - Ezeztatu Gorde Gehitu Garbitu diff --git a/WordPress/src/main/res/values-fr-rCA/strings.xml b/WordPress/src/main/res/values-fr-rCA/strings.xml index 84eb00402287..66535b7fe4cb 100644 --- a/WordPress/src/main/res/values-fr-rCA/strings.xml +++ b/WordPress/src/main/res/values-fr-rCA/strings.xml @@ -241,7 +241,6 @@ Language: fr Vos commentaires sont appréciés ! Commentaires Envoyer - Fermer Envoi en cours La fonctionnalité Publier à partir d’un contenu audio n’est pas disponible pour le moment, veuillez réessayer plus tard. Terminé @@ -778,7 +777,6 @@ Language: fr 0 réponse ✓ Vous avez répondu Incitations - fermer Supprimer définitivement la catégorie « %s » ? Suppression de la catégorie réussie Échec de la suppression de la catégorie @@ -2255,7 +2253,6 @@ Language: fr %1$s (illimité) Ajouter %d Créer une étiquette - faire défiler vers le haut Notifications Ouvrir le lien externe voir plus @@ -3339,7 +3336,6 @@ Language: fr Terminé OK URL - Téléversement… Alignement Actualiser Sans titre @@ -3371,7 +3367,6 @@ Language: fr Effacer Ajouter Enregistrer - Annuler Une fois Deux fois diff --git a/WordPress/src/main/res/values-fr/strings.xml b/WordPress/src/main/res/values-fr/strings.xml index 84eb00402287..66535b7fe4cb 100644 --- a/WordPress/src/main/res/values-fr/strings.xml +++ b/WordPress/src/main/res/values-fr/strings.xml @@ -241,7 +241,6 @@ Language: fr Vos commentaires sont appréciés ! Commentaires Envoyer - Fermer Envoi en cours La fonctionnalité Publier à partir d’un contenu audio n’est pas disponible pour le moment, veuillez réessayer plus tard. Terminé @@ -778,7 +777,6 @@ Language: fr 0 réponse ✓ Vous avez répondu Incitations - fermer Supprimer définitivement la catégorie « %s » ? Suppression de la catégorie réussie Échec de la suppression de la catégorie @@ -2255,7 +2253,6 @@ Language: fr %1$s (illimité) Ajouter %d Créer une étiquette - faire défiler vers le haut Notifications Ouvrir le lien externe voir plus @@ -3339,7 +3336,6 @@ Language: fr Terminé OK URL - Téléversement… Alignement Actualiser Sans titre @@ -3371,7 +3367,6 @@ Language: fr Effacer Ajouter Enregistrer - Annuler Une fois Deux fois diff --git a/WordPress/src/main/res/values-gd/strings.xml b/WordPress/src/main/res/values-gd/strings.xml index 11c949742cb6..c9c872d97b41 100644 --- a/WordPress/src/main/res/values-gd/strings.xml +++ b/WordPress/src/main/res/values-gd/strings.xml @@ -220,7 +220,6 @@ Language: gd_GB Gun urra Ceart ma-thà URL - ’Ga luchdadh suas… Co-thaobhadh Ath-nuadhaich Gun tiotal @@ -237,7 +236,6 @@ Language: gd_GB Thoir aonta ris Chan eil gin Mearachd - Sguir dheth Sàbhail Cuir ris Falamhaich diff --git a/WordPress/src/main/res/values-gl/strings.xml b/WordPress/src/main/res/values-gl/strings.xml index ee08db423845..bc8561ec8131 100644 --- a/WordPress/src/main/res/values-gl/strings.xml +++ b/WordPress/src/main/res/values-gl/strings.xml @@ -189,7 +189,6 @@ Language: gl_ES Agradecemos os teus comentarios! Comentarios Enviar - Cerrar Enviando A publicación do audio non está dispoñible neste momento. Téntao de novo máis tarde. Feito @@ -729,7 +728,6 @@ Language: gl_ES 0 respostas ✓ Respondido Peticións - pechar Borrar permanentemente a categoría «%s»? Categoría borrada correctamente Borrando a categoría que fallou @@ -2206,7 +2204,6 @@ Language: gl_ES %1$s de ilimitado Engadir %d Crear etiqueta - navegar cara arriba Notificacións Abrir enlace externo amosar máis @@ -3290,7 +3287,6 @@ Language: gl_ES feito Vale URL - Cargando… Aliñación Actualizar Sen título @@ -3322,7 +3318,6 @@ Language: gl_ES Borrar Engadir Gardar - Cancelar Unha vez Dúas veces diff --git a/WordPress/src/main/res/values-he/strings.xml b/WordPress/src/main/res/values-he/strings.xml index 9307f271c417..e9b18cd69947 100644 --- a/WordPress/src/main/res/values-he/strings.xml +++ b/WordPress/src/main/res/values-he/strings.xml @@ -261,7 +261,6 @@ Language: he_IL אנחנו מעריכים את המשוב ששלחת! משוב לשלוח - לסגור שולח האפשרות לפרסם פוסטים מאודיו לא זמינה כעת. כדאי לנסות שוב מאוחר יותר. בוצע @@ -797,7 +796,6 @@ Language: he_IL אין תשובות ✓ תשובה התקבלה הצעות - לסגור למחוק לצמיתות את הקטגוריה \'%s\'? מחקת את הקטגוריה בהצלחה מחיקת הקטגוריה נכשלה @@ -2273,7 +2271,6 @@ Language: he_IL %1$s ללא הגבלה הוספה של %d יצירת תגית - ניווט למעלה הודעות פתיחת קישור חיצוני להציג עוד @@ -3356,7 +3353,6 @@ Language: he_IL בוצע אוקיי URL - מעלה… יישור רענון ללא כותרת @@ -3388,7 +3384,6 @@ Language: he_IL נקה הוסף שמור - בטל פעם אחת פעמיים diff --git a/WordPress/src/main/res/values-hi/strings.xml b/WordPress/src/main/res/values-hi/strings.xml index de15beb31597..1331f0629913 100644 --- a/WordPress/src/main/res/values-hi/strings.xml +++ b/WordPress/src/main/res/values-hi/strings.xml @@ -346,7 +346,6 @@ Language: hi_IN पोस्ट सामग्री में छवि को शामिल करे ओके यूआरएल - अपलोड किया जा रहा संरेखण रिफ्रेश बिना शीर्षक का @@ -364,7 +363,6 @@ Language: hi_IN हटाये कुछ भी नहीं जोड़े - रद्द करें त्रुटि नहीं ऑन diff --git a/WordPress/src/main/res/values-hr/strings.xml b/WordPress/src/main/res/values-hr/strings.xml index 5c42036cced1..e676bfdd68b1 100644 --- a/WordPress/src/main/res/values-hr/strings.xml +++ b/WordPress/src/main/res/values-hr/strings.xml @@ -18,7 +18,6 @@ Language: hr Pošaljite povratne informacije Povratne informacije Pošalji - Zatvoriti Šaljem Završeno Snimanje @@ -605,7 +604,6 @@ Language: hr OK Gotovo URL - Prijenos… Poravnanje Osvježi Nenaslovljeno @@ -628,7 +626,6 @@ Language: hr Odgovori Da Ne - Odustani Obriši u Snimi diff --git a/WordPress/src/main/res/values-hu/strings.xml b/WordPress/src/main/res/values-hu/strings.xml index 9efe64b173e8..2d2fb2c9d3f6 100644 --- a/WordPress/src/main/res/values-hu/strings.xml +++ b/WordPress/src/main/res/values-hu/strings.xml @@ -101,7 +101,6 @@ Language: hu OK kész URL - Feltöltés… Kép igazítás Frissítés Cím nélküli @@ -118,7 +117,6 @@ Language: hu Elfogadás Egyik sem Hiba - Megszakítás Mentés Hozzáad Kiürítés diff --git a/WordPress/src/main/res/values-id/strings.xml b/WordPress/src/main/res/values-id/strings.xml index 040d80556725..3ae6f37bc6ad 100644 --- a/WordPress/src/main/res/values-id/strings.xml +++ b/WordPress/src/main/res/values-id/strings.xml @@ -260,7 +260,6 @@ Language: id Kami mengapresiasi feedback Anda. Masukan Kirim - Tutup Mengirim Pos dari audio tidak tersedia saat ini, coba lagi nanti. Selesai @@ -800,7 +799,6 @@ Language: id 0 jawaban ✓ Terjawab Prompt - tutup Hapus Kategori \'%s\' secara permanen? Kategori berhasil dihapus Gagal menghapus kategori @@ -2277,7 +2275,6 @@ Language: id %1$s dari tidak terbatas Tambahkan %d Buat Tag - arahkan ke atas Pemberitahuan Buka tautan eksternal tampilkan lebih banyak @@ -3360,7 +3357,6 @@ Language: id selesai OK URL - Mengunggah… Penjajaran Segarkan Tanpa judul @@ -3392,7 +3388,6 @@ Language: id Kosongkan Tambah Simpan - Batal Satu kali Dua kali diff --git a/WordPress/src/main/res/values-is/strings.xml b/WordPress/src/main/res/values-is/strings.xml index 9a5c1d2d252c..674c55c2e06d 100644 --- a/WordPress/src/main/res/values-is/strings.xml +++ b/WordPress/src/main/res/values-is/strings.xml @@ -560,7 +560,6 @@ Language: is Nota sem einkennismynd Í lagi Slóð - Hleð upp… Jöfnun Endurhlaða Án titils @@ -576,7 +575,6 @@ Language: is Eyða Samþykkja Ekkert - Hætta við Bæta við Villa við að endurfríska flokka Villa diff --git a/WordPress/src/main/res/values-it/strings.xml b/WordPress/src/main/res/values-it/strings.xml index 8c71858d0721..ab43fb098970 100644 --- a/WordPress/src/main/res/values-it/strings.xml +++ b/WordPress/src/main/res/values-it/strings.xml @@ -260,7 +260,6 @@ Language: it Elimina feedback? Il tuo feedback è apprezzato! Invia - Chiudi Invio in corso Articolo dall\'audio non è al momento disponibile, riprova più tardi. Fatto @@ -796,7 +795,6 @@ Language: it 0 risposte ✓ Risposta Richieste - chiudi Eliminare definitivamente la Categoria \'%s\'? Categoria eliminata correttamente Impossibile eliminare la categoria @@ -2272,7 +2270,6 @@ Language: it %1$s di illimitato Aggiungi %d Crea tag - naviga su Notifiche Apri link esterno mostra altro @@ -3352,7 +3349,6 @@ Language: it fatto OK URL - Caricamento… Allineamento Aggiorna Senza titolo @@ -3384,7 +3380,6 @@ Language: it Reimposta Aggiungi Salva - Annulla Una volta Due volte diff --git a/WordPress/src/main/res/values-ja/strings.xml b/WordPress/src/main/res/values-ja/strings.xml index ecdd2f2bc190..af7e93876372 100644 --- a/WordPress/src/main/res/values-ja/strings.xml +++ b/WordPress/src/main/res/values-ja/strings.xml @@ -239,7 +239,6 @@ Language: ja_JP 皆さまからのフィードバックをお待ちしております。 フィードバック 送信 - 閉じる 送信中 音声ファイルからの投稿は現在利用できません。後ほどもう一度お試しください。 完了 @@ -769,7 +768,6 @@ Language: ja_JP 0件の回答 ✓回答済み プロンプト - 「%s」カテゴリーを完全に削除しますか ? カテゴリーを削除しました カテゴリーの削除に失敗しました @@ -2244,7 +2242,6 @@ Language: ja_JP %1$s の間、無制限です %d を追加 タグの作成 - 上に移動 通知 外部リンクを開く さらに表示 @@ -3325,7 +3322,6 @@ Language: ja_JP 完了 OK URL - アップロード中… 配置 再読み込み 名称未設定 @@ -3357,7 +3353,6 @@ Language: ja_JP 追加 保存 - キャンセル 1回 2回 diff --git a/WordPress/src/main/res/values-kmr/strings.xml b/WordPress/src/main/res/values-kmr/strings.xml index 175485d7cbd3..6566648c155f 100644 --- a/WordPress/src/main/res/values-kmr/strings.xml +++ b/WordPress/src/main/res/values-kmr/strings.xml @@ -856,7 +856,6 @@ Language: ku_TR pêşdîtina wêneyê pêşdîtin vîdyoyê bilîzîne - here jorê Girêdana derveyî veke zêdetir nîşan bide ji cîhazê hilbijêre @@ -1880,7 +1879,6 @@ Language: ku_TR BAŞ e qediya URL - Tê Hilbarkirin… Bicîkirin Nû bike Bêsernav @@ -1908,7 +1906,6 @@ Language: ku_TR Aniha Biweşîne Çewtiya nûkirina kategoriyê Tomar bike - Betal bike Tevlî bike Carekê diff --git a/WordPress/src/main/res/values-ko/strings.xml b/WordPress/src/main/res/values-ko/strings.xml index 58f9a91acdbf..7c0347d61e65 100644 --- a/WordPress/src/main/res/values-ko/strings.xml +++ b/WordPress/src/main/res/values-ko/strings.xml @@ -264,7 +264,6 @@ Language: ko_KR 여러분의 피드백을 기다립니다! 피드백 전송 - 닫기 전송중 현재 오디오에서 글을 작성할 수 없습니다. 나중에 다시 시도해 주세요. 완료 @@ -804,7 +803,6 @@ Language: ko_KR 답변 0개 ✓ 답변됨 프롬프트 - 닫기 \'%s\'을(를) 영구적으로 삭제하시겠어요? 카테고리 삭제 성공 카테고리 삭제 실패 @@ -2281,7 +2279,6 @@ Language: ko_KR %1$s 무제한 %d 추가 태그 작성 - 위로 탐색 알림 외부 링크 열기 더 보기 @@ -3365,7 +3362,6 @@ Language: ko_KR 완료 확인 URL - 업로드 중… 배치 다시 로드 제목 미설정 @@ -3397,7 +3393,6 @@ Language: ko_KR 삭제 추가 저장 - 취소 한 번 두 번 diff --git a/WordPress/src/main/res/values-lv/strings.xml b/WordPress/src/main/res/values-lv/strings.xml index 4f4b96740ee0..ecbb05c071c1 100644 --- a/WordPress/src/main/res/values-lv/strings.xml +++ b/WordPress/src/main/res/values-lv/strings.xml @@ -76,7 +76,6 @@ Language: lv Jūsu atsauksmes ir novērtētas! Atsauksmes Iesniegt - Aizvērt Sūtīšana Ieraksts no audio pašlaik nav pieejams. Lūdzu, mēģiniet vēlreiz vēlāk. Pabeigts @@ -616,7 +615,6 @@ Language: lv 0 atbildes ✓ Atbildēts Uzvednes - aizvērt Vai neatgriezeniski dzēst kategoriju \"%s\"? Kategorija veiksmīgi izdzēsta Neizdevās dzēst kategoriju @@ -2091,7 +2089,6 @@ Language: lv %1$s no neierobežota Pievienot %d Izveidot birku - virzīties uz augšu Paziņojumi Atvērt ārējo saiti parādīt vairāk @@ -3173,7 +3170,6 @@ Language: lv Darīts Labi URL - Notiek augšupielāde… Līdzināšana Atjaunot Bez nosaukuma @@ -3204,7 +3200,6 @@ Language: lv Paziņojumu iestatījumi Pievienot Saglabāt - Atcelt Vienreiz Divas reizes diff --git a/WordPress/src/main/res/values-mk/strings.xml b/WordPress/src/main/res/values-mk/strings.xml index 60dfdf5ab92d..874dbfdb4426 100644 --- a/WordPress/src/main/res/values-mk/strings.xml +++ b/WordPress/src/main/res/values-mk/strings.xml @@ -187,7 +187,6 @@ Language: mk Одобри Нема Грешка - Откажи Зачувај Додај Исчисти diff --git a/WordPress/src/main/res/values-ms/strings.xml b/WordPress/src/main/res/values-ms/strings.xml index 637b2221ab31..8fb7ea37e6be 100644 --- a/WordPress/src/main/res/values-ms/strings.xml +++ b/WordPress/src/main/res/values-ms/strings.xml @@ -805,7 +805,6 @@ Language: ms Tak bernama OK URL - Memuat naik… Penjajaran Segar semula Tiada tajuk @@ -823,7 +822,6 @@ Language: ms Lulus Tiada Ralat - Batal Simpan Tambah Ralat segar semula kategori diff --git a/WordPress/src/main/res/values-nb/strings.xml b/WordPress/src/main/res/values-nb/strings.xml index c5ebdbb46973..47525cc7265c 100644 --- a/WordPress/src/main/res/values-nb/strings.xml +++ b/WordPress/src/main/res/values-nb/strings.xml @@ -969,7 +969,6 @@ Language: nb_NO Spill video spill fremhevet video vis mer - naviger opp logo for utvidelse toppbilde for utvidelse velg fra media i WordPress @@ -2004,7 +2003,6 @@ Language: nb_NO OK fullført URL - Laster opp … Justering Oppdater Uten tittel @@ -2026,7 +2024,6 @@ Language: nb_NO Svar Forhåndsvisning - Avbryt Lagre Legg til Tøm diff --git a/WordPress/src/main/res/values-nl/strings.xml b/WordPress/src/main/res/values-nl/strings.xml index 2b214cfd3e10..05b23a63b597 100644 --- a/WordPress/src/main/res/values-nl/strings.xml +++ b/WordPress/src/main/res/values-nl/strings.xml @@ -264,7 +264,6 @@ Language: nl Je feedback wordt zeer gewaardeerd! Feedback Indienen - Sluiten Aan het verzenden Bericht vanaf audio is momenteel niet beschikbaar, probeer het later opnieuw. Klaar @@ -804,7 +803,6 @@ Language: nl 0 antwoorden ✓ Beantwoord Prompts - sluiten Categorie \'%s\' permanent verwijderen? Categorie is verwijderd Verwijderen van categorie mislukt @@ -2281,7 +2279,6 @@ Language: nl %1$s van onbeperkt %d toevoegen Tag aanmaken - omhoog navigeren Meldingen Externe link openen meer tonen @@ -3365,7 +3362,6 @@ Language: nl klaar OK URL - Uploaden … Uitlijning Verversen Zonder titel @@ -3397,7 +3393,6 @@ Language: nl Maak leeg Toevoegen Opslaan - Annuleren Eenmaal Twee keer diff --git a/WordPress/src/main/res/values-pl/strings.xml b/WordPress/src/main/res/values-pl/strings.xml index e90c53771c1a..2dccc05c281f 100644 --- a/WordPress/src/main/res/values-pl/strings.xml +++ b/WordPress/src/main/res/values-pl/strings.xml @@ -181,7 +181,6 @@ Language: pl Twoja informacja zwrotna jest bardzo cenna! Uwagi Prześlij - Zamknij Wysyłanie Wpis z pliku dźwiękowego nie jest w tym momencie dostępny, spróbuj ponownie później. Gotowe @@ -721,7 +720,6 @@ Language: pl Brak odpowiedzi ✓ Odpowiedziano Monity - zamknij Trwale usunąć kategorię \'%s\'? Kategoria została pomyślnie usunięta Nie udało się usunąć kategorii @@ -2198,7 +2196,6 @@ Language: pl %1$s z bez limitu Dodaj %d Utwórz tag - nawiguj w górę Powiadomienia Otwórz zewnętrzny odnośnik pokaż więcej @@ -3282,7 +3279,6 @@ Language: pl gotowe OK Adres URL - Przesyłanie… Wyrównanie Odśwież Nienazwane @@ -3314,7 +3310,6 @@ Language: pl Wyczyść Dodaj Zapisz - Anuluj Jednorazowo Dwukrotnie diff --git a/WordPress/src/main/res/values-pt-rBR/strings.xml b/WordPress/src/main/res/values-pt-rBR/strings.xml index ebe1601a439d..a5e7a8747df0 100644 --- a/WordPress/src/main/res/values-pt-rBR/strings.xml +++ b/WordPress/src/main/res/values-pt-rBR/strings.xml @@ -264,7 +264,6 @@ Language: pt_BR Seu comentário ou sugestão é muito valioso! Sugestões e comentários Enviar - Fechar Enviando A postagem de áudio não está disponível no momento. Tente novamente mais tarde. Concluído @@ -804,7 +803,6 @@ Language: pt_BR 0 respostas ✓ Respondida Sugestões - fechar Excluir permanentemente a categoria \'%s\'? Categoria excluída com sucesso Falha ao excluir categoria @@ -2281,7 +2279,6 @@ Language: pt_BR %1$s de ilimitado Adicionar %d Criar tag - navegar acima Notificações Abrir link externo mostrar mais @@ -3365,7 +3362,6 @@ Language: pt_BR concluído OK URL - Enviando… Alinhamento Atualizar Sem Título @@ -3397,7 +3393,6 @@ Language: pt_BR Limpar Adicionar Salvar - Cancelar Uma vez Duas vezes diff --git a/WordPress/src/main/res/values-ro/strings.xml b/WordPress/src/main/res/values-ro/strings.xml index d3f6ecdbc66a..9b98fa2ea37b 100644 --- a/WordPress/src/main/res/values-ro/strings.xml +++ b/WordPress/src/main/res/values-ro/strings.xml @@ -264,7 +264,6 @@ Language: ro Impresiile tale sunt apreciate! Impresii Trimite - Închide Trimit Articol din fișier audio nu este disponibil momentan, te rog să reîncerci mai târziu. Gata @@ -804,7 +803,6 @@ Language: ro Niciun răspuns ✓ Am răspuns Îndemnuri - închide Ștergi definitiv categoria „%s”? Am șters cu succes categoria Ștergerea categoriei a eșuat @@ -2281,7 +2279,6 @@ Language: ro %1$s din nelimitat Adaugă %d Creează o etichetă - navighează în sus Notificări Deschide legătura externă arată mai mult @@ -3365,7 +3362,6 @@ Language: ro gata OK URL - Încărcare… Aliniere Reîmprospătează Fără titlu @@ -3397,7 +3393,6 @@ Language: ro Șterge Adaugă Salvare - Anulare O dată De două ori diff --git a/WordPress/src/main/res/values-ru/strings.xml b/WordPress/src/main/res/values-ru/strings.xml index 18d10ae33436..a0d0897b1192 100644 --- a/WordPress/src/main/res/values-ru/strings.xml +++ b/WordPress/src/main/res/values-ru/strings.xml @@ -264,7 +264,6 @@ Language: ru Мы будем очень признательны за ваш отзыв. Отзыв Отправить - Закрыть Отправка В данный момент нет возможности сделать публикацию из аудио, повторите попытку позднее. Готово @@ -804,7 +803,6 @@ Language: ru Нет ответов ✓ Ответ дан Подсказки - закрыть Навсегда удалить рубрику \'%s\'? Рубрика удалена Не удалось удалить рубрику @@ -2281,7 +2279,6 @@ Language: ru %1$s / неограничено Добавить %d Создать метку - перейти наверх Уведомления Открыть внешнюю ссылку показать больше @@ -3365,7 +3362,6 @@ Language: ru Готово OK URL - Загрузка Выравнивание Обновить Без заголовка @@ -3397,7 +3393,6 @@ Language: ru Очистить Добавить Сохранить - Отмена Однократно Дважды diff --git a/WordPress/src/main/res/values-sk/strings.xml b/WordPress/src/main/res/values-sk/strings.xml index 66fb4cfd43b9..da82983cc862 100644 --- a/WordPress/src/main/res/values-sk/strings.xml +++ b/WordPress/src/main/res/values-sk/strings.xml @@ -298,7 +298,6 @@ Language: sk otvoriť fotoaparát vybrať zo zariadenia Prebieha prihlasovanie cez Google… - navigovať hore prehrať odporúčané video banner pluginu vybrať z WordPress súborov @@ -1364,7 +1363,6 @@ Language: sk Použiť ilustračný obrázok OK URL adresa - Nahrávanie… Zarovnanie Obnoviť Bez názvu @@ -1387,7 +1385,6 @@ Language: sk Odpovedať Preview na - Zrušiť Uložiť Pridať Vymazať diff --git a/WordPress/src/main/res/values-sq/strings.xml b/WordPress/src/main/res/values-sq/strings.xml index d1744707b06c..256d57e92306 100644 --- a/WordPress/src/main/res/values-sq/strings.xml +++ b/WordPress/src/main/res/values-sq/strings.xml @@ -263,7 +263,6 @@ Language: sq_AL Përshtypjet tuaja çmohen! Përshtypje Parashtrojeni - Mbylle Po dërgohet Postimi që nga audio hëpërhë është i pamundur, ju lutemi, riprovoni më vonë. U bë @@ -802,7 +801,6 @@ Language: sq_AL 0 përgjigje ✓ Me Përgjigje Cytje - mbylle Të fshihet përgjithmonë Kategoria \'%s\'? Kategoria u fshi me sukses Fshirja e kategorisëdështoi @@ -2276,7 +2274,6 @@ Language: sq_AL %1$s e pakufizuar Shtoni %d Krijoje Etiketën - lëvizni Njoftime Hap lidhje të jashtme shfaq më tepër @@ -3360,7 +3357,6 @@ Language: sq_AL u bë OK URL - Po ngarkohet… Drejtim Rifresko Pa titull @@ -3392,7 +3388,6 @@ Language: sq_AL Spastroje Shtoni Ruaje - Anuloje Një herë Dy herë diff --git a/WordPress/src/main/res/values-sr/strings.xml b/WordPress/src/main/res/values-sr/strings.xml index 34b6f1441e75..261185930650 100644 --- a/WordPress/src/main/res/values-sr/strings.xml +++ b/WordPress/src/main/res/values-sr/strings.xml @@ -1657,7 +1657,6 @@ Language: sr_RS У реду обављено URL - Отпремање… Поравнање Освежи Без имена @@ -1676,7 +1675,6 @@ Language: sr_RS Одобри Ниједан Грешка - Откажи Сачувај Додај Грешка приликом освежавања категорије diff --git a/WordPress/src/main/res/values-sv/strings.xml b/WordPress/src/main/res/values-sv/strings.xml index 97674f1caa84..5c96caf735ff 100644 --- a/WordPress/src/main/res/values-sv/strings.xml +++ b/WordPress/src/main/res/values-sv/strings.xml @@ -263,7 +263,6 @@ Language: sv_SE Din feedback är uppskattad. Feedback Skicka - Stäng Skickar Inlägg via ljud är inte tillgängligt för tillfället, försök igen senare. Klar @@ -803,7 +802,6 @@ Language: sv_SE 0 svar ✓ Besvarat Förslag - stäng Ta bort kategori \'%s\' permanent? Kategori borttagen Misslyckades att ta bort kategori @@ -2280,7 +2278,6 @@ Language: sv_SE %1$s av obegränsat Lägg till %d Skapa etikett - uppåt Aviseringar Öppna extern länk visa mer @@ -3363,7 +3360,6 @@ Language: sv_SE klart OK URL - Laddar upp… Justering Uppdatera Utan titel @@ -3395,7 +3391,6 @@ Language: sv_SE Rensa Lägg till Spara - Avbryt En gång Två gånger diff --git a/WordPress/src/main/res/values-th/strings.xml b/WordPress/src/main/res/values-th/strings.xml index b0773c48c173..9ba63ea537b3 100644 --- a/WordPress/src/main/res/values-th/strings.xml +++ b/WordPress/src/main/res/values-th/strings.xml @@ -333,7 +333,6 @@ Language: th ไม่มีเครือข่ายใช้งานได้ ตกลง URL - กำลังอัปโหลด… จัดหน้า รีเฟรช ไม่มีหัวข้อ @@ -352,7 +351,6 @@ Language: th ผิดพลาด ใช่ ไม่ใช่ - ยกเลิก บันทึก เพิ่ม ล้างค่า diff --git a/WordPress/src/main/res/values-tr/strings.xml b/WordPress/src/main/res/values-tr/strings.xml index 91be0d762d23..7f85444acd7c 100644 --- a/WordPress/src/main/res/values-tr/strings.xml +++ b/WordPress/src/main/res/values-tr/strings.xml @@ -264,7 +264,6 @@ Language: tr Geribildirimlerinize minnettarız! Geri bildirim Gönder - Kapat Gönderiliyor Sesten gönderi oluşturma şu anda kullanılamıyor, lütfen daha sonra yeniden deneyin. Tamam @@ -804,7 +803,6 @@ Language: tr 0 yanıt ✓ Yanıtlandı İstemler - kapat \"%s\" Kategorisi kalıcı olarak silinsin mi? Kategori silindi Kategori silinemedi @@ -2281,7 +2279,6 @@ Language: tr %1$s / sınırsız Ekle %d Etiket oluşturun - yukarı gidin Bildirimler Dış bağlantıyı açın daha fazlası @@ -3365,7 +3362,6 @@ Language: tr bitti Tamam Adres - Yükleniyor… Hizalama Yenile Başlıksız @@ -3397,7 +3393,6 @@ Language: tr Temizle Ekle Kaydet - İptal Bir kez İki kez diff --git a/WordPress/src/main/res/values-uz/strings.xml b/WordPress/src/main/res/values-uz/strings.xml index 05cbdf77c7ed..fd3b726f7bcd 100644 --- a/WordPress/src/main/res/values-uz/strings.xml +++ b/WordPress/src/main/res/values-uz/strings.xml @@ -71,7 +71,6 @@ Language: uz Titr (ixtiyoriy) OK URL - Yuklanmoqda Tekislash Yangila Nomsiz @@ -91,7 +90,6 @@ Language: uz Yo‘q Ha Javob - Bekor qilish Qo‘shish Oldindan ko‘rish Bo‘limlarni yangilashda xatolik diff --git a/WordPress/src/main/res/values-vi/strings.xml b/WordPress/src/main/res/values-vi/strings.xml index 54c8a16a0e24..d87c602a5fdb 100644 --- a/WordPress/src/main/res/values-vi/strings.xml +++ b/WordPress/src/main/res/values-vi/strings.xml @@ -1361,7 +1361,6 @@ Language: vi_VN Tạo Thẻ Thông báo dấu tick - điều hướng lên Mở liên kết ngoài hiện thêm ảnh @@ -2422,7 +2421,6 @@ Language: vi_VN OK xong URL - Đang tải lên… Canh lề Làm mới Chưa có tựa đề @@ -2441,7 +2439,6 @@ Language: vi_VN Đồng ý Không Lỗi - Hủy bỏ Lưu Thêm Xem trước diff --git a/WordPress/src/main/res/values-zh-rCN/strings.xml b/WordPress/src/main/res/values-zh-rCN/strings.xml index b529f9c224a1..64e9b205ab18 100644 --- a/WordPress/src/main/res/values-zh-rCN/strings.xml +++ b/WordPress/src/main/res/values-zh-rCN/strings.xml @@ -263,7 +263,6 @@ Language: zh_CN 感谢您的反馈意见! 反馈 提交 - 关闭 正在发送 暂时无法查看从音频创建的文章,请稍后再试。 完成 @@ -803,7 +802,6 @@ Language: zh_CN 0 条回复 ✓ 已回复 提示 - 关闭 是否永久删除“%s”分类? 已成功删除分类 删除分类失败 @@ -2280,7 +2278,6 @@ Language: zh_CN %1$s/无限 添加 %d 创建标签 - 向上导航 通知 打开外部链接 显示更多 @@ -3363,7 +3360,6 @@ Language: zh_CN 完成 确定 URL - 正在上传… 对齐 刷新 无标题 @@ -3395,7 +3391,6 @@ Language: zh_CN 清除 添加 保存 - 取消 一次 两次 diff --git a/WordPress/src/main/res/values-zh-rHK/strings.xml b/WordPress/src/main/res/values-zh-rHK/strings.xml index e0d6b9353354..083029b43c3e 100644 --- a/WordPress/src/main/res/values-zh-rHK/strings.xml +++ b/WordPress/src/main/res/values-zh-rHK/strings.xml @@ -179,7 +179,6 @@ Language: zh_TW 感謝你的寶貴意見! 意見回饋 提交 - 關閉 正在傳送 從音訊張貼功能目前無法使用,請稍後再試一次。 完成 @@ -714,7 +713,6 @@ Language: zh_TW 0 個答案 ✓ 已回答 提示 - 關閉 是否要永久刪除「%s」分類? 分類已成功刪除 刪除分類失敗 @@ -2190,7 +2188,6 @@ Language: zh_TW %1$s 的配額空間不受限制 新增 %d 建立標籤 - 瀏覽 通知 開啟外部連結 顯示更多 @@ -3270,7 +3267,6 @@ Language: zh_TW 完成 OK URL - 上傳中… 對齊 更新 無標題 @@ -3302,7 +3298,6 @@ Language: zh_TW 清除 新增 儲存 - 取消 一次 兩次 diff --git a/WordPress/src/main/res/values-zh-rTW/strings.xml b/WordPress/src/main/res/values-zh-rTW/strings.xml index e0d6b9353354..083029b43c3e 100644 --- a/WordPress/src/main/res/values-zh-rTW/strings.xml +++ b/WordPress/src/main/res/values-zh-rTW/strings.xml @@ -179,7 +179,6 @@ Language: zh_TW 感謝你的寶貴意見! 意見回饋 提交 - 關閉 正在傳送 從音訊張貼功能目前無法使用,請稍後再試一次。 完成 @@ -714,7 +713,6 @@ Language: zh_TW 0 個答案 ✓ 已回答 提示 - 關閉 是否要永久刪除「%s」分類? 分類已成功刪除 刪除分類失敗 @@ -2190,7 +2188,6 @@ Language: zh_TW %1$s 的配額空間不受限制 新增 %d 建立標籤 - 瀏覽 通知 開啟外部連結 顯示更多 @@ -3270,7 +3267,6 @@ Language: zh_TW 完成 OK URL - 上傳中… 對齊 更新 無標題 @@ -3302,7 +3298,6 @@ Language: zh_TW 清除 新增 儲存 - 取消 一次 兩次 diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 118ca2443e7a..1fe7861e3bbe 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -58,7 +58,6 @@ Themes About the app Username - Cancel Save Add Remove @@ -625,7 +624,6 @@ 1 week %d weeks https:\/\/ - Close Submit Back @@ -3538,8 +3536,6 @@ Open external link Notifications Notifications - navigate up - close Create Tag Create a post profile picture @@ -4103,7 +4099,6 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> There was an error loading prompts. - Uploading… Can\'t insert media directly in HTML mode. Please switch back to visual mode. You are currently uploading media. Please wait until this completes. Width diff --git a/fastlane/lanes/localization.rb b/fastlane/lanes/localization.rb index 0f922f15aa39..1562594447bd 100644 --- a/fastlane/lanes/localization.rb +++ b/fastlane/lanes/localization.rb @@ -281,7 +281,8 @@ # NOTE: for those we don't set `add_ignore_attr` to true because we currently use `checkDependencies true` in `WordPress/build.gradle` # Which will correctly detect strings from the app's `strings.xml` being used by one of the module. { library: 'Image Editor', strings_path: './libs/image-editor/src/main/res/values/strings.xml', source_id: 'module:image-editor' }, - { library: 'Editor', strings_path: './libs/editor/src/main/res/values/strings.xml', source_id: 'module:editor' } + { library: 'Editor', strings_path: './libs/editor/src/main/res/values/strings.xml', source_id: 'module:editor' }, + { library: 'Core UI', strings_path: './libs/core-ui/src/main/res/values/strings.xml', source_id: 'module:core-ui' } ].freeze REMOTE_LIBRARIES_STRINGS_PATHS = [ { diff --git a/libs/core-ui/src/main/res/values-ar/strings.xml b/libs/core-ui/src/main/res/values-ar/strings.xml new file mode 100644 index 000000000000..dd4f7bf21b18 --- /dev/null +++ b/libs/core-ui/src/main/res/values-ar/strings.xml @@ -0,0 +1,8 @@ + + + إغلاق + إغلاق + الانتقال إلى أعلى + جاري الرفع… + إلغاء + diff --git a/libs/core-ui/src/main/res/values-az/strings.xml b/libs/core-ui/src/main/res/values-az/strings.xml new file mode 100644 index 000000000000..b5933c120c7b --- /dev/null +++ b/libs/core-ui/src/main/res/values-az/strings.xml @@ -0,0 +1,4 @@ + + + İmtina + diff --git a/libs/core-ui/src/main/res/values-bg/strings.xml b/libs/core-ui/src/main/res/values-bg/strings.xml new file mode 100644 index 000000000000..9decc3a7139a --- /dev/null +++ b/libs/core-ui/src/main/res/values-bg/strings.xml @@ -0,0 +1,5 @@ + + + Качва се… + Отказ + diff --git a/libs/core-ui/src/main/res/values-cs/strings.xml b/libs/core-ui/src/main/res/values-cs/strings.xml new file mode 100644 index 000000000000..9adf8fe6991a --- /dev/null +++ b/libs/core-ui/src/main/res/values-cs/strings.xml @@ -0,0 +1,7 @@ + + + zavřít + přejít nahoru + Nahrávám… + Zrušit + diff --git a/libs/core-ui/src/main/res/values-cy/strings.xml b/libs/core-ui/src/main/res/values-cy/strings.xml new file mode 100644 index 000000000000..a766c4cb9fa7 --- /dev/null +++ b/libs/core-ui/src/main/res/values-cy/strings.xml @@ -0,0 +1,5 @@ + + + Llwytho… + Diddymu + diff --git a/libs/core-ui/src/main/res/values-da/strings.xml b/libs/core-ui/src/main/res/values-da/strings.xml new file mode 100644 index 000000000000..47b0d7a3fba3 --- /dev/null +++ b/libs/core-ui/src/main/res/values-da/strings.xml @@ -0,0 +1,5 @@ + + + Uploader + Annuller + diff --git a/libs/core-ui/src/main/res/values-de/strings.xml b/libs/core-ui/src/main/res/values-de/strings.xml new file mode 100644 index 000000000000..4526f288c706 --- /dev/null +++ b/libs/core-ui/src/main/res/values-de/strings.xml @@ -0,0 +1,8 @@ + + + Schließen + Tag schließen + nach oben + Lädt hoch… + Abbrechen + diff --git a/libs/core-ui/src/main/res/values-el/strings.xml b/libs/core-ui/src/main/res/values-el/strings.xml new file mode 100644 index 000000000000..3fe56bf89cbb --- /dev/null +++ b/libs/core-ui/src/main/res/values-el/strings.xml @@ -0,0 +1,5 @@ + + + Γίνεται μεταφόρτωση + Ακύρωση + diff --git a/libs/core-ui/src/main/res/values-en-rAU/strings.xml b/libs/core-ui/src/main/res/values-en-rAU/strings.xml new file mode 100644 index 000000000000..59a91ef28187 --- /dev/null +++ b/libs/core-ui/src/main/res/values-en-rAU/strings.xml @@ -0,0 +1,6 @@ + + + navigate up + Uploading… + Cancel + diff --git a/libs/core-ui/src/main/res/values-en-rCA/strings.xml b/libs/core-ui/src/main/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..a584e5a01579 --- /dev/null +++ b/libs/core-ui/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,8 @@ + + + Close + close + navigate up + Uploading… + Cancel + diff --git a/libs/core-ui/src/main/res/values-en-rGB/strings.xml b/libs/core-ui/src/main/res/values-en-rGB/strings.xml new file mode 100644 index 000000000000..a584e5a01579 --- /dev/null +++ b/libs/core-ui/src/main/res/values-en-rGB/strings.xml @@ -0,0 +1,8 @@ + + + Close + close + navigate up + Uploading… + Cancel + diff --git a/libs/core-ui/src/main/res/values-es-rCL/strings.xml b/libs/core-ui/src/main/res/values-es-rCL/strings.xml new file mode 100644 index 000000000000..e543632060d1 --- /dev/null +++ b/libs/core-ui/src/main/res/values-es-rCL/strings.xml @@ -0,0 +1,8 @@ + + + Cerrar + cerrar + navegar hacia arriba + Subiendo… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-es-rCO/strings.xml b/libs/core-ui/src/main/res/values-es-rCO/strings.xml new file mode 100644 index 000000000000..e543632060d1 --- /dev/null +++ b/libs/core-ui/src/main/res/values-es-rCO/strings.xml @@ -0,0 +1,8 @@ + + + Cerrar + cerrar + navegar hacia arriba + Subiendo… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-es-rMX/strings.xml b/libs/core-ui/src/main/res/values-es-rMX/strings.xml new file mode 100644 index 000000000000..7bc697332838 --- /dev/null +++ b/libs/core-ui/src/main/res/values-es-rMX/strings.xml @@ -0,0 +1,7 @@ + + + Cerrar + navegar hacia arriba + Subiendo… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-es-rVE/strings.xml b/libs/core-ui/src/main/res/values-es-rVE/strings.xml new file mode 100644 index 000000000000..60c4a73d5e22 --- /dev/null +++ b/libs/core-ui/src/main/res/values-es-rVE/strings.xml @@ -0,0 +1,6 @@ + + + navegar hacia arriba + Subiendo… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-es/strings.xml b/libs/core-ui/src/main/res/values-es/strings.xml new file mode 100644 index 000000000000..e543632060d1 --- /dev/null +++ b/libs/core-ui/src/main/res/values-es/strings.xml @@ -0,0 +1,8 @@ + + + Cerrar + cerrar + navegar hacia arriba + Subiendo… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-eu/strings.xml b/libs/core-ui/src/main/res/values-eu/strings.xml new file mode 100644 index 000000000000..26be9c96ab9d --- /dev/null +++ b/libs/core-ui/src/main/res/values-eu/strings.xml @@ -0,0 +1,5 @@ + + + Igotzen… + Ezeztatu + diff --git a/libs/core-ui/src/main/res/values-fr-rCA/strings.xml b/libs/core-ui/src/main/res/values-fr-rCA/strings.xml new file mode 100644 index 000000000000..a11ea2ae8f90 --- /dev/null +++ b/libs/core-ui/src/main/res/values-fr-rCA/strings.xml @@ -0,0 +1,8 @@ + + + Fermer + fermer + faire défiler vers le haut + Téléversement… + Annuler + diff --git a/libs/core-ui/src/main/res/values-fr/strings.xml b/libs/core-ui/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000000..a11ea2ae8f90 --- /dev/null +++ b/libs/core-ui/src/main/res/values-fr/strings.xml @@ -0,0 +1,8 @@ + + + Fermer + fermer + faire défiler vers le haut + Téléversement… + Annuler + diff --git a/libs/core-ui/src/main/res/values-gd/strings.xml b/libs/core-ui/src/main/res/values-gd/strings.xml new file mode 100644 index 000000000000..0dcf44bd3480 --- /dev/null +++ b/libs/core-ui/src/main/res/values-gd/strings.xml @@ -0,0 +1,5 @@ + + + ’Ga luchdadh suas… + Sguir dheth + diff --git a/libs/core-ui/src/main/res/values-gl/strings.xml b/libs/core-ui/src/main/res/values-gl/strings.xml new file mode 100644 index 000000000000..f3e58509315b --- /dev/null +++ b/libs/core-ui/src/main/res/values-gl/strings.xml @@ -0,0 +1,8 @@ + + + Cerrar + pechar + navegar cara arriba + Cargando… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-he/strings.xml b/libs/core-ui/src/main/res/values-he/strings.xml new file mode 100644 index 000000000000..4e391ccb5692 --- /dev/null +++ b/libs/core-ui/src/main/res/values-he/strings.xml @@ -0,0 +1,8 @@ + + + לסגור + לסגור + ניווט למעלה + מעלה… + בטל + diff --git a/libs/core-ui/src/main/res/values-hi/strings.xml b/libs/core-ui/src/main/res/values-hi/strings.xml new file mode 100644 index 000000000000..ef5df3d771fa --- /dev/null +++ b/libs/core-ui/src/main/res/values-hi/strings.xml @@ -0,0 +1,5 @@ + + + अपलोड किया जा रहा + रद्द करें + diff --git a/libs/core-ui/src/main/res/values-hr/strings.xml b/libs/core-ui/src/main/res/values-hr/strings.xml new file mode 100644 index 000000000000..b202c902e86d --- /dev/null +++ b/libs/core-ui/src/main/res/values-hr/strings.xml @@ -0,0 +1,6 @@ + + + Zatvoriti + Prijenos… + Odustani + diff --git a/libs/core-ui/src/main/res/values-hu/strings.xml b/libs/core-ui/src/main/res/values-hu/strings.xml new file mode 100644 index 000000000000..3210ad2be051 --- /dev/null +++ b/libs/core-ui/src/main/res/values-hu/strings.xml @@ -0,0 +1,5 @@ + + + Feltöltés… + Megszakítás + diff --git a/libs/core-ui/src/main/res/values-id/strings.xml b/libs/core-ui/src/main/res/values-id/strings.xml new file mode 100644 index 000000000000..89315abe366b --- /dev/null +++ b/libs/core-ui/src/main/res/values-id/strings.xml @@ -0,0 +1,8 @@ + + + Tutup + tutup + arahkan ke atas + Mengunggah… + Batal + diff --git a/libs/core-ui/src/main/res/values-in/strings.xml b/libs/core-ui/src/main/res/values-in/strings.xml new file mode 100644 index 000000000000..89315abe366b --- /dev/null +++ b/libs/core-ui/src/main/res/values-in/strings.xml @@ -0,0 +1,8 @@ + + + Tutup + tutup + arahkan ke atas + Mengunggah… + Batal + diff --git a/libs/core-ui/src/main/res/values-is/strings.xml b/libs/core-ui/src/main/res/values-is/strings.xml new file mode 100644 index 000000000000..016f1bf755e4 --- /dev/null +++ b/libs/core-ui/src/main/res/values-is/strings.xml @@ -0,0 +1,5 @@ + + + Hleð upp… + Hætta við + diff --git a/libs/core-ui/src/main/res/values-it/strings.xml b/libs/core-ui/src/main/res/values-it/strings.xml new file mode 100644 index 000000000000..a663c530f348 --- /dev/null +++ b/libs/core-ui/src/main/res/values-it/strings.xml @@ -0,0 +1,8 @@ + + + Chiudi + chiudi + naviga su + Caricamento… + Annulla + diff --git a/libs/core-ui/src/main/res/values-iw/strings.xml b/libs/core-ui/src/main/res/values-iw/strings.xml new file mode 100644 index 000000000000..4e391ccb5692 --- /dev/null +++ b/libs/core-ui/src/main/res/values-iw/strings.xml @@ -0,0 +1,8 @@ + + + לסגור + לסגור + ניווט למעלה + מעלה… + בטל + diff --git a/libs/core-ui/src/main/res/values-ja/strings.xml b/libs/core-ui/src/main/res/values-ja/strings.xml new file mode 100644 index 000000000000..305579253c1e --- /dev/null +++ b/libs/core-ui/src/main/res/values-ja/strings.xml @@ -0,0 +1,8 @@ + + + 閉じる + + 上に移動 + アップロード中… + キャンセル + diff --git a/libs/core-ui/src/main/res/values-kmr/strings.xml b/libs/core-ui/src/main/res/values-kmr/strings.xml new file mode 100644 index 000000000000..8753a602748c --- /dev/null +++ b/libs/core-ui/src/main/res/values-kmr/strings.xml @@ -0,0 +1,6 @@ + + + here jorê + Tê Hilbarkirin… + Betal bike + diff --git a/libs/core-ui/src/main/res/values-ko/strings.xml b/libs/core-ui/src/main/res/values-ko/strings.xml new file mode 100644 index 000000000000..60ea1b27a3b0 --- /dev/null +++ b/libs/core-ui/src/main/res/values-ko/strings.xml @@ -0,0 +1,8 @@ + + + 닫기 + 닫기 + 위로 탐색 + 업로드 중… + 취소 + diff --git a/libs/core-ui/src/main/res/values-lv/strings.xml b/libs/core-ui/src/main/res/values-lv/strings.xml new file mode 100644 index 000000000000..1b708f9716de --- /dev/null +++ b/libs/core-ui/src/main/res/values-lv/strings.xml @@ -0,0 +1,8 @@ + + + Aizvērt + aizvērt + virzīties uz augšu + Notiek augšupielāde… + Atcelt + diff --git a/libs/core-ui/src/main/res/values-mk/strings.xml b/libs/core-ui/src/main/res/values-mk/strings.xml new file mode 100644 index 000000000000..ba16f0304345 --- /dev/null +++ b/libs/core-ui/src/main/res/values-mk/strings.xml @@ -0,0 +1,4 @@ + + + Откажи + diff --git a/libs/core-ui/src/main/res/values-ms/strings.xml b/libs/core-ui/src/main/res/values-ms/strings.xml new file mode 100644 index 000000000000..a5aa8ad2e926 --- /dev/null +++ b/libs/core-ui/src/main/res/values-ms/strings.xml @@ -0,0 +1,5 @@ + + + Memuat naik… + Batal + diff --git a/libs/core-ui/src/main/res/values-nb/strings.xml b/libs/core-ui/src/main/res/values-nb/strings.xml new file mode 100644 index 000000000000..5461b3c9f320 --- /dev/null +++ b/libs/core-ui/src/main/res/values-nb/strings.xml @@ -0,0 +1,6 @@ + + + naviger opp + Laster opp … + Avbryt + diff --git a/libs/core-ui/src/main/res/values-nl/strings.xml b/libs/core-ui/src/main/res/values-nl/strings.xml new file mode 100644 index 000000000000..0f0dd02bb3fa --- /dev/null +++ b/libs/core-ui/src/main/res/values-nl/strings.xml @@ -0,0 +1,8 @@ + + + Sluiten + sluiten + omhoog navigeren + Uploaden … + Annuleren + diff --git a/libs/core-ui/src/main/res/values-pl/strings.xml b/libs/core-ui/src/main/res/values-pl/strings.xml new file mode 100644 index 000000000000..c50a227b2924 --- /dev/null +++ b/libs/core-ui/src/main/res/values-pl/strings.xml @@ -0,0 +1,8 @@ + + + Zamknij + zamknij + nawiguj w górę + Przesyłanie… + Anuluj + diff --git a/libs/core-ui/src/main/res/values-pt-rBR/strings.xml b/libs/core-ui/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 000000000000..a9b12b5e53c5 --- /dev/null +++ b/libs/core-ui/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,8 @@ + + + Fechar + fechar + navegar acima + Enviando… + Cancelar + diff --git a/libs/core-ui/src/main/res/values-ro/strings.xml b/libs/core-ui/src/main/res/values-ro/strings.xml new file mode 100644 index 000000000000..8aaa735159cf --- /dev/null +++ b/libs/core-ui/src/main/res/values-ro/strings.xml @@ -0,0 +1,8 @@ + + + Închide + închide + navighează în sus + Încărcare… + Anulare + diff --git a/libs/core-ui/src/main/res/values-ru/strings.xml b/libs/core-ui/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000000..23990d36b46e --- /dev/null +++ b/libs/core-ui/src/main/res/values-ru/strings.xml @@ -0,0 +1,8 @@ + + + Закрыть + закрыть + перейти наверх + Загрузка + Отмена + diff --git a/libs/core-ui/src/main/res/values-sk/strings.xml b/libs/core-ui/src/main/res/values-sk/strings.xml new file mode 100644 index 000000000000..f258be2f882e --- /dev/null +++ b/libs/core-ui/src/main/res/values-sk/strings.xml @@ -0,0 +1,6 @@ + + + navigovať hore + Nahrávanie… + Zrušiť + diff --git a/libs/core-ui/src/main/res/values-sq/strings.xml b/libs/core-ui/src/main/res/values-sq/strings.xml new file mode 100644 index 000000000000..b06fb9220615 --- /dev/null +++ b/libs/core-ui/src/main/res/values-sq/strings.xml @@ -0,0 +1,8 @@ + + + Mbylle + mbylle + lëvizni + Po ngarkohet… + Anuloje + diff --git a/libs/core-ui/src/main/res/values-sr/strings.xml b/libs/core-ui/src/main/res/values-sr/strings.xml new file mode 100644 index 000000000000..d39e03db04e6 --- /dev/null +++ b/libs/core-ui/src/main/res/values-sr/strings.xml @@ -0,0 +1,5 @@ + + + Отпремање… + Откажи + diff --git a/libs/core-ui/src/main/res/values-sv/strings.xml b/libs/core-ui/src/main/res/values-sv/strings.xml new file mode 100644 index 000000000000..0bbe67990d56 --- /dev/null +++ b/libs/core-ui/src/main/res/values-sv/strings.xml @@ -0,0 +1,8 @@ + + + Stäng + stäng + uppåt + Laddar upp… + Avbryt + diff --git a/libs/core-ui/src/main/res/values-th/strings.xml b/libs/core-ui/src/main/res/values-th/strings.xml new file mode 100644 index 000000000000..6910409191d3 --- /dev/null +++ b/libs/core-ui/src/main/res/values-th/strings.xml @@ -0,0 +1,5 @@ + + + กำลังอัปโหลด… + ยกเลิก + diff --git a/libs/core-ui/src/main/res/values-tr/strings.xml b/libs/core-ui/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000000..ff40522dd739 --- /dev/null +++ b/libs/core-ui/src/main/res/values-tr/strings.xml @@ -0,0 +1,8 @@ + + + Kapat + kapat + yukarı gidin + Yükleniyor… + İptal + diff --git a/libs/core-ui/src/main/res/values-uz/strings.xml b/libs/core-ui/src/main/res/values-uz/strings.xml new file mode 100644 index 000000000000..16bff776677b --- /dev/null +++ b/libs/core-ui/src/main/res/values-uz/strings.xml @@ -0,0 +1,5 @@ + + + Yuklanmoqda + Bekor qilish + diff --git a/libs/core-ui/src/main/res/values-vi/strings.xml b/libs/core-ui/src/main/res/values-vi/strings.xml new file mode 100644 index 000000000000..aab8638c4840 --- /dev/null +++ b/libs/core-ui/src/main/res/values-vi/strings.xml @@ -0,0 +1,6 @@ + + + điều hướng lên + Đang tải lên… + Hủy bỏ + diff --git a/libs/core-ui/src/main/res/values-zh-rCN/strings.xml b/libs/core-ui/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 000000000000..601ecaf550e7 --- /dev/null +++ b/libs/core-ui/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,8 @@ + + + 关闭 + 关闭 + 向上导航 + 正在上传… + 取消 + diff --git a/libs/core-ui/src/main/res/values-zh-rHK/strings.xml b/libs/core-ui/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 000000000000..ebbc4f012ebf --- /dev/null +++ b/libs/core-ui/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,8 @@ + + + 關閉 + 關閉 + 瀏覽 + 上傳中… + 取消 + diff --git a/libs/core-ui/src/main/res/values-zh-rTW/strings.xml b/libs/core-ui/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000000..ebbc4f012ebf --- /dev/null +++ b/libs/core-ui/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,8 @@ + + + 關閉 + 關閉 + 瀏覽 + 上傳中… + 取消 + diff --git a/libs/core-ui/src/main/res/values-zh/strings.xml b/libs/core-ui/src/main/res/values-zh/strings.xml new file mode 100644 index 000000000000..601ecaf550e7 --- /dev/null +++ b/libs/core-ui/src/main/res/values-zh/strings.xml @@ -0,0 +1,8 @@ + + + 关闭 + 关闭 + 向上导航 + 正在上传… + 取消 + From f0c2e75c99fce0db383f562d8d617ee857e94edf Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 20:53:59 -0600 Subject: [PATCH 04/26] Move color palette to `:libs:core-ui` Move colors_studio_palette.xml (the design system palette) and the placeholder color to core-ui as the canonical source. Remove duplicate palette colors from core-ui's colors.xml now that the palette file provides them. WordPress's semantic colors (reader, site creation, etc.) stay in :WordPress and continue to reference the palette via resource names. Co-Authored-By: Claude Opus 4.6 --- WordPress/src/main/res/values/colors.xml | 2 -- libs/core-ui/src/main/res/values/colors.xml | 8 -------- .../src/main/res/values/colors_studio_palette.xml | 0 3 files changed, 10 deletions(-) rename {WordPress => libs/core-ui}/src/main/res/values/colors_studio_palette.xml (100%) diff --git a/WordPress/src/main/res/values/colors.xml b/WordPress/src/main/res/values/colors.xml index fb2de5290a54..e68605b89d1e 100644 --- a/WordPress/src/main/res/values/colors.xml +++ b/WordPress/src/main/res/values/colors.xml @@ -10,8 +10,6 @@ @color/primary @android:color/white - - #1A000000 #FFF diff --git a/libs/core-ui/src/main/res/values/colors.xml b/libs/core-ui/src/main/res/values/colors.xml index c70a204748f9..8d9c064cbdd8 100644 --- a/libs/core-ui/src/main/res/values/colors.xml +++ b/libs/core-ui/src/main/res/values/colors.xml @@ -1,12 +1,4 @@ #1A000000 - #c3c4c7 - #646970 - #005b18 - #bbe0fa - #91caf2 - #68b3e8 - #399ce3 - #0675c4 diff --git a/WordPress/src/main/res/values/colors_studio_palette.xml b/libs/core-ui/src/main/res/values/colors_studio_palette.xml similarity index 100% rename from WordPress/src/main/res/values/colors_studio_palette.xml rename to libs/core-ui/src/main/res/values/colors_studio_palette.xml From 6a74bd37138564f7e689dc48da8b96c0fba5edad Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:11:05 -0600 Subject: [PATCH 05/26] Extract `:libs:utils` module with 81 pure utility files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move dependency-free utility classes from `:WordPress` to a new `:libs:utils` module so they can be compiled and linted in parallel. Files that depend on WordPress-only classes (AppConfig, ImageManager, WPActivityUtils, Gravatar SDK, etc.) remain in `:WordPress` for now. Also re-declares shared UI strings and the color studio palette in WordPress's own resources — AGP 9 non-transitive R class means the app module's compile-time R class no longer includes library resources. Co-Authored-By: Claude Opus 4.6 --- WordPress/build.gradle | 1 + .../main/res/values/colors_studio_palette.xml | 105 ++++++++++++++++++ WordPress/src/main/res/values/strings.xml | 7 ++ libs/utils/build.gradle | 80 +++++++++++++ libs/utils/src/main/AndroidManifest.xml | 2 + .../util/AccountActionBuilderWrapper.kt | 0 .../org/wordpress/android/util/AniUtils.java | 0 .../org/wordpress/android/util/ArrayUtils.kt | 0 .../wordpress/android/util/AutolinkUtils.java | 0 .../android/util/BitmapLruCache.java | 0 .../org/wordpress/android/util/ColorUtils.kt | 0 .../util/ContentDescriptionListAnnouncer.kt | 0 .../android/util/DateFormatWrapper.kt | 0 .../android/util/DateTimeUtilsWrapper.kt | 0 .../org/wordpress/android/util/DateUtils.kt | 0 .../android/util/DateUtilsWrapper.kt | 0 .../org/wordpress/android/util/DebugUtils.kt | 0 .../android/util/DisplayUtilsWrapper.kt | 0 .../android/util/DistinctMutableLiveData.kt | 0 .../android/util/DomainPhoneNumberUtils.kt | 0 ...EnumWithFallbackValueTypeAdapterFactory.kt | 0 .../android/util/ErrorManagedWebViewClient.kt | 0 .../android/util/EventBusCoroutines.kt | 0 .../wordpress/android/util/EventBusWrapper.kt | 0 .../wordpress/android/util/FileProvider.kt | 0 .../wordpress/android/util/FluxCUtils.java | 0 .../android/util/FluxCUtilsWrapper.kt | 0 .../android/util/FormattableContentUtils.kt | 0 .../android/util/GenericCallback.java | 0 .../android/util/HtmlCompatWrapper.kt | 0 .../android/util/KeyboardResizeViewUtil.java | 0 .../android/util/ListFormatterUtils.kt | 0 .../wordpress/android/util/LiveDataUtils.kt | 0 .../android/util/LocaleManagerWrapper.kt | 0 .../android/util/LogFileProviderWrapper.kt | 0 .../android/util/MimeTypeMapUtilsWrapper.kt | 0 .../android/util/PhotonUtilsWrapper.kt | 0 .../org/wordpress/android/util/PlanUtils.kt | 0 .../android/util/PlansConstants.java | 0 .../android/util/RateLimitedTask.java | 0 .../org/wordpress/android/util/ReblogUtils.kt | 0 .../org/wordpress/android/util/RtlUtils.java | 0 .../wordpress/android/util/SnackbarItem.kt | 0 .../wordpress/android/util/StringProvider.kt | 0 .../android/util/ThrottleLiveData.kt | 0 .../wordpress/android/util/UriUtilsWrapper.kt | 0 .../org/wordpress/android/util/UriWrapper.kt | 0 .../wordpress/android/util/UrlUtilsWrapper.kt | 0 .../wordpress/android/util/ValidationUtils.kt | 0 .../org/wordpress/android/util/ViewWrapper.kt | 0 .../wordpress/android/util/VolleyUtils.java | 0 .../wordpress/android/util/WPPrefUtils.java | 0 .../android/util/audio/AudioRecorder.kt | 0 .../android/util/audio/IAudioRecorder.kt | 0 .../android/util/audio/RecordingParams.kt | 0 .../android/util/audio/RecordingStrategy.kt | 0 .../android/util/audio/RecordingUpdate.kt | 0 .../util/coroutines/CoroutineHelpers.kt | 0 .../util/crashlogging/CrashLoggingExt.kt | 0 .../crashlogging/WebviewVersionProvider.kt | 0 .../android/util/extensions/AnyExtensions.kt | 0 .../util/extensions/AppBarLayoutExtensions.kt | 0 .../util/extensions/CollectionExtensions.kt | 0 .../util/extensions/CompatExtensions.kt | 0 .../extensions/ConfigurationExtensions.kt | 0 .../util/extensions/ContextExtensions.kt | 0 .../util/extensions/DateTimeExtensions.kt | 0 .../extensions/FragmentManagerExtensions.kt | 0 .../util/extensions/InAppReviewExtensions.kt | 0 .../IndividualJetpackPluginExtensions.kt | 0 .../android/util/extensions/MapExtensions.kt | 0 .../util/extensions/NumberExtensions.kt | 0 .../util/extensions/PostModelExtensions.kt | 0 .../util/extensions/ProductExtensions.kt | 0 .../util/extensions/SiteModelExtensions.kt | 0 .../util/extensions/StringExtensions.kt | 0 .../android/util/extensions/ViewExtensions.kt | 0 .../util/extensions/WindowExtensions.kt | 0 .../android/util/image/BlavatarShape.kt | 0 .../wordpress/android/util/image/ImageType.kt | 0 .../image/PortraitAwareCropTransformation.kt | 0 .../android/util/publicdata/AppStatus.kt | 0 .../util/publicdata/PackageManagerWrapper.kt | 0 .../android/util/signature/SignatureUtils.kt | 0 .../android/util/text/PercentFormatter.kt | 0 .../android/util/wizard/WizardManager.kt | 0 settings.gradle | 1 + 87 files changed, 196 insertions(+) create mode 100644 WordPress/src/main/res/values/colors_studio_palette.xml create mode 100644 libs/utils/build.gradle create mode 100644 libs/utils/src/main/AndroidManifest.xml rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/AccountActionBuilderWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/AniUtils.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ArrayUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/AutolinkUtils.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/BitmapLruCache.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ColorUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ContentDescriptionListAnnouncer.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DateFormatWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DateTimeUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DateUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DateUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DebugUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DisplayUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DistinctMutableLiveData.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/DomainPhoneNumberUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactory.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ErrorManagedWebViewClient.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/EventBusCoroutines.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/EventBusWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/FileProvider.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/FluxCUtils.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/FluxCUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/FormattableContentUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/GenericCallback.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/HtmlCompatWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/KeyboardResizeViewUtil.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ListFormatterUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/LiveDataUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/LocaleManagerWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/LogFileProviderWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/MimeTypeMapUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/PhotonUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/PlanUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/PlansConstants.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/RateLimitedTask.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ReblogUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/RtlUtils.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/SnackbarItem.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/StringProvider.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ThrottleLiveData.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/UriUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/UriWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/UrlUtilsWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ValidationUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/ViewWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/VolleyUtils.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/WPPrefUtils.java (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/audio/AudioRecorder.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/audio/IAudioRecorder.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/audio/RecordingParams.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/audio/RecordingStrategy.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/audio/RecordingUpdate.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/coroutines/CoroutineHelpers.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/crashlogging/CrashLoggingExt.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/crashlogging/WebviewVersionProvider.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/AnyExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/AppBarLayoutExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/CollectionExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/ConfigurationExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/ContextExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/DateTimeExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/FragmentManagerExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/InAppReviewExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/MapExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/NumberExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/PostModelExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/ProductExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/SiteModelExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/StringExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/ViewExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/image/BlavatarShape.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/image/ImageType.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/image/PortraitAwareCropTransformation.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/publicdata/AppStatus.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/text/PercentFormatter.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/util/wizard/WizardManager.kt (100%) diff --git a/WordPress/build.gradle b/WordPress/build.gradle index dc616eaff836..39418381407c 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -367,6 +367,7 @@ dependencies { } implementation project(":libs:posttypes") implementation project(":libs:core-ui") + implementation project(":libs:utils") implementation("$gradle.ext.aboutAutomatticBinaryPath:${libs.versions.automattic.about.get()}") implementation("$gradle.ext.gutenbergKitBinaryPath:${libs.versions.gutenberg.kit.get()}") diff --git a/WordPress/src/main/res/values/colors_studio_palette.xml b/WordPress/src/main/res/values/colors_studio_palette.xml new file mode 100644 index 000000000000..fe82eb0cfa45 --- /dev/null +++ b/WordPress/src/main/res/values/colors_studio_palette.xml @@ -0,0 +1,105 @@ + + + + + #fff + #000 + + #646970 + #f6f7f7 + #dcdcde + #c3c4c7 + #a7aaad + #8c8f94 + #787c82 + #646970 + #50575e + #3c434a + #2c3338 + #1d2327 + #101517 + + #0675c4 + #e9f0f5 + #bbe0fa + #91caf2 + #68b3e8 + #399ce3 + #1689db + #0675c4 + #055d9c + #044b7a + #02395c + #001621 + + #984a9c + #f2e9ed + #ebcee0 + #b35eb1 + #984a9c + #35163b + #1e0c21 + + #eb6594 + #e34c84 + #c9356e + #ab235a + #8c1749 + #260415 + + #facfd2 + #f86368 + #e65054 + #d63638 + #b32d2e + #691c1c + + #f5ece6 + #f7dcc6 + #e68b28 + #d67709 + #b26200 + #361f00 + #1f1200 + + #f5f1e1 + #f5e6b3 + #f2d76b + #f0c930 + #c08c00 + #9d6e00 + #7d5600 + #320 + #1c1300 + + #e6f2e8 + #b8e6bf + #1ed15a + #00ba37 + #00a32a + #008a20 + #003008 + #001c05 + + + #001d2d + #00101c + + + + #069e08 + #f0f2eb + #d0e6b8 + #9dd977 + #64ca43 + #2fb41f + #069e08 + #008710 + #007117 + #005b18 + #004515 + #003010 + #001c09 + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 1fe7861e3bbe..64c364892e1f 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -5155,4 +5155,11 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Automattic logo Back icon App icon + + + Close + navigate up + close + Cancel + Uploading… diff --git a/libs/utils/build.gradle b/libs/utils/build.gradle new file mode 100644 index 000000000000..b0d409c3cf84 --- /dev/null +++ b/libs/utils/build.gradle @@ -0,0 +1,80 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.dependency.analysis) +} + +android { + namespace "org.wordpress.android.utils" + + defaultConfig { + compileSdk rootProject.compileSdkVersion + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + targetCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + } +} + +dependencies { + // Internal modules + implementation project(":libs:core-ui") + implementation project(":libs:fluxc") + + // WordPress utils (AppLog, PhotonUtils, etc.) + implementation("$gradle.ext.wputilsBinaryPath") { + version { + strictly libs.wordpress.utils.get().version + } + } + + // AndroidX + implementation libs.androidx.appcompat.main + implementation libs.androidx.core.main + implementation libs.androidx.core.ktx + implementation libs.androidx.fragment.main + implementation libs.androidx.preference + implementation libs.androidx.webkit + + // Lifecycle + implementation libs.androidx.lifecycle.common + implementation libs.androidx.lifecycle.livedata.core + implementation libs.androidx.lifecycle.livedata.main + implementation libs.androidx.lifecycle.viewmodel.main + implementation libs.androidx.lifecycle.runtime + implementation libs.androidx.lifecycle.process + + // Coroutines + implementation libs.kotlinx.coroutines.core + implementation libs.kotlinx.coroutines.android + + // EventBus + implementation libs.greenrobot.eventbus.main + + // Volley + implementation libs.android.volley + + // Glide + implementation libs.bumptech.glide.main + + // Google Material + implementation libs.google.material + + // Gson + implementation libs.google.gson + + // Google Play (for InAppReviewExtensions) + implementation libs.google.play.review + + // Tracks crashlogging + implementation libs.automattic.tracks.crashlogging + + // Dagger (for javax.inject annotations) + implementation libs.google.dagger +} diff --git a/libs/utils/src/main/AndroidManifest.xml b/libs/utils/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..8072ee00dbf1 --- /dev/null +++ b/libs/utils/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/WordPress/src/main/java/org/wordpress/android/util/AccountActionBuilderWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/AccountActionBuilderWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/AccountActionBuilderWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/AccountActionBuilderWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/AniUtils.java b/libs/utils/src/main/java/org/wordpress/android/util/AniUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/AniUtils.java rename to libs/utils/src/main/java/org/wordpress/android/util/AniUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/ArrayUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/ArrayUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ArrayUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ArrayUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/AutolinkUtils.java b/libs/utils/src/main/java/org/wordpress/android/util/AutolinkUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/AutolinkUtils.java rename to libs/utils/src/main/java/org/wordpress/android/util/AutolinkUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/BitmapLruCache.java b/libs/utils/src/main/java/org/wordpress/android/util/BitmapLruCache.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/BitmapLruCache.java rename to libs/utils/src/main/java/org/wordpress/android/util/BitmapLruCache.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/ColorUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/ColorUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ColorUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ColorUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/ContentDescriptionListAnnouncer.kt b/libs/utils/src/main/java/org/wordpress/android/util/ContentDescriptionListAnnouncer.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ContentDescriptionListAnnouncer.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ContentDescriptionListAnnouncer.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DateFormatWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/DateFormatWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DateFormatWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DateFormatWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DateTimeUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/DateTimeUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DateTimeUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DateTimeUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DateUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/DateUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DateUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DateUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DateUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/DateUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DateUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DateUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DebugUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/DebugUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DebugUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DebugUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DisplayUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/DisplayUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DisplayUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DisplayUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DistinctMutableLiveData.kt b/libs/utils/src/main/java/org/wordpress/android/util/DistinctMutableLiveData.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DistinctMutableLiveData.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DistinctMutableLiveData.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/DomainPhoneNumberUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/DomainPhoneNumberUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/DomainPhoneNumberUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/DomainPhoneNumberUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactory.kt b/libs/utils/src/main/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactory.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactory.kt rename to libs/utils/src/main/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactory.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/ErrorManagedWebViewClient.kt b/libs/utils/src/main/java/org/wordpress/android/util/ErrorManagedWebViewClient.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ErrorManagedWebViewClient.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ErrorManagedWebViewClient.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/EventBusCoroutines.kt b/libs/utils/src/main/java/org/wordpress/android/util/EventBusCoroutines.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/EventBusCoroutines.kt rename to libs/utils/src/main/java/org/wordpress/android/util/EventBusCoroutines.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/EventBusWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/EventBusWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/EventBusWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/EventBusWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/FileProvider.kt b/libs/utils/src/main/java/org/wordpress/android/util/FileProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/FileProvider.kt rename to libs/utils/src/main/java/org/wordpress/android/util/FileProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/FluxCUtils.java b/libs/utils/src/main/java/org/wordpress/android/util/FluxCUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/FluxCUtils.java rename to libs/utils/src/main/java/org/wordpress/android/util/FluxCUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/FluxCUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/FluxCUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/FluxCUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/FluxCUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/FormattableContentUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/FormattableContentUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/FormattableContentUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/FormattableContentUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/GenericCallback.java b/libs/utils/src/main/java/org/wordpress/android/util/GenericCallback.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/GenericCallback.java rename to libs/utils/src/main/java/org/wordpress/android/util/GenericCallback.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/HtmlCompatWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/HtmlCompatWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/HtmlCompatWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/HtmlCompatWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/KeyboardResizeViewUtil.java b/libs/utils/src/main/java/org/wordpress/android/util/KeyboardResizeViewUtil.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/KeyboardResizeViewUtil.java rename to libs/utils/src/main/java/org/wordpress/android/util/KeyboardResizeViewUtil.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/ListFormatterUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/ListFormatterUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ListFormatterUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ListFormatterUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/LiveDataUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/LiveDataUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/LiveDataUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/LiveDataUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/LocaleManagerWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/LocaleManagerWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/LocaleManagerWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/LocaleManagerWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/LogFileProviderWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/LogFileProviderWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/LogFileProviderWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/LogFileProviderWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/MimeTypeMapUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/MimeTypeMapUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/MimeTypeMapUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/MimeTypeMapUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/PhotonUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/PhotonUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/PhotonUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/PhotonUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/PlanUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/PlanUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/PlanUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/PlanUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/PlansConstants.java b/libs/utils/src/main/java/org/wordpress/android/util/PlansConstants.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/PlansConstants.java rename to libs/utils/src/main/java/org/wordpress/android/util/PlansConstants.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/RateLimitedTask.java b/libs/utils/src/main/java/org/wordpress/android/util/RateLimitedTask.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/RateLimitedTask.java rename to libs/utils/src/main/java/org/wordpress/android/util/RateLimitedTask.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/ReblogUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/ReblogUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ReblogUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ReblogUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/RtlUtils.java b/libs/utils/src/main/java/org/wordpress/android/util/RtlUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/RtlUtils.java rename to libs/utils/src/main/java/org/wordpress/android/util/RtlUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/SnackbarItem.kt b/libs/utils/src/main/java/org/wordpress/android/util/SnackbarItem.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/SnackbarItem.kt rename to libs/utils/src/main/java/org/wordpress/android/util/SnackbarItem.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/StringProvider.kt b/libs/utils/src/main/java/org/wordpress/android/util/StringProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/StringProvider.kt rename to libs/utils/src/main/java/org/wordpress/android/util/StringProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/ThrottleLiveData.kt b/libs/utils/src/main/java/org/wordpress/android/util/ThrottleLiveData.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ThrottleLiveData.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ThrottleLiveData.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/UriUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/UriUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/UriUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/UriUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/UriWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/UriWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/UriWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/UriWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/UrlUtilsWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/UrlUtilsWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/UrlUtilsWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/UrlUtilsWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/ValidationUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/ValidationUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ValidationUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ValidationUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/ViewWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/ViewWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/ViewWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/ViewWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java b/libs/utils/src/main/java/org/wordpress/android/util/VolleyUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java rename to libs/utils/src/main/java/org/wordpress/android/util/VolleyUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPPrefUtils.java b/libs/utils/src/main/java/org/wordpress/android/util/WPPrefUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/WPPrefUtils.java rename to libs/utils/src/main/java/org/wordpress/android/util/WPPrefUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/util/audio/AudioRecorder.kt b/libs/utils/src/main/java/org/wordpress/android/util/audio/AudioRecorder.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/audio/AudioRecorder.kt rename to libs/utils/src/main/java/org/wordpress/android/util/audio/AudioRecorder.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/audio/IAudioRecorder.kt b/libs/utils/src/main/java/org/wordpress/android/util/audio/IAudioRecorder.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/audio/IAudioRecorder.kt rename to libs/utils/src/main/java/org/wordpress/android/util/audio/IAudioRecorder.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/audio/RecordingParams.kt b/libs/utils/src/main/java/org/wordpress/android/util/audio/RecordingParams.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/audio/RecordingParams.kt rename to libs/utils/src/main/java/org/wordpress/android/util/audio/RecordingParams.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/audio/RecordingStrategy.kt b/libs/utils/src/main/java/org/wordpress/android/util/audio/RecordingStrategy.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/audio/RecordingStrategy.kt rename to libs/utils/src/main/java/org/wordpress/android/util/audio/RecordingStrategy.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/audio/RecordingUpdate.kt b/libs/utils/src/main/java/org/wordpress/android/util/audio/RecordingUpdate.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/audio/RecordingUpdate.kt rename to libs/utils/src/main/java/org/wordpress/android/util/audio/RecordingUpdate.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/coroutines/CoroutineHelpers.kt b/libs/utils/src/main/java/org/wordpress/android/util/coroutines/CoroutineHelpers.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/coroutines/CoroutineHelpers.kt rename to libs/utils/src/main/java/org/wordpress/android/util/coroutines/CoroutineHelpers.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/crashlogging/CrashLoggingExt.kt b/libs/utils/src/main/java/org/wordpress/android/util/crashlogging/CrashLoggingExt.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/crashlogging/CrashLoggingExt.kt rename to libs/utils/src/main/java/org/wordpress/android/util/crashlogging/CrashLoggingExt.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/crashlogging/WebviewVersionProvider.kt b/libs/utils/src/main/java/org/wordpress/android/util/crashlogging/WebviewVersionProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/crashlogging/WebviewVersionProvider.kt rename to libs/utils/src/main/java/org/wordpress/android/util/crashlogging/WebviewVersionProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/AnyExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/AnyExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/AnyExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/AnyExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/AppBarLayoutExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/AppBarLayoutExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/AppBarLayoutExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/AppBarLayoutExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/CollectionExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/CollectionExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/CollectionExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/CollectionExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/CompatExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/ConfigurationExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/ConfigurationExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/ConfigurationExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/ConfigurationExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/ContextExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/ContextExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/ContextExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/ContextExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/DateTimeExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/DateTimeExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/DateTimeExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/DateTimeExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/FragmentManagerExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/FragmentManagerExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/FragmentManagerExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/FragmentManagerExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/InAppReviewExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/InAppReviewExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/InAppReviewExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/InAppReviewExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/MapExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/MapExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/MapExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/MapExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/NumberExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/NumberExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/NumberExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/NumberExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/PostModelExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/PostModelExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/PostModelExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/PostModelExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/ProductExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/ProductExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/ProductExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/ProductExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/SiteModelExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/SiteModelExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/SiteModelExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/SiteModelExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/StringExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/StringExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/StringExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/StringExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/ViewExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/ViewExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/ViewExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/ViewExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt b/libs/utils/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt rename to libs/utils/src/main/java/org/wordpress/android/util/extensions/WindowExtensions.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/image/BlavatarShape.kt b/libs/utils/src/main/java/org/wordpress/android/util/image/BlavatarShape.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/image/BlavatarShape.kt rename to libs/utils/src/main/java/org/wordpress/android/util/image/BlavatarShape.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/image/ImageType.kt b/libs/utils/src/main/java/org/wordpress/android/util/image/ImageType.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/image/ImageType.kt rename to libs/utils/src/main/java/org/wordpress/android/util/image/ImageType.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/image/PortraitAwareCropTransformation.kt b/libs/utils/src/main/java/org/wordpress/android/util/image/PortraitAwareCropTransformation.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/image/PortraitAwareCropTransformation.kt rename to libs/utils/src/main/java/org/wordpress/android/util/image/PortraitAwareCropTransformation.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/publicdata/AppStatus.kt b/libs/utils/src/main/java/org/wordpress/android/util/publicdata/AppStatus.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/publicdata/AppStatus.kt rename to libs/utils/src/main/java/org/wordpress/android/util/publicdata/AppStatus.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt b/libs/utils/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt rename to libs/utils/src/main/java/org/wordpress/android/util/publicdata/PackageManagerWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt b/libs/utils/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt rename to libs/utils/src/main/java/org/wordpress/android/util/signature/SignatureUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/text/PercentFormatter.kt b/libs/utils/src/main/java/org/wordpress/android/util/text/PercentFormatter.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/text/PercentFormatter.kt rename to libs/utils/src/main/java/org/wordpress/android/util/text/PercentFormatter.kt diff --git a/WordPress/src/main/java/org/wordpress/android/util/wizard/WizardManager.kt b/libs/utils/src/main/java/org/wordpress/android/util/wizard/WizardManager.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/util/wizard/WizardManager.kt rename to libs/utils/src/main/java/org/wordpress/android/util/wizard/WizardManager.kt diff --git a/settings.gradle b/settings.gradle index 870021754113..c6cc069bcd39 100644 --- a/settings.gradle +++ b/settings.gradle @@ -106,6 +106,7 @@ include ':libs:mocks' include ':libs:fluxc', ':libs:fluxc-annotations', ':libs:fluxc-processor' include ':libs:posttypes' include ':libs:core-ui' +include ':libs:utils' apply from: './config/gradle/included_builds.gradle' apply from: './config/gradle/gradle_build_scan.gradle' From a4aad4df1cfd81a1e5df173a4aa34798556dbfa2 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:25:07 -0600 Subject: [PATCH 06/26] Move unit tests for extracted utils to `:libs:utils` Moves 10 unit tests that have no WordPress-only dependencies to libs/utils/src/test/. Three tests (LiveDataUtilsTest, PercentFormatterTest, WizardManagerTest) remain in WordPress because they extend BaseUnitTest. Three instrumented tests remain because they require Hilt test configuration. Co-Authored-By: Claude Opus 4.6 --- libs/utils/build.gradle | 11 +++++++++++ .../java/org/wordpress/android/util/ArrayUtilsTest.kt | 0 .../android/util/DomainPhoneNumberUtilsTest.kt | 0 .../EnumWithFallbackValueTypeAdapterFactoryTest.kt | 0 .../android/util/FormattableContentUtilsTest.kt | 0 .../java/org/wordpress/android/util/PlanUtilsTest.kt | 0 .../org/wordpress/android/util/ReblogUtilsTest.kt | 0 .../org/wordpress/android/util/ValidationUtilsTest.kt | 0 .../IndividualJetpackPluginExtensionsKtTest.kt | 0 .../android/util/extensions/MapExtensionsKtTest.kt | 0 .../android/util/publicdata/AppStatusTest.kt | 0 11 files changed, 11 insertions(+) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/ArrayUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/DomainPhoneNumberUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactoryTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/PlanUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/ReblogUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/ValidationUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensionsKtTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/extensions/MapExtensionsKtTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/publicdata/AppStatusTest.kt (100%) diff --git a/libs/utils/build.gradle b/libs/utils/build.gradle index b0d409c3cf84..fcf3e83ce976 100644 --- a/libs/utils/build.gradle +++ b/libs/utils/build.gradle @@ -12,6 +12,10 @@ android { targetSdkVersion rootProject.targetSdkVersion } + testOptions { + unitTests.returnDefaultValues = true + } + compileOptions { sourceCompatibility JavaVersion.toVersion( libs.versions.java.get() @@ -77,4 +81,11 @@ dependencies { // Dagger (for javax.inject annotations) implementation libs.google.dagger + + // Testing + testImplementation libs.junit + testImplementation libs.kotlin.test.junit + testImplementation libs.assertj.core + testImplementation libs.mockito.core + testImplementation libs.mockito.kotlin } diff --git a/WordPress/src/test/java/org/wordpress/android/util/ArrayUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/ArrayUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/ArrayUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/ArrayUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/DomainPhoneNumberUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/DomainPhoneNumberUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/DomainPhoneNumberUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/DomainPhoneNumberUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactoryTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactoryTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactoryTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/EnumWithFallbackValueTypeAdapterFactoryTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/PlanUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/PlanUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/PlanUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/PlanUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/ReblogUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/ReblogUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/ReblogUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/ReblogUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/ValidationUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/ValidationUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/ValidationUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/ValidationUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensionsKtTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensionsKtTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensionsKtTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/extensions/IndividualJetpackPluginExtensionsKtTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/extensions/MapExtensionsKtTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/extensions/MapExtensionsKtTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/extensions/MapExtensionsKtTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/extensions/MapExtensionsKtTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/publicdata/AppStatusTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/publicdata/AppStatusTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/publicdata/AppStatusTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/publicdata/AppStatusTest.kt From aae1bf37f04a2e1870018632983ee960dc596841 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:33:20 -0600 Subject: [PATCH 07/26] Extract `:libs:core-test` module with shared test infrastructure Moves BaseUnitTest and CoroutineTestRule to a new core-test module so library modules can use them for unit testing. Both WordPress (408 tests) and libs:utils consume this via testImplementation. Also moves LiveDataUtilsTest and PercentFormatterTest to libs:utils now that their only blocker (BaseUnitTest) is available. Co-Authored-By: Claude Opus 4.6 --- WordPress/build.gradle | 1 + libs/core-test/build.gradle | 30 +++++++++++++++++++ libs/core-test/src/main/AndroidManifest.xml | 2 ++ .../org/wordpress/android/BaseUnitTest.kt | 0 .../wordpress/android/CoroutineTestRule.kt | 0 libs/utils/build.gradle | 3 ++ .../android/util/LiveDataUtilsTest.kt | 0 .../android/util/text/PercentFormatterTest.kt | 0 settings.gradle | 1 + 9 files changed, 37 insertions(+) create mode 100644 libs/core-test/build.gradle create mode 100644 libs/core-test/src/main/AndroidManifest.xml rename {WordPress/src/test => libs/core-test/src/main}/java/org/wordpress/android/BaseUnitTest.kt (100%) rename {WordPress/src/test => libs/core-test/src/main}/java/org/wordpress/android/CoroutineTestRule.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/LiveDataUtilsTest.kt (100%) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/text/PercentFormatterTest.kt (100%) diff --git a/WordPress/build.gradle b/WordPress/build.gradle index 39418381407c..eaa28b8bfb34 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -454,6 +454,7 @@ dependencies { implementation(libs.wordpress.rs.android) + testImplementation project(":libs:core-test") testImplementation(libs.androidx.arch.core.testing) { exclude group: 'com.android.support', module: 'support-compat' exclude group: 'com.android.support', module: 'support-annotations' diff --git a/libs/core-test/build.gradle b/libs/core-test/build.gradle new file mode 100644 index 000000000000..60ae764f0e70 --- /dev/null +++ b/libs/core-test/build.gradle @@ -0,0 +1,30 @@ +plugins { + alias(libs.plugins.android.library) +} + +android { + namespace "org.wordpress.android.coretest" + + defaultConfig { + compileSdk rootProject.compileSdkVersion + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + targetCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + } +} + +dependencies { + implementation libs.junit + implementation libs.mockito.core + implementation libs.mockito.kotlin + implementation libs.androidx.arch.core.testing + implementation libs.kotlinx.coroutines.test +} diff --git a/libs/core-test/src/main/AndroidManifest.xml b/libs/core-test/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..8072ee00dbf1 --- /dev/null +++ b/libs/core-test/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/WordPress/src/test/java/org/wordpress/android/BaseUnitTest.kt b/libs/core-test/src/main/java/org/wordpress/android/BaseUnitTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/BaseUnitTest.kt rename to libs/core-test/src/main/java/org/wordpress/android/BaseUnitTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/CoroutineTestRule.kt b/libs/core-test/src/main/java/org/wordpress/android/CoroutineTestRule.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/CoroutineTestRule.kt rename to libs/core-test/src/main/java/org/wordpress/android/CoroutineTestRule.kt diff --git a/libs/utils/build.gradle b/libs/utils/build.gradle index fcf3e83ce976..feeba80c0d45 100644 --- a/libs/utils/build.gradle +++ b/libs/utils/build.gradle @@ -83,9 +83,12 @@ dependencies { implementation libs.google.dagger // Testing + testImplementation project(":libs:core-test") testImplementation libs.junit testImplementation libs.kotlin.test.junit testImplementation libs.assertj.core testImplementation libs.mockito.core testImplementation libs.mockito.kotlin + testImplementation libs.kotlinx.coroutines.test + testImplementation libs.androidx.arch.core.testing } diff --git a/WordPress/src/test/java/org/wordpress/android/util/LiveDataUtilsTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/LiveDataUtilsTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/LiveDataUtilsTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/LiveDataUtilsTest.kt diff --git a/WordPress/src/test/java/org/wordpress/android/util/text/PercentFormatterTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/text/PercentFormatterTest.kt similarity index 100% rename from WordPress/src/test/java/org/wordpress/android/util/text/PercentFormatterTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/text/PercentFormatterTest.kt diff --git a/settings.gradle b/settings.gradle index c6cc069bcd39..c4b47b20aacf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -107,6 +107,7 @@ include ':libs:fluxc', ':libs:fluxc-annotations', ':libs:fluxc-processor' include ':libs:posttypes' include ':libs:core-ui' include ':libs:utils' +include ':libs:core-test' apply from: './config/gradle/included_builds.gradle' apply from: './config/gradle/gradle_build_scan.gradle' From 07ee35c68da74ee3f3f61f517293d00cceaabe66 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:37:04 -0600 Subject: [PATCH 08/26] Move WizardManagerTest to `:libs:utils` Replace the SiteCreationStep dependency with a test-local TestStep enum so the test is self-contained and can live alongside WizardManager in the utils module. Co-Authored-By: Claude Opus 4.6 --- .../android/util/wizard/WizardManagerTest.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) rename {WordPress => libs/utils}/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt (82%) diff --git a/WordPress/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt b/libs/utils/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt similarity index 82% rename from WordPress/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt rename to libs/utils/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt index 77f3c9b847ec..da804ea02449 100644 --- a/WordPress/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt +++ b/libs/utils/src/test/java/org/wordpress/android/util/wizard/WizardManagerTest.kt @@ -11,21 +11,19 @@ import org.mockito.junit.MockitoJUnitRunner import org.mockito.kotlin.any import org.mockito.kotlin.verify import org.wordpress.android.BaseUnitTest -import org.wordpress.android.ui.sitecreation.SiteCreationStep -import org.wordpress.android.ui.sitecreation.SiteCreationStep.DOMAINS -import org.wordpress.android.ui.sitecreation.SiteCreationStep.SITE_DESIGNS -import org.wordpress.android.ui.sitecreation.SiteCreationStep.SITE_PREVIEW -private val STEPS = listOf(SITE_DESIGNS, DOMAINS, SITE_PREVIEW) +private enum class TestStep : WizardStep { FIRST, SECOND, THIRD } + +private val STEPS = listOf(TestStep.FIRST, TestStep.SECOND, TestStep.THIRD) private val LAST_STEP_INDEX = STEPS.size - 1 @ExperimentalCoroutinesApi @RunWith(MockitoJUnitRunner::class) class WizardManagerTest : BaseUnitTest() { - private lateinit var manager: WizardManager + private lateinit var manager: WizardManager @Mock - private lateinit var navigatorLiveDataObserver: Observer + private lateinit var navigatorLiveDataObserver: Observer @Before fun setUp() { @@ -81,7 +79,7 @@ class WizardManagerTest : BaseUnitTest() { manager.showNextStep() } - private fun createWizardManager(initialStepIndex: Int): WizardManager { + private fun createWizardManager(initialStepIndex: Int): WizardManager { val wizardManager = WizardManager(STEPS) wizardManager.setCurrentStepIndex(initialStepIndex) return wizardManager From 6bcf7f63ad40c3aff9d474f359c707d2980f5719 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:48:34 -0600 Subject: [PATCH 09/26] Convert AutolinkUtilsTest to JVM unit test in `:libs:utils` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves from androidTest to libs:utils/src/test and removes the unnecessary @HiltAndroidTest annotation — the test only exercises pure static methods and never needed DI or device runtime. Co-Authored-By: Claude Opus 4.6 --- .../wordpress/android/util/AutolinkUtilsTest.java | 13 ------------- 1 file changed, 13 deletions(-) rename {WordPress/src/androidTest => libs/utils/src/test}/java/org/wordpress/android/util/AutolinkUtilsTest.java (92%) diff --git a/WordPress/src/androidTest/java/org/wordpress/android/util/AutolinkUtilsTest.java b/libs/utils/src/test/java/org/wordpress/android/util/AutolinkUtilsTest.java similarity index 92% rename from WordPress/src/androidTest/java/org/wordpress/android/util/AutolinkUtilsTest.java rename to libs/utils/src/test/java/org/wordpress/android/util/AutolinkUtilsTest.java index 9211bac70764..51dfe45627e1 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/util/AutolinkUtilsTest.java +++ b/libs/utils/src/test/java/org/wordpress/android/util/AutolinkUtilsTest.java @@ -1,23 +1,10 @@ package org.wordpress.android.util; -import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import dagger.hilt.android.testing.HiltAndroidRule; -import dagger.hilt.android.testing.HiltAndroidTest; - import static junit.framework.TestCase.assertEquals; -@HiltAndroidTest public class AutolinkUtilsTest { - @Rule - public HiltAndroidRule hiltRule = new HiltAndroidRule(this); - - @Before - public void setUp() { - hiltRule.inject(); - } @Test public void testNullString() { From 2fcb94712e7c12232266381a6c38772b04d149be Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Wed, 1 Apr 2026 22:48:44 -0600 Subject: [PATCH 10/26] Remove unnecessary Hilt annotations from UrlUtilsTest and WPUrlUtilsTest Both tests only exercise pure static methods and never use injected dependencies. They remain as instrumented tests because the underlying code uses android.net.Uri which requires Android runtime. Co-Authored-By: Claude Opus 4.6 --- .../java/org/wordpress/android/util/UrlUtilsTest.java | 3 --- .../java/org/wordpress/android/util/WPUrlUtilsTest.java | 3 --- 2 files changed, 6 deletions(-) diff --git a/WordPress/src/androidTest/java/org/wordpress/android/util/UrlUtilsTest.java b/WordPress/src/androidTest/java/org/wordpress/android/util/UrlUtilsTest.java index dddd3b289f15..aed16246f43d 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/util/UrlUtilsTest.java +++ b/WordPress/src/androidTest/java/org/wordpress/android/util/UrlUtilsTest.java @@ -2,11 +2,8 @@ import org.junit.Test; -import dagger.hilt.android.testing.HiltAndroidTest; - import static junit.framework.TestCase.assertEquals; -@HiltAndroidTest public class UrlUtilsTest { @Test public void testGetHost1() { diff --git a/WordPress/src/androidTest/java/org/wordpress/android/util/WPUrlUtilsTest.java b/WordPress/src/androidTest/java/org/wordpress/android/util/WPUrlUtilsTest.java index 8813d01b20a7..7860c0af498f 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/util/WPUrlUtilsTest.java +++ b/WordPress/src/androidTest/java/org/wordpress/android/util/WPUrlUtilsTest.java @@ -7,12 +7,9 @@ import java.net.URISyntaxException; import java.net.URL; -import dagger.hilt.android.testing.HiltAndroidTest; - import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; -@HiltAndroidTest public class WPUrlUtilsTest { private static final String WPCOM_ADDRESS_1 = "http://wordpress.com/xmlrpc.php"; private static final String WPCOM_ADDRESS_2 = "http://wordpress.com#.b.com/test"; From a5a14a55fac2604506d5874a61c3d100dc32e008 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:36:40 -0600 Subject: [PATCH 11/26] Move 13 self-contained widget classes to `:libs:core-ui` These widgets have no app-module dependencies (only Android framework, AndroidX, Material, and wordpress-utils), making them safe to share across library modules. Moved: CheckedLinearLayout, ColorUnderlineSpan, HeaderGridView, NestedCoordinatorLayout, NoticonTextView, RecyclerItemDecoration, TypefaceCache, WPNestedScrollView, WPScrollView, WPSnackbar, WPViewPager, WPViewPager2Transformer, WPViewPagerTransformer. Co-Authored-By: Claude Opus 4.6 --- .../java/org/wordpress/android/widgets/CheckedLinearLayout.java | 0 .../main/java/org/wordpress/android/widgets/ColorUnderlineSpan.kt | 0 .../main/java/org/wordpress/android/widgets/HeaderGridView.java | 0 .../java/org/wordpress/android/widgets/NestedCoordinatorLayout.kt | 0 .../main/java/org/wordpress/android/widgets/NoticonTextView.java | 0 .../org/wordpress/android/widgets/RecyclerItemDecoration.java | 0 .../main/java/org/wordpress/android/widgets/TypefaceCache.java | 0 .../java/org/wordpress/android/widgets/WPNestedScrollView.java | 0 .../src/main/java/org/wordpress/android/widgets/WPScrollView.java | 0 .../src/main/java/org/wordpress/android/widgets/WPSnackbar.kt | 0 .../src/main/java/org/wordpress/android/widgets/WPViewPager.java | 0 .../java/org/wordpress/android/widgets/WPViewPager2Transformer.kt | 0 .../org/wordpress/android/widgets/WPViewPagerTransformer.java | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/CheckedLinearLayout.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/ColorUnderlineSpan.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/HeaderGridView.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/NestedCoordinatorLayout.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/NoticonTextView.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/RecyclerItemDecoration.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/TypefaceCache.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/WPNestedScrollView.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/WPScrollView.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/WPSnackbar.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/WPViewPager.java (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/WPViewPager2Transformer.kt (100%) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/widgets/WPViewPagerTransformer.java (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/CheckedLinearLayout.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/CheckedLinearLayout.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/CheckedLinearLayout.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/CheckedLinearLayout.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/ColorUnderlineSpan.kt b/libs/core-ui/src/main/java/org/wordpress/android/widgets/ColorUnderlineSpan.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/ColorUnderlineSpan.kt rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/ColorUnderlineSpan.kt diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/HeaderGridView.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/HeaderGridView.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/HeaderGridView.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/HeaderGridView.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/NestedCoordinatorLayout.kt b/libs/core-ui/src/main/java/org/wordpress/android/widgets/NestedCoordinatorLayout.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/NestedCoordinatorLayout.kt rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/NestedCoordinatorLayout.kt diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/NoticonTextView.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/NoticonTextView.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/NoticonTextView.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/NoticonTextView.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/RecyclerItemDecoration.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/RecyclerItemDecoration.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/RecyclerItemDecoration.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/RecyclerItemDecoration.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/TypefaceCache.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/TypefaceCache.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/TypefaceCache.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/TypefaceCache.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPNestedScrollView.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/WPNestedScrollView.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/WPNestedScrollView.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/WPNestedScrollView.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/WPScrollView.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/WPScrollView.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/WPScrollView.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPSnackbar.kt b/libs/core-ui/src/main/java/org/wordpress/android/widgets/WPSnackbar.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/WPSnackbar.kt rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/WPSnackbar.kt diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPViewPager.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/WPViewPager.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/WPViewPager.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/WPViewPager.java diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPViewPager2Transformer.kt b/libs/core-ui/src/main/java/org/wordpress/android/widgets/WPViewPager2Transformer.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/WPViewPager2Transformer.kt rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/WPViewPager2Transformer.kt diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPViewPagerTransformer.java b/libs/core-ui/src/main/java/org/wordpress/android/widgets/WPViewPagerTransformer.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/widgets/WPViewPagerTransformer.java rename to libs/core-ui/src/main/java/org/wordpress/android/widgets/WPViewPagerTransformer.java From 65400477420513cd24f2284e507045f7052d2ff4 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:36:47 -0600 Subject: [PATCH 12/26] Move DateProvider and SiteAccessibilityInfo to `:libs:utils` Both are generic utility types with zero app-module dependencies. DateProvider wraps java.util.Date; SiteAccessibilityInfo is a pure data class with a SiteVisibility enum. Moving them to utils prepares for Reader module extraction. Co-Authored-By: Claude Opus 4.6 --- .../java/org/wordpress/android/ui/reader/utils/DateProvider.kt | 0 .../wordpress/android/ui/reader/utils/SiteAccessibilityInfo.kt | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/ui/reader/utils/DateProvider.kt (100%) rename {WordPress => libs/utils}/src/main/java/org/wordpress/android/ui/reader/utils/SiteAccessibilityInfo.kt (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/DateProvider.kt b/libs/utils/src/main/java/org/wordpress/android/ui/reader/utils/DateProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/DateProvider.kt rename to libs/utils/src/main/java/org/wordpress/android/ui/reader/utils/DateProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/SiteAccessibilityInfo.kt b/libs/utils/src/main/java/org/wordpress/android/ui/reader/utils/SiteAccessibilityInfo.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/SiteAccessibilityInfo.kt rename to libs/utils/src/main/java/org/wordpress/android/ui/reader/utils/SiteAccessibilityInfo.kt From 001a932cfb4ad309c429c52d366f6741a82df2da Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:58:09 -0600 Subject: [PATCH 13/26] Move Organization enum to `:libs:core-ui` Zero-dependency enum used by Reader models and other features. Moving to core-ui makes it available to all library modules. Co-Authored-By: Claude Opus 4.6 --- .../src/main/java/org/wordpress/android/ui/Organization.kt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/Organization.kt (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/Organization.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/Organization.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/Organization.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/Organization.kt From dd0a528f9a756b1bf07ef335b57d189b4141916c Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 10:58:36 -0600 Subject: [PATCH 14/26] Extract `:libs:reader-models` module from `:WordPress` Moves Reader models, datasets, constants, and pure utility functions into a dedicated library module. This enables non-Reader features (notifications, engagement, posts) to depend on Reader data types without depending on the full Reader UI. Moved 47 files: - 16 Reader model classes (ReaderPost, ReaderTag, ReaderBlog, etc.) - 17 dataset/table classes + 4 wrappers (ReaderPostTable, etc.) - 5 reader model POJOs (ReaderBlogIdPostId, ReaderSimplePost, etc.) - ReaderConstants, ReaderActions, ReaderHtmlUtils, ReaderImageScanner - FilterCriteria interface Key refactors: - ReaderDatabase: replaced WordPress.getContext() singleton with init(Context) pattern called from AppInitializer - Created ReaderSlugUtils with model-layer methods extracted from ReaderUtils (sanitizeWithDashes, getTagFromTagName, getResizedImageUrl, etc.) - ReaderPostDiscoverData: getAttributionHtml() now takes Context param - ReaderPostTable: hardcoded "View original" in rare fallback path - ReaderUserTable: replaced WPAvatarUtils with PhotonUtils - Split ReaderRepositoryEvent out of ReaderRepositoryEvents.kt Co-Authored-By: Claude Opus 4.6 --- WordPress/build.gradle | 1 + .../org/wordpress/android/AppInitializer.kt | 1 + .../repository/ReaderRepositoryEvents.kt | 4 - .../android/ui/reader/utils/ReaderUtils.kt | 143 +++------------ libs/reader-models/build.gradle | 50 ++++++ .../android/datasets/BlockedAuthorTable.java | 0 .../datasets/ReaderBlockedBlogTable.java | 0 .../android/datasets/ReaderBlogTable.java | 0 .../android/datasets/ReaderCommentTable.java | 0 .../android/datasets/ReaderDatabase.java | 26 ++- .../datasets/ReaderDiscoverCardsTable.kt | 0 .../android/datasets/ReaderLikeTable.java | 0 .../android/datasets/ReaderPostTable.java | 12 +- .../android/datasets/ReaderSearchTable.java | 0 .../android/datasets/ReaderTagTable.java | 0 .../datasets/ReaderThumbnailTable.java | 0 .../android/datasets/ReaderUserTable.java | 4 +- .../wrappers/ReaderCommentTableWrapper.kt | 0 .../wrappers/ReaderDatabaseWrapper.kt | 0 .../wrappers/ReaderPostTableWrapper.kt | 0 .../wrappers/ReaderTagTableWrapper.kt | 0 .../android/models/FilterCriteria.java | 0 .../wordpress/android/models/ReaderBlog.java | 0 .../android/models/ReaderBlogList.java | 0 .../android/models/ReaderCardType.java | 0 .../android/models/ReaderComment.java | 0 .../android/models/ReaderCommentList.java | 0 .../wordpress/android/models/ReaderPost.java | 6 +- .../models/ReaderPostDiscoverData.java | 6 +- .../android/models/ReaderPostList.java | 0 .../wordpress/android/models/ReaderTag.java | 4 +- .../android/models/ReaderTagList.java | 0 .../android/models/ReaderTagListExtension.kt | 0 .../android/models/ReaderTagType.java | 0 .../wordpress/android/models/ReaderUser.java | 0 .../android/models/ReaderUserIdList.java | 0 .../android/models/ReaderUserList.java | 0 .../models/discover/ReaderDiscoverCards.kt | 0 .../android/ui/reader/ReaderConstants.java | 0 .../ui/reader/actions/ReaderActions.java | 0 .../ui/reader/models/ReaderBlogIdPostId.java | 0 .../reader/models/ReaderBlogIdPostIdList.java | 0 .../ui/reader/models/ReaderImageList.java | 0 .../ui/reader/models/ReaderSimplePost.java | 0 .../reader/models/ReaderSimplePostList.java | 0 .../repository/ReaderRepositoryEvent.kt | 5 + .../ui/reader/utils/ReaderHtmlUtils.kt | 0 .../ui/reader/utils/ReaderImageScanner.kt | 0 .../ui/reader/utils/ReaderSlugUtils.kt | 166 ++++++++++++++++++ .../android/ui/reader/utils/SrcsetImage.kt | 0 .../src/main/res/values/strings.xml | 8 + settings.gradle | 1 + 52 files changed, 293 insertions(+), 144 deletions(-) create mode 100644 libs/reader-models/build.gradle rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/BlockedAuthorTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderBlockedBlogTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderCommentTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java (95%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTable.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java (99%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderThumbnailTable.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java (98%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/wrappers/ReaderCommentTableWrapper.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/wrappers/ReaderDatabaseWrapper.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/wrappers/ReaderPostTableWrapper.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/wrappers/ReaderTagTableWrapper.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/FilterCriteria.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderBlog.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderBlogList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderCardType.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderComment.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderCommentList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderPost.java (99%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java (97%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderPostList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderTag.java (98%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderTagList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderTagListExtension.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderTagType.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderUser.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderUserIdList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/ReaderUserList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/models/discover/ReaderDiscoverCards.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/ReaderConstants.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/actions/ReaderActions.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostId.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostIdList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/models/ReaderImageList.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePost.java (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePostList.java (100%) create mode 100644 libs/reader-models/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvent.kt rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderHtmlUtils.kt (100%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScanner.kt (100%) create mode 100644 libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderSlugUtils.kt rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/ui/reader/utils/SrcsetImage.kt (100%) create mode 100644 libs/reader-models/src/main/res/values/strings.xml diff --git a/WordPress/build.gradle b/WordPress/build.gradle index eaa28b8bfb34..46c5a3cb221b 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -368,6 +368,7 @@ dependencies { implementation project(":libs:posttypes") implementation project(":libs:core-ui") implementation project(":libs:utils") + implementation project(":libs:reader-models") implementation("$gradle.ext.aboutAutomatticBinaryPath:${libs.versions.automattic.about.get()}") implementation("$gradle.ext.gutenbergKitBinaryPath:${libs.versions.gutenberg.kit.get()}") diff --git a/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt b/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt index 8a4ac58a6908..bf2c43d773c2 100644 --- a/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt +++ b/WordPress/src/main/java/org/wordpress/android/AppInitializer.kt @@ -307,6 +307,7 @@ class AppInitializer @Inject constructor( WordPress.versionName = PackageUtils.getVersionName(application) initWpDb() + ReaderDatabase.init(application) context?.let { enableHttpResponseCache(it) } AppReviewManager.init(application) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt index 02ba7ca372af..8997aa379956 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvents.kt @@ -2,10 +2,6 @@ package org.wordpress.android.ui.reader.repository import org.wordpress.android.ui.reader.services.discover.ReaderDiscoverLogic.DiscoverTasks -sealed class ReaderRepositoryEvent { - object ReaderPostTableActionEnded : ReaderRepositoryEvent() -} - sealed class ReaderRepositoryCommunication { object Started : ReaderRepositoryCommunication() object Success : ReaderRepositoryCommunication() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderUtils.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderUtils.kt index 56768be4dfd0..de074575eca1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderUtils.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderUtils.kt @@ -27,16 +27,9 @@ object ReaderUtils { height: Int, isPrivate: Boolean, isPrivateAtomic: Boolean - ): String { - return getResizedImageUrl( - imageUrl = imageUrl, - width = width, - height = height, - isPrivate = isPrivate, - isPrivateAtomic = isPrivateAtomic, - quality = PhotonUtils.Quality.MEDIUM - ) - } + ): String = ReaderSlugUtils.getResizedImageUrl( + imageUrl, width, height, isPrivate, isPrivateAtomic + ) @JvmStatic @Suppress("LongParameterList") @@ -47,25 +40,10 @@ object ReaderUtils { isPrivate: Boolean, isPrivateAtomic: Boolean, quality: PhotonUtils.Quality - ): String { - val unescapedUrl = StringEscapeUtils.unescapeHtml4(imageUrl) - return if (isPrivate && !isPrivateAtomic) { - getImageForDisplayWithoutPhoton( - imageUrl = unescapedUrl, - width = width, - height = height, - forceHttps = true - ) - } else { - PhotonUtils.getPhotonImageUrl( - unescapedUrl, - width, - height, - quality, - isPrivateAtomic - ) - } - } + ): String = ReaderSlugUtils.getResizedImageUrl( + imageUrl, width, height, + isPrivate, isPrivateAtomic, quality + ) fun getResizedImageUrl( imageUrl: String, @@ -109,20 +87,13 @@ object ReaderUtils { } } - /* - * use this to request a reduced size image from not photon capable sites - * (i.e. a private post - images in private posts can't use photon - * but these are usually wp images so they support the h= and w= query params) - */ private fun getImageForDisplayWithoutPhoton( imageUrl: String, width: Int, height: Int, forceHttps: Boolean ): String { - if (imageUrl.isEmpty()) { - return "" - } + if (imageUrl.isEmpty()) return "" val query = if (width > 0 && height > 0) { "?w=$width&h=$height" } else if (width > 0) { @@ -132,12 +103,11 @@ object ReaderUtils { } else { "" } - return if (forceHttps) { - // remove the existing query string, add the new one, and make sure the url is https: - UrlUtils.removeQuery(UrlUtils.makeHttps(imageUrl)) + query + UrlUtils.removeQuery( + UrlUtils.makeHttps(imageUrl) + ) + query } else { - // remove the existing query string, add the new one UrlUtils.removeQuery(imageUrl) + query } } @@ -148,32 +118,8 @@ object ReaderUtils { * http://stackoverflow.com/a/1612015/1673548 */ @JvmStatic - fun sanitizeWithDashes(title: String): String { - val trimmedTitle = title.trim() - return if (isValidUrlEncodedString(trimmedTitle) - ) { - trimmedTitle - } else { - trimmedTitle - .replace("&[^\\s]*;".toRegex(), "") // remove html entities - .replace("[\\.\\s]+".toRegex(), "-") // replace periods and whitespace with a dash - .replace( - "[^\\p{L}\\p{Nd}\\-]+".toRegex(), - "" - ) // remove remaining non-alphanumeric/non-dash chars (Unicode aware) - .replace("--".toRegex(), "-") // reduce double dashes potentially added above - } - } - - @Suppress("SwallowedException") - private fun isValidUrlEncodedString(title: String): Boolean { - try { - URI.create(title) - return true - } catch (e: IllegalArgumentException) { - return false - } - } + fun sanitizeWithDashes(title: String): String = + ReaderSlugUtils.sanitizeWithDashes(title) /* * returns the long text to use for a like label ("Liked by 3 people", etc.) @@ -298,28 +244,16 @@ object ReaderUtils { fun getTagFromTagName( tagName: String, tagType: ReaderTagType - ): ReaderTag { - return getTagFromTagName( - tagName = tagName, - tagType = tagType, - markDefaultIfInMemory = false - ) - } + ): ReaderTag = ReaderSlugUtils.getTagFromTagName(tagName, tagType) @JvmStatic fun getTagFromTagName( tagName: String, tagType: ReaderTagType, markDefaultIfInMemory: Boolean - ): ReaderTag { - val tag = ReaderTagTable.getTag(tagName, tagType) - return tag - ?: createTagFromTagName( - tagName = tagName, - tagType = tagType, - isDefaultInMemoryTag = markDefaultIfInMemory - ) - } + ): ReaderTag = ReaderSlugUtils.getTagFromTagName( + tagName, tagType, markDefaultIfInMemory + ) @JvmOverloads @JvmStatic @@ -327,18 +261,9 @@ object ReaderUtils { tagName: String, tagType: ReaderTagType, isDefaultInMemoryTag: Boolean = false - ): ReaderTag { - val tagSlug = sanitizeWithDashes(tagName).lowercase() - val tagDisplayName = if (tagType == ReaderTagType.DEFAULT) tagName else tagSlug - return ReaderTag( - tagSlug, - tagDisplayName, - tagName, - null, - tagType, - isDefaultInMemoryTag - ) - } + ): ReaderTag = ReaderSlugUtils.createTagFromTagName( + tagName, tagType, isDefaultInMemoryTag + ) /* * returns the default tag, which is the one selected by default in the reader when @@ -543,30 +468,14 @@ object ReaderUtils { } @JvmStatic - fun getCommaSeparatedTagSlugs(tags: ReaderTagList): String { - val slugs = StringBuilder() - tags.forEach { tag -> - if (slugs.isNotEmpty()) { - slugs.append(",") - } - val tagNameForApi = sanitizeWithDashes(tag.tagSlug) - slugs.append(tagNameForApi) - } - return slugs.toString() - } + fun getCommaSeparatedTagSlugs(tags: ReaderTagList): String = + ReaderSlugUtils.getCommaSeparatedTagSlugs(tags) @JvmStatic - fun getTagsFromCommaSeparatedSlugs(commaSeparatedTagSlugs: String): ReaderTagList { - val tags = ReaderTagList() - if (commaSeparatedTagSlugs.trim().isNotEmpty()) { - val slugs = commaSeparatedTagSlugs.split(",".toRegex()) - slugs.forEach { slug -> - val tag = getTagFromTagName(slug, ReaderTagType.DEFAULT) - tags.add(tag) - } - } - return tags - } + fun getTagsFromCommaSeparatedSlugs( + commaSeparatedTagSlugs: String + ): ReaderTagList = ReaderSlugUtils + .getTagsFromCommaSeparatedSlugs(commaSeparatedTagSlugs) /** * isExternalFeed identifies an external RSS feed diff --git a/libs/reader-models/build.gradle b/libs/reader-models/build.gradle new file mode 100644 index 000000000000..3031d1a02202 --- /dev/null +++ b/libs/reader-models/build.gradle @@ -0,0 +1,50 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.dependency.analysis) +} + +android { + namespace "org.wordpress.android.readermodels" + + defaultConfig { + compileSdk rootProject.compileSdkVersion + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + targetCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + } +} + +dependencies { + // Internal modules + implementation project(":libs:core-ui") + implementation project(":libs:utils") + implementation project(":libs:fluxc") + + // WordPress utils (AppLog, UrlUtils, StringUtils, etc.) + implementation("$gradle.ext.wputilsBinaryPath") { + version { + strictly libs.wordpress.utils.get().version + } + } + + // AndroidX + implementation libs.androidx.annotation + implementation libs.androidx.core.ktx + + // EventBus (used by ReaderDatabase for post-table events) + implementation libs.greenrobot.eventbus.main + + // Apache commons-text (for StringEscapeUtils in image URL handling) + implementation libs.apache.commons.text + + // Dagger (for @Inject and @Reusable on wrapper classes) + implementation libs.google.dagger +} diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/BlockedAuthorTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/BlockedAuthorTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/BlockedAuthorTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/BlockedAuthorTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlockedBlogTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlockedBlogTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlockedBlogTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlockedBlogTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlogTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderCommentTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderCommentTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderCommentTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderCommentTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java similarity index 95% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java index c50a577965f6..2a9ca469f500 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java +++ b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDatabase.java @@ -5,13 +5,12 @@ import android.database.sqlite.SQLiteOpenHelper; import org.greenrobot.eventbus.EventBus; -import org.wordpress.android.WordPress; import org.wordpress.android.models.ReaderPostList; import org.wordpress.android.models.ReaderTag; import org.wordpress.android.models.ReaderTagList; import org.wordpress.android.models.ReaderTagType; import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.ReaderPostTableActionEnded; -import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.ui.reader.utils.ReaderSlugUtils; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.DateTimeUtils; @@ -126,17 +125,32 @@ public class ReaderDatabase extends SQLiteOpenHelper { private static ReaderDatabase mReaderDb; private static final Object DB_LOCK = new Object(); - public static ReaderDatabase getDatabase() { + /** + * Initialize the ReaderDatabase singleton with an application context. + * Must be called once at app startup (e.g. in Application.onCreate()). + */ + public static void init(Context context) { if (mReaderDb == null) { synchronized (DB_LOCK) { if (mReaderDb == null) { - mReaderDb = new ReaderDatabase(WordPress.getContext()); + mReaderDb = new ReaderDatabase( + context.getApplicationContext() + ); // this ensures that onOpen() is called with a writable database // (open will fail if app calls getReadableDb() first) mReaderDb.getWritableDatabase(); } } } + } + + public static ReaderDatabase getDatabase() { + if (mReaderDb == null) { + throw new IllegalStateException( + "ReaderDatabase not initialized — " + + "call ReaderDatabase.init(context) first" + ); + } return mReaderDb; } @@ -250,7 +264,7 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE tbl_posts ADD author_blog_url TEXT;"); currentVersion++; case 150: - String followedSitesTagSlug = ReaderUtils.sanitizeWithDashes(ReaderTag.TAG_TITLE_FOLLOWED_SITES); + String followedSitesTagSlug = ReaderSlugUtils.sanitizeWithDashes(ReaderTag.TAG_TITLE_FOLLOWED_SITES); db.execSQL("DELETE FROM tbl_posts WHERE tag_name=?", new String[]{followedSitesTagSlug}); db.execSQL("DELETE FROM tbl_posts WHERE tag_name='' AND tag_type=0"); db.execSQL("UPDATE tbl_tags SET date_updated=? WHERE tag_slug=? AND tag_type=?", @@ -385,7 +399,7 @@ public void run() { */ private void copyDatabase(SQLiteDatabase db) { String copyFrom = db.getPath(); - String copyTo = WordPress.getContext().getExternalFilesDir(null).getAbsolutePath() + "/" + DB_NAME; + String copyTo = db.getPath().replace(DB_NAME, "copy_" + DB_NAME); try { InputStream input = new FileInputStream(copyFrom); diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTable.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTable.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTable.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTable.kt diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderLikeTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java index 6235ba23151c..b94b18bc8bb1 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java +++ b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderPostTable.java @@ -11,8 +11,6 @@ import androidx.annotation.Nullable; import org.greenrobot.eventbus.EventBus; -import org.wordpress.android.R; -import org.wordpress.android.WordPress; import org.wordpress.android.models.ReaderCardType; import org.wordpress.android.models.ReaderPost; import org.wordpress.android.models.ReaderPostList; @@ -24,7 +22,7 @@ import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostIdList; import org.wordpress.android.ui.reader.repository.ReaderRepositoryEvent.ReaderPostTableActionEnded; -import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.ui.reader.utils.ReaderSlugUtils; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.SqlUtils; @@ -841,10 +839,12 @@ private static String maxText(final ReaderPost post) { // with a link to the full article if (post.hasExcerpt()) { AppLog.w(AppLog.T.READER, "reader post table > max text exceeded, storing excerpt"); + // Hardcoded because this HTML is stored in the database, not + // displayed directly in UI, and this is a rare fallback path. return "

" + post.getExcerpt() + "

" + String.format("

%s

", post.getUrl(), - WordPress.getContext().getString(R.string.reader_label_view_original)); + "View original"); } else { AppLog.w(AppLog.T.READER, "reader post table > max text exceeded, storing truncated text"); return post.getText().substring(0, MAX_TEXT_LEN); @@ -928,7 +928,7 @@ public static void addOrUpdatePosts(final ReaderTag tag, ReaderPostList posts) { stmtPosts.bindLong(45, SqlUtils.boolToSql(post.useExcerpt)); stmtPosts.bindLong(46, SqlUtils.boolToSql(post.isBookmarked)); stmtPosts.bindLong(47, SqlUtils.boolToSql(post.isPrivateAtomic)); - stmtPosts.bindString(48, ReaderUtils.getCommaSeparatedTagSlugs(post.getTags())); + stmtPosts.bindString(48, ReaderSlugUtils.getCommaSeparatedTagSlugs(post.getTags())); stmtPosts.bindLong(49, post.organizationId); stmtPosts.bindLong(50, SqlUtils.boolToSql(post.isSeen)); stmtPosts.bindLong(51, SqlUtils.boolToSql(post.isSeenSupported)); @@ -1200,7 +1200,7 @@ private static ReaderPost getPostFromCursor(Cursor c) { String commaSeparatedTags = (c.getString(c.getColumnIndexOrThrow("tags"))); if (commaSeparatedTags != null) { - post.setTags(ReaderUtils.getTagsFromCommaSeparatedSlugs(commaSeparatedTags)); + post.setTags(ReaderSlugUtils.getTagsFromCommaSeparatedSlugs(commaSeparatedTags)); } post.organizationId = c.getInt(c.getColumnIndexOrThrow("organization_id")); diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderSearchTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderTagTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderThumbnailTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderThumbnailTable.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderThumbnailTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderThumbnailTable.java diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java index e8222d43127b..fee051837446 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java +++ b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderUserTable.java @@ -7,7 +7,7 @@ import org.wordpress.android.models.ReaderUser; import org.wordpress.android.models.ReaderUserIdList; import org.wordpress.android.models.ReaderUserList; -import org.wordpress.android.util.WPAvatarUtils; +import org.wordpress.android.util.PhotonUtils; import org.wordpress.android.util.SqlUtils; import java.util.ArrayList; @@ -108,7 +108,7 @@ public static ArrayList getAvatarUrls(ReaderUserIdList userIds, int max, if (c.moveToFirst()) { do { long userId = c.getLong(0); - String url = WPAvatarUtils.rewriteAvatarUrl(c.getString(1), avatarSz); + String url = PhotonUtils.getPhotonImageUrl(c.getString(1), avatarSz, avatarSz); // add current user to the top if (userId == wpComUserId) { avatars.add(0, url); diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderCommentTableWrapper.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderCommentTableWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderCommentTableWrapper.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderCommentTableWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderDatabaseWrapper.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderDatabaseWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderDatabaseWrapper.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderDatabaseWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderPostTableWrapper.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderPostTableWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderPostTableWrapper.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderPostTableWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderTagTableWrapper.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderTagTableWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/wrappers/ReaderTagTableWrapper.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/wrappers/ReaderTagTableWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/models/FilterCriteria.java b/libs/reader-models/src/main/java/org/wordpress/android/models/FilterCriteria.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/FilterCriteria.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/FilterCriteria.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderBlog.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderBlog.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderBlogList.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderBlogList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderBlogList.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderBlogList.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderCardType.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderCardType.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderCardType.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderCardType.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderComment.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderComment.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderCommentList.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderCommentList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderCommentList.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderCommentList.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPost.java similarity index 99% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPost.java index 74ba22f872f3..4161ede2899a 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -8,7 +8,7 @@ import org.wordpress.android.ui.Organization; import org.wordpress.android.ui.reader.ReaderConstants; import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId; -import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.ui.reader.utils.ReaderSlugUtils; import org.wordpress.android.util.DateTimeUtilsWrapper; import org.wordpress.android.util.HtmlUtils; import org.wordpress.android.util.JSONUtils; @@ -313,7 +313,7 @@ private static void assignTagsFromJson(ReaderPost post, JSONObject jsonTags) { JSONObject jsonThisTag = jsonTags.optJSONObject(it.next()); String thisTagName = UrlUtils.urlDecode(JSONUtils.getString(jsonThisTag, "slug")); - ReaderTag tag = ReaderUtils.getTagFromTagName(thisTagName, ReaderTagType.DEFAULT); + ReaderTag tag = ReaderSlugUtils.getTagFromTagName(thisTagName, ReaderTagType.DEFAULT); tags.add(tag); // if the number of posts on this blog that use this tag is higher than previous, @@ -728,7 +728,7 @@ public String getFeaturedImageForDisplay(int width, int height) { if (!hasFeaturedImage()) { mFeaturedImageForDisplay = ""; } else { - mFeaturedImageForDisplay = ReaderUtils.getResizedImageUrl( + mFeaturedImageForDisplay = ReaderSlugUtils.getResizedImageUrl( mFeaturedImage, width, height, isPrivate, isPrivateAtomic); } } diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java similarity index 97% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java index d02d2cf0cd02..2b2938a61be5 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java +++ b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPostDiscoverData.java @@ -9,8 +9,7 @@ import org.json.JSONArray; import org.json.JSONObject; -import org.wordpress.android.R; -import org.wordpress.android.WordPress; +import org.wordpress.android.readermodels.R; import org.wordpress.android.util.JSONUtils; import org.wordpress.android.util.StringUtils; @@ -131,12 +130,11 @@ public DiscoverType getDiscoverType() { private transient Spanned mAttributionHtml; @NonNull - public Spanned getAttributionHtml() { + public Spanned getAttributionHtml(Context context) { if (mAttributionHtml == null) { String html; String author = "" + getAuthorName() + ""; String blog = "" + getBlogName() + ""; - Context context = WordPress.getContext(); switch (getDiscoverType()) { case EDITOR_PICK: diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPostList.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPostList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderPostList.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderPostList.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderTag.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTag.java similarity index 98% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderTag.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTag.java index f5027936fd33..af844a7340e7 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderTag.java +++ b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTag.java @@ -4,7 +4,7 @@ import org.wordpress.android.ui.Organization; import org.wordpress.android.ui.reader.ReaderConstants; -import org.wordpress.android.ui.reader.utils.ReaderUtils; +import org.wordpress.android.ui.reader.utils.ReaderSlugUtils; import org.wordpress.android.util.StringUtils; import java.io.Serializable; @@ -55,7 +55,7 @@ public ReaderTag(String slug, if (tagType == ReaderTagType.BOOKMARKED) { setTagSlug(TAG_SLUG_BOOKMARKED); } else if (!TextUtils.isEmpty(title)) { - setTagSlug(ReaderUtils.sanitizeWithDashes(title)); + setTagSlug(ReaderSlugUtils.sanitizeWithDashes(title)); } else { setTagSlug(getTagSlugFromEndpoint(endpoint)); } diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderTagList.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTagList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderTagList.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTagList.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderTagListExtension.kt b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTagListExtension.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderTagListExtension.kt rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTagListExtension.kt diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderTagType.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTagType.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderTagType.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderTagType.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderUser.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderUser.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderUserIdList.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderUserIdList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderUserIdList.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderUserIdList.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderUserList.java b/libs/reader-models/src/main/java/org/wordpress/android/models/ReaderUserList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/ReaderUserList.java rename to libs/reader-models/src/main/java/org/wordpress/android/models/ReaderUserList.java diff --git a/WordPress/src/main/java/org/wordpress/android/models/discover/ReaderDiscoverCards.kt b/libs/reader-models/src/main/java/org/wordpress/android/models/discover/ReaderDiscoverCards.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/models/discover/ReaderDiscoverCards.kt rename to libs/reader-models/src/main/java/org/wordpress/android/models/discover/ReaderDiscoverCards.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderConstants.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/ReaderConstants.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderConstants.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/ReaderConstants.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderActions.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/actions/ReaderActions.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderActions.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/actions/ReaderActions.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostId.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostId.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostId.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostId.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostIdList.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostIdList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostIdList.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderBlogIdPostIdList.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderImageList.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderImageList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderImageList.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderImageList.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePost.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePost.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePost.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePost.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePostList.java b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePostList.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePostList.java rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/models/ReaderSimplePostList.java diff --git a/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvent.kt b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvent.kt new file mode 100644 index 000000000000..ce691f05707f --- /dev/null +++ b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/repository/ReaderRepositoryEvent.kt @@ -0,0 +1,5 @@ +package org.wordpress.android.ui.reader.repository + +sealed class ReaderRepositoryEvent { + object ReaderPostTableActionEnded : ReaderRepositoryEvent() +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderHtmlUtils.kt b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderHtmlUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderHtmlUtils.kt rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderHtmlUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScanner.kt b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScanner.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScanner.kt rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScanner.kt diff --git a/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderSlugUtils.kt b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderSlugUtils.kt new file mode 100644 index 000000000000..301c462ef4d0 --- /dev/null +++ b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/ReaderSlugUtils.kt @@ -0,0 +1,166 @@ +package org.wordpress.android.ui.reader.utils + +import org.wordpress.android.datasets.ReaderTagTable +import org.wordpress.android.models.ReaderTag +import org.wordpress.android.models.ReaderTagList +import org.wordpress.android.models.ReaderTagType +import org.wordpress.android.util.PhotonUtils +import org.wordpress.android.util.UrlUtils +import java.net.URI + +/** + * Pure utility methods extracted from ReaderUtils for use by + * reader-models (models and datasets). ReaderUtils in the app module + * delegates to these where possible. + */ +object ReaderSlugUtils { + @JvmStatic + fun sanitizeWithDashes(title: String): String { + val trimmedTitle = title.trim() + return if (isValidUrlEncodedString(trimmedTitle)) { + trimmedTitle + } else { + trimmedTitle + .replace("&[^\\s]*;".toRegex(), "") + .replace("[\\.\\s]+".toRegex(), "-") + .replace( + "[^\\p{L}\\p{Nd}\\-]+".toRegex(), + "" + ) + .replace("--".toRegex(), "-") + } + } + + @JvmStatic + fun getTagFromTagName( + tagName: String, + tagType: ReaderTagType + ): ReaderTag { + return getTagFromTagName(tagName, tagType, false) + } + + @JvmStatic + fun getTagFromTagName( + tagName: String, + tagType: ReaderTagType, + markDefaultIfInMemory: Boolean + ): ReaderTag { + val tag = ReaderTagTable.getTag(tagName, tagType) + return tag ?: createTagFromTagName( + tagName, tagType, markDefaultIfInMemory + ) + } + + @JvmOverloads + @JvmStatic + fun createTagFromTagName( + tagName: String, + tagType: ReaderTagType, + isDefaultInMemoryTag: Boolean = false + ): ReaderTag { + val tagSlug = sanitizeWithDashes(tagName).lowercase() + val tagDisplayName = + if (tagType == ReaderTagType.DEFAULT) tagName else tagSlug + return ReaderTag( + tagSlug, tagDisplayName, tagName, + null, tagType, isDefaultInMemoryTag + ) + } + + @JvmStatic + fun getCommaSeparatedTagSlugs(tags: ReaderTagList): String { + val slugs = StringBuilder() + tags.forEach { tag -> + if (slugs.isNotEmpty()) { + slugs.append(",") + } + slugs.append(sanitizeWithDashes(tag.tagSlug)) + } + return slugs.toString() + } + + @JvmStatic + fun getTagsFromCommaSeparatedSlugs( + commaSeparatedTagSlugs: String + ): ReaderTagList { + val tags = ReaderTagList() + if (commaSeparatedTagSlugs.trim().isNotEmpty()) { + val slugs = commaSeparatedTagSlugs.split(",".toRegex()) + slugs.forEach { slug -> + tags.add(getTagFromTagName(slug, ReaderTagType.DEFAULT)) + } + } + return tags + } + + @JvmStatic + fun getResizedImageUrl( + imageUrl: String, + width: Int, + height: Int, + isPrivate: Boolean, + isPrivateAtomic: Boolean + ): String { + return getResizedImageUrl( + imageUrl, width, height, + isPrivate, isPrivateAtomic, + PhotonUtils.Quality.MEDIUM + ) + } + + @JvmStatic + fun getResizedImageUrl( + imageUrl: String, + width: Int, + height: Int, + isPrivate: Boolean, + isPrivateAtomic: Boolean, + quality: PhotonUtils.Quality + ): String { + val unescapedUrl = org.apache.commons.text + .StringEscapeUtils.unescapeHtml4(imageUrl) + return if (isPrivate && !isPrivateAtomic) { + getImageForDisplayWithoutPhoton( + unescapedUrl, width, height, true + ) + } else { + PhotonUtils.getPhotonImageUrl( + unescapedUrl, width, height, + quality, isPrivateAtomic + ) + } + } + + private fun getImageForDisplayWithoutPhoton( + imageUrl: String, + width: Int, + height: Int, + forceHttps: Boolean + ): String { + if (imageUrl.isEmpty()) return "" + val query = if (width > 0 && height > 0) { + "?w=$width&h=$height" + } else if (width > 0) { + "?w=$width" + } else if (height > 0) { + "?h=$height" + } else { + "" + } + return if (forceHttps) { + UrlUtils.removeQuery(UrlUtils.makeHttps(imageUrl)) + query + } else { + UrlUtils.removeQuery(imageUrl) + query + } + } + + @Suppress("SwallowedException") + private fun isValidUrlEncodedString(title: String): Boolean { + try { + URI.create(title) + return true + } catch (e: IllegalArgumentException) { + return false + } + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/SrcsetImage.kt b/libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/SrcsetImage.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/SrcsetImage.kt rename to libs/reader-models/src/main/java/org/wordpress/android/ui/reader/utils/SrcsetImage.kt diff --git a/libs/reader-models/src/main/res/values/strings.xml b/libs/reader-models/src/main/res/values/strings.xml new file mode 100644 index 000000000000..6792b6a45d09 --- /dev/null +++ b/libs/reader-models/src/main/res/values/strings.xml @@ -0,0 +1,8 @@ + + + View original + Originally posted by %1$s on %2$s + Originally posted by %s + Originally posted on %s + Visit %s + diff --git a/settings.gradle b/settings.gradle index c4b47b20aacf..4cf0651e5226 100644 --- a/settings.gradle +++ b/settings.gradle @@ -107,6 +107,7 @@ include ':libs:fluxc', ':libs:fluxc-annotations', ':libs:fluxc-processor' include ':libs:posttypes' include ':libs:core-ui' include ':libs:utils' +include ':libs:reader-models' include ':libs:core-test' apply from: './config/gradle/included_builds.gradle' From 6a21e831a7a442d2d2fd86936494a5733d426f9d Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:09:41 -0600 Subject: [PATCH 15/26] Extract `:libs:reader` module with 19 clean Reader source files Create the `:libs:reader` library module and move Reader source files that have no WordPress app-layer dependencies. Also move ReaderBlogTableWrapper and ReaderDiscoverCardsTableWrapper to `:libs:reader-models` where they belong alongside their table classes. Fix cross-module smart cast issues in ReaderCommentListActivity, ReaderPostDetailFragment, and SubfilterPageFragment caused by data classes now residing in a different module. Co-Authored-By: Claude Opus 4.6 --- WordPress/build.gradle | 1 + .../ui/reader/ReaderCommentListActivity.kt | 5 +- .../ui/reader/ReaderPostDetailFragment.kt | 5 +- .../reader/subfilter/SubfilterPageFragment.kt | 23 ++++++--- .../datasets/ReaderBlogTableWrapper.kt | 11 +++-- .../ReaderDiscoverCardsTableWrapper.kt | 0 libs/reader/build.gradle | 49 +++++++++++++++++++ .../ui/reader/FollowConversationUiState.kt | 0 .../android/ui/reader/ReaderAnim.java | 0 .../android/ui/reader/ReaderHistoryStack.kt | 0 .../android/ui/reader/ReaderPostHistory.java | 0 .../ReaderSearchSuggestionListeners.kt | 0 .../reader/discover/interests/TagUiState.kt | 0 .../exceptions/ReaderPostFetchException.kt | 0 .../android/ui/reader/reblog/ReblogState.kt | 0 .../services/ServiceCompletionListener.java | 0 .../subfilter/BottomSheetPageEmptyUiState.kt | 0 .../ui/reader/utils/FeaturedImageUtils.kt | 0 .../android/ui/reader/utils/ImageSizeMap.kt | 0 .../ui/reader/utils/ReaderCommentLeveler.java | 0 .../ui/reader/utils/ReaderEmbedScanner.kt | 0 .../utils/ReaderImageScannerProvider.kt | 0 .../ui/reader/utils/ReaderTagWrapper.kt | 0 .../ui/reader/utils/ReaderXPostUtils.java | 0 .../android/ui/reader/utils/TagInfo.kt | 0 .../ui/reader/views/ReaderRecyclerView.java | 0 settings.gradle | 1 + 27 files changed, 79 insertions(+), 16 deletions(-) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt (81%) rename {WordPress => libs/reader-models}/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTableWrapper.kt (100%) create mode 100644 libs/reader/build.gradle rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/FollowConversationUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/ReaderAnim.java (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/ReaderHistoryStack.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/ReaderPostHistory.java (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSearchSuggestionListeners.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/discover/interests/TagUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/exceptions/ReaderPostFetchException.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/reblog/ReblogState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/services/ServiceCompletionListener.java (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/subfilter/BottomSheetPageEmptyUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/FeaturedImageUtils.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderCommentLeveler.java (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderEmbedScanner.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScannerProvider.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderTagWrapper.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/ReaderXPostUtils.java (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/utils/TagInfo.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/ReaderRecyclerView.java (100%) diff --git a/WordPress/build.gradle b/WordPress/build.gradle index 46c5a3cb221b..005a3294df1a 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -369,6 +369,7 @@ dependencies { implementation project(":libs:core-ui") implementation project(":libs:utils") implementation project(":libs:reader-models") + implementation project(":libs:reader") implementation("$gradle.ext.aboutAutomatticBinaryPath:${libs.versions.automattic.about.get()}") implementation("$gradle.ext.gutenbergKitBinaryPath:${libs.versions.gutenberg.kit.get()}") diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt index b6a49042e732..4e7ee8b610b8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt @@ -510,9 +510,10 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), val followText = followItem.actionView!!.findViewById(R.id.follow_button) + val onFollow = uiState.onFollowTapped followItem.actionView!!.setOnClickListener( - if (uiState.onFollowTapped != null) - View.OnClickListener { uiState.onFollowTapped.invoke() } + if (onFollow != null) + View.OnClickListener { onFollow.invoke() } else null ) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt index 71083133c5dd..691f203b19b6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt @@ -638,9 +638,10 @@ class ReaderPostDetailFragment : ViewPagerFragment(), val shimmerView: ShimmerFrameLayout = commentsSnippet.shimmerViewContainer val followText = commentsSnippet.followConversation + val onFollow = uiState.onFollowTapped followText.setOnClickListener( - if (uiState.onFollowTapped != null) { - View.OnClickListener { uiState.onFollowTapped.invoke() } + if (onFollow != null) { + View.OnClickListener { onFollow.invoke() } } else { null } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt index 120886d85947..2ba3ec638e5c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/SubfilterPageFragment.kt @@ -139,32 +139,39 @@ class SubfilterPageFragment : Fragment() { emptyStateContainer.visibility = View.VISIBLE subFilterViewModel.setTitleContainerVisibility(isVisible = false) - if (uiState.title == null) { + val uiTitle = uiState.title + if (uiTitle == null) { title.visibility = View.GONE } else { title.visibility = View.VISIBLE - title.text = uiHelpers.getTextOfUiString(requireContext(), uiState.title) + title.text = uiHelpers.getTextOfUiString(requireContext(), uiTitle) } text.text = uiHelpers.getTextOfUiString(requireContext(), uiState.text) - if (uiState.primaryButton == null) { + val uiPrimaryBtn = uiState.primaryButton + if (uiPrimaryBtn == null) { primaryButton.visibility = View.GONE } else { primaryButton.visibility = View.VISIBLE - primaryButton.text = uiHelpers.getTextOfUiString(requireContext(), uiState.primaryButton.text) + primaryButton.text = uiHelpers.getTextOfUiString( + requireContext(), uiPrimaryBtn.text + ) primaryButton.setOnClickListener { - subFilterViewModel.onBottomSheetActionClicked(uiState.primaryButton.action) + subFilterViewModel.onBottomSheetActionClicked(uiPrimaryBtn.action) } } - if (uiState.secondaryButton == null) { + val uiSecondaryBtn = uiState.secondaryButton + if (uiSecondaryBtn == null) { secondaryButton.visibility = View.GONE } else { secondaryButton.visibility = View.VISIBLE - secondaryButton.text = uiHelpers.getTextOfUiString(requireContext(), uiState.secondaryButton.text) + secondaryButton.text = uiHelpers.getTextOfUiString( + requireContext(), uiSecondaryBtn.text + ) secondaryButton.setOnClickListener { - subFilterViewModel.onBottomSheetActionClicked(uiState.secondaryButton.action) + subFilterViewModel.onBottomSheetActionClicked(uiSecondaryBtn.action) } } } diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt similarity index 81% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt index 061ab15ed573..782ecb1ad989 100644 --- a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt +++ b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderBlogTableWrapper.kt @@ -1,11 +1,10 @@ package org.wordpress.android.datasets import org.wordpress.android.models.ReaderBlog -import org.wordpress.android.ui.reader.utils.ReaderUtilsWrapper import javax.inject.Inject class ReaderBlogTableWrapper -@Inject constructor(private val readerUtilsWrapper: ReaderUtilsWrapper) { +@Inject constructor() { fun getFollowedBlogs(): List = ReaderBlogTable.getFollowedBlogs()!! fun getBlogInfo(blogId: Long): ReaderBlog? = ReaderBlogTable.getBlogInfo(blogId) fun getFeedInfo(feedId: Long): ReaderBlog? = ReaderBlogTable.getFeedInfo(feedId) @@ -14,7 +13,7 @@ class ReaderBlogTableWrapper ReaderBlogTable.setNotificationsEnabledByBlogId(blogId, isEnabled) fun getReaderBlog(blogId: Long, feedId: Long): ReaderBlog? { - return if (readerUtilsWrapper.isExternalFeed(blogId, feedId)) { + return if (isExternalFeed(blogId, feedId)) { ReaderBlogTable.getFeedInfo(feedId) } else { ReaderBlogTable.getBlogInfo(blogId) @@ -22,7 +21,7 @@ class ReaderBlogTableWrapper } fun isSiteFollowed(blogId: Long, feedId: Long): Boolean { - return if (readerUtilsWrapper.isExternalFeed(blogId, feedId)) { + return if (isExternalFeed(blogId, feedId)) { ReaderBlogTable.isFollowedFeed(feedId) } else { ReaderBlogTable.isFollowedBlog(blogId) @@ -31,4 +30,8 @@ class ReaderBlogTableWrapper fun incrementUnseenCount(blogId: Long) = ReaderBlogTable.incrementUnseenCount(blogId) fun decrementUnseenCount(blogId: Long) = ReaderBlogTable.decrementUnseenCount(blogId) + + private fun isExternalFeed(blogId: Long, feedId: Long): Boolean { + return (blogId == 0L && feedId != 0L) || blogId == feedId + } } diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTableWrapper.kt b/libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTableWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTableWrapper.kt rename to libs/reader-models/src/main/java/org/wordpress/android/datasets/ReaderDiscoverCardsTableWrapper.kt diff --git a/libs/reader/build.gradle b/libs/reader/build.gradle new file mode 100644 index 000000000000..bc6f1945f1ab --- /dev/null +++ b/libs/reader/build.gradle @@ -0,0 +1,49 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.dependency.analysis) +} + +android { + namespace "org.wordpress.android.reader" + + defaultConfig { + compileSdk rootProject.compileSdkVersion + minSdkVersion rootProject.minSdkVersion + targetSdkVersion rootProject.targetSdkVersion + } + + compileOptions { + sourceCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + targetCompatibility JavaVersion.toVersion( + libs.versions.java.get() + ) + } +} + +dependencies { + // Internal modules + implementation project(":libs:core-ui") + implementation project(":libs:utils") + implementation project(":libs:reader-models") + implementation project(":libs:fluxc") + + // WordPress utils (AppLog, PhotonUtils, etc.) + implementation("$gradle.ext.wputilsBinaryPath") { + version { + strictly libs.wordpress.utils.get().version + } + } + + // AndroidX + implementation libs.androidx.annotation + implementation libs.androidx.core.ktx + + // EventBus + implementation libs.greenrobot.eventbus.main + + // Dagger (for @Reusable, @Inject) + implementation libs.google.dagger +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/FollowConversationUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/FollowConversationUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/FollowConversationUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/FollowConversationUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderAnim.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderAnim.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderAnim.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderAnim.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderHistoryStack.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderHistoryStack.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderHistoryStack.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderHistoryStack.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostHistory.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderPostHistory.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostHistory.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderPostHistory.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSearchSuggestionListeners.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSearchSuggestionListeners.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSearchSuggestionListeners.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSearchSuggestionListeners.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/TagUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/discover/interests/TagUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/TagUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/discover/interests/TagUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/exceptions/ReaderPostFetchException.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/exceptions/ReaderPostFetchException.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/exceptions/ReaderPostFetchException.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/exceptions/ReaderPostFetchException.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/reblog/ReblogState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/reblog/ReblogState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/reblog/ReblogState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/reblog/ReblogState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ServiceCompletionListener.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/services/ServiceCompletionListener.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/services/ServiceCompletionListener.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/services/ServiceCompletionListener.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/BottomSheetPageEmptyUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/subfilter/BottomSheetPageEmptyUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/subfilter/BottomSheetPageEmptyUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/subfilter/BottomSheetPageEmptyUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/FeaturedImageUtils.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/FeaturedImageUtils.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/FeaturedImageUtils.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/FeaturedImageUtils.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderCommentLeveler.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderCommentLeveler.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderCommentLeveler.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderCommentLeveler.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderEmbedScanner.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderEmbedScanner.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderEmbedScanner.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderEmbedScanner.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScannerProvider.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScannerProvider.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScannerProvider.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderImageScannerProvider.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderTagWrapper.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderTagWrapper.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderTagWrapper.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderTagWrapper.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderXPostUtils.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderXPostUtils.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderXPostUtils.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/ReaderXPostUtils.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/TagInfo.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/TagInfo.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/utils/TagInfo.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/utils/TagInfo.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRecyclerView.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/ReaderRecyclerView.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderRecyclerView.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/ReaderRecyclerView.java diff --git a/settings.gradle b/settings.gradle index 4cf0651e5226..2e926353907e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -108,6 +108,7 @@ include ':libs:posttypes' include ':libs:core-ui' include ':libs:utils' include ':libs:reader-models' +include ':libs:reader' include ':libs:core-test' apply from: './config/gradle/included_builds.gradle' From d8bf70c27100f0ad661b3ff72c10d229b14c6bd2 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:25:22 -0600 Subject: [PATCH 16/26] Move 9 more UI state and adapter files to `:libs:reader` Move data classes, enums, and UI state files that only depend on libs:core-ui (UiString, ImageType) and classes already in libs:reader. Fix cross-module smart cast in ReaderPostDetailHeaderView. Moved files: - subscription/ReaderSubscriptionSettingsUiState - tracker/ReaderTrackerInfo - views/uistates/FollowButtonUiState, CommentSnippetItemState, ReaderBlogSectionUiState, ReaderPostDetailsHeaderViewUiState, ReaderPostDetailsHeaderAction - views/ReaderTagHeaderViewUiState - adapters/CommentSnippetAdatperDiffCallback Co-Authored-By: Claude Opus 4.6 --- .../ui/reader/views/ReaderPostDetailHeaderView.kt | 10 ++++++---- .../adapters/CommentSnippetAdatperDiffCallback.kt | 0 .../subscription/ReaderSubscriptionSettingsUiState.kt | 0 .../android/ui/reader/tracker/ReaderTrackerInfo.kt | 0 .../ui/reader/views/ReaderTagHeaderViewUiState.kt | 0 .../reader/views/uistates/CommentSnippetItemState.kt | 0 .../ui/reader/views/uistates/FollowButtonUiState.kt | 0 .../reader/views/uistates/ReaderBlogSectionUiState.kt | 0 .../views/uistates/ReaderPostDetailsHeaderAction.kt | 0 .../uistates/ReaderPostDetailsHeaderViewUiState.kt | 0 10 files changed, 6 insertions(+), 4 deletions(-) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/adapters/CommentSnippetAdatperDiffCallback.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderSubscriptionSettingsUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerInfo.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderViewUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/uistates/CommentSnippetItemState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/uistates/FollowButtonUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderBlogSectionUiState.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderAction.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderViewUiState.kt (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt index e275bc345d43..915b0ff67b8c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderPostDetailHeaderView.kt @@ -162,19 +162,21 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( uiHelpers.updateVisibility( blogAvatarImage, state.avatarOrBlavatarUrl != null ) - if (state.avatarOrBlavatarUrl == null) { + val blavatarUrl = state.avatarOrBlavatarUrl + if (blavatarUrl == null) { imageManager.cancelRequestAndClearImageView(blogAvatarImage) } else { imageManager.loadIntoCircle( blogAvatarImage, state.blavatarType, - state.avatarOrBlavatarUrl + blavatarUrl ) } val authorAvatarImage = layoutBlogSection.blogSectionImageAuthorAvatar + val authorUrl = state.authorAvatarUrl val showAuthorsAvatar = - state.authorAvatarUrl != null && state.isAuthorAvatarVisible + authorUrl != null && state.isAuthorAvatarVisible uiHelpers.updateVisibility(authorAvatarImage, showAuthorsAvatar) if (!showAuthorsAvatar) { imageManager.cancelRequestAndClearImageView(authorAvatarImage) @@ -182,7 +184,7 @@ class ReaderPostDetailHeaderView @JvmOverloads constructor( imageManager.loadIntoCircle( authorAvatarImage, ImageType.BLAVATAR_CIRCULAR, - state.authorAvatarUrl + authorUrl ) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/CommentSnippetAdatperDiffCallback.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/adapters/CommentSnippetAdatperDiffCallback.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/adapters/CommentSnippetAdatperDiffCallback.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/adapters/CommentSnippetAdatperDiffCallback.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderSubscriptionSettingsUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderSubscriptionSettingsUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderSubscriptionSettingsUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderSubscriptionSettingsUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerInfo.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerInfo.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerInfo.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerInfo.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderViewUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderViewUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderViewUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/ReaderTagHeaderViewUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/CommentSnippetItemState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/CommentSnippetItemState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/CommentSnippetItemState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/CommentSnippetItemState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/FollowButtonUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/FollowButtonUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/FollowButtonUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/FollowButtonUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderBlogSectionUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderBlogSectionUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderBlogSectionUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderBlogSectionUiState.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderAction.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderAction.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderAction.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderAction.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderViewUiState.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderViewUiState.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderViewUiState.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/views/uistates/ReaderPostDetailsHeaderViewUiState.kt From 43b049d8e46f1afec4ca9bdf44b67dea1a8ce2d8 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:40:14 -0600 Subject: [PATCH 17/26] Extract ReaderTracker interface to `:libs:reader` Refactor ReaderTracker from a concrete class to an interface in libs:reader, enabling reader files that depend on it to eventually move to the library module. - Create ReaderTracker interface in libs:reader with all public methods - Move SOURCE_* constants and static utilities to the interface companion - Move ReaderTab enum to its own file in libs:reader - Move ReaderTypes to libs:reader (depends on SOURCE_* constants) - Rename concrete class to ReaderTrackerImpl implementing the interface - Add Hilt @Binds module (ReaderModule) to wire impl to interface - Add libs:analytics dependency to libs:reader Co-Authored-By: Claude Opus 4.6 --- .../wordpress/android/modules/ReaderModule.kt | 15 + .../ui/reader/ReaderPostPagerActivity.kt | 3 +- .../ui/reader/tracker/ReaderTracker.kt | 552 ------------------ .../ui/reader/tracker/ReaderTrackerImpl.kt | 495 ++++++++++++++++ .../android/ui/reader/ReaderTrackerTest.kt | 6 +- libs/reader/build.gradle | 1 + .../android/ui/reader/ReaderTypes.java | 0 .../android/ui/reader/tracker/ReaderTab.kt | 49 ++ .../ui/reader/tracker/ReaderTracker.kt | 132 +++++ 9 files changed, 697 insertions(+), 556 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt delete mode 100644 WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerImpl.kt rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/ReaderTypes.java (100%) create mode 100644 libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTab.kt create mode 100644 libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt diff --git a/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt b/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt new file mode 100644 index 000000000000..bfc9fd340ef2 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt @@ -0,0 +1,15 @@ +package org.wordpress.android.modules + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import org.wordpress.android.ui.reader.tracker.ReaderTracker +import org.wordpress.android.ui.reader.tracker.ReaderTrackerImpl + +@InstallIn(SingletonComponent::class) +@Module +interface ReaderModule { + @Binds + fun bindReaderTracker(impl: ReaderTrackerImpl): ReaderTracker +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.kt index 8270ae7dd2f1..8aa1aa0cb648 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.kt @@ -66,6 +66,7 @@ import org.wordpress.android.ui.reader.models.ReaderBlogIdPostId import org.wordpress.android.ui.reader.models.ReaderBlogIdPostIdList import org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter import org.wordpress.android.ui.reader.tracker.ReaderTracker +import org.wordpress.android.ui.reader.tracker.ReaderTrackerImpl import org.wordpress.android.ui.reader.tracker.ReaderTrackerType import org.wordpress.android.ui.reader.usecases.ReaderGetReadingPreferencesSyncUseCase import org.wordpress.android.ui.reader.utils.ReaderPostSeenStatusWrapper @@ -154,7 +155,7 @@ class ReaderPostPagerActivity : BaseAppCompatActivity() { lateinit var siteStore: SiteStore @Inject - lateinit var readerTracker: ReaderTracker + lateinit var readerTracker: ReaderTrackerImpl @Inject lateinit var analyticsUtilsWrapper: AnalyticsUtilsWrapper diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt deleted file mode 100644 index 5cc3c683b3a8..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt +++ /dev/null @@ -1,552 +0,0 @@ -package org.wordpress.android.ui.reader.tracker - -import android.net.Uri -import androidx.annotation.MainThread -import org.wordpress.android.analytics.AnalyticsTracker -import org.wordpress.android.analytics.AnalyticsTracker.Stat -import org.wordpress.android.models.ReaderPost -import org.wordpress.android.models.ReaderTag -import org.wordpress.android.ui.prefs.AppPrefsWrapper -import org.wordpress.android.ui.reader.ReaderTypes.ReaderPostListType -import org.wordpress.android.ui.reader.models.ReaderReadingPreferences -import org.wordpress.android.ui.reader.utils.DateProvider -import org.wordpress.android.util.AppLog -import org.wordpress.android.util.DateTimeUtils -import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper -import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -@MainThread -@Suppress("ForbiddenComment") -class ReaderTracker @Inject constructor( - private val dateProvider: DateProvider, - private val appPrefsWrapper: AppPrefsWrapper, - private val analyticsTrackerWrapper: AnalyticsTrackerWrapper, - private val analyticsUtilsWrapper: AnalyticsUtilsWrapper, - private val readingPreferencesTracker: ReaderReadingPreferencesTracker, -) { - // TODO: evaluate to use something like Dispatchers.Main.Immediate in the fun(s) - // to sync the access to trackers; so to remove the @MainThread and make the - // usage of this class more transparent to its users - private val trackers = mutableMapOf() - - init { - for (trackerType in ReaderTrackerType.values()) { - trackers[trackerType] = ReaderTrackerInfo() - } - } - - fun setupTrackers() { - for (key in trackers.keys) { - trackers[key] = ReaderTrackerInfo() - } - } - - fun start(type: ReaderTrackerType) { - trackers[type]?.let { - if (!isRunning(type)) { - AppLog.d(AppLog.T.MAIN, "ReaderTracker: started $type") - trackers[type] = it.copy(startDate = dateProvider.getCurrentDate()) - } - } - } - - fun stop(type: ReaderTrackerType) { - trackers[type]?.let { trackerInfo -> - if (isRunning(type)) { - AppLog.d(AppLog.T.MAIN, "ReaderTracker: stopped $type") - trackerInfo.startDate?.let { startDate -> - val accumulatedTime = trackerInfo.accumulatedTime + - DateTimeUtils.secondsBetween(dateProvider.getCurrentDate(), startDate) - // let reset the startDate to null - trackers[type] = ReaderTrackerInfo(accumulatedTime = accumulatedTime) - } ?: AppLog.e(AppLog.T.READER, "ReaderTracker > stop found a null startDate") - } - } - } - - fun isRunning(type: ReaderTrackerType): Boolean { - return trackers[type]?.startDate != null - } - - fun getAnalyticsData(): Map { - return trackers.entries.associate { it.key.propertyName to it.value.accumulatedTime } - } - - fun trackReaderTabIfNecessary(readerTab: ReaderTab) { - if (readerTab != appPrefsWrapper.getReaderActiveTab()) { - when (readerTab) { - ReaderTab.FOLLOWING -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_FOLLOWING_SHOWN) - ReaderTab.DISCOVER -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_DISCOVER_SHOWN) - ReaderTab.LIKED -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_LIKED_SHOWN) - ReaderTab.SAVED -> analyticsTrackerWrapper.track( - AnalyticsTracker.Stat.READER_SAVED_LIST_SHOWN, - mapOf("source" to "reader_filter") - ) - ReaderTab.A8C -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_A8C_SHOWN) - ReaderTab.P2 -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_P2_SHOWN) - ReaderTab.CUSTOM -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_CUSTOM_TAB_SHOWN) - ReaderTab.TAGS_FEED -> analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_TAGS_FEED_SHOWN) - } - appPrefsWrapper.setReaderActiveTab(readerTab) - } - } - - fun onAppGoesToBackground() { - appPrefsWrapper.setReaderActiveTab(null) - } - - fun onBottomNavigationTabChanged() { - appPrefsWrapper.setReaderActiveTab(null) - } - - /* TRACK */ - - fun track( - stat: AnalyticsTracker.Stat - ) { - analyticsTrackerWrapper.track(stat) - } - - fun track( - stat: AnalyticsTracker.Stat, - source: String - ) { - val properties = mutableMapOf( - SOURCE_KEY to source - ) - track(stat, properties) - } - - fun track( - stat: AnalyticsTracker.Stat, - properties: MutableMap - ) { - analyticsTrackerWrapper.track(stat, properties) - } - - /* BLOG */ - - fun trackBlog( - stat: AnalyticsTracker.Stat, - blogId: Long, - feedId: Long - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId(blogId, feedId), - FEED_ID_KEY to feedId - ) - track(stat, properties) - } - - fun trackBlog( - stat: AnalyticsTracker.Stat, - blogId: Long, - feedId: Long, - isFollowed: Boolean? - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId(blogId, feedId), - FEED_ID_KEY to feedId, - FOLLOW_KEY to (isFollowed ?: UNKNOWN_VALUE) - ) - track(stat, properties) - } - - fun trackBlog( - stat: AnalyticsTracker.Stat, - blogId: Long, - feedId: Long, - source: String - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId(blogId, feedId), - FEED_ID_KEY to feedId, - SOURCE_KEY to source - ) - track(stat, properties) - } - - fun trackBlog( - stat: AnalyticsTracker.Stat, - blogId: Long, - feedId: Long, - isFollowed: Boolean?, - source: String - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId(blogId, feedId), - FEED_ID_KEY to feedId, - FOLLOW_KEY to (isFollowed ?: UNKNOWN_VALUE), - SOURCE_KEY to source - ) - track(stat, properties) - } - - /** - * The [org.wordpress.android.models.ReaderBlog.fromJson] method within this model class has a logic where it - * checks whether the blogs 'blogId' is 0, if it is, then it checks whether the 'feedId' is not 0. If both - * conditions are met then it assigns the 'feedId' to 'blogId'. It does that in order to keep consistency with the - * '/read/' endpoints. - * - * This tracking function captures that and does the opposite in order to make sure that the tracking is done to the - * absolute. As such, it check whether the 'feedId' is equal to the 'blogId' and if so it assigns 0 to the 'blog_id' - * tracking property. Else, as should, it assigns the actual 'blogId' to the 'blog_id' tracking property. - */ - private fun blogId(blogId: Long, feedId: Long) = if (feedId == blogId) 0 else blogId - - /* TAG */ - - fun trackTag( - stat: AnalyticsTracker.Stat, - tag: String, - source: String - ) { - val properties = mutableMapOf( - TAG_KEY to tag, - SOURCE_KEY to source - ) - track(stat, properties) - } - - fun trackTagQuantity( - stat: AnalyticsTracker.Stat, - quantity: Int - ) { - val properties = mutableMapOf( - QUANTITY_KEY to quantity - ) - track(stat, properties) - } - - /* POST */ - - fun trackBlogPost( - stat: AnalyticsTracker.Stat, - blogId: Long, - postId: Long - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId, - POST_ID_KEY to postId - ) - track(stat, properties) - } - - fun trackBlogPost( - stat: AnalyticsTracker.Stat, - blogId: Long, - postId: Long, - isJetpack: Boolean - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId, - POST_ID_KEY to postId, - IS_JETPACK_KEY to isJetpack - ) - track(stat, properties) - } - - fun trackBlogPostAuthor( - stat: AnalyticsTracker.Stat, - blogId: Long, - postId: Long, - isJetpack: Boolean, - userId: Long - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId, - POST_ID_KEY to postId, - IS_JETPACK_KEY to isJetpack, - USER_ID_KEY to userId - ) - track(stat, properties) - } - - fun trackBlogPost( - stat: AnalyticsTracker.Stat, - blogId: String, - postId: String, - commentId: Int - ) { - val properties = mutableMapOf( - BLOG_ID_KEY to blogId, - POST_ID_KEY to postId, - COMMENT_ID_KEY to commentId - ) - track(stat, properties) - } - - fun trackFeedPost( - stat: AnalyticsTracker.Stat, - feedId: Long, - feedItemId: Long - ) { - val properties = mutableMapOf( - FEED_ID_KEY to feedId, - FEED_ITEM_ID_KEY to feedItemId - ) - track(stat, properties) - } - - fun trackPost( - stat: AnalyticsTracker.Stat, - post: ReaderPost? - ) { - trackPost(stat, post, mutableMapOf()) - } - - fun trackPost( - stat: AnalyticsTracker.Stat, - post: ReaderPost?, - readingPreferences: ReaderReadingPreferences, - ) { - trackPost( - stat, - post, - readingPreferencesTracker.getPropertiesForPreferences(readingPreferences, READING_PREFERENCES_KEYS_PREFIX) - ) - } - - fun trackPost( - stat: AnalyticsTracker.Stat, - post: ReaderPost?, - source: String - ) { - val properties = mutableMapOf( - SOURCE_KEY to source - ) - trackPost(stat, post, properties) - } - - private fun trackPost( - stat: AnalyticsTracker.Stat, - post: ReaderPost?, - properties: MutableMap - ) { - analyticsUtilsWrapper.trackWithReaderPostDetails( - stat, - post, - properties - ) - } - - fun trackPostComments( - stat: AnalyticsTracker.Stat, - blogId: Long, - postId: Long, - post: ReaderPost?, - properties: MutableMap - ) { - analyticsUtilsWrapper.trackFollowCommentsWithReaderPostDetails( - stat, - blogId, - postId, - post, - properties - ) - } - - /* OTHER */ - - /** - * Track when app launched via deep-linking but then fell back to external browser - * - * @param stat The Stat to bump - * @param interceptedUri The fallback URI the app was started with - */ - fun trackUri( - stat: AnalyticsTracker.Stat, - interceptedUri: String - ) { - val properties = mutableMapOf( - INTERCEPTED_URI_KEY to interceptedUri - ) - track(stat, properties) - } - - fun trackQuery( - stat: AnalyticsTracker.Stat, - query: String - ) { - val properties = mutableMapOf( - QUERY_KEY to query - ) - track(stat, properties) - } - - fun trackDeepLink( - stat: AnalyticsTracker.Stat, - action: String, - host: String, - uri: Uri? - ) { - analyticsUtilsWrapper.trackWithDeepLinkData(stat, action, host, uri) - } - - fun trackRailcar( - railcarJson: String - ) { - analyticsUtilsWrapper.trackRailcarRender(railcarJson) - } - - fun trackDropdownMenuOpened() { - analyticsTrackerWrapper.track(AnalyticsTracker.Stat.READER_DROPDOWN_MENU_OPENED) - } - - fun trackDropdownMenuItemTapped(readerTag: ReaderTag) { - when { - readerTag.isDiscover -> "discover" - readerTag.isFollowedSites -> "following" - readerTag.isBookmarked -> "saved" - readerTag.isPostsILike -> "liked" - readerTag.isA8C -> "a8c" - readerTag.isListTopic -> "list" - readerTag.isP2 -> "p2" - readerTag.isTags -> "tags" - else -> null - }?.let { trackingId -> - analyticsTrackerWrapper.track( - stat = AnalyticsTracker.Stat.READER_DROPDOWN_MENU_ITEM_TAPPED, - properties = mapOf("id" to trackingId) - ) - } - } - - private fun trackFollowedCount(type: String, numberOfItems: Int) { - val props: MutableMap = HashMap() - props["type"] = type - props["count"] = numberOfItems.toString() - AnalyticsTracker.track(Stat.READER_FOLLOWING_FETCHED, props) - } - - fun trackFollowedTagsCount(numberOfItems: Int) { - trackFollowedCount("tags", numberOfItems) - } - - fun trackSubscribedSitesCount(numberOfItems: Int) { - trackFollowedCount("sites", numberOfItems) - } - - /* HELPER */ - - @JvmOverloads - fun getSource( - postListType: ReaderPostListType, - readerTab: ReaderTab? = null - ): String = if (postListType == ReaderPostListType.TAG_FOLLOWED) { - readerTab?.source ?: UNKNOWN_VALUE - } else { - postListType.source - } - - companion object { - private const val BLOG_ID_KEY = "blog_id" - private const val POST_ID_KEY = "post_id" - private const val USER_ID_KEY = "user_id" - private const val IS_JETPACK_KEY = "is_jetpack" - private const val COMMENT_ID_KEY = "comment_id" - private const val FEED_ID_KEY = "feed_id" - private const val FEED_ITEM_ID_KEY = "feed_item_id" - private const val FOLLOW_KEY = "follow" - private const val TAG_KEY = "tag" - private const val QUANTITY_KEY = "quantity" - private const val INTERCEPTED_URI_KEY = "intercepted_uri" - private const val QUERY_KEY = "query" - private const val READING_PREFERENCES_KEYS_PREFIX = "reading_preferences" - - private const val SOURCE_KEY = "source" - const val SOURCE_FOLLOWING = "following" - const val SOURCE_DISCOVER = "discover" - const val SOURCE_LIKED = "liked" - const val SOURCE_SAVED = "saved" - const val SOURCE_CUSTOM = "custom" - const val SOURCE_A8C = "a8c" - const val SOURCE_P2 = "p2" - const val SOURCE_SETTINGS = "subscriptions" - const val SOURCE_SEARCH = "search" - const val SOURCE_SITE_PREVIEW = "site_preview" - const val SOURCE_TAG_PREVIEW = "tag_preview" - const val SOURCE_TAGS_FEED = "tags_feed" - const val SOURCE_POST_DETAIL = "post_detail" - const val SOURCE_POST_DETAIL_TOOLBAR = "post_detail_toolbar" - const val SOURCE_POST_DETAIL_COMMENT_SNIPPET = "post_detail_comment_snippet" - const val SOURCE_COMMENT = "comment" - const val SOURCE_USER = "user" - const val SOURCE_STATS = "stats" - const val SOURCE_NOTIFICATION = "notification" - const val SOURCE_READER_LIKE_LIST = "reader_like_list" - const val SOURCE_READER_LIKE_LIST_USER_PROFILE = "reader_like_list_user_profile" - const val SOURCE_NOTIF_LIKE_LIST_USER_PROFILE = "notif_like_list_user_profile" - const val SOURCE_USER_PROFILE_UNKNOWN = "user_profile_source_unknown" - const val SOURCE_ACTIVITY_LOG_DETAIL = "activity_log_detail" - const val SOURCE_BLOGGING_PROMPTS_VIEW_ANSWERS = "blogging_prompts_my_site_card_view_answers" - - const val SOURCE_POST_LIST_SAVED_POST_NOTICE = "post_list_saved_post_notice" - - private const val UNKNOWN_VALUE = "unknown" - - @JvmStatic - fun trackTag( - stat: AnalyticsTracker.Stat, - tag: String - ) { - val properties = mutableMapOf( - TAG_KEY to tag - ) - AnalyticsTracker.track(stat, properties) - } - - fun isUserProfileSource(source: String): Boolean { - return (source == SOURCE_READER_LIKE_LIST_USER_PROFILE || - source == SOURCE_NOTIF_LIKE_LIST_USER_PROFILE || - source == SOURCE_USER_PROFILE_UNKNOWN) - } - } -} - -enum class ReaderTab( - val id: Int, - val source: String -) { - FOLLOWING(1, ReaderTracker.SOURCE_FOLLOWING), - DISCOVER(2, ReaderTracker.SOURCE_DISCOVER), - LIKED(3, ReaderTracker.SOURCE_LIKED), - SAVED(4, ReaderTracker.SOURCE_SAVED), - CUSTOM(5, ReaderTracker.SOURCE_CUSTOM), - A8C(6, ReaderTracker.SOURCE_A8C), - P2(7, ReaderTracker.SOURCE_P2), - TAGS_FEED(8, ReaderTracker.SOURCE_TAGS_FEED); - - companion object { - fun fromId(id: Int): ReaderTab { - return when (id) { - FOLLOWING.id -> FOLLOWING - DISCOVER.id -> DISCOVER - LIKED.id -> LIKED - SAVED.id -> SAVED - A8C.id -> A8C - P2.id -> P2 - CUSTOM.id -> CUSTOM - TAGS_FEED.id -> TAGS_FEED - else -> throw RuntimeException("Unexpected ReaderTab id") - } - } - - @JvmStatic - fun transformTagToTab(readerTag: ReaderTag): ReaderTab { - return when { - readerTag.isFollowedSites -> FOLLOWING - readerTag.isPostsILike -> LIKED - readerTag.isBookmarked -> SAVED - readerTag.isDiscover -> DISCOVER - readerTag.isA8C -> A8C - readerTag.isP2 -> P2 - readerTag.isTags -> TAGS_FEED - else -> CUSTOM - } - } - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerImpl.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerImpl.kt new file mode 100644 index 000000000000..652247d91dc9 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTrackerImpl.kt @@ -0,0 +1,495 @@ +package org.wordpress.android.ui.reader.tracker + +import android.net.Uri +import androidx.annotation.MainThread +import org.wordpress.android.analytics.AnalyticsTracker +import org.wordpress.android.analytics.AnalyticsTracker.Stat +import org.wordpress.android.models.ReaderPost +import org.wordpress.android.models.ReaderTag +import org.wordpress.android.ui.prefs.AppPrefsWrapper +import org.wordpress.android.ui.reader.ReaderTypes.ReaderPostListType +import org.wordpress.android.ui.reader.models.ReaderReadingPreferences +import org.wordpress.android.ui.reader.utils.DateProvider +import org.wordpress.android.util.AppLog +import org.wordpress.android.util.DateTimeUtils +import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper +import org.wordpress.android.util.analytics.AnalyticsUtilsWrapper +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +@MainThread +@Suppress("ForbiddenComment", "TooManyFunctions") +class ReaderTrackerImpl @Inject constructor( + private val dateProvider: DateProvider, + private val appPrefsWrapper: AppPrefsWrapper, + private val analyticsTrackerWrapper: AnalyticsTrackerWrapper, + private val analyticsUtilsWrapper: AnalyticsUtilsWrapper, + private val readingPreferencesTracker: ReaderReadingPreferencesTracker, +) : ReaderTracker { + // TODO: evaluate to use something like Dispatchers.Main.Immediate + // in the fun(s) to sync the access to trackers; so to remove the + // @MainThread and make the usage of this class more transparent + // to its users + private val trackers = + mutableMapOf() + + init { + for (trackerType in ReaderTrackerType.values()) { + trackers[trackerType] = ReaderTrackerInfo() + } + } + + override fun setupTrackers() { + for (key in trackers.keys) { + trackers[key] = ReaderTrackerInfo() + } + } + + override fun start(type: ReaderTrackerType) { + trackers[type]?.let { + if (!isRunning(type)) { + AppLog.d( + AppLog.T.MAIN, + "ReaderTracker: started $type" + ) + trackers[type] = + it.copy(startDate = dateProvider.getCurrentDate()) + } + } + } + + override fun stop(type: ReaderTrackerType) { + trackers[type]?.let { trackerInfo -> + if (isRunning(type)) { + AppLog.d( + AppLog.T.MAIN, + "ReaderTracker: stopped $type" + ) + trackerInfo.startDate?.let { startDate -> + val accumulatedTime = + trackerInfo.accumulatedTime + + DateTimeUtils.secondsBetween( + dateProvider.getCurrentDate(), + startDate + ) + trackers[type] = + ReaderTrackerInfo( + accumulatedTime = accumulatedTime + ) + } ?: AppLog.e( + AppLog.T.READER, + "ReaderTracker > stop found a null startDate" + ) + } + } + } + + override fun isRunning(type: ReaderTrackerType): Boolean { + return trackers[type]?.startDate != null + } + + override fun getAnalyticsData(): Map { + return trackers.entries.associate { + it.key.propertyName to it.value.accumulatedTime + } + } + + override fun trackReaderTabIfNecessary(readerTab: ReaderTab) { + if (readerTab != appPrefsWrapper.getReaderActiveTab()) { + when (readerTab) { + ReaderTab.FOLLOWING -> + analyticsTrackerWrapper.track( + Stat.READER_FOLLOWING_SHOWN + ) + ReaderTab.DISCOVER -> + analyticsTrackerWrapper.track( + Stat.READER_DISCOVER_SHOWN + ) + ReaderTab.LIKED -> + analyticsTrackerWrapper.track( + Stat.READER_LIKED_SHOWN + ) + ReaderTab.SAVED -> + analyticsTrackerWrapper.track( + Stat.READER_SAVED_LIST_SHOWN, + mapOf("source" to "reader_filter") + ) + ReaderTab.A8C -> + analyticsTrackerWrapper.track( + Stat.READER_A8C_SHOWN + ) + ReaderTab.P2 -> + analyticsTrackerWrapper.track( + Stat.READER_P2_SHOWN + ) + ReaderTab.CUSTOM -> + analyticsTrackerWrapper.track( + Stat.READER_CUSTOM_TAB_SHOWN + ) + ReaderTab.TAGS_FEED -> + analyticsTrackerWrapper.track( + Stat.READER_TAGS_FEED_SHOWN + ) + } + appPrefsWrapper.setReaderActiveTab(readerTab) + } + } + + override fun onAppGoesToBackground() { + appPrefsWrapper.setReaderActiveTab(null) + } + + override fun onBottomNavigationTabChanged() { + appPrefsWrapper.setReaderActiveTab(null) + } + + /* TRACK */ + + override fun track(stat: Stat) { + analyticsTrackerWrapper.track(stat) + } + + override fun track(stat: Stat, source: String) { + val properties = mutableMapOf( + SOURCE_KEY to source + ) + track(stat, properties) + } + + override fun track( + stat: Stat, + properties: MutableMap + ) { + analyticsTrackerWrapper.track(stat, properties) + } + + /* BLOG */ + + override fun trackBlog( + stat: Stat, + blogId: Long, + feedId: Long + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId(blogId, feedId), + FEED_ID_KEY to feedId + ) + track(stat, properties) + } + + override fun trackBlog( + stat: Stat, + blogId: Long, + feedId: Long, + isFollowed: Boolean? + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId(blogId, feedId), + FEED_ID_KEY to feedId, + FOLLOW_KEY to (isFollowed ?: UNKNOWN_VALUE) + ) + track(stat, properties) + } + + override fun trackBlog( + stat: Stat, + blogId: Long, + feedId: Long, + source: String + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId(blogId, feedId), + FEED_ID_KEY to feedId, + SOURCE_KEY to source + ) + track(stat, properties) + } + + override fun trackBlog( + stat: Stat, + blogId: Long, + feedId: Long, + isFollowed: Boolean?, + source: String + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId(blogId, feedId), + FEED_ID_KEY to feedId, + FOLLOW_KEY to (isFollowed ?: UNKNOWN_VALUE), + SOURCE_KEY to source + ) + track(stat, properties) + } + + /** + * The [org.wordpress.android.models.ReaderBlog.fromJson] method + * has a logic where it checks whether the blogs 'blogId' is 0, + * if it is, then it checks whether the 'feedId' is not 0. If + * both conditions are met then it assigns the 'feedId' to + * 'blogId'. + * + * This tracking function captures that and does the opposite to + * make sure that the tracking is done correctly. + */ + private fun blogId(blogId: Long, feedId: Long) = + if (feedId == blogId) 0 else blogId + + /* TAG */ + + override fun trackTag( + stat: Stat, + tag: String, + source: String + ) { + val properties = mutableMapOf( + TAG_KEY to tag, + SOURCE_KEY to source + ) + track(stat, properties) + } + + override fun trackTagQuantity(stat: Stat, quantity: Int) { + val properties = mutableMapOf( + QUANTITY_KEY to quantity + ) + track(stat, properties) + } + + /* POST */ + + override fun trackBlogPost( + stat: Stat, + blogId: Long, + postId: Long + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId, + POST_ID_KEY to postId + ) + track(stat, properties) + } + + override fun trackBlogPost( + stat: Stat, + blogId: Long, + postId: Long, + isJetpack: Boolean + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId, + POST_ID_KEY to postId, + IS_JETPACK_KEY to isJetpack + ) + track(stat, properties) + } + + override fun trackBlogPostAuthor( + stat: Stat, + blogId: Long, + postId: Long, + isJetpack: Boolean, + userId: Long + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId, + POST_ID_KEY to postId, + IS_JETPACK_KEY to isJetpack, + USER_ID_KEY to userId + ) + track(stat, properties) + } + + override fun trackBlogPost( + stat: Stat, + blogId: String, + postId: String, + commentId: Int + ) { + val properties = mutableMapOf( + BLOG_ID_KEY to blogId, + POST_ID_KEY to postId, + COMMENT_ID_KEY to commentId + ) + track(stat, properties) + } + + override fun trackFeedPost( + stat: Stat, + feedId: Long, + feedItemId: Long + ) { + val properties = mutableMapOf( + FEED_ID_KEY to feedId, + FEED_ITEM_ID_KEY to feedItemId + ) + track(stat, properties) + } + + override fun trackPost(stat: Stat, post: ReaderPost?) { + trackPost(stat, post, mutableMapOf()) + } + + fun trackPost( + stat: Stat, + post: ReaderPost?, + readingPreferences: ReaderReadingPreferences, + ) { + trackPost( + stat, + post, + readingPreferencesTracker.getPropertiesForPreferences( + readingPreferences, + READING_PREFERENCES_KEYS_PREFIX + ) + ) + } + + override fun trackPost( + stat: Stat, + post: ReaderPost?, + source: String + ) { + val properties = mutableMapOf( + SOURCE_KEY to source + ) + trackPost(stat, post, properties) + } + + override fun trackPost( + stat: Stat, + post: ReaderPost?, + properties: MutableMap + ) { + analyticsUtilsWrapper.trackWithReaderPostDetails( + stat, + post, + properties + ) + } + + override fun trackPostComments( + stat: Stat, + blogId: Long, + postId: Long, + post: ReaderPost?, + properties: MutableMap + ) { + analyticsUtilsWrapper.trackFollowCommentsWithReaderPostDetails( + stat, + blogId, + postId, + post, + properties + ) + } + + /* OTHER */ + + override fun trackUri(stat: Stat, interceptedUri: String) { + val properties = mutableMapOf( + INTERCEPTED_URI_KEY to interceptedUri + ) + track(stat, properties) + } + + override fun trackQuery(stat: Stat, query: String) { + val properties = mutableMapOf( + QUERY_KEY to query + ) + track(stat, properties) + } + + override fun trackDeepLink( + stat: Stat, + action: String, + host: String, + uri: Uri? + ) { + analyticsUtilsWrapper.trackWithDeepLinkData( + stat, action, host, uri + ) + } + + override fun trackRailcar(railcarJson: String) { + analyticsUtilsWrapper.trackRailcarRender(railcarJson) + } + + override fun trackDropdownMenuOpened() { + analyticsTrackerWrapper.track( + Stat.READER_DROPDOWN_MENU_OPENED + ) + } + + override fun trackDropdownMenuItemTapped(readerTag: ReaderTag) { + when { + readerTag.isDiscover -> "discover" + readerTag.isFollowedSites -> "following" + readerTag.isBookmarked -> "saved" + readerTag.isPostsILike -> "liked" + readerTag.isA8C -> "a8c" + readerTag.isListTopic -> "list" + readerTag.isP2 -> "p2" + readerTag.isTags -> "tags" + else -> null + }?.let { trackingId -> + analyticsTrackerWrapper.track( + stat = Stat.READER_DROPDOWN_MENU_ITEM_TAPPED, + properties = mapOf("id" to trackingId) + ) + } + } + + private fun trackFollowedCount( + type: String, + numberOfItems: Int + ) { + val props: MutableMap = HashMap() + props["type"] = type + props["count"] = numberOfItems.toString() + AnalyticsTracker.track(Stat.READER_FOLLOWING_FETCHED, props) + } + + override fun trackFollowedTagsCount(numberOfItems: Int) { + trackFollowedCount("tags", numberOfItems) + } + + override fun trackSubscribedSitesCount(numberOfItems: Int) { + trackFollowedCount("sites", numberOfItems) + } + + /* HELPER */ + + override fun getSource( + postListType: ReaderPostListType, + readerTab: ReaderTab? + ): String = + if (postListType == ReaderPostListType.TAG_FOLLOWED) { + readerTab?.source ?: UNKNOWN_VALUE + } else { + postListType.source + } + + override fun getSource( + postListType: ReaderPostListType + ): String = getSource(postListType, null) + + companion object { + private const val BLOG_ID_KEY = "blog_id" + private const val POST_ID_KEY = "post_id" + private const val USER_ID_KEY = "user_id" + private const val IS_JETPACK_KEY = "is_jetpack" + private const val COMMENT_ID_KEY = "comment_id" + private const val FEED_ID_KEY = "feed_id" + private const val FEED_ITEM_ID_KEY = "feed_item_id" + private const val FOLLOW_KEY = "follow" + private const val TAG_KEY = "tag" + private const val QUANTITY_KEY = "quantity" + private const val INTERCEPTED_URI_KEY = "intercepted_uri" + private const val QUERY_KEY = "query" + private const val READING_PREFERENCES_KEYS_PREFIX = + "reading_preferences" + private const val SOURCE_KEY = "source" + private const val UNKNOWN_VALUE = "unknown" + } +} diff --git a/WordPress/src/test/java/org/wordpress/android/ui/reader/ReaderTrackerTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/reader/ReaderTrackerTest.kt index 71221349351d..dc4591e8eac4 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/reader/ReaderTrackerTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/reader/ReaderTrackerTest.kt @@ -17,7 +17,7 @@ import org.wordpress.android.models.ReaderTagType import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.ui.reader.models.ReaderReadingPreferences import org.wordpress.android.ui.reader.tracker.ReaderReadingPreferencesTracker -import org.wordpress.android.ui.reader.tracker.ReaderTracker +import org.wordpress.android.ui.reader.tracker.ReaderTrackerImpl import org.wordpress.android.ui.reader.tracker.ReaderTrackerType import org.wordpress.android.ui.reader.utils.DateProvider import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper @@ -42,11 +42,11 @@ class ReaderTrackerTest { @Mock lateinit var readingPreferencesTracker: ReaderReadingPreferencesTracker - private lateinit var tracker: ReaderTracker + private lateinit var tracker: ReaderTrackerImpl @Before fun setup() { - tracker = ReaderTracker( + tracker = ReaderTrackerImpl( dateProvider, appPrefsWrapper, analyticsTrackerWrapper, diff --git a/libs/reader/build.gradle b/libs/reader/build.gradle index bc6f1945f1ab..20ed1195ad17 100644 --- a/libs/reader/build.gradle +++ b/libs/reader/build.gradle @@ -29,6 +29,7 @@ dependencies { implementation project(":libs:utils") implementation project(":libs:reader-models") implementation project(":libs:fluxc") + implementation project(":libs:analytics") // WordPress utils (AppLog, PhotonUtils, etc.) implementation("$gradle.ext.wputilsBinaryPath") { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTypes.java b/libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderTypes.java similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTypes.java rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/ReaderTypes.java diff --git a/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTab.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTab.kt new file mode 100644 index 000000000000..0924432cd616 --- /dev/null +++ b/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTab.kt @@ -0,0 +1,49 @@ +package org.wordpress.android.ui.reader.tracker + +import org.wordpress.android.models.ReaderTag + +enum class ReaderTab( + val id: Int, + val source: String +) { + FOLLOWING(1, ReaderTracker.SOURCE_FOLLOWING), + DISCOVER(2, ReaderTracker.SOURCE_DISCOVER), + LIKED(3, ReaderTracker.SOURCE_LIKED), + SAVED(4, ReaderTracker.SOURCE_SAVED), + CUSTOM(5, ReaderTracker.SOURCE_CUSTOM), + A8C(6, ReaderTracker.SOURCE_A8C), + P2(7, ReaderTracker.SOURCE_P2), + TAGS_FEED(8, ReaderTracker.SOURCE_TAGS_FEED); + + companion object { + fun fromId(id: Int): ReaderTab { + return when (id) { + FOLLOWING.id -> FOLLOWING + DISCOVER.id -> DISCOVER + LIKED.id -> LIKED + SAVED.id -> SAVED + A8C.id -> A8C + P2.id -> P2 + CUSTOM.id -> CUSTOM + TAGS_FEED.id -> TAGS_FEED + else -> throw RuntimeException( + "Unexpected ReaderTab id" + ) + } + } + + @JvmStatic + fun transformTagToTab(readerTag: ReaderTag): ReaderTab { + return when { + readerTag.isFollowedSites -> FOLLOWING + readerTag.isPostsILike -> LIKED + readerTag.isBookmarked -> SAVED + readerTag.isDiscover -> DISCOVER + readerTag.isA8C -> A8C + readerTag.isP2 -> P2 + readerTag.isTags -> TAGS_FEED + else -> CUSTOM + } + } + } +} diff --git a/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt new file mode 100644 index 000000000000..8306dc51b135 --- /dev/null +++ b/libs/reader/src/main/java/org/wordpress/android/ui/reader/tracker/ReaderTracker.kt @@ -0,0 +1,132 @@ +package org.wordpress.android.ui.reader.tracker + +import android.net.Uri +import org.wordpress.android.analytics.AnalyticsTracker +import org.wordpress.android.analytics.AnalyticsTracker.Stat +import org.wordpress.android.models.ReaderPost +import org.wordpress.android.models.ReaderTag +import org.wordpress.android.ui.reader.ReaderTypes.ReaderPostListType + +@Suppress("TooManyFunctions") +interface ReaderTracker { + fun setupTrackers() + fun start(type: ReaderTrackerType) + fun stop(type: ReaderTrackerType) + fun isRunning(type: ReaderTrackerType): Boolean + fun getAnalyticsData(): Map + + fun trackReaderTabIfNecessary(readerTab: ReaderTab) + fun onAppGoesToBackground() + fun onBottomNavigationTabChanged() + + fun track(stat: Stat) + fun track(stat: Stat, source: String) + fun track(stat: Stat, properties: MutableMap) + + fun trackBlog(stat: Stat, blogId: Long, feedId: Long) + fun trackBlog(stat: Stat, blogId: Long, feedId: Long, isFollowed: Boolean?) + fun trackBlog(stat: Stat, blogId: Long, feedId: Long, source: String) + fun trackBlog( + stat: Stat, + blogId: Long, + feedId: Long, + isFollowed: Boolean?, + source: String + ) + + fun trackTag(stat: Stat, tag: String, source: String) + fun trackTagQuantity(stat: Stat, quantity: Int) + + fun trackBlogPost(stat: Stat, blogId: Long, postId: Long) + fun trackBlogPost(stat: Stat, blogId: Long, postId: Long, isJetpack: Boolean) + fun trackBlogPostAuthor( + stat: Stat, + blogId: Long, + postId: Long, + isJetpack: Boolean, + userId: Long + ) + fun trackBlogPost(stat: Stat, blogId: String, postId: String, commentId: Int) + + fun trackFeedPost(stat: Stat, feedId: Long, feedItemId: Long) + + fun trackPost(stat: Stat, post: ReaderPost?) + fun trackPost(stat: Stat, post: ReaderPost?, source: String) + fun trackPost( + stat: Stat, + post: ReaderPost?, + properties: MutableMap + ) + + fun trackPostComments( + stat: Stat, + blogId: Long, + postId: Long, + post: ReaderPost?, + properties: MutableMap + ) + + fun trackUri(stat: Stat, interceptedUri: String) + fun trackQuery(stat: Stat, query: String) + fun trackDeepLink(stat: Stat, action: String, host: String, uri: Uri?) + fun trackRailcar(railcarJson: String) + fun trackDropdownMenuOpened() + fun trackDropdownMenuItemTapped(readerTag: ReaderTag) + fun trackFollowedTagsCount(numberOfItems: Int) + fun trackSubscribedSitesCount(numberOfItems: Int) + + fun getSource( + postListType: ReaderPostListType, + readerTab: ReaderTab? + ): String + + fun getSource(postListType: ReaderPostListType): String = + getSource(postListType, null) + + companion object { + const val SOURCE_FOLLOWING = "following" + const val SOURCE_DISCOVER = "discover" + const val SOURCE_LIKED = "liked" + const val SOURCE_SAVED = "saved" + const val SOURCE_CUSTOM = "custom" + const val SOURCE_A8C = "a8c" + const val SOURCE_P2 = "p2" + const val SOURCE_SETTINGS = "subscriptions" + const val SOURCE_SEARCH = "search" + const val SOURCE_SITE_PREVIEW = "site_preview" + const val SOURCE_TAG_PREVIEW = "tag_preview" + const val SOURCE_TAGS_FEED = "tags_feed" + const val SOURCE_POST_DETAIL = "post_detail" + const val SOURCE_POST_DETAIL_TOOLBAR = "post_detail_toolbar" + const val SOURCE_POST_DETAIL_COMMENT_SNIPPET = + "post_detail_comment_snippet" + const val SOURCE_COMMENT = "comment" + const val SOURCE_USER = "user" + const val SOURCE_STATS = "stats" + const val SOURCE_NOTIFICATION = "notification" + const val SOURCE_READER_LIKE_LIST = "reader_like_list" + const val SOURCE_READER_LIKE_LIST_USER_PROFILE = + "reader_like_list_user_profile" + const val SOURCE_NOTIF_LIKE_LIST_USER_PROFILE = + "notif_like_list_user_profile" + const val SOURCE_USER_PROFILE_UNKNOWN = + "user_profile_source_unknown" + const val SOURCE_ACTIVITY_LOG_DETAIL = "activity_log_detail" + const val SOURCE_BLOGGING_PROMPTS_VIEW_ANSWERS = + "blogging_prompts_my_site_card_view_answers" + const val SOURCE_POST_LIST_SAVED_POST_NOTICE = + "post_list_saved_post_notice" + + @JvmStatic + fun trackTag(stat: Stat, tag: String) { + val properties = mutableMapOf("tag" to tag) + AnalyticsTracker.track(stat, properties) + } + + fun isUserProfileSource(source: String): Boolean { + return (source == SOURCE_READER_LIKE_LIST_USER_PROFILE || + source == SOURCE_NOTIF_LIKE_LIST_USER_PROFILE || + source == SOURCE_USER_PROFILE_UNKNOWN) + } + } +} From 1964c4802676700930129822e5142f7a8ab0281f Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:44:14 -0600 Subject: [PATCH 18/26] Move 8 more use cases and view models to `:libs:reader` Now that ReaderTracker is an interface in libs:reader, files that depended on it can move. Move use cases, view models, and helper classes that are now fully resolved against library modules. Moved files: - comments/ThreadedCommentsActionSource - viewmodels/ReaderModeInfo - repository/usecases: GetPostsForTagUseCase, GetNumPostsForTagUseCase, ShouldAutoUpdateTagUseCase, GetPostsForTagWithCountUseCase - repository/usecases/tags/GetFollowedTagsUseCase - usecases/ReaderGetPostUseCase Co-Authored-By: Claude Opus 4.6 --- .../android/ui/reader/comments/ThreadedCommentsActionSource.kt | 0 .../ui/reader/repository/usecases/GetNumPostsForTagUseCase.kt | 0 .../ui/reader/repository/usecases/GetPostsForTagUseCase.kt | 0 .../reader/repository/usecases/GetPostsForTagWithCountUseCase.kt | 0 .../ui/reader/repository/usecases/ShouldAutoUpdateTagUseCase.kt | 0 .../ui/reader/repository/usecases/tags/GetFollowedTagsUseCase.kt | 0 .../wordpress/android/ui/reader/usecases/ReaderGetPostUseCase.kt | 0 .../org/wordpress/android/ui/reader/viewmodels/ReaderModeInfo.kt | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/comments/ThreadedCommentsActionSource.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetNumPostsForTagUseCase.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagUseCase.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagWithCountUseCase.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ShouldAutoUpdateTagUseCase.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/GetFollowedTagsUseCase.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderGetPostUseCase.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderModeInfo.kt (100%) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/comments/ThreadedCommentsActionSource.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/comments/ThreadedCommentsActionSource.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/comments/ThreadedCommentsActionSource.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/comments/ThreadedCommentsActionSource.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetNumPostsForTagUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetNumPostsForTagUseCase.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetNumPostsForTagUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetNumPostsForTagUseCase.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagUseCase.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagUseCase.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagWithCountUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagWithCountUseCase.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagWithCountUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/GetPostsForTagWithCountUseCase.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ShouldAutoUpdateTagUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ShouldAutoUpdateTagUseCase.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ShouldAutoUpdateTagUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ShouldAutoUpdateTagUseCase.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/GetFollowedTagsUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/GetFollowedTagsUseCase.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/GetFollowedTagsUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/GetFollowedTagsUseCase.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderGetPostUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderGetPostUseCase.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderGetPostUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderGetPostUseCase.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderModeInfo.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderModeInfo.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderModeInfo.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/viewmodels/ReaderModeInfo.kt From 0d5a326a6002b6a284fc571e21aacbe4cdb84b3b Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 13:18:19 -0600 Subject: [PATCH 19/26] Move SnackbarMessageHolder to core-ui, add NetworkAvailability interface - Move SnackbarMessageHolder to `:libs:core-ui` and fix cross-module smart cast issues for buttonTitle in 20 call sites - Create NetworkAvailability interface in `:libs:utils` and have NetworkUtilsWrapper implement it, wired via Hilt @Binds - Update 10 reader use cases to depend on the interface - Move ReaderSiteNotificationsUseCase and ReaderBlogSubscriptionUseCase to `:libs:reader` (now unblocked by interface abstraction) Co-Authored-By: Claude Opus 4.6 --- .../java/org/wordpress/android/modules/ReaderModule.kt | 7 +++++++ .../BloggingPromptsOnboardingDialogFragment.kt | 4 ++-- .../ui/comments/unified/UnifiedCommentListFragment.kt | 4 ++-- .../ui/comments/unified/UnifiedCommentsEditFragment.kt | 4 ++-- .../android/ui/engagement/EngagedPeopleListFragment.kt | 4 ++-- .../jetpack/backup/download/BackupDownloadFragment.kt | 5 +++-- .../android/ui/jetpack/restore/RestoreFragment.kt | 5 +++-- .../android/ui/mediapicker/MediaPickerFragment.kt | 4 ++-- .../org/wordpress/android/ui/mysite/MySiteFragment.kt | 4 ++-- .../wordpress/android/ui/mysite/menu/MenuActivity.kt | 4 ++-- .../org/wordpress/android/ui/pages/PagesFragment.kt | 5 +++-- .../wordpress/android/ui/posts/PostsListActivity.kt | 4 ++-- .../prefs/accountsettings/AccountSettingsFragment.kt | 4 ++-- .../android/ui/reader/ReaderCommentListActivity.kt | 6 ++---- .../android/ui/reader/ReaderPostDetailFragment.kt | 5 +++-- .../android/ui/reader/ReaderPostListFragment.kt | 7 +++---- .../android/ui/reader/ReaderTagsFeedFragment.kt | 5 +++-- .../ui/reader/discover/ReaderDiscoverFragment.kt | 5 +++-- .../discover/interests/ReaderInterestsFragment.kt | 5 +++-- .../ui/reader/repository/usecases/BlockBlogUseCase.kt | 6 +++--- .../ui/reader/repository/usecases/PostLikeUseCase.kt | 6 +++--- .../usecases/tags/FollowInterestTagsUseCase.kt | 6 +++--- .../ui/reader/usecases/ReaderFetchPostUseCase.kt | 6 +++--- .../reader/usecases/ReaderFetchRelatedPostsUseCase.kt | 6 +++--- .../ui/reader/usecases/ReaderFetchSiteUseCase.kt | 6 +++--- .../ui/reader/usecases/ReaderPostBookmarkUseCase.kt | 6 +++--- .../ui/reader/usecases/ReaderSiteFollowUseCase.kt | 6 +++--- .../android/ui/stats/refresh/StatsFragment.kt | 5 +++-- .../android/ui/stats/refresh/StatsViewAllFragment.kt | 5 +++-- .../org/wordpress/android/util/NetworkUtilsWrapper.kt | 5 +++-- .../android/ui/pages/SnackbarMessageHolder.kt | 0 .../subscription/ReaderBlogSubscriptionUseCase.kt | 10 +++++----- .../reader/usecases/ReaderSiteNotificationsUseCase.kt | 6 +++--- .../org/wordpress/android/util/NetworkAvailability.kt | 9 +++++++++ 34 files changed, 101 insertions(+), 78 deletions(-) rename {WordPress => libs/core-ui}/src/main/java/org/wordpress/android/ui/pages/SnackbarMessageHolder.kt (100%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt (92%) rename {WordPress => libs/reader}/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt (96%) create mode 100644 libs/utils/src/main/java/org/wordpress/android/util/NetworkAvailability.kt diff --git a/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt b/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt index bfc9fd340ef2..65bc6f301d9e 100644 --- a/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt +++ b/WordPress/src/main/java/org/wordpress/android/modules/ReaderModule.kt @@ -6,10 +6,17 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import org.wordpress.android.ui.reader.tracker.ReaderTracker import org.wordpress.android.ui.reader.tracker.ReaderTrackerImpl +import org.wordpress.android.util.NetworkAvailability +import org.wordpress.android.util.NetworkUtilsWrapper @InstallIn(SingletonComponent::class) @Module interface ReaderModule { @Binds fun bindReaderTracker(impl: ReaderTrackerImpl): ReaderTracker + + @Binds + fun bindNetworkAvailability( + impl: NetworkUtilsWrapper + ): NetworkAvailability } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt index 7191a73dfb2c..1bc783875634 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/bloggingprompts/onboarding/BloggingPromptsOnboardingDialogFragment.kt @@ -213,9 +213,9 @@ class BloggingPromptsOnboardingDialogFragment : FeatureIntroductionDialogFragmen textRes = holder.message, duration = Snackbar.LENGTH_LONG ), - holder.buttonTitle?.let { + holder.buttonTitle?.let { buttonTitle -> Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt index 83b857631c44..db8c587e06fd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentListFragment.kt @@ -137,9 +137,9 @@ class UnifiedCommentListFragment : Fragment(R.layout.unified_comment_list_fragme textRes = snackbarMessage.message, duration = Snackbar.LENGTH_LONG ), - snackbarMessage.buttonTitle?.let { + snackbarMessage.buttonTitle?.let { buttonTitle -> Action( - textRes = snackbarMessage.buttonTitle, + textRes = buttonTitle, clickListener = { snackbarMessage.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt index 6944bda90e1d..0f75e78b0d5d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/unified/UnifiedCommentsEditFragment.kt @@ -167,9 +167,9 @@ class UnifiedCommentsEditFragment : Fragment(R.layout.unified_comments_edit_frag textRes = holder.message, duration = Snackbar.LENGTH_LONG ), - holder.buttonTitle?.let { + holder.buttonTitle?.let { buttonTitle -> Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt index 3c5937d693f3..aeed8d698201 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/engagement/EngagedPeopleListFragment.kt @@ -257,9 +257,9 @@ class EngagedPeopleListFragment : Fragment() { textRes = holder.message, duration = Snackbar.LENGTH_LONG ), - holder.buttonTitle?.let { + holder.buttonTitle?.let { buttonTitle -> Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt index 3de66a6fbf5b..8cd6e56097c5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/backup/download/BackupDownloadFragment.kt @@ -170,11 +170,12 @@ class BackupDownloadFragment : Fragment(R.layout.jetpack_backup_restore_fragment uiHelpers.getTextOfUiString(requireContext(), this.message), Snackbar.LENGTH_LONG ) - if (this.buttonTitle != null) { + val buttonTitle = this.buttonTitle + if (buttonTitle != null) { snackbar.setAction( uiHelpers.getTextOfUiString( requireContext(), - this.buttonTitle + buttonTitle ) ) { this.buttonAction.invoke() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt index e96d40655b18..ba26e299a9b1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/jetpack/restore/RestoreFragment.kt @@ -146,11 +146,12 @@ class RestoreFragment : Fragment(R.layout.jetpack_backup_restore_fragment) { uiHelpers.getTextOfUiString(requireContext(), this.message), Snackbar.LENGTH_LONG ) - if (this.buttonTitle != null) { + val buttonTitle = this.buttonTitle + if (buttonTitle != null) { snackbar.setAction( uiHelpers.getTextOfUiString( requireContext(), - this.buttonTitle + buttonTitle ) ) { this.buttonAction.invoke() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt index 0cc36b81d55d..c34affc21e81 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mediapicker/MediaPickerFragment.kt @@ -590,9 +590,9 @@ class MediaPickerFragment : Fragment(), MenuProvider { textRes = holder.message, duration = Snackbar.LENGTH_LONG ), - holder.buttonTitle?.let { + holder.buttonTitle?.let { buttonTitle -> Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, 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 70e91a592d3a..22a6d3779b15 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 @@ -437,9 +437,9 @@ class MySiteFragment : Fragment(R.layout.my_site_fragment), duration = holder.duration, isImportant = holder.isImportant ), - action = holder.buttonTitle?.let { + action = holder.buttonTitle?.let { buttonTitle -> SnackbarItem.Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt index 4a2a3631cf1a..d9d21f964582 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/mysite/menu/MenuActivity.kt @@ -174,9 +174,9 @@ class MenuActivity : BaseAppCompatActivity() { duration = holder.duration, isImportant = holder.isImportant ), - action = holder.buttonTitle?.let { + action = holder.buttonTitle?.let { buttonTitle -> SnackbarItem.Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt index fb1d3a868c42..be5cd97633f7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/pages/PagesFragment.kt @@ -448,7 +448,8 @@ class PagesFragment : Fragment(R.layout.pages_fragment), ScrollableViewInitializ ) { val parent = activity.findViewById(R.id.coordinatorLayout) if (holder != null && parent != null) { - if (holder.buttonTitle == null) { + val buttonTitle = holder.buttonTitle + if (buttonTitle == null) { WPSnackbar.make( parent, uiHelpers.getTextOfUiString(requireContext(), holder.message), @@ -463,7 +464,7 @@ class PagesFragment : Fragment(R.layout.pages_fragment), ScrollableViewInitializ snackbar.setAction( uiHelpers.getTextOfUiString( requireContext(), - holder.buttonTitle + buttonTitle ) ) { holder.buttonAction() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt index a9b528ef0467..d8049be7361c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListActivity.kt @@ -398,9 +398,9 @@ class PostsListActivity : BaseAppCompatActivity(), textRes = holder.message, duration = Snackbar.LENGTH_LONG ), - holder.buttonTitle?.let { + holder.buttonTitle?.let { buttonTitle -> SnackbarItem.Action( - textRes = holder.buttonTitle, + textRes = buttonTitle, clickListener = { holder.buttonAction() } ) }, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/accountsettings/AccountSettingsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/prefs/accountsettings/AccountSettingsFragment.kt index 59f72e71055f..8e7037646d0e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/accountsettings/AccountSettingsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/accountsettings/AccountSettingsFragment.kt @@ -311,9 +311,9 @@ class AccountSettingsFragment : PreferenceFragmentLifeCycleOwner(), uiHelpers.getTextOfUiString(context, snackBarMessage.message), BaseTransientBottomBar.LENGTH_INDEFINITE ) - snackBarMessage.buttonTitle?.let { + snackBarMessage.buttonTitle?.let { buttonTitle -> emailSnackbar?.setAction( - uiHelpers.getTextOfUiString(context, snackBarMessage.buttonTitle) + uiHelpers.getTextOfUiString(context, buttonTitle) ) { snackBarMessage.buttonAction } } val textView = emailSnackbar?.view diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt index 4e7ee8b610b8..26a3143368d8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt @@ -373,13 +373,11 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), Snackbar.LENGTH_LONG ) .setAction( - if (buttonTitle != null) { + buttonTitle?.let { uiHelpers.getTextOfUiString( this@ReaderCommentListActivity, - buttonTitle + it ) - } else { - null } ) { buttonAction.invoke() } .show() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt index 691f203b19b6..e6b01c1e2b4d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostDetailFragment.kt @@ -1030,8 +1030,9 @@ class ReaderPostDetailFragment : ViewPagerFragment(), uiHelpers.getTextOfUiString(requireContext(), this.message), Snackbar.LENGTH_LONG ).setAnchorView(layoutFooterBinding.root) - if (this.buttonTitle != null) { - snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), this.buttonTitle)) { + val buttonTitle = this.buttonTitle + if (buttonTitle != null) { + snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), buttonTitle)) { this.buttonAction.invoke() } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.kt index a15bdb7598f4..d35373f71c30 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.kt @@ -624,12 +624,11 @@ class ReaderPostListFragment : ViewPagerFragment(), OnPostSelectedListener, OnFo duration = holder.duration, isImportant = holder.isImportant ), - if (holder.buttonTitle != null) + holder.buttonTitle?.let { buttonTitle -> SnackbarItem.Action( - holder.buttonTitle + buttonTitle ) { holder.buttonAction.invoke() } - else - null + } ) ) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt index ae110344e17f..bd20cbcc03df 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderTagsFeedFragment.kt @@ -297,8 +297,9 @@ class ReaderTagsFeedFragment : Fragment(R.layout.reader_tag_feed_fragment_layout uiHelpers.getTextOfUiString(requireContext(), message), Snackbar.LENGTH_LONG ) - if (buttonTitle != null) { - snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), buttonTitle)) { + val localButtonTitle = buttonTitle + if (localButtonTitle != null) { + snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), localButtonTitle)) { buttonAction.invoke() } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt index db671d2a0ebf..ac83abc153fa 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverFragment.kt @@ -257,8 +257,9 @@ class ReaderDiscoverFragment : ViewPagerFragment(R.layout.reader_discover_fragme uiHelpers.getTextOfUiString(requireContext(), this.message), Snackbar.LENGTH_LONG ) - if (this.buttonTitle != null) { - snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), this.buttonTitle)) { + val buttonTitle = this.buttonTitle + if (buttonTitle != null) { + snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), buttonTitle)) { this.buttonAction.invoke() } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt index 4dd50467ed38..7d17de382fcd 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/discover/interests/ReaderInterestsFragment.kt @@ -149,8 +149,9 @@ class ReaderInterestsFragment : Fragment(R.layout.reader_interests_fragment_layo uiHelpers.getTextOfUiString(requireContext(), this.message), Snackbar.LENGTH_LONG ) - if (this.buttonTitle != null) { - snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), this.buttonTitle)) { + val buttonTitle = this.buttonTitle + if (buttonTitle != null) { + snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), buttonTitle)) { this.buttonAction.invoke() } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/BlockBlogUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/BlockBlogUseCase.kt index 1ac96e183f02..6d04f45ade4c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/BlockBlogUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/BlockBlogUseCase.kt @@ -12,14 +12,14 @@ import org.wordpress.android.ui.reader.repository.usecases.BlockSiteState.Failed import org.wordpress.android.ui.reader.repository.usecases.BlockSiteState.SiteBlockedInLocalDb import org.wordpress.android.ui.reader.repository.usecases.BlockSiteState.Success import org.wordpress.android.ui.reader.tracker.ReaderTracker -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine class BlockBlogUseCase @Inject constructor( - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val readerTracker: ReaderTracker, private val readerBlogActionsWrapper: ReaderBlogActionsWrapper ) { @@ -32,7 +32,7 @@ class BlockBlogUseCase @Inject constructor( ) = flow { // Blocking multiple sites in parallel isn't supported as the user would lose the ability to undo the action if (continuation == null) { - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { emit(NoNetwork) } else { performAction(blogId, feedId) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/PostLikeUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/PostLikeUseCase.kt index afa12a4f18a5..2a226999bfa6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/PostLikeUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/PostLikeUseCase.kt @@ -14,7 +14,7 @@ import org.wordpress.android.ui.reader.repository.usecases.PostLikeUseCase.PostL import org.wordpress.android.ui.reader.repository.usecases.PostLikeUseCase.PostLikeState.Success import org.wordpress.android.ui.reader.repository.usecases.PostLikeUseCase.PostLikeState.Unchanged import org.wordpress.android.ui.reader.tracker.ReaderTracker -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume @@ -23,7 +23,7 @@ class PostLikeUseCase @Inject constructor( private val readerPostActionsWrapper: ReaderPostActionsWrapper, private val readerTracker: ReaderTracker, private val accountStore: AccountStore, - private val networkUtilsWrapper: NetworkUtilsWrapper + private val networkAvailability: NetworkAvailability ) { private val continuations: MutableMap?> = mutableMapOf() @@ -36,7 +36,7 @@ class PostLikeUseCase @Inject constructor( val wpComUserId = accountStore.account.userId val request = PostLikeRequest(post.postId, post.blogId, isAskingToLike, wpComUserId) - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { emit(Failed.NoNetwork) return@flow } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/FollowInterestTagsUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/FollowInterestTagsUseCase.kt index 8e171e262261..c63854549918 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/FollowInterestTagsUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/tags/FollowInterestTagsUseCase.kt @@ -11,7 +11,7 @@ import org.wordpress.android.ui.reader.repository.ReaderRepositoryCommunication. import org.wordpress.android.ui.reader.repository.ReaderRepositoryCommunication.Error.RemoteRequestFailure import org.wordpress.android.ui.reader.repository.ReaderRepositoryCommunication.Success import org.wordpress.android.util.EventBusWrapper -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume @@ -19,7 +19,7 @@ import kotlin.coroutines.suspendCoroutine class FollowInterestTagsUseCase @Inject constructor( private val eventBusWrapper: EventBusWrapper, - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val accountStore: AccountStore ) { private var continuation: Continuation? = null @@ -30,7 +30,7 @@ class FollowInterestTagsUseCase @Inject constructor( throw IllegalStateException("Follow interest tags already in progress.") } val isLoggedIn = accountStore.hasAccessToken() - if (isLoggedIn && !networkUtilsWrapper.isNetworkAvailable()) { + if (isLoggedIn && !networkAvailability.isNetworkAvailable()) { return NetworkUnavailable } return suspendCoroutine { cont -> diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchPostUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchPostUseCase.kt index aec69120a459..f55c7b8f0db6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchPostUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchPostUseCase.kt @@ -9,20 +9,20 @@ import org.wordpress.android.ui.reader.usecases.ReaderFetchPostUseCase.FetchRead import org.wordpress.android.ui.reader.usecases.ReaderFetchPostUseCase.FetchReaderPostState.Failed.PostNotFound import org.wordpress.android.ui.reader.usecases.ReaderFetchPostUseCase.FetchReaderPostState.Failed.RequestFailed import org.wordpress.android.ui.reader.usecases.ReaderFetchPostUseCase.FetchReaderPostState.Success -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import java.net.HttpURLConnection import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume class ReaderFetchPostUseCase @Inject constructor( - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val readerPostActionsWrapper: ReaderPostActionsWrapper ) { private val continuations: MutableMap?> = mutableMapOf() suspend fun fetchPost(blogId: Long, postId: Long, isFeed: Boolean): FetchReaderPostState { - return if (!networkUtilsWrapper.isNetworkAvailable()) { + return if (!networkAvailability.isNetworkAvailable()) { NoNetwork } else { val requestParams = FetchPostRequestParams(blogId, postId, isFeed) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchRelatedPostsUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchRelatedPostsUseCase.kt index eda1210cd0f8..a02531ca4e66 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchRelatedPostsUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchRelatedPostsUseCase.kt @@ -11,13 +11,13 @@ import org.wordpress.android.ui.reader.usecases.ReaderFetchRelatedPostsUseCase.F import org.wordpress.android.ui.reader.usecases.ReaderFetchRelatedPostsUseCase.FetchRelatedPostsState.Failed.NoNetwork import org.wordpress.android.ui.reader.usecases.ReaderFetchRelatedPostsUseCase.FetchRelatedPostsState.Failed.RequestFailed import org.wordpress.android.ui.reader.usecases.ReaderFetchRelatedPostsUseCase.FetchRelatedPostsState.Success -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume class ReaderFetchRelatedPostsUseCase @Inject constructor( - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val readerPostActionsWrapper: ReaderPostActionsWrapper ) { private val continuations: MutableMap?> = mutableMapOf() @@ -28,7 +28,7 @@ class ReaderFetchRelatedPostsUseCase @Inject constructor( return when { continuations[request] != null -> AlreadyRunning - !networkUtilsWrapper.isNetworkAvailable() -> NoNetwork + !networkAvailability.isNetworkAvailable() -> NoNetwork else -> { suspendCancellableCoroutine { cont -> diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchSiteUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchSiteUseCase.kt index eb8a9d91f344..dff785e02c5d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchSiteUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderFetchSiteUseCase.kt @@ -7,20 +7,20 @@ import org.wordpress.android.ui.reader.usecases.ReaderFetchSiteUseCase.FetchSite import org.wordpress.android.ui.reader.usecases.ReaderFetchSiteUseCase.FetchSiteState.Failed.NoNetwork import org.wordpress.android.ui.reader.usecases.ReaderFetchSiteUseCase.FetchSiteState.Failed.RequestFailed import org.wordpress.android.ui.reader.usecases.ReaderFetchSiteUseCase.FetchSiteState.Success -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine class ReaderFetchSiteUseCase @Inject constructor( - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val readerBlogActionsWrapper: ReaderBlogActionsWrapper ) { private val continuations: MutableMap?> = mutableMapOf() suspend fun fetchSite(blogId: Long, feedId: Long, blogUrl: String? = null): FetchSiteState { - return if (!networkUtilsWrapper.isNetworkAvailable()) { + return if (!networkAvailability.isNetworkAvailable()) { NoNetwork } else { val requestParams = FetchSiteRequestParams(blogId, feedId, blogUrl) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderPostBookmarkUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderPostBookmarkUseCase.kt index 1c7afa150b13..41780ca82bde 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderPostBookmarkUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderPostBookmarkUseCase.kt @@ -9,7 +9,7 @@ import org.wordpress.android.ui.reader.actions.ReaderPostActionsWrapper import org.wordpress.android.ui.reader.tracker.ReaderTracker import org.wordpress.android.ui.reader.usecases.BookmarkPostState.PreLoadPostContent import org.wordpress.android.ui.reader.usecases.BookmarkPostState.Success -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject /** @@ -18,7 +18,7 @@ import javax.inject.Inject */ class ReaderPostBookmarkUseCase @Inject constructor( private val readerTracker: ReaderTracker, - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val readerPostActionsWrapper: ReaderPostActionsWrapper, private val readerPostTableWrapper: ReaderPostTableWrapper ) { @@ -39,7 +39,7 @@ class ReaderPostBookmarkUseCase @Inject constructor( blogId: Long, postId: Long ) { - val cachePostContent = bookmarked && networkUtilsWrapper.isNetworkAvailable() && !isBookmarkList + val cachePostContent = bookmarked && networkAvailability.isNetworkAvailable() && !isBookmarkList if (cachePostContent) { emit(PreLoadPostContent(blogId, postId)) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteFollowUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteFollowUseCase.kt index 8a4862ce9fd5..e2efc903b4e4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteFollowUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteFollowUseCase.kt @@ -12,7 +12,7 @@ import org.wordpress.android.ui.reader.usecases.ReaderSiteFollowUseCase.FollowSi import org.wordpress.android.ui.reader.usecases.ReaderSiteFollowUseCase.FollowSiteState.FollowStatusChanged import org.wordpress.android.ui.reader.usecases.ReaderSiteFollowUseCase.FollowSiteState.Success import org.wordpress.android.ui.reader.utils.ReaderUtilsWrapper -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume @@ -22,7 +22,7 @@ import kotlin.coroutines.suspendCoroutine * This class handles reader blog follow click events. */ class ReaderSiteFollowUseCase @Inject constructor( - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, private val readerBlogActionsWrapper: ReaderBlogActionsWrapper, private val readerBlogTableWrapper: ReaderBlogTableWrapper, private val readerUtilsWrapper: ReaderUtilsWrapper, @@ -35,7 +35,7 @@ class ReaderSiteFollowUseCase @Inject constructor( source: String ) = flow { val (blogId, feedId) = param - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { emit(NoNetwork) } else { // There is already an action running for this request diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt index bd5315d5a1af..9ce62dcdce19 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt @@ -331,7 +331,8 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ ) { val parent = activity.findViewById(R.id.coordinatorLayout) if (holder != null && parent != null) { - if (holder.buttonTitle == null) { + val buttonTitle = holder.buttonTitle + if (buttonTitle == null) { WPSnackbar.make( parent, uiHelpers.getTextOfUiString(requireContext(), holder.message), @@ -343,7 +344,7 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ uiHelpers.getTextOfUiString(requireContext(), holder.message), Snackbar.LENGTH_LONG ) - snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), holder.buttonTitle)) { + snackbar.setAction(uiHelpers.getTextOfUiString(requireContext(), buttonTitle)) { holder.buttonAction() } snackbar.show() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt index d34e0ebf75b7..d3b7870cd252 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsViewAllFragment.kt @@ -261,7 +261,8 @@ class StatsViewAllFragment : Fragment(R.layout.stats_view_all_fragment) { ) { val parent = activity.findViewById(R.id.coordinatorLayout) if (parent != null) { - if (holder.buttonTitle == null) { + val buttonTitle = holder.buttonTitle + if (buttonTitle == null) { WPSnackbar.make( parent, uiHelpers.getTextOfUiString(requireContext(), holder.message), @@ -274,7 +275,7 @@ class StatsViewAllFragment : Fragment(R.layout.stats_view_all_fragment) { Snackbar.LENGTH_LONG ) snackbar.setAction( - uiHelpers.getTextOfUiString(requireContext(), holder.buttonTitle) + uiHelpers.getTextOfUiString(requireContext(), buttonTitle) ) { holder.buttonAction() } snackbar.show() } diff --git a/WordPress/src/main/java/org/wordpress/android/util/NetworkUtilsWrapper.kt b/WordPress/src/main/java/org/wordpress/android/util/NetworkUtilsWrapper.kt index 4042abc16860..8413159c2f7e 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/NetworkUtilsWrapper.kt +++ b/WordPress/src/main/java/org/wordpress/android/util/NetworkUtilsWrapper.kt @@ -5,9 +5,10 @@ import org.wordpress.android.WordPress import javax.inject.Inject @Reusable -class NetworkUtilsWrapper @Inject constructor() { +class NetworkUtilsWrapper @Inject constructor() : NetworkAvailability { /** * Returns true if a network connection is available. */ - fun isNetworkAvailable() = NetworkUtils.isNetworkAvailable(WordPress.getContext()) + override fun isNetworkAvailable() = + NetworkUtils.isNetworkAvailable(WordPress.getContext()) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/pages/SnackbarMessageHolder.kt b/libs/core-ui/src/main/java/org/wordpress/android/ui/pages/SnackbarMessageHolder.kt similarity index 100% rename from WordPress/src/main/java/org/wordpress/android/ui/pages/SnackbarMessageHolder.kt rename to libs/core-ui/src/main/java/org/wordpress/android/ui/pages/SnackbarMessageHolder.kt diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt similarity index 92% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt index 282fc04a75f9..bc325280bf8c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt +++ b/libs/reader/src/main/java/org/wordpress/android/ui/reader/subscription/ReaderBlogSubscriptionUseCase.kt @@ -13,14 +13,14 @@ import org.wordpress.android.fluxc.store.AccountStore.AddOrDeleteSubscriptionPay import org.wordpress.android.fluxc.store.AccountStore.AddOrDeleteSubscriptionPayload.SubscriptionAction import org.wordpress.android.fluxc.store.AccountStore.OnSubscriptionUpdated import org.wordpress.android.modules.BG_THREAD -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import javax.inject.Named class ReaderBlogSubscriptionUseCase @Inject constructor( private val dispatcher: Dispatcher, private val accountStore: AccountStore, - private val networkUtilsWrapper: NetworkUtilsWrapper, + private val networkAvailability: NetworkAvailability, @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher ) { private val updateResultChannel = Channel(Channel.CONFLATED) @@ -38,7 +38,7 @@ class ReaderBlogSubscriptionUseCase @Inject constructor( } suspend fun updateNotifyPosts(blogId: Long, enable: Boolean): UpdateResult { - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { return UpdateResult.NoNetwork } val action = if (enable) SubscriptionAction.NEW else SubscriptionAction.DELETE @@ -48,7 +48,7 @@ class ReaderBlogSubscriptionUseCase @Inject constructor( } suspend fun updateEmailPosts(blogId: Long, enable: Boolean): UpdateResult { - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { return UpdateResult.NoNetwork } val action = if (enable) SubscriptionAction.NEW else SubscriptionAction.DELETE @@ -58,7 +58,7 @@ class ReaderBlogSubscriptionUseCase @Inject constructor( } suspend fun updateEmailComments(blogId: Long, enable: Boolean): UpdateResult { - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { return UpdateResult.NoNetwork } val action = if (enable) SubscriptionAction.NEW else SubscriptionAction.DELETE diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt b/libs/reader/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt similarity index 96% rename from WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt rename to libs/reader/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt index c89721151459..e8af12f14ec0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt +++ b/libs/reader/src/main/java/org/wordpress/android/ui/reader/usecases/ReaderSiteNotificationsUseCase.kt @@ -18,7 +18,7 @@ import org.wordpress.android.ui.reader.usecases.ReaderSiteNotificationsUseCase.S import org.wordpress.android.ui.reader.usecases.ReaderSiteNotificationsUseCase.SiteNotificationState.Success import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.API -import org.wordpress.android.util.NetworkUtilsWrapper +import org.wordpress.android.util.NetworkAvailability import javax.inject.Inject import kotlin.coroutines.Continuation import kotlin.coroutines.resume @@ -31,7 +31,7 @@ class ReaderSiteNotificationsUseCase @Inject constructor( private val dispatcher: Dispatcher, private val readerTracker: ReaderTracker, private val readerBlogTableWrapper: ReaderBlogTableWrapper, - private val networkUtilsWrapper: NetworkUtilsWrapper + private val networkAvailability: NetworkAvailability ) { private var continuation: Continuation? = null @@ -42,7 +42,7 @@ class ReaderSiteNotificationsUseCase @Inject constructor( if (continuation != null) { return AlreadyRunning } - if (!networkUtilsWrapper.isNetworkAvailable()) { + if (!networkAvailability.isNetworkAvailable()) { return NoNetwork } diff --git a/libs/utils/src/main/java/org/wordpress/android/util/NetworkAvailability.kt b/libs/utils/src/main/java/org/wordpress/android/util/NetworkAvailability.kt new file mode 100644 index 000000000000..181724b60aff --- /dev/null +++ b/libs/utils/src/main/java/org/wordpress/android/util/NetworkAvailability.kt @@ -0,0 +1,9 @@ +package org.wordpress.android.util + +/** + * Abstraction for checking network availability. + * Implementations are provided via DI in the app module. + */ +interface NetworkAvailability { + fun isNetworkAvailable(): Boolean +} From a7002122cd1522366cb125b203425540a78f7948 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 2 Apr 2026 13:42:34 -0600 Subject: [PATCH 20/26] Move 260 reader string resources to `:libs:reader` Extract reader-only strings from WordPress's strings.xml to libs/reader/src/main/res/values/strings.xml. The 11 strings shared with non-reader code stay in WordPress. Update all 46 Kotlin files, 11 Java files, and 12 test files to reference moved strings via `ReaderR.string.reader_*` (Kotlin) or `org.wordpress.android.reader.R.string.reader_*` (Java). XML layout references work unchanged via resource merging. Co-Authored-By: Claude Opus 4.6 --- .../resolver/ReaderSavedPostsHelper.kt | 5 +- .../android/ui/reader/ReaderBlogFragment.java | 15 +- .../ui/reader/ReaderCommentListActivity.kt | 15 +- .../ui/reader/ReaderFollowCommentsHandler.kt | 3 +- .../ReaderLoginRequiredBottomSheetFragment.kt | 5 +- .../ui/reader/ReaderPhotoViewerActivity.java | 3 +- .../ui/reader/ReaderPostDetailFragment.kt | 13 +- .../reader/ReaderPostDetailUiStateBuilder.kt | 13 +- .../ui/reader/ReaderPostListActivity.kt | 9 +- .../ui/reader/ReaderPostListFragment.kt | 65 ++--- .../android/ui/reader/ReaderPostRenderer.kt | 3 +- .../android/ui/reader/ReaderSubsActivity.java | 46 ++- .../android/ui/reader/ReaderTagFragment.java | 6 +- .../ui/reader/adapters/ReaderBlogAdapter.java | 5 +- .../reader/adapters/ReaderCommentAdapter.java | 36 ++- .../ui/reader/adapters/ReaderPostAdapter.java | 5 +- .../ui/reader/adapters/ReaderTagAdapter.java | 3 +- .../ui/reader/discover/ReaderCardUiState.kt | 5 +- .../discover/ReaderDiscoverViewModel.kt | 19 +- .../reader/discover/ReaderNavigationEvents.kt | 5 +- .../discover/ReaderPostCardActionsHandler.kt | 31 +- .../ReaderPostMoreButtonUiStateBuilder.kt | 29 +- .../discover/ReaderPostUiStateBuilder.kt | 9 +- .../interests/ReaderInterestsActivity.kt | 3 +- .../interests/ReaderInterestsViewModel.kt | 19 +- .../reader/models/ReaderReadingPreferences.kt | 31 +- .../services/update/ReaderUpdateLogic.java | 17 +- .../ui/reader/subfilter/SubfilterListItem.kt | 5 +- .../reader/subfilter/SubfilterPageFragment.kt | 5 +- .../ReaderSubscriptionSettingsScreen.kt | 9 +- .../ReaderSubscriptionSettingsViewModel.kt | 3 +- .../reader/usecases/LoadReaderItemsUseCase.kt | 5 +- .../usecases/ReaderCommentsFollowUseCase.kt | 13 +- .../usecases/ReaderSeenStatusToggleUseCase.kt | 7 +- .../utils/PostSeenStatusApiCallsProvider.kt | 5 +- .../utils/PostSubscribersApiCallsProvider.kt | 35 +-- .../reader/utils/ReaderAnnouncementHelper.kt | 9 +- .../ui/reader/utils/ReaderTopBarMenuHelper.kt | 17 +- .../android/ui/reader/utils/ReaderUtils.kt | 29 +- .../viewmodels/ReaderPostDetailViewModel.kt | 23 +- .../viewmodels/ReaderPostListViewModel.kt | 3 +- .../viewmodels/SubfilterPageViewModel.kt | 21 +- .../tagsfeed/ReaderTagsFeedViewModel.kt | 3 +- .../reader/views/ReaderExpandableTagsView.kt | 5 +- .../ui/reader/views/ReaderFollowButton.kt | 3 +- ...aderPostDetailsHeaderViewUiStateBuilder.kt | 3 +- .../ui/reader/views/ReaderSiteHeaderView.java | 17 +- .../views/ReaderSiteSearchResultView.java | 5 +- .../views/compose/ReaderAnnouncementCard.kt | 17 +- .../reader/views/compose/ReaderTopAppBar.kt | 11 +- .../compose/dropdown/JetpackDropdownMenu.kt | 3 +- .../compose/filter/ReaderFilterChipGroup.kt | 13 +- .../ReadingPreferencesButtons.kt | 7 +- .../ReadingPreferencesFontSizeSlider.kt | 5 +- .../ReadingPreferencesScreen.kt | 7 +- .../views/compose/tagsfeed/ReaderTagsFeed.kt | 19 +- .../tagsfeed/ReaderTagsFeedPostListItem.kt | 11 +- WordPress/src/main/res/values/strings.xml | 266 +----------------- .../ReaderPostDetailUiStateBuilderTest.kt | 7 +- .../discover/ReaderDiscoverViewModelTest.kt | 3 +- .../ReaderPostMoreButtonUiStateBuilderTest.kt | 17 +- .../interests/ReaderInterestsViewModelTest.kt | 15 +- ...ReaderSubscriptionSettingsViewModelTest.kt | 7 +- .../usecases/LoadReaderItemsUseCaseTest.kt | 3 +- .../ReaderCommentsFollowUseCaseTest.kt | 7 +- .../ReaderPostSeenStatusToggleUseCaseTest.kt | 7 +- .../utils/ReaderAnnouncementHelperTest.kt | 13 +- .../utils/ReaderTopBarMenuHelperTest.kt | 57 ++-- .../ReaderPostDetailViewModelTest.kt | 13 +- .../reader/SubfilterPageViewModelTest.kt | 23 +- libs/reader/src/main/res/values/strings.xml | 263 +++++++++++++++++ 71 files changed, 778 insertions(+), 659 deletions(-) create mode 100644 libs/reader/src/main/res/values/strings.xml diff --git a/WordPress/src/main/java/org/wordpress/android/reader/savedposts/resolver/ReaderSavedPostsHelper.kt b/WordPress/src/main/java/org/wordpress/android/reader/savedposts/resolver/ReaderSavedPostsHelper.kt index f57a6835225b..08681fde54e4 100644 --- a/WordPress/src/main/java/org/wordpress/android/reader/savedposts/resolver/ReaderSavedPostsHelper.kt +++ b/WordPress/src/main/java/org/wordpress/android/reader/savedposts/resolver/ReaderSavedPostsHelper.kt @@ -1,6 +1,7 @@ package org.wordpress.android.reader.savedposts.resolver import org.wordpress.android.R +import org.wordpress.android.reader.R as ReaderR import org.wordpress.android.datasets.wrappers.ReaderDatabaseWrapper import org.wordpress.android.datasets.wrappers.ReaderPostTableWrapper import org.wordpress.android.datasets.wrappers.ReaderTagTableWrapper @@ -48,8 +49,8 @@ class ReaderSavedPostsHelper @Inject constructor( readerTagTableWrapper.addOrUpdateTag( ReaderTag( "", - contextProvider.getContext().getString(R.string.reader_save_for_later_display_name), - contextProvider.getContext().getString(R.string.reader_save_for_later_title), + contextProvider.getContext().getString(ReaderR.string.reader_save_for_later_display_name), + contextProvider.getContext().getString(ReaderR.string.reader_save_for_later_title), "", BOOKMARKED ) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderBlogFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderBlogFragment.java index 33ea702b6a9c..dbb3da4e944c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderBlogFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderBlogFragment.java @@ -92,7 +92,9 @@ private void checkEmptyView() { if (hasBlogAdapter() && getBlogAdapter().isEmpty()) { actionableEmptyView.setVisibility(View.VISIBLE); - actionableEmptyView.subtitle.setText(R.string.reader_no_followed_blogs_description_subs); + actionableEmptyView.subtitle.setText( + org.wordpress.android.reader.R.string + .reader_no_followed_blogs_description_subs); actionableEmptyView.image.setVisibility(View.GONE); actionableEmptyView.button.setVisibility(View.GONE); @@ -100,11 +102,15 @@ private void checkEmptyView() { case FOLLOWED: if (getBlogAdapter().hasSearchFilter()) { actionableEmptyView.updateLayoutForSearch(true, 0); - actionableEmptyView.title.setText(R.string.reader_no_followed_blogs_search_title); + actionableEmptyView.title.setText( + org.wordpress.android.reader.R.string + .reader_no_followed_blogs_search_title); actionableEmptyView.subtitle.setVisibility(View.GONE); } else { actionableEmptyView.updateLayoutForSearch(false, 0); - actionableEmptyView.title.setText(R.string.reader_no_followed_blogs_title); + actionableEmptyView.title.setText( + org.wordpress.android.reader.R.string + .reader_no_followed_blogs_title); actionableEmptyView.subtitle.setVisibility(View.VISIBLE); } break; @@ -158,7 +164,8 @@ public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflat MenuItem searchMenu = menu.findItem(R.id.menu_search); SearchView searchView = (SearchView) searchMenu.getActionView(); searchView.setMaxWidth(Integer.MAX_VALUE); - searchView.setQueryHint(getString(R.string.reader_hint_search_subscribed_blogs)); + searchView.setQueryHint(getString( + org.wordpress.android.reader.R.string.reader_hint_search_subscribed_blogs)); searchMenu.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt index 26a3143368d8..9660d899ba0c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt @@ -28,6 +28,7 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.wordpress.android.R +import org.wordpress.android.reader.R as ReaderR import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.databinding.ReaderActivityCommentListBinding import org.wordpress.android.databinding.ReaderIncludeCommentBoxBinding @@ -175,7 +176,7 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), } if (!loadPost()) { - ToastUtils.showToast(this, R.string.reader_toast_err_get_post) + ToastUtils.showToast(this, ReaderR.string.reader_toast_err_get_post) finish() return } @@ -890,7 +891,7 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), if (!accountStore.hasAccessToken()) { make( binding.coordinatorLayout, - R.string.reader_snackbar_err_cannot_like_post_logged_out, + ReaderR.string.reader_snackbar_err_cannot_like_post_logged_out, Snackbar.LENGTH_INDEFINITE ) .setAction(R.string.sign_in, mSignInClickListener) @@ -904,12 +905,12 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), if (comment == null) { ToastUtils.showToast( this@ReaderCommentListActivity, - R.string.reader_toast_err_comment_not_found + ReaderR.string.reader_toast_err_comment_not_found ) } else if (comment.isLikedByCurrentUser) { ToastUtils.showToast( this@ReaderCommentListActivity, - R.string.reader_toast_err_already_liked + ReaderR.string.reader_toast_err_already_liked ) } else { likeComment(comment) @@ -951,7 +952,7 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), } else { ToastUtils.showToast( this@ReaderCommentListActivity, - R.string.reader_toast_err_generic + ReaderR.string.reader_toast_err_generic ) } } @@ -1024,7 +1025,7 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), binding.textEmpty.setText(R.string.no_network_message) binding.textEmpty.visibility = View.VISIBLE } else if (isEmpty && hasUpdatedComments) { - binding.textEmpty.setText(R.string.reader_empty_comments) + binding.textEmpty.setText(ReaderR.string.reader_empty_comments) binding.textEmpty.visibility = View.VISIBLE } else { binding.textEmpty.visibility = View.GONE @@ -1141,7 +1142,7 @@ class ReaderCommentListActivity : BaseAppCompatActivity(), getCommentAdapter().removeComment(fakeCommentId) ToastUtils.showToast( this, - R.string.reader_toast_err_comment_failed, + ReaderR.string.reader_toast_err_comment_failed, ToastUtils.Duration.LONG ) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFollowCommentsHandler.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFollowCommentsHandler.kt index 6d61a84a4ef6..13f50bc1841b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFollowCommentsHandler.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderFollowCommentsHandler.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.MediatorLiveData import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.flowOn import org.wordpress.android.R +import org.wordpress.android.reader.R as ReaderR import org.wordpress.android.modules.BG_THREAD import org.wordpress.android.ui.pages.SnackbarMessageHolder import org.wordpress.android.ui.reader.comments.ThreadedCommentsActionSource @@ -75,7 +76,7 @@ class ReaderFollowCommentsHandler @Inject constructor( if (state.isReceivingNotifications) { UiStringRes(R.string.undo) } else { - UiStringRes(R.string.reader_followed_blog_notifications_action) + UiStringRes(ReaderR.string.reader_followed_blog_notifications_action) } }, buttonAction = onSuccessSnackbarAction ?: {} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderLoginRequiredBottomSheetFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderLoginRequiredBottomSheetFragment.kt index d46897884754..187441b5f945 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderLoginRequiredBottomSheetFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderLoginRequiredBottomSheetFragment.kt @@ -9,6 +9,7 @@ import android.widget.LinearLayout import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.wordpress.android.R +import org.wordpress.android.reader.R as ReaderR import org.wordpress.android.ui.ActivityLauncher import org.wordpress.android.widgets.WPTextView @@ -52,13 +53,13 @@ class ReaderLoginRequiredBottomSheetFragment : BottomSheetDialogFragment() { // Set the text for logged-out users view.findViewById(R.id.text).setText( - R.string.reader_filter_self_hosted_empty_blogs_list + ReaderR.string.reader_filter_self_hosted_empty_blogs_list ) // Configure primary button for login val primaryButton = view.findViewById