Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented media/photo share functionality #3284

Merged
merged 15 commits into from
Sep 5, 2023
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
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ abstract class PreviewMessageViewHolder(itemView: View?, payload: Any?) :
message.selectedIndividualHashMap!![KEY_NAME]!!,
message.selectedIndividualHashMap!![KEY_ID]!!,
message.selectedIndividualHashMap!![KEY_MIMETYPE],
message.openWhenDownloaded,
ProgressUi(progressBar, messageText, image)
)
} else if (message.getCalculateMessageType() === ChatMessage.MessageType.SINGLE_LINK_GIPHY_MESSAGE) {
Expand Down
51 changes: 45 additions & 6 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ import com.nextcloud.talk.ui.dialog.ShowReactionsDialog
import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions
import com.nextcloud.talk.ui.recyclerview.MessageSwipeCallback
import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.AudioUtils
import com.nextcloud.talk.utils.AudioUtils.audioFileToFloatArray
import com.nextcloud.talk.utils.ContactUtils
import com.nextcloud.talk.utils.ConversationUtils
import com.nextcloud.talk.utils.DateConstants
Expand All @@ -201,6 +201,7 @@ import com.nextcloud.talk.utils.FileUtils
import com.nextcloud.talk.utils.FileViewerUtils
import com.nextcloud.talk.utils.ImageEmojiEditText
import com.nextcloud.talk.utils.MagicCharPolicy
import com.nextcloud.talk.utils.Mimetype
import com.nextcloud.talk.utils.NotificationUtils
import com.nextcloud.talk.utils.ParticipantPermissions
import com.nextcloud.talk.utils.VibrationUtils
Expand Down Expand Up @@ -316,6 +317,7 @@ class ChatActivity :
var voiceOnly: Boolean = true
var isFirstMessagesProcessing = true
private var emojiPopup: EmojiPopup? = null
private lateinit var path: String

var myFirstMessage: CharSequence? = null
var checkingLobbyStatus: Boolean = false
Expand Down Expand Up @@ -887,7 +889,9 @@ class ChatActivity :
}
} else {
Log.d(TAG, "Downloaded to cache")
downloadFileToCache(message)
downloadFileToCache(message, true) {
setUpWaveform(message)
}
}
}
}
Expand All @@ -899,7 +903,7 @@ class ChatActivity :
message.isDownloadingVoiceMessage = true
adapter?.update(message)
CoroutineScope(Dispatchers.Default).launch {
val r = AudioUtils.audioFileToFloatArray(file)
val r = audioFileToFloatArray(file)
message.voiceMessageFloatArray = r
withContext(Dispatchers.Main) {
startPlayback(message)
Expand Down Expand Up @@ -1933,8 +1937,13 @@ class ChatActivity :
}

@SuppressLint("LongLogTag")
private fun downloadFileToCache(message: ChatMessage) {
private fun downloadFileToCache(
message: ChatMessage,
openWhenDownloaded: Boolean,
funToCallWhenDownloadSuccessful: (() -> Unit)
) {
message.isDownloadingVoiceMessage = true
message.openWhenDownloaded = openWhenDownloaded
adapter?.update(message)

val baseUrl = message.activeUser!!.baseUrl
Expand Down Expand Up @@ -1985,8 +1994,7 @@ class ChatActivity :
WorkManager.getInstance(context).getWorkInfoByIdLiveData(downloadWorker.id)
.observeForever { workInfo: WorkInfo ->
if (workInfo.state == WorkInfo.State.SUCCEEDED) {
setUpWaveform(message)
// startPlayback(message)
funToCallWhenDownloadSuccessful()
}
}
}
Expand Down Expand Up @@ -3997,6 +4005,37 @@ class ChatActivity :
startActivity(intent)
}

fun share(message: ChatMessage) {
val filename = message.selectedIndividualHashMap!!["name"]
path = applicationContext.cacheDir.absolutePath + "/" + filename
val shareUri = FileProvider.getUriForFile(
this,
BuildConfig.APPLICATION_ID,
File(path)
)

val shareIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_STREAM, shareUri)
type = Mimetype.IMAGE_PREFIX_GENERIC
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.send_to)))
}

fun checkIfSharable(message: ChatMessage) {
val filename = message.selectedIndividualHashMap!!["name"]
path = applicationContext.cacheDir.absolutePath + "/" + filename
val file = File(context.cacheDir, filename!!)
if (file.exists()) {
share(message)
} else {
downloadFileToCache(message, false) {
share(message)
}
}
}

fun openInFilesApp(message: ChatMessage) {
val keyID = message.selectedIndividualHashMap!![PreviewMessageViewHolder.KEY_ID]
val link = message.selectedIndividualHashMap!!["link"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,9 @@ data class ChatMessage(

var expandableChildrenAmount: Int = 0,

var hiddenByCollapse: Boolean = false
var hiddenByCollapse: Boolean = false,

var openWhenDownloaded: Boolean = true

) : Parcelable, MessageContentType, MessageContentType.Image {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,17 @@ abstract class SharedItemsViewHolder(
progressBar,
null,
image
)
),
true
)
}

fileViewerUtils.resumeToUpdateViewsByProgress(
item.name,
item.id,
item.mimeType,
FileViewerUtils.ProgressUi(progressBar, null, image)
true,
FileViewerUtils.ProgressUi(progressBar, null, image),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ class MessageActionsDialog(
message.previousMessageId > NO_PREVIOUS_MESSAGE_ID &&
ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType()
)
initMenuShare(ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == message.getCalculateMessageType())
initMenuItemOpenNcApp(
ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == message.getCalculateMessageType()
)
Expand Down Expand Up @@ -330,6 +331,15 @@ class MessageActionsDialog(

dialogMessageActionsBinding.menuTranslateMessage.visibility = getVisibility(visible)
}
private fun initMenuShare(visible: Boolean) {
if (visible) {
dialogMessageActionsBinding.menuShare.setOnClickListener {
chatActivity.checkIfSharable(message)
dismiss()
}
}
dialogMessageActionsBinding.menuShare.visibility = getVisibility(visible)
}

private fun initMenuItemOpenNcApp(visible: Boolean) {
if (visible) {
Expand Down
37 changes: 23 additions & 14 deletions app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
path,
link,
mimetype,
progressUi
progressUi,
message.openWhenDownloaded
)
}

Expand All @@ -104,14 +105,16 @@ class FileViewerUtils(private val context: Context, private val user: User) {
path: String,
link: String?,
mimetype: String?,
progressUi: ProgressUi
progressUi: ProgressUi,
openWhenDownloaded: Boolean
) {
if (isSupportedForInternalViewer(mimetype) || canBeHandledByExternalApp(mimetype, fileInfo.fileName)) {
openOrDownloadFile(
fileInfo,
path,
mimetype,
progressUi
progressUi,
openWhenDownloaded
)
} else if (!link.isNullOrEmpty()) {
openFileInFilesApp(link, fileInfo.fileId)
Expand All @@ -138,7 +141,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileInfo: FileInfo,
path: String,
mimetype: String?,
progressUi: ProgressUi
progressUi: ProgressUi,
openWhenDownloaded: Boolean
) {
val file = File(context.cacheDir, fileInfo.fileName)
if (file.exists()) {
Expand All @@ -148,7 +152,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileInfo,
path,
mimetype,
progressUi
progressUi,
openWhenDownloaded
)
}
}
Expand Down Expand Up @@ -276,7 +281,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileInfo: FileInfo,
path: String,
mimetype: String?,
progressUi: ProgressUi
progressUi: ProgressUi,
openWhenDownloaded: Boolean
) {
// check if download worker is already running
val workers = WorkManager.getInstance(context).getWorkInfosByTag(fileInfo.fileId!!)
Expand Down Expand Up @@ -324,7 +330,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileInfo.fileName,
mimetype,
workInfo!!,
progressUi
progressUi,
openWhenDownloaded
)
}
}
Expand All @@ -333,7 +340,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileName: String,
mimetype: String?,
workInfo: WorkInfo,
progressUi: ProgressUi
progressUi: ProgressUi,
openWhenDownloaded: Boolean
) {
when (workInfo.state) {
WorkInfo.State.RUNNING -> {
Expand All @@ -347,13 +355,12 @@ class FileViewerUtils(private val context: Context, private val user: User) {
}
}
WorkInfo.State.SUCCEEDED -> {
if (progressUi.previewImage.isShown) {
if (progressUi.previewImage.isShown && openWhenDownloaded) {
openFileByMimetype(fileName, mimetype)
} else {
Log.d(
TAG,
"file " + fileName +
" was downloaded but it's not opened because view is not shown on screen"
Log.d(TAG, "file " + fileName +
" was downloaded but it's not opened because view is not shown on screen or " +
"openWhenDownloaded is false"
)
}
progressUi.messageText?.text = fileName
Expand All @@ -372,6 +379,7 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileName: String,
fileId: String,
mimeType: String?,
openWhenDownloaded: Boolean,
progressUi: ProgressUi
) {
val workers = WorkManager.getInstance(context).getWorkInfosByTag(fileId)
Expand All @@ -390,7 +398,8 @@ class FileViewerUtils(private val context: Context, private val user: User) {
fileName,
mimeType,
info!!,
progressUi
progressUi,
openWhenDownloaded
)
}
}
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/res/layout/dialog_message_actions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,39 @@

</LinearLayout>

<LinearLayout
android:id="@+id/menu_share"
android:layout_width="match_parent"
android:layout_height="@dimen/bottom_sheet_item_height"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
tools:ignore="UseCompoundDrawables">

<ImageView
android:id="@+id/menu_icon_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:paddingStart="@dimen/standard_padding"
android:paddingEnd="@dimen/zero"
android:src="@drawable/ic_share_action"
app:tint="@color/high_emphasis_menu_icon" />

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/menu_text_share"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:paddingStart="@dimen/standard_double_padding"
android:paddingEnd="@dimen/standard_padding"
android:text="@string/share"
android:textAlignment="viewStart"
android:textColor="@color/high_emphasis_text"
android:textSize="@dimen/bottom_sheet_text_size" />

</LinearLayout>

<LinearLayout
android:id="@+id/menu_open_in_nc_app"
android:layout_width="match_parent"
Expand Down
Loading