diff --git a/app/src/main/java/com/keylesspalace/tusky/AboutActivity.kt b/app/src/main/java/com/keylesspalace/tusky/AboutActivity.kt index fc8b3db2b6..8b833cea1c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AboutActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AboutActivity.kt @@ -9,10 +9,10 @@ import android.text.style.URLSpan import android.text.util.Linkify import android.widget.TextView import androidx.annotation.StringRes +import androidx.core.view.isVisible import com.keylesspalace.tusky.databinding.ActivityAboutBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.util.NoUnderlineURLSpan -import com.keylesspalace.tusky.util.hide class AboutActivity : BottomSheetActivity(), Injectable { @@ -30,10 +30,14 @@ class AboutActivity : BottomSheetActivity(), Injectable { setTitle(R.string.about_title_activity) - binding.versionTextView.text = getString(R.string.about_app_version, getString(R.string.app_name), BuildConfig.VERSION_NAME) + binding.versionTextView.text = getString( + R.string.about_app_version, + getString(R.string.app_name), + BuildConfig.VERSION_NAME + ) if (BuildConfig.CUSTOM_INSTANCE.isBlank()) { - binding.aboutPoweredByTusky.hide() + binding.aboutPoweredByTusky.isVisible = false } binding.aboutLicenseInfoTextView.setClickableTextWithoutUnderlines(R.string.about_tusky_license) diff --git a/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt b/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt index 6be4224a87..56dd40926b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/AccountsInListFragment.kt @@ -22,6 +22,7 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.appcompat.widget.SearchView +import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -38,9 +39,7 @@ import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.Either import com.keylesspalace.tusky.util.emojify -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.viewmodel.AccountsInListViewModel @@ -103,7 +102,7 @@ class AccountsInListFragment : DialogFragment(), Injectable { adapter.submitList(state.accounts.asRightOrNull() ?: listOf()) when (state.accounts) { - is Either.Right -> binding.messageView.hide() + is Either.Right -> binding.messageView.isVisible = false is Either.Left -> handleError(state.accounts.value) } @@ -131,23 +130,23 @@ class AccountsInListFragment : DialogFragment(), Injectable { private fun setupSearchView(state: State) { if (state.searchResult == null) { searchAdapter.submitList(listOf()) - binding.accountsSearchRecycler.hide() - binding.accountsRecycler.show() + binding.accountsSearchRecycler.isVisible = false + binding.accountsRecycler.isVisible = true } else { val listAccounts = state.accounts.asRightOrNull() ?: listOf() val newList = state.searchResult.map { acc -> acc to listAccounts.contains(acc) } searchAdapter.submitList(newList) - binding.accountsSearchRecycler.show() - binding.accountsRecycler.hide() + binding.accountsSearchRecycler.isVisible = true + binding.accountsRecycler.isVisible = false } } private fun handleError(error: Throwable) { - binding.messageView.show() + binding.messageView.isVisible = true val retryAction = { _: View -> - binding.messageView.hide() + binding.messageView.isVisible = false viewModel.load(listId) } if (error is IOException) { @@ -184,11 +183,12 @@ class AccountsInListFragment : DialogFragment(), Injectable { inner class Adapter : ListAdapter>(AccountDiffer) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder { - val binding = ItemFollowRequestBinding.inflate(LayoutInflater.from(parent.context), parent, false) + val binding = + ItemFollowRequestBinding.inflate(LayoutInflater.from(parent.context), parent, false) val holder = BindingHolder(binding) - binding.notificationTextView.hide() - binding.acceptButton.hide() + binding.notificationTextView.isVisible = false + binding.acceptButton.isVisible = false binding.rejectButton.setOnClickListener { onRemoveFromList(getItem(holder.bindingAdapterPosition).id) } @@ -219,11 +219,12 @@ class AccountsInListFragment : DialogFragment(), Injectable { inner class SearchAdapter : ListAdapter>(SearchDiffer) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder { - val binding = ItemFollowRequestBinding.inflate(LayoutInflater.from(parent.context), parent, false) + val binding = + ItemFollowRequestBinding.inflate(LayoutInflater.from(parent.context), parent, false) val holder = BindingHolder(binding) - binding.notificationTextView.hide() - binding.acceptButton.hide() + binding.notificationTextView.isVisible = false + binding.acceptButton.isVisible = false binding.rejectButton.setOnClickListener { val (account, inAList) = getItem(holder.bindingAdapterPosition) if (inAList) { diff --git a/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.kt b/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.kt index 369f692627..acb311ec63 100644 --- a/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/EditProfileActivity.kt @@ -23,7 +23,6 @@ import android.os.Bundle import android.util.Log import android.view.Menu import android.view.MenuItem -import android.view.View import android.widget.ImageView import androidx.activity.viewModels import androidx.core.view.isVisible @@ -45,7 +44,6 @@ import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.util.Error import com.keylesspalace.tusky.util.Loading import com.keylesspalace.tusky.util.Success -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.viewmodel.EditProfileViewModel import com.mikepenz.iconics.IconicsDrawable @@ -189,7 +187,7 @@ class EditProfileActivity : BaseActivity(), Injectable { finish() } is Loading -> { - binding.saveProgressBar.visibility = View.VISIBLE + binding.saveProgressBar.isVisible = true } is Error -> { onSaveFailure(it.errorMessage) @@ -234,7 +232,7 @@ class EditProfileActivity : BaseActivity(), Injectable { glide.into(imageView) } - imageView.show() + imageView.isVisible = true } } @@ -295,7 +293,7 @@ class EditProfileActivity : BaseActivity(), Injectable { private fun onSaveFailure(msg: String?) { val errorMsg = msg ?: getString(R.string.error_media_upload_sending) Snackbar.make(binding.avatarButton, errorMsg, Snackbar.LENGTH_LONG).show() - binding.saveProgressBar.visibility = View.GONE + binding.saveProgressBar.isVisible = false } private fun onPickFailure(throwable: Throwable?) { diff --git a/app/src/main/java/com/keylesspalace/tusky/FiltersActivity.kt b/app/src/main/java/com/keylesspalace/tusky/FiltersActivity.kt index bbb5bc6a15..82f1006026 100644 --- a/app/src/main/java/com/keylesspalace/tusky/FiltersActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/FiltersActivity.kt @@ -5,6 +5,7 @@ import android.text.format.DateUtils import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Toast +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import at.connyduck.calladapter.networkresult.fold import at.connyduck.calladapter.networkresult.getOrElse @@ -13,8 +14,6 @@ import com.keylesspalace.tusky.appstore.PreferenceChangedEvent import com.keylesspalace.tusky.databinding.ActivityFiltersBinding import com.keylesspalace.tusky.entity.Filter import com.keylesspalace.tusky.network.MastodonApi -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.view.getSecondsForDurationIndex import com.keylesspalace.tusky.view.setupEditDialogForFilter @@ -144,15 +143,15 @@ class FiltersActivity : BaseActivity() { private fun loadFilters() { - binding.filterMessageView.hide() - binding.filtersView.hide() - binding.addFilterButton.hide() - binding.filterProgressBar.show() + binding.filterMessageView.isVisible = false + binding.filtersView.isVisible = false + binding.addFilterButton.isVisible = false + binding.filterProgressBar.isVisible = true lifecycleScope.launch { val newFilters = api.getFilters().getOrElse { - binding.filterProgressBar.hide() - binding.filterMessageView.show() + binding.filterProgressBar.isVisible = false + binding.filterMessageView.isVisible = true if (it is IOException) { binding.filterMessageView.setup( R.drawable.elephant_offline, @@ -170,9 +169,9 @@ class FiltersActivity : BaseActivity() { filters = newFilters.filter { it.context.contains(context) }.toMutableList() refreshFilterDisplay() - binding.filtersView.show() + binding.filtersView.isVisible = true binding.addFilterButton.show() - binding.filterProgressBar.hide() + binding.filterProgressBar.isVisible = false } } diff --git a/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt b/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt index b02728cc1b..5a1775bb22 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/ListsActivity.kt @@ -31,6 +31,7 @@ import android.widget.TextView import androidx.activity.viewModels import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DividerItemDecoration @@ -44,11 +45,8 @@ import com.keylesspalace.tusky.databinding.ActivityListsBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.entity.MastoList -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.onTextChanged -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import com.keylesspalace.tusky.viewmodel.ListsViewModel import com.keylesspalace.tusky.viewmodel.ListsViewModel.Event import com.keylesspalace.tusky.viewmodel.ListsViewModel.LoadingState.ERROR_NETWORK @@ -162,30 +160,30 @@ class ListsActivity : BaseActivity(), Injectable, HasAndroidInjector { private fun update(state: ListsViewModel.State) { adapter.submitList(state.lists) - binding.progressBar.visible(state.loadingState == LOADING) + binding.progressBar.isVisible = (state.loadingState == LOADING) when (state.loadingState) { - INITIAL, LOADING -> binding.messageView.hide() + INITIAL, LOADING -> binding.messageView.isVisible = false ERROR_NETWORK -> { - binding.messageView.show() + binding.messageView.isVisible = true binding.messageView.setup(R.drawable.elephant_offline, R.string.error_network) { viewModel.retryLoading() } } ERROR_OTHER -> { - binding.messageView.show() + binding.messageView.isVisible = true binding.messageView.setup(R.drawable.elephant_error, R.string.error_generic) { viewModel.retryLoading() } } LOADED -> if (state.lists.isEmpty()) { - binding.messageView.show() + binding.messageView.isVisible = true binding.messageView.setup( R.drawable.elephant_friend_empty, R.string.message_empty, null ) } else { - binding.messageView.hide() + binding.messageView.isVisible = false } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt index 7a19149f6c..757202818e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/MainActivity.kt @@ -40,6 +40,7 @@ import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.view.GravityCompat +import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager @@ -93,13 +94,10 @@ import com.keylesspalace.tusky.usecase.LogoutUsecase import com.keylesspalace.tusky.util.deleteStaleCachedMedia import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.getDimension -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.reduceSwipeSensitivity -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.unsafeLazy import com.keylesspalace.tusky.util.updateShortcut import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import com.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.utils.colorInt @@ -253,7 +251,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje } val hideTopToolbar = preferences.getBoolean(PrefKeys.HIDE_TOP_TOOLBAR, false) - binding.mainToolbar.visible(!hideTopToolbar) + binding.mainToolbar.isVisible = !hideTopToolbar loadDrawerAvatar(activeAccount.profilePictureUrl, true) @@ -672,11 +670,12 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje val activeTabLayout = if (preferences.getString(PrefKeys.MAIN_NAV_POSITION, "top") == "bottom") { val actionBarSize = getDimension(this, androidx.appcompat.R.attr.actionBarSize) val fabMargin = resources.getDimensionPixelSize(R.dimen.fabMargin) - (binding.composeButton.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = actionBarSize + fabMargin - binding.topNav.hide() + (binding.composeButton.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = + actionBarSize + fabMargin + binding.topNav.isVisible = false binding.bottomTabLayout } else { - binding.bottomNav.hide() + binding.bottomNav.isVisible = false (binding.viewPager.layoutParams as CoordinatorLayout.LayoutParams).bottomMargin = 0 (binding.composeButton.layoutParams as CoordinatorLayout.LayoutParams).anchorId = R.id.viewPager binding.tabLayout @@ -759,7 +758,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje if (fragment.isFabVisible()) { binding.composeButton.show() } else { - binding.composeButton.hide() + binding.composeButton.isVisible = false } } else { binding.composeButton.show() @@ -807,11 +806,11 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje .setTitle(R.string.action_logout) .setMessage(getString(R.string.action_logout_confirm, activeAccount.fullName)) .setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int -> - binding.appBar.hide() - binding.viewPager.hide() - binding.progressBar.show() - binding.bottomNav.hide() - binding.composeButton.hide() + binding.appBar.isVisible = false + binding.viewPager.isVisible = false + binding.progressBar.isVisible = true + binding.bottomNav.isVisible = false + binding.composeButton.isVisible = false lifecycleScope.launch { val otherAccountAvailable = logoutUsecase.logout() @@ -875,10 +874,10 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje val navOnBottom = preferences.getString("mainNavPosition", "top") == "bottom" val avatarView = if (navOnBottom) { - binding.bottomNavAvatar.show() + binding.bottomNavAvatar.isVisible = true binding.bottomNavAvatar } else { - binding.topNavAvatar.show() + binding.topNavAvatar.isVisible = true binding.topNavAvatar } @@ -896,8 +895,8 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje } } else { - binding.bottomNavAvatar.hide() - binding.topNavAvatar.hide() + binding.bottomNavAvatar.isVisible = false + binding.topNavAvatar.isVisible = false val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size) diff --git a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt index cb492424a8..8f9519bd8c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabPreferenceActivity.kt @@ -23,6 +23,7 @@ import android.widget.FrameLayout import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.AppCompatEditText +import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope @@ -48,7 +49,6 @@ import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.util.onTextChanged import com.keylesspalace.tusky.util.unsafeLazy import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers import kotlinx.coroutines.launch @@ -215,9 +215,9 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene } TransitionManager.beginDelayedTransition(binding.root, transition) - binding.actionButton.visible(!expand) - binding.sheet.visible(expand) - binding.scrim.visible(expand) + binding.actionButton.isVisible = !expand + binding.sheet.isVisible = expand + binding.scrim.isVisible = expand onFabDismissedCallback.isEnabled = expand } @@ -328,7 +328,7 @@ class TabPreferenceActivity : BaseActivity(), Injectable, ItemInteractionListene addTabAdapter.updateData(addableTabs) - binding.maxTabsInfo.visible(addableTabs.size == 0 || currentTabs.size >= MAX_TAB_COUNT) + binding.maxTabsInfo.isVisible = (addableTabs.size == 0 || currentTabs.size >= MAX_TAB_COUNT) currentTabsAdapter.setRemoveButtonVisible(currentTabs.size > MIN_TAB_COUNT) } diff --git a/app/src/main/java/com/keylesspalace/tusky/ViewMediaActivity.kt b/app/src/main/java/com/keylesspalace/tusky/ViewMediaActivity.kt index 8c7dff5948..1b23bf7837 100644 --- a/app/src/main/java/com/keylesspalace/tusky/ViewMediaActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/ViewMediaActivity.kt @@ -39,6 +39,7 @@ import android.webkit.MimeTypeMap import android.widget.Toast import androidx.core.app.ShareCompat import androidx.core.content.FileProvider +import androidx.core.view.isVisible import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle import androidx.viewpager2.adapter.FragmentStateAdapter @@ -177,18 +178,17 @@ class ViewMediaActivity : BaseActivity(), ViewImageFragment.PhotoActionsListener listener(isToolbarVisible) } - val visibility = if (isToolbarVisible) View.VISIBLE else View.INVISIBLE val alpha = if (isToolbarVisible) 1.0f else 0.0f if (isToolbarVisible) { // If to be visible, need to make visible immediately and animate alpha binding.toolbar.alpha = 0.0f - binding.toolbar.visibility = visibility + binding.toolbar.isVisible = isToolbarVisible } binding.toolbar.animate().alpha(alpha) .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - binding.toolbar.visibility = visibility + binding.toolbar.isVisible = isToolbarVisible animation.removeListener(this) } }) @@ -275,7 +275,7 @@ class ViewMediaActivity : BaseActivity(), ViewImageFragment.PhotoActionsListener private fun shareImage(directory: File, url: String) { isCreating = true - binding.progressBarShare.visibility = View.VISIBLE + binding.progressBarShare.isVisible = true invalidateOptionsMenu() val file = File(directory, getTemporaryMediaFilename("png")) val futureTask: FutureTarget = @@ -305,14 +305,14 @@ class ViewMediaActivity : BaseActivity(), ViewImageFragment.PhotoActionsListener Log.d(TAG, "Download image result: $result") isCreating = false invalidateOptionsMenu() - binding.progressBarShare.visibility = View.GONE + binding.progressBarShare.isVisible = false if (result) shareFile(file, "image/png") }, { error -> isCreating = false invalidateOptionsMenu() - binding.progressBarShare.visibility = View.GONE + binding.progressBarShare.isVisible = false Log.e(TAG, "Failed to download image", error) } ) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/AccountSelectionAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/AccountSelectionAdapter.kt index 0b0115c2ad..53c60d5e61 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/AccountSelectionAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/AccountSelectionAdapter.kt @@ -20,6 +20,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import androidx.core.view.isVisible import androidx.preference.PreferenceManager import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemAutocompleteAccountBinding @@ -44,7 +45,7 @@ class AccountSelectionAdapter(context: Context) : ArrayAdapter(co binding.username.text = account.fullName binding.displayName.text = account.displayName.emojify(account.emojis, binding.displayName, animateEmojis) - binding.avatarBadge.visibility = View.GONE // We never want to display the bot badge here + binding.avatarBadge.isVisible = false // We never want to display the bot badge here val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_42dp) val animateAvatar = pm.getBoolean("animateGifAvatars", false) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/AccountViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/AccountViewHolder.kt index f125422c31..bd027f5a08 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/AccountViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/AccountViewHolder.kt @@ -1,5 +1,6 @@ package com.keylesspalace.tusky.adapter +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemAccountBinding @@ -8,7 +9,6 @@ import com.keylesspalace.tusky.interfaces.AccountActionListener import com.keylesspalace.tusky.interfaces.LinkListener import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.loadAvatar -import com.keylesspalace.tusky.util.visible class AccountViewHolder( private val binding: ItemAccountBinding @@ -39,7 +39,7 @@ class AccountViewHolder( .getDimensionPixelSize(R.dimen.avatar_radius_48dp) loadAvatar(account.avatar, binding.accountAvatar, avatarRadius, animateAvatar) - binding.accountBotBadge.visible(showBotOverlay && account.bot) + binding.accountBotBadge.isVisible = (showBotOverlay && account.bot) } fun setupActionListener(listener: AccountActionListener) { diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/FollowRequestViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/FollowRequestViewHolder.kt index 7e675de333..6cc33c479d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/FollowRequestViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/FollowRequestViewHolder.kt @@ -19,6 +19,7 @@ import android.graphics.Typeface import android.text.SpannableStringBuilder import android.text.Spanned import android.text.style.StyleSpan +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemFollowRequestBinding @@ -27,7 +28,6 @@ import com.keylesspalace.tusky.interfaces.AccountActionListener import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.loadAvatar import com.keylesspalace.tusky.util.unicodeWrap -import com.keylesspalace.tusky.util.visible class FollowRequestViewHolder( private val binding: ItemFollowRequestBinding, @@ -49,12 +49,12 @@ class FollowRequestViewHolder( setSpan(StyleSpan(Typeface.BOLD), 0, wrappedName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) }.emojify(account.emojis, itemView, animateEmojis) } - binding.notificationTextView.visible(showHeader) + binding.notificationTextView.isVisible = showHeader val formattedUsername = itemView.context.getString(R.string.post_username_format, account.username) binding.usernameTextView.text = formattedUsername val avatarRadius = binding.avatar.context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp) loadAvatar(account.avatar, binding.avatar, avatarRadius, animateAvatar) - binding.avatarBadge.visible(showBotOverlay && account.bot) + binding.avatarBadge.isVisible = (showBotOverlay && account.bot) } fun setupActionListener(listener: AccountActionListener, accountId: String) { diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt index 596c9432d5..2e893ce5cd 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt @@ -18,13 +18,13 @@ package com.keylesspalace.tusky.adapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemPollBinding import com.keylesspalace.tusky.entity.Emoji import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.emojify -import com.keylesspalace.tusky.util.visible import com.keylesspalace.tusky.viewdata.PollOptionViewData import com.keylesspalace.tusky.viewdata.buildDescription import com.keylesspalace.tusky.viewdata.calculatePercent @@ -82,9 +82,9 @@ class PollAdapter : RecyclerView.Adapter>() { val radioButton = holder.binding.statusPollRadioButton val checkBox = holder.binding.statusPollCheckbox - resultTextView.visible(mode == RESULT) - radioButton.visible(mode == SINGLE) - checkBox.visible(mode == MULTIPLE) + resultTextView.isVisible = (mode == RESULT) + radioButton.isVisible = (mode == SINGLE) + checkBox.isVisible = (mode == MULTIPLE) radioButton.isEnabled = enabled checkBox.isEnabled = enabled @@ -92,8 +92,9 @@ class PollAdapter : RecyclerView.Adapter>() { when (mode) { RESULT -> { val percent = calculatePercent(option.votesCount, votersCount, voteCount) - resultTextView.text = buildDescription(option.title, percent, option.voted, resultTextView.context) - .emojify(emojis, resultTextView, animateEmojis) + resultTextView.text = + buildDescription(option.title, percent, option.voted, resultTextView.context) + .emojify(emojis, resultTextView, animateEmojis) val level = percent * 100 val optionColor = if (option.voted) { diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt index e3e4f27e8f..73c51418eb 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/TabAdapter.kt @@ -18,6 +18,7 @@ package com.keylesspalace.tusky.adapter import android.view.LayoutInflater import android.view.MotionEvent import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.core.view.size import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding @@ -29,9 +30,7 @@ import com.keylesspalace.tusky.TabData import com.keylesspalace.tusky.databinding.ItemTabPreferenceBinding import com.keylesspalace.tusky.databinding.ItemTabPreferenceSmallBinding import com.keylesspalace.tusky.util.BindingHolder -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.setDrawableTint -import com.keylesspalace.tusky.util.show interface ItemInteractionListener { fun onTabAdded(tab: TabData) @@ -107,7 +106,7 @@ class TabAdapter( ) if (tab.id == HASHTAG) { - binding.chipGroup.show() + binding.chipGroup.isVisible = true /* * The chip group will always contain the actionChip (it is defined in the xml layout). @@ -144,7 +143,7 @@ class TabAdapter( listener.onActionChipClicked(tab, holder.bindingAdapterPosition) } } else { - binding.chipGroup.hide() + binding.chipGroup.isVisible = false } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt index ba261c1d8a..bdb696c11d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountActivity.kt @@ -39,6 +39,8 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat.Type.systemBars +import androidx.core.view.isInvisible +import androidx.core.view.isVisible import androidx.core.view.updatePadding import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager @@ -78,15 +80,12 @@ import com.keylesspalace.tusky.util.Loading import com.keylesspalace.tusky.util.Success import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.getDomain -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.loadAvatar import com.keylesspalace.tusky.util.parseAsMastodonHtml import com.keylesspalace.tusky.util.reduceSwipeSensitivity import com.keylesspalace.tusky.util.setClickableText -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.view.showMuteAccountDialog import dagger.android.DispatchingAndroidInjector import dagger.android.HasAndroidInjector @@ -171,9 +170,9 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI if (viewModel.isSelf) { updateButtons() - binding.saveNoteInfo.hide() + binding.saveNoteInfo.isVisible = false } else { - binding.saveNoteInfo.visibility = View.INVISIBLE + binding.saveNoteInfo.isInvisible = true } } @@ -193,10 +192,10 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI */ private fun setupAccountViews() { // Initialise the default UI states. - binding.accountFloatingActionButton.hide() - binding.accountFollowButton.hide() - binding.accountMuteButton.hide() - binding.accountFollowsYouTextView.hide() + binding.accountFloatingActionButton.isVisible = false + binding.accountFollowButton.isVisible = false + binding.accountMuteButton.isVisible = false + binding.accountFollowsYouTextView.isVisible = false // setup the RecyclerView for the account fields accountFieldAdapter = AccountFieldAdapter(this, animateEmojis) @@ -229,9 +228,9 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI val wellbeingEnabled = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_PROFILE, false) if (wellbeingEnabled) { - binding.accountStatuses.hide() - binding.accountFollowers.hide() - binding.accountFollowing.hide() + binding.accountStatuses.isVisible = false + binding.accountFollowers.isVisible = false + binding.accountFollowing.isVisible = false } } @@ -350,7 +349,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI binding.accountFloatingActionButton.show() } if (verticalOffset < oldOffset) { - binding.accountFloatingActionButton.hide() + binding.accountFloatingActionButton.isVisible = false } } @@ -359,7 +358,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI binding.accountAvatarImageView.scaleX = scaledAvatarSize binding.accountAvatarImageView.scaleY = scaledAvatarSize - binding.accountAvatarImageView.visible(scaledAvatarSize > 0) + binding.accountAvatarImageView.isVisible = (scaledAvatarSize > 0) val transparencyPercent = (abs(verticalOffset) / titleVisibleHeight.toFloat()).coerceAtMost(1f) @@ -407,7 +406,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI } } viewModel.noteSaved.observe(this) { - binding.saveNoteInfo.visible(it, View.INVISIBLE) + binding.saveNoteInfo.isInvisible = !it } // "Post failed" dialog should display in this activity @@ -451,15 +450,16 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI } } - val emojifiedNote = account.note.parseAsMastodonHtml().emojify(account.emojis, binding.accountNoteTextView, animateEmojis) + val emojifiedNote = account.note.parseAsMastodonHtml() + .emojify(account.emojis, binding.accountNoteTextView, animateEmojis) setClickableText(binding.accountNoteTextView, emojifiedNote, emptyList(), null, this) accountFieldAdapter.fields = account.fields ?: emptyList() accountFieldAdapter.emojis = account.emojis ?: emptyList() accountFieldAdapter.notifyDataSetChanged() - binding.accountLockedImageView.visible(account.locked) - binding.accountBadgeTextView.visible(account.bot) + binding.accountLockedImageView.isVisible = account.locked + binding.accountBadgeTextView.isVisible = account.bot updateAccountAvatar() updateToolbar() @@ -477,14 +477,14 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI private fun updateAccountJoinedDate() { loadedAccount?.let { account -> - try { + binding.accountDateJoined.isVisible = try { binding.accountDateJoined.text = resources.getString( R.string.account_date_joined, SimpleDateFormat("MMMM, yyyy", Locale.getDefault()).format(account.createdAt) ) - binding.accountDateJoined.visibility = View.VISIBLE + true } catch (e: ParseException) { - binding.accountDateJoined.visibility = View.GONE + false } } } @@ -541,7 +541,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI private fun updateMovedAccount() { loadedAccount?.moved?.let { movedAccount -> - binding.accountMovedView.show() + binding.accountMovedView.isVisible = true binding.accountMovedView.setOnClickListener { onViewAccount(movedAccount.id) @@ -564,7 +564,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI private fun updateRemoteAccount() { loadedAccount?.let { account -> if (account.isRemote()) { - binding.accountRemoveView.show() + binding.accountRemoveView.isVisible = true binding.accountRemoveView.setOnClickListener { openLink(account.url) } @@ -628,14 +628,14 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI val preferences = PreferenceManager.getDefaultSharedPreferences(this) val wellbeingEnabled = preferences.getBoolean(PrefKeys.WELLBEING_HIDE_STATS_PROFILE, false) - binding.accountFollowsYouTextView.visible(relation.followedBy && !wellbeingEnabled) + binding.accountFollowsYouTextView.isVisible = (relation.followedBy && !wellbeingEnabled) // because subscribing is Pleroma extension, enable it __only__ when we have non-null subscribing field // it's also now supported in Mastodon 3.3.0rc but called notifying and use different API call if (!viewModel.isSelf && followState == FollowState.FOLLOWING && (relation.subscribing != null || relation.notifying != null) ) { - binding.accountSubscribeButton.show() + binding.accountSubscribeButton.isVisible = true binding.accountSubscribeButton.setOnClickListener { viewModel.changeSubscribingState() } @@ -648,7 +648,7 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI // remove the listener so it doesn't fire on non-user changes binding.accountNoteTextInputLayout.editText?.removeTextChangedListener(noteWatcher) - binding.accountNoteTextInputLayout.visible(relation.note != null) + binding.accountNoteTextInputLayout.isVisible = (relation.note != null) binding.accountNoteTextInputLayout.editText?.setText(relation.note) binding.accountNoteTextInputLayout.editText?.addTextChangedListener(noteWatcher) @@ -688,13 +688,13 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI if (muting) { binding.accountMuteButton.setIconResource(R.drawable.ic_unmute_24dp) } else { - binding.accountMuteButton.hide() + binding.accountMuteButton.isVisible = false } } private fun updateSubscribeButton() { if (followState != FollowState.FOLLOWING) { - binding.accountSubscribeButton.hide() + binding.accountSubscribeButton.isVisible = false } if (subscribing) { @@ -711,23 +711,23 @@ class AccountActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidI if (loadedAccount?.moved == null) { - binding.accountFollowButton.show() + binding.accountFollowButton.isVisible = true updateFollowButton() updateSubscribeButton() if (blocking) { - binding.accountFloatingActionButton.hide() - binding.accountMuteButton.hide() + binding.accountFloatingActionButton.isVisible = false + binding.accountMuteButton.isVisible = false } else { binding.accountFloatingActionButton.show() - binding.accountMuteButton.visible(muting) + binding.accountMuteButton.isVisible = (muting) updateMuteButton() } } else { - binding.accountFloatingActionButton.hide() - binding.accountFollowButton.hide() - binding.accountMuteButton.hide() - binding.accountSubscribeButton.hide() + binding.accountFloatingActionButton.isVisible = false + binding.accountFollowButton.isVisible = false + binding.accountMuteButton.isVisible = false + binding.accountSubscribeButton.isVisible = false } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/list/ListsForAccountFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/list/ListsForAccountFragment.kt index 874d4b9f20..2aa2279951 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/account/list/ListsForAccountFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/account/list/ListsForAccountFragment.kt @@ -21,6 +21,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout +import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -34,10 +35,7 @@ import com.keylesspalace.tusky.databinding.ItemAddOrRemoveFromListBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.util.BindingHolder -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import java.io.IOException @@ -84,14 +82,14 @@ class ListsForAccountFragment : DialogFragment(), Injectable { viewLifecycleOwner.lifecycleScope.launch { viewModel.states.collectLatest { states -> - binding.progressBar.hide() + binding.progressBar.isVisible = false if (states.isEmpty()) { - binding.messageView.show() + binding.messageView.isVisible = true binding.messageView.setup(R.drawable.elephant_friend_empty, R.string.no_lists) { load() } } else { - binding.listsView.show() + binding.listsView.isVisible = true adapter.submitList(states) } } @@ -99,10 +97,10 @@ class ListsForAccountFragment : DialogFragment(), Injectable { viewLifecycleOwner.lifecycleScope.launch { viewModel.loadError.collectLatest { error -> - binding.progressBar.hide() - binding.listsView.hide() + binding.progressBar.isVisible = false + binding.listsView.isVisible = false binding.messageView.apply { - show() + isVisible = true if (error is IOException) { setup(R.drawable.elephant_offline, R.string.error_network) { @@ -146,9 +144,9 @@ class ListsForAccountFragment : DialogFragment(), Injectable { } private fun load() { - binding.progressBar.show() - binding.listsView.hide() - binding.messageView.hide() + binding.progressBar.isVisible = true + binding.listsView.isVisible = false + binding.messageView.isVisible = false viewModel.load() } @@ -183,13 +181,13 @@ class ListsForAccountFragment : DialogFragment(), Injectable { val item = getItem(position) holder.binding.listNameView.text = item.list.title holder.binding.addButton.apply { - visible(!item.includesAccount) + isVisible = !item.includesAccount setOnClickListener { viewModel.addAccountToList(item.list.id) } } holder.binding.removeButton.apply { - visible(item.includesAccount) + isVisible = item.includesAccount setOnClickListener { viewModel.removeAccountFromList(item.list.id) } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaFragment.kt index 457cda7b9c..eeb5834e70 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaFragment.kt @@ -19,6 +19,7 @@ import android.os.Bundle import android.view.View import androidx.core.app.ActivityOptionsCompat import androidx.core.view.ViewCompat +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -34,9 +35,7 @@ import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.interfaces.RefreshableFragment import com.keylesspalace.tusky.settings.PrefKeys -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.openLink -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.viewdata.AttachmentViewData import kotlinx.coroutines.flow.collectLatest @@ -96,7 +95,7 @@ class AccountMediaFragment : binding.swipeRefreshLayout.isEnabled = false - binding.statusView.visibility = View.GONE + binding.statusView.isVisible = false viewLifecycleOwner.lifecycleScope.launch { viewModel.media.collectLatest { pagingData -> @@ -105,19 +104,24 @@ class AccountMediaFragment : } adapter.addLoadStateListener { loadState -> - binding.statusView.hide() - binding.progressBar.hide() + binding.statusView.isVisible = false + binding.progressBar.isVisible = false if (adapter.itemCount == 0) { when (loadState.refresh) { is LoadState.NotLoading -> { if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) { - binding.statusView.show() - binding.statusView.setup(R.drawable.elephant_friend_empty, R.string.message_empty, null) + binding.statusView.isVisible = true + binding.statusView.setup( + R.drawable.elephant_friend_empty, + R.string.message_empty, + null + ) } } + is LoadState.Error -> { - binding.statusView.show() + binding.statusView.isVisible = true if ((loadState.refresh as LoadState.Error).error is IOException) { binding.statusView.setup(R.drawable.elephant_offline, R.string.error_network, null) @@ -126,7 +130,7 @@ class AccountMediaFragment : } } is LoadState.Loading -> { - binding.progressBar.show() + binding.progressBar.isVisible = true } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaGridAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaGridAdapter.kt index 48b3a21daf..fdeba6a0c1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaGridAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/account/media/AccountMediaGridAdapter.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.content.res.AppCompatResources +import androidx.core.view.isVisible import androidx.core.view.setPadding import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil @@ -18,8 +19,6 @@ import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.decodeBlurHash import com.keylesspalace.tusky.util.getFormattedDescription -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.viewdata.AttachmentViewData import java.util.Random @@ -70,7 +69,7 @@ class AccountMediaGridAdapter( } if (item.attachment.type == Attachment.Type.AUDIO) { - overlay.hide() + overlay.isVisible = false imageView.setPadding(context.resources.getDimensionPixelSize(R.dimen.profile_media_audio_icon_padding)) @@ -81,7 +80,7 @@ class AccountMediaGridAdapter( imageView.contentDescription = item.attachment.getFormattedDescription(context) } else if (item.sensitive && !item.isRevealed && !alwaysShowSensitiveMedia) { - overlay.show() + overlay.isVisible = true overlay.setImageDrawable(mediaHiddenDrawable) imageView.setPadding(0) @@ -94,10 +93,10 @@ class AccountMediaGridAdapter( imageView.contentDescription = imageView.context.getString(R.string.post_media_hidden_title) } else { if (item.attachment.type == Attachment.Type.VIDEO || item.attachment.type == Attachment.Type.GIFV) { - overlay.show() + overlay.isVisible = true overlay.setImageDrawable(videoIndicator) } else { - overlay.hide() + overlay.isVisible = false } imageView.setPadding(0) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListFragment.kt index 2649cbfe61..65af215c8b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListFragment.kt @@ -18,6 +18,7 @@ package com.keylesspalace.tusky.components.accountlist import android.os.Bundle import android.util.Log import android.view.View +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope @@ -49,8 +50,6 @@ import com.keylesspalace.tusky.interfaces.AccountActionListener import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.HttpHeaderLink -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.view.EndlessOnScrollListener import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -337,14 +336,14 @@ class AccountListFragment : Fragment(R.layout.fragment_account_list), AccountAct fetching = false if (adapter.itemCount == 0) { - binding.messageView.show() + binding.messageView.isVisible = true binding.messageView.setup( R.drawable.elephant_friend_empty, R.string.message_empty, null ) } else { - binding.messageView.hide() + binding.messageView.isVisible = false } } @@ -369,15 +368,15 @@ class AccountListFragment : Fragment(R.layout.fragment_account_list), AccountAct Log.e(TAG, "Fetch failure", throwable) if (adapter.itemCount == 0) { - binding.messageView.show() + binding.messageView.isVisible = true if (throwable is IOException) { binding.messageView.setup(R.drawable.elephant_offline, R.string.error_network) { - binding.messageView.hide() + binding.messageView.isVisible = false this.fetchAccounts(null) } } else { binding.messageView.setup(R.drawable.elephant_error, R.string.error_generic) { - binding.messageView.hide() + binding.messageView.isVisible = false this.fetchAccounts(null) } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/BlocksAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/BlocksAdapter.kt index f769af344f..f6faae0814 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/BlocksAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/BlocksAdapter.kt @@ -17,13 +17,13 @@ package com.keylesspalace.tusky.components.accountlist.adapter import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isVisible import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemBlockedUserBinding import com.keylesspalace.tusky.interfaces.AccountActionListener import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.loadAvatar -import com.keylesspalace.tusky.util.visible /** Displays a list of blocked accounts. */ class BlocksAdapter( @@ -56,7 +56,7 @@ class BlocksAdapter( val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp) loadAvatar(account.avatar, binding.blockedUserAvatar, avatarRadius, animateAvatar) - binding.blockedUserBotBadge.visible(showBotOverlay && account.bot) + binding.blockedUserBotBadge.isVisible = (showBotOverlay && account.bot) binding.blockedUserUnblock.setOnClickListener { accountActionListener.onBlock(false, account.id, position) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/MutesAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/MutesAdapter.kt index 288d133945..87d99fe873 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/MutesAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/MutesAdapter.kt @@ -18,13 +18,13 @@ package com.keylesspalace.tusky.components.accountlist.adapter import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.ViewCompat +import androidx.core.view.isVisible import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemMutedUserBinding import com.keylesspalace.tusky.interfaces.AccountActionListener import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.loadAvatar -import com.keylesspalace.tusky.util.visible /** Displays a list of muted accounts with mute/unmute account button and mute/unmute notifications switch */ class MutesAdapter( @@ -62,7 +62,7 @@ class MutesAdapter( val avatarRadius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius_48dp) loadAvatar(account.avatar, binding.mutedUserAvatar, avatarRadius, animateAvatar) - binding.mutedUserBotBadge.visible(showBotOverlay && account.bot) + binding.mutedUserBotBadge.isVisible = (showBotOverlay && account.bot) val unmuteString = context.getString(R.string.action_unmute_desc, formattedUsername) binding.mutedUserUnmute.contentDescription = unmuteString diff --git a/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt index 8f30c5e49f..ce30f0184d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementAdapter.kt @@ -21,6 +21,7 @@ import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.core.view.size import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide @@ -34,7 +35,6 @@ import com.keylesspalace.tusky.util.EmojiSpan import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.parseAsMastodonHtml import com.keylesspalace.tusky.util.setClickableText -import com.keylesspalace.tusky.util.visible import java.lang.ref.WeakReference interface AnnouncementActionListener : LinkListener { @@ -70,12 +70,12 @@ class AnnouncementAdapter( if (wellbeingEnabled) { // Since reactions are not visible in wellbeing mode, // we shouldn't be able to add any ourselves. - addReactionChip.visibility = View.GONE + addReactionChip.isVisible = false return } // hide button if announcement badge limit is already reached - addReactionChip.visible(item.reactions.size < 8) + addReactionChip.isVisible = (item.reactions.size < 8) item.reactions.forEachIndexed { i, reaction -> ( diff --git a/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsActivity.kt index 14fbcf8cc7..3d80f07e02 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/announcements/AnnouncementsActivity.kt @@ -22,6 +22,7 @@ import android.os.Bundle import android.view.View import android.widget.PopupWindow import androidx.activity.viewModels +import androidx.core.view.isVisible import androidx.preference.PreferenceManager import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager @@ -37,8 +38,6 @@ import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.Error import com.keylesspalace.tusky.util.Loading import com.keylesspalace.tusky.util.Success -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.unsafeLazy import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.view.EmojiPicker @@ -98,26 +97,26 @@ class AnnouncementsActivity : BottomSheetActivity(), AnnouncementActionListener, viewModel.announcements.observe(this) { when (it) { is Success -> { - binding.progressBar.hide() + binding.progressBar.isVisible = false binding.swipeRefreshLayout.isRefreshing = false if (it.data.isNullOrEmpty()) { binding.errorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_announcements) - binding.errorMessageView.show() + binding.errorMessageView.isVisible = true } else { - binding.errorMessageView.hide() + binding.errorMessageView.isVisible = false } adapter.updateList(it.data ?: listOf()) } is Loading -> { - binding.errorMessageView.hide() + binding.errorMessageView.isVisible = false } is Error -> { - binding.progressBar.hide() + binding.progressBar.isVisible = false binding.swipeRefreshLayout.isRefreshing = false binding.errorMessageView.setup(R.drawable.elephant_error, R.string.error_generic) { refreshAnnouncements() } - binding.errorMessageView.show() + binding.errorMessageView.isVisible = true } } } @@ -127,7 +126,7 @@ class AnnouncementsActivity : BottomSheetActivity(), AnnouncementActionListener, } viewModel.load() - binding.progressBar.show() + binding.progressBar.isVisible = true } private fun refreshAnnouncements() { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt index db606a318c..9d05a6cc87 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt @@ -94,16 +94,13 @@ import com.keylesspalace.tusky.util.afterTextChanged import com.keylesspalace.tusky.util.getInitialLanguages import com.keylesspalace.tusky.util.getLocaleList import com.keylesspalace.tusky.util.getMediaSize -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.highlightSpans import com.keylesspalace.tusky.util.loadAvatar import com.keylesspalace.tusky.util.modernLanguageCode import com.keylesspalace.tusky.util.onTextChanged import com.keylesspalace.tusky.util.setDrawableTint -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.mikepenz.iconics.IconicsDrawable import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial import com.mikepenz.iconics.utils.colorInt @@ -253,9 +250,9 @@ class ComposeActivity : R.string.compose_active_account_description, activeAccount.fullName ) - binding.composeUsernameView.show() + binding.composeUsernameView.isVisible = true } else { - binding.composeUsernameView.hide() + binding.composeUsernameView.isVisible = false } setupReplyViews(composeOptions?.replyingStatusAuthor, composeOptions?.replyingStatusContent) @@ -341,7 +338,7 @@ class ComposeActivity : private fun setupReplyViews(replyingStatusAuthor: String?, replyingStatusContent: String?) { if (replyingStatusAuthor != null) { - binding.composeReplyView.show() + binding.composeReplyView.isVisible = true binding.composeReplyView.text = getString(R.string.replying_to, replyingStatusAuthor) val arrowDownIcon = IconicsDrawable(this, GoogleMaterial.Icon.gmd_arrow_drop_down).apply { sizeDp = 12 } @@ -352,10 +349,10 @@ class ComposeActivity : TransitionManager.beginDelayedTransition(binding.composeReplyContentView.parent as ViewGroup) if (binding.composeReplyContentView.isVisible) { - binding.composeReplyContentView.hide() + binding.composeReplyContentView.isVisible = false binding.composeReplyView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, arrowDownIcon, null) } else { - binding.composeReplyContentView.show() + binding.composeReplyContentView.isVisible = true val arrowUpIcon = IconicsDrawable(this, GoogleMaterial.Icon.gmd_arrow_drop_up).apply { sizeDp = 12 } setDrawableTint(this, arrowUpIcon, android.R.attr.textColorTertiary) @@ -435,14 +432,14 @@ class ComposeActivity : viewModel.media.collect { media -> mediaAdapter.submitList(media) - binding.composeMediaPreviewBar.visible(media.isNotEmpty()) + binding.composeMediaPreviewBar.isVisible = media.isNotEmpty() updateSensitiveMediaToggle(viewModel.markMediaAsSensitive.value, viewModel.showContentWarning.value) } } lifecycleScope.launch { viewModel.poll.collect { poll -> - binding.pollPreview.visible(poll != null) + binding.pollPreview.isVisible = (poll != null) poll?.let(binding.pollPreview::setPoll) } } @@ -516,7 +513,8 @@ class ComposeActivity : val pollIcon = IconicsDrawable(this, GoogleMaterial.Icon.gmd_poll).apply { colorInt = textColor; sizeDp = 18 } binding.addPollTextActionTextView.setCompoundDrawablesRelativeWithIntrinsicBounds(pollIcon, null, null, null) - binding.actionPhotoTake.visible(Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(packageManager) != null) + binding.actionPhotoTake.isVisible = + (Intent(MediaStore.ACTION_IMAGE_CAPTURE).resolveActivity(packageManager) != null) binding.actionPhotoTake.setOnClickListener { initiateCameraApp() } binding.actionPhotoPick.setOnClickListener { onMediaPick() } @@ -677,10 +675,10 @@ class ComposeActivity : private fun updateSensitiveMediaToggle(markMediaSensitive: Boolean, contentWarningShown: Boolean) { if (viewModel.media.value.isEmpty()) { - binding.composeHideMediaButton.hide() - binding.descriptionMissingWarningButton.hide() + binding.composeHideMediaButton.isVisible = false + binding.descriptionMissingWarningButton.isVisible = false } else { - binding.composeHideMediaButton.show() + binding.composeHideMediaButton.isVisible = true @ColorInt val color = if (contentWarningShown) { binding.composeHideMediaButton.setImageResource(R.drawable.ic_hide_media_24dp) binding.composeHideMediaButton.isClickable = false @@ -704,7 +702,7 @@ class ComposeActivity : break } } - binding.descriptionMissingWarningButton.visibility = if (oneMediaWithoutDescription) View.VISIBLE else View.GONE + binding.descriptionMissingWarningButton.isVisible = oneMediaWithoutDescription } } @@ -873,7 +871,7 @@ class ComposeActivity : private fun removePoll() { viewModel.poll.value = null - binding.pollPreview.hide() + binding.pollPreview.isVisible = false } override fun onVisibilityChanged(visibility: Status.Visibility) { @@ -1074,12 +1072,12 @@ class ComposeActivity : private fun showContentWarning(show: Boolean) { TransitionManager.beginDelayedTransition(binding.composeContentWarningBar.parent as ViewGroup) @ColorInt val color = if (show) { - binding.composeContentWarningBar.show() + binding.composeContentWarningBar.isVisible = true binding.composeContentWarningField.setSelection(binding.composeContentWarningField.text.length) binding.composeContentWarningField.requestFocus() getColor(R.color.tusky_blue) } else { - binding.composeContentWarningBar.hide() + binding.composeContentWarningBar.isVisible = false binding.composeEditField.requestFocus() MaterialColors.getColor(binding.composeContentWarningButton, android.R.attr.textColorTertiary) } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt index e825798cf4..c589eda426 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt @@ -22,6 +22,7 @@ import android.widget.BaseAdapter import android.widget.Filter import android.widget.Filterable import androidx.annotation.WorkerThread +import androidx.core.view.isVisible import com.bumptech.glide.Glide import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemAutocompleteAccountBinding @@ -31,7 +32,6 @@ import com.keylesspalace.tusky.entity.Emoji import com.keylesspalace.tusky.entity.TimelineAccount import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.loadAvatar -import com.keylesspalace.tusky.util.visible class ComposeAutoCompleteAdapter( private val autocompletionProvider: AutocompletionProvider, @@ -115,7 +115,7 @@ class ComposeAutoCompleteAdapter( avatarRadius, animateAvatar ) - binding.avatarBadge.visible(showBotBadge && account.bot) + binding.avatarBadge.isVisible = (showBotBadge && account.bot) } is ItemAutocompleteHashtagBinding -> { val result = getItem(position) as AutocompleteResult.HashtagResult diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/AddPollOptionsAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/AddPollOptionsAdapter.kt index 3640ffa975..b1ac7d250d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/AddPollOptionsAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/dialog/AddPollOptionsAdapter.kt @@ -17,14 +17,13 @@ package com.keylesspalace.tusky.components.compose.dialog import android.text.InputFilter import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup +import androidx.core.view.isInvisible import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ItemAddPollOptionBinding import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.onTextChanged -import com.keylesspalace.tusky.util.visible class AddPollOptionsAdapter( private var options: MutableList, @@ -64,7 +63,7 @@ class AddPollOptionsAdapter( holder.binding.optionTextInputLayout.hint = holder.binding.root.context.getString(R.string.poll_new_choice_hint, position + 1) - holder.binding.deleteButton.visible(position > 1, View.INVISIBLE) + holder.binding.deleteButton.isInvisible = (position <= 1) holder.binding.deleteButton.setOnClickListener { holder.binding.optionEditText.clearFocus() diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt index f2e00d3411..ce65c6c0d8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/view/ComposeScheduleView.kt @@ -20,6 +20,7 @@ import android.view.LayoutInflater import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointForward import com.google.android.material.datepicker.MaterialDatePicker @@ -73,7 +74,7 @@ class ComposeScheduleView private fun updateScheduleUi() { if (scheduleDateTime == null) { binding.scheduledDateTime.text = "" - binding.invalidScheduleWarning.visibility = GONE + binding.invalidScheduleWarning.isVisible = false return } @@ -169,7 +170,7 @@ class ComposeScheduleView } else { true } - binding.invalidScheduleWarning.visibility = if (valid) GONE else VISIBLE + binding.invalidScheduleWarning.isVisible = !valid return valid } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationLoadStateAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationLoadStateAdapter.kt index 7ff4daa741..4d15aff632 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationLoadStateAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationLoadStateAdapter.kt @@ -17,11 +17,11 @@ package com.keylesspalace.tusky.components.conversation import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.paging.LoadState import androidx.paging.LoadStateAdapter import com.keylesspalace.tusky.databinding.ItemNetworkStateBinding import com.keylesspalace.tusky.util.BindingHolder -import com.keylesspalace.tusky.util.visible class ConversationLoadStateAdapter( private val retryCallback: () -> Unit @@ -29,14 +29,14 @@ class ConversationLoadStateAdapter( override fun onBindViewHolder(holder: BindingHolder, loadState: LoadState) { val binding = holder.binding - binding.progressBar.visible(loadState == LoadState.Loading) - binding.retryButton.visible(loadState is LoadState.Error) + binding.progressBar.isVisible = (loadState == LoadState.Loading) + binding.retryButton.isVisible = (loadState is LoadState.Error) val msg = if (loadState is LoadState.Error) { loadState.error.message } else { null } - binding.errorMsg.visible(msg != null) + binding.errorMsg.isVisible = (msg != null) binding.errorMsg.text = msg binding.retryButton.setOnClickListener { retryCallback() diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt index b05df2f8b9..7272b58af9 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt @@ -21,6 +21,7 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.PopupMenu +import androidx.core.view.isVisible import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope @@ -48,8 +49,6 @@ import com.keylesspalace.tusky.interfaces.StatusActionListener import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.CardViewMode import com.keylesspalace.tusky.util.StatusDisplayOptions -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.viewdata.AttachmentViewData import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -108,19 +107,24 @@ class ConversationsFragment : SFragment(), StatusActionListener, Injectable, Res binding.swipeRefreshLayout.isRefreshing = false } - binding.statusView.hide() - binding.progressBar.hide() + binding.statusView.isVisible = false + binding.progressBar.isVisible = false if (adapter.itemCount == 0) { when (loadState.refresh) { is LoadState.NotLoading -> { if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) { - binding.statusView.show() - binding.statusView.setup(R.drawable.elephant_friend_empty, R.string.message_empty, null) + binding.statusView.isVisible = true + binding.statusView.setup( + R.drawable.elephant_friend_empty, + R.string.message_empty, + null + ) } } + is LoadState.Error -> { - binding.statusView.show() + binding.statusView.isVisible = true if ((loadState.refresh as LoadState.Error).error is IOException) { binding.statusView.setup(R.drawable.elephant_offline, R.string.error_network, null) @@ -129,7 +133,7 @@ class ConversationsFragment : SFragment(), StatusActionListener, Injectable, Res } } is LoadState.Loading -> { - binding.progressBar.show() + binding.progressBar.isVisible = true } } } @@ -154,7 +158,8 @@ class ConversationsFragment : SFragment(), StatusActionListener, Injectable, Res if (composeButton != null) { if (hideFab) { if (dy > 0 && composeButton.isShown) { - composeButton.hide() // hides the button if we're scrolling down + composeButton.isVisible = + false // hides the button if we're scrolling down } else if (dy < 0 && !composeButton.isShown) { composeButton.show() // shows it if we are scrolling up } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt index 6d9a2aa16c..48d1823a40 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsActivity.kt @@ -22,6 +22,7 @@ import android.util.Log import android.widget.LinearLayout import android.widget.Toast import androidx.activity.viewModels +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager @@ -36,7 +37,6 @@ import com.keylesspalace.tusky.db.DraftEntity import com.keylesspalace.tusky.db.DraftsAlert import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.util.parseAsMastodonHtml -import com.keylesspalace.tusky.util.visible import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import retrofit2.HttpException @@ -85,7 +85,7 @@ class DraftsActivity : BaseActivity(), DraftActionListener { } adapter.addLoadStateListener { - binding.draftsErrorMessageView.visible(adapter.itemCount == 0) + binding.draftsErrorMessageView.isVisible = (adapter.itemCount == 0) } // If a failed post is saved to drafts while this activity is up, do nothing; the user is already in the drafts view. diff --git a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsAdapter.kt index 18621fd3f3..039d52c35b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/drafts/DraftsAdapter.kt @@ -17,6 +17,7 @@ package com.keylesspalace.tusky.components.drafts import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.LinearLayoutManager @@ -24,9 +25,6 @@ import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.databinding.ItemDraftBinding import com.keylesspalace.tusky.db.DraftEntity import com.keylesspalace.tusky.util.BindingHolder -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show -import com.keylesspalace.tusky.util.visible interface DraftActionListener { fun onOpenDraft(draft: DraftEntity) @@ -71,20 +69,20 @@ class DraftsAdapter( holder.binding.deleteButton.setOnClickListener { listener.onDeleteDraft(draft) } - holder.binding.draftSendingInfo.visible(draft.failedToSend) + holder.binding.draftSendingInfo.isVisible = draft.failedToSend - holder.binding.contentWarning.visible(!draft.contentWarning.isNullOrEmpty()) + holder.binding.contentWarning.isVisible = !draft.contentWarning.isNullOrEmpty() holder.binding.contentWarning.text = draft.contentWarning holder.binding.content.text = draft.content - holder.binding.draftMediaPreview.visible(draft.attachments.isNotEmpty()) + holder.binding.draftMediaPreview.isVisible = draft.attachments.isNotEmpty() (holder.binding.draftMediaPreview.adapter as DraftMediaAdapter).submitList(draft.attachments) if (draft.poll != null) { - holder.binding.draftPoll.show() + holder.binding.draftPoll.isVisible = true holder.binding.draftPoll.setPoll(draft.poll) } else { - holder.binding.draftPoll.hide() + holder.binding.draftPoll.isVisible = false } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsActivity.kt index 94a0b47efa..c989bd73ac 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/followedtags/FollowedTagsActivity.kt @@ -8,6 +8,7 @@ import android.util.Log import android.widget.AutoCompleteTextView import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import androidx.paging.LoadState @@ -25,10 +26,7 @@ import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.interfaces.HashtagActionListener import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.settings.PrefKeys -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import java.io.IOException @@ -90,7 +88,7 @@ class FollowedTagsActivity : binding.followedTagsView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { if (dy > 0 && binding.fab.isShown) { - binding.fab.hide() + binding.fab.isVisible = false } else if (dy < 0 && !binding.fab.isShown) { binding.fab.show() } @@ -102,11 +100,12 @@ class FollowedTagsActivity : private fun setupAdapter(): FollowedTagsAdapter { return FollowedTagsAdapter(this, viewModel).apply { addLoadStateListener { loadState -> - binding.followedTagsProgressBar.visible(loadState.refresh == LoadState.Loading && itemCount == 0) + binding.followedTagsProgressBar.isVisible = + (loadState.refresh == LoadState.Loading && itemCount == 0) if (loadState.refresh is LoadState.Error) { - binding.followedTagsView.hide() - binding.followedTagsMessageView.show() + binding.followedTagsView.isVisible = false + binding.followedTagsMessageView.isVisible = true val errorState = loadState.refresh as LoadState.Error if (errorState.error is IOException) { binding.followedTagsMessageView.setup(R.drawable.elephant_offline, R.string.error_network) { retry() } @@ -115,8 +114,8 @@ class FollowedTagsActivity : } Log.w(TAG, "error loading followed hashtags", errorState.error) } else { - binding.followedTagsView.show() - binding.followedTagsMessageView.hide() + binding.followedTagsView.isVisible = true + binding.followedTagsMessageView.isVisible = false } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt index ccfe52b3cc..1eefa69423 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/instancemute/fragment/InstanceListFragment.kt @@ -3,6 +3,7 @@ package com.keylesspalace.tusky.components.instancemute.fragment import android.os.Bundle import android.util.Log import android.view.View +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.DividerItemDecoration @@ -18,8 +19,6 @@ import com.keylesspalace.tusky.databinding.FragmentInstanceListBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.util.HttpHeaderLink -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.view.EndlessOnScrollListener import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -105,7 +104,7 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab return } fetching = true - binding.instanceProgressBar.show() + binding.instanceProgressBar.isVisible = true if (id != null) { binding.recyclerView.post { adapter.bottomLoading = true } @@ -132,7 +131,7 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab private fun onFetchInstancesSuccess(instances: List, linkHeader: String?) { adapter.bottomLoading = false - binding.instanceProgressBar.hide() + binding.instanceProgressBar.isVisible = false val links = HttpHeaderLink.parse(linkHeader) val next = HttpHeaderLink.findByRelationType(links, "next") @@ -142,32 +141,32 @@ class InstanceListFragment : Fragment(R.layout.fragment_instance_list), Injectab fetching = false if (adapter.itemCount == 0) { - binding.messageView.show() + binding.messageView.isVisible = true binding.messageView.setup( R.drawable.elephant_friend_empty, R.string.message_empty, null ) } else { - binding.messageView.hide() + binding.messageView.isVisible = false } } private fun onFetchInstancesFailure(throwable: Throwable) { fetching = false - binding.instanceProgressBar.hide() + binding.instanceProgressBar.isVisible = false Log.e(TAG, "Fetch failure", throwable) if (adapter.itemCount == 0) { - binding.messageView.show() + binding.messageView.isVisible = true if (throwable is IOException) { binding.messageView.setup(R.drawable.elephant_offline, R.string.error_network) { - binding.messageView.hide() + binding.messageView.isVisible = false this.fetchInstances(null) } } else { binding.messageView.setup(R.drawable.elephant_error, R.string.error_generic) { - binding.messageView.hide() + binding.messageView.isVisible = false this.fetchInstances(null) } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt index 443395be65..59fc9afd68 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt @@ -22,10 +22,10 @@ import android.os.Bundle import android.text.method.LinkMovementMethod import android.util.Log import android.view.Menu -import android.view.View import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.core.net.toUri +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import at.connyduck.calladapter.networkresult.fold import com.bumptech.glide.Glide @@ -322,11 +322,11 @@ class LoginActivity : BaseActivity(), Injectable { private fun setLoading(loadingState: Boolean) { if (loadingState) { - binding.loginLoadingLayout.visibility = View.VISIBLE - binding.loginInputLayout.visibility = View.GONE + binding.loginLoadingLayout.isVisible = true + binding.loginInputLayout.isVisible = false } else { - binding.loginLoadingLayout.visibility = View.GONE - binding.loginInputLayout.visibility = View.VISIBLE + binding.loginLoadingLayout.isVisible = false + binding.loginInputLayout.isVisible = true binding.loginButton.isEnabled = true } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt index b69f81e76c..16c9ad2e81 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt @@ -34,6 +34,7 @@ import androidx.activity.result.contract.ActivityResultContract import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog import androidx.core.net.toUri +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import com.keylesspalace.tusky.BaseActivity import com.keylesspalace.tusky.BuildConfig @@ -41,9 +42,7 @@ import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ActivityLoginWebviewBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import kotlinx.coroutines.launch import kotlinx.parcelize.Parcelize import javax.inject.Inject @@ -140,7 +139,7 @@ class LoginWebViewActivity : BaseActivity(), Injectable { webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { - binding.loginProgress.hide() + binding.loginProgress.isVisible = false } override fun onReceivedError( @@ -196,7 +195,7 @@ class LoginWebViewActivity : BaseActivity(), Injectable { lifecycleScope.launch { viewModel.instanceRules.collect { instanceRules -> - binding.loginRules.visible(instanceRules.isNotEmpty()) + binding.loginRules.isVisible = instanceRules.isNotEmpty() binding.loginRules.setOnClickListener { AlertDialog.Builder(this@LoginWebViewActivity) .setTitle(getString(R.string.instance_rule_title, data.domain)) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt b/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt index 4212046ad6..a2185209c6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/report/adapter/StatusViewHolder.kt @@ -18,6 +18,7 @@ package com.keylesspalace.tusky.components.report.adapter import android.text.Spanned import android.text.TextUtils import android.view.View +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.keylesspalace.tusky.R import com.keylesspalace.tusky.components.report.model.StatusViewState @@ -33,11 +34,9 @@ import com.keylesspalace.tusky.util.StatusViewHelper.Companion.COLLAPSE_INPUT_FI import com.keylesspalace.tusky.util.StatusViewHelper.Companion.NO_INPUT_FILTER import com.keylesspalace.tusky.util.emojify import com.keylesspalace.tusky.util.getRelativeTimeSpanString -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.setClickableMentions import com.keylesspalace.tusky.util.setClickableText import com.keylesspalace.tusky.util.shouldTrimStatus -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.viewdata.StatusViewData import com.keylesspalace.tusky.viewdata.toViewData import java.util.Date @@ -102,14 +101,21 @@ class StatusViewHolder( ) if (viewdata.spoilerText.isBlank()) { - setTextVisible(true, viewdata.content, viewdata.status.mentions, viewdata.status.tags, viewdata.status.emojis, adapterHandler) - binding.statusContentWarningButton.hide() - binding.statusContentWarningDescription.hide() + setTextVisible( + true, + viewdata.content, + viewdata.status.mentions, + viewdata.status.tags, + viewdata.status.emojis, + adapterHandler + ) + binding.statusContentWarningButton.isVisible = false + binding.statusContentWarningDescription.isVisible = false } else { val emojiSpoiler = viewdata.spoilerText.emojify(viewdata.status.emojis, binding.statusContentWarningDescription, statusDisplayOptions.animateEmojis) binding.statusContentWarningDescription.text = emojiSpoiler - binding.statusContentWarningDescription.show() - binding.statusContentWarningButton.show() + binding.statusContentWarningDescription.isVisible = true + binding.statusContentWarningButton.isVisible = true setContentWarningButtonText(viewState.isContentShow(viewdata.id, true)) binding.statusContentWarningButton.setOnClickListener { viewdata()?.let { viewdata -> @@ -147,11 +153,7 @@ class StatusViewHolder( } else { setClickableMentions(binding.statusContent, mentions, listener) } - if (binding.statusContent.text.isNullOrBlank()) { - binding.statusContent.hide() - } else { - binding.statusContent.show() - } + binding.statusContent.isVisible = !binding.statusContent.text.isNullOrBlank() } private fun setCreatedAt(createdAt: Date?) { @@ -179,7 +181,7 @@ class StatusViewHolder( } } - binding.buttonToggleContent.show() + binding.buttonToggleContent.isVisible = true if (collapsed) { binding.buttonToggleContent.setText(R.string.post_content_show_more) binding.statusContent.filters = COLLAPSE_INPUT_FILTER @@ -188,7 +190,7 @@ class StatusViewHolder( binding.statusContent.filters = NO_INPUT_FILTER } } else { - binding.buttonToggleContent.hide() + binding.buttonToggleContent.isVisible = false binding.statusContent.filters = NO_INPUT_FILTER } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportDoneFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportDoneFragment.kt index 0f8065776a..87af3d0853 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportDoneFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportDoneFragment.kt @@ -17,6 +17,7 @@ package com.keylesspalace.tusky.components.report.fragments import android.os.Bundle import android.view.View +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import com.keylesspalace.tusky.R @@ -26,8 +27,6 @@ import com.keylesspalace.tusky.databinding.FragmentReportDoneBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.util.Loading -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import javax.inject.Inject @@ -49,11 +48,11 @@ class ReportDoneFragment : Fragment(R.layout.fragment_report_done), Injectable { private fun subscribeObservables() { viewModel.muteState.observe(viewLifecycleOwner) { if (it !is Loading) { - binding.buttonMute.show() - binding.progressMute.show() + binding.buttonMute.isVisible = true + binding.progressMute.isVisible = true } else { - binding.buttonMute.hide() - binding.progressMute.hide() + binding.buttonMute.isVisible = false + binding.progressMute.isVisible = false } binding.buttonMute.setText( @@ -66,11 +65,11 @@ class ReportDoneFragment : Fragment(R.layout.fragment_report_done), Injectable { viewModel.blockState.observe(viewLifecycleOwner) { if (it !is Loading) { - binding.buttonBlock.show() - binding.progressBlock.show() + binding.buttonBlock.isVisible = true + binding.progressBlock.isVisible = true } else { - binding.buttonBlock.hide() - binding.progressBlock.hide() + binding.buttonBlock.isVisible = false + binding.progressBlock.isVisible = false } binding.buttonBlock.setText( when (it.data) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportNoteFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportNoteFragment.kt index 56f812a054..a4f98fd287 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportNoteFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportNoteFragment.kt @@ -17,6 +17,7 @@ package com.keylesspalace.tusky.components.report.fragments import android.os.Bundle import android.view.View +import androidx.core.view.isVisible import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -30,8 +31,6 @@ import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.util.Error import com.keylesspalace.tusky.util.Loading import com.keylesspalace.tusky.util.Success -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import java.io.IOException import javax.inject.Inject @@ -65,11 +64,11 @@ class ReportNoteFragment : Fragment(R.layout.fragment_report_note), Injectable { binding.editNote.setText(viewModel.reportNote) if (viewModel.isRemoteAccount) { - binding.checkIsNotifyRemote.show() - binding.reportDescriptionRemoteInstance.show() + binding.checkIsNotifyRemote.isVisible = true + binding.reportDescriptionRemoteInstance.isVisible = true } else { - binding.checkIsNotifyRemote.hide() - binding.reportDescriptionRemoteInstance.hide() + binding.checkIsNotifyRemote.isVisible = false + binding.reportDescriptionRemoteInstance.isVisible = false } if (viewModel.isRemoteAccount) @@ -92,7 +91,7 @@ class ReportNoteFragment : Fragment(R.layout.fragment_report_note), Injectable { binding.checkIsNotifyRemote.isEnabled = true binding.buttonReport.isEnabled = true binding.buttonBack.isEnabled = true - binding.progressBar.hide() + binding.progressBar.isVisible = false Snackbar.make(binding.buttonBack, if (error is IOException) R.string.error_network else R.string.error_generic, Snackbar.LENGTH_LONG) .setAction(R.string.action_retry) { @@ -110,7 +109,7 @@ class ReportNoteFragment : Fragment(R.layout.fragment_report_note), Injectable { binding.buttonBack.isEnabled = false binding.editNote.isEnabled = false binding.checkIsNotifyRemote.isEnabled = false - binding.progressBar.show() + binding.progressBar.isVisible = true } private fun handleClicks() { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportStatusesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportStatusesFragment.kt index 7210fbefc4..d2530b282b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportStatusesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/report/fragments/ReportStatusesFragment.kt @@ -19,6 +19,7 @@ import android.os.Bundle import android.view.View import androidx.core.app.ActivityOptionsCompat import androidx.core.view.ViewCompat +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope @@ -46,7 +47,6 @@ import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.CardViewMode import com.keylesspalace.tusky.util.StatusDisplayOptions import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import com.keylesspalace.tusky.viewdata.AttachmentViewData import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -140,9 +140,10 @@ class ReportStatusesFragment : Fragment(R.layout.fragment_report_statuses), Inje showError() } - binding.progressBarBottom.visible(loadState.append == LoadState.Loading) - binding.progressBarTop.visible(loadState.prepend == LoadState.Loading) - binding.progressBarLoading.visible(loadState.refresh == LoadState.Loading && !binding.swipeRefreshLayout.isRefreshing) + binding.progressBarBottom.isVisible = (loadState.append == LoadState.Loading) + binding.progressBarTop.isVisible = (loadState.prepend == LoadState.Loading) + binding.progressBarLoading.isVisible = + (loadState.refresh == LoadState.Loading && !binding.swipeRefreshLayout.isRefreshing) if (loadState.refresh != LoadState.Loading) { binding.swipeRefreshLayout.isRefreshing = false diff --git a/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusActivity.kt index ade93322f2..139013229c 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/scheduled/ScheduledStatusActivity.kt @@ -20,6 +20,7 @@ import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog +import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import androidx.paging.LoadState import androidx.recyclerview.widget.DividerItemDecoration @@ -34,8 +35,6 @@ import com.keylesspalace.tusky.databinding.ActivityScheduledStatusBinding import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.entity.ScheduledStatus -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -83,22 +82,22 @@ class ScheduledStatusActivity : BaseActivity(), ScheduledStatusActionListener, I adapter.addLoadStateListener { loadState -> if (loadState.refresh is LoadState.Error) { - binding.progressBar.hide() + binding.progressBar.isVisible = false binding.errorMessageView.setup(R.drawable.elephant_error, R.string.error_generic) { refreshStatuses() } - binding.errorMessageView.show() + binding.errorMessageView.isVisible = true } if (loadState.refresh != LoadState.Loading) { binding.swipeRefreshLayout.isRefreshing = false } if (loadState.refresh is LoadState.NotLoading) { - binding.progressBar.hide() + binding.progressBar.isVisible = false if (adapter.itemCount == 0) { binding.errorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_scheduled_posts) - binding.errorMessageView.show() + binding.errorMessageView.isVisible = true } else { - binding.errorMessageView.hide() + binding.errorMessageView.isVisible = false } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchFragment.kt index 3fe818cb99..dcd685b33d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchFragment.kt @@ -2,6 +2,7 @@ package com.keylesspalace.tusky.components.search.fragments import android.os.Bundle import android.view.View +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope @@ -24,7 +25,6 @@ import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.interfaces.LinkListener import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.util.viewBinding -import com.keylesspalace.tusky.util.visible import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -81,17 +81,20 @@ abstract class SearchFragment : val isNewSearch = currentQuery != viewModel.currentQuery - binding.searchProgressBar.visible(loadState.refresh == LoadState.Loading && isNewSearch && !binding.swipeRefreshLayout.isRefreshing) - binding.searchRecyclerView.visible(loadState.refresh is LoadState.NotLoading || !isNewSearch || binding.swipeRefreshLayout.isRefreshing) + binding.searchProgressBar.isVisible = + (loadState.refresh == LoadState.Loading && isNewSearch && !binding.swipeRefreshLayout.isRefreshing) + binding.searchRecyclerView.isVisible = + (loadState.refresh is LoadState.NotLoading || !isNewSearch || binding.swipeRefreshLayout.isRefreshing) if (loadState.refresh != LoadState.Loading) { binding.swipeRefreshLayout.isRefreshing = false currentQuery = viewModel.currentQuery } - binding.progressBarBottom.visible(loadState.append == LoadState.Loading) + binding.progressBarBottom.isVisible = (loadState.append == LoadState.Loading) - binding.searchNoResultsText.visible(loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0 && viewModel.currentQuery.isNotEmpty()) + binding.searchNoResultsText.isVisible = + (loadState.refresh is LoadState.NotLoading && adapter.itemCount == 0 && viewModel.currentQuery.isNotEmpty()) } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt index fe7b5d1459..e12a6d0ae7 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt @@ -22,6 +22,7 @@ import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityManager import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -59,8 +60,6 @@ import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.CardViewMode import com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate import com.keylesspalace.tusky.util.StatusDisplayOptions -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.unsafeLazy import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.viewdata.AttachmentViewData @@ -206,19 +205,24 @@ class TimelineFragment : binding.swipeRefreshLayout.isRefreshing = false } - binding.statusView.hide() - binding.progressBar.hide() + binding.statusView.isVisible = false + binding.progressBar.isVisible = false if (adapter.itemCount == 0) { when (loadState.refresh) { is LoadState.NotLoading -> { if (loadState.append is LoadState.NotLoading && loadState.source.refresh is LoadState.NotLoading) { - binding.statusView.show() - binding.statusView.setup(R.drawable.elephant_friend_empty, R.string.message_empty, null) + binding.statusView.isVisible = true + binding.statusView.setup( + R.drawable.elephant_friend_empty, + R.string.message_empty, + null + ) } } + is LoadState.Error -> { - binding.statusView.show() + binding.statusView.isVisible = true if ((loadState.refresh as LoadState.Error).error is IOException) { binding.statusView.setup(R.drawable.elephant_offline, R.string.error_network, null) @@ -227,7 +231,7 @@ class TimelineFragment : } } is LoadState.Loading -> { - binding.progressBar.show() + binding.progressBar.isVisible = true } } } @@ -265,7 +269,8 @@ class TimelineFragment : if (composeButton != null) { if (hideFab) { if (dy > 0 && composeButton.isShown) { - composeButton.hide() // hides the button if we're scrolling down + composeButton.isVisible = + false // hides the button if we're scrolling down } else if (dy < 0 && !composeButton.isShown) { composeButton.show() // shows it if we are scrolling up } @@ -347,7 +352,7 @@ class TimelineFragment : } override fun onRefresh() { - binding.statusView.hide() + binding.statusView.isVisible = false adapter.refresh() } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt index 41e404a90d..733d6284b0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/trending/TrendingFragment.kt @@ -24,6 +24,7 @@ import android.view.View import android.view.ViewGroup import android.view.accessibility.AccessibilityManager import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -47,8 +48,6 @@ import com.keylesspalace.tusky.interfaces.ActionButtonActivity import com.keylesspalace.tusky.interfaces.LinkListener import com.keylesspalace.tusky.interfaces.RefreshableFragment import com.keylesspalace.tusky.interfaces.ReselectableFragment -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.viewdata.TrendingViewData import kotlinx.coroutines.flow.collectLatest @@ -140,7 +139,7 @@ class TrendingFragment : } if (activity is ActionButtonActivity) { - (activity as ActionButtonActivity).actionButton?.visibility = View.GONE + (activity as ActionButtonActivity).actionButton?.isVisible = false } } @@ -205,8 +204,8 @@ class TrendingFragment : if (viewData.isEmpty()) { adapter.submitList(emptyList()) - binding.recyclerView.hide() - binding.messageView.show() + binding.recyclerView.isVisible = false + binding.messageView.isVisible = true binding.messageView.setup( R.drawable.elephant_friend_empty, R.string.message_empty, null @@ -216,28 +215,28 @@ class TrendingFragment : adapter.submitList(viewDataWithDates) - binding.recyclerView.show() - binding.messageView.hide() + binding.recyclerView.isVisible = true + binding.messageView.isVisible = false } - binding.progressBar.hide() + binding.progressBar.isVisible = false } private fun applyLoadingState() { - binding.recyclerView.hide() - binding.messageView.hide() - binding.progressBar.show() + binding.recyclerView.isVisible = false + binding.messageView.isVisible = false + binding.progressBar.isVisible = true } private fun clearLoadingState() { binding.swipeRefreshLayout.isRefreshing = false - binding.progressBar.hide() - binding.messageView.hide() + binding.progressBar.isVisible = false + binding.messageView.isVisible = false } private fun networkError() { - binding.recyclerView.hide() - binding.messageView.show() - binding.progressBar.hide() + binding.recyclerView.isVisible = false + binding.messageView.isVisible = true + binding.progressBar.isVisible = false binding.swipeRefreshLayout.isRefreshing = false binding.messageView.setup( @@ -247,9 +246,9 @@ class TrendingFragment : } private fun otherError() { - binding.recyclerView.hide() - binding.messageView.show() - binding.progressBar.hide() + binding.recyclerView.isVisible = false + binding.messageView.isVisible = true + binding.progressBar.isVisible = false binding.swipeRefreshLayout.isRefreshing = false binding.messageView.setup( @@ -278,7 +277,7 @@ class TrendingFragment : if (actionButtonPresent()) { val composeButton = (activity as ActionButtonActivity).actionButton - composeButton?.hide() + composeButton?.isVisible = false } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt index 84379e073d..4dbdd4291a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt @@ -22,6 +22,7 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.annotation.CheckResult +import androidx.core.view.isVisible import androidx.fragment.app.commit import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle @@ -46,9 +47,7 @@ import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.CardViewMode import com.keylesspalace.tusky.util.ListStatusAccessibilityDelegate import com.keylesspalace.tusky.util.StatusDisplayOptions -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.openLink -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import com.keylesspalace.tusky.viewdata.AttachmentViewData.Companion.list import com.keylesspalace.tusky.viewdata.StatusViewData @@ -156,8 +155,8 @@ class ViewThreadFragment : SFragment(), OnRefreshListener, StatusActionListener, is ThreadUiState.Loading -> { updateRevealButton(RevealButtonState.NO_BUTTON) - binding.recyclerView.hide() - binding.statusView.hide() + binding.recyclerView.isVisible = false + binding.statusView.isVisible = false initialProgressBar = getProgressBarJob(binding.initialProgressBar, 500) initialProgressBar.start() @@ -178,8 +177,8 @@ class ViewThreadFragment : SFragment(), OnRefreshListener, StatusActionListener, updateRevealButton(uiState.revealButton) binding.swipeRefreshLayout.isRefreshing = false - binding.recyclerView.show() - binding.statusView.hide() + binding.recyclerView.isVisible = true + binding.statusView.isVisible = false } is ThreadUiState.Error -> { Log.w(TAG, "failed to load status", uiState.throwable) @@ -189,8 +188,8 @@ class ViewThreadFragment : SFragment(), OnRefreshListener, StatusActionListener, updateRevealButton(RevealButtonState.NO_BUTTON) binding.swipeRefreshLayout.isRefreshing = false - binding.recyclerView.hide() - binding.statusView.show() + binding.recyclerView.isVisible = false + binding.statusView.isVisible = true if (uiState.throwable is IOException) { binding.statusView.setup(R.drawable.elephant_offline, R.string.error_network) { @@ -223,8 +222,8 @@ class ViewThreadFragment : SFragment(), OnRefreshListener, StatusActionListener, updateRevealButton(uiState.revealButton) binding.swipeRefreshLayout.isRefreshing = false - binding.recyclerView.show() - binding.statusView.hide() + binding.recyclerView.isVisible = true + binding.statusView.isVisible = false } is ThreadUiState.Refreshing -> { threadProgressBar.cancel() @@ -262,10 +261,10 @@ class ViewThreadFragment : SFragment(), OnRefreshListener, StatusActionListener, ) { try { delay(delayMs) - view.show() + view.isVisible = true awaitCancellation() } finally { - view.hide() + view.isVisible = false } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt index 88396bceb3..1a1ffe444b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt @@ -3,8 +3,8 @@ package com.keylesspalace.tusky.components.viewthread.edits import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide @@ -22,13 +22,10 @@ import com.keylesspalace.tusky.util.BindingHolder import com.keylesspalace.tusky.util.aspectRatios import com.keylesspalace.tusky.util.decodeBlurHash import com.keylesspalace.tusky.util.emojify -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.loadAvatar import com.keylesspalace.tusky.util.parseAsMastodonHtml import com.keylesspalace.tusky.util.setClickableText -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.unicodeWrap -import com.keylesspalace.tusky.util.visible import com.keylesspalace.tusky.viewdata.toViewData class ViewEditsAdapter( @@ -78,11 +75,11 @@ class ViewEditsAdapter( ).emojify(edit.account.emojis, binding.statusEditInfo, animateEmojis) if (edit.spoilerText.isEmpty()) { - binding.statusEditContentWarningDescription.hide() - binding.statusEditContentWarningSeparator.hide() + binding.statusEditContentWarningDescription.isVisible = false + binding.statusEditContentWarningSeparator.isVisible = false } else { - binding.statusEditContentWarningDescription.show() - binding.statusEditContentWarningSeparator.show() + binding.statusEditContentWarningDescription.isVisible = true + binding.statusEditContentWarningSeparator.isVisible = true binding.statusEditContentWarningDescription.text = edit.spoilerText.emojify( edit.emojis, binding.statusEditContentWarningDescription, @@ -94,10 +91,10 @@ class ViewEditsAdapter( setClickableText(binding.statusEditContent, emojifiedText, emptyList(), emptyList(), listener) if (edit.poll == null) { - binding.statusEditPollOptions.hide() - binding.statusEditPollDescription.hide() + binding.statusEditPollOptions.isVisible = false + binding.statusEditPollDescription.isVisible = false } else { - binding.statusEditPollOptions.show() + binding.statusEditPollOptions.isVisible = true // not used for now since not reported by the api // https://github.com/mastodon/mastodon/issues/22571 @@ -124,10 +121,10 @@ class ViewEditsAdapter( } if (edit.mediaAttachments.isEmpty()) { - binding.statusEditMediaPreview.hide() - binding.statusEditMediaSensitivity.hide() + binding.statusEditMediaPreview.isVisible = false + binding.statusEditMediaSensitivity.isVisible = false } else { - binding.statusEditMediaPreview.show() + binding.statusEditMediaPreview.isVisible = true binding.statusEditMediaPreview.aspectRatios = edit.mediaAttachments.aspectRatios() binding.statusEditMediaPreview.forEachIndexed { index, imageView, descriptionIndicator -> @@ -141,7 +138,7 @@ class ViewEditsAdapter( imageView.contentDescription = imageView.context.getString(R.string.action_view_media) } - descriptionIndicator.visibility = if (hasDescription) View.VISIBLE else View.GONE + descriptionIndicator.isVisible = hasDescription val blurhash = attachment.blurhash @@ -178,7 +175,7 @@ class ViewEditsAdapter( } } } - binding.statusEditMediaSensitivity.visible(edit.sensitive) + binding.statusEditMediaSensitivity.isVisible = edit.sensitive } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsFragment.kt index d02d017d57..4e7989f388 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsFragment.kt @@ -19,6 +19,7 @@ import android.os.Bundle import android.util.Log import android.view.View import android.widget.LinearLayout +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -35,8 +36,6 @@ import com.keylesspalace.tusky.di.Injectable import com.keylesspalace.tusky.di.ViewModelFactory import com.keylesspalace.tusky.interfaces.LinkListener import com.keylesspalace.tusky.settings.PrefKeys -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.show import com.keylesspalace.tusky.util.viewBinding import kotlinx.coroutines.launch import java.io.IOException @@ -80,16 +79,16 @@ class ViewEditsFragment : Fragment(R.layout.fragment_view_thread), LinkListener, when (uiState) { EditsUiState.Initial -> {} EditsUiState.Loading -> { - binding.recyclerView.hide() - binding.statusView.hide() - binding.initialProgressBar.show() + binding.recyclerView.isVisible = false + binding.statusView.isVisible = false + binding.initialProgressBar.isVisible = true } is EditsUiState.Error -> { Log.w(TAG, "failed to load edits", uiState.throwable) - binding.recyclerView.hide() - binding.statusView.show() - binding.initialProgressBar.hide() + binding.recyclerView.isVisible = false + binding.statusView.isVisible = true + binding.initialProgressBar.isVisible = false if (uiState.throwable is IOException) { binding.statusView.setup(R.drawable.elephant_offline, R.string.error_network) { @@ -102,9 +101,9 @@ class ViewEditsFragment : Fragment(R.layout.fragment_view_thread), LinkListener, } } is EditsUiState.Success -> { - binding.recyclerView.show() - binding.statusView.hide() - binding.initialProgressBar.hide() + binding.recyclerView.isVisible = true + binding.statusView.isVisible = false + binding.initialProgressBar.isVisible = false binding.recyclerView.adapter = ViewEditsAdapter( edits = uiState.edits, diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt index 28cf64ca34..700de8f88a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewImageFragment.kt @@ -26,6 +26,7 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.ImageView +import androidx.core.view.isVisible import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException @@ -35,8 +36,6 @@ import com.github.chrisbanes.photoview.PhotoViewAttacher import com.keylesspalace.tusky.ViewMediaActivity import com.keylesspalace.tusky.databinding.FragmentViewImageBinding import com.keylesspalace.tusky.entity.Attachment -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.visible import io.reactivex.rxjava3.subjects.BehaviorSubject import kotlin.math.abs @@ -74,7 +73,7 @@ class ViewImageFragment : ViewMediaFragment() { ) { binding.photoView.transitionName = url binding.mediaDescription.text = description - binding.captionSheet.visible(showingDescription) + binding.captionSheet.isVisible = (showingDescription) startedTransition = false loadImageFromNetwork(url, previewUrl, binding.photoView) @@ -184,7 +183,7 @@ class ViewImageFragment : ViewMediaFragment() { .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { if (_binding != null) { - binding.captionSheet.visible(isDescriptionVisible) + binding.captionSheet.isVisible = isDescriptionVisible } animation.removeListener(this) } @@ -267,7 +266,7 @@ class ViewImageFragment : ViewMediaFragment() { photoActionsListener.onBringUp() } // Hide progress bar only on fail request from internet - if (!isCacheRequest && _binding != null) binding.progressBar.hide() + if (!isCacheRequest && _binding != null) binding.progressBar.isVisible = false // We don't want to overwrite preview with null when main image fails to load return !isCacheRequest } @@ -281,7 +280,7 @@ class ViewImageFragment : ViewMediaFragment() { isFirstResource: Boolean ): Boolean { if (_binding != null) { - binding.progressBar.hide() // Always hide the progress bar on success + binding.progressBar.isVisible = false // Always hide the progress bar on success } if (!startedTransition || !shouldStartTransition) { diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt index 68dc6687a5..b917b433be 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/ViewVideoFragment.kt @@ -31,11 +31,10 @@ import android.view.View import android.view.ViewGroup import android.widget.MediaController import androidx.core.view.GestureDetectorCompat +import androidx.core.view.isVisible import com.keylesspalace.tusky.ViewMediaActivity import com.keylesspalace.tusky.databinding.FragmentViewVideoBinding import com.keylesspalace.tusky.entity.Attachment -import com.keylesspalace.tusky.util.hide -import com.keylesspalace.tusky.util.visible import com.keylesspalace.tusky.view.ExposedPlayPauseVideoView import kotlin.math.abs @@ -54,7 +53,7 @@ class ViewVideoFragment : ViewMediaFragment() { // Hoist toolbar hiding to activity so it can track state across different fragments // This is explicitly stored as runnable so that we pass it to the handler later for cancellation mediaActivity.onPhotoTap() - mediaController.hide() + mediaController.isVisible = false } private lateinit var mediaActivity: ViewMediaActivity private lateinit var mediaController: MediaController @@ -86,7 +85,7 @@ class ViewVideoFragment : ViewMediaFragment() { if (_binding != null) { handler.removeCallbacks(hideToolbar) binding.videoView.pause() - mediaController.hide() + mediaController.isVisible = false } } @@ -98,7 +97,7 @@ class ViewVideoFragment : ViewMediaFragment() { showingDescription: Boolean ) { binding.mediaDescription.text = description - binding.mediaDescription.visible(showingDescription) + binding.mediaDescription.isVisible = showingDescription binding.mediaDescription.movementMethod = ScrollingMovementMethod() // Ensure the description is visible over the video @@ -171,7 +170,7 @@ class ViewVideoFragment : ViewMediaFragment() { mediaController.show() } - binding.progressBar.hide() + binding.progressBar.isVisible = false mp.isLooping = true } @@ -260,14 +259,14 @@ class ViewVideoFragment : ViewMediaFragment() { if (isDescriptionVisible) { // If to be visible, need to make visible immediately and animate alpha binding.mediaDescription.alpha = 0.0f - binding.mediaDescription.visible(isDescriptionVisible) + binding.mediaDescription.isVisible = isDescriptionVisible } binding.mediaDescription.animate().alpha(alpha) .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { if (_binding != null) { - binding.mediaDescription.visible(isDescriptionVisible) + binding.mediaDescription.isVisible = isDescriptionVisible } animation.removeListener(this) } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt index 7594e8ed6f..2fb9b565e0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt @@ -24,6 +24,7 @@ import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.annotation.DrawableRes +import androidx.core.view.isVisible import com.bumptech.glide.Glide import com.google.android.material.color.MaterialColors import com.keylesspalace.tusky.R @@ -74,16 +75,16 @@ class StatusViewHelper(private val itemView: View) { val mediaLabel = itemView.findViewById(R.id.status_media_label) if (statusDisplayOptions.mediaPreviewEnabled) { // Hide the unused label. - mediaLabel.visibility = View.GONE + mediaLabel.isVisible = false } else { setMediaLabel(mediaLabel, attachments, sensitive, previewListener) // Hide all unused views. - mediaPreviews[0].visibility = View.GONE - mediaPreviews[1].visibility = View.GONE - mediaPreviews[2].visibility = View.GONE - mediaPreviews[3].visibility = View.GONE - sensitiveMediaWarning.visibility = View.GONE - sensitiveMediaShow.visibility = View.GONE + mediaPreviews[0].isVisible = false + mediaPreviews[1].isVisible = false + mediaPreviews[2].isVisible = false + mediaPreviews[3].isVisible = false + sensitiveMediaWarning.isVisible = false + sensitiveMediaShow.isVisible = false return } @@ -102,7 +103,7 @@ class StatusViewHelper(private val itemView: View) { mediaPreviews[i].contentDescription = description } - mediaPreviews[i].visibility = View.VISIBLE + mediaPreviews[i].isVisible = true if (TextUtils.isEmpty(previewUrl)) { Glide.with(mediaPreviews[i]) @@ -146,13 +147,8 @@ class StatusViewHelper(private val itemView: View) { } val type = attachment.type - if (showingContent && + mediaOverlays[i].isVisible = showingContent && (type === Attachment.Type.VIDEO) or (type === Attachment.Type.GIFV) - ) { - mediaOverlays[i].visibility = View.VISIBLE - } else { - mediaOverlays[i].visibility = View.GONE - } mediaPreviews[i].setOnClickListener { v -> previewListener.onViewMedia(v, i) @@ -169,8 +165,8 @@ class StatusViewHelper(private val itemView: View) { } } if (attachments.isEmpty()) { - sensitiveMediaWarning.visibility = View.GONE - sensitiveMediaShow.visibility = View.GONE + sensitiveMediaWarning.isVisible = false + sensitiveMediaShow.isVisible = false } else { sensitiveMediaWarning.text = if (sensitive) { context.getString(R.string.post_sensitive_media_title) @@ -178,12 +174,12 @@ class StatusViewHelper(private val itemView: View) { context.getString(R.string.post_media_hidden_title) } - sensitiveMediaWarning.visibility = if (showingContent) View.GONE else View.VISIBLE - sensitiveMediaShow.visibility = if (showingContent) View.VISIBLE else View.GONE + sensitiveMediaWarning.isVisible = !showingContent + sensitiveMediaShow.isVisible = showingContent sensitiveMediaShow.setOnClickListener { v -> previewListener.onContentHiddenChange(false) - v.visibility = View.GONE - sensitiveMediaWarning.visibility = View.VISIBLE + v.isVisible = false + sensitiveMediaWarning.isVisible = true setMediasPreview( statusDisplayOptions, attachments, sensitive, previewListener, false, mediaPreviewHeight @@ -191,8 +187,8 @@ class StatusViewHelper(private val itemView: View) { } sensitiveMediaWarning.setOnClickListener { v -> previewListener.onContentHiddenChange(true) - v.visibility = View.GONE - sensitiveMediaShow.visibility = View.VISIBLE + v.isVisible = false + sensitiveMediaShow.isVisible = true setMediasPreview( statusDisplayOptions, attachments, sensitive, previewListener, true, mediaPreviewHeight @@ -202,7 +198,7 @@ class StatusViewHelper(private val itemView: View) { // Hide any of the placeholder previews beyond the ones set. for (i in n until Status.MAX_MEDIA_ATTACHMENTS) { - mediaPreviews[i].visibility = View.GONE + mediaPreviews[i].isVisible = false } } @@ -213,10 +209,10 @@ class StatusViewHelper(private val itemView: View) { listener: MediaPreviewListener ) { if (attachments.isEmpty()) { - mediaLabel.visibility = View.GONE + mediaLabel.isVisible = false return } - mediaLabel.visibility = View.VISIBLE + mediaLabel.isVisible = true // Set the label's text. val context = mediaLabel.context @@ -265,15 +261,15 @@ class StatusViewHelper(private val itemView: View) { if (poll == null) { for (pollResult in pollResults) { - pollResult.visibility = View.GONE + pollResult.isVisible = false } - pollDescription.visibility = View.GONE + pollDescription.isVisible = false } else { val timestamp = System.currentTimeMillis() setupPollResult(poll, emojis, pollResults, statusDisplayOptions.animateEmojis) - pollDescription.visibility = View.VISIBLE + pollDescription.isVisible = true pollDescription.text = getPollInfoText(timestamp, poll, pollDescription, statusDisplayOptions.useAbsoluteTime) } } @@ -310,7 +306,7 @@ class StatusViewHelper(private val itemView: View) { val pollOptionText = buildDescription(options[i].title, percent, options[i].voted, pollResults[i].context) pollResults[i].text = pollOptionText.emojify(emojis, pollResults[i], animateEmojis) - pollResults[i].visibility = View.VISIBLE + pollResults[i].isVisible = true val level = percent * 100 val optionColor = if (options[i].voted) { @@ -322,7 +318,7 @@ class StatusViewHelper(private val itemView: View) { pollResults[i].background.level = level pollResults[i].background.setTint(pollResults[i].context.getColor(optionColor)) } else { - pollResults[i].visibility = View.GONE + pollResults[i].isVisible = false } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt b/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt index 3e56c68b69..c4e3d6fe52 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/ViewExtensions.kt @@ -19,23 +19,10 @@ package com.keylesspalace.tusky.util import android.text.Editable import android.text.TextWatcher import android.util.Log -import android.view.View import android.widget.EditText import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -fun View.show() { - this.visibility = View.VISIBLE -} - -fun View.hide() { - this.visibility = View.GONE -} - -fun View.visible(visible: Boolean, or: Int = View.GONE) { - this.visibility = if (visible) View.VISIBLE else or -} - open class DefaultTextWatcher : TextWatcher { override fun afterTextChanged(s: Editable) { } diff --git a/app/src/main/java/com/keylesspalace/tusky/view/BackgroundMessageView.kt b/app/src/main/java/com/keylesspalace/tusky/view/BackgroundMessageView.kt index 82860f9fce..ca2f417648 100644 --- a/app/src/main/java/com/keylesspalace/tusky/view/BackgroundMessageView.kt +++ b/app/src/main/java/com/keylesspalace/tusky/view/BackgroundMessageView.kt @@ -8,9 +8,9 @@ import android.view.View import android.widget.LinearLayout import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.core.view.isVisible import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.ViewBackgroundMessageBinding -import com.keylesspalace.tusky.util.visible /** * This view is used for screens with downloadable content which may fail. @@ -45,6 +45,6 @@ class BackgroundMessageView @JvmOverloads constructor( binding.messageTextView.setText(messageRes) binding.imageView.setImageResource(imageRes) binding.button.setOnClickListener(clickListener) - binding.button.visible(clickListener != null) + binding.button.isVisible = (clickListener != null) } } diff --git a/app/src/main/java/com/keylesspalace/tusky/view/LicenseCard.kt b/app/src/main/java/com/keylesspalace/tusky/view/LicenseCard.kt index 6d553a26c7..b989bbebee 100644 --- a/app/src/main/java/com/keylesspalace/tusky/view/LicenseCard.kt +++ b/app/src/main/java/com/keylesspalace/tusky/view/LicenseCard.kt @@ -20,11 +20,11 @@ import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater import androidx.core.content.res.use +import androidx.core.view.isVisible import com.google.android.material.card.MaterialCardView import com.google.android.material.color.MaterialColors import com.keylesspalace.tusky.R import com.keylesspalace.tusky.databinding.CardLicenseBinding -import com.keylesspalace.tusky.util.hide import com.keylesspalace.tusky.util.openLink class LicenseCard @@ -52,7 +52,7 @@ class LicenseCard binding.licenseCardName.text = name binding.licenseCardLicense.text = license if (link.isNullOrBlank()) { - binding.licenseCardLink.hide() + binding.licenseCardLink.isVisible = false } else { binding.licenseCardLink.text = link setOnClickListener { context.openLink(link) }