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

Material3 polishing #4673

Open
wants to merge 10 commits into
base: develop
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.keylesspalace.tusky

import android.app.Dialog
import android.content.SharedPreferences
import android.os.Bundle
import android.view.LayoutInflater
Expand All @@ -29,6 +30,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.ListAdapter
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.keylesspalace.tusky.databinding.FragmentAccountsInListBinding
import com.keylesspalace.tusky.databinding.ItemFollowRequestBinding
import com.keylesspalace.tusky.entity.TimelineAccount
Expand All @@ -39,7 +41,6 @@ import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.loadAvatar
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.unsafeLazy
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.util.visible
import com.keylesspalace.tusky.viewmodel.AccountsInListViewModel
import com.keylesspalace.tusky.viewmodel.State
Expand All @@ -50,13 +51,13 @@ import kotlinx.coroutines.launch
private typealias AccountInfo = Pair<TimelineAccount, Boolean>

@AndroidEntryPoint
class AccountsInListFragment : DialogFragment(R.layout.fragment_accounts_in_list) {
class AccountsInListFragment : DialogFragment() {

@Inject
lateinit var preferences: SharedPreferences

private val viewModel: AccountsInListViewModel by viewModels()
private val binding by viewBinding(FragmentAccountsInListBinding::bind)
private lateinit var binding: FragmentAccountsInListBinding

private lateinit var listId: String
private lateinit var listName: String
Expand All @@ -65,14 +66,19 @@ class AccountsInListFragment : DialogFragment(R.layout.fragment_accounts_in_list

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.TuskyDialogFragmentStyle)
val args = requireArguments()
listId = args.getString(LIST_ID_ARG)!!
listName = args.getString(LIST_NAME_ARG)!!

viewModel.load(listId)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return MaterialAlertDialogBuilder(requireContext())
.setView(createView())
.create()
}

override fun onStart() {
super.onStart()
dialog?.apply {
Expand All @@ -84,17 +90,18 @@ class AccountsInListFragment : DialogFragment(R.layout.fragment_accounts_in_list
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
private fun createView(): View {
binding = FragmentAccountsInListBinding.inflate(layoutInflater)
val adapter = Adapter()
val searchAdapter = SearchAdapter()

binding.accountsRecycler.layoutManager = LinearLayoutManager(view.context)
binding.accountsRecycler.layoutManager = LinearLayoutManager(binding.root.context)
binding.accountsRecycler.adapter = adapter

binding.accountsSearchRecycler.layoutManager = LinearLayoutManager(view.context)
binding.accountsSearchRecycler.layoutManager = LinearLayoutManager(binding.root.context)
binding.accountsSearchRecycler.adapter = searchAdapter

viewLifecycleOwner.lifecycleScope.launch {
lifecycleScope.launch {
viewModel.state.collect { state ->
adapter.submitList(state.accounts.getOrDefault(emptyList()))

Expand Down Expand Up @@ -122,6 +129,7 @@ class AccountsInListFragment : DialogFragment(R.layout.fragment_accounts_in_list
return true
}
})
return binding.root
}

private fun setupSearchView(searchAdapter: SearchAdapter, state: State) {
Expand Down
17 changes: 4 additions & 13 deletions app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,15 @@ import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import android.widget.FrameLayout
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.AppCompatEditText
import androidx.core.view.updatePadding
import androidx.core.widget.doOnTextChanged
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import at.connyduck.sparkbutton.helpers.Utils
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform
Expand All @@ -41,6 +37,7 @@ import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.MainTabsChangedEvent
import com.keylesspalace.tusky.components.account.list.ListSelectionFragment
import com.keylesspalace.tusky.databinding.ActivityTabPreferenceBinding
import com.keylesspalace.tusky.databinding.DialogAddHashtagBinding
import com.keylesspalace.tusky.entity.MastoList
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.unsafeLazy
Expand Down Expand Up @@ -231,18 +228,12 @@ class TabPreferenceActivity : BaseActivity(), ItemInteractionListener, ListSelec
}

private fun showAddHashtagDialog(tab: TabData? = null, tabPosition: Int = 0) {
val frameLayout = FrameLayout(this)
val padding = Utils.dpToPx(this, 8)
frameLayout.updatePadding(left = padding, right = padding)

val editText = AppCompatEditText(this)
editText.setHint(R.string.edit_hashtag_hint)
editText.setText("")
frameLayout.addView(editText)
val dialogBinding = DialogAddHashtagBinding.inflate(layoutInflater)
val editText = dialogBinding.addHashtagEditText

val dialog = MaterialAlertDialogBuilder(this)
.setTitle(R.string.add_hashtag_title)
.setView(frameLayout)
.setView(dialogBinding.root)
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.action_save) { _, _ ->
val input = editText.text.toString().trim()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ class ListSelectionFragment : DialogFragment() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.TuskyDialogFragmentStyle)
accountId = requireArguments().getString(ARG_ACCOUNT_ID)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@

package com.keylesspalace.tusky.components.compose.dialog

import android.app.Dialog
import android.content.Context
import android.graphics.drawable.Animatable
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Bundle
import android.text.InputFilter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.LinearLayout
import androidx.core.os.bundleOf
Expand All @@ -32,34 +31,35 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.DialogImageDescriptionBinding
import com.keylesspalace.tusky.util.getParcelableCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.viewBinding

// https://github.com/tootsuite/mastodon/blob/c6904c0d3766a2ea8a81ab025c127169ecb51373/app/models/media_attachment.rb#L32
private const val MEDIA_DESCRIPTION_CHARACTER_LIMIT = 1500

class CaptionDialog : DialogFragment() {
private lateinit var listener: Listener

private val binding by viewBinding(DialogImageDescriptionBinding::bind)
private lateinit var binding: DialogImageDescriptionBinding

private var animatable: Animatable? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.TuskyDialogFragmentStyle)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val localId = arguments?.getInt(LOCAL_ID_ARG) ?: error("Missing localId")
return MaterialAlertDialogBuilder(requireContext())
.setView(createView(savedInstanceState))
.setPositiveButton(android.R.string.ok) { _, _ ->
listener.onUpdateDescription(localId, binding.imageDescriptionText.text.toString())
}
.setNegativeButton(android.R.string.cancel, null)
.create()
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View = inflater.inflate(R.layout.dialog_image_description, container, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
private fun createView(savedInstanceState: Bundle?): View {
binding = DialogImageDescriptionBinding.inflate(layoutInflater)
val imageView = binding.imageDescriptionView
imageView.maxZoom = 6f
val imageDescriptionText = binding.imageDescriptionText
Expand All @@ -79,15 +79,6 @@ class CaptionDialog : DialogFragment() {
binding.imageDescriptionText.setText(it)
}

binding.cancelButton.setOnClickListener {
dismiss()
}
val localId = arguments?.getInt(LOCAL_ID_ARG) ?: error("Missing localId")
binding.okButton.setOnClickListener {
listener.onUpdateDescription(localId, binding.imageDescriptionText.text.toString())
dismiss()
}

isCancelable = true
dialog?.setCanceledOnTouchOutside(false) // Dialog is full screen anyway. But without this, taps in navbar while keyboard is up can dismiss the dialog.

Expand All @@ -109,15 +100,15 @@ class CaptionDialog : DialogFragment() {
if (resource is Animatable) {
resource.callback = object : Drawable.Callback {
override fun invalidateDrawable(who: Drawable) {
view.invalidate()
imageView.invalidate()
}

override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {
view.postDelayed(what, `when`)
imageView.postDelayed(what, `when`)
}

override fun unscheduleDrawable(who: Drawable, what: Runnable) {
view.removeCallbacks(what)
imageView.removeCallbacks(what)
}
}
resource.start()
Expand All @@ -131,6 +122,7 @@ class CaptionDialog : DialogFragment() {
imageView.hide()
}
})
return binding.root
}

override fun onStart() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package com.keylesspalace.tusky.components.followedtags

import android.app.Dialog
import android.content.DialogInterface
import android.content.SharedPreferences
import android.os.Bundle
import android.util.Log
import android.view.WindowManager
import android.widget.AutoCompleteTextView
import androidx.activity.viewModels
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import androidx.paging.LoadState
import androidx.recyclerview.widget.DividerItemDecoration
Expand All @@ -22,6 +18,7 @@ import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.StatusListActivity
import com.keylesspalace.tusky.components.compose.ComposeAutoCompleteAdapter
import com.keylesspalace.tusky.databinding.ActivityFollowedTagsBinding
import com.keylesspalace.tusky.databinding.DialogFollowHashtagBinding
import com.keylesspalace.tusky.interfaces.HashtagActionListener
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.copyToClipboard
Expand Down Expand Up @@ -61,8 +58,7 @@ class FollowedTagsActivity :
}

binding.fab.setOnClickListener {
val dialog: DialogFragment = FollowTagDialog.newInstance()
dialog.show(supportFragmentManager, "dialog")
showDialog()
}

setupAdapter().let { adapter ->
Expand Down Expand Up @@ -179,44 +175,34 @@ class FollowedTagsActivity :
)
}

companion object {
const val TAG = "FollowedTagsActivity"
}

class FollowTagDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val layout = layoutInflater.inflate(R.layout.dialog_follow_hashtag, null)
val autoCompleteTextView = layout.findViewById<AutoCompleteTextView>(R.id.hashtag)!!
autoCompleteTextView.setAdapter(
ComposeAutoCompleteAdapter(
requireActivity() as FollowedTagsActivity,
animateAvatar = false,
animateEmojis = false,
showBotBadge = false
)
private fun showDialog() {
val dialogBinding = DialogFollowHashtagBinding.inflate(layoutInflater)
dialogBinding.hashtagAutoCompleteTextView.setAdapter(
ComposeAutoCompleteAdapter(
this,
animateAvatar = false,
animateEmojis = false,
showBotBadge = false
)
autoCompleteTextView.requestFocus()
autoCompleteTextView.setSelection(autoCompleteTextView.length())

return MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.dialog_follow_hashtag_title)
.setView(layout)
.setPositiveButton(android.R.string.ok) { _, _ ->
(requireActivity() as FollowedTagsActivity).follow(
autoCompleteTextView.text.toString().removePrefix("#")
)
}
.setNegativeButton(android.R.string.cancel) { _: DialogInterface, _: Int -> }
.create()
}

override fun onStart() {
super.onStart()
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}
)
dialogBinding.hashtagAutoCompleteTextView.requestFocus()
dialogBinding.hashtagAutoCompleteTextView.setSelection(dialogBinding.hashtagAutoCompleteTextView.length())

val dialog = MaterialAlertDialogBuilder(this)
.setTitle(R.string.dialog_follow_hashtag_title)
.setView(dialogBinding.root)
.setPositiveButton(android.R.string.ok) { _, _ ->
follow(
dialogBinding.hashtagAutoCompleteTextView.text.toString().removePrefix("#")
)
}
.setNegativeButton(android.R.string.cancel, null)
.create()
dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
dialog.show()
}

companion object {
fun newInstance(): FollowTagDialog = FollowTagDialog()
}
companion object {
const val TAG = "FollowedTagsActivity"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ class NotificationsFragment :
}

val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_multiple_choice, notificationTypeList)
val window = PopupWindow(requireContext())
val window = PopupWindow(requireContext(), null, com.google.android.material.R.attr.listPopupWindowStyle)
val menuBinding = NotificationsFilterBinding.inflate(LayoutInflater.from(requireContext()), binding.root as ViewGroup, false)

menuBinding.buttonApply.setOnClickListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import com.keylesspalace.tusky.databinding.ViewBackgroundMessageBinding
import com.keylesspalace.tusky.util.addDrawables
import com.keylesspalace.tusky.util.getDrawableRes
import com.keylesspalace.tusky.util.getErrorString
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.visible

/**
Expand Down Expand Up @@ -61,7 +63,7 @@ class BackgroundMessageView @JvmOverloads constructor(
binding.imageView.setImageResource(imageRes)
binding.button.setOnClickListener(clickListener)
binding.button.visible(clickListener != null)
binding.helpText.visible(false)
binding.helpTextCard.hide()
}

fun showHelp(@StringRes helpRes: Int) {
Expand All @@ -72,6 +74,6 @@ class BackgroundMessageView @JvmOverloads constructor(

binding.helpText.setText(textWithDrawables, TextView.BufferType.SPANNABLE)

binding.helpText.visible(true)
binding.helpTextCard.show()
}
}
Loading
Loading