Skip to content
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
f00d50e
Updating library
adalpari Oct 1, 2025
dc07310
Porting the terms fetching
adalpari Oct 1, 2025
9358243
Porting create
adalpari Oct 1, 2025
9bb9e35
Porting delete term
adalpari Oct 1, 2025
5e62ed7
porting update term
adalpari Oct 1, 2025
726a4d3
Update term fix
adalpari Oct 1, 2025
3a0639b
Creating the new isHierarchical cocal field
adalpari Oct 1, 2025
6bce343
Parent fix
adalpari Oct 1, 2025
c39d8fb
Fixing tests
adalpari Oct 1, 2025
630a7b1
detekt
adalpari Oct 1, 2025
10b8ab2
Minor fix
adalpari Oct 1, 2025
03b8a91
Fixing tests
adalpari Oct 1, 2025
7347ee2
Adding the taxonomies menu view model
adalpari Oct 2, 2025
1a3a864
Adding show mechanism
adalpari Oct 2, 2025
025c3ea
Showing taxoniomies
adalpari Oct 2, 2025
a7de2e3
Adding a LiveData
adalpari Oct 2, 2025
d37d8a2
Call categories and tags screens
adalpari Oct 2, 2025
6f2bcd1
detekt and style
adalpari Oct 2, 2025
bbdc79f
Adding tests
adalpari Oct 3, 2025
8ec9ecc
Creating dataview
adalpari Oct 3, 2025
ba3efae
Style adjustments
adalpari Oct 3, 2025
b3e623b
Merge branch 'trunk' into task/cmm-814-hide-or-show-taxonomies-in-the…
adalpari Oct 3, 2025
417152b
Adjustments and setHierarchical
adalpari Oct 6, 2025
a249c0a
Proper indentation
adalpari Oct 6, 2025
543d686
Handling parent and description in details
adalpari Oct 6, 2025
d4386c9
Sorting hierarchically
adalpari Oct 6, 2025
cd96e04
Adding tests
adalpari Oct 6, 2025
c715f55
Title fix
adalpari Oct 6, 2025
e4d10fe
Removing unused string
adalpari Oct 6, 2025
13f26fc
Using server query
adalpari Oct 6, 2025
75d074d
Using server sorting
adalpari Oct 6, 2025
a6fe5ce
Merge branch 'trunk' into task/cmm-814-hide-or-show-taxonomies-in-the…
adalpari Oct 7, 2025
69ce363
Merge remote-tracking branch 'origin/task/cmm-814-hide-or-show-taxono…
adalpari Oct 7, 2025
da89442
Merge remote-tracking branch 'origin/trunk' into feature/CMM-802-Crea…
adalpari Oct 7, 2025
d2e9f03
Handling indentation in the UI style layer
adalpari Oct 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions WordPress/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,10 @@
android:name=".ui.accounts.applicationpassword.ApplicationPasswordsListActivity"
android:label="@string/application_password_info_title"
android:theme="@style/WordPress.NoActionBar" />
<activity
android:name=".ui.taxonomies.TermsDataViewActivity"
android:label="@string/taxonomies_title"
android:theme="@style/WordPress.NoActionBar" />
<activity
android:name=".ui.prefs.notifications.NotificationsSettingsActivity"
android:configChanges="orientation|screenSize"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.wordpress.android.ui.prefs.accountsettings.AccountSettingsViewModel;
import org.wordpress.android.ui.prefs.homepage.HomepageSettingsViewModel;
import org.wordpress.android.ui.prefs.language.LocalePickerViewModel;
import org.wordpress.android.ui.prefs.taxonomies.TaxonomiesNavMenuViewModel;
import org.wordpress.android.ui.prefs.timezone.SiteSettingsTimezoneViewModel;
import org.wordpress.android.ui.publicize.PublicizeListViewModel;
import org.wordpress.android.ui.reader.ReaderCommentListViewModel;
Expand Down Expand Up @@ -495,6 +496,12 @@ abstract class ViewModelModule {
@ViewModelKey(BloggingRemindersViewModel.class)
abstract ViewModel bloggingRemindersViewModel(BloggingRemindersViewModel viewModel);

@Binds
@IntoMap
@ViewModelKey(TaxonomiesNavMenuViewModel.class)
abstract ViewModel taxonomiesNavMenuViewModel(TaxonomiesNavMenuViewModel viewModel);


@Binds
@IntoMap
@ViewModelKey(LocalePickerViewModel.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@
import org.wordpress.android.ui.subscribers.SubscribersActivity;
import org.wordpress.android.ui.suggestion.SuggestionActivity;
import org.wordpress.android.ui.suggestion.SuggestionType;
import org.wordpress.android.ui.taxonomies.TermsDataViewActivity;
import org.wordpress.android.ui.themes.ThemeBrowserActivity;
import org.wordpress.android.ui.utils.PreMigrationDeepLinkData;
import org.wordpress.android.util.AppLog;
Expand Down Expand Up @@ -1899,4 +1900,9 @@
intent.putExtra(Intent.EXTRA_TITLE, title);
context.startActivity(Intent.createChooser(intent, context.getString(R.string.share_link)));
}

public static void showTermsList(@NonNull Context context, @NonNull String taxonomySlug, Boolean isHierarchical) {
Intent intent = TermsDataViewActivity.Companion.getIntent(context, taxonomySlug, isHierarchical);
context.startActivity(intent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class JetpackConnectionHelper @Inject constructor(
site.wpApiRestUrl ?: "${site.url}/wp-json"

private inner class InvalidAuthNotifier : WpAppNotifier {
override suspend fun requestedWithInvalidAuthentication() {
override suspend fun requestedWithInvalidAuthentication(requestUrl: String) {
appLogWrapper.d(AppLog.T.API, "$TAG: requestedWithInvalidAuthentication")
throw IllegalArgumentException("Invalid credentials")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class EditCategoryUseCase @Inject constructor(
existingCategory.slug,
existingCategory.description,
parentCategoryId,
existingCategory.isHierarchical,
existingCategory.postCount
)
val payload = RemoteTermPayload(editedCategory, siteModel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
import org.wordpress.android.ui.prefs.EditTextPreferenceWithValidation.ValidationType;
import org.wordpress.android.ui.prefs.SiteSettingsFormatDialog.FormatType;
import org.wordpress.android.ui.prefs.homepage.HomepageSettingsDialog;
import org.wordpress.android.ui.prefs.taxonomies.TaxonomiesNavMenuViewModel;
import org.wordpress.android.ui.prefs.timezone.SiteSettingsTimezoneBottomSheet;
import org.wordpress.android.ui.utils.UiHelpers;
import org.wordpress.android.util.AppLog;
Expand Down Expand Up @@ -114,6 +115,7 @@
import javax.inject.Inject;

import kotlin.Triple;
import uniffi.wp_api.TaxonomyTypeDetailsWithEditContext;

import static org.wordpress.android.ui.prefs.WPComSiteSettings.supportsJetpackSiteAcceleratorSettings;

Expand Down Expand Up @@ -194,6 +196,8 @@ public class SiteSettingsFragment extends PreferenceFragment

private BloggingRemindersViewModel mBloggingRemindersViewModel;

private TaxonomiesNavMenuViewModel mTaxonomiesNavMenuViewModel;

public SiteModel mSite;

// Can interface with WP.com or WP.org
Expand Down Expand Up @@ -1107,6 +1111,45 @@ public void initPreferences() {

initBloggingSection();
removeEmptyCategories();
initTaxonomies();
}

private void initTaxonomies() {
mTaxonomiesNavMenuViewModel = new ViewModelProvider(getAppCompatActivity(), mViewModelFactory)
.get(TaxonomiesNavMenuViewModel.class);
mTaxonomiesNavMenuViewModel.getTaxonomies().observe(getAppCompatActivity(), this::showTaxonomies);
mTaxonomiesNavMenuViewModel.fetchTaxonomies(mSite);
}

private void showTaxonomies(List<TaxonomyTypeDetailsWithEditContext> taxonomies) {
if (taxonomies.isEmpty()) {
return;
}
PreferenceGroup siteScreen = (PreferenceGroup) findPreference(getString(R.string.pref_key_site_screen));
if (siteScreen != null) {
// Create taxonomies preference group
final String taxonomiesPrefKey = getString(R.string.pref_key_taxonomies);
PreferenceGroup taxonomiesPreference = (PreferenceGroup) findPreference(taxonomiesPrefKey);
if (taxonomiesPreference != null) {
WPPrefUtils.removePreference(this, R.string.pref_key_site_screen, R.string.pref_key_taxonomies);
}
taxonomiesPreference = new PreferenceCategory(getActivity());
taxonomiesPreference.setTitle(getString(R.string.taxonomies_title));
taxonomiesPreference.setKey(taxonomiesPrefKey);
siteScreen.addPreference(taxonomiesPreference);

for (TaxonomyTypeDetailsWithEditContext taxonomy : taxonomies) {
Preference pref = new Preference(getActivity());
pref.setTitle(taxonomy.getName());
pref.setKey(taxonomy.getSlug());
pref.setOnPreferenceClickListener(preference -> {
ActivityLauncher.showTermsList(getActivity(), taxonomy.getSlug(), taxonomy.getHierarchical());
return false;
}
);
taxonomiesPreference.addPreference(pref);
}
}
}

private void updateHomepageSummary() {
Expand Down Expand Up @@ -2033,18 +2076,7 @@ private void removeNonSelfHostedPreferences() {
if (group != null) {
group.removeAll();
}
if (mSite.isUsingSelfHostedRestApi()) {
// Remove everything inside "Writing" preference but "Categories" and "Tags" which are now supported
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_category);
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_format);
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_date_format);
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_time_format);
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_week_start);
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_posts_per_page);
WPPrefUtils.removePreference(this, R.string.pref_key_site_writing, R.string.pref_key_site_related_posts);
} else {
WPPrefUtils.removePreference(this, R.string.pref_key_site_screen, R.string.pref_key_site_writing);
}
WPPrefUtils.removePreference(this, R.string.pref_key_site_screen, R.string.pref_key_site_writing);
WPPrefUtils.removePreference(this, R.string.pref_key_site_screen, R.string.pref_key_site_discussion);
WPPrefUtils.removePreference(this, R.string.pref_key_site_screen, R.string.pref_key_site_advanced);
WPPrefUtils.removePreference(this, R.string.pref_key_site_screen, R.string.pref_key_site_quota);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.wordpress.android.ui.prefs.taxonomies

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
import org.wordpress.android.fluxc.utils.AppLogWrapper
import org.wordpress.android.util.AppLog
import rs.wordpress.api.kotlin.WpRequestResult
import uniffi.wp_api.TaxonomyListParams
import uniffi.wp_api.TaxonomyTypeDetailsWithEditContext
import javax.inject.Inject

class TaxonomiesNavMenuViewModel @Inject constructor(
private val wpApiClientProvider: WpApiClientProvider,
private val appLogWrapper: AppLogWrapper,
) : ViewModel() {
// LiveData because this is observed from Java
private val _taxonomies = MutableLiveData<List<TaxonomyTypeDetailsWithEditContext>>()
val taxonomies: LiveData<List<TaxonomyTypeDetailsWithEditContext>> = _taxonomies

fun fetchTaxonomies(site: SiteModel) {
if (!site.isUsingSelfHostedRestApi) {
appLogWrapper.d(
AppLog.T.API,
"Taxonomies - Taxonomies cannot be fetched: Application Password not available"
)
return
}
viewModelScope.launch {
val client = wpApiClientProvider.getWpApiClient(site)
val response = client.request { requestBuilder ->
requestBuilder.taxonomies().listWithEditContext(TaxonomyListParams())
}
when (response) {
is WpRequestResult.Success -> {
val list = response.response.data
appLogWrapper.d(AppLog.T.API, "Taxonomies - Fetched taxonomies ${list.taxonomyTypes.size}")
val taxonomies = mutableListOf<TaxonomyTypeDetailsWithEditContext>()
list.taxonomyTypes.forEach { type ->
appLogWrapper.d(AppLog.T.API, "Taxonomies - Taxonomy ${type.value.name}")
if (type.value.visibility.showInNavMenus) {
taxonomies.add(type.value)
}
}
_taxonomies.value = taxonomies
}

else -> {
appLogWrapper.e(AppLog.T.API, "Taxonomies - Error fetching taxonomies")
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.wordpress.android.ui.selfhostedusers

import uniffi.wp_api.UserRole
import uniffi.wp_api.UserWithEditContext

/**
Expand All @@ -24,7 +25,7 @@ object SampleUsers {
name = "Sample User",
nickname = "User nickname",
registeredDate = "2023-01-01",
roles = listOf("admin"),
roles = listOf(UserRole.Administrator),
slug = "sample-user",
url = "example.com",
description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam non quam viverra, viverra est vel, interdum felis. Pellentesque interdum libero quis metus pharetra ullamcorper. Morbi nec libero ligula. Quisque consectetur, purus sit amet lobortis porttitor, ligula ex imperdiet massa, in ullamcorper augue odio sit amet metus. In sollicitudin mauris et risus mollis commodo. Aliquam vel vehicula ante, nec blandit erat. Aenean non turpis porttitor orci fringilla fringilla nec ac nunc. Nulla ultrices urna ut ipsum posuere blandit. Phasellus mauris nulla, tincidunt at leo at, auctor interdum felis. Sed pharetra risus a ullamcorper dictum. Suspendisse pharetra justo molestie risus lobortis facilisis.",
Expand All @@ -45,7 +46,7 @@ object SampleUsers {
name = "Sample User",
nickname = "User nickname",
registeredDate = "2023-01-01",
roles = listOf("contributor"),
roles = listOf(UserRole.Contributor),
slug = "sample-user",
url = "example.com",
)
Expand All @@ -65,7 +66,7 @@ object SampleUsers {
name = "Sample User",
nickname = "User nickname",
registeredDate = "2023-01-01",
roles = listOf("contributor", "editor", "subscriber"),
roles = listOf(UserRole.Contributor, UserRole.Editor, UserRole.Subscriber),
slug = "sample-user",
url = "example.com",
)
Expand Down
Loading