From e8d6655aaaaa4a975073a274e329778574ab9ab0 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 11 Mar 2026 11:51:34 +0100 Subject: [PATCH 1/5] fix(navigation): community fragment Signed-off-by: alperozturk96 --- ...tyActivityIT.kt => CommunityFragmentIT.kt} | 12 +- app/src/main/AndroidManifest.xml | 7 +- .../nextcloud/client/di/ComponentsModule.java | 13 +- .../android/ui/activity/CommunityActivity.kt | 135 ------------- .../android/ui/activity/DrawerActivity.java | 9 +- .../fragment/community/CommunityFragment.kt | 103 ++++++++++ .../android/ui/navigation/Navigator.kt | 28 +++ .../ui/navigation/NavigatorActivity.kt | 65 +++++++ .../android/ui/navigation/NavigatorScreen.kt | 17 ++ .../main/res/layout/activity_navigator.xml | 35 ++++ app/src/main/res/layout/community_layout.xml | 182 ------------------ app/src/main/res/layout/files.xml | 9 + .../main/res/layout/fragment_community.xml | 154 +++++++++++++++ 13 files changed, 438 insertions(+), 331 deletions(-) rename app/src/androidTest/java/com/nextcloud/client/{CommunityActivityIT.kt => CommunityFragmentIT.kt} (72%) delete mode 100644 app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/navigation/Navigator.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt create mode 100644 app/src/main/java/com/owncloud/android/ui/navigation/NavigatorScreen.kt create mode 100644 app/src/main/res/layout/activity_navigator.xml delete mode 100755 app/src/main/res/layout/community_layout.xml create mode 100755 app/src/main/res/layout/fragment_community.xml diff --git a/app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.kt b/app/src/androidTest/java/com/nextcloud/client/CommunityFragmentIT.kt similarity index 72% rename from app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.kt rename to app/src/androidTest/java/com/nextcloud/client/CommunityFragmentIT.kt index ac88af2f5dc5..b7d1e1fa2a0a 100644 --- a/app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.kt +++ b/app/src/androidTest/java/com/nextcloud/client/CommunityFragmentIT.kt @@ -8,21 +8,22 @@ */ package com.nextcloud.client -import androidx.test.core.app.launchActivity +import androidx.test.core.app.ActivityScenario import androidx.test.espresso.Espresso.onView import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.isRoot import com.nextcloud.test.GrantStoragePermissionRule.Companion.grant import com.owncloud.android.AbstractIT -import com.owncloud.android.ui.activity.CommunityActivity +import com.owncloud.android.ui.navigation.NavigatorActivity +import com.owncloud.android.ui.navigation.NavigatorScreen import com.owncloud.android.utils.ScreenshotTest import org.junit.Rule import org.junit.Test import org.junit.rules.TestRule -class CommunityActivityIT : AbstractIT() { - private val testClassName = "com.nextcloud.client.CommunityActivityIT" +class CommunityFragmentIT : AbstractIT() { + private val testClassName = "com.nextcloud.client.CommunityFragmentIT" @get:Rule var storagePermissionRule: TestRule = grant() @@ -30,7 +31,8 @@ class CommunityActivityIT : AbstractIT() { @Test @ScreenshotTest fun open() { - launchActivity().use { scenario -> + val intent = NavigatorActivity.intent(targetContext, NavigatorScreen.Community) + ActivityScenario.launch(intent).use { scenario -> val screenShotName = createName(testClassName + "_" + "open", "") onView(isRoot()).check(matches(isDisplayed())) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7401f14ac3a0..da3c56829586 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -285,9 +285,6 @@ - + + diff --git a/app/src/main/java/com/nextcloud/client/di/ComponentsModule.java b/app/src/main/java/com/nextcloud/client/di/ComponentsModule.java index c6a483ad3b05..e36fd021a447 100644 --- a/app/src/main/java/com/nextcloud/client/di/ComponentsModule.java +++ b/app/src/main/java/com/nextcloud/client/di/ComponentsModule.java @@ -49,7 +49,6 @@ import com.owncloud.android.syncadapter.FileSyncService; import com.owncloud.android.ui.activities.ActivitiesActivity; import com.owncloud.android.ui.activity.BaseActivity; -import com.owncloud.android.ui.activity.CommunityActivity; import com.owncloud.android.ui.activity.ConflictsResolveActivity; import com.owncloud.android.ui.activity.ContactsPreferenceActivity; import com.owncloud.android.ui.activity.CopyToClipboardActivity; @@ -116,8 +115,10 @@ import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.ui.fragment.SharedListFragment; import com.owncloud.android.ui.fragment.UnifiedSearchFragment; +import com.owncloud.android.ui.fragment.community.CommunityFragment; import com.owncloud.android.ui.fragment.contactsbackup.BackupFragment; import com.owncloud.android.ui.fragment.contactsbackup.BackupListFragment; +import com.owncloud.android.ui.navigation.NavigatorActivity; import com.owncloud.android.ui.preview.FileDownloadFragment; import com.owncloud.android.ui.preview.PreviewBitmapActivity; import com.owncloud.android.ui.preview.PreviewImageActivity; @@ -194,9 +195,6 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract NotificationsActivity notificationsActivity(); - @ContributesAndroidInjector - abstract CommunityActivity participateActivity(); - @ContributesAndroidInjector abstract ComposeActivity composeActivity(); @@ -503,7 +501,6 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract InternalTwoWaySyncActivity internalTwoWaySyncActivity(); - @OptIn(markerClass = UnstableApi.class) @ContributesAndroidInjector abstract BackgroundPlayerService backgroundPlayerService(); @@ -513,4 +510,10 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract SetStatusMessageBottomSheet setStatusMessageBottomSheet(); + + @ContributesAndroidInjector + abstract NavigatorActivity navigatorActivity(); + + @ContributesAndroidInjector + abstract CommunityFragment communityFragment(); } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt deleted file mode 100644 index bc2d8379ad5d..000000000000 --- a/app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2023 Alper Ozturk - * SPDX-FileCopyrightText: 2016 Andy Scherzinger - * SPDX-FileCopyrightText: 2016 Tobias Kaminsky - * SPDX-FileCopyrightText: 2016 Nextcloud - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -package com.owncloud.android.ui.activity - -import android.os.Bundle -import android.text.method.LinkMovementMethod -import android.view.MenuItem -import com.nextcloud.utils.extensions.setHtmlContent -import com.owncloud.android.R -import com.owncloud.android.databinding.CommunityLayoutBinding -import com.owncloud.android.utils.DisplayUtils - -/** - * Activity providing information about ways to participate in the app's development. - */ -open class CommunityActivity : DrawerActivity() { - lateinit var binding: CommunityLayoutBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - binding = CommunityLayoutBinding.inflate(layoutInflater) - setContentView(binding.root) - - setupToolbar() - updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_community)) - setupDrawer(menuItemId) - binding.communityReleaseCandidateText.movementMethod = LinkMovementMethod.getInstance() - setupContributeForumView() - setupContributeTranslationView() - setupContributeGithubView() - setupReportButton() - setOnClickListeners() - } - - override fun getMenuItemId(): Int = R.id.nav_community - - override fun onResume() { - super.onResume() - highlightNavigationViewItem(menuItemId) - } - - private fun setupContributeForumView() { - val htmlContent = getString(R.string.community_contribute_forum_text) + " " + - getString( - R.string.community_contribute_forum_text_link, - viewThemeUtils.files - .primaryColorToHexString(this), - getString(R.string.help_link), - getString(R.string.community_contribute_forum_forum) - ) - binding.communityContributeForumText.setHtmlContent(htmlContent) - } - - private fun setupContributeTranslationView() { - val htmlContent = getString( - R.string.community_contribute_translate_link, - viewThemeUtils.files.primaryColorToHexString(this), - getString(R.string.translation_link), - getString(R.string.community_contribute_translate_translate) - ) + " " + - getString(R.string.community_contribute_translate_text) - binding.communityContributeTranslateText.setHtmlContent(htmlContent) - } - - private fun setupContributeGithubView() { - val htmlContent = getString( - R.string.community_contribute_github_text, - getString( - R.string.community_contribute_github_text_link, - viewThemeUtils.files.primaryColorToHexString(this), - getString(R.string.contributing_link) - ) - ) - binding.communityContributeGithubText.setHtmlContent(htmlContent) - } - - private fun setupReportButton() { - val reportButton = binding.communityTestingReport - viewThemeUtils.material.colorMaterialButtonPrimaryFilled(reportButton) - reportButton.setOnClickListener { - DisplayUtils.startLinkIntent( - this, - R.string.report_issue_empty_link - ) - } - } - - private fun setOnClickListeners() { - binding.communityBetaFdroid.setOnClickListener { - DisplayUtils.startLinkIntent( - this, - R.string.fdroid_beta_link - ) - } - binding.communityReleaseCandidateFdroid.setOnClickListener { - DisplayUtils.startLinkIntent( - this, - R.string.fdroid_link - ) - } - binding.communityReleaseCandidatePlaystore.setOnClickListener { - DisplayUtils.startLinkIntent( - this, - R.string.play_store_register_beta - ) - } - binding.communityBetaApk.setOnClickListener { - DisplayUtils.startLinkIntent( - this, - R.string.beta_apk_link - ) - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - var retval = true - if (item.itemId == android.R.id.home) { - if (isDrawerOpen) { - closeDrawer() - } else { - openDrawer() - } - } else { - retval = super.onOptionsItemSelected(item) - } - return retval - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 3e9b88cc4fb6..7204191c7fe8 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -95,6 +95,8 @@ import com.owncloud.android.ui.events.SearchEvent; import com.owncloud.android.ui.fragment.FileDetailsSharingProcessFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; +import com.owncloud.android.ui.navigation.NavigatorActivity; +import com.owncloud.android.ui.navigation.NavigatorScreen; import com.owncloud.android.ui.trashbin.TrashbinActivity; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DisplayUtils; @@ -622,7 +624,7 @@ private void onNavigationItemClicked(final MenuItem menuItem) { startActivity(intent); } else if (itemId == R.id.nav_community) { resetOnlyPersonalAndOnDevice(); - startActivity(CommunityActivity.class); + pushFragment(NavigatorScreen.Community.INSTANCE); } else if (itemId == R.id.nav_logout) { resetOnlyPersonalAndOnDevice(); MenuItem isNewMenuItemChecked = menuItem.setChecked(false); @@ -661,6 +663,11 @@ private void onNavigationItemClicked(final MenuItem menuItem) { highlightNavigationViewItem(itemId); } + private void pushFragment(NavigatorScreen screen) { + final var intent = NavigatorActivity.Companion.intent(this, screen); + startActivity(intent); + } + @SuppressFBWarnings("RV") private void handleBottomNavigationViewClicks() { bottomNavigationView.setOnItemSelectedListener(menuItem -> { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt new file mode 100644 index 000000000000..3f5e53c6d149 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt @@ -0,0 +1,103 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.owncloud.android.ui.fragment.community + +import android.os.Bundle +import android.text.method.LinkMovementMethod +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.nextcloud.utils.extensions.setHtmlContent +import com.owncloud.android.R +import com.owncloud.android.databinding.FragmentCommunityBinding +import com.owncloud.android.ui.activity.DrawerActivity +import com.owncloud.android.utils.DisplayUtils + +class CommunityFragment : Fragment() { + + private var _binding: FragmentCommunityBinding? = null + private val binding get() = _binding!! + + private val drawerActivity get() = activity as? DrawerActivity + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + _binding = FragmentCommunityBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + drawerActivity?.run { + setupToolbar() + updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_community)) + } + binding.communityReleaseCandidateText.movementMethod = LinkMovementMethod.getInstance() + drawerActivity?.let { setupViews(it) } + setOnClickListeners() + } + + private fun setupViews(activity: DrawerActivity) { + val primaryColor = activity.viewThemeUtils.files.primaryColorToHexString(requireContext()) + + binding.communityContributeForumText.setHtmlContent( + getString(R.string.community_contribute_forum_text) + " " + + getString( + R.string.community_contribute_forum_text_link, + primaryColor, + getString(R.string.help_link), + getString(R.string.community_contribute_forum_forum) + ) + ) + + binding.communityContributeTranslateText.setHtmlContent( + getString( + R.string.community_contribute_translate_link, + primaryColor, + getString(R.string.translation_link), + getString(R.string.community_contribute_translate_translate) + ) + " " + getString(R.string.community_contribute_translate_text) + ) + + binding.communityContributeGithubText.setHtmlContent( + getString( + R.string.community_contribute_github_text, + getString( + R.string.community_contribute_github_text_link, + primaryColor, + getString(R.string.contributing_link) + ) + ) + ) + + activity.viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.communityTestingReport) + binding.communityTestingReport.setOnClickListener { + DisplayUtils.startLinkIntent(requireActivity(), R.string.report_issue_empty_link) + } + } + + private fun setOnClickListeners() { + binding.communityBetaFdroid.setOnClickListener { + DisplayUtils.startLinkIntent(requireActivity(), R.string.fdroid_beta_link) + } + binding.communityReleaseCandidateFdroid.setOnClickListener { + DisplayUtils.startLinkIntent(requireActivity(), R.string.fdroid_link) + } + binding.communityReleaseCandidatePlaystore.setOnClickListener { + DisplayUtils.startLinkIntent(requireActivity(), R.string.play_store_register_beta) + } + binding.communityBetaApk.setOnClickListener { + DisplayUtils.startLinkIntent(requireActivity(), R.string.beta_apk_link) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/navigation/Navigator.kt b/app/src/main/java/com/owncloud/android/ui/navigation/Navigator.kt new file mode 100644 index 000000000000..2cc63cb651cb --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/navigation/Navigator.kt @@ -0,0 +1,28 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.owncloud.android.ui.navigation + +import android.view.View +import androidx.fragment.app.FragmentManager +import com.owncloud.android.ui.fragment.community.CommunityFragment + +class Navigator(private val fragmentManager: FragmentManager, private val fragmentContainer: View) { + fun push(screen: NavigatorScreen) { + val fragment = when (screen) { + NavigatorScreen.Community -> CommunityFragment() + } + fragmentManager.beginTransaction() + .replace(fragmentContainer.id, fragment) + .addToBackStack(screen::class.simpleName) + .commit() + } + + fun pop() { + fragmentManager.popBackStack() + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt new file mode 100644 index 000000000000..cbccb7476912 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt @@ -0,0 +1,65 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.owncloud.android.ui.navigation + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.MenuItem +import androidx.fragment.app.FragmentContainerView +import com.nextcloud.utils.extensions.getParcelableArgument +import com.owncloud.android.R +import com.owncloud.android.ui.activity.DrawerActivity + +class NavigatorActivity : DrawerActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_navigator) + setupToolbar() + setupDrawer(menuItemId) + + if (savedInstanceState == null) { + val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java) ?: return + val fragmentContainerView = findViewById(R.id.fragment_container_view) + val navigator = Navigator(supportFragmentManager, fragmentContainerView) + navigator.push(screen) + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == android.R.id.home) { + if (isDrawerOpen) { + closeDrawer() + } else { + openDrawer() + } + return true + } + return super.onOptionsItemSelected(item) + } + + override fun getMenuItemId(): Int = when (intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java)) { + NavigatorScreen.Community -> R.id.nav_community + else -> super.getMenuItemId() + } + + override fun onResume() { + super.onResume() + highlightNavigationViewItem(menuItemId) + } + + companion object { + const val EXTRA_SCREEN = "extra_screen" + + fun intent(context: Context, screen: NavigatorScreen): Intent = + Intent(context, NavigatorActivity::class.java).apply { + putExtra(EXTRA_SCREEN, screen) + } + } +} diff --git a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorScreen.kt b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorScreen.kt new file mode 100644 index 000000000000..0da919f8c206 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorScreen.kt @@ -0,0 +1,17 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.owncloud.android.ui.navigation + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +sealed class NavigatorScreen : Parcelable { + + @Parcelize + object Community : NavigatorScreen() +} diff --git a/app/src/main/res/layout/activity_navigator.xml b/app/src/main/res/layout/activity_navigator.xml new file mode 100644 index 000000000000..3654aeaecbd2 --- /dev/null +++ b/app/src/main/res/layout/activity_navigator.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/community_layout.xml b/app/src/main/res/layout/community_layout.xml deleted file mode 100755 index 52cab60708f3..000000000000 --- a/app/src/main/res/layout/community_layout.xml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/files.xml b/app/src/main/res/layout/files.xml index 98af6d19fb14..e421bad8d76b 100644 --- a/app/src/main/res/layout/files.xml +++ b/app/src/main/res/layout/files.xml @@ -2,6 +2,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 4a69376c8f28d7b4e50020465bd1d531f6cb0fa6 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 11 Mar 2026 11:57:40 +0100 Subject: [PATCH 2/5] simplify community fragment Signed-off-by: alperozturk96 --- .../fragment/community/CommunityFragment.kt | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt index 3f5e53c6d149..3513519942ba 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/community/CommunityFragment.kt @@ -44,36 +44,42 @@ class CommunityFragment : Fragment() { private fun setupViews(activity: DrawerActivity) { val primaryColor = activity.viewThemeUtils.files.primaryColorToHexString(requireContext()) + val helpLink = getString(R.string.help_link) + val forum = getString(R.string.community_contribute_forum_forum) + val translationLink = getString(R.string.translation_link) + val translate = getString(R.string.community_contribute_translate_translate) + val contributingLink = getString(R.string.contributing_link) - binding.communityContributeForumText.setHtmlContent( - getString(R.string.community_contribute_forum_text) + " " + + listOf( + binding.communityContributeForumText to + "${getString(R.string.community_contribute_forum_text)} " + getString( R.string.community_contribute_forum_text_link, primaryColor, - getString(R.string.help_link), - getString(R.string.community_contribute_forum_forum) - ) - ) - - binding.communityContributeTranslateText.setHtmlContent( - getString( - R.string.community_contribute_translate_link, - primaryColor, - getString(R.string.translation_link), - getString(R.string.community_contribute_translate_translate) - ) + " " + getString(R.string.community_contribute_translate_text) - ) + helpLink, + forum + ), - binding.communityContributeGithubText.setHtmlContent( - getString( - R.string.community_contribute_github_text, + binding.communityContributeTranslateText to getString( - R.string.community_contribute_github_text_link, + R.string.community_contribute_translate_link, primaryColor, - getString(R.string.contributing_link) + translationLink, + translate + ) + " " + getString(R.string.community_contribute_translate_text), + + binding.communityContributeGithubText to + getString( + R.string.community_contribute_github_text, + getString( + R.string.community_contribute_github_text_link, + primaryColor, + contributingLink + ) ) - ) - ) + ).forEach { (view, content) -> + view.setHtmlContent(content) + } activity.viewThemeUtils.material.colorMaterialButtonPrimaryFilled(binding.communityTestingReport) binding.communityTestingReport.setOnClickListener { @@ -82,17 +88,17 @@ class CommunityFragment : Fragment() { } private fun setOnClickListeners() { - binding.communityBetaFdroid.setOnClickListener { - DisplayUtils.startLinkIntent(requireActivity(), R.string.fdroid_beta_link) - } - binding.communityReleaseCandidateFdroid.setOnClickListener { - DisplayUtils.startLinkIntent(requireActivity(), R.string.fdroid_link) - } - binding.communityReleaseCandidatePlaystore.setOnClickListener { - DisplayUtils.startLinkIntent(requireActivity(), R.string.play_store_register_beta) - } - binding.communityBetaApk.setOnClickListener { - DisplayUtils.startLinkIntent(requireActivity(), R.string.beta_apk_link) + val activity = requireActivity() + + listOf( + binding.communityBetaFdroid to R.string.fdroid_beta_link, + binding.communityReleaseCandidateFdroid to R.string.fdroid_link, + binding.communityReleaseCandidatePlaystore to R.string.play_store_register_beta, + binding.communityBetaApk to R.string.beta_apk_link + ).forEach { (view, linkRes) -> + view.setOnClickListener { + DisplayUtils.startLinkIntent(activity, linkRes) + } } } From 9886bc74a760c1fadd3b45eabc5c2e7ea2703e14 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 11 Mar 2026 12:04:25 +0100 Subject: [PATCH 3/5] fix back press Signed-off-by: alperozturk96 --- .../ui/navigation/NavigatorActivity.kt | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt index cbccb7476912..3247964af024 100644 --- a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt @@ -11,6 +11,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.MenuItem +import androidx.activity.OnBackPressedCallback import androidx.fragment.app.FragmentContainerView import com.nextcloud.utils.extensions.getParcelableArgument import com.owncloud.android.R @@ -18,18 +19,34 @@ import com.owncloud.android.ui.activity.DrawerActivity class NavigatorActivity : DrawerActivity() { + private lateinit var navigator: Navigator + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_navigator) setupToolbar() setupDrawer(menuItemId) + setupBackPressedHandler() - if (savedInstanceState == null) { - val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java) ?: return - val fragmentContainerView = findViewById(R.id.fragment_container_view) - val navigator = Navigator(supportFragmentManager, fragmentContainerView) - navigator.push(screen) - } + val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java) ?: return + val fragmentContainerView = findViewById(R.id.fragment_container_view) + navigator = Navigator(supportFragmentManager, fragmentContainerView) + navigator.push(screen) + } + + private fun setupBackPressedHandler() { + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + when { + isDrawerOpen -> closeDrawer() + supportFragmentManager.backStackEntryCount == 1 -> finish() + else -> navigator.pop() + } + } + } + ) } override fun onOptionsItemSelected(item: MenuItem): Boolean { From 7d1a964085c66f14d8717073a4b6de74def0653c Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 11 Mar 2026 12:11:28 +0100 Subject: [PATCH 4/5] add push logic Signed-off-by: alperozturk96 --- .../owncloud/android/ui/activity/DrawerActivity.java | 11 +++++++++-- .../android/ui/navigation/NavigatorActivity.kt | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 7204191c7fe8..6123b1ccd7d4 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -663,9 +663,16 @@ private void onNavigationItemClicked(final MenuItem menuItem) { highlightNavigationViewItem(itemId); } + /** + * If navigator activity already exists just push else start navigator activity. + */ private void pushFragment(NavigatorScreen screen) { - final var intent = NavigatorActivity.Companion.intent(this, screen); - startActivity(intent); + if (this instanceof NavigatorActivity navigatorActivity) { + navigatorActivity.push(screen); + } else { + final var intent = NavigatorActivity.Companion.intent(this, screen); + startActivity(intent); + } } @SuppressFBWarnings("RV") diff --git a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt index 3247964af024..f51ceeda2857 100644 --- a/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/navigation/NavigatorActivity.kt @@ -30,7 +30,12 @@ class NavigatorActivity : DrawerActivity() { val screen = intent.getParcelableArgument(EXTRA_SCREEN, NavigatorScreen::class.java) ?: return val fragmentContainerView = findViewById(R.id.fragment_container_view) + navigator = Navigator(supportFragmentManager, fragmentContainerView) + push(screen) + } + + fun push(screen: NavigatorScreen) { navigator.push(screen) } From 445f28f0fbc7fd808bbf2532cc07191e6345b581 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 11 Mar 2026 13:07:33 +0100 Subject: [PATCH 5/5] remove unnecessary changes Signed-off-by: alperozturk96 --- app/src/main/res/layout/files.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/main/res/layout/files.xml b/app/src/main/res/layout/files.xml index e421bad8d76b..98af6d19fb14 100644 --- a/app/src/main/res/layout/files.xml +++ b/app/src/main/res/layout/files.xml @@ -2,7 +2,6 @@