Browse Source

update lint config, fix some warnings (#5094)

pull/5100/head
Konrad Pozniak 11 months ago committed by GitHub
parent
commit
351e0b3cfc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 131
      app/lint-baseline.xml
  2. 10
      app/lint.xml
  3. 4
      app/src/main/java/com/keylesspalace/tusky/MainActivity.kt
  4. 3
      app/src/main/java/com/keylesspalace/tusky/MainViewModel.kt
  5. 10
      app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java
  6. 2
      app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java
  7. 6
      app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt
  8. 13
      app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt
  9. 1
      app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt
  10. 6
      app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt
  11. 13
      app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationService.kt
  12. 4
      app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt
  13. 4
      app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt
  14. 18
      app/src/main/java/com/keylesspalace/tusky/di/PlayerModule.kt
  15. 7
      app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.kt
  16. 2
      app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt
  17. 46
      app/src/main/java/com/keylesspalace/tusky/util/CustomEmojiHelper.kt
  18. 8
      app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.kt
  19. 7
      app/src/main/java/com/keylesspalace/tusky/util/ListUtils.kt
  20. 13
      app/src/main/java/com/keylesspalace/tusky/util/LocaleManager.kt
  21. 4
      app/src/main/java/com/keylesspalace/tusky/util/RickRoll.kt
  22. 4
      app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt
  23. 7
      app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt
  24. 2
      app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt
  25. 7
      app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.kt
  26. 15
      app/src/main/java/com/keylesspalace/tusky/view/ClickableSpanTextView.kt
  27. 4
      app/src/main/java/com/keylesspalace/tusky/view/GraphView.kt
  28. 1
      app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt
  29. 5
      app/src/main/res/values-en-rGB/strings.xml
  30. 4
      app/src/test/java/com/keylesspalace/tusky/MainActivityTest.kt
  31. 2
      app/src/test/java/com/keylesspalace/tusky/components/compose/ComposeActivityTest.kt
  32. 2
      app/src/test/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModelTest.kt

131
app/lint-baseline.xml

@ -23,6 +23,28 @@
column="32"/>
</issue>
<issue
id="InlinedApi"
message="Field requires API level 29 (current min is 24): `android.text.style.DynamicDrawableSpan#ALIGN_CENTER`"
errorLine1=" builder.setSpan(ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), builder.length - 2, builder.length - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt"
line="74"
column="49"/>
</issue>
<issue
id="InlinedApi"
message="Field requires API level 29 (current min is 24): `android.text.style.DynamicDrawableSpan#ALIGN_CENTER`"
errorLine1=" builder.setSpan(ImageSpan(drawable, DynamicDrawableSpan.ALIGN_CENTER), index, index + iconName.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt"
line="122"
column="53"/>
</issue>
<issue
id="InvalidPackage"
message="Invalid package reference in org.bouncycastle:bcprov-jdk15on; not included in Android: `javax.naming.directory`. Referenced from `org.bouncycastle.jce.provider.CrlCache`.">
@ -53,14 +75,14 @@
<issue
id="PrivateResource"
message="Overriding `@layout/exo_player_control_view` which is marked as private in androidx.media3:media3-ui:1.6.0. If deliberate, use tools:override=&quot;true&quot;, otherwise pick a different name.">
message="Overriding `@layout/exo_player_control_view` which is marked as private in androidx.media3:media3-ui:1.6.1. If deliberate, use tools:override=&quot;true&quot;, otherwise pick a different name.">
<location
file="src/main/res/layout/exo_player_control_view.xml"/>
</issue>
<issue
id="PrivateResource"
message="The resource `@color/exo_bottom_bar_background` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@color/exo_bottom_bar_background` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:background=&quot;@color/exo_bottom_bar_background&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -71,7 +93,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_controls_padding` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_controls_padding` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:padding=&quot;@dimen/exo_styled_controls_padding&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -82,7 +104,7 @@
<issue
id="PrivateResource"
message="The resource `@layout/exo_player_control_rewind_button` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@layout/exo_player_control_rewind_button` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" &lt;include layout=&quot;@layout/exo_player_control_rewind_button&quot; />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -93,7 +115,7 @@
<issue
id="PrivateResource"
message="The resource `@layout/exo_player_control_ffwd_button` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@layout/exo_player_control_ffwd_button` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" &lt;include layout=&quot;@layout/exo_player_control_ffwd_button&quot; />"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -104,7 +126,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_bottom_bar_height` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_bottom_bar_height` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:layout_height=&quot;@dimen/exo_styled_bottom_bar_height&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -115,7 +137,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_bottom_bar_margin_top` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_bottom_bar_margin_top` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:layout_marginTop=&quot;@dimen/exo_styled_bottom_bar_margin_top&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -126,7 +148,7 @@
<issue
id="PrivateResource"
message="The resource `@color/exo_bottom_bar_background` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@color/exo_bottom_bar_background` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:background=&quot;@color/exo_bottom_bar_background&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -137,7 +159,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:paddingStart=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -148,7 +170,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:paddingEnd=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -159,7 +181,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:paddingLeft=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -170,7 +192,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_bottom_bar_time_padding` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:paddingRight=&quot;@dimen/exo_styled_bottom_bar_time_padding&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -181,7 +203,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_progress_layout_height` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_progress_layout_height` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:layout_height=&quot;@dimen/exo_styled_progress_layout_height&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -192,7 +214,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_progress_margin_bottom` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_progress_margin_bottom` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:layout_marginBottom=&quot;@dimen/exo_styled_progress_margin_bottom&quot;/>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -203,7 +225,7 @@
<issue
id="PrivateResource"
message="The resource `@dimen/exo_styled_minimal_controls_margin_bottom` is marked as private in androidx.media3:media3-ui:1.6.0"
message="The resource `@dimen/exo_styled_minimal_controls_margin_bottom` is marked as private in androidx.media3:media3-ui:1.6.1"
errorLine1=" android:layout_marginBottom=&quot;@dimen/exo_styled_minimal_controls_margin_bottom&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
@ -267,6 +289,17 @@
column="5"/>
</issue>
<issue
id="PluralsCandidate"
message="Formatting %d followed by words (&quot;people&quot;): This should probably be a plural rather than a string"
errorLine1=" &lt;string name=&quot;notifications_from_people_you_may_know&quot;>Notifications from %1$d people you may know&lt;/string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/strings.xml"
line="873"
column="5"/>
</issue>
<issue
id="DataExtractionRules"
message="The attribute `android:allowBackup` is deprecated from Android 12 and higher and may be removed in future versions. Consider adding the attribute `android:dataExtractionRules` specifying an `@xml` resource which configures cloud backups and device transfers on Android 12 and higher."
@ -289,17 +322,6 @@
column="9"/>
</issue>
<issue
id="NotifyDataSetChanged"
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
errorLine1=" notifyDataSetChanged()"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/AccountAdapter.kt"
line="78"
column="9"/>
</issue>
<issue
id="NotifyDataSetChanged"
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
@ -333,17 +355,6 @@
column="9"/>
</issue>
<issue
id="NotifyDataSetChanged"
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
errorLine1=" notifyDataSetChanged()"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/components/accountlist/adapter/MutesAdapter.kt"
line="118"
column="9"/>
</issue>
<issue
id="NotifyDataSetChanged"
message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort."
@ -351,7 +362,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/adapter/PollAdapter.kt"
line="62"
line="64"
column="9"/>
</issue>
@ -388,13 +399,6 @@
column="13"/>
</issue>
<issue
id="ConvertToWebp"
message="One or more images in this project can be converted to the WebP format which typically results in smaller file sizes, even for lossless conversion">
<location
file="src/blue/res/mipmap-xxxhdpi/ic_launcher.png"/>
</issue>
<issue
id="NegativeMargin"
message="Margin values should not be negative"
@ -413,10 +417,21 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt"
line="101"
line="102"
column="13"/>
</issue>
<issue
id="UseKtx"
message="Use the KTX extension function `Context.withStyledAttributes` instead?"
errorLine1=" val a = context.obtainStyledAttributes("
errorLine2=" ^">
<location
file="src/main/java/com/keylesspalace/tusky/view/SliderPreference.kt"
line="100"
column="17"/>
</issue>
<issue
id="ClickableViewAccessibility"
message="Custom view ``ImageView`` has `setOnTouchListener` called on it but does not override `performClick`"
@ -578,30 +593,8 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java"
line="1197"
line="1135"
column="42"/>
</issue>
<issue
id="UnknownNullness"
message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
errorLine1=" protected TextView getStatusInfo() {"
errorLine2=" ~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java"
line="149"
column="15"/>
</issue>
<issue
id="UnknownNullness"
message="Should explicitly declare type here since implicit type does not specify nullness"
errorLine1="val hashtagPattern = Pattern.compile(HASHTAG_EXPRESSION, Pattern.CASE_INSENSITIVE or Pattern.MULTILINE)"
errorLine2=" ~~~~~~~~~~~~~~">
<location
file="src/main/java/com/keylesspalace/tusky/util/StringUtils.kt"
line="12"
column="5"/>
</issue>
</issues>

10
app/lint.xml

@ -63,6 +63,9 @@
<!-- This is heavily used by the viewbinding helper -->
<issue id="SyntheticAccessor" severity="ignore" />
<!-- We already have Renovate reminding us of new versions -->
<issue id="AndroidGradlePluginVersion" severity="ignore" />
<!-- Things we would actually question in a code review -->
<issue id="MissingPermission" severity="error" />
<issue id="InvalidPackage" severity="error" />
@ -70,12 +73,7 @@
<issue id="UseCompatTextViewDrawableXml" severity="error" />
<issue id="Recycle" severity="error" />
<issue id="KeyboardInaccessibleWidget" severity="error" />
<!-- these three don't work with Kotlin 2.1 for some reason
https://github.com/tuskyapp/Tusky/pull/4774 -->
<issue id="StateFlowValueCalledInComposition" severity="ignore" />
<issue id="CoroutineCreationDuringComposition" severity="ignore" />
<issue id="FlowOperatorInvokedInComposition" severity="ignore" />
<issue id="UnknownNullness" severity="error" />
<!-- Mark all other lint issues as warnings -->
<issue id="all" severity="warning" />

4
app/src/main/java/com/keylesspalace/tusky/MainActivity.kt

@ -25,7 +25,6 @@ import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.Animatable
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
@ -49,6 +48,7 @@ import androidx.appcompat.content.res.AppCompatResources
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.app.ActivityCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.toDrawable
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.MenuProvider
import androidx.core.view.ViewCompat
@ -1021,7 +1021,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {
transition: Transition<in Bitmap>?
) {
activeToolbar.navigationIcon = FixedSizeDrawable(
BitmapDrawable(resources, resource),
resource.toDrawable(resources),
navIconSize,
navIconSize
)

3
app/src/main/java/com/keylesspalace/tusky/MainViewModel.kt

@ -15,7 +15,6 @@
package com.keylesspalace.tusky
import android.content.Context
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
@ -33,7 +32,6 @@ import com.keylesspalace.tusky.entity.Status
import com.keylesspalace.tusky.network.MastodonApi
import com.keylesspalace.tusky.util.ShareShortcutHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@ -46,7 +44,6 @@ import kotlinx.coroutines.launch
@HiltViewModel
class MainViewModel @Inject constructor(
@ApplicationContext private val context: Context,
private val api: MastodonApi,
private val eventHub: EventHub,
private val accountManager: AccountManager,

10
app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java

@ -11,7 +11,6 @@ import android.text.Spanned;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
@ -24,7 +23,6 @@ import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.PopupMenu;
import androidx.appcompat.widget.TooltipCompat;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.text.HtmlCompat;
@ -45,10 +43,10 @@ import com.keylesspalace.tusky.ViewMediaActivity;
import com.keylesspalace.tusky.entity.Attachment;
import com.keylesspalace.tusky.entity.Attachment.Focus;
import com.keylesspalace.tusky.entity.Attachment.MetaData;
import com.keylesspalace.tusky.entity.Filter;
import com.keylesspalace.tusky.entity.PreviewCard;
import com.keylesspalace.tusky.entity.Emoji;
import com.keylesspalace.tusky.entity.Filter;
import com.keylesspalace.tusky.entity.HashTag;
import com.keylesspalace.tusky.entity.PreviewCard;
import com.keylesspalace.tusky.entity.Status;
import com.keylesspalace.tusky.entity.TimelineAccount;
import com.keylesspalace.tusky.entity.Translation;
@ -81,9 +79,7 @@ import java.util.List;
import at.connyduck.sparkbutton.SparkButton;
import at.connyduck.sparkbutton.helpers.Utils;
import kotlin.Unit;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.functions.Function0;
public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
public static class Key {
@ -534,7 +530,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
final @NonNull StatusActionListener listener,
boolean showingContent,
boolean useBlurhash,
Filter filter
final @NonNull Filter filter
) {
mediaPreview.setVisibility(View.VISIBLE);

2
app/src/main/java/com/keylesspalace/tusky/adapter/StatusViewHolder.java

@ -146,7 +146,7 @@ public class StatusViewHolder extends StatusBaseViewHolder {
statusInfo.setVisibility(View.GONE);
}
protected TextView getStatusInfo() {
protected @NonNull TextView getStatusInfo() {
return statusInfo;
}

6
app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsViewModel.kt

@ -112,9 +112,9 @@ class ConversationsViewModel @Inject constructor(
fun showPollResults(conversation: ConversationViewData) = viewModelScope.launch {
conversation.lastStatus.status.poll?.let { poll ->
conversation.toEntity(accountId = accountId, poll = poll.copy(voted = true)).let {
saveConversationToDb(it)
}
saveConversationToDb(
conversation.toEntity(accountId = accountId, poll = poll.copy(voted = true))
)
}
}

13
app/src/main/java/com/keylesspalace/tusky/components/login/LoginActivity.kt

@ -24,6 +24,7 @@ import android.util.Log
import android.view.Menu
import android.view.View
import android.widget.TextView
import androidx.core.content.edit
import androidx.core.net.toUri
import androidx.core.view.WindowInsetsCompat.Type.ime
import androidx.core.view.WindowInsetsCompat.Type.systemBars
@ -138,7 +139,7 @@ class LoginActivity : BaseActivity() {
try {
HttpUrl.Builder().host(domain).scheme("https").build()
} catch (e: IllegalArgumentException) {
} catch (_: IllegalArgumentException) {
setLoading(false)
binding.domainTextInputLayout.error = getString(R.string.error_invalid_domain)
return
@ -161,11 +162,11 @@ class LoginActivity : BaseActivity() {
).fold(
{ credentials ->
// Save credentials so we can access them after we opened another activity for auth.
preferences.edit()
.putString(DOMAIN, domain)
.putString(CLIENT_ID, credentials.clientId)
.putString(CLIENT_SECRET, credentials.clientSecret)
.apply()
preferences.edit {
putString(DOMAIN, domain)
putString(CLIENT_ID, credentials.clientId)
putString(CLIENT_SECRET, credentials.clientSecret)
}
redirectUserToAuthorizeAndLogin(domain, credentials.clientId, openInWebView)
},

1
app/src/main/java/com/keylesspalace/tusky/components/preference/PreferencesFragment.kt

@ -21,7 +21,6 @@ import androidx.annotation.DrawableRes
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder.valueOf
import com.keylesspalace.tusky.components.systemnotifications.NotificationChannelData
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.settings.AppTheme

6
app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt

@ -19,7 +19,6 @@ import android.Manifest
import android.app.DownloadManager
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
@ -30,6 +29,7 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.PopupMenu
import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import androidx.core.view.ViewCompat
import androidx.lifecycle.lifecycleScope
import androidx.paging.PagingData
@ -554,7 +554,7 @@ class SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), Status
private fun accountIsInMentions(account: AccountEntity?, mentions: List<Mention>): Boolean {
return mentions.firstOrNull {
account?.username == it.username && account.domain == Uri.parse(it.url)?.host
account?.username == it.username && account.domain == it.url.toUri().host
} != null
}
@ -575,7 +575,7 @@ class SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), Status
val downloadManager: DownloadManager = requireContext().getSystemService()!!
for (url in mediaUrls) {
val uri = Uri.parse(url)
val uri = url.toUri()
val request = DownloadManager.Request(uri)
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,

13
app/src/main/java/com/keylesspalace/tusky/components/systemnotifications/NotificationService.kt

@ -24,6 +24,7 @@ import androidx.core.app.NotificationManagerCompat
import androidx.core.app.NotificationManagerCompat.NotificationWithIdAndTag
import androidx.core.app.RemoteInput
import androidx.core.app.TaskStackBuilder
import androidx.core.content.edit
import androidx.core.net.toUri
import androidx.work.Constraints
import androidx.work.Data
@ -783,9 +784,9 @@ class NotificationService @Inject constructor(
Log.w(TAG, "Previous push provider ($lastUsedPushProvider) uninstalled. Resetting all accounts.")
val editor = preferences.edit()
editor.remove(PrefKeys.LAST_USED_PUSH_PROVDER)
editor.apply()
preferences.edit {
remove(PrefKeys.LAST_USED_PUSH_PROVDER)
}
applicationScope.launch {
accountManager.accounts.forEach {
@ -895,9 +896,9 @@ class NotificationService @Inject constructor(
UnifiedPush.getAckDistributor(context)?.let {
Log.d(TAG, "Saving distributor to preferences: $it")
val editor = preferences.edit()
editor.putString(PrefKeys.LAST_USED_PUSH_PROVDER, it)
editor.apply()
preferences.edit {
putString(PrefKeys.LAST_USED_PUSH_PROVDER, it)
}
// TODO once this is selected it cannot be changed (except by wiping the application or uninstalling the provider)
}

4
app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt

@ -61,9 +61,9 @@ class ViewThreadViewModel @Inject constructor(
private val api: MastodonApi,
private val filterModel: FilterModel,
private val timelineCases: TimelineCases,
eventHub: EventHub,
private val accountManager: AccountManager,
private val db: AppDatabase,
eventHub: EventHub,
accountManager: AccountManager,
) : ViewModel() {
private val activeAccount = accountManager.activeAccount!!

4
app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsAdapter.kt

@ -2,7 +2,6 @@ package com.keylesspalace.tusky.components.viewthread.edits
import android.content.Context
import android.graphics.Typeface.DEFAULT_BOLD
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.text.Editable
import android.text.SpannableStringBuilder
@ -12,6 +11,7 @@ import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.graphics.drawable.toDrawable
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
@ -188,7 +188,7 @@ class ViewEditsAdapter(
val placeholder: Drawable = if (blurhash != null && useBlurhash) {
BlurhashDrawable(context, blurhash)
} else {
ColorDrawable(MaterialColors.getColor(imageView, R.attr.colorBackgroundAccent))
MaterialColors.getColor(imageView, R.attr.colorBackgroundAccent).toDrawable()
}
if (attachment.previewUrl.isNullOrEmpty()) {

18
app/src/main/java/com/keylesspalace/tusky/di/PlayerModule.kt

@ -79,16 +79,14 @@ object PlayerModule {
textRendererOutput,
metadataRendererOutput ->
arrayOf(
MediaCodecVideoRenderer(
context,
MediaCodecSelector.DEFAULT,
DefaultRenderersFactory.DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS,
// enableDecoderFallback = true, helps playing videos even if one decoder fails
true,
eventHandler,
videoRendererEventListener,
DefaultRenderersFactory.MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY
),
MediaCodecVideoRenderer.Builder(context)
.setMediaCodecSelector(MediaCodecSelector.DEFAULT)
.setAllowedJoiningTimeMs(DefaultRenderersFactory.DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS)
.setEnableDecoderFallback(true)
.setEventHandler(eventHandler)
.setEventListener(videoRendererEventListener)
.setMaxDroppedFramesToNotify(DefaultRenderersFactory.MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)
.build(),
MediaCodecAudioRenderer(
context,
MediaCodecSelector.DEFAULT,

7
app/src/main/java/com/keylesspalace/tusky/fragment/SFragment.kt

@ -18,7 +18,6 @@ import android.Manifest
import android.app.DownloadManager
import android.content.DialogInterface
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
@ -31,6 +30,7 @@ import androidx.annotation.LayoutRes
import androidx.appcompat.widget.PopupMenu
import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import at.connyduck.calladapter.networkresult.fold
@ -543,7 +543,7 @@ abstract class SFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayo
val downloadManager: DownloadManager = requireContext().getSystemService()!!
for (url in mediaUrls) {
val uri = Uri.parse(url)
val uri = url.toUri()
downloadManager.enqueue(
DownloadManager.Request(uri).apply {
setDestinationInExternalPublicDir(
@ -569,7 +569,6 @@ abstract class SFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayo
}
companion object {
private const val TAG = "SFragment"
private const val PENDING_MEDIA_DOWNLOADS_STATE_KEY = "pending_media_downloads"
private fun accountIsInMentions(
@ -577,7 +576,7 @@ abstract class SFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayo
mentions: List<Status.Mention>
): Boolean {
return mentions.any { mention ->
account?.username == mention.username && account.domain == Uri.parse(mention.url)?.host
account?.username == mention.username && account.domain == mention.url.toUri().host
}
}
}

2
app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt

@ -127,7 +127,7 @@ class SendStatusService : Service() {
cancelSendingIntent(sendingNotificationId)
)
if (statusesToSend.size == 0 || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
if (statusesToSend.isEmpty() || Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_DETACH)
startForeground(sendingNotificationId, builder.build())
} else {

46
app/src/main/java/com/keylesspalace/tusky/util/CustomEmojiHelper.kt

@ -24,6 +24,7 @@ import android.graphics.drawable.Drawable
import android.text.style.ReplacementSpan
import android.view.View
import android.widget.TextView
import androidx.core.graphics.withSave
import androidx.core.text.toSpannable
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
@ -155,32 +156,31 @@ class EmojiSpan(view: View) : ReplacementSpan() {
paint: Paint
) {
imageDrawable?.let { drawable ->
canvas.save()
// start with a width relative to the text size
var emojiWidth = paint.textSize * 1.1
// calculate the height, keeping the aspect ratio correct
val drawableWidth = drawable.intrinsicWidth
val drawableHeight = drawable.intrinsicHeight
var emojiHeight = emojiWidth / drawableWidth * drawableHeight
canvas.withSave {
// start with a width relative to the text size
var emojiWidth = paint.textSize * 1.1
// calculate the height, keeping the aspect ratio correct
val drawableWidth = drawable.intrinsicWidth
val drawableHeight = drawable.intrinsicHeight
var emojiHeight = emojiWidth / drawableWidth * drawableHeight
// how much vertical space there is draw the emoji
val drawableSpace = (bottom - top).toDouble()
// in case the calculated height is bigger than the available space, scale the emoji down, preserving aspect ratio
if (emojiHeight > drawableSpace) {
emojiWidth *= drawableSpace / emojiHeight
emojiHeight = drawableSpace
}
drawable.setBounds(0, 0, emojiWidth.toInt(), emojiHeight.toInt())
// how much vertical space there is draw the emoji
val drawableSpace = (bottom - top).toDouble()
// vertically center the emoji in the line
val transY = top + (drawableSpace / 2 - emojiHeight / 2)
// in case the calculated height is bigger than the available space, scale the emoji down, preserving aspect ratio
if (emojiHeight > drawableSpace) {
emojiWidth *= drawableSpace / emojiHeight
emojiHeight = drawableSpace
translate(x, transY.toFloat())
drawable.draw(this)
}
drawable.setBounds(0, 0, emojiWidth.toInt(), emojiHeight.toInt())
// vertically center the emoji in the line
val transY = top + (drawableSpace / 2 - emojiHeight / 2)
canvas.translate(x, transY.toFloat())
drawable.draw(canvas)
canvas.restore()
}
}

8
app/src/main/java/com/keylesspalace/tusky/util/LinkHelper.kt

@ -413,7 +413,7 @@ private fun openLinkInBrowser(uri: Uri?, context: Context) {
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
Log.w(TAG, "Activity was not found for intent, $intent")
Log.w(TAG, "Activity was not found for intent, $intent", e)
}
}
@ -430,6 +430,8 @@ fun openLinkInCustomTab(uri: Uri, context: Context) {
materialR.attr.colorSurface,
Color.BLACK
)
@Suppress("DEPRECATION")
val navigationbarColor = MaterialColors.getColor(
context,
android.R.attr.navigationBarColor,
@ -454,7 +456,7 @@ fun openLinkInCustomTab(uri: Uri, context: Context) {
try {
customTabsIntent.launchUrl(context, uri)
} catch (e: ActivityNotFoundException) {
Log.w(TAG, "Activity was not found for intent $customTabsIntent")
Log.w(TAG, "Activity was not found for intent $customTabsIntent", e)
openLinkInBrowser(uri, context)
}
}
@ -480,7 +482,7 @@ fun looksLikeMastodonUrl(urlString: String): Boolean {
val uri: URI
try {
uri = URI(urlString)
} catch (e: URISyntaxException) {
} catch (_: URISyntaxException) {
return false
}

7
app/src/main/java/com/keylesspalace/tusky/util/ListUtils.kt

@ -17,13 +17,6 @@
package com.keylesspalace.tusky.util
/**
* Copies elements to destination, removing duplicates and preserving original order.
*/
fun <T, C : MutableCollection<in T>> Iterable<T>.removeDuplicatesTo(destination: C): C {
return filterTo(destination, HashSet<T>()::add)
}
inline fun <T> List<T>.withoutFirstWhich(predicate: (T) -> Boolean): List<T> {
val index = indexOfFirst(predicate)
if (index == -1) {

13
app/src/main/java/com/keylesspalace/tusky/util/LocaleManager.kt

@ -19,6 +19,7 @@ import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.edit
import androidx.core.os.LocaleListCompat
import androidx.preference.PreferenceDataStore
import com.keylesspalace.tusky.R
@ -44,9 +45,9 @@ class LocaleManager @Inject constructor(
// hand over the old setting to the system and save a dummy value in Shared Preferences
applyLanguageToApp(language)
preferences.edit()
.putString(PrefKeys.LANGUAGE, HANDLED_BY_SYSTEM)
.apply()
preferences.edit {
putString(PrefKeys.LANGUAGE, HANDLED_BY_SYSTEM)
}
}
} else {
// on Android < 13 we have to apply the language at every app start
@ -58,9 +59,9 @@ class LocaleManager @Inject constructor(
// if we are on Android < 13 we have to save the selected language so we can apply it at appstart
// on Android 13+ the system handles it for us
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
preferences.edit()
.putString(PrefKeys.LANGUAGE, value)
.apply()
preferences.edit {
putString(PrefKeys.LANGUAGE, value)
}
}
applyLanguageToApp(value)
}

4
app/src/main/java/com/keylesspalace/tusky/util/RickRoll.kt

@ -2,7 +2,7 @@ package com.keylesspalace.tusky.util
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.core.net.toUri
import com.keylesspalace.tusky.R
fun shouldRickRoll(context: Context, domain: String) =
@ -11,7 +11,7 @@ fun shouldRickRoll(context: Context, domain: String) =
}
fun rickRoll(context: Context) {
val uri = Uri.parse(context.getString(R.string.rick_roll_url))
val uri = context.getString(R.string.rick_roll_url).toUri()
val intent = Intent(Intent.ACTION_VIEW, uri).apply {
addCategory(Intent.CATEGORY_BROWSABLE)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

4
app/src/main/java/com/keylesspalace/tusky/util/ShareShortcutHelper.kt

@ -19,13 +19,13 @@ package com.keylesspalace.tusky.util
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Canvas
import android.util.Log
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.app.Person
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.createBitmap
import androidx.core.graphics.drawable.IconCompat
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.GlideException
@ -67,7 +67,7 @@ class ShareShortcutHelper @Inject constructor(
}
// inset the loaded bitmap inside a 108dp transparent canvas so it looks good as adaptive icon
val outBmp = Bitmap.createBitmap(outerSize, outerSize, Bitmap.Config.ARGB_8888)
val outBmp = createBitmap(outerSize, outerSize)
val canvas = Canvas(outBmp)
val borderSize = (outerSize - innerSize) / 2

7
app/src/main/java/com/keylesspalace/tusky/util/StatusViewHelper.kt

@ -17,13 +17,13 @@ package com.keylesspalace.tusky.util
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.text.InputFilter
import android.text.TextUtils
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.DrawableRes
import androidx.core.graphics.drawable.toDrawable
import com.bumptech.glide.Glide
import com.google.android.material.color.MaterialColors
import com.keylesspalace.tusky.R
@ -89,9 +89,8 @@ class StatusViewHelper(private val itemView: View) {
}
val mediaPreviewUnloaded =
ColorDrawable(
MaterialColors.getColor(context, R.attr.colorBackgroundAccent, Color.BLACK)
)
MaterialColors.getColor(context, R.attr.colorBackgroundAccent, Color.BLACK)
.toDrawable()
val n = min(attachments.size, Status.MAX_MEDIA_ATTACHMENTS)

2
app/src/main/java/com/keylesspalace/tusky/util/StringUtils.kt

@ -9,7 +9,7 @@ import kotlin.random.Random
private const val POSSIBLE_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
const val HASHTAG_EXPRESSION = "([\\w_]*[\\p{Alpha}_][\\w_]*)"
val hashtagPattern = Pattern.compile(HASHTAG_EXPRESSION, Pattern.CASE_INSENSITIVE or Pattern.MULTILINE)
val hashtagPattern: Pattern = Pattern.compile(HASHTAG_EXPRESSION, Pattern.CASE_INSENSITIVE or Pattern.MULTILINE)
fun randomAlphanumericString(count: Int): String {
val chars = CharArray(count)

7
app/src/main/java/com/keylesspalace/tusky/util/ThemeUtils.kt

@ -22,7 +22,6 @@ import android.graphics.Color
import android.graphics.drawable.Drawable
import androidx.annotation.AttrRes
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.res.use
import com.google.android.material.color.MaterialColors
import com.keylesspalace.tusky.settings.AppTheme
@ -31,12 +30,6 @@ import com.keylesspalace.tusky.settings.AppTheme
* the ability to do so is not supported in resource files.
*/
fun getDimension(context: Context, @AttrRes attribute: Int): Int {
return context.obtainStyledAttributes(intArrayOf(attribute)).use { array ->
array.getDimensionPixelSize(0, -1)
}
}
fun setDrawableTint(context: Context, drawable: Drawable, @AttrRes attribute: Int) {
drawable.setTint(MaterialColors.getColor(context, attribute, Color.BLACK))
}

15
app/src/main/java/com/keylesspalace/tusky/view/ClickableSpanTextView.kt

@ -39,6 +39,7 @@ import android.view.MotionEvent.ACTION_DOWN
import android.view.MotionEvent.ACTION_UP
import android.view.ViewConfiguration
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.graphics.withSave
import androidx.core.view.doOnLayout
import com.keylesspalace.tusky.BuildConfig
import com.keylesspalace.tusky.R
@ -379,15 +380,15 @@ class ClickableSpanTextView @JvmOverloads constructor(
// Paint span boundaries. Optimised out on release builds, or debug builds where
// showSpanBoundaries is false.
if (BuildConfig.DEBUG && showSpanBoundaries) {
canvas.save()
for (entry in delegateRects) {
canvas.drawRect(entry.key, paddingDebugPaint)
}
canvas.withSave {
for (entry in delegateRects) {
drawRect(entry.key, paddingDebugPaint)
}
for (entry in spanRects) {
canvas.drawRect(entry.key, spanDebugPaint)
for (entry in spanRects) {
drawRect(entry.key, spanDebugPaint)
}
}
canvas.restore()
}
}

4
app/src/main/java/com/keylesspalace/tusky/view/GraphView.kt

@ -21,12 +21,12 @@ import android.graphics.Paint
import android.graphics.Path
import android.graphics.PathMeasure
import android.graphics.Rect
import android.text.TextUtils
import android.util.AttributeSet
import android.view.View
import androidx.annotation.ColorInt
import androidx.annotation.Dimension
import androidx.core.content.res.use
import androidx.core.text.layoutDirection
import com.google.android.material.R as materialR
import com.google.android.material.color.MaterialColors
import com.keylesspalace.tusky.R
@ -103,7 +103,7 @@ class GraphView @JvmOverloads constructor(
init {
initFromXML(attrs)
isRtlLayout = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == LAYOUT_DIRECTION_RTL
isRtlLayout = Locale.getDefault().layoutDirection == LAYOUT_DIRECTION_RTL
}
private fun initFromXML(attr: AttributeSet?) {

1
app/src/main/java/com/keylesspalace/tusky/viewdata/PollViewData.kt

@ -24,7 +24,6 @@ import android.text.style.ImageSpan
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.text.parseAsHtml
import androidx.core.text.set
import com.google.android.material.color.MaterialColors
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.entity.Poll

5
app/src/main/res/values-en-rGB/strings.xml

@ -95,9 +95,6 @@
<string name="title_home">Home</string>
<string name="notification_subscription_format">%1$s just posted</string>
<string name="action_post_failed">Upload failed</string>
<string name="action_post_failed_detail">Your post failed to upload and has been saved to drafts.
\n
\nEither the server could not be contacted, or it rejected the post.</string>
<string name="report_comment_hint">Additional comments?</string>
<string name="action_quick_reply">Quick Reply</string>
<string name="action_reblog">Boost</string>
@ -105,4 +102,4 @@
<string name="action_unreblog">Remove boost</string>
<string name="action_logout_confirm">Are you sure you want to log out of %1$s? This will delete all local data of the account, including drafts and preferences.</string>
<string name="action_share_account_link">Share a link to this account</string>
</resources>
</resources>

4
app/src/test/java/com/keylesspalace/tusky/MainActivityTest.kt

@ -3,7 +3,6 @@ package com.keylesspalace.tusky
import android.app.Activity
import android.app.NotificationManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
@ -164,9 +163,6 @@ class MainActivityTest {
}
})
val viewModel = MainViewModel(
context = mock {
on { getSystemService(Context.NOTIFICATION_SERVICE) } doReturn mock<NotificationManager>()
},
api = api,
eventHub = eventHub,
accountManager = accountManager,

2
app/src/test/java/com/keylesspalace/tusky/components/compose/ComposeActivityTest.kt

@ -137,7 +137,7 @@ class ComposeActivityTest {
val instanceDaoMock: InstanceDao = mock {
onBlocking { getInstanceInfo(any()) } doReturn
InstanceInfoEntity(instanceDomain, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null,)
InstanceInfoEntity(instanceDomain, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null)
onBlocking { getEmojiInfo(any()) } doReturn
EmojisEntity(instanceDomain, emptyList())
}

2
app/src/test/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModelTest.kt

@ -104,7 +104,7 @@ class ViewThreadViewModelTest {
.allowMainThreadQueries()
.build()
viewModel = ViewThreadViewModel(api, filterModel, timelineCases, eventHub, accountManager, db)
viewModel = ViewThreadViewModel(api, filterModel, timelineCases, db, eventHub, accountManager)
}
@After

Loading…
Cancel
Save