Skip to content

Commit

Permalink
added download feature on preview screen for task attachments (#161)
Browse files Browse the repository at this point in the history
* added download feature on preview screen for task attachments

* codacy correction
  • Loading branch information
aman-alfresco committed Sep 2, 2022
1 parent d8135a8 commit 66311e1
Show file tree
Hide file tree
Showing 14 changed files with 167 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ data class ActionOpenWith(
override var entry: Entry,
override val icon: Int = R.drawable.ic_open_with,
override val title: Int = R.string.action_open_with_title,
override val eventName: EventName = EventName.OpenWith
override val eventName: EventName = EventName.OpenWith,
val hasChooser: Boolean = false
) : Action {

private var deferredDownload = AtomicReference<Deferred<Unit>?>(null)
Expand All @@ -42,7 +43,14 @@ data class ActionOpenWith(
return if (!entry.isProcessService) {
showFileChooserDialog(context, target)
entry
} else Entry.updateDownloadEntry(entry, target.path)
} else {
var path = target.path
if (hasChooser) {
showFileChooserDialog(context, target)
path = ""
}
Entry.updateDownloadEntry(entry, path)
}
}

private suspend fun fetchRemoteFile(context: Context): File {
Expand Down
1 change: 1 addition & 0 deletions browse/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<application>
<activity
android:name=".tasks.TaskViewerActivity"
android:configChanges="orientation|screenSize"
android:exported="false" />
</application>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ package com.alfresco.content.browse.preview
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.alfresco.content.actions.Action
import com.alfresco.content.browse.databinding.ActivityLocalPreviewBinding
import com.alfresco.content.data.Entry

/**
* Mark as Preview Activity
Expand All @@ -22,7 +25,15 @@ class LocalPreviewActivity : AppCompatActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
binding.toolbar.setNavigationOnClickListener { onBackPressed() }

title = intent.extras?.getString("title")
title = if (intent.extras?.containsKey(KEY_ENTRY_OBJ) == true) {
(intent.extras?.getParcelable(KEY_ENTRY_OBJ) as Entry?)?.name
} else intent.extras?.getString("title")

Action.showActionToasts(
lifecycleScope,
findViewById(android.R.id.content),
binding.bottomView
)
}

override fun onAttachFragment(fragment: Fragment) {
Expand All @@ -34,6 +45,7 @@ class LocalPreviewActivity : AppCompatActivity() {

companion object {
const val KEY_PATH = "path"
const val KEY_ENTRY_OBJ = "entryObj"
const val KEY_MIME_TYPE = "mimeType"
const val KEY_TITLE = "title"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,23 @@ package com.alfresco.content.browse.preview

import android.os.Bundle
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.core.content.res.ResourcesCompat
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import com.airbnb.mvrx.InternalMavericksApi
import com.airbnb.mvrx.Mavericks
import com.airbnb.mvrx.MavericksView
import com.airbnb.mvrx.withState
import com.alfresco.content.browse.R
import com.alfresco.content.browse.databinding.FragmentLocalPreviewBinding
import com.alfresco.content.data.Entry
import com.alfresco.content.fragmentViewModelWithArgs
import com.alfresco.content.mimetype.MimeType
import com.alfresco.content.viewer.common.ChildViewerArgs
import com.alfresco.content.viewer.image.ImagePreviewProvider
Expand All @@ -22,11 +30,13 @@ import com.alfresco.content.viewer.text.TextPreviewProvider
* Mark as LocalPreviewArgs
*/
data class LocalPreviewArgs(
val entry: Entry? = null,
val path: String,
val title: String,
val mimeType: String
) {
companion object {
private const val ENTRY_OBJ_KEY = "entryObj"
private const val PATH_KEY = "path"
private const val TITLE_KEY = "title"
private const val MIME_TYPE_KEY = "mimeType"
Expand All @@ -35,20 +45,31 @@ data class LocalPreviewArgs(
* returns the LocalPreviewArgs obj
*/
fun with(args: Bundle): LocalPreviewArgs {
return LocalPreviewArgs(
args.getString(PATH_KEY, ""),
args.getString(TITLE_KEY, ""),
args.getString(MIME_TYPE_KEY, "")
)
if (args.containsKey(ENTRY_OBJ_KEY)) {
val entry = args.getParcelable(ENTRY_OBJ_KEY) as Entry?
return LocalPreviewArgs(
entry,
path = entry?.path ?: "",
title = entry?.name ?: "",
mimeType = entry?.mimeType ?: ""
)
} else
return LocalPreviewArgs(
path = args.getString(PATH_KEY, ""),
title = args.getString(TITLE_KEY, ""),
mimeType = args.getString(MIME_TYPE_KEY, "")
)
}
}
}

/**
* Mark as LocalPreviewFragment
*/
class LocalPreviewFragment : Fragment() {

class LocalPreviewFragment : Fragment(), MavericksView {
private lateinit var args: LocalPreviewArgs
@OptIn(InternalMavericksApi::class)
private val viewModel: LocalPreviewViewModel by fragmentViewModelWithArgs { args }
private lateinit var binding: FragmentLocalPreviewBinding

override fun onCreateView(
Expand All @@ -60,14 +81,37 @@ class LocalPreviewFragment : Fragment() {
return binding.root
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
args = LocalPreviewArgs.with(requireArguments())
setHasOptionsMenu(true)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val args = LocalPreviewArgs.with(requireArguments())
configureViewer(args)
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
withState(viewModel) { state ->
if (state.entry?.isProcessService == true)
inflater.inflate(R.menu.menu_preview, menu)
}
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.download -> {
viewModel.execute()
true
}
else -> super.onOptionsItemSelected(item)
}
}

private fun configureViewer(argsLocal: LocalPreviewArgs) {
requireActivity().invalidateOptionsMenu()
binding.title.text = argsLocal.title
val type = MimeType.with(argsLocal.mimeType)
binding.icon.setImageDrawable(
Expand Down Expand Up @@ -104,4 +148,7 @@ class LocalPreviewFragment : Fragment() {
TextPreviewProvider.isMimeTypeSupported(mimeType) -> TextPreviewProvider
else -> null
}?.createViewer()

override fun invalidate() {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.alfresco.content.browse.preview

import android.content.Context
import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.ViewModelContext
import com.alfresco.content.actions.ActionOpenWith
import com.alfresco.content.data.Entry
import kotlinx.coroutines.GlobalScope

/**
* Marked as LocalPreviewState data class
*/
data class LocalPreviewState(
val entry: Entry?
) : MavericksState {
constructor(args: LocalPreviewArgs) : this(entry = args.entry)
}

/**
* Marked as LocalPreviewViewModel class
*/
class LocalPreviewViewModel(
state: LocalPreviewState,
val context: Context
) : MavericksViewModel<LocalPreviewState>(state) {

/**
* execute to download the files
*/
fun execute() = withState { state ->
state.entry?.let {
val action = ActionOpenWith(it, hasChooser = true)
action.execute(context, GlobalScope)
}
}

companion object : MavericksViewModelFactory<LocalPreviewViewModel, LocalPreviewState> {
override fun create(
viewModelContext: ViewModelContext,
state: LocalPreviewState
) =
// Requires activity context in order to present other fragments
LocalPreviewViewModel(state, viewModelContext.activity())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.alfresco.content.data.ContentEntry
import com.alfresco.content.data.Entry
import com.alfresco.content.data.PageView
import com.alfresco.content.listview.EntryListener
import com.alfresco.content.mimetype.MimeType
import com.alfresco.content.simpleController
import com.alfresco.ui.getDrawableForAttribute

Expand Down Expand Up @@ -101,18 +102,14 @@ class AttachedFilesFragment : Fragment(), MavericksView, EntryListener {
}

private fun onItemClicked(contentEntry: ContentEntry) {
viewModel.execute(ActionOpenWith(Entry.convertContentEntryToEntry(contentEntry)))
viewModel.execute(ActionOpenWith(Entry.convertContentEntryToEntry(contentEntry, MimeType.isDocFile(contentEntry.mimeType))))
}

override fun onEntryCreated(entry: Entry) {
if (isAdded)
entry.mimeType?.let {
startActivity(
Intent(requireActivity(), LocalPreviewActivity::class.java)
.putExtra(LocalPreviewActivity.KEY_PATH, entry.path)
.putExtra(LocalPreviewActivity.KEY_MIME_TYPE, it)
.putExtra(LocalPreviewActivity.KEY_TITLE, entry.name)
)
}
startActivity(
Intent(requireActivity(), LocalPreviewActivity::class.java)
.putExtra(LocalPreviewActivity.KEY_ENTRY_OBJ, entry)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ import com.alfresco.content.browse.R
import com.alfresco.content.browse.databinding.FragmentTaskDetailBinding
import com.alfresco.content.browse.databinding.ViewListCommentRowBinding
import com.alfresco.content.browse.preview.LocalPreviewActivity
import com.alfresco.content.browse.preview.LocalPreviewActivity.Companion.KEY_MIME_TYPE
import com.alfresco.content.browse.preview.LocalPreviewActivity.Companion.KEY_PATH
import com.alfresco.content.browse.preview.LocalPreviewActivity.Companion.KEY_TITLE
import com.alfresco.content.browse.preview.LocalPreviewActivity.Companion.KEY_ENTRY_OBJ
import com.alfresco.content.browse.tasks.attachments.listViewAttachmentRow
import com.alfresco.content.data.AnalyticsManager
import com.alfresco.content.data.CommentEntry
Expand All @@ -35,6 +33,7 @@ import com.alfresco.content.data.PageView
import com.alfresco.content.getDateZoneFormat
import com.alfresco.content.listview.EntryListener
import com.alfresco.content.listview.updatePriorityView
import com.alfresco.content.mimetype.MimeType
import com.alfresco.content.simpleController
import com.alfresco.ui.getDrawableForAttribute
import com.google.android.material.dialog.MaterialAlertDialogBuilder
Expand Down Expand Up @@ -216,7 +215,7 @@ class TaskDetailFragment : Fragment(), MavericksView, EntryListener {
}

private fun onItemClicked(contentEntry: ContentEntry) {
viewModel.execute(ActionOpenWith(Entry.convertContentEntryToEntry(contentEntry)))
viewModel.execute(ActionOpenWith(Entry.convertContentEntryToEntry(contentEntry, MimeType.isDocFile(contentEntry.mimeType))))
}

private fun taskCompletePrompt() {
Expand All @@ -236,13 +235,9 @@ class TaskDetailFragment : Fragment(), MavericksView, EntryListener {

override fun onEntryCreated(entry: Entry) {
if (isAdded)
entry.mimeType?.let {
startActivity(
Intent(requireActivity(), LocalPreviewActivity::class.java)
.putExtra(KEY_PATH, entry.path)
.putExtra(KEY_MIME_TYPE, it)
.putExtra(KEY_TITLE, entry.name)
)
}
startActivity(
Intent(requireActivity(), LocalPreviewActivity::class.java)
.putExtra(KEY_ENTRY_OBJ, entry)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ class TaskDetailViewModel(
getComments()
getContents()
viewModelScope.on<ActionOpenWith> {
entryListener?.onEntryCreated(it.entry)
if (!it.entry.path.isNullOrEmpty())
entryListener?.onEntryCreated(it.entry)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ fun TaskDetailViewModel.updateTaskList() {
*/
fun TaskDetailViewModel.execute(action: Action) {
val file = File(repository.session.contentDir, action.entry.fileName)
if (repository.session.isFileExists(file) && file.length() != 0L) {
if (!action.entry.isDocFile && repository.session.isFileExists(file) && file.length() != 0L) {
entryListener?.onEntryCreated(Entry.updateDownloadEntry(action.entry, file.path))
} else action.execute(context, GlobalScope)
}
Expand Down
2 changes: 1 addition & 1 deletion browse/src/main/res/layout/activity_local_preview.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
Expand All @@ -20,6 +19,7 @@
android:layout_weight="1" />

<View
android:id="@+id/bottom_view"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/white"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/account"
android:icon="@drawable/ic_account"
android:title="@string/account"
android:id="@+id/download"
android:icon="@drawable/ic_download"
android:title="@string/action_download_title"
app:showAsAction="ifRoom|collapseActionView"/>
</menu>
7 changes: 6 additions & 1 deletion data/objectbox-models/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"entities": [
{
"id": "1:3882697123829827748",
"lastPropertyId": "16:2988824422240542017",
"lastPropertyId": "17:6412748984978823089",
"name": "Entry",
"properties": [
{
Expand Down Expand Up @@ -88,6 +88,11 @@
"id": "16:2988824422240542017",
"name": "isProcessService",
"type": 1
},
{
"id": "17:6412748984978823089",
"name": "isDocFile",
"type": 1
}
],
"relations": []
Expand Down
Loading

0 comments on commit 66311e1

Please sign in to comment.