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

Use Material Design 3 For Send Files Bottom Sheet #12064

Merged
merged 6 commits into from
Oct 31, 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
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
import com.owncloud.android.ui.dialog.RenamePublicShareDialogFragment;
import com.owncloud.android.ui.dialog.SendFilesDialog;
import com.owncloud.android.ui.dialog.SendShareDialog;
import com.owncloud.android.ui.dialog.SetupEncryptionDialogFragment;
import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
Expand Down Expand Up @@ -460,6 +461,9 @@ abstract class ComponentsModule {
@ContributesAndroidInjector
abstract FileActionsBottomSheet fileActionsBottomSheet();

@ContributesAndroidInjector
abstract SendFilesDialog sendFilesDialog();

@ContributesAndroidInjector
abstract DocumentScanActivity documentScanActivity();

Expand Down
135 changes: 0 additions & 135 deletions app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.java

This file was deleted.

138 changes: 138 additions & 0 deletions app/src/main/java/com/owncloud/android/ui/dialog/SendFilesDialog.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package com.owncloud.android.ui.dialog

import android.content.ComponentName
import android.content.Intent
import android.content.pm.ResolveInfo
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.client.di.Injectable
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.utils.theme.ViewThemeUtils
import javax.inject.Inject

/*
* Nextcloud Android client application
*
* @author Tobias Kaminsky
* Copyright (C) 2020 Tobias Kaminsky
* Copyright (C) 2020 Nextcloud GmbH.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
class SendFilesDialog : BottomSheetDialogFragment(R.layout.send_files_fragment), Injectable {

private var files: Array<OCFile>? = null
private lateinit var binding: SendFilesFragmentBinding

@JvmField
@Inject
var viewThemeUtils: ViewThemeUtils? = 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)
} else {
@Suppress("DEPRECATION")
requireArguments().getParcelableArray(KEY_OCFILES) as Array<OCFile>?
}
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = SendFilesFragmentBinding.inflate(inflater, container, false)

setupSendButtonRecyclerView()
viewThemeUtils?.platform?.colorViewBackground(binding.bottomSheet, ColorRole.SURFACE)

return binding.root
}

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

if (matches.isEmpty()) {
Toast.makeText(context, R.string.no_send_app, Toast.LENGTH_SHORT).show()
dismiss()
return
}

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

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

private fun setupSendButtonClickListener(sendIntent: Intent): SendButtonAdapter.ClickListener {
return 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
var label: CharSequence
val sendButtonDataList: MutableList<SendButtonData> = ArrayList(matches.size)
for (match in matches) {
icon = match.loadIcon(requireActivity().packageManager)
label = match.loadLabel(requireActivity().packageManager)
sendButtonData = SendButtonData(
icon, label,
match.activityInfo.packageName,
match.activityInfo.name
)
sendButtonDataList.add(sendButtonData)
}
return sendButtonDataList
}

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
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -810,7 +810,7 @@ public void sendFiles(Set<OCFile> files) {
FragmentTransaction ft = fm.beginTransaction();
ft.addToBackStack(null);

SendFilesDialog sendFilesDialog = SendFilesDialog.newInstance(files);
SendFilesDialog sendFilesDialog = SendFilesDialog.Companion.newInstance(files);
sendFilesDialog.show(ft, "TAG_SEND_SHARE_DIALOG");
}

Expand Down
33 changes: 26 additions & 7 deletions app/src/main/res/layout/send_files_fragment.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,38 @@
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"

<FrameLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/standard_bottom_sheet"
style="@style/Widget.Material3.BottomSheet"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

<RelativeLayout
<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="wrap_content"
android:orientation="vertical">

<com.google.android.material.bottomsheet.BottomSheetDragHandleView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/send_button_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/send_button" />
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
tools:listitem="@layout/send_button"/>

<View
android:layout_width="match_parent"
android:layout_height="@dimen/standard_padding"/>

</LinearLayout>

</FrameLayout>
Loading