* Removed books from `library.xml` if they no longer have any associated bookmarks, as keeping them is unnecessary and wastes resources and memory, while also increasing the time needed to load the library from storage.
* Fixed: The downloading online library progress was showing incorrect.
* Refactored the all unit test cases according to the new changes.
* Fixed: `Online Books` were showing incorrect book sizes. The OPDS stream now provides sizes in bytes instead of kilobytes, so the code has been updated accordingly.
* Added the `io.coil-kt.coil3:coil-compose` library to load favicons for online books, as OPDS now returns favicon URLs instead of Base64-encoded strings.
* Since favicons are no longer provided in Base64 format when downloading ZIM files, we now extract the favicon from the Archive using libkiwix after the download completes. This allows us to display it locally on various screens such as the library, Wi-Fi hotspot, notes, history, and more.
* Cached the `LibkiwixBook` instance to avoid recreating it multiple times when adding or removing bookmarks.
* Created `LibkiwixBook` to wrap the `Book` class from `libkiwix`, allowing us to set custom values from the database and manage books received from the `OPDS` stream. This wrapper is necessary because the original Book class does not provide setters. We'll use `LibkiwixBook` throughout the codebase.
* Refactored the codebase to replace `LibraryNetworkEntity.Book` with `LibkiwixBook`.
* Removed the BaseDelegateAdapter and its subclasses, as RecyclerView is no longer used in the codebase.
* Fixed: CustomApps was crashing when opening the settings screen.
* Fixed: StorageList was not appearing on the settings screen.
* Fixed: Dark Mode and Language dialogs to match the theme design.
* Created KiwixBasicDialogFrame, a reusable Compose UI component to standardize the design of alert dialogs.
* Removed unused code from the project.
* Improved the design of the `Settings` screen to match the previous XML layout.
* Updated the ViewModel to handle user interactions following the MVVM pattern.
* Introduced `SettingScreenState` to manage the state of the settings screen.
* Removed `KiwixPrefsFragment`, `CustomPrefsFragment`, and `CorePrefsFragment` as they are no longer needed.
* Cleaned up unused code from the project.
* Created the `SettingsScreen` using Jetpack Compose UI components.
* Implemented `SettingsViewModel` to manage and update preferences reactively, supporting the Compose architecture.
* Refactored existing functionality to align with the Compose-based UI.
* Simplified the `combineToLanguageList` method and removed warnings.
* Refactored `ZimManageViewModelTest` to align with the changes.
* Removed unused `RxJava` code from the project.
* Removed all `RxJava` dependencies from the project.
* Updated the `README` file to reflect that `RxJava` is no longer used.
* Updated `credit.html` accordingly, similar to the `README`.
* Fixed: The `FIND_IN_PAGE` button was appearing when the search was opened from `FromTabView`.
* Fixed: The `FIND_IN_PAGE` button was not displaying properly (only half was visible).
* Improved: The `NavigationIcon` to better support test cases.
* Fixed: `VoiceSearch` was not working when launched from the `SearchWidget`.
* Refactored: `SearchFragmentTest` and `SearchFragmentTestForCustomApp` to align with the Compose UI.
* Removed: Additional unused code from the project.
* Improved the `KiwixAppBar` to show the textButton in actionMenu. Since we need to show the `FIND_IN_PAGE` textView button in actionMenu.
* Created the `SearchScreen` and migrated the all UI to compose from XML.
* Refactored the functionalities of `SearchFragment` according to compose UI.
* Removed the unused code from project.
* Updated the logic to hide the top progress bar when updating the library items while applying filters.
* Refactored all unit test cases to properly support coroutines.
* Fixed: Download progress of the online library was not displayed when navigating away from the fragment and returning while the download was still in progress.
* Fixed: Both the SwipeRefreshIndicator and the progress bar were shown simultaneously during the initial download of the online library.
* Improved: The logic for hiding the SwipeRefreshIndicator. It now automatically hides when the progress bar (with visible progress) is displayed.
* Improved: Handling of library re-downloads upon network state changes.
* Fixed: The progressBar was showing when we searching for books.
* Fixed: Compilation errors in unit test cases.
* Fixed: Selected language filter was not being applied to the online library.
* Fixed: Unnecessary UI recomposition.
* Improved code readability and resolved related lint errors.
* Fixed: "Allow downloading content via mobile network?" dialog was not displaying correctly.
* Fixed: SwipeRefreshing was not working when the "Swipe Down for Library" message was shown.
* Improved: Previously, the online library would re-download every time the fragment was launched or brought to the foreground (e.g., when navigating back from another screen). This behavior has been changed to use coroutines. The library now downloads only once initially, and subsequent downloads only occur when the user manually refreshes the library. This helps reduce unnecessary data usage and network calls.
* Refactored the child viewModels (BookmarkViewModel, HistoryViewModel, and NotesViewModel) to use coroutines.
* Refactored all DAO classes to use coroutines instead of RxJava.
* Refactored all related code to align with coroutines.
* The issue was caused by using `CoroutineScope(Dispatchers.Main)` while our flow directly accessed the `uuid` of the ZIM file from the `ZimFileReader` object. When the fragment was switched to another screen, the `ZimFileReader` object got disposed. However, the `webViewProgressChanged` method would still trigger, initiating the flow to check if the current page was bookmarked. Since the `ZimFileReader` was already disposed, this resulted in a crash.
* We fixed this by using the viewLifecycleOwner.lifecycleScope so that the job is automatically cancelled when the fragment is destroyed. Additionally, we now retrieve the uuid once at the beginning and reuse it in the flow, avoiding repeated access to the disposed ZimFileReader.
* Improved the `testBookmarks` test case. Sometimes this test failed to find the "OPEN" button of the `Snackbar` because the `Snackbar` was automatically dismissed before `Espresso` could validate the view. This timing issue occasionally caused the test to fail. We've improved the test to properly verify whether the bookmark is saved, avoiding such situations.
* Improved the `DownloadTest`, which sometimes failed on CI.
* Refactored all `RxJava` code in `SharedPreferenceUtil` to coroutines.
* Refactored `RxJava` code to coroutines in `Fat32Checker`.
* Refactored `RxJava` code to coroutines in `DarkModeConfig`.
* Refactored all related code of these classes accordingly.
* Updated unit test cases to work with coroutines.
* Refactored the IP address polling logic using coroutine Flow. Now the IP check runs on the IO thread and the result is pushed to the main thread, because our callbacks need to work on the main thread. Also, this whole operation will automatically cancel if the user switches the screen or if the given coroutine scope gets cancelled, since the scope is lifecycle-aware. This helps to avoid using extra resources unnecessarily.
* Added clear and concise method-level comments to improve code readability and help others easily understand the purpose and behavior of each method.
* Removed duplicate method in `DownloadRoomDao` for fetching all downloads.
* Refactored `DownloadManagerMonitor` to use `Coroutines` instead of `RxJava`.
* Improved coroutine usage in `DownloadMonitorService`.
* Updated `LanguageViewModel` to use `Coroutine Flows` instead of `RxJava`.
* Refactored `NewLanguagesDao` to expose Coroutine Flows instead of `RxJava` observables.
* Updated `SaveLanguagesAndFinish` to use coroutines instead of `RxJava`.
* Created a `FlowExtension` utility class to add custom flow-related extensions. In this PR, added the `collectSideEffectWithActivity` extension function, which allows collecting `SideEffects` and handling them with the current Activity in a Compose UI. This also moved the `SideEffect` collection from the Fragment layer to the Compose screen, improving separation of concerns.
* Refactored the unit test cases according to this change.
* Created an `asFlow` extension function to convert ObjectBox queries into coroutine Flow, enabling easier migration to coroutine-based flows in future tasks.
* Refactored all related code to use coroutine Flow.
* Updated all test cases to align with the new coroutine-based implementation.
* Migrated ZIM content loading logic from RxJava to Kotlin coroutines.
* The previous implementation used `RxJava` to stream content on the IO thread, but it was not lifecycle-aware. This caused the task to continue running even when the WebView navigated away or stopped rendering.
* Updated the implementation to use coroutines, ensuring that the task is lifecycle-aware and automatically cancels when the page changes or the user navigates away.
* This improves resource efficiency and prevents unnecessary background work during page transitions.