Added support to hide the keyboard when scrolling the list, replicating the behavior from the XML-based implementation.

This commit is contained in:
MohitMaliFtechiz 2025-04-14 18:36:12 +05:30
parent 01a3838c6a
commit af94018285
2 changed files with 56 additions and 16 deletions

View File

@ -133,7 +133,7 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal
private val disposable = CompositeDisposable() private val disposable = CompositeDisposable()
private var permissionDeniedLayoutShowing = false private var permissionDeniedLayoutShowing = false
private var zimFileUri: Uri? = null private var zimFileUri: Uri? = null
val libraryScreenState = mutableStateOf( private val libraryScreenState = mutableStateOf(
LocalLibraryScreenState( LocalLibraryScreenState(
fileSelectListState = FileSelectListState(emptyList()), fileSelectListState = FileSelectListState(emptyList()),
snackBarHostState = SnackbarHostState(), snackBarHostState = SnackbarHostState(),
@ -156,13 +156,15 @@ class LocalLibraryFragment : BaseFragment(), CopyMoveFileHandler.FileCopyMoveCal
val isGranted = permissionResult.values.all { it } val isGranted = permissionResult.values.all { it }
val isPermanentlyDenied = readStorageHasBeenPermanentlyDenied(isGranted) val isPermanentlyDenied = readStorageHasBeenPermanentlyDenied(isGranted)
permissionDeniedLayoutShowing = isPermanentlyDenied permissionDeniedLayoutShowing = isPermanentlyDenied
updateLibraryScreenState( if (permissionDeniedLayoutShowing) {
noFilesViewItem = Triple( updateLibraryScreenState(
requireActivity().resources.getString(string.grant_read_storage_permission), noFilesViewItem = Triple(
requireActivity().resources.getString(string.go_to_settings_label), requireActivity().resources.getString(string.grant_read_storage_permission),
isPermanentlyDenied requireActivity().resources.getString(string.go_to_settings_label),
true
)
) )
) }
} }
override fun inject(baseActivity: BaseActivity) { override fun inject(baseActivity: BaseActivity) {

View File

@ -18,6 +18,9 @@
package org.kiwix.kiwixmobile.core.page package org.kiwix.kiwixmobile.core.page
import android.app.Activity
import android.content.Context
import android.view.inputmethod.InputMethodManager
import androidx.activity.compose.LocalActivity import androidx.activity.compose.LocalActivity
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
@ -25,11 +28,14 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
@ -37,8 +43,12 @@ import androidx.compose.material3.Switch
import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.SwitchDefaults
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.R
@ -88,7 +98,11 @@ fun PageScreen(
val items = state.pageState.pageItems val items = state.pageState.pageItems
Box( Box(
modifier = Modifier modifier = Modifier
.padding(padding) .padding(
top = padding.calculateTopPadding(),
start = padding.calculateStartPadding(LocalLayoutDirection.current),
end = padding.calculateEndPadding(LocalLayoutDirection.current)
)
.fillMaxSize() .fillMaxSize()
) { ) {
if (items.isEmpty()) { if (items.isEmpty()) {
@ -98,20 +112,44 @@ fun PageScreen(
modifier = Modifier.align(Alignment.Center) modifier = Modifier.align(Alignment.Center)
) )
} else { } else {
LazyColumn { PageList(
items(state.pageState.visiblePageItems) { item -> state = state,
when (item) { itemClickListener = itemClickListener
is Page -> PageListItem(page = item, itemClickListener = itemClickListener) )
is DateItem -> DateItemText(item)
}
}
}
} }
} }
} }
} }
} }
@Composable
private fun PageList(
state: PageFragmentScreenState,
itemClickListener: OnItemClickListener
) {
val listState = rememberLazyListState()
val context = LocalContext.current
LaunchedEffect(listState) {
snapshotFlow { listState.isScrollInProgress }
.collect { isScrolling ->
if (isScrolling) {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow((context as? Activity)?.currentFocus?.windowToken, 0)
}
}
}
LazyColumn(state = listState) {
items(state.pageState.visiblePageItems) { item ->
when (item) {
is Page -> PageListItem(page = item, itemClickListener = itemClickListener)
is DateItem -> DateItemText(item)
}
}
}
}
@Composable @Composable
private fun searchBarIfActive( private fun searchBarIfActive(
state: PageFragmentScreenState state: PageFragmentScreenState