Make upload confirmation dialog a material one

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
Andy Scherzinger 2022-08-09 18:21:56 +02:00
parent ff2f58419e
commit e57eb4442f
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
4 changed files with 60 additions and 11 deletions

View File

@ -35,11 +35,9 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.content.res.AssetFileDescriptor import android.content.res.AssetFileDescriptor
import android.content.res.ColorStateList
import android.content.res.Resources import android.content.res.Resources
import android.database.Cursor import android.database.Cursor
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.media.MediaPlayer import android.media.MediaPlayer
import android.media.MediaRecorder import android.media.MediaRecorder
@ -74,6 +72,7 @@ import android.widget.ImageView
import android.widget.PopupMenu import android.widget.PopupMenu
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider 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.datasource.BaseBitmapDataSubscriber
import com.facebook.imagepipeline.image.CloseableImage import com.facebook.imagepipeline.image.CloseableImage
import com.google.android.flexbox.FlexboxLayout import com.google.android.flexbox.FlexboxLayout
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.CallActivity 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.messages.MessagesListAdapter
import com.stfalcon.chatkit.utils.DateFormatter import com.stfalcon.chatkit.utils.DateFormatter
import com.vanniktech.emoji.EmojiPopup import com.vanniktech.emoji.EmojiPopup
import com.yarolegovich.lovelydialog.LovelyStandardDialog
import io.reactivex.Observer import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
@ -1410,28 +1409,37 @@ class ChatController(args: Bundle) :
val confirmationQuestion = when (filesToUpload.size) { val confirmationQuestion = when (filesToUpload.size) {
1 -> context?.resources?.getString(R.string.nc_upload_confirm_send_single)?.let { 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 { else -> context?.resources?.getString(R.string.nc_upload_confirm_send_multiple)?.let {
String.format(it, title) String.format(it, title.trim())
} }
} }
LovelyStandardDialog(activity) val materialAlertDialogBuilder = MaterialAlertDialogBuilder(binding.messageInputView.context)
.setPositiveButtonColorRes(R.color.nc_darkGreen)
.setTitle(confirmationQuestion) .setTitle(confirmationQuestion)
.setMessage(filenamesWithLinebreaks.toString()) .setMessage(filenamesWithLinebreaks.toString())
.setPositiveButton(R.string.nc_yes) { v -> .setPositiveButton(R.string.nc_yes) { _, _ ->
if (UploadAndShareFilesWorker.isStoragePermissionGranted(context!!)) { if (UploadAndShareFilesWorker.isStoragePermissionGranted(context)) {
uploadFiles(filesToUpload, false) uploadFiles(filesToUpload, false)
} else { } else {
UploadAndShareFilesWorker.requestStoragePermission(this) UploadAndShareFilesWorker.requestStoragePermission(this)
} }
} }
.setNegativeButton(R.string.nc_no) { .setNegativeButton(R.string.nc_no) { _, _ ->
// unused atm // 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) { } catch (e: IllegalStateException) {
Toast.makeText(context, context?.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG) Toast.makeText(context, context?.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG)
.show() .show()

View File

@ -33,6 +33,7 @@ import android.os.Build
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.EditText import android.widget.EditText
import android.widget.ImageButton 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.card.MaterialCardView
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipDrawable 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.floatingactionbutton.FloatingActionButton
import com.google.android.material.progressindicator.LinearProgressIndicator 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.tabs.TabLayout
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import com.google.android.material.textview.MaterialTextView 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) { fun colorMaterialButtonPrimaryFilled(button: MaterialButton) {
withScheme(button) { scheme -> withScheme(button) { scheme ->
button.backgroundTintList = 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 { companion object {
private val THEMEABLE_PLACEHOLDER_IDS = listOf( private val THEMEABLE_PLACEHOLDER_IDS = listOf(
R.drawable.ic_mimetype_package_x_generic, R.drawable.ic_mimetype_package_x_generic,

View File

@ -74,6 +74,8 @@
<dimen name="standard_eighth_margin">2dp</dimen> <dimen name="standard_eighth_margin">2dp</dimen>
<dimen name="scope_padding">12dp</dimen> <dimen name="scope_padding">12dp</dimen>
<dimen name="dialogBorderRadius">28dp</dimen>
<dimen name="default_checkbox_dialog_start_margin">18dp</dimen> <dimen name="default_checkbox_dialog_start_margin">18dp</dimen>
<dimen name="mediatab_file_icon_size">50dp</dimen> <dimen name="mediatab_file_icon_size">50dp</dimen>

View File

@ -42,6 +42,7 @@
<item name="seekBarStyle">@style/Nextcloud.Material.Incoming.SeekBar</item> <item name="seekBarStyle">@style/Nextcloud.Material.Incoming.SeekBar</item>
<item name="bottomSheetDialogTheme">@style/ThemeOverlay.App.BottomSheetDialog</item> <item name="bottomSheetDialogTheme">@style/ThemeOverlay.App.BottomSheetDialog</item>
<item name="popupMenuStyle">@style/ChatSendButtonMenu</item> <item name="popupMenuStyle">@style/ChatSendButtonMenu</item>
<item name="dialogCornerRadius">@dimen/dialogBorderRadius</item>
</style> </style>
<style name="ThemeOverlay.AppTheme.PopupMenu" parent="ThemeOverlay.Material3.Dark"> <style name="ThemeOverlay.AppTheme.PopupMenu" parent="ThemeOverlay.Material3.Dark">