From e57eb4442ff7be0634b478ca095f4368f0c4ce56 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 9 Aug 2022 18:21:56 +0200 Subject: [PATCH] Make upload confirmation dialog a material one Signed-off-by: Andy Scherzinger --- .../talk/controllers/ChatController.kt | 30 +++++++++------ .../nextcloud/talk/ui/theme/ViewThemeUtils.kt | 38 +++++++++++++++++++ app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/styles.xml | 1 + 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 22b27ab90..5b737ff1d 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -35,11 +35,9 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.content.res.AssetFileDescriptor -import android.content.res.ColorStateList import android.content.res.Resources import android.database.Cursor import android.graphics.Bitmap -import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.media.MediaPlayer import android.media.MediaRecorder @@ -74,6 +72,7 @@ import android.widget.ImageView import android.widget.PopupMenu import android.widget.RelativeLayout import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ContextThemeWrapper import androidx.core.content.ContextCompat import androidx.core.content.FileProvider @@ -100,6 +99,7 @@ import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber import com.facebook.imagepipeline.image.CloseableImage import com.google.android.flexbox.FlexboxLayout +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.R import com.nextcloud.talk.activities.CallActivity @@ -189,7 +189,6 @@ import com.stfalcon.chatkit.messages.MessageHolders.ContentChecker import com.stfalcon.chatkit.messages.MessagesListAdapter import com.stfalcon.chatkit.utils.DateFormatter import com.vanniktech.emoji.EmojiPopup -import com.yarolegovich.lovelydialog.LovelyStandardDialog import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -1410,28 +1409,37 @@ class ChatController(args: Bundle) : val confirmationQuestion = when (filesToUpload.size) { 1 -> context?.resources?.getString(R.string.nc_upload_confirm_send_single)?.let { - String.format(it, title) + String.format(it, title.trim()) } else -> context?.resources?.getString(R.string.nc_upload_confirm_send_multiple)?.let { - String.format(it, title) + String.format(it, title.trim()) } } - LovelyStandardDialog(activity) - .setPositiveButtonColorRes(R.color.nc_darkGreen) + val materialAlertDialogBuilder = MaterialAlertDialogBuilder(binding.messageInputView.context) .setTitle(confirmationQuestion) .setMessage(filenamesWithLinebreaks.toString()) - .setPositiveButton(R.string.nc_yes) { v -> - if (UploadAndShareFilesWorker.isStoragePermissionGranted(context!!)) { + .setPositiveButton(R.string.nc_yes) { _, _ -> + if (UploadAndShareFilesWorker.isStoragePermissionGranted(context)) { uploadFiles(filesToUpload, false) } else { UploadAndShareFilesWorker.requestStoragePermission(this) } } - .setNegativeButton(R.string.nc_no) { + .setNegativeButton(R.string.nc_no) { _, _ -> // unused atm } - .show() + + viewThemeUtils.colorMaterialAlertDialogBackground( + binding.messageInputView.context, + materialAlertDialogBuilder + ) + + val dialog = materialAlertDialogBuilder.show() + + val primary = viewThemeUtils.getScheme(binding.messageInputView.context).primary + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(primary) + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(primary) } catch (e: IllegalStateException) { Toast.makeText(context, context?.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG) .show() diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index 97e5f07df..cf2be7269 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -33,6 +33,7 @@ import android.os.Build import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.Button import android.widget.CheckBox import android.widget.EditText import android.widget.ImageButton @@ -60,8 +61,10 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.progressindicator.LinearProgressIndicator +import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textview.MaterialTextView @@ -300,6 +303,20 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorButtonText(button: Button) { + withScheme(button) { scheme -> + val disabledColor = ContextCompat.getColor(button.context, R.color.disabled_text) + val colorStateList = ColorStateList( + arrayOf( + intArrayOf(android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_enabled) + ), + intArrayOf(scheme.primary, disabledColor) + ) + button.setTextColor(colorStateList) + } + } + fun colorMaterialButtonPrimaryFilled(button: MaterialButton) { withScheme(button) { scheme -> button.backgroundTintList = @@ -709,6 +726,27 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme, private } } + fun colorMaterialAlertDialogBackground(context: Context, dialogBuilder: MaterialAlertDialogBuilder) { + withScheme(dialogBuilder.context) { scheme -> + val materialShapeDrawable = MaterialShapeDrawable( + context, + null, + com.google.android.material.R.attr.alertDialogStyle, + com.google.android.material.R.style.MaterialAlertDialog_MaterialComponents + ) + materialShapeDrawable.initializeElevationOverlay(context) + materialShapeDrawable.fillColor = ColorStateList.valueOf(scheme.surface) + + // dialogCornerRadius first appeared in Android Pie + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + val radius = context.resources.getDimension(R.dimen.dialogBorderRadius) + materialShapeDrawable.setCornerSize(radius) + } + + dialogBuilder.background = materialShapeDrawable + } + } + companion object { private val THEMEABLE_PLACEHOLDER_IDS = listOf( R.drawable.ic_mimetype_package_x_generic, diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 7e63618e5..5d2115c9e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -74,6 +74,8 @@ 2dp 12dp + 28dp + 18dp 50dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8fc005a26..0823b6b61 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -42,6 +42,7 @@ @style/Nextcloud.Material.Incoming.SeekBar @style/ThemeOverlay.App.BottomSheetDialog @style/ChatSendButtonMenu + @dimen/dialogBorderRadius