wrap pspdfkit documentview in a fragment

This commit is contained in:
Satindar Dhillon
2022-09-30 13:34:55 -07:00
parent ff960b760d
commit 9fc81ed50d
10 changed files with 154 additions and 8 deletions

View File

@ -39,5 +39,15 @@
<data android:mimeType="text/*" />
</intent-filter>
</activity>
<activity
android:name="com.pspdfkit.ui.PdfActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:windowSoftInputMode="adjustNothing" />
<activity
android:name=".ui.reader.PDFReaderActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:windowSoftInputMode="adjustNothing" />
</application>
</manifest>

Binary file not shown.

View File

@ -16,6 +16,7 @@ import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import app.omnivore.omnivore.ui.auth.LoginViewModel
import app.omnivore.omnivore.ui.home.HomeViewModel
import app.omnivore.omnivore.ui.reader.PDFReaderViewModel
import app.omnivore.omnivore.ui.reader.WebReaderViewModel
import app.omnivore.omnivore.ui.root.RootView
import dagger.hilt.android.AndroidEntryPoint

View File

@ -26,4 +26,9 @@ data class LinkedItem(
fun publisherDisplayName(): String? {
return publisherURLString?.toUri()?.host
}
fun isPDF(): Boolean {
val hasPDFSuffix = pageURLString.endsWith("pdf")
return contentReader == "PDF" || hasPDFSuffix
}
}

View File

@ -1,5 +1,6 @@
package app.omnivore.omnivore.ui.home
import android.content.Intent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
@ -11,10 +12,12 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import app.omnivore.omnivore.Routes
import app.omnivore.omnivore.models.LinkedItem
import app.omnivore.omnivore.ui.reader.PDFReaderActivity
import kotlinx.coroutines.flow.distinctUntilChanged
@ -53,6 +56,7 @@ fun HomeViewContent(
navController: NavHostController,
modifier: Modifier
) {
val context = LocalContext.current
val listState = rememberLazyListState()
val linkedItems: List<LinkedItem> by homeViewModel.itemsLiveData.observeAsState(listOf())
@ -69,7 +73,13 @@ fun HomeViewContent(
LinkedItemCard(
item = item,
onClickHandler = {
navController.navigate("WebReader/${item.slug}")
if (item.isPDF()) {
val intent = Intent(context, PDFReaderActivity::class.java)
intent.putExtra("LINKED_ITEM_SLUG", item.slug)
context.startActivity(intent)
} else {
navController.navigate("WebReader/${item.slug}")
}
}
)
}

View File

@ -24,7 +24,7 @@ class HomeViewModel @Inject constructor(
private var receivedIdx = 0
// Live Data
val searchTextLiveData = MutableLiveData<String>("")
val searchTextLiveData = MutableLiveData("")
val itemsLiveData = MutableLiveData<List<LinkedItem>>(listOf())
fun updateSearchText(text: String) {

View File

@ -0,0 +1,76 @@
package app.omnivore.omnivore.ui.reader
import android.net.Uri
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import com.pspdfkit.configuration.activity.PdfActivityConfiguration
import com.pspdfkit.configuration.activity.UserInterfaceViewMode
import com.pspdfkit.jetpack.compose.DocumentView
import com.pspdfkit.jetpack.compose.ExperimentalPSPDFKitApi
import com.pspdfkit.jetpack.compose.rememberDocumentState
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PDFReaderActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val viewModel: PDFReaderViewModel by viewModels()
super.onCreate(savedInstanceState)
val slug = intent.getStringExtra("LINKED_ITEM_SLUG") ?: ""
setContent {
PDFReaderLoadingContainer(slug = slug, pdfReaderViewModel = viewModel)
}
}
}
@Composable
fun PDFReaderLoadingContainer(slug: String, pdfReaderViewModel: PDFReaderViewModel) {
val pdfReaderParams: PDFReaderParams? by pdfReaderViewModel.pdfReaderParamsLiveData.observeAsState(null)
if (pdfReaderParams == null) {
pdfReaderViewModel.loadItem(slug = slug)
}
if (pdfReaderParams != null) {
PDFDocumentView(urlString = pdfReaderParams!!.item.pageURLString)
} else {
// TODO: add a proper loading view
Text("Loading...")
}
}
@OptIn(ExperimentalPSPDFKitApi::class)
@Composable
fun PDFDocumentView(urlString: String) {
val context = LocalContext.current
val pdfActivityConfiguration = remember {
PdfActivityConfiguration
.Builder(context)
.setUserInterfaceViewMode(UserInterfaceViewMode.USER_INTERFACE_VIEW_MODE_HIDDEN)
.build()
}
val pdfDocumentState = rememberDocumentState(
documentUri = Uri.parse("file:///android_asset/test.pdf"),
// documentUri = Uri.parse(urlString),
configuration = pdfActivityConfiguration
)
DocumentView(
documentState = pdfDocumentState,
modifier = Modifier.fillMaxSize()
)
}

View File

@ -0,0 +1,49 @@
package app.omnivore.omnivore.ui.reader
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.omnivore.omnivore.DatastoreRepository
import app.omnivore.omnivore.models.LinkedItem
import app.omnivore.omnivore.networking.Networker
import app.omnivore.omnivore.networking.linkedItem
import com.google.gson.Gson
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
data class PDFReaderParams(
val item: LinkedItem,
val articleContent: ArticleContent
)
@HiltViewModel
class PDFReaderViewModel @Inject constructor(
private val datastoreRepo: DatastoreRepository,
private val networker: Networker
): ViewModel() {
val pdfReaderParamsLiveData = MutableLiveData<PDFReaderParams?>(null)
fun loadItem(slug: String) {
viewModelScope.launch {
val articleQueryResult = networker.linkedItem(slug)
val article = articleQueryResult.item ?: return@launch
val articleContent = ArticleContent(
title = article.title,
htmlContent = article.content ?: "",
highlightsJSONString = Gson().toJson(articleQueryResult.highlights),
contentStatus = "SUCCEEDED",
objectID = "",
labelsJSONString = Gson().toJson(articleQueryResult.labels)
)
pdfReaderParamsLiveData.value = PDFReaderParams(article, articleContent)
}
}
fun reset() {
pdfReaderParamsLiveData.value = null
}
}

View File

@ -17,9 +17,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.viewinterop.AndroidView
import app.omnivore.omnivore.R
import app.omnivore.omnivore.networking.ReadingProgressParams
import com.google.gson.Gson
import org.json.JSONObject
@Composable

View File

@ -18,10 +18,7 @@ import app.omnivore.omnivore.ui.auth.LoginViewModel
import app.omnivore.omnivore.ui.auth.WelcomeScreen
import app.omnivore.omnivore.ui.home.HomeView
import app.omnivore.omnivore.ui.home.HomeViewModel
import app.omnivore.omnivore.ui.reader.ArticleWebView
import app.omnivore.omnivore.ui.reader.WebReader
import app.omnivore.omnivore.ui.reader.WebReaderLoadingContainer
import app.omnivore.omnivore.ui.reader.WebReaderViewModel
import app.omnivore.omnivore.ui.reader.*
import com.google.accompanist.systemuicontroller.rememberSystemUiController
@Composable