diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ActivityModule.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ActivityModule.kt index e4216652a..9dba7ed03 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ActivityModule.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/di/modules/ActivityModule.kt @@ -55,7 +55,8 @@ abstract class ActivityModule { urlIsValid: Boolean, menuClickListener: MenuClickListener, disableReadAloud: Boolean, - disableTabs: Boolean + disableTabs: Boolean, + disableSearch: Boolean ): MainMenu = MainMenu( activity, zimReaderContainer.zimFileReader, @@ -64,6 +65,7 @@ abstract class ActivityModule { urlIsValid, disableReadAloud, disableTabs, + disableSearch, menuClickListener ) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt index ff094d136..4c4046122 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt @@ -48,6 +48,7 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.MotionEvent import android.view.View +import android.view.View.VISIBLE import android.view.ViewGroup import android.view.animation.AnimationUtils import android.webkit.WebBackForwardList @@ -519,6 +520,9 @@ abstract class CoreReaderFragment : viewLifecycleOwner, Observer(::openSearchItem) ) + toolbarWithSearchPlaceholder?.setOnClickListener { + openSearch(searchString = "", isOpenedFromTabView = false, false) + } } private fun initTabCallback() { @@ -719,7 +723,7 @@ abstract class CoreReaderFragment : contentFrame?.visibility = View.GONE progressBar?.visibility = View.GONE backToTopButton?.hide() - tabSwitcherRoot?.visibility = View.VISIBLE + setTabSwitcherVisibility(VISIBLE) startAnimation(tabSwitcherRoot, R.anim.slide_down) tabsAdapter?.let { tabsAdapter -> tabRecyclerView?.let { recyclerView -> @@ -737,6 +741,19 @@ abstract class CoreReaderFragment : mainMenu?.showTabSwitcherOptions() } + /** + * Sets the tabs switcher visibility, controlling the visibility of the tab. + * Subclasses, like CustomReaderFragment, override this method to provide custom + * behavior, such as hiding the placeholder in the toolbar when a custom app is configured + * not to show the title. This is necessary because the same toolbar is used for displaying tabs. + * + * WARNING: If modifying this method, ensure thorough testing with custom apps + * to verify proper functionality. + */ + open fun setTabSwitcherVisibility(visibility: Int) { + tabSwitcherRoot?.visibility = visibility + } + /** * Sets a top margin to the web views. * @@ -775,7 +792,7 @@ abstract class CoreReaderFragment : ) tabSwitcherRoot?.let { if (it.visibility == View.VISIBLE) { - it.visibility = View.GONE + setTabSwitcherVisibility(View.GONE) startAnimation(it, R.anim.slide_up) progressBar?.visibility = View.VISIBLE contentFrame?.visibility = View.VISIBLE diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt index 992df9e31..f6c510b1d 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/MainMenu.kt @@ -28,6 +28,7 @@ import org.kiwix.kiwixmobile.core.reader.ZimFileReader const val REQUEST_FILE_SEARCH = 1236 +@Suppress("LongParameterList") class MainMenu( private val activity: Activity, zimFileReader: ZimFileReader?, @@ -36,6 +37,7 @@ class MainMenu( urlIsValid: Boolean, disableReadAloud: Boolean = false, disableTabs: Boolean = false, + private val disableSearch: Boolean = false, private val menuClickListener: MenuClickListener ) { @@ -46,7 +48,8 @@ class MainMenu( urlIsValid: Boolean, menuClickListener: MenuClickListener, disableReadAloud: Boolean, - disableTabs: Boolean + disableTabs: Boolean, + disableSearch: Boolean = false ): MainMenu } @@ -85,6 +88,10 @@ class MainMenu( tabSwitcherTextView = null } + if (disableSearch) { + search?.isVisible = false + } + randomArticle.setShowAsAction( if (activity.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) MenuItem.SHOW_AS_ACTION_IF_ROOM @@ -155,7 +162,13 @@ class MainMenu( } private fun setVisibility(visibility: Boolean, vararg menuItems: MenuItem?) { - menuItems.forEach { it?.isVisible = visibility } + menuItems.forEach { + if (it == search && disableSearch) { + it?.isVisible = false + } else { + it?.isVisible = visibility + } + } } fun tryExpandSearch(zimFileReader: ZimFileReader?) { diff --git a/core/src/main/res/drawable/search_placeholder_background.xml b/core/src/main/res/drawable/search_placeholder_background.xml new file mode 100644 index 000000000..b50065e49 --- /dev/null +++ b/core/src/main/res/drawable/search_placeholder_background.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/core/src/main/res/layout/layout_toolbar.xml b/core/src/main/res/layout/layout_toolbar.xml index 982b4cbf8..a8e4df154 100644 --- a/core/src/main/res/layout/layout_toolbar.xml +++ b/core/src/main/res/layout/layout_toolbar.xml @@ -1,13 +1,34 @@ - + + tools:showIn="@layout/fragment_search"> + + + + + + diff --git a/core/src/main/res/menu/menu_main.xml b/core/src/main/res/menu/menu_main.xml index 7d9270d5c..d1fb2cf23 100644 --- a/core/src/main/res/menu/menu_main.xml +++ b/core/src/main/res/menu/menu_main.xml @@ -8,7 +8,8 @@ android:title="@string/search_label" android:visible="false" app:showAsAction="always" - tools:visible="true" /> + tools:visible="true" + tools:ignore="AlwaysShowAction" /> + app:showAsAction="never" /> - toolbar.navigationIcon = drawable + super.toolbar?.navigationIcon = drawable } - } else { - super.setUpDrawerToggle(toolbar) } } + /** + * Overrides the method to hide/show the placeholder from toolbar. + * When the "setting title" is disabled/enabled in a custom app, + * this function set the visibility of placeholder in toolbar when showing the tabs. + */ + override fun setTabSwitcherVisibility(visibility: Int) { + if (BuildConfig.DISABLE_TITLE) { + // If custom apps are configured to show the placeholder, + // and if tabs are visible, hide the placeholder. + // If tabs are hidden, show the placeholder. + updateToolbarSearchPlaceholderVisibility(if (visibility == VISIBLE) GONE else VISIBLE) + } else { + // Permanently hide the placeholder if the custom app is not configured to show it. + updateToolbarSearchPlaceholderVisibility(GONE) + } + super.setTabSwitcherVisibility(visibility) + } + private fun loadPageFromNavigationArguments() { val args = CustomReaderFragmentArgs.fromBundle(requireArguments()) if (args.pageUrl.isNotEmpty()) { @@ -277,13 +294,17 @@ class CustomReaderFragment : CoreReaderFragment() { // even if it is empty. If we do not set up this title, // the search screen will open if the user clicks on the toolbar from the tabs screen. actionBar?.title = " " - toolbarWithSearchPlaceholder?.visibility = VISIBLE + updateToolbarSearchPlaceholderVisibility(VISIBLE) } else { - toolbarWithSearchPlaceholder?.visibility = GONE + updateToolbarSearchPlaceholderVisibility(GONE) super.updateTitle() } } + private fun updateToolbarSearchPlaceholderVisibility(visibility: Int) { + toolbarWithSearchPlaceholder?.visibility = visibility + } + override fun createNewTab() { newMainPageTab() }