mirror of
https://github.com/kiwix/kiwix-android.git
synced 2025-09-11 16:37:18 -04:00
Fixed the issue where the Zim File was not displaying in the ZimHostFragment
for custom apps.
* In `ZimHostFragment`, we show Zim files that are saved in the database. These files are typically saved when downloading Zim files. In a custom app, where Zim files are already included within the app and not downloaded separately that's why they are not showing on the `ZimHostFragment`, we have addressed this issue by saving the Zim files in the database to ensure they appear in the `ZimHostFragment`. * Regarding the `FileDescriptor`, there are no file objects available because we read Zim files using `FileDescriptor`. To address this, we have created a `demo.zim` file to save it in the database so that it will be displayed in the `ZimHostFragment`. We handle this file within the `KiwixServer`. When the current Zim file is `demo.zim`, we create an `Archive` object with the `FileDescriptor` to host the Zim file on the `KiwixServer`.
This commit is contained in:
parent
845f19eab6
commit
bdb00d7aae
@ -24,6 +24,7 @@ import org.kiwix.kiwixmobile.core.di.ActivityScope
|
|||||||
import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem
|
import org.kiwix.kiwixmobile.core.page.bookmark.adapter.BookmarkItem
|
||||||
import org.kiwix.kiwixmobile.core.page.history.adapter.HistoryListItem.HistoryItem
|
import org.kiwix.kiwixmobile.core.page.history.adapter.HistoryListItem.HistoryItem
|
||||||
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
|
||||||
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private const val TAG = "MainPresenter"
|
private const val TAG = "MainPresenter"
|
||||||
@ -33,6 +34,7 @@ class MainRepositoryActions @Inject constructor(private val dataSource: DataSour
|
|||||||
private var saveHistoryDisposable: Disposable? = null
|
private var saveHistoryDisposable: Disposable? = null
|
||||||
private var saveBookmarkDisposable: Disposable? = null
|
private var saveBookmarkDisposable: Disposable? = null
|
||||||
private var saveNoteDisposable: Disposable? = null
|
private var saveNoteDisposable: Disposable? = null
|
||||||
|
private var saveBookDisposable: Disposable? = null
|
||||||
private var deleteNoteDisposable: Disposable? = null
|
private var deleteNoteDisposable: Disposable? = null
|
||||||
|
|
||||||
fun saveHistory(history: HistoryItem) {
|
fun saveHistory(history: HistoryItem) {
|
||||||
@ -61,10 +63,16 @@ class MainRepositoryActions @Inject constructor(private val dataSource: DataSour
|
|||||||
.subscribe({}, { e -> Log.e(TAG, "Unable to delete note", e) })
|
.subscribe({}, { e -> Log.e(TAG, "Unable to delete note", e) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun saveBook(book: BookOnDisk) {
|
||||||
|
saveBookDisposable = dataSource.saveBook(book)
|
||||||
|
.subscribe({}, { e -> Log.e(TAG, "Unable to save book", e) })
|
||||||
|
}
|
||||||
|
|
||||||
fun dispose() {
|
fun dispose() {
|
||||||
saveHistoryDisposable?.dispose()
|
saveHistoryDisposable?.dispose()
|
||||||
saveBookmarkDisposable?.dispose()
|
saveBookmarkDisposable?.dispose()
|
||||||
saveNoteDisposable?.dispose()
|
saveNoteDisposable?.dispose()
|
||||||
deleteNoteDisposable?.dispose()
|
deleteNoteDisposable?.dispose()
|
||||||
|
saveBookDisposable?.dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ private const val TAG = "ZimFileReader"
|
|||||||
|
|
||||||
class ZimFileReader constructor(
|
class ZimFileReader constructor(
|
||||||
val zimFile: File?,
|
val zimFile: File?,
|
||||||
private val assetFileDescriptor: AssetFileDescriptor? = null,
|
val assetFileDescriptor: AssetFileDescriptor? = null,
|
||||||
private val jniKiwixReader: Archive,
|
private val jniKiwixReader: Archive,
|
||||||
private val nightModeConfig: NightModeConfig,
|
private val nightModeConfig: NightModeConfig,
|
||||||
private val searcher: SuggestionSearcher = SuggestionSearcher(jniKiwixReader)
|
private val searcher: SuggestionSearcher = SuggestionSearcher(jniKiwixReader)
|
||||||
|
@ -29,6 +29,7 @@ import android.provider.DocumentsContract
|
|||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.webkit.URLUtil
|
import android.webkit.URLUtil
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@ -402,4 +403,8 @@ object FileUtils {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun getDemoFilePathForCustomApp(context: Context) =
|
||||||
|
"${ContextCompat.getExternalFilesDirs(context, null)[0]}/demo.zim"
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,10 @@
|
|||||||
|
|
||||||
package org.kiwix.kiwixmobile.core.webserver
|
package org.kiwix.kiwixmobile.core.webserver
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer
|
||||||
|
import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getDemoFilePathForCustomApp
|
||||||
import org.kiwix.libkiwix.Book
|
import org.kiwix.libkiwix.Book
|
||||||
import org.kiwix.libkiwix.JNIKiwixException
|
import org.kiwix.libkiwix.JNIKiwixException
|
||||||
import org.kiwix.libkiwix.Library
|
import org.kiwix.libkiwix.Library
|
||||||
@ -36,13 +39,32 @@ class KiwixServer @Inject constructor(
|
|||||||
private val jniKiwixServer: Server
|
private val jniKiwixServer: Server
|
||||||
) {
|
) {
|
||||||
|
|
||||||
class Factory @Inject constructor() {
|
class Factory @Inject constructor(
|
||||||
|
private val context: Context,
|
||||||
|
private val zimReaderContainer: ZimReaderContainer
|
||||||
|
) {
|
||||||
|
@Suppress("NestedBlockDepth")
|
||||||
fun createKiwixServer(selectedBooksPath: ArrayList<String>): KiwixServer {
|
fun createKiwixServer(selectedBooksPath: ArrayList<String>): KiwixServer {
|
||||||
val kiwixLibrary = Library()
|
val kiwixLibrary = Library()
|
||||||
selectedBooksPath.forEach { path ->
|
selectedBooksPath.forEach { path ->
|
||||||
try {
|
try {
|
||||||
val book = Book().apply {
|
val book = Book().apply {
|
||||||
update(Archive(path))
|
// Determine whether to create an Archive from an asset or a file path
|
||||||
|
val archive = if (path == getDemoFilePathForCustomApp(context)) {
|
||||||
|
// For custom apps using a demo file, create an Archive with FileDescriptor
|
||||||
|
val assetFileDescriptor = zimReaderContainer.zimFileReader?.assetFileDescriptor
|
||||||
|
val startOffset = assetFileDescriptor?.startOffset ?: 0L
|
||||||
|
val size = assetFileDescriptor?.length ?: 0L
|
||||||
|
Archive(
|
||||||
|
assetFileDescriptor?.parcelFileDescriptor?.dup()?.fileDescriptor,
|
||||||
|
startOffset,
|
||||||
|
size
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
// For regular files, create an Archive from the file path
|
||||||
|
Archive(path)
|
||||||
|
}
|
||||||
|
update(archive)
|
||||||
}
|
}
|
||||||
kiwixLibrary.addBook(book)
|
kiwixLibrary.addBook(book)
|
||||||
} catch (e: JNIKiwixException) {
|
} catch (e: JNIKiwixException) {
|
||||||
|
@ -53,6 +53,7 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.requestNotificat
|
|||||||
import org.kiwix.kiwixmobile.core.extensions.toast
|
import org.kiwix.kiwixmobile.core.extensions.toast
|
||||||
import org.kiwix.kiwixmobile.core.navigateToAppSettings
|
import org.kiwix.kiwixmobile.core.navigateToAppSettings
|
||||||
import org.kiwix.kiwixmobile.core.reader.ZimFileReader
|
import org.kiwix.kiwixmobile.core.reader.ZimFileReader
|
||||||
|
import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer
|
||||||
import org.kiwix.kiwixmobile.core.utils.ConnectivityReporter
|
import org.kiwix.kiwixmobile.core.utils.ConnectivityReporter
|
||||||
import org.kiwix.kiwixmobile.core.utils.REQUEST_POST_NOTIFICATION_PERMISSION
|
import org.kiwix.kiwixmobile.core.utils.REQUEST_POST_NOTIFICATION_PERMISSION
|
||||||
import org.kiwix.kiwixmobile.core.utils.ServerUtils
|
import org.kiwix.kiwixmobile.core.utils.ServerUtils
|
||||||
@ -60,15 +61,15 @@ import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
|
|||||||
import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower
|
import org.kiwix.kiwixmobile.core.utils.dialog.AlertDialogShower
|
||||||
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog
|
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog
|
||||||
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.StartServer
|
import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog.StartServer
|
||||||
|
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService
|
||||||
|
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService.Companion.ACTION_CHECK_IP_ADDRESS
|
||||||
|
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService.Companion.ACTION_START_SERVER
|
||||||
|
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService.Companion.ACTION_STOP_SERVER
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.SelectionMode
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.SelectionMode
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BookOnDiskDelegate
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BookOnDiskDelegate
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskAdapter
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskAdapter
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem
|
||||||
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
|
||||||
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService
|
|
||||||
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService.Companion.ACTION_CHECK_IP_ADDRESS
|
|
||||||
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService.Companion.ACTION_START_SERVER
|
|
||||||
import org.kiwix.kiwixmobile.core.webserver.wifi_hotspot.HotspotService.Companion.ACTION_STOP_SERVER
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View {
|
class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View {
|
||||||
@ -87,6 +88,9 @@ class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View {
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var zimReaderFactory: ZimFileReader.Factory
|
lateinit var zimReaderFactory: ZimFileReader.Factory
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var zimReaderContainer: ZimReaderContainer
|
||||||
|
|
||||||
private lateinit var booksAdapter: BooksOnDiskAdapter
|
private lateinit var booksAdapter: BooksOnDiskAdapter
|
||||||
private lateinit var bookDelegate: BookOnDiskDelegate.BookDelegate
|
private lateinit var bookDelegate: BookOnDiskDelegate.BookDelegate
|
||||||
private var hotspotService: HotspotService? = null
|
private var hotspotService: HotspotService? = null
|
||||||
@ -485,19 +489,14 @@ class ZimHostFragment : BaseFragment(), ZimHostCallbacks, ZimHostContract.View {
|
|||||||
val updatedBooksList: MutableList<BooksOnDiskListItem> = arrayListOf()
|
val updatedBooksList: MutableList<BooksOnDiskListItem> = arrayListOf()
|
||||||
books.forEach {
|
books.forEach {
|
||||||
if (it is BookOnDisk) {
|
if (it is BookOnDisk) {
|
||||||
zimReaderFactory.create(it.file)?.let { zimFileReader ->
|
zimReaderContainer.zimFileReader?.let { zimFileReader ->
|
||||||
val booksOnDiskListItem =
|
val booksOnDiskListItem =
|
||||||
zimFileReader.zimFile?.let { file ->
|
(BookOnDisk(it.file, zimFileReader) as BooksOnDiskListItem)
|
||||||
(BookOnDisk(file, zimFileReader) as BooksOnDiskListItem)
|
|
||||||
.apply {
|
.apply {
|
||||||
isSelected = true
|
isSelected = true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (booksOnDiskListItem != null) {
|
|
||||||
updatedBooksList.add(booksOnDiskListItem)
|
updatedBooksList.add(booksOnDiskListItem)
|
||||||
}
|
}
|
||||||
zimFileReader.dispose()
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
updatedBooksList.add(it)
|
updatedBooksList.add(it)
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ import org.kiwix.kiwixmobile.core.base.BaseActivity
|
|||||||
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
|
import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions
|
||||||
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.observeNavigationResult
|
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.observeNavigationResult
|
||||||
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setupDrawerToggle
|
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.setupDrawerToggle
|
||||||
|
import org.kiwix.kiwixmobile.core.extensions.isFileExist
|
||||||
import org.kiwix.kiwixmobile.core.main.CoreReaderFragment
|
import org.kiwix.kiwixmobile.core.main.CoreReaderFragment
|
||||||
import org.kiwix.kiwixmobile.core.main.FIND_IN_PAGE_SEARCH_STRING
|
import org.kiwix.kiwixmobile.core.main.FIND_IN_PAGE_SEARCH_STRING
|
||||||
import org.kiwix.kiwixmobile.core.main.MainMenu
|
import org.kiwix.kiwixmobile.core.main.MainMenu
|
||||||
@ -39,11 +40,14 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.effects.SearchItemToOpen
|
|||||||
import org.kiwix.kiwixmobile.core.utils.LanguageUtils
|
import org.kiwix.kiwixmobile.core.utils.LanguageUtils
|
||||||
import org.kiwix.kiwixmobile.core.utils.TAG_FILE_SEARCHED
|
import org.kiwix.kiwixmobile.core.utils.TAG_FILE_SEARCHED
|
||||||
import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower
|
import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower
|
||||||
|
import org.kiwix.kiwixmobile.core.utils.files.FileUtils.getDemoFilePathForCustomApp
|
||||||
import org.kiwix.kiwixmobile.core.utils.titleToUrl
|
import org.kiwix.kiwixmobile.core.utils.titleToUrl
|
||||||
import org.kiwix.kiwixmobile.core.utils.urlSuffixToParsableUrl
|
import org.kiwix.kiwixmobile.core.utils.urlSuffixToParsableUrl
|
||||||
|
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
|
||||||
import org.kiwix.kiwixmobile.custom.BuildConfig
|
import org.kiwix.kiwixmobile.custom.BuildConfig
|
||||||
import org.kiwix.kiwixmobile.custom.R
|
import org.kiwix.kiwixmobile.custom.R
|
||||||
import org.kiwix.kiwixmobile.custom.customActivityComponent
|
import org.kiwix.kiwixmobile.custom.customActivityComponent
|
||||||
|
import java.io.File
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -149,6 +153,15 @@ class CustomReaderFragment : CoreReaderFragment() {
|
|||||||
} else {
|
} else {
|
||||||
openZimFile(it.file, true)
|
openZimFile(it.file, true)
|
||||||
}
|
}
|
||||||
|
// Save book in the database to display it in `ZimHostFragment`.
|
||||||
|
zimReaderContainer?.zimFileReader?.let { zimFileReader ->
|
||||||
|
// Check if the file is not null. If the file is null,
|
||||||
|
// it means we have created zimFileReader with a fileDescriptor,
|
||||||
|
// so we create a demo file to save it in the database for display on the `ZimHostFragment`.
|
||||||
|
val file = it.file ?: createDemoFile()
|
||||||
|
val bookOnDisk = BookOnDisk(file, zimFileReader)
|
||||||
|
repositoryActions?.saveBook(bookOnDisk)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is ValidationState.HasBothFiles -> {
|
is ValidationState.HasBothFiles -> {
|
||||||
it.zimFile.delete()
|
it.zimFile.delete()
|
||||||
@ -163,6 +176,11 @@ class CustomReaderFragment : CoreReaderFragment() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createDemoFile() =
|
||||||
|
File(getDemoFilePathForCustomApp(requireActivity())).also {
|
||||||
|
if (!it.isFileExist()) it.createNewFile()
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
super.onCreateOptionsMenu(menu, inflater)
|
super.onCreateOptionsMenu(menu, inflater)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user