Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added
- Added a share button to document readers ([#98])

### Fixed
- Fixed list/grid view resetting when reopening the app

Expand Down Expand Up @@ -45,6 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#77]: https://github.com/FossifyOrg/Documents/issues/77
[#79]: https://github.com/FossifyOrg/Documents/issues/79
[#87]: https://github.com/FossifyOrg/Documents/issues/87
[#98]: https://github.com/FossifyOrg/Documents/issues/98

[Unreleased]: https://github.com/FossifyOrg/Documents/compare/1.1.0...HEAD
[1.1.0]: https://github.com/FossifyOrg/Documents/compare/1.0.1...1.1.0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.fossify.documents.activities

import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.Intent
import android.net.Uri
import android.os.Bundle
Expand All @@ -27,6 +26,7 @@ import org.fossify.commons.helpers.LICENSE_PDF_VIEWER
import org.fossify.commons.models.FAQItem
import org.fossify.documents.BuildConfig
import org.fossify.documents.R
import org.fossify.documents.extensions.shareDocuments
import org.fossify.documents.extensions.startAboutActivity
import org.fossify.documents.models.DocumentEntry
import org.fossify.documents.models.DocumentKind
Expand Down Expand Up @@ -241,25 +241,10 @@ class MainActivity : BaseComposeActivity() {
return@validateDocuments
}

val uris = ArrayList(readable.map { it.uri.toUri() })
val uris = readable.map { it.uri.toUri() }
val mimeType = readable.map { it.mimeType }.filter { it.isNotBlank() }.distinct()
.singleOrNull() ?: "*/*"
val intent = Intent(
if (uris.size == 1) Intent.ACTION_SEND else Intent.ACTION_SEND_MULTIPLE
).apply {
type = mimeType
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
clipData = ClipData.newUri(contentResolver, readable.first().name, uris.first()).apply {
uris.drop(1).forEach { addItem(ClipData.Item(it)) }
}
if (uris.size == 1) {
putExtra(Intent.EXTRA_STREAM, uris.first())
} else {
putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
}
}

launchExternalIntent(Intent.createChooser(intent, getString(R.string.share_documents)))
shareDocuments(uris, mimeType)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import org.fossify.commons.extensions.toast
import org.fossify.documents.R
import org.fossify.documents.data.DocumentsRepository
import org.fossify.documents.extensions.config
import org.fossify.documents.extensions.shareDocuments
import org.fossify.documents.helpers.PdfDocumentAdapter
import org.fossify.documents.ui.screens.PdfDocumentScreen
import org.fossify.documents.ui.theme.DocumentsAppThemeSurface
Expand Down Expand Up @@ -94,6 +95,7 @@ class PDFViewerActivity : BaseComposeActivity() {
isCopying = viewModel.isCopying,
onPrint = { printPdf(uri, title) },
onOpenWith = { openWith(uri) },
onShare = { shareDocuments(listOf(uri), "application/pdf") },
onFullscreenChange = ::setFullscreen,
nightMode = nightMode,
showPageIndicator = showPageIndicator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.documents.data.DocumentsRepository
import org.fossify.documents.data.isAllowedExternalDocumentLink
import org.fossify.documents.extensions.shareDocuments
import org.fossify.documents.models.DocumentKind
import org.fossify.documents.ui.screens.StructuredDocumentScreen
import org.fossify.documents.ui.theme.DocumentsAppThemeSurface
Expand Down Expand Up @@ -79,6 +80,7 @@ class StructuredDocumentActivity : BaseComposeActivity() {
null
},
onOpenWith = { openWith(uri) },
onShare = { shareDocuments(listOf(uri)) },
onOpenLink = ::openLink,
)
}
Expand Down
41 changes: 41 additions & 0 deletions app/src/main/java/org/fossify/documents/extensions/Activity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@ package org.fossify.documents.extensions

import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.TransactionTooLargeException
import android.provider.Settings
import androidx.annotation.RequiresApi
import org.fossify.commons.activities.AboutActivity
import org.fossify.commons.activities.CustomizationActivity
import org.fossify.commons.extensions.getMimeTypeFromUri
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.openDeviceSettings
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.commons.helpers.APP_FAQ
import org.fossify.commons.helpers.APP_ICON_IDS
import org.fossify.commons.helpers.APP_LAUNCHER_NAME
Expand All @@ -23,6 +28,42 @@ import org.fossify.commons.helpers.SHOW_FAQ_BEFORE_MAIL
import org.fossify.commons.models.FAQItem
import org.fossify.documents.R

@Suppress("TooGenericExceptionCaught")
internal fun Activity.shareDocuments(uris: List<Uri>, mimeType: String = "") {
if (uris.isEmpty()) return

try {
val contentType = mimeType.ifBlank { getMimeTypeFromUri(uris.first()) }
.ifBlank { "application/octet-stream" }
val clips = ClipData.newUri(
contentResolver,
getString(org.fossify.commons.R.string.share),
uris.first(),
).apply {
uris.drop(1).forEach { addItem(ClipData.Item(it)) }
}
val intent = Intent(if (uris.size == 1) Intent.ACTION_SEND else Intent.ACTION_SEND_MULTIPLE).apply {
type = contentType
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
clipData = clips
if (uris.size == 1) {
putExtra(Intent.EXTRA_STREAM, uris.first())
} else {
putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(uris))
}
}
startActivity(Intent.createChooser(intent, getString(org.fossify.commons.R.string.share_via)))
} catch (_: ActivityNotFoundException) {
toast(org.fossify.commons.R.string.no_app_found)
} catch (error: RuntimeException) {
if (error.cause is TransactionTooLargeException) {
toast(org.fossify.commons.R.string.maximum_share_reached)
} else {
showErrorToast(error)
}
}
}

internal fun Activity.startAboutActivity(
appNameId: Int,
licenseMask: Long,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ private fun DocumentsSelectionActions(
IconButton(onClick = { actions.onShareDocuments(uiState.selectedDocuments.distinctBy { it.uri }) }) {
Icon(
imageVector = Icons.Outlined.Share,
contentDescription = stringResource(id = R.string.share_documents),
contentDescription = stringResource(id = org.fossify.commons.R.string.share),
tint = SimpleTheme.colorScheme.primary,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ internal fun PdfDocumentScreen(
isCopying: Boolean,
onPrint: () -> Unit,
onOpenWith: () -> Unit,
onShare: () -> Unit,
onFullscreenChange: (Boolean) -> Unit,
nightMode: Boolean,
showPageIndicator: Boolean,
Expand Down Expand Up @@ -196,6 +197,7 @@ internal fun PdfDocumentScreen(
onOutline = { showOutline = true },
hasOutline = bookmarks.isNotEmpty(),
onPrint = onPrint,
onShare = onShare,
menu = {
PdfReadingMenu(
nightMode = nightMode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import androidx.compose.material.icons.filled.Print
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.ZoomIn
import androidx.compose.material.icons.filled.ZoomOut
import androidx.compose.material.icons.outlined.Share
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
Expand Down Expand Up @@ -60,6 +61,7 @@ internal fun PdfTopBar(
onOutline: () -> Unit,
hasOutline: Boolean,
onPrint: () -> Unit,
onShare: () -> Unit,
menu: @Composable () -> Unit,
isLoaded: Boolean,
) {
Expand Down Expand Up @@ -99,6 +101,9 @@ internal fun PdfTopBar(
IconButton(onClick = onSearch, enabled = isLoaded) {
Icon(Icons.Filled.Search, stringResource(R.string.search_text_in_document))
}
IconButton(onClick = onShare, enabled = isLoaded) {
Icon(Icons.Outlined.Share, stringResource(org.fossify.commons.R.string.share))
}
if (hasOutline) {
IconButton(onClick = onOutline, enabled = isLoaded) {
Icon(Icons.AutoMirrored.Filled.List, stringResource(R.string.pdf_contents))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material.icons.filled.KeyboardArrowUp
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.outlined.Edit
import androidx.compose.material.icons.outlined.Share
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
Expand Down Expand Up @@ -86,6 +87,7 @@ internal fun StructuredDocumentScreen(
onBack: () -> Unit,
onEdit: (() -> Unit)?,
onOpenWith: () -> Unit,
onShare: () -> Unit,
onOpenLink: (Uri) -> Unit,
) {
var searchActive by rememberSaveable { mutableStateOf(false) }
Expand Down Expand Up @@ -115,6 +117,7 @@ internal fun StructuredDocumentScreen(
},
onEdit = onEdit,
onOpenWith = onOpenWith,
onShare = onShare,
scrolledColor = scrolledColor,
scrollBehavior = scrollBehavior,
statusBarColor = statusBarColor,
Expand Down Expand Up @@ -157,6 +160,7 @@ private fun StructuredDocumentTopBar(
onSearch: (() -> Unit)?,
onEdit: (() -> Unit)?,
onOpenWith: () -> Unit,
onShare: () -> Unit,
scrolledColor: Color,
scrollBehavior: TopAppBarScrollBehavior,
statusBarColor: Int,
Expand Down Expand Up @@ -210,6 +214,13 @@ private fun StructuredDocumentTopBar(
)
}
}
IconButton(onClick = onShare) {
Icon(
imageVector = Icons.Outlined.Share,
contentDescription = stringResource(org.fossify.commons.R.string.share),
tint = scrolledColor,
)
}
if (onEdit != null) {
IconButton(onClick = onEdit) {
Icon(
Expand Down
1 change: 0 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@
<string name="remember_pdf_page">Remember PDF page</string>
<string name="remove_from_documents">Remove from Documents</string>
<string name="retry">Retry</string>
<string name="share_documents">Share documents</string>
<string name="some_documents_no_longer_available">Some selected documents are no longer available.</string>
<string name="saved">Saved</string>
<string name="search_match_count">%1$d / %2$d</string>
Expand Down
Loading