Skip to content
Open
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

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.owncloud.android.ui.adapter.sendButton

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.owncloud.android.databinding.SendButtonBinding

class SendButtonAdapter(
private val sendButtonDataList: List<SendButtonData>,
private val clickListener: ClickListener
) : RecyclerView.Adapter<SendButtonAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder = ViewHolder(
SendButtonBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
),
clickListener
)

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(sendButtonDataList[position])
}

override fun getItemCount(): Int = sendButtonDataList.size

class ViewHolder(private val binding: SendButtonBinding, private val clickListener: ClickListener) :
RecyclerView.ViewHolder(
binding.getRoot()
),
View.OnClickListener {
private var sendButtonDataData: SendButtonData? = null

init {
itemView.setOnClickListener(this)
}

fun bind(item: SendButtonData) {
sendButtonDataData = item
binding.sendButton.icon = item.drawable
binding.sendButton.text = item.title
}

override fun onClick(v: View) {
clickListener.onSendButtonClick(sendButtonDataData)
}
}

interface ClickListener {
fun onSendButtonClick(sendButtonData: SendButtonData?)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.owncloud.android.ui.adapter.sendButton

import android.graphics.drawable.Drawable

data class SendButtonData(
@JvmField val drawable: Drawable?,
@JvmField val title: CharSequence?,
val packageName: String?,
val activityName: String?
)

This file was deleted.

52 changes: 28 additions & 24 deletions app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@ import com.nextcloud.client.utils.IntentUtil.createSendIntent
import com.owncloud.android.R
import com.owncloud.android.databinding.SendFilesFragmentBinding
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.ui.adapter.SendButtonAdapter
import com.owncloud.android.ui.components.SendButtonData
import com.owncloud.android.ui.adapter.sendButton.SendButtonAdapter
import com.owncloud.android.ui.adapter.sendButton.SendButtonData
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject

class SendFilesDialog :
BottomSheetDialogFragment(R.layout.send_files_fragment),
SendButtonAdapter.ClickListener,
Injectable {

private var files: Array<OCFile>? = null
Expand All @@ -41,16 +42,18 @@ class SendFilesDialog :
@Inject
var viewThemeUtils: ViewThemeUtils? = null

private var sendIntent: Intent? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// keep the state of the fragment on configuration changes
retainInstance = true

files = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requireArguments().getParcelableArray(KEY_OCFILES, OCFile::class.java)
requireArguments().getParcelableArray(KEY_OC_FILES, OCFile::class.java)
} else {
@Suppress("DEPRECATION")
requireArguments().getParcelableArray(KEY_OCFILES) as Array<OCFile>?
requireArguments().getParcelableArray(KEY_OC_FILES) as Array<OCFile>?
}
}

Expand All @@ -64,7 +67,8 @@ class SendFilesDialog :
}

private fun setupSendButtonRecyclerView() {
val sendIntent = createSendIntent(requireContext(), files!!)
sendIntent = createSendIntent(requireContext(), files!!)
val sendIntent = sendIntent ?: return
val matches = requireActivity().packageManager.queryIntentActivities(sendIntent, 0)

if (matches.isEmpty()) {
Expand All @@ -76,22 +80,12 @@ class SendFilesDialog :
}

val sendButtonDataList = setupSendButtonData(matches)
val clickListener = setupSendButtonClickListener(sendIntent)

@Suppress("MagicNumber")
binding.sendButtonRecyclerView.layoutManager = GridLayoutManager(requireActivity(), 4)
binding.sendButtonRecyclerView.adapter = SendButtonAdapter(sendButtonDataList, clickListener)
binding.sendButtonRecyclerView.adapter = SendButtonAdapter(sendButtonDataList, this)
}

private fun setupSendButtonClickListener(sendIntent: Intent): SendButtonAdapter.ClickListener =
SendButtonAdapter.ClickListener { sendButtonDataData: SendButtonData ->
val packageName = sendButtonDataData.packageName
val activityName = sendButtonDataData.activityName
sendIntent.component = ComponentName(packageName, activityName)
requireActivity().startActivity(Intent.createChooser(sendIntent, getString(R.string.send)))
dismiss()
}

private fun setupSendButtonData(matches: List<ResolveInfo>): List<SendButtonData> {
var icon: Drawable
var sendButtonData: SendButtonData
Expand All @@ -111,15 +105,25 @@ class SendFilesDialog :
return sendButtonDataList
}

@Suppress("ReturnCount")
override fun onSendButtonClick(sendButtonData: SendButtonData?) {
sendButtonData ?: return
sendIntent ?: return

val packageName = sendButtonData.packageName ?: return
val activityName = sendButtonData.activityName ?: return
sendIntent?.component = ComponentName(packageName, activityName)
requireActivity().startActivity(Intent.createChooser(sendIntent, getString(R.string.send)))
dismiss()
}

companion object {
private const val KEY_OCFILES = "KEY_OCFILES"

fun newInstance(files: Set<OCFile>): SendFilesDialog {
val dialogFragment = SendFilesDialog()
val args = Bundle()
args.putParcelableArray(KEY_OCFILES, files.toTypedArray())
dialogFragment.arguments = args
return dialogFragment
private const val KEY_OC_FILES = "KEY_OC_FILES"

fun newInstance(files: Set<OCFile>): SendFilesDialog = SendFilesDialog().apply {
arguments = Bundle().apply {
putParcelableArray(KEY_OC_FILES, files.toTypedArray())
}
}
}
}
Loading
Loading