Add requireListener and hierarchical error.
This commit is contained in:
parent
34f3ae38cc
commit
b56207d977
16 changed files with 86 additions and 48 deletions
|
@ -34,12 +34,12 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.models.Ne
|
||||||
import org.thoughtcrime.securesms.components.settings.configure
|
import org.thoughtcrime.securesms.components.settings.configure
|
||||||
import org.thoughtcrime.securesms.components.settings.models.Progress
|
import org.thoughtcrime.securesms.components.settings.models.Progress
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.util.BottomSheetUtil.requireCoordinatorLayout
|
import org.thoughtcrime.securesms.util.BottomSheetUtil.requireCoordinatorLayout
|
||||||
import org.thoughtcrime.securesms.util.CommunicationActions
|
import org.thoughtcrime.securesms.util.CommunicationActions
|
||||||
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
||||||
import org.thoughtcrime.securesms.util.Projection
|
import org.thoughtcrime.securesms.util.Projection
|
||||||
import org.thoughtcrime.securesms.util.SpanUtil
|
import org.thoughtcrime.securesms.util.SpanUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,7 +80,7 @@ class BoostFragment : DSLSettingsBottomSheetFragment(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
||||||
donationPaymentComponent = findListener()!!
|
donationPaymentComponent = requireListener()
|
||||||
viewModel.refresh()
|
viewModel.refresh()
|
||||||
|
|
||||||
CurrencySelection.register(adapter)
|
CurrencySelection.register(adapter)
|
||||||
|
|
|
@ -7,7 +7,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFrag
|
||||||
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
|
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
|
||||||
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentComponent
|
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentComponent
|
||||||
import org.thoughtcrime.securesms.components.settings.configure
|
import org.thoughtcrime.securesms.components.settings.configure
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,7 +25,7 @@ class SetCurrencyFragment : DSLSettingsBottomSheetFragment() {
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
||||||
donationPaymentComponent = findListener()!!
|
donationPaymentComponent = requireListener()
|
||||||
|
|
||||||
viewModel.state.observe(viewLifecycleOwner) { state ->
|
viewModel.state.observe(viewLifecycleOwner) { state ->
|
||||||
adapter.submitList(getConfiguration(state).toMappingModelList())
|
adapter.submitList(getConfiguration(state).toMappingModelList())
|
||||||
|
|
|
@ -33,11 +33,11 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.models.Ne
|
||||||
import org.thoughtcrime.securesms.components.settings.configure
|
import org.thoughtcrime.securesms.components.settings.configure
|
||||||
import org.thoughtcrime.securesms.components.settings.models.Progress
|
import org.thoughtcrime.securesms.components.settings.models.Progress
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
|
import org.thoughtcrime.securesms.payments.FiatMoneyUtil
|
||||||
import org.thoughtcrime.securesms.subscription.Subscription
|
import org.thoughtcrime.securesms.subscription.Subscription
|
||||||
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
||||||
import org.thoughtcrime.securesms.util.SpanUtil
|
import org.thoughtcrime.securesms.util.SpanUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
import org.thoughtcrime.securesms.util.navigation.safeNavigate
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
import java.util.Currency
|
import java.util.Currency
|
||||||
|
@ -79,7 +79,7 @@ class SubscribeFragment : DSLSettingsFragment(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
override fun bindAdapter(adapter: DSLSettingsAdapter) {
|
||||||
donationPaymentComponent = findListener()!!
|
donationPaymentComponent = requireListener()
|
||||||
viewModel.refresh()
|
viewModel.refresh()
|
||||||
|
|
||||||
BadgePreview.register(adapter)
|
BadgePreview.register(adapter)
|
||||||
|
|
|
@ -31,7 +31,6 @@ import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialog
|
||||||
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader
|
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader
|
||||||
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
|
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
|
||||||
import org.thoughtcrime.securesms.database.model.IdentityRecord
|
import org.thoughtcrime.securesms.database.model.IdentityRecord
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
||||||
|
@ -41,6 +40,7 @@ import org.thoughtcrime.securesms.util.FeatureFlags
|
||||||
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
||||||
import org.thoughtcrime.securesms.util.Util
|
import org.thoughtcrime.securesms.util.Util
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.findListener
|
||||||
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
|
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
|
||||||
import org.thoughtcrime.securesms.util.visible
|
import org.thoughtcrime.securesms.util.visible
|
||||||
import org.whispersystems.libsignal.util.guava.Optional
|
import org.whispersystems.libsignal.util.guava.Optional
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.components.emoji.MediaKeyboard
|
||||||
import org.thoughtcrime.securesms.keyboard.emoji.EmojiKeyboardPageFragment
|
import org.thoughtcrime.securesms.keyboard.emoji.EmojiKeyboardPageFragment
|
||||||
import org.thoughtcrime.securesms.keyboard.gif.GifKeyboardPageFragment
|
import org.thoughtcrime.securesms.keyboard.gif.GifKeyboardPageFragment
|
||||||
import org.thoughtcrime.securesms.keyboard.sticker.StickerKeyboardPageFragment
|
import org.thoughtcrime.securesms.keyboard.sticker.StickerKeyboardPageFragment
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.findListener
|
||||||
import org.thoughtcrime.securesms.util.visible
|
import org.thoughtcrime.securesms.util.visible
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
package org.thoughtcrime.securesms.keyboard
|
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an input type [T], find an instance of it first looking through all
|
|
||||||
* parents, and then the activity.
|
|
||||||
*
|
|
||||||
* @return First instance found of type [T] or null
|
|
||||||
*/
|
|
||||||
inline fun <reified T> Fragment.findListener(): T? {
|
|
||||||
var parent: Fragment? = parentFragment
|
|
||||||
while (parent != null) {
|
|
||||||
if (parent is T) {
|
|
||||||
return parent
|
|
||||||
}
|
|
||||||
parent = parent.parentFragment
|
|
||||||
}
|
|
||||||
|
|
||||||
return requireActivity() as? T
|
|
||||||
}
|
|
|
@ -14,9 +14,9 @@ import org.thoughtcrime.securesms.components.emoji.EmojiEventListener
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageView
|
import org.thoughtcrime.securesms.components.emoji.EmojiPageView
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter
|
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.EmojiHeader
|
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter.EmojiHeader
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
|
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
|
|
||||||
private val DELETE_KEY_EVENT: KeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)
|
private val DELETE_KEY_EVENT: KeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)
|
||||||
|
@ -37,7 +37,7 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr
|
||||||
private val categoryUpdateOnScroll = UpdateCategorySelectionOnScroll()
|
private val categoryUpdateOnScroll = UpdateCategorySelectionOnScroll()
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
callback = requireNotNull(findListener())
|
callback = requireNotNull(requireListener())
|
||||||
|
|
||||||
emojiPageView = view.findViewById(R.id.emoji_page_view)
|
emojiPageView = view.findViewById(R.id.emoji_page_view)
|
||||||
emojiPageView.initialize(this, this, true)
|
emojiPageView.initialize(this, this, true)
|
||||||
|
@ -85,7 +85,7 @@ class EmojiKeyboardPageFragment : Fragment(R.layout.keyboard_pager_emoji_page_fr
|
||||||
|
|
||||||
viewModel.selectedKey.observe(viewLifecycleOwner) { updateCategoryTab(it) }
|
viewModel.selectedKey.observe(viewLifecycleOwner) { updateCategoryTab(it) }
|
||||||
|
|
||||||
eventListener = findListener() ?: throw AssertionError("No emoji listener found")
|
eventListener = requireListener()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateCategoryTab(key: String) {
|
private fun updateCategoryTab(key: String) {
|
||||||
|
|
|
@ -15,8 +15,8 @@ import org.thoughtcrime.securesms.components.emoji.EmojiEventListener
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageView
|
import org.thoughtcrime.securesms.components.emoji.EmojiPageView
|
||||||
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter
|
import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter
|
||||||
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
|
|
||||||
class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageViewGridAdapter.VariationSelectorListener {
|
class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageViewGridAdapter.VariationSelectorListener {
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageV
|
||||||
override fun onAttach(context: Context) {
|
override fun onAttach(context: Context) {
|
||||||
super.onAttach(context)
|
super.onAttach(context)
|
||||||
|
|
||||||
callback = findListener<Callback>()!!
|
callback = requireListener()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
@ -36,7 +36,7 @@ class EmojiSearchFragment : Fragment(R.layout.emoji_search_fragment), EmojiPageV
|
||||||
viewModel = ViewModelProvider(this, factory)[EmojiSearchViewModel::class.java]
|
viewModel = ViewModelProvider(this, factory)[EmojiSearchViewModel::class.java]
|
||||||
|
|
||||||
val keyboardAwareLinearLayout: KeyboardAwareLinearLayout = view.findViewById(R.id.kb_aware_layout)
|
val keyboardAwareLinearLayout: KeyboardAwareLinearLayout = view.findViewById(R.id.kb_aware_layout)
|
||||||
val eventListener: EmojiEventListener = requireNotNull(findListener())
|
val eventListener: EmojiEventListener = requireListener()
|
||||||
val searchBar: KeyboardPageSearchView = view.findViewById(R.id.emoji_search_view)
|
val searchBar: KeyboardPageSearchView = view.findViewById(R.id.emoji_search_view)
|
||||||
val resultsContainer: FrameLayout = view.findViewById(R.id.emoji_search_results_container)
|
val resultsContainer: FrameLayout = view.findViewById(R.id.emoji_search_results_container)
|
||||||
val noResults: TextView = view.findViewById(R.id.emoji_search_empty)
|
val noResults: TextView = view.findViewById(R.id.emoji_search_empty)
|
||||||
|
|
|
@ -13,7 +13,7 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Fragment
|
||||||
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4SaveResult
|
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4SaveResult
|
||||||
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ViewModel
|
import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ViewModel
|
||||||
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
|
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog
|
||||||
|
|
||||||
class GifKeyboardPageFragment : LoggingFragment(R.layout.gif_keyboard_page_fragment) {
|
class GifKeyboardPageFragment : LoggingFragment(R.layout.gif_keyboard_page_fragment) {
|
||||||
|
@ -28,7 +28,7 @@ class GifKeyboardPageFragment : LoggingFragment(R.layout.gif_keyboard_page_fragm
|
||||||
private lateinit var quickSearchList: RecyclerView
|
private lateinit var quickSearchList: RecyclerView
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
host = findListener<Host>() ?: throw AssertionError("Parent fragment or activity must implement Host")
|
host = requireListener()
|
||||||
|
|
||||||
childFragmentManager.beginTransaction()
|
childFragmentManager.beginTransaction()
|
||||||
.replace(R.id.gif_keyboard_giphy_frame, GiphyMp4Fragment.create(host.isMms()))
|
.replace(R.id.gif_keyboard_giphy_frame, GiphyMp4Fragment.create(host.isMms()))
|
||||||
|
|
|
@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.database.DatabaseObserver
|
import org.thoughtcrime.securesms.database.DatabaseObserver
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.mms.GlideApp
|
import org.thoughtcrime.securesms.mms.GlideApp
|
||||||
import org.thoughtcrime.securesms.stickers.StickerEventListener
|
import org.thoughtcrime.securesms.stickers.StickerEventListener
|
||||||
import org.thoughtcrime.securesms.stickers.StickerRolloverTouchListener
|
import org.thoughtcrime.securesms.stickers.StickerRolloverTouchListener
|
||||||
|
@ -25,6 +24,8 @@ import org.thoughtcrime.securesms.util.InsetItemDecoration
|
||||||
import org.thoughtcrime.securesms.util.Throttler
|
import org.thoughtcrime.securesms.util.Throttler
|
||||||
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
|
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
|
||||||
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList
|
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.findListener
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import org.whispersystems.libsignal.util.Pair
|
import org.whispersystems.libsignal.util.Pair
|
||||||
import java.util.Optional
|
import java.util.Optional
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
@ -87,12 +88,12 @@ class StickerKeyboardPageFragment :
|
||||||
|
|
||||||
view.findViewById<KeyboardPageSearchView>(R.id.sticker_keyboard_search_text).callbacks = object : KeyboardPageSearchView.Callbacks {
|
view.findViewById<KeyboardPageSearchView>(R.id.sticker_keyboard_search_text).callbacks = object : KeyboardPageSearchView.Callbacks {
|
||||||
override fun onClicked() {
|
override fun onClicked() {
|
||||||
findListener<Callback>()!!.openStickerSearch()
|
requireListener<Callback>().openStickerSearch()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
view.findViewById<View>(R.id.sticker_search).setOnClickListener {
|
view.findViewById<View>(R.id.sticker_search).setOnClickListener {
|
||||||
findListener<Callback>()!!.openStickerSearch()
|
requireListener<Callback>().openStickerSearch()
|
||||||
}
|
}
|
||||||
|
|
||||||
view.findViewById<View>(R.id.sticker_manage).setOnClickListener { findListener<StickerEventListener>()?.onStickerManagementClicked() }
|
view.findViewById<View>(R.id.sticker_manage).setOnClickListener { findListener<StickerEventListener>()?.onStickerManagementClicked() }
|
||||||
|
|
|
@ -12,12 +12,12 @@ import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.mms.GlideApp
|
import org.thoughtcrime.securesms.mms.GlideApp
|
||||||
import org.thoughtcrime.securesms.stickers.StickerEventListener
|
import org.thoughtcrime.securesms.stickers.StickerEventListener
|
||||||
import org.thoughtcrime.securesms.util.DeviceProperties
|
import org.thoughtcrime.securesms.util.DeviceProperties
|
||||||
import org.thoughtcrime.securesms.util.InsetItemDecoration
|
import org.thoughtcrime.securesms.util.InsetItemDecoration
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.findListener
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,13 +13,13 @@ import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.recyclerview.GridDividerDecoration
|
import org.thoughtcrime.securesms.components.recyclerview.GridDividerDecoration
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.mediasend.Media
|
import org.thoughtcrime.securesms.mediasend.Media
|
||||||
import org.thoughtcrime.securesms.mediasend.MediaRepository
|
import org.thoughtcrime.securesms.mediasend.MediaRepository
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.MediaCountIndicatorButton
|
import org.thoughtcrime.securesms.mediasend.v2.MediaCountIndicatorButton
|
||||||
import org.thoughtcrime.securesms.util.Stopwatch
|
import org.thoughtcrime.securesms.util.Stopwatch
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
|
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil
|
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil
|
||||||
import org.thoughtcrime.securesms.util.visible
|
import org.thoughtcrime.securesms.util.visible
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
callbacks = requireNotNull(findListener())
|
callbacks = requireListener()
|
||||||
|
|
||||||
toolbar = view.findViewById(R.id.media_gallery_toolbar)
|
toolbar = view.findViewById(R.id.media_gallery_toolbar)
|
||||||
galleryRecycler = view.findViewById(R.id.media_gallery_grid)
|
galleryRecycler = view.findViewById(R.id.media_gallery_grid)
|
||||||
|
|
|
@ -25,7 +25,6 @@ import io.reactivex.rxjava3.disposables.CompositeDisposable
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
|
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment
|
||||||
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs
|
import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult
|
import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
|
import org.thoughtcrime.securesms.mediasend.v2.HudCommand
|
||||||
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
|
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
|
||||||
|
@ -39,6 +38,7 @@ import org.thoughtcrime.securesms.permissions.Permissions
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
import org.thoughtcrime.securesms.util.MediaUtil
|
import org.thoughtcrime.securesms.util.MediaUtil
|
||||||
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
|
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
import org.thoughtcrime.securesms.util.views.TouchInterceptingFrameLayout
|
import org.thoughtcrime.securesms.util.views.TouchInterceptingFrameLayout
|
||||||
import org.thoughtcrime.securesms.util.visible
|
import org.thoughtcrime.securesms.util.visible
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) {
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
postponeEnterTransition()
|
postponeEnterTransition()
|
||||||
|
|
||||||
callback = requireNotNull(findListener())
|
callback = requireListener()
|
||||||
|
|
||||||
drawToolButton = view.findViewById(R.id.draw_tool)
|
drawToolButton = view.findViewById(R.id.draw_tool)
|
||||||
cropAndRotateButton = view.findViewById(R.id.crop_and_rotate_tool)
|
cropAndRotateButton = view.findViewById(R.id.crop_and_rotate_tool)
|
||||||
|
|
|
@ -17,10 +17,10 @@ import org.signal.imageeditor.core.model.EditorElement
|
||||||
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer
|
import org.signal.imageeditor.core.renderers.MultiLineTextRenderer
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.KeyboardEntryDialogFragment
|
import org.thoughtcrime.securesms.components.KeyboardEntryDialogFragment
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.getColor
|
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.getColor
|
||||||
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.setUpForColor
|
import org.thoughtcrime.securesms.scribbles.HSVColorSlider.setUpForColor
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
|
|
||||||
class TextEntryDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_image_editor_text_entry_fragment) {
|
class TextEntryDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_image_editor_text_entry_fragment) {
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ class TextEntryDialogFragment : KeyboardEntryDialogFragment(R.layout.v2_media_im
|
||||||
private var colorIndicatorAlphaAnimator: Animator? = null
|
private var colorIndicatorAlphaAnimator: Animator? = null
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
controller = requireNotNull(findListener())
|
controller = requireListener()
|
||||||
|
|
||||||
hiddenTextEntry = HiddenEditText(requireContext())
|
hiddenTextEntry = HiddenEditText(requireContext())
|
||||||
(view as ViewGroup).addView(hiddenTextEntry)
|
(view as ViewGroup).addView(hiddenTextEntry)
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
package org.thoughtcrime.securesms.util.fragments
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import java.lang.Exception
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an input type [T], find an instance of it first looking through all
|
||||||
|
* parents, and then the activity.
|
||||||
|
*
|
||||||
|
* @return First instance found of type [T] or null
|
||||||
|
*/
|
||||||
|
inline fun <reified T> Fragment.findListener(): T? {
|
||||||
|
var parent: Fragment? = parentFragment
|
||||||
|
while (parent != null) {
|
||||||
|
if (parent is T) {
|
||||||
|
return parent
|
||||||
|
}
|
||||||
|
parent = parent.parentFragment
|
||||||
|
}
|
||||||
|
|
||||||
|
return requireActivity() as? T
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an input type [T], find an instance of it first looking through all parents,
|
||||||
|
* and then the activity.
|
||||||
|
*
|
||||||
|
* @return First instance found of type [T]
|
||||||
|
* @throws ListenerNotFoundException with the hierarchy searched.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
inline fun <reified T> Fragment.requireListener(): T {
|
||||||
|
val hierarchy = mutableListOf<String>()
|
||||||
|
try {
|
||||||
|
var parent: Fragment? = parentFragment
|
||||||
|
while (parent != null) {
|
||||||
|
if (parent is T) {
|
||||||
|
return parent
|
||||||
|
}
|
||||||
|
hierarchy.add(parent::class.java.name)
|
||||||
|
parent = parent.parentFragment
|
||||||
|
}
|
||||||
|
|
||||||
|
return requireActivity() as T
|
||||||
|
} catch (e: ClassCastException) {
|
||||||
|
hierarchy.add(requireActivity()::class.java.name)
|
||||||
|
throw ListenerNotFoundException(hierarchy, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ListenerNotFoundException(hierarchy: List<String>, cause: Throwable) : Exception(formatMessage(hierarchy), cause) {
|
||||||
|
companion object {
|
||||||
|
fun formatMessage(hierarchy: List<String>): String {
|
||||||
|
return "Hierarchy Searched: \n${hierarchy.joinToString("\n")}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,10 +12,10 @@ import androidx.fragment.app.Fragment
|
||||||
import org.thoughtcrime.securesms.R
|
import org.thoughtcrime.securesms.R
|
||||||
import org.thoughtcrime.securesms.components.ShapeScrim
|
import org.thoughtcrime.securesms.components.ShapeScrim
|
||||||
import org.thoughtcrime.securesms.components.camera.CameraView
|
import org.thoughtcrime.securesms.components.camera.CameraView
|
||||||
import org.thoughtcrime.securesms.keyboard.findListener
|
|
||||||
import org.thoughtcrime.securesms.qr.ScanListener
|
import org.thoughtcrime.securesms.qr.ScanListener
|
||||||
import org.thoughtcrime.securesms.qr.ScanningThread
|
import org.thoughtcrime.securesms.qr.ScanningThread
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil
|
import org.thoughtcrime.securesms.util.ViewUtil
|
||||||
|
import org.thoughtcrime.securesms.util.fragments.requireListener
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QR Scanner for identity verification
|
* QR Scanner for identity verification
|
||||||
|
@ -29,7 +29,7 @@ class VerifyScanFragment : Fragment() {
|
||||||
|
|
||||||
override fun onAttach(context: Context) {
|
override fun onAttach(context: Context) {
|
||||||
super.onAttach(context)
|
super.onAttach(context)
|
||||||
scanListener = findListener()!!
|
scanListener = requireListener()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, viewGroup: ViewGroup?, bundle: Bundle?): View? {
|
override fun onCreateView(inflater: LayoutInflater, viewGroup: ViewGroup?, bundle: Bundle?): View? {
|
||||||
|
|
Loading…
Add table
Reference in a new issue