diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java index 86b21f332872..7954884a1340 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingMenuBottomSheetDialog.java @@ -13,6 +13,8 @@ import android.os.Bundle; import android.view.View; import android.view.ViewGroup; +import androidx.core.content.ContextCompat; +import com.owncloud.android.R; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialog; @@ -59,10 +61,15 @@ protected void onCreate(Bundle savedInstanceState) { viewThemeUtils.platform.themeDialog(binding.getRoot()); - viewThemeUtils.platform.colorImageView(binding.menuIconAdvancedPermissions, ColorRole.PRIMARY); - viewThemeUtils.platform.colorImageView(binding.menuIconSendLink, ColorRole.PRIMARY); - viewThemeUtils.platform.colorImageView(binding.menuIconUnshare, ColorRole.PRIMARY); - viewThemeUtils.platform.colorImageView(binding.menuIconSendNewEmail, ColorRole.PRIMARY); + int textColor = ContextCompat.getColor(getContext(), R.color.text_color); + viewThemeUtils.material.colorMaterialButtonContent(binding.menuShareAdvancedPermissions, ColorRole.PRIMARY); + viewThemeUtils.material.colorMaterialButtonContent(binding.menuShareSendNewEmail, ColorRole.PRIMARY); + viewThemeUtils.material.colorMaterialButtonContent(binding.menuShareSendLink, ColorRole.PRIMARY); + viewThemeUtils.material.colorMaterialButtonContent(binding.menuShareUnshare, ColorRole.PRIMARY); + binding.menuShareAdvancedPermissions.setTextColor(textColor); + binding.menuShareSendNewEmail.setTextColor(textColor); + binding.menuShareSendLink.setTextColor(textColor); + binding.menuShareUnshare.setTextColor(textColor); updateUI(); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt index 4691e383a2f2..4600176b9608 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt @@ -9,8 +9,13 @@ package com.owncloud.android.ui.fragment import android.os.Build import android.os.Bundle +import android.view.ContextThemeWrapper +import android.view.Gravity import android.view.View +import android.widget.LinearLayout +import androidx.core.content.ContextCompat import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.button.MaterialButton import com.google.gson.Gson import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.client.account.User @@ -21,7 +26,6 @@ import com.nextcloud.utils.BuildHelper.isFlavourGPlay import com.nextcloud.utils.EditorUtils import com.owncloud.android.MainApp import com.owncloud.android.R -import com.owncloud.android.databinding.FileListActionsBottomSheetCreatorBinding import com.owncloud.android.databinding.FileListActionsBottomSheetFragmentBinding import com.owncloud.android.datamodel.ArbitraryDataProvider import com.owncloud.android.datamodel.ArbitraryDataProviderImpl @@ -81,24 +85,35 @@ class OCFileListBottomSheetDialog( if (!hasPermission) { binding.menuUploadFiles.visibility = View.GONE - binding.uploadContentFromOtherApps.text = context.getString(R.string.upload_files) + binding.menuUploadFromApp.text = context.getString(R.string.upload_files) } } } private fun applyBranding() { - viewThemeUtils.platform.run { + viewThemeUtils.material.run { binding.run { - colorImageView(menuIconUploadFiles, ColorRole.PRIMARY) - colorImageView(menuIconUploadFromApp, ColorRole.PRIMARY) - colorImageView(menuIconDirectCameraUpload, ColorRole.PRIMARY) - colorImageView(menuIconScanDocUpload, ColorRole.PRIMARY) - colorImageView(menuIconMkdir, ColorRole.PRIMARY) - colorImageView(menuIconAddFolderInfo, ColorRole.PRIMARY) - - colorViewBackground(binding.bottomSheet, ColorRole.SURFACE) + colorMaterialButtonContent(menuUploadFiles, ColorRole.PRIMARY) + colorMaterialButtonContent(menuUploadFromApp, ColorRole.PRIMARY) + colorMaterialButtonContent(menuDirectCameraUpload, ColorRole.PRIMARY) + colorMaterialButtonContent(menuScanDocUpload, ColorRole.PRIMARY) + colorMaterialButtonContent(menuMkdir, ColorRole.PRIMARY) + colorMaterialButtonContent(menuCreateRichWorkspace, ColorRole.PRIMARY) } } + + viewThemeUtils.platform.colorViewBackground(binding.bottomSheet, ColorRole.SURFACE) + + val textColor = ContextCompat.getColor(context, R.color.text_color) + + binding.run { + menuUploadFiles.setTextColor(textColor) + menuUploadFromApp.setTextColor(textColor) + menuDirectCameraUpload.setTextColor(textColor) + menuScanDocUpload.setTextColor(textColor) + menuMkdir.setTextColor(textColor) + menuCreateRichWorkspace.setTextColor(textColor) + } } @Suppress("ComplexCondition") @@ -110,50 +125,76 @@ class OCFileListBottomSheetDialog( capability.richDocumentsTemplatesAvailable.isTrue && !file.isEncrypted ) { - binding.templates.visibility = View.VISIBLE + binding.menuNewDocument.visibility = View.VISIBLE + binding.menuNewSpreadsheet.visibility = View.VISIBLE + binding.menuNewPresentation.visibility = View.VISIBLE } } - @Suppress("DEPRECATION") + @Suppress("DEPRECATION", "LongMethod", "MagicNumber") private fun initCreatorContainer() { val json = ArbitraryDataProviderImpl(context) .getValue(user, ArbitraryDataProvider.DIRECT_EDITING) - if (!json.isEmpty() && !file.isEncrypted) { + if (json.isNotEmpty() && !file.isEncrypted) { val directEditing = Gson().fromJson(json, DirectEditing::class.java) if (directEditing.creators.isEmpty()) { return } binding.creatorsContainer.visibility = View.VISIBLE + binding.creators.removeAllViews() + + val itemHeight = context.resources.getDimensionPixelSize(R.dimen.bottom_sheet_item_height) + val standardPadding = context.resources.getDimensionPixelSize(R.dimen.standard_padding) + val iconSize = context.resources.getDimensionPixelSize(R.dimen.iconized_single_line_item_icon_size) for (creator in directEditing.creators.values) { - val creatorViewBinding = - FileListActionsBottomSheetCreatorBinding.inflate(layoutInflater) + val creatorButton = MaterialButton( + ContextThemeWrapper( + context, + R.style.ThemeOverlay_App_Button_BottomSheetItem + ), + null, + com.google.android.material.R.attr.materialButtonStyle + ).apply { + id = View.generateViewId() + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + itemHeight + ) - val creatorView: View = creatorViewBinding.getRoot() + gravity = Gravity.START or Gravity.CENTER_VERTICAL + setPaddingRelative(standardPadding, 0, standardPadding, 0) - creatorViewBinding.creatorName.text = String.format( - fileActivity.getString(R.string.editor_placeholder), - fileActivity.getString(R.string.create_new), - creator.name - ) + val buttonText = String.format( + fileActivity.getString(R.string.editor_placeholder), + fileActivity.getString(R.string.create_new), + creator.name + ) + text = buttonText + setTextColor(ContextCompat.getColor(context, R.color.text_color)) + textSize = 16f + isAllCaps = false - creatorViewBinding.creatorThumbnail.setImageDrawable( - MimeTypeUtil.getFileTypeIcon( + icon = MimeTypeUtil.getFileTypeIcon( creator.mimetype, creator.extension, - creatorViewBinding.creatorThumbnail.context, + context, viewThemeUtils ) - ) - - creatorView.setOnClickListener { - actions.showTemplate(creator, creatorViewBinding.creatorName.text.toString()) - dismiss() + this.iconSize = iconSize + this.iconPadding = standardPadding + iconGravity = MaterialButton.ICON_GRAVITY_START + iconTint = null + + setOnClickListener { + actions.showTemplate(creator, buttonText) + dismiss() + } } - binding.creators.addView(creatorView) + binding.creators.addView(creatorButton) } } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt b/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt index 4d0a9e427cdc..746ec89cded1 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/ProfileBottomSheetDialog.kt @@ -9,25 +9,33 @@ package com.owncloud.android.ui.fragment import android.content.ActivityNotFoundException import android.content.DialogInterface import android.content.Intent +import android.content.res.ColorStateList import android.graphics.drawable.Drawable import android.os.Bundle +import android.view.ContextThemeWrapper +import android.view.Gravity import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.LinearLayout +import androidx.compose.ui.graphics.toArgb +import androidx.core.content.ContextCompat import androidx.core.content.res.ResourcesCompat import androidx.core.net.toUri import androidx.fragment.app.FragmentActivity import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.button.MaterialButton import com.nextcloud.android.lib.resources.profile.Action import com.nextcloud.android.lib.resources.profile.HoverCard import com.nextcloud.client.account.User import com.owncloud.android.R -import com.owncloud.android.databinding.ProfileBottomSheetActionBinding import com.owncloud.android.databinding.ProfileBottomSheetFragmentBinding import com.owncloud.android.utils.DisplayUtils import com.owncloud.android.utils.theme.ViewThemeUtils +private const val TEXT_SIZE = 16f + /** * Show actions of an user */ @@ -67,39 +75,34 @@ class ProfileBottomSheetDialog( binding.displayName.text = hoverCard.displayName - for (action in hoverCard.actions) { - val actionBinding = ProfileBottomSheetActionBinding.inflate( - layoutInflater - ) - val creatorView: View = actionBinding.root + val itemHeight = context.resources.getDimensionPixelSize(R.dimen.bottom_sheet_item_height) + val standardPadding = context.resources.getDimensionPixelSize(R.dimen.standard_padding) + val iconSize = context.resources.getDimensionPixelSize(R.dimen.iconized_single_line_item_icon_size) + val primaryColor = viewThemeUtils.getColorScheme(context).primary.toArgb() + val textColor = ContextCompat.getColor(context, R.color.text_color) + for (action in hoverCard.actions) { if (action.appId == "email") { action.hyperlink = action.title action.title = context.resources.getString(R.string.write_email) } - actionBinding.name.text = action.title - - val icon = when (action.appId) { + val iconRes = when (action.appId) { "profile" -> R.drawable.ic_user_outline "email" -> R.drawable.ic_email "spreed" -> R.drawable.ic_talk else -> R.drawable.ic_edit } - actionBinding.icon.setImageDrawable( - ResourcesCompat.getDrawable( - context.resources, - icon, - null - ) - ) - viewThemeUtils.platform.tintPrimaryDrawable(context, actionBinding.icon.drawable) - creatorView.setOnClickListener { v: View? -> - send(hoverCard.userId, action) - dismiss() - } - binding.creators.addView(creatorView) + val config = ProfileButtonConfig( + itemHeight = itemHeight, + standardPadding = standardPadding, + textColor = textColor, + iconRes = iconRes, + iconSize = iconSize, + primaryColor = primaryColor + ) + binding.creators.addView(createProfileButton(config, action)) } setOnShowListener { d: DialogInterface? -> @@ -108,6 +111,32 @@ class ProfileBottomSheetDialog( } } + private fun createProfileButton(config: ProfileButtonConfig, action: Action): MaterialButton = MaterialButton( + ContextThemeWrapper(context, R.style.ThemeOverlay_App_Button_BottomSheetItem), + null, + com.google.android.material.R.attr.materialButtonStyle + ).apply { + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + config.itemHeight + ) + gravity = Gravity.START or Gravity.CENTER_VERTICAL + setPaddingRelative(config.standardPadding, 0, config.standardPadding, 0) + text = action.title + setTextColor(config.textColor) + textSize = TEXT_SIZE + isAllCaps = false + icon = ResourcesCompat.getDrawable(context.resources, config.iconRes, null) + this.iconSize = config.iconSize + this.iconPadding = config.standardPadding + iconGravity = MaterialButton.ICON_GRAVITY_START + iconTint = ColorStateList.valueOf(config.primaryColor) + setOnClickListener { + send(hoverCard.userId, action) + dismiss() + } + } + private fun send(userId: String, action: Action) { when (action.appId) { "profile" -> openWebsite(action.hyperlink) @@ -162,4 +191,13 @@ class ProfileBottomSheetDialog( } return false } + + private data class ProfileButtonConfig( + val itemHeight: Int, + val standardPadding: Int, + val textColor: Int, + val iconRes: Int, + val iconSize: Int, + val primaryColor: Int + ) } diff --git a/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml b/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml index f0f1543e0fc8..183c28741d70 100644 --- a/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml +++ b/app/src/main/res/layout/file_details_sharing_menu_bottom_sheet_fragment.xml @@ -13,138 +13,85 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingTop="@dimen/dialog_padding" + android:paddingTop="@dimen/standard_padding" android:background="@color/bg_default"> - + + - - - - - - - - + + - - - - - - - - + + - - - - - - - - + + - - - - - - + android:contentDescription="@string/delete_link" + android:gravity="start|center_vertical" + android:paddingStart="@dimen/standard_padding" + android:paddingEnd="@dimen/standard_padding" + android:text="@string/delete_link" + android:textColor="@color/text_color" + android:textSize="@dimen/bottom_sheet_text_size" + app:icon="@drawable/ic_delete" + app:iconGravity="start" + app:iconPadding="@dimen/standard_padding" + app:iconSize="@dimen/iconized_single_line_item_icon_size" + app:iconTint="@color/primary" /> diff --git a/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml b/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml deleted file mode 100644 index ccb1fa4d2d7e..000000000000 --- a/app/src/main/res/layout/file_list_actions_bottom_sheet_creator.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml b/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml index 5fb7cfc03894..2ef322443115 100644 --- a/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml +++ b/app/src/main/res/layout/file_list_actions_bottom_sheet_fragment.xml @@ -1,5 +1,4 @@ - - - - - - - - diff --git a/app/src/main/res/layout/profile_bottom_sheet_fragment.xml b/app/src/main/res/layout/profile_bottom_sheet_fragment.xml index 06c8927b8621..c674cf8713d9 100644 --- a/app/src/main/res/layout/profile_bottom_sheet_fragment.xml +++ b/app/src/main/res/layout/profile_bottom_sheet_fragment.xml @@ -8,39 +8,42 @@ + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingTop="@dimen/standard_padding"> + + + tools:text="@string/placeholder_first_name_last_name" /> + + 64dp 40dp 56dp - 80dp + 56dp 40dp 100dp 128dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3912bf80aca3..743ec03fa0fe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -546,7 +546,6 @@ ƒ/1.8 • 1/374 s • 28 mm • ISO 200 Mitte, Berlin, Germany © OpenStreetMap contributors - Compose email passphrase Show 3 hidden folders Template @@ -1178,7 +1177,6 @@ Edit Failed to start editor Add folder description - Adds folder description We couldnt locate the file on server. Another user may have deleted the file File not found. Are you sure that this file exists or has a previous conflict not been resolved? File upload conflict diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 17cdbaabca4a..d3531bc920cc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -426,6 +426,18 @@ 0dp + + + +