Merge branch 'develop' into refactor/dagger_hilt

# Conflicts:
#	app/src/main/java/com/keylesspalace/tusky/components/accountlist/AccountListActivity.kt
#	app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt
This commit is contained in:
Christophe Beyls 2024-05-05 16:59:11 +02:00
commit bc47e72248
70 changed files with 154 additions and 152 deletions

View File

@ -1,7 +1,6 @@
package com.keylesspalace.tusky
import androidx.room.testing.MigrationTestHelper
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.keylesspalace.tusky.db.AppDatabase
@ -19,8 +18,7 @@ class MigrationsTest {
@Rule
var helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
AppDatabase::class.java.canonicalName!!,
FrameworkSQLiteOpenHelperFactory()
AppDatabase::class.java
)
@Test

View File

@ -45,7 +45,6 @@ import androidx.appcompat.content.res.AppCompatResources
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.IntentCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.view.GravityCompat
import androidx.core.view.MenuProvider
@ -107,6 +106,7 @@ import com.keylesspalace.tusky.util.ShareShortcutHelper
import com.keylesspalace.tusky.util.deleteStaleCachedMedia
import com.keylesspalace.tusky.util.emojify
import com.keylesspalace.tusky.util.getDimension
import com.keylesspalace.tusky.util.getParcelableExtraCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.reduceSwipeSensitivity
import com.keylesspalace.tusky.util.show
@ -529,11 +529,8 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {
}
private fun forwardToComposeActivity(intent: Intent) {
val composeOptions = IntentCompat.getParcelableExtra(
intent,
COMPOSE_OPTIONS,
ComposeActivity.ComposeOptions::class.java
)
val composeOptions =
intent.getParcelableExtraCompat<ComposeActivity.ComposeOptions>(COMPOSE_OPTIONS)
val composeIntent = if (composeOptions != null) {
ComposeActivity.startIntent(this, composeOptions)

View File

@ -216,8 +216,8 @@ class StatusListActivity : BottomSheetActivity() {
}
updateTagMuteState(mutedFilterV1 != null)
},
{ throwable ->
Log.e(TAG, "Error getting filters: $throwable")
{ throwable2 ->
Log.e(TAG, "Error getting filters: $throwable2")
}
)
} else {
@ -289,13 +289,13 @@ class StatusListActivity : BottomSheetActivity() {
eventHub.dispatch(PreferenceChangedEvent(filter.context[0]))
filterCreateSuccess = true
},
{ throwable ->
{ throwable2 ->
Snackbar.make(
binding.root,
getString(R.string.error_muting_hashtag_format, tag),
Snackbar.LENGTH_SHORT
).show()
Log.e(TAG, "Failed to mute #$tag", throwable)
Log.e(TAG, "Failed to mute #$tag", throwable2)
}
)
} else {

View File

@ -40,7 +40,6 @@ import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ShareCompat
import androidx.core.content.FileProvider
import androidx.core.content.IntentCompat
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.lifecycleScope
import androidx.viewpager2.adapter.FragmentStateAdapter
@ -54,6 +53,7 @@ import com.keylesspalace.tusky.fragment.ViewImageFragment
import com.keylesspalace.tusky.fragment.ViewVideoFragment
import com.keylesspalace.tusky.pager.ImagePagerAdapter
import com.keylesspalace.tusky.pager.SingleImagePagerAdapter
import com.keylesspalace.tusky.util.getParcelableArrayListExtraCompat
import com.keylesspalace.tusky.util.getTemporaryMediaFilename
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
import com.keylesspalace.tusky.util.submitAsync
@ -113,11 +113,7 @@ class ViewMediaActivity :
supportPostponeEnterTransition()
// Gather the parameters.
attachments = IntentCompat.getParcelableArrayListExtra(
intent,
EXTRA_ATTACHMENTS,
AttachmentViewData::class.java
)
attachments = intent.getParcelableArrayListExtraCompat(EXTRA_ATTACHMENTS)
val initialPosition = intent.getIntExtra(EXTRA_ATTACHMENT_INDEX, 0)
// Adapter is actually of existential type PageAdapter & SharedElementsTransitionListener

View File

@ -200,7 +200,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
TouchDelegateHelper.expandTouchSizeToFillRow((ViewGroup) itemView, CollectionsKt.listOfNotNull(replyButton, reblogButton, favouriteButton, bookmarkButton, moreButton));
}
protected void setDisplayName(@NonNull String name, @Nullable List<Emoji> customEmojis, @NonNull StatusDisplayOptions statusDisplayOptions) {
protected void setDisplayName(@NonNull String name, @NonNull List<Emoji> customEmojis, @NonNull StatusDisplayOptions statusDisplayOptions) {
CharSequence emojifiedName = CustomEmojiHelper.emojify(
name, customEmojis, displayName, statusDisplayOptions.animateEmojis()
);
@ -790,7 +790,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
if (statusDisplayOptions.mediaPreviewEnabled() && hasPreviewableAttachment(attachments)) {
setMediaPreviews(attachments, sensitive, listener, status.isShowingContent(), statusDisplayOptions.useBlurhash());
if (attachments.size() == 0) {
if (attachments.isEmpty()) {
hideSensitiveMediaWarning();
}
// Hide the unused label.
@ -877,7 +877,14 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
}
}
filteredPlaceholderLabel.setText(itemView.getContext().getString(R.string.status_filter_placeholder_label_format, matchedFilter.getTitle()));
final String matchedFilterTitle;
if (matchedFilter == null) {
matchedFilterTitle = "";
} else {
matchedFilterTitle = matchedFilter.getTitle();
}
filteredPlaceholderLabel.setText(itemView.getContext().getString(R.string.status_filter_placeholder_label_format, matchedFilterTitle));
filteredPlaceholderShowButton.setOnClickListener(view -> listener.clearWarningAction(getBindingAdapterPosition()));
}
@ -1154,7 +1161,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
final Card card = actionable.getCard();
if (cardViewMode != CardViewMode.NONE &&
actionable.getAttachments().size() == 0 &&
actionable.getAttachments().isEmpty() &&
actionable.getPoll() == null &&
card != null &&
!TextUtils.isEmpty(card.getUrl()) &&

View File

@ -9,13 +9,11 @@ import android.text.method.LinkMovementMethod;
import android.text.style.DynamicDrawableSpan;
import android.text.style.ImageSpan;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.ViewUtils;
import androidx.recyclerview.widget.RecyclerView;
import com.keylesspalace.tusky.R;
@ -25,7 +23,6 @@ import com.keylesspalace.tusky.util.CardViewMode;
import com.keylesspalace.tusky.util.LinkHelper;
import com.keylesspalace.tusky.util.NoUnderlineURLSpan;
import com.keylesspalace.tusky.util.StatusDisplayOptions;
import com.keylesspalace.tusky.util.ViewExtensionsKt;
import com.keylesspalace.tusky.viewdata.StatusViewData;
import java.text.DateFormat;

View File

@ -22,6 +22,7 @@ import androidx.fragment.app.commit
import com.keylesspalace.tusky.BottomSheetActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ActivityAccountListBinding
import com.keylesspalace.tusky.util.getSerializableExtraCompat
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
@ -42,7 +43,7 @@ class AccountListActivity : BottomSheetActivity() {
val binding = ActivityAccountListBinding.inflate(layoutInflater)
setContentView(binding.root)
val type = intent.getSerializableExtra(EXTRA_TYPE) as Type
val type = intent.getSerializableExtraCompat<Type>(EXTRA_TYPE)!!
val id: String? = intent.getStringExtra(EXTRA_ID)
setSupportActionBar(binding.includedToolbar.toolbar)

View File

@ -49,6 +49,7 @@ import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.util.HttpHeaderLink
import com.keylesspalace.tusky.util.getSerializableCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
@ -83,7 +84,7 @@ class AccountListFragment :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
type = requireArguments().getSerializable(ARG_TYPE) as Type
type = requireArguments().getSerializableCompat(ARG_TYPE)!!
id = requireArguments().getString(ARG_ID)
}
@ -244,12 +245,12 @@ class AccountListFragment :
Log.e(TAG, "Failed to $verb account accountId $accountId")
}
override fun onRespondToFollowRequest(accept: Boolean, accountId: String, position: Int) {
override fun onRespondToFollowRequest(accept: Boolean, id: String, position: Int) {
viewLifecycleOwner.lifecycleScope.launch {
if (accept) {
api.authorizeFollowRequest(accountId)
api.authorizeFollowRequest(id)
} else {
api.rejectFollowRequest(accountId)
api.rejectFollowRequest(id)
}.fold(
onSuccess = {
onRespondToFollowRequestSuccess(position)
@ -260,7 +261,7 @@ class AccountListFragment :
} else {
"reject"
}
Log.e(TAG, "Failed to $verb account id $accountId.", throwable)
Log.e(TAG, "Failed to $verb account id $id.", throwable)
}
)
}

View File

@ -22,8 +22,6 @@ import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.Bitmap
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import android.icu.text.BreakIterator
import android.net.Uri
import android.os.Build
@ -50,9 +48,7 @@ import androidx.annotation.StringRes
import androidx.annotation.VisibleForTesting
import androidx.appcompat.app.AlertDialog
import androidx.core.content.FileProvider
import androidx.core.content.IntentCompat
import androidx.core.content.res.use
import androidx.core.os.BundleCompat
import androidx.core.view.ContentInfoCompat
import androidx.core.view.OnReceiveContentListener
import androidx.core.view.isGone
@ -98,6 +94,10 @@ import com.keylesspalace.tusky.util.PickMediaFiles
import com.keylesspalace.tusky.util.getInitialLanguages
import com.keylesspalace.tusky.util.getLocaleList
import com.keylesspalace.tusky.util.getMediaSize
import com.keylesspalace.tusky.util.getParcelableArrayListExtraCompat
import com.keylesspalace.tusky.util.getParcelableCompat
import com.keylesspalace.tusky.util.getParcelableExtraCompat
import com.keylesspalace.tusky.util.getSerializableCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.highlightSpans
import com.keylesspalace.tusky.util.loadAvatar
@ -284,11 +284,7 @@ class ComposeActivity :
/* If the composer is started up as a reply to another post, override the "starting" state
* based on what the intent from the reply request passes. */
val composeOptions: ComposeOptions? = IntentCompat.getParcelableExtra(
intent,
COMPOSE_OPTIONS_EXTRA,
ComposeOptions::class.java
)
val composeOptions: ComposeOptions? = intent.getParcelableExtraCompat(COMPOSE_OPTIONS_EXTRA)
viewModel.setup(composeOptions)
setupButtons()
@ -322,11 +318,9 @@ class ComposeActivity :
/* Finally, overwrite state with data from saved instance state. */
savedInstanceState?.let {
photoUploadUri = BundleCompat.getParcelable(it, PHOTO_UPLOAD_URI_KEY, Uri::class.java)
photoUploadUri = it.getParcelableCompat(PHOTO_UPLOAD_URI_KEY)
(it.getSerializable(VISIBILITY_KEY) as Status.Visibility).apply {
setStatusVisibility(this)
}
setStatusVisibility(it.getSerializableCompat(VISIBILITY_KEY)!!)
it.getBoolean(CONTENT_WARNING_VISIBLE_KEY).apply {
viewModel.contentWarningChanged(this)
@ -351,22 +345,15 @@ class ComposeActivity :
if (type.startsWith("image/") || type.startsWith("video/") || type.startsWith("audio/")) {
when (intent.action) {
Intent.ACTION_SEND -> {
IntentCompat.getParcelableExtra(
intent,
Intent.EXTRA_STREAM,
Uri::class.java
)?.let { uri ->
intent.getParcelableExtraCompat<Uri>(Intent.EXTRA_STREAM)?.let { uri ->
pickMedia(uri)
}
}
Intent.ACTION_SEND_MULTIPLE -> {
IntentCompat.getParcelableArrayListExtra(
intent,
Intent.EXTRA_STREAM,
Uri::class.java
)?.forEach { uri ->
pickMedia(uri)
}
intent.getParcelableArrayListExtraCompat<Uri>(Intent.EXTRA_STREAM)
?.forEach { uri ->
pickMedia(uri)
}
}
}
}
@ -851,7 +838,7 @@ class ComposeActivity :
)
}
}
binding.composeHideMediaButton.drawable.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
binding.composeHideMediaButton.drawable.setTint(color)
var oneMediaWithoutDescription = false
for (media in viewModel.media.value) {
@ -877,7 +864,7 @@ class ComposeActivity :
} else {
getColor(R.color.tusky_blue)
}
binding.composeScheduleButton.drawable.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
binding.composeScheduleButton.drawable.setTint(color)
}
}
@ -1179,7 +1166,7 @@ class ComposeActivity :
}
)
binding.addPollTextActionTextView.setTextColor(textColor)
binding.addPollTextActionTextView.compoundDrawablesRelative[0].colorFilter = PorterDuffColorFilter(textColor, PorterDuff.Mode.SRC_IN)
binding.addPollTextActionTextView.compoundDrawablesRelative[0].setTint(textColor)
}
private fun editImageInQueue(item: QueuedMedia) {
@ -1270,7 +1257,7 @@ class ComposeActivity :
android.R.attr.textColorTertiary
)
}
binding.composeContentWarningButton.drawable.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
binding.composeContentWarningButton.drawable.setTint(color)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {

View File

@ -25,7 +25,6 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.LinearLayout
import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import com.bumptech.glide.Glide
@ -34,6 +33,7 @@ import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.DialogImageDescriptionBinding
import com.keylesspalace.tusky.util.getParcelableCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.viewBinding
@ -82,7 +82,7 @@ class CaptionDialog : DialogFragment() {
isCancelable = true
val previewUri = BundleCompat.getParcelable(requireArguments(), PREVIEW_URI_ARG, Uri::class.java) ?: error("Preview Uri is null")
val previewUri = arguments?.getParcelableCompat<Uri>(PREVIEW_URI_ARG) ?: error("Preview Uri is null")
// Load the image and manually set it into the ImageView because it doesn't have a fixed size.
Glide.with(this)

View File

@ -80,7 +80,11 @@ public class ConversationViewHolder extends StatusBaseViewHolder {
setupCollapsedState(statusViewData.isCollapsible(), statusViewData.isCollapsed(), statusViewData.isExpanded(), status.getSpoilerText(), listener);
setDisplayName(account.getDisplayName(), account.getEmojis(), statusDisplayOptions);
String displayName = account.getDisplayName();
if (displayName == null) {
displayName = "";
}
setDisplayName(displayName, account.getEmojis(), statusDisplayOptions);
setUsername(account.getUsername());
setMetaData(statusViewData, statusDisplayOptions, listener);
setIsReply(status.getInReplyToId() != null);
@ -92,7 +96,7 @@ public class ConversationViewHolder extends StatusBaseViewHolder {
setMediaPreviews(attachments, sensitive, listener, statusViewData.isShowingContent(),
statusDisplayOptions.useBlurhash());
if (attachments.size() == 0) {
if (attachments.isEmpty()) {
hideSensitiveMediaWarning();
}
// Hide the unused label.

View File

@ -8,7 +8,6 @@ import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.core.content.IntentCompat
import androidx.core.view.size
import androidx.core.widget.doAfterTextChanged
import androidx.lifecycle.lifecycleScope
@ -25,6 +24,7 @@ import com.keylesspalace.tusky.databinding.DialogFilterBinding
import com.keylesspalace.tusky.entity.Filter
import com.keylesspalace.tusky.entity.FilterKeyword
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.getParcelableExtraCompat
import com.keylesspalace.tusky.util.isHttpNotFound
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.util.visible
@ -51,7 +51,7 @@ class EditFilterActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
originalFilter = IntentCompat.getParcelableExtra(intent, FILTER_TO_EDIT, Filter::class.java)
originalFilter = intent.getParcelableExtraCompat(FILTER_TO_EDIT)
filter = originalFilter ?: Filter("", "", listOf(), null, Filter.Action.WARN.action, listOf())
binding.apply {
contextSwitches = mapOf(

View File

@ -33,13 +33,13 @@ import android.webkit.WebViewClient
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.core.content.IntentCompat
import androidx.core.net.toUri
import androidx.lifecycle.lifecycleScope
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.BuildConfig
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.databinding.ActivityLoginWebviewBinding
import com.keylesspalace.tusky.util.getParcelableExtraCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.util.visible
@ -60,9 +60,8 @@ class OauthLogin : ActivityResultContract<LoginData, LoginResult>() {
return if (resultCode == Activity.RESULT_CANCELED) {
LoginResult.Cancel
} else {
intent?.let {
IntentCompat.getParcelableExtra(it, RESULT_EXTRA, LoginResult::class.java)
} ?: LoginResult.Err("failed parsing LoginWebViewActivity result")
intent?.getParcelableExtraCompat(RESULT_EXTRA)
?: LoginResult.Err("failed parsing LoginWebViewActivity result")
}
}
@ -71,7 +70,7 @@ class OauthLogin : ActivityResultContract<LoginData, LoginResult>() {
private const val DATA_EXTRA = "data"
fun parseData(intent: Intent): LoginData {
return IntentCompat.getParcelableExtra(intent, DATA_EXTRA, LoginData::class.java)!!
return intent.getParcelableExtraCompat(DATA_EXTRA)!!
}
fun makeResultIntent(result: LoginResult): Intent {

View File

@ -51,11 +51,11 @@ class LoginWebViewViewModel @Inject constructor(
{ instance ->
_instanceRules.value = instance.rules.map { rule -> rule.text }
},
{ throwable ->
{ throwable2 ->
Log.w(
"LoginWebViewViewModel",
"failed to load instance info",
throwable
throwable2
)
}
)

View File

@ -18,7 +18,6 @@
package com.keylesspalace.tusky.components.notifications
import android.content.Context
import android.graphics.PorterDuff
import android.graphics.Typeface
import android.graphics.drawable.Drawable
import android.text.InputFilter
@ -175,7 +174,7 @@ internal class StatusNotificationViewHolder(
@ColorRes color: Int
): Drawable? {
val icon = ContextCompat.getDrawable(context, drawable)
icon?.setColorFilter(context.getColor(color), PorterDuff.Mode.SRC_ATOP)
icon?.setTint(context.getColor(color))
return icon
}

View File

@ -108,7 +108,6 @@ class PreferencesActivity :
pref.fragment!!
)
fragment.arguments = args
fragment.setTargetFragment(caller, 0)
supportFragmentManager.commit {
setCustomAnimations(
R.anim.activity_open_enter,

View File

@ -157,7 +157,7 @@ class AccountManager @Inject constructor(db: AppDatabase) {
it.defaultPostPrivacy = account.source?.privacy ?: Status.Visibility.PUBLIC
it.defaultPostLanguage = account.source?.language.orEmpty()
it.defaultMediaSensitivity = account.source?.sensitive ?: false
it.emojis = account.emojis.orEmpty()
it.emojis = account.emojis
it.locked = account.locked
Log.d(TAG, "updateActiveAccount: saving account with id " + it.id)

View File

@ -28,7 +28,6 @@ import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.core.os.BundleCompat
import androidx.lifecycle.lifecycleScope
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
@ -39,6 +38,7 @@ import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.ViewMediaActivity
import com.keylesspalace.tusky.databinding.FragmentViewImageBinding
import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.util.getParcelableCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.util.visible
@ -100,12 +100,8 @@ class ViewImageFragment : ViewMediaFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val arguments = this.requireArguments()
val attachment = BundleCompat.getParcelable(
arguments,
ARG_ATTACHMENT,
Attachment::class.java
)
val arguments = requireArguments()
val attachment = arguments.getParcelableCompat<Attachment>(ARG_ATTACHMENT)
this.shouldStartTransition = arguments.getBoolean(ARG_START_POSTPONED_TRANSITION)
val url: String?
var description: String? = null
@ -231,7 +227,7 @@ class ViewImageFragment : ViewMediaFragment() {
}
override fun onToolbarVisibilityChange(visible: Boolean) {
if (!userVisibleHint) return
if (view == null) return
isDescriptionVisible = showingDescription && visible
val alpha = if (isDescriptionVisible) 1.0f else 0.0f

View File

@ -100,6 +100,7 @@ abstract class ViewMediaFragment : Fragment() {
override fun onDestroyView() {
toolbarVisibilityDisposable?.invoke()
toolbarVisibilityDisposable = null
super.onDestroyView()
}
}

View File

@ -51,6 +51,7 @@ import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.ViewMediaActivity
import com.keylesspalace.tusky.databinding.FragmentViewVideoBinding
import com.keylesspalace.tusky.entity.Attachment
import com.keylesspalace.tusky.util.getParcelableCompat
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.util.visible
@ -131,7 +132,7 @@ class ViewVideoFragment : ViewMediaFragment() {
@SuppressLint("ClickableViewAccessibility")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val attachment = arguments?.getParcelable<Attachment>(ARG_ATTACHMENT)
val attachment = arguments?.getParcelableCompat<Attachment>(ARG_ATTACHMENT)
?: throw IllegalArgumentException("attachment has to be set")
val url = attachment.url
@ -378,7 +379,7 @@ class ViewVideoFragment : ViewMediaFragment() {
}
override fun onToolbarVisibilityChange(visible: Boolean) {
if (!userVisibleHint) {
if (view == null) {
return
}

View File

@ -29,6 +29,7 @@ import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.service.SendStatusService
import com.keylesspalace.tusky.service.StatusToSend
import com.keylesspalace.tusky.util.getSerializableExtraCompat
import com.keylesspalace.tusky.util.randomAlphanumericString
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@ -53,9 +54,8 @@ class SendStatusBroadcastReceiver : BroadcastReceiver() {
NotificationHelper.KEY_SENDER_ACCOUNT_FULL_NAME
)
val citedStatusId = intent.getStringExtra(NotificationHelper.KEY_CITED_STATUS_ID)
val visibility = intent.getSerializableExtra(
NotificationHelper.KEY_VISIBILITY
) as Status.Visibility
val visibility =
intent.getSerializableExtraCompat<Status.Visibility>(NotificationHelper.KEY_VISIBILITY)!!
val spoiler = intent.getStringExtra(NotificationHelper.KEY_SPOILER).orEmpty()
val mentions = intent.getStringArrayExtra(NotificationHelper.KEY_MENTIONS).orEmpty()

View File

@ -31,7 +31,6 @@ import android.util.Log
import androidx.annotation.StringRes
import androidx.core.app.NotificationCompat
import androidx.core.app.ServiceCompat
import androidx.core.content.IntentCompat
import at.connyduck.calladapter.networkresult.fold
import com.keylesspalace.tusky.MainActivity
import com.keylesspalace.tusky.R
@ -51,6 +50,7 @@ import com.keylesspalace.tusky.entity.NewStatus
import com.keylesspalace.tusky.entity.ScheduledStatus
import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.getParcelableExtraCompat
import com.keylesspalace.tusky.util.unsafeLazy
import dagger.hilt.android.AndroidEntryPoint
import java.util.concurrent.ConcurrentHashMap
@ -97,7 +97,7 @@ class SendStatusService : Service() {
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
if (intent.hasExtra(KEY_STATUS)) {
val statusToSend: StatusToSend = IntentCompat.getParcelableExtra(intent, KEY_STATUS, StatusToSend::class.java)
val statusToSend: StatusToSend = intent.getParcelableExtraCompat(KEY_STATUS)
?: throw IllegalStateException("SendStatusService started without $KEY_STATUS extra")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -242,11 +242,11 @@ class SendStatusService : Service() {
scheduledAt = statusToSend.scheduledAt,
poll = statusToSend.poll,
language = statusToSend.language,
mediaAttributes = media.map { media ->
mediaAttributes = media.map { mediaItem ->
MediaAttribute(
id = media.id!!,
description = media.description,
focus = media.focus?.toMastodonApiString(),
id = mediaItem.id!!,
description = mediaItem.description,
focus = mediaItem.focus?.toMastodonApiString(),
thumbnail = null
)
}

View File

@ -0,0 +1,23 @@
package com.keylesspalace.tusky.util
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import androidx.core.content.IntentCompat
import androidx.core.os.BundleCompat
import java.io.Serializable
inline fun <reified T : Parcelable> Bundle.getParcelableCompat(key: String?): T? =
BundleCompat.getParcelable(this, key, T::class.java)
inline fun <reified T : Serializable> Bundle.getSerializableCompat(key: String?): T? =
BundleCompat.getSerializable(this, key, T::class.java)
inline fun <reified T : Parcelable> Intent.getParcelableExtraCompat(key: String?): T? =
IntentCompat.getParcelableExtra(this, key, T::class.java)
inline fun <reified T : Serializable> Intent.getSerializableExtraCompat(key: String?): T? =
IntentCompat.getSerializableExtra(this, key, T::class.java)
inline fun <reified T : Parcelable> Intent.getParcelableArrayListExtraCompat(key: String?): ArrayList<T>? =
IntentCompat.getParcelableArrayListExtra(this, key, T::class.java)

View File

@ -22,13 +22,13 @@ import android.net.Uri
import androidx.activity.result.contract.ActivityResultContract
class PickMediaFiles : ActivityResultContract<Boolean, List<Uri>>() {
override fun createIntent(context: Context, allowMultiple: Boolean): Intent {
override fun createIntent(context: Context, input: Boolean): Intent {
return Intent(Intent.ACTION_GET_CONTENT)
.addCategory(Intent.CATEGORY_OPENABLE)
.setType("*/*")
.apply {
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*", "audio/*"))
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowMultiple)
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, input)
}
}

View File

@ -19,7 +19,6 @@ package com.keylesspalace.tusky.util
import android.content.Context
import android.content.res.Configuration
import android.graphics.Color
import android.graphics.PorterDuff
import android.graphics.drawable.Drawable
import androidx.annotation.AttrRes
import androidx.appcompat.app.AppCompatDelegate
@ -39,10 +38,7 @@ fun getDimension(context: Context, @AttrRes attribute: Int): Int {
}
fun setDrawableTint(context: Context, drawable: Drawable, @AttrRes attribute: Int) {
drawable.setColorFilter(
MaterialColors.getColor(context, attribute, Color.BLACK),
PorterDuff.Mode.SRC_IN
)
drawable.setTint(MaterialColors.getColor(context, attribute, Color.BLACK))
}
fun setAppNightMode(flavor: String?) {

View File

@ -189,8 +189,8 @@ class MediaPreviewLayout(context: Context, attrs: AttributeSet? = null) :
val wrapper = getChildAt(index)
action(
index,
wrapper.findViewById(R.id.preview_image_view) as MediaPreviewImageView,
wrapper.findViewById(R.id.preview_media_description_indicator) as TextView
wrapper.findViewById(R.id.preview_image_view),
wrapper.findViewById(R.id.preview_media_description_indicator)
)
}
}

View File

@ -694,4 +694,4 @@
<string name="about_copied">تم نسخ معلومات الإصدار والجهاز</string>
<string name="list_reply_policy_none">لا أحد</string>
<string name="list_reply_policy_list">أعضاء القائمة</string>
</resources>
</resources>

View File

@ -668,4 +668,4 @@
<string name="pref_title_per_timeline_preferences">Налады па стужкам</string>
<string name="pref_title_show_self_boosts">Паказаць самацытаванне</string>
<string name="pref_title_show_self_boosts_description">Нехта цытуе ўласныя допісы</string>
</resources>
</resources>

View File

@ -592,4 +592,4 @@
<string name="compose_delete_draft">Изтриване на чернова\?</string>
<string name="action_unfollow_hashtag_format">Отследване на #%1$s\?</string>
<string name="mute_notifications_switch">Заглушаване на известията</string>
</resources>
</resources>

View File

@ -501,4 +501,4 @@
<string name="notification_summary_small">%1$s আর %2$s</string>
<string name="notification_summary_medium">%1$s, %2$s, আর %3$s</string>
<string name="notification_mention_format">%1$s তোমাকে উল্লেখ করেছে</string>
</resources>
</resources>

View File

@ -461,4 +461,4 @@
<string name="no_drafts">তোমার কোনো খসড়া নেই।</string>
<string name="warning_scheduling_interval">মাস্টোডনের সর্বনিম্ন ৫ মিনিটের সময়সূচীর বিরতি আছে।</string>
<string name="pref_title_hide_top_toolbar">শীর্ষস্থানীয় সরঞ্জামদণ্ডের শিরোনামটি লুকান</string>
</resources>
</resources>

View File

@ -627,4 +627,4 @@
<string name="status_filtered_show_anyway">Mostra de totes maneres</string>
<string name="socket_timeout_exception">El contacte amb el teu servidor ha trigat massa</string>
<string name="ui_error_unknown">motiu desconegut</string>
</resources>
</resources>

View File

@ -469,4 +469,4 @@
<string name="pref_failed_to_sync">سەرکەوتوو نەبوو لە هاودەمکردنی ڕێکبەندەکان</string>
<string name="pref_publishing">بڵاوکردنەوە (هاوکاتکراوە لەگەڵ سێرڤەر)</string>
<string name="pref_default_media_sensitivity">هەمیشە میدیا وەک هەستیار نیشان بکە</string>
</resources>
</resources>

View File

@ -571,4 +571,4 @@
<string name="dialog_delete_conversation_warning">Smazat tuto konverzaci\?</string>
<string name="pref_title_notification_filter_follow_requests">Požádáno o sledování</string>
<string name="pref_title_animate_custom_emojis">Animovat vlastní emotikony</string>
</resources>
</resources>

View File

@ -755,4 +755,4 @@
<string name="label_translating">Yn cyfieithu…</string>
<string name="label_translated">Wedi\'i chyfieithu o %1$s gyda %2$s</string>
<string name="ui_error_translate">Nid oedd modd cyfieithu: %1$s</string>
</resources>
</resources>

View File

@ -711,4 +711,4 @@
<string name="label_translated">Aus %1$s mittels %2$s übersetzt</string>
<string name="ui_error_translate">Fehler beim Übersetzen: %1$s</string>
<string name="pref_title_show_notifications_filter">Benachrichtigungsfilter anzeigen</string>
</resources>
</resources>

View File

@ -555,4 +555,4 @@
<string name="description_post_language">Mesaĝolingvo</string>
<string name="dialog_push_notification_migration">Por ricevi sciigoj per UnifiedPush, Tusky bezonas taŭgan permeson el Mastodon-servilo. Tio postulas re-ensaluton por ŝanĝi OAuth-rajtoj donitaj al Tusky. Se vi uzas la opcion re-ensaluti ĉi tie aŭ en la agordoj de la konto, viaj malnetoj kaj kaŝmemoroj estos konservitaj.</string>
<string name="dialog_push_notification_migration_other_accounts">Vi re-ensalutis en tiu konto por doni sciigo-permeson al Tusky. Vi havas tamen aliajn kontojn, ĉe kiuj vi devas re-sensaluti. Iru al ili, kaj re-ensalutu por ebligi ricevon de sciigoj per UnifiedPush.</string>
</resources>
</resources>

View File

@ -676,4 +676,4 @@
<string name="notification_notification_worker">Obteniendo notificaciones…</string>
<string name="load_newest_notifications">Cargar nuevas notificaciones</string>
<string name="compose_delete_draft">¿Eliminar borrador\?</string>
</resources>
</resources>

View File

@ -536,4 +536,4 @@
<string name="post_edited">%1$s editatua</string>
<string name="notification_sign_up_format">%1$s-(e)k izena eman du</string>
<string name="error_status_source_load">Akatsa zerbitzaritik egoeraren iturria kargatzean.</string>
</resources>
</resources>

View File

@ -702,4 +702,4 @@
<string name="list_reply_policy_label">نمایش پاسخ‌ها به</string>
<string name="pref_title_show_self_boosts">نمایش خودتقویت‌ها</string>
<string name="pref_title_show_self_boosts_description">کسی فرستهٔ خودش را تقویت می‌کند</string>
</resources>
</resources>

View File

@ -689,4 +689,4 @@
<string name="list_reply_policy_list">Membres de la liste</string>
<string name="list_reply_policy_label">Afficher les réponses à</string>
<string name="about_copied">Les informations de la version et de lappareil ont été copiés</string>
</resources>
</resources>

View File

@ -498,4 +498,4 @@
<string name="action_dismiss">Dún</string>
<string name="action_details">Sonraí</string>
<string name="dialog_delete_conversation_warning">Scrios an comhrá seo\?</string>
</resources>
</resources>

View File

@ -687,4 +687,4 @@
<string name="about_copied">Chaidh lethbhreac de thionndadh is fiosrachadh an uidheim a dhèanamh</string>
<string name="list_exclusive_label">Falaich o loidhne-ama na dachaigh</string>
<string name="error_media_upload_sending_fmt">Dhfhàillig leis an luchdadh suas: %1$s</string>
</resources>
</resources>

View File

@ -704,4 +704,4 @@
<string name="label_translated">Traducida do %1$s con %2$s</string>
<string name="label_translating">A traducir…</string>
<string name="ui_error_translate">Non se puido traducir: %1$s</string>
</resources>
</resources>

View File

@ -399,4 +399,4 @@
<string name="error_media_upload_image_or_video">फोटो और वीडियो दोनों को एक ही पोस्ट से अटैच नहीं किया जा सकता है।</string>
<string name="error_loading_account_details">खाता विवरण लोड करने में विफल रहा</string>
<string name="error_could_not_load_login_page">लॉगिन पेज लोड नहीं किया जा सका।</string>
</resources>
</resources>

View File

@ -317,7 +317,7 @@
<string name="action_open_reblogger">Megtolás szerkesztő megnyitása</string>
<string name="action_open_reblogged_by">Megtolások megjelenítése</string>
<string name="confirmation_domain_unmuted">%1$s elrejtése feloldva</string>
<string name="mute_domain_warning">Biztos, hogy az egész %s domaint le akarod tiltani\? Egyetlen nyilvános idővonalon sem fogsz látni semmilyen tartalmat vagy értesítést innen. Az ebből a domainből származó követőidet el fogjuk távolítani.</string>
<string name="mute_domain_warning">Biztos, hogy az egész %s domaint le akarod tiltani? Egyetlen nyilvános idővonalon sem fogsz látni semmilyen tartalmat vagy értesítést innen. Az ebből a domainből származó követőidet el fogjuk távolítani.</string>
<string name="mute_domain_warning_dialog_ok">Teljes domain elrejtése</string>
<string name="pref_title_app_theme">Alkalmazástéma</string>
<string name="pref_title_bot_overlay">Botok jelölőjének megjelenítése</string>
@ -711,4 +711,4 @@
<string name="pref_title_show_self_boosts">Önmegtolások megjelenítése</string>
<string name="pref_title_show_self_boosts_description">Valaki a saját bejegyzését tolja meg</string>
<string name="pref_title_show_notifications_filter">Értesítésszűrő megjelenítése</string>
</resources>
</resources>

View File

@ -704,4 +704,4 @@
<string name="label_translating">Þýði…</string>
<string name="label_translated">Þýtt úr %1$s með %2$s</string>
<string name="ui_error_translate">Tókst ekki að þýða: %1$s</string>
</resources>
</resources>

View File

@ -445,7 +445,7 @@
<string name="action_access_scheduled_posts">Post programmati</string>
<string name="action_schedule_post">Programma un post</string>
<string name="action_reset_schedule">Ripristina</string>
<string name="poll_info_format"> <!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
<string name="poll_info_format"> \u0020<!-- 15 votes • 1 hour left --> %1$s • %2$s</string>
<string name="no_drafts">Non hai bozze.</string>
<plurals name="poll_info_people">
<item quantity="one">%1$s persona</item>
@ -726,4 +726,4 @@
<string name="ui_error_translate">Impossibile tradurre: %1$s</string>
<string name="pref_title_per_timeline_preferences">Preferenze per timeline</string>
<string name="pref_title_show_notifications_filter">Mostra filtro notifiche</string>
</resources>
</resources>

View File

@ -673,4 +673,4 @@
<string name="list_reply_policy_list">リストのメンバー</string>
<string name="pref_title_show_self_boosts">自己ブーストを表示</string>
<string name="pref_title_show_self_boosts_description">自分自身の投稿をブーストしている誰か</string>
</resources>
</resources>

View File

@ -272,4 +272,4 @@
<string name="pref_title_show_boosts">Sken-d beṭuyat</string>
<string name="hashtags">Ihacṭagen</string>
<string name="notification_follow_request_name">Isuturen n teḍfeṛt</string>
</resources>
</resources>

View File

@ -417,4 +417,4 @@
<string name="action_edit">수정</string>
<string name="hashtags">해시태그</string>
<string name="notification_follow_request_name">팔로우 요청</string>
</resources>
</resources>

View File

@ -598,4 +598,4 @@
<string name="filter_description_warn">Paslēpt ar brīdinājumu</string>
<string name="filter_edit_keyword_title">Labot atslēgvārdu</string>
<string name="filter_keyword_addition_title">Pievienot atslēgvārdu</string>
</resources>
</resources>

View File

@ -657,4 +657,4 @@
<string name="error_missing_edits">Serveren din vet at denne posten ble endret, men har ingen kopi av entringene så de kann ikke vises.
\n
\nDette er <a href="https://github.com/mastodon/mastodon/issues/25398">Mastodon issue #25398</a>.</string>
</resources>
</resources>

View File

@ -657,4 +657,4 @@
<string name="notification_prune_cache">Cache onderhoud…</string>
<string name="about_device_info_title">Je apparaat</string>
<string name="dialog_save_profile_changes_message">Wil je de wijzigingen aan je profiel bewaren\?</string>
</resources>
</resources>

View File

@ -689,4 +689,4 @@
<string name="error_unblocking_domain">Impossible de tornar mostrar %1$s: %2$s</string>
<string name="pref_title_show_self_boosts">Mostrar los pròpris partatges</string>
<string name="pref_title_show_self_boosts_description">Qualquun parteja son pròpri messatge</string>
</resources>
</resources>

View File

@ -637,4 +637,4 @@
<string name="action_discard">Odrzuć zmiany</string>
<string name="action_share_account_username">Udostępnij nazwę użytkownika</string>
<string name="action_share_account_link">Udostępnij link do konta</string>
</resources>
</resources>

View File

@ -624,4 +624,4 @@
<string name="about_copy">Copiar a versão e as informações do dispositivo</string>
<string name="load_newest_notifications">Carregar notificações mais recentes</string>
<string name="compose_delete_draft">Excluir rascunho\?</string>
</resources>
</resources>

View File

@ -707,4 +707,4 @@
<string name="muting_hashtag_success_format">Silenciar hashtag #%1$s como um aviso</string>
<string name="pref_title_per_timeline_preferences">Configurações por timeline</string>
<string name="label_filter_context">Contextos de filtro</string>
</resources>
</resources>

View File

@ -721,4 +721,4 @@
<string name="dialog_save_profile_changes_message">Хотите сохранить изменения профиля\?</string>
<string name="action_edit_image">Редактировать изображение</string>
<string name="pref_title_per_timeline_preferences">Временные предпочтения</string>
</resources>
</resources>

View File

@ -559,4 +559,4 @@
<string name="send_account_username_to">लेखायाः उपभोक्तृनाम्नः संविभागं कुरुताम् अस्मै…</string>
<string name="confirmation_hashtag_unfollowed">#%1$s अनुसरणम् अपाकृतम्</string>
<string name="send_account_link_to">लेखायाः निरपेक्ष-सार्वत्रिक-वस्तुसङ्केतस्य संविभागं कुरुताम् अस्मै…</string>
</resources>
</resources>

View File

@ -264,4 +264,4 @@
<string name="action_links">සබැඳි</string>
<string name="pref_title_browser_settings">අතිරික්සුව</string>
<string name="abbreviated_seconds_ago">තත්. %1$d</string>
</resources>
</resources>

View File

@ -446,4 +446,4 @@
<string name="error_loading_account_details">Nalaganje podatkov o računu ni bilo uspešno</string>
<string name="error_could_not_load_login_page">Prijavne strani ni bilo mogoče naložiti.</string>
<string name="error_image_edit_failed">Datoteke ni bilo možno urediti.</string>
</resources>
</resources>

View File

@ -718,4 +718,4 @@
<string name="label_translating">Översätter…</string>
<string name="label_translated">Översatt från %1$s med %2$s</string>
<string name="ui_error_translate">Kunde inte översätta: %1$s</string>
</resources>
</resources>

View File

@ -479,4 +479,4 @@
<string name="notification_subscription_format">%1$s เพิ่งโพสต์</string>
<string name="title_announcements">ประกาศ</string>
<string name="action_delete_conversation">ลบการสนทนา</string>
</resources>
</resources>

View File

@ -711,4 +711,4 @@
<string name="ui_error_translate">Çeviri yapılamadı: %1$s</string>
<string name="action_translate">Çevir</string>
<string name="label_translating">Çeviri…</string>
</resources>
</resources>

View File

@ -726,4 +726,4 @@
<string name="label_translating">Перекладається…</string>
<string name="label_translated">Перекладено з %1$s на %2$s</string>
<string name="ui_error_translate">Неможливо перекласти: %1$s</string>
</resources>
</resources>

View File

@ -354,7 +354,7 @@
<plurals name="poll_info_votes">
<item quantity="other">%1$s người bình chọn</item>
</plurals>
<string name="poll_info_format"> <!-- 15 người bình chọn • còn 1 giờ --> %1$s • %2$s</string>
<string name="poll_info_format"> \u0020<!-- 15 bình chọn • còn 1 giờ --> \u0020%1$s • %2$s</string>
<string name="compose_preview_image_description">Mô tả cho hình %1$s</string>
<string name="compose_shortcut_short_label">Soạn</string>
<string name="compose_shortcut_long_label">Soạn tút</string>
@ -694,4 +694,4 @@
<string name="label_translating">Đang dịch…</string>
<string name="label_translated">Dịch %1$s bằng %2$s</string>
<string name="ui_error_translate">Không thể dịch: %1$s</string>
</resources>
</resources>

View File

@ -699,4 +699,4 @@
<string name="list_reply_policy_label">显示哪些回复</string>
<string name="pref_title_show_self_boosts_description">某人转发自己的嘟文</string>
<string name="pref_title_show_self_boosts">显示自转发嘟文</string>
</resources>
</resources>

View File

@ -395,4 +395,4 @@
<string name="hashtags">話題</string>
<string name="edit_poll">編輯</string>
<string name="action_edit">編輯</string>
</resources>
</resources>