From caaa91658544842ea86ebbf1008f7a0a5904c35b Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 14:46:57 +0800 Subject: [PATCH 01/13] Remove kotlin-gradle-plugin in toml --- gradle/libs.versions.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 768f8bf5f5..aa150fd657 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -113,7 +113,6 @@ glide-compiler = { module = "com.github.bumptech.glide:compiler", version.ref = glide-core = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } glide-okhttp3-integration = { module = "com.github.bumptech.glide:okhttp3-integration", version.ref = "glide" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } -kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } kotlinx-coroutines-rx3 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3", version.ref = "coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } From 74086cfb703bbc5526e994cae8bb640b67127795 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 14:47:43 +0800 Subject: [PATCH 02/13] Group Kotlin in renovate.json --- renovate.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/renovate.json b/renovate.json index f9c2c32704..79fe8ab4e4 100644 --- a/renovate.json +++ b/renovate.json @@ -2,5 +2,17 @@ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base" + ], + "packageRules": [ + { + "groupName": "Kotlin", + "groupSlug": "kotlin", + "matchPackagePrefixes": [ + "com.google.devtools.ksp" + ], + "matchPackagePatterns": [ + "org.jetbrains.kotlin.*" + ] + } ] } From 304b540f47d15149317118bcc328b69e41cc04ac Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 14:48:22 +0800 Subject: [PATCH 03/13] Kotlin 1.9.0 & KSP 1.9.0 --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index aa150fd657..f5bc87c199 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,7 +33,7 @@ glide = "4.15.1" # Deliberate downgrade, https://github.com/tuskyapp/Tusky/issues/3631 glide-animation-plugin = "2.23.0" gson = "2.10.1" -kotlin = "1.8.22" +kotlin = "1.9.0" image-cropper = "4.3.2" material = "1.9.0" material-drawer = "8.4.5" @@ -56,7 +56,7 @@ xmlwriter = "1.0.4" [plugins] android-application = { id = "com.android.application", version.ref = "agp" } -google-ksp = "com.google.devtools.ksp:1.8.22-1.0.11" +google-ksp = "com.google.devtools.ksp:1.9.0-1.0.11" kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } From 419a3cab722c379c02a4d16fe5cae7d5fb3941be Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 15:17:03 +0800 Subject: [PATCH 04/13] Remove useClasspathSnapshot flag --- gradle.properties | 3 --- 1 file changed, 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index f7cd3016d3..54559880a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,9 +6,6 @@ org.gradle.parallel=true # https://docs.gradle.org/7.6/userguide/configuration_cache.html org.gradle.unsafe.configuration-cache=true -# https://blog.jetbrains.com/kotlin/2022/07/a-new-approach-to-incremental-compilation-in-kotlin/ -kotlin.incremental.useClasspathSnapshot=true - # Disable buildFeatures flags by default android.defaults.buildfeatures.aidl=false android.defaults.buildfeatures.buildconfig=false From 008fcae40cb044cd7dd57f9f17302f6e8b90a8e1 Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 14:51:12 +0800 Subject: [PATCH 05/13] Stable ..< operator for open-ended ranges --- .../tusky/components/account/AccountPagerAdapter.kt | 2 +- .../tusky/components/compose/ComposeActivity.kt | 2 +- .../tusky/components/timeline/TimelineFragment.kt | 2 +- .../components/viewthread/edits/ViewEditsViewModel.kt | 2 +- .../java/com/keylesspalace/tusky/json/Iso8601Utils.kt | 2 +- .../com/keylesspalace/tusky/util/BlurHashDecoder.kt | 10 +++++----- .../tusky/util/ListStatusAccessibilityDelegate.kt | 2 +- .../java/com/keylesspalace/tusky/util/LocaleUtils.kt | 2 +- .../tusky/util/NotificationTypeConverter.kt | 2 +- .../com/keylesspalace/tusky/util/PickMediaFiles.kt | 2 +- .../java/com/keylesspalace/tusky/util/SpanUtils.kt | 4 ++-- .../keylesspalace/tusky/util/StatusParsingHelper.kt | 2 +- .../com/keylesspalace/tusky/util/StatusViewHelper.kt | 6 +++--- .../java/com/keylesspalace/tusky/util/StringUtils.kt | 2 +- .../java/com/keylesspalace/tusky/view/GraphView.kt | 2 +- .../com/keylesspalace/tusky/view/MediaPreviewLayout.kt | 4 ++-- .../com/keylesspalace/tusky/util/LocaleUtilsTest.kt | 4 ++-- 17 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt index baeeea43fd..d80694d7b8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt @@ -41,7 +41,7 @@ class AccountPagerAdapter( } fun refreshContent() { - for (i in 0 until TAB_COUNT) { + for (i in 0.. item.uri != null } split.first?.let { content -> - for (i in 0 until content.clip.itemCount) { + for (i in 0.. - if (pos in 0 until adapter.itemCount) { + if (pos in 0..", "
")) - for (i in 1 until sortedEdits.size) { + for (i in 1.. '9') return i } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt b/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt index 117f59c09d..0f411dbcd6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt @@ -44,7 +44,7 @@ object BlurHashDecoder { private fun decode83(str: String, from: Int = 0, to: Int = str.length): Int { var result = 0 - for (i in from until to) { + for (i in from.. ): Bitmap { val imageArray = IntArray(width * height) - for (y in 0 until height) { - for (x in 0 until width) { + for (y in 0.. { val list = mutableListOf() - for (index in 0 until this.size()) { + for (index in 0.. { val ret = HashSet() data?.let { val array = JSONArray(data) - for (i in 0 until array.length()) { + for (i in 0..>() { return listOf(intentData) } else if (clipData != null) { val result: MutableList = mutableListOf() - for (i in 0 until clipData.itemCount) { + for (i in 0..= 0) { + while (end in 0..= 0) { // Search for url first because it can contain the other characters val found = findPattern(string, end) start = found.start end = found.end - if (start in 0 until end) { + if (start in 0.., pollResults: List, animateEmojis: Boolean) { val options = poll.options - for (i in 0 until Status.MAX_POLL_OPTIONS) { + for (i in 0.. Unit) { - for (index in 0 until childCount) { + for (index in 0..): List { - val appLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(2 until 4).joinToString(",")) - val systemLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(4 until configuredLanguages.size).joinToString(",")) + val appLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(2..<4).joinToString(",")) + val systemLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(4.. appCompatDelegate.`when` { AppCompatDelegate.getApplicationLocales() }.thenReturn(appLanguages) From dca6dd42d2b6f645c36b6ca2835440423907db2f Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 14:52:32 +0800 Subject: [PATCH 06/13] Stable replacement of the enum class values function --- .../tusky/components/notifications/NotificationHelper.java | 2 +- .../components/notifications/NotificationsPagingAdapter.kt | 2 +- app/src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java index 6a42e89776..481098934b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationHelper.java @@ -285,7 +285,7 @@ public static void updateSummaryNotifications(Context context, NotificationManag int accountId = (int) account.getId(); // Initialise the map with all channel IDs. - for (Notification.Type ty : Notification.Type.values()) { + for (Notification.Type ty : Notification.Type.getEntries()) { channelGroups.put(getChannelId(account, ty), new ArrayList<>()); } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingAdapter.kt index faa1aefce1..8f45a56f22 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingAdapter.kt @@ -124,7 +124,7 @@ class NotificationsPagingAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val inflater = LayoutInflater.from(parent.context) - return when (NotificationViewKind.values()[viewType]) { + return when (NotificationViewKind.entries[viewType]) { NotificationViewKind.STATUS -> { StatusViewHolder( ItemStatusBinding.inflate(inflater, parent, false), diff --git a/app/src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt index fecb2791ae..5079833c56 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/SpanUtils.kt @@ -128,7 +128,7 @@ private fun findPattern(string: String, fromIndex: Int): FindCharsResult { val result = FindCharsResult() for (i in fromIndex..string.lastIndex) { val c = string[i] - for (matchType in FoundMatchType.values()) { + for (matchType in FoundMatchType.entries) { val finder = finders[matchType] if (finder!!.searchCharacter == c && ( From 96ad2ab7e505a108bff1dd18e9faac6160bb0c4c Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 14:59:47 +0800 Subject: [PATCH 07/13] Use data objects --- .../tusky/components/login/LoginWebViewActivity.kt | 2 +- .../components/notifications/NotificationsViewModel.kt | 10 +++++----- .../tusky/components/viewthread/ViewThreadViewModel.kt | 4 ++-- .../components/viewthread/edits/ViewEditsViewModel.kt | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) 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 be7e323ad0..ed57441652 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 @@ -99,7 +99,7 @@ sealed class LoginResult : Parcelable { data class Err(val errorMessage: String) : LoginResult() @Parcelize - object Cancel : LoginResult() + data object Cancel : LoginResult() } /** Activity to do Oauth process using WebView. */ diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt index d1d41a947b..3f891f2436 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt @@ -103,7 +103,7 @@ sealed class UiAction /** Actions the user can trigger from the UI. These actions may fail. */ sealed class FallibleUiAction : UiAction() { /** Clear all notifications */ - object ClearNotifications : FallibleUiAction() + data object ClearNotifications : FallibleUiAction() } /** @@ -129,7 +129,7 @@ sealed class InfallibleUiAction : UiAction() { // Resets the account's `lastNotificationId`, which can't fail, which is why this is // infallible. Reloading the data may fail, but that's handled by the paging system / // adapter refresh logic. - object LoadNewest : InfallibleUiAction() + data object LoadNewest : InfallibleUiAction() } /** Actions the user can trigger on an individual notification. These may fail. */ @@ -146,13 +146,13 @@ sealed class UiSuccess { // of these three should trigger the UI to refresh. /** A user was blocked */ - object Block : UiSuccess() + data object Block : UiSuccess() /** A user was muted */ - object Mute : UiSuccess() + data object Mute : UiSuccess() /** A conversation was muted */ - object MuteConversation : UiSuccess() + data object MuteConversation : UiSuccess() } /** The result of a successful action on a notification */ diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt index f4b94400b0..da8a91e4d6 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt @@ -516,7 +516,7 @@ class ViewThreadViewModel @Inject constructor( sealed interface ThreadUiState { /** The initial load of the detailed status for this thread */ - object Loading : ThreadUiState + data object Loading : ThreadUiState /** Loading the detailed status has completed, now loading ancestors/descendants */ data class LoadingThread( @@ -535,7 +535,7 @@ sealed interface ThreadUiState { ) : ThreadUiState /** Refreshing the thread with a swipe */ - object Refreshing : ThreadUiState + data object Refreshing : ThreadUiState } enum class RevealButtonState { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsViewModel.kt index 06a49ded6f..08535c4953 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/edits/ViewEditsViewModel.kt @@ -132,12 +132,12 @@ class ViewEditsViewModel @Inject constructor(private val api: MastodonApi) : Vie } sealed interface EditsUiState { - object Initial : EditsUiState - object Loading : EditsUiState + data object Initial : EditsUiState + data object Loading : EditsUiState // "Refreshing" state is necessary, otherwise a refresh state transition is Success -> Success, // and state flows don't emit repeated states, so the UI never updates. - object Refreshing : EditsUiState + data object Refreshing : EditsUiState class Error(val throwable: Throwable) : EditsUiState data class Success( val edits: List From a698039f7c631ddad0e9b5a049fdbebaa81c0e9e Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 11 Jul 2023 15:00:59 +0800 Subject: [PATCH 08/13] Cleanups --- app/src/main/java/com/keylesspalace/tusky/TabData.kt | 4 +--- .../tusky/adapter/StatusBaseViewHolder.java | 12 +++++------- .../tusky/components/compose/ComposeViewModel.kt | 4 +--- .../compose/dialog/AddPollOptionsAdapter.kt | 6 +----- .../notifications/NotificationsFragment.kt | 2 +- .../notifications/NotificationsViewModel.kt | 4 +--- .../components/viewthread/edits/ViewEditsAdapter.kt | 4 ++-- .../java/com/keylesspalace/tusky/db/AccountEntity.kt | 4 +--- .../com/keylesspalace/tusky/util/FlowExtensions.kt | 2 -- .../keylesspalace/tusky/util/NoUnderlineURLSpan.kt | 2 +- .../tusky/viewmodel/EditProfileViewModel.kt | 2 -- .../notifications/NotificationsPagingSourceTest.kt | 2 -- .../notifications/NotificationsViewModelTestBase.kt | 5 ++--- .../NotificationsViewModelTestClearNotifications.kt | 2 -- .../NotificationsViewModelTestFilter.kt | 2 -- .../NotificationsViewModelTestNotificationAction.kt | 2 -- .../NotificationsViewModelTestStatusAction.kt | 2 -- ...NotificationsViewModelTestStatusDisplayOptions.kt | 2 -- .../NotificationsViewModelTestUiState.kt | 2 -- .../NotificationsViewModelTestVisibleId.kt | 2 -- 20 files changed, 16 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/TabData.kt b/app/src/main/java/com/keylesspalace/tusky/TabData.kt index 09d1f1cf42..6bff4a82b2 100644 --- a/app/src/main/java/com/keylesspalace/tusky/TabData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/TabData.kt @@ -52,9 +52,7 @@ data class TabData( other as TabData if (id != other.id) return false - if (arguments != other.arguments) return false - - return true + return arguments == other.arguments } override fun hashCode() = Objects.hash(id, arguments) diff --git a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java index de4d23802b..ca9d5f32f5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java +++ b/app/src/main/java/com/keylesspalace/tusky/adapter/StatusBaseViewHolder.java @@ -114,10 +114,10 @@ public static class Key { private final TextView cardDescription; private final TextView cardUrl; private final PollAdapter pollAdapter; - protected LinearLayout filteredPlaceholder; - protected TextView filteredPlaceholderLabel; - protected Button filteredPlaceholderShowButton; - protected ConstraintLayout statusContainer; + protected final LinearLayout filteredPlaceholder; + protected final TextView filteredPlaceholderLabel; + protected final Button filteredPlaceholderShowButton; + protected final ConstraintLayout statusContainer; private final NumberFormat numberFormat = NumberFormat.getNumberInstance(); private final AbsoluteTimeFormatter absoluteTimeFormatter = new AbsoluteTimeFormatter(); @@ -838,9 +838,7 @@ private void setupFilterPlaceholder(StatusViewData.Concrete status, StatusAction } filteredPlaceholderLabel.setText(itemView.getContext().getString(R.string.status_filter_placeholder_label_format, matchedFilter.getTitle())); - filteredPlaceholderShowButton.setOnClickListener(view -> { - listener.clearWarningAction(getBindingAdapterPosition()); - }); + filteredPlaceholderShowButton.setOnClickListener(view -> listener.clearWarningAction(getBindingAdapterPosition())); } protected static boolean hasPreviewableAttachment(List attachments) { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt index 90389d28ce..0919d29d04 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeViewModel.kt @@ -39,7 +39,6 @@ import com.keylesspalace.tusky.service.ServiceClient import com.keylesspalace.tusky.service.StatusToSend import com.keylesspalace.tusky.util.randomAlphanumericString import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -53,7 +52,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject -@OptIn(FlowPreview::class) class ComposeViewModel @Inject constructor( private val api: MastodonApi, private val accountManager: AccountManager, @@ -95,7 +93,7 @@ class ComposeViewModel @Inject constructor( val media: MutableStateFlow> = MutableStateFlow(emptyList()) val uploadError = MutableSharedFlow(replay = 0, extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) - lateinit var composeKind: ComposeKind + private lateinit var composeKind: ComposeKind // Used in ComposeActivity to pass state to result function when cropImage contract inflight var cropImageItemOld: QueuedMedia? = null 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 ded1b7cfdd..4d7ecdca85 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 @@ -75,10 +75,6 @@ class AddPollOptionsAdapter( } private fun validateInput(): Boolean { - if (options.contains("") || options.distinct().size != options.size) { - return false - } - - return true + return !(options.contains("") || options.distinct().size != options.size) } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt index 78f7a1565e..3c0f0da4d5 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt @@ -293,7 +293,7 @@ class NotificationsFragment : val position = adapter.snapshot().indexOfFirst { it?.statusViewData?.status?.id == (action as StatusAction).statusViewData.id } - if (position != RecyclerView.NO_POSITION) { + if (position != NO_POSITION) { adapter.notifyItemChanged(position) } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt index 3f891f2436..1f3f982b9d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModel.kt @@ -46,7 +46,6 @@ import com.keylesspalace.tusky.util.toViewData import com.keylesspalace.tusky.viewdata.NotificationViewData import com.keylesspalace.tusky.viewdata.StatusViewData import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -70,7 +69,6 @@ import kotlinx.coroutines.rx3.await import retrofit2.HttpException import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.ExperimentalTime data class UiState( /** Filtered notification types */ @@ -286,7 +284,7 @@ sealed class UiError( } } -@OptIn(ExperimentalCoroutinesApi::class, FlowPreview::class, ExperimentalTime::class) +@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModel @Inject constructor( private val repository: NotificationsRepository, private val preferences: SharedPreferences, 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 33085f82bd..56bf1ffc4a 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 @@ -51,10 +51,10 @@ class ViewEditsAdapter( private val absoluteTimeFormatter = AbsoluteTimeFormatter() /** Size of large text in this theme, in px */ - var largeTextSizePx: Float = 0f + private var largeTextSizePx: Float = 0f /** Size of medium text in this theme, in px */ - var mediumTextSizePx: Float = 0f + private var mediumTextSizePx: Float = 0f override fun onCreateViewHolder( parent: ViewGroup, diff --git a/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt b/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt index cdde765f78..08a40c611e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/db/AccountEntity.kt @@ -125,9 +125,7 @@ data class AccountEntity( other as AccountEntity if (id == other.id) return true - if (domain == other.domain && accountId == other.accountId) return true - - return false + return domain == other.domain && accountId == other.accountId } override fun hashCode(): Int { diff --git a/app/src/main/java/com/keylesspalace/tusky/util/FlowExtensions.kt b/app/src/main/java/com/keylesspalace/tusky/util/FlowExtensions.kt index 7fcf773590..8de7129ce1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/FlowExtensions.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/FlowExtensions.kt @@ -20,7 +20,6 @@ package com.keylesspalace.tusky.util import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlin.time.Duration -import kotlin.time.ExperimentalTime import kotlin.time.TimeMark import kotlin.time.TimeSource @@ -54,7 +53,6 @@ import kotlin.time.TimeSource * @param timeout Emissions within this duration of the last emission are filtered * @param timeSource Used to measure elapsed time. Normally only overridden in tests */ -@OptIn(ExperimentalTime::class) fun Flow.throttleFirst( timeout: Duration, timeSource: TimeSource = TimeSource.Monotonic diff --git a/app/src/main/java/com/keylesspalace/tusky/util/NoUnderlineURLSpan.kt b/app/src/main/java/com/keylesspalace/tusky/util/NoUnderlineURLSpan.kt index 12be84d8a8..59d8bbabe0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/NoUnderlineURLSpan.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/NoUnderlineURLSpan.kt @@ -19,7 +19,7 @@ import android.text.TextPaint import android.text.style.URLSpan import android.view.View -open class NoUnderlineURLSpan constructor(val url: String) : URLSpan(url) { +open class NoUnderlineURLSpan(val url: String) : URLSpan(url) { // This should not be necessary. But if you don't do this the [StatusLengthTest] tests // fail. Without this, accessing the `url` property, or calling `getUrl()` (which should diff --git a/app/src/main/java/com/keylesspalace/tusky/viewmodel/EditProfileViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/viewmodel/EditProfileViewModel.kt index fe51103819..21a8a01d71 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewmodel/EditProfileViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewmodel/EditProfileViewModel.kt @@ -35,7 +35,6 @@ import com.keylesspalace.tusky.util.Resource import com.keylesspalace.tusky.util.Success import com.keylesspalace.tusky.util.getServerErrorMessage import com.keylesspalace.tusky.util.randomAlphanumericString -import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asFlow @@ -64,7 +63,6 @@ class EditProfileViewModel @Inject constructor( val headerData = MutableLiveData() val saveData = MutableLiveData>() - @OptIn(FlowPreview::class) val instanceData: Flow = instanceInfoRepo::getInstanceInfo.asFlow() .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1) diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingSourceTest.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingSourceTest.kt index 450f702a7c..b91e07161e 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingSourceTest.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsPagingSourceTest.kt @@ -22,7 +22,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.gson.Gson import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.network.MastodonApi -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import okhttp3.ResponseBody.Companion.toResponseBody import org.junit.Assert.assertEquals @@ -38,7 +37,6 @@ import retrofit2.Response @Config(sdk = [28]) @RunWith(AndroidJUnit4::class) -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsPagingSourceTest { @Test fun `load() returns error message on HTTP error`() = runTest { diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt index 773c676629..666d591cd0 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestBase.kt @@ -48,7 +48,7 @@ import retrofit2.HttpException import retrofit2.Response @OptIn(ExperimentalCoroutinesApi::class) -class MainCoroutineRule constructor(private val dispatcher: TestDispatcher = UnconfinedTestDispatcher()) : TestWatcher() { +class MainCoroutineRule(private val dispatcher: TestDispatcher = UnconfinedTestDispatcher()) : TestWatcher() { override fun starting(description: Description) { super.starting(description) Dispatchers.setMain(dispatcher) @@ -62,7 +62,6 @@ class MainCoroutineRule constructor(private val dispatcher: TestDispatcher = Unc @Config(sdk = [28]) @RunWith(AndroidJUnit4::class) -@OptIn(ExperimentalCoroutinesApi::class) abstract class NotificationsViewModelTestBase { protected lateinit var notificationsRepository: NotificationsRepository protected lateinit var sharedPreferencesMap: MutableMap @@ -73,7 +72,7 @@ abstract class NotificationsViewModelTestBase { protected lateinit var viewModel: NotificationsViewModel /** Empty success response, for API calls that return one */ - protected var emptySuccess = Response.success("".toResponseBody()) + protected var emptySuccess: Response = Response.success("".toResponseBody()) /** Empty error response, for API calls that return one */ protected var emptyError: Response = Response.error(404, "".toResponseBody()) diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestClearNotifications.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestClearNotifications.kt index 03d8506179..e6b765be44 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestClearNotifications.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestClearNotifications.kt @@ -19,7 +19,6 @@ package com.keylesspalace.tusky.components.notifications import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test import org.mockito.kotlin.doReturn @@ -34,7 +33,6 @@ import org.mockito.kotlin.verify * This is only tested in the success case; if it passed there it must also * have passed in the error case. */ -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestClearNotifications : NotificationsViewModelTestBase() { @Test fun `clearing notifications succeeds && invalidate the repository`() = runTest { diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestFilter.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestFilter.kt index a2be13e2a6..98737e4319 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestFilter.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestFilter.kt @@ -21,7 +21,6 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.entity.Notification -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test import org.mockito.kotlin.argumentCaptor @@ -33,7 +32,6 @@ import org.mockito.kotlin.verify * - Is the [UiState] updated correctly? * - Are the correct [AccountManager] functions called, with the correct arguments? */ -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestFilter : NotificationsViewModelTestBase() { @Test diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestNotificationAction.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestNotificationAction.kt index b6177c5562..3c48dd2b1c 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestNotificationAction.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestNotificationAction.kt @@ -21,7 +21,6 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import com.keylesspalace.tusky.entity.Relationship import io.reactivex.rxjava3.core.Single -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test import org.mockito.kotlin.any @@ -39,7 +38,6 @@ import org.mockito.kotlin.verify * This is only tested in the success case; if it passed there it must also * have passed in the error case. */ -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestNotificationAction : NotificationsViewModelTestBase() { /** Dummy relationship */ private val relationship = Relationship( diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusAction.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusAction.kt index 3a102c12a0..cf7ce2dc14 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusAction.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusAction.kt @@ -22,7 +22,6 @@ import at.connyduck.calladapter.networkresult.NetworkResult import com.google.common.truth.Truth.assertThat import com.keylesspalace.tusky.FilterV1Test.Companion.mockStatus import com.keylesspalace.tusky.viewdata.StatusViewData -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test import org.mockito.kotlin.any @@ -40,7 +39,6 @@ import org.mockito.kotlin.verify * This is only tested in the success case; if it passed there it must also * have passed in the error case. */ -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestStatusAction : NotificationsViewModelTestBase() { private val status = mockStatus(pollOptions = listOf("Choice 1", "Choice 2", "Choice 3")) private val statusViewData = StatusViewData.Concrete( diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusDisplayOptions.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusDisplayOptions.kt index 29e3c7a188..f3dd3c4785 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusDisplayOptions.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestStatusDisplayOptions.kt @@ -23,7 +23,6 @@ import com.keylesspalace.tusky.appstore.PreferenceChangedEvent import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.CardViewMode import com.keylesspalace.tusky.util.StatusDisplayOptions -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test @@ -34,7 +33,6 @@ import org.junit.Test * - Does the make() function correctly use an updated preference? * - Is the correct update emitted when a relevant preference changes? */ -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestStatusDisplayOptions : NotificationsViewModelTestBase() { private val defaultStatusDisplayOptions = StatusDisplayOptions( diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt index a77e503ca5..e295dda057 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestUiState.kt @@ -22,7 +22,6 @@ import com.google.common.truth.Truth.assertThat import com.keylesspalace.tusky.appstore.PreferenceChangedEvent import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.settings.PrefKeys -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test @@ -32,7 +31,6 @@ import org.junit.Test * - Is the initial value taken from values in sharedPreferences and account? * - Is the correct update emitted when a relevant preference changes? */ -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestUiState : NotificationsViewModelTestBase() { private val initialUiState = UiState( diff --git a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestVisibleId.kt b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestVisibleId.kt index 03a9a87083..f6b7360e6c 100644 --- a/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestVisibleId.kt +++ b/app/src/test/java/com/keylesspalace/tusky/components/notifications/NotificationsViewModelTestVisibleId.kt @@ -19,13 +19,11 @@ package com.keylesspalace.tusky.components.notifications import com.google.common.truth.Truth.assertThat import com.keylesspalace.tusky.db.AccountEntity -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import org.junit.Test import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.verify -@OptIn(ExperimentalCoroutinesApi::class) class NotificationsViewModelTestVisibleId : NotificationsViewModelTestBase() { @Test From 3c21b6051fb623b5818c1b7fd4f53c9d8e1943fc Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 12 Jul 2023 09:26:16 +0800 Subject: [PATCH 09/13] Revert "Stable ..< operator for open-ended ranges" This reverts commit 008fcae40cb044cd7dd57f9f17302f6e8b90a8e1. --- .../tusky/components/account/AccountPagerAdapter.kt | 2 +- .../tusky/components/compose/ComposeActivity.kt | 2 +- .../tusky/components/timeline/TimelineFragment.kt | 2 +- .../components/viewthread/edits/ViewEditsViewModel.kt | 2 +- .../java/com/keylesspalace/tusky/json/Iso8601Utils.kt | 2 +- .../com/keylesspalace/tusky/util/BlurHashDecoder.kt | 10 +++++----- .../tusky/util/ListStatusAccessibilityDelegate.kt | 2 +- .../java/com/keylesspalace/tusky/util/LocaleUtils.kt | 2 +- .../tusky/util/NotificationTypeConverter.kt | 2 +- .../com/keylesspalace/tusky/util/PickMediaFiles.kt | 2 +- .../java/com/keylesspalace/tusky/util/SpanUtils.kt | 4 ++-- .../keylesspalace/tusky/util/StatusParsingHelper.kt | 2 +- .../com/keylesspalace/tusky/util/StatusViewHelper.kt | 6 +++--- .../java/com/keylesspalace/tusky/util/StringUtils.kt | 2 +- .../java/com/keylesspalace/tusky/view/GraphView.kt | 2 +- .../com/keylesspalace/tusky/view/MediaPreviewLayout.kt | 4 ++-- .../com/keylesspalace/tusky/util/LocaleUtilsTest.kt | 4 ++-- 17 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt index d80694d7b8..baeeea43fd 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/account/AccountPagerAdapter.kt @@ -41,7 +41,7 @@ class AccountPagerAdapter( } fun refreshContent() { - for (i in 0.. item.uri != null } split.first?.let { content -> - for (i in 0.. - if (pos in 0..", "
")) - for (i in 1.. '9') return i } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt b/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt index 0f411dbcd6..117f59c09d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/BlurHashDecoder.kt @@ -44,7 +44,7 @@ object BlurHashDecoder { private fun decode83(str: String, from: Int = 0, to: Int = str.length): Int { var result = 0 - for (i in from.. ): Bitmap { val imageArray = IntArray(width * height) - for (y in 0.. { val list = mutableListOf() - for (index in 0.. { val ret = HashSet() data?.let { val array = JSONArray(data) - for (i in 0..>() { return listOf(intentData) } else if (clipData != null) { val result: MutableList = mutableListOf() - for (i in 0..= 0) { + while (end in 0 until length && start >= 0) { // Search for url first because it can contain the other characters val found = findPattern(string, end) start = found.start end = found.end - if (start in 0.., pollResults: List, animateEmojis: Boolean) { val options = poll.options - for (i in 0.. Unit) { - for (index in 0..): List { - val appLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(2..<4).joinToString(",")) - val systemLanguages = LocaleListCompat.forLanguageTags(configuredLanguages.slice(4.. appCompatDelegate.`when` { AppCompatDelegate.getApplicationLocales() }.thenReturn(appLanguages) From 3146ea8c9072530a284c0481f1ccc554c9ff3720 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 12 Jul 2023 23:48:40 +0800 Subject: [PATCH 10/13] Regenerate lint-baseline.xml --- app/lint-baseline.xml | 1973 +++++++++++++++++++++++++++++++++++------ 1 file changed, 1719 insertions(+), 254 deletions(-) diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index 056acea995..0ece4da82b 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -12,28 +12,6 @@ column="17"/> - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file="src/main/res/layout/activity_compose.xml" + line="314" + column="13"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + id="StringFormatMatches" + message="Wrong argument type for formatting argument '#1' in `accessibility_talking_about_tag`: conversion is '`d`', received `<ErrorType>` (argument #2 in method call)" + errorLine1=" totalAccounts," + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/components/trending/TrendingTagViewHolder.kt" + line="53" + column="17"/> + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -4436,7 +5974,7 @@ errorLine2=" ~~~~~~~~"> @@ -4447,7 +5985,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> @@ -4458,7 +5996,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> @@ -4594,17 +6132,6 @@ column="41"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7248,7 +8713,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -7259,7 +8724,7 @@ errorLine2=" ~~~~~~~"> @@ -7270,7 +8735,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~"> @@ -7281,7 +8746,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -7292,7 +8757,7 @@ errorLine2=" ~~~~~~~"> @@ -7303,7 +8768,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -7314,7 +8779,7 @@ errorLine2=" ~~~~~~~"> @@ -7325,7 +8790,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> @@ -7336,7 +8801,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -7347,7 +8812,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> @@ -7358,7 +8823,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> From 1a9cee02c827626ff42d28d20424dc2b2ef90c32 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 19 Jul 2023 16:07:17 +0800 Subject: [PATCH 11/13] Revert "Regenerate lint-baseline.xml" This reverts commit 3146ea8c9072530a284c0481f1ccc554c9ff3720. --- app/lint-baseline.xml | 1987 ++++++----------------------------------- 1 file changed, 261 insertions(+), 1726 deletions(-) diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index 0ece4da82b..056acea995 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -12,6 +12,28 @@ column="17"/> + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?android:attr/textColorTertiary"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/activity_compose.xml" + line="314" + column="13"/> - + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="@color/tusky_blue"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/item_emoji_pref.xml" + line="78" + column="9"/> - + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="@color/tusky_blue"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/item_emoji_pref.xml" + line="94" + column="9"/> - + id="UseCompatLoadingForDrawables" + message="Use `AppCompatResources.getDrawable()`" + errorLine1=" return ctx.getDrawable(R.drawable.avatar_default)!!" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/com/keylesspalace/tusky/MainActivity.kt" + line="494" + column="28"/> - + id="UseCompatTextViewDrawableXml" + message="Use `app:drawableStartCompat` instead of `android:drawableStart`" + errorLine1=" android:drawableStart="@mipmap/ic_launcher"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/activity_about.xml" + line="38" + column="21"/> - + id="UseCompatTextViewDrawableXml" + message="Use `app:drawableStartCompat` instead of `android:drawableStart`" + errorLine1=" android:drawableStart="@drawable/ic_briefcase"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/activity_account.xml" + line="282" + column="29"/> + id="UseCompatTextViewDrawableXml" + message="Use `app:drawableStartCompat` instead of `android:drawableStart`" + errorLine1=" android:drawableStart="@drawable/ic_plus_24dp"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - - + id="UseCompatTextViewDrawableXml" + message="Use `app:drawableStartCompat` instead of `android:drawableStart`" + errorLine1=" android:drawableStart="@drawable/ic_person_add_24dp"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/item_follow.xml" + line="17" + column="9"/> + id="UseCompatTextViewDrawableXml" + message="Use `app:drawableStartCompat` instead of `android:drawableStart`" + errorLine1=" android:drawableStart="@drawable/ic_reblog_18dp"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/item_status.xml" + line="20" + column="9"/> + + + + file="src/main/res/layout/view_poll_preview.xml" + line="15" + column="9"/> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5974,7 +4436,7 @@ errorLine2=" ~~~~~~~~"> @@ -5985,7 +4447,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> @@ -5996,7 +4458,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> @@ -6132,6 +4594,17 @@ column="41"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8713,7 +7248,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -8724,7 +7259,7 @@ errorLine2=" ~~~~~~~"> @@ -8735,7 +7270,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~"> @@ -8746,7 +7281,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -8757,7 +7292,7 @@ errorLine2=" ~~~~~~~"> @@ -8768,7 +7303,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -8779,7 +7314,7 @@ errorLine2=" ~~~~~~~"> @@ -8790,7 +7325,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> @@ -8801,7 +7336,7 @@ errorLine2=" ~~~~~~~~~~~~"> @@ -8812,7 +7347,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> @@ -8823,7 +7358,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> From 03166e78f288b718bbc7cf991426886128424671 Mon Sep 17 00:00:00 2001 From: Goooler Date: Wed, 19 Jul 2023 16:08:28 +0800 Subject: [PATCH 12/13] Fix lint by pinning lint version See https://issuetracker.google.com/issues/185418482 --- gradle.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gradle.properties b/gradle.properties index 54559880a5..db28d05bc9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,6 @@ android.defaults.buildfeatures.shaders=false android.enableR8.fullMode=true android.nonTransitiveRClass=true android.useAndroidX=true + +# Remove this line after upgraing to AGP 8.1, see https://issuetracker.google.com/issues/185418482 +android.experimental.lint.version=8.1.0-rc01 From bff39d7b7314a4d19822a95031bd8e04e6a5a720 Mon Sep 17 00:00:00 2001 From: Goooler Date: Mon, 31 Jul 2023 09:38:11 +0800 Subject: [PATCH 13/13] KSP 1.0.12 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 393bcb89bd..76631437a0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -56,7 +56,7 @@ xmlwriter = "1.0.4" [plugins] android-application = { id = "com.android.application", version.ref = "agp" } -google-ksp = "com.google.devtools.ksp:1.9.0-1.0.11" +google-ksp = "com.google.devtools.ksp:1.9.0-1.0.12" kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }