Kotlin 1.9.0 (#3835)

Update to Kotlin 1.9.0 and migrate to newer language idioms.

- Remove unnecessary @OptIn for features migrated to mainstream
- Use `data object` where appropriate
- Use new enum `entries` property
This commit is contained in:
Goooler 2023-08-02 15:04:24 +08:00 committed by GitHub
parent 5391b5f797
commit 40bd95d752
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 44 additions and 71 deletions

View File

@ -52,9 +52,7 @@ data class TabData(
other as TabData other as TabData
if (id != other.id) return false if (id != other.id) return false
if (arguments != other.arguments) return false return arguments == other.arguments
return true
} }
override fun hashCode() = Objects.hash(id, arguments) override fun hashCode() = Objects.hash(id, arguments)

View File

@ -114,10 +114,10 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
private final TextView cardDescription; private final TextView cardDescription;
private final TextView cardUrl; private final TextView cardUrl;
private final PollAdapter pollAdapter; private final PollAdapter pollAdapter;
protected LinearLayout filteredPlaceholder; protected final LinearLayout filteredPlaceholder;
protected TextView filteredPlaceholderLabel; protected final TextView filteredPlaceholderLabel;
protected Button filteredPlaceholderShowButton; protected final Button filteredPlaceholderShowButton;
protected ConstraintLayout statusContainer; protected final ConstraintLayout statusContainer;
private final NumberFormat numberFormat = NumberFormat.getNumberInstance(); private final NumberFormat numberFormat = NumberFormat.getNumberInstance();
private final AbsoluteTimeFormatter absoluteTimeFormatter = new AbsoluteTimeFormatter(); private final AbsoluteTimeFormatter absoluteTimeFormatter = new AbsoluteTimeFormatter();
@ -838,9 +838,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
} }
filteredPlaceholderLabel.setText(itemView.getContext().getString(R.string.status_filter_placeholder_label_format, matchedFilter.getTitle())); filteredPlaceholderLabel.setText(itemView.getContext().getString(R.string.status_filter_placeholder_label_format, matchedFilter.getTitle()));
filteredPlaceholderShowButton.setOnClickListener(view -> { filteredPlaceholderShowButton.setOnClickListener(view -> listener.clearWarningAction(getBindingAdapterPosition()));
listener.clearWarningAction(getBindingAdapterPosition());
});
} }
protected static boolean hasPreviewableAttachment(List<Attachment> attachments) { protected static boolean hasPreviewableAttachment(List<Attachment> attachments) {

View File

@ -39,7 +39,6 @@ import com.keylesspalace.tusky.service.ServiceClient
import com.keylesspalace.tusky.service.StatusToSend import com.keylesspalace.tusky.service.StatusToSend
import com.keylesspalace.tusky.util.randomAlphanumericString import com.keylesspalace.tusky.util.randomAlphanumericString
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@ -53,7 +52,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import javax.inject.Inject import javax.inject.Inject
@OptIn(FlowPreview::class)
class ComposeViewModel @Inject constructor( class ComposeViewModel @Inject constructor(
private val api: MastodonApi, private val api: MastodonApi,
private val accountManager: AccountManager, private val accountManager: AccountManager,
@ -95,7 +93,7 @@ class ComposeViewModel @Inject constructor(
val media: MutableStateFlow<List<QueuedMedia>> = MutableStateFlow(emptyList()) val media: MutableStateFlow<List<QueuedMedia>> = MutableStateFlow(emptyList())
val uploadError = MutableSharedFlow<Throwable>(replay = 0, extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) val uploadError = MutableSharedFlow<Throwable>(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 // Used in ComposeActivity to pass state to result function when cropImage contract inflight
var cropImageItemOld: QueuedMedia? = null var cropImageItemOld: QueuedMedia? = null

View File

@ -75,10 +75,6 @@ class AddPollOptionsAdapter(
} }
private fun validateInput(): Boolean { private fun validateInput(): Boolean {
if (options.contains("") || options.distinct().size != options.size) { return !(options.contains("") || options.distinct().size != options.size)
return false
}
return true
} }
} }

View File

@ -99,7 +99,7 @@ sealed class LoginResult : Parcelable {
data class Err(val errorMessage: String) : LoginResult() data class Err(val errorMessage: String) : LoginResult()
@Parcelize @Parcelize
object Cancel : LoginResult() data object Cancel : LoginResult()
} }
/** Activity to do Oauth process using WebView. */ /** Activity to do Oauth process using WebView. */

View File

@ -285,7 +285,7 @@ public class NotificationHelper {
int accountId = (int) account.getId(); int accountId = (int) account.getId();
// Initialise the map with all channel IDs. // 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<>()); channelGroups.put(getChannelId(account, ty), new ArrayList<>());
} }

View File

@ -293,7 +293,7 @@ class NotificationsFragment :
val position = adapter.snapshot().indexOfFirst { val position = adapter.snapshot().indexOfFirst {
it?.statusViewData?.status?.id == (action as StatusAction).statusViewData.id it?.statusViewData?.status?.id == (action as StatusAction).statusViewData.id
} }
if (position != RecyclerView.NO_POSITION) { if (position != NO_POSITION) {
adapter.notifyItemChanged(position) adapter.notifyItemChanged(position)
} }
} }

View File

@ -124,7 +124,7 @@ class NotificationsPagingAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context) val inflater = LayoutInflater.from(parent.context)
return when (NotificationViewKind.values()[viewType]) { return when (NotificationViewKind.entries[viewType]) {
NotificationViewKind.STATUS -> { NotificationViewKind.STATUS -> {
StatusViewHolder( StatusViewHolder(
ItemStatusBinding.inflate(inflater, parent, false), ItemStatusBinding.inflate(inflater, parent, false),

View File

@ -46,7 +46,6 @@ import com.keylesspalace.tusky.util.toViewData
import com.keylesspalace.tusky.viewdata.NotificationViewData import com.keylesspalace.tusky.viewdata.NotificationViewData
import com.keylesspalace.tusky.viewdata.StatusViewData import com.keylesspalace.tusky.viewdata.StatusViewData
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
@ -70,7 +69,6 @@ import kotlinx.coroutines.rx3.await
import retrofit2.HttpException import retrofit2.HttpException
import javax.inject.Inject import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.ExperimentalTime
data class UiState( data class UiState(
/** Filtered notification types */ /** Filtered notification types */
@ -103,7 +101,7 @@ sealed class UiAction
/** Actions the user can trigger from the UI. These actions may fail. */ /** Actions the user can trigger from the UI. These actions may fail. */
sealed class FallibleUiAction : UiAction() { sealed class FallibleUiAction : UiAction() {
/** Clear all notifications */ /** Clear all notifications */
object ClearNotifications : FallibleUiAction() data object ClearNotifications : FallibleUiAction()
} }
/** /**
@ -129,7 +127,7 @@ sealed class InfallibleUiAction : UiAction() {
// Resets the account's `lastNotificationId`, which can't fail, which is why this is // 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 / // infallible. Reloading the data may fail, but that's handled by the paging system /
// adapter refresh logic. // adapter refresh logic.
object LoadNewest : InfallibleUiAction() data object LoadNewest : InfallibleUiAction()
} }
/** Actions the user can trigger on an individual notification. These may fail. */ /** Actions the user can trigger on an individual notification. These may fail. */
@ -146,13 +144,13 @@ sealed class UiSuccess {
// of these three should trigger the UI to refresh. // of these three should trigger the UI to refresh.
/** A user was blocked */ /** A user was blocked */
object Block : UiSuccess() data object Block : UiSuccess()
/** A user was muted */ /** A user was muted */
object Mute : UiSuccess() data object Mute : UiSuccess()
/** A conversation was muted */ /** A conversation was muted */
object MuteConversation : UiSuccess() data object MuteConversation : UiSuccess()
} }
/** The result of a successful action on a notification */ /** The result of a successful action on a notification */
@ -286,7 +284,7 @@ sealed class UiError(
} }
} }
@OptIn(ExperimentalCoroutinesApi::class, FlowPreview::class, ExperimentalTime::class) @OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModel @Inject constructor( class NotificationsViewModel @Inject constructor(
private val repository: NotificationsRepository, private val repository: NotificationsRepository,
private val preferences: SharedPreferences, private val preferences: SharedPreferences,

View File

@ -516,7 +516,7 @@ class ViewThreadViewModel @Inject constructor(
sealed interface ThreadUiState { sealed interface ThreadUiState {
/** The initial load of the detailed status for this thread */ /** 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 */ /** Loading the detailed status has completed, now loading ancestors/descendants */
data class LoadingThread( data class LoadingThread(
@ -535,7 +535,7 @@ sealed interface ThreadUiState {
) : ThreadUiState ) : ThreadUiState
/** Refreshing the thread with a swipe */ /** Refreshing the thread with a swipe */
object Refreshing : ThreadUiState data object Refreshing : ThreadUiState
} }
enum class RevealButtonState { enum class RevealButtonState {

View File

@ -51,10 +51,10 @@ class ViewEditsAdapter(
private val absoluteTimeFormatter = AbsoluteTimeFormatter() private val absoluteTimeFormatter = AbsoluteTimeFormatter()
/** Size of large text in this theme, in px */ /** 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 */ /** Size of medium text in this theme, in px */
var mediumTextSizePx: Float = 0f private var mediumTextSizePx: Float = 0f
override fun onCreateViewHolder( override fun onCreateViewHolder(
parent: ViewGroup, parent: ViewGroup,

View File

@ -132,12 +132,12 @@ class ViewEditsViewModel @Inject constructor(private val api: MastodonApi) : Vie
} }
sealed interface EditsUiState { sealed interface EditsUiState {
object Initial : EditsUiState data object Initial : EditsUiState
object Loading : EditsUiState data object Loading : EditsUiState
// "Refreshing" state is necessary, otherwise a refresh state transition is Success -> Success, // "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. // 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 class Error(val throwable: Throwable) : EditsUiState
data class Success( data class Success(
val edits: List<StatusEdit> val edits: List<StatusEdit>

View File

@ -129,9 +129,7 @@ data class AccountEntity(
other as AccountEntity other as AccountEntity
if (id == other.id) return true if (id == other.id) return true
if (domain == other.domain && accountId == other.accountId) return true return domain == other.domain && accountId == other.accountId
return false
} }
override fun hashCode(): Int { override fun hashCode(): Int {

View File

@ -20,7 +20,6 @@ package com.keylesspalace.tusky.util
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.ExperimentalTime
import kotlin.time.TimeMark import kotlin.time.TimeMark
import kotlin.time.TimeSource 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 timeout Emissions within this duration of the last emission are filtered
* @param timeSource Used to measure elapsed time. Normally only overridden in tests * @param timeSource Used to measure elapsed time. Normally only overridden in tests
*/ */
@OptIn(ExperimentalTime::class)
fun <T> Flow<T>.throttleFirst( fun <T> Flow<T>.throttleFirst(
timeout: Duration, timeout: Duration,
timeSource: TimeSource = TimeSource.Monotonic timeSource: TimeSource = TimeSource.Monotonic

View File

@ -19,7 +19,7 @@ import android.text.TextPaint
import android.text.style.URLSpan import android.text.style.URLSpan
import android.view.View 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 // 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 // fail. Without this, accessing the `url` property, or calling `getUrl()` (which should

View File

@ -128,7 +128,7 @@ private fun findPattern(string: String, fromIndex: Int): FindCharsResult {
val result = FindCharsResult() val result = FindCharsResult()
for (i in fromIndex..string.lastIndex) { for (i in fromIndex..string.lastIndex) {
val c = string[i] val c = string[i]
for (matchType in FoundMatchType.values()) { for (matchType in FoundMatchType.entries) {
val finder = finders[matchType] val finder = finders[matchType]
if (finder!!.searchCharacter == c && if (finder!!.searchCharacter == c &&
( (

View File

@ -35,7 +35,6 @@ import com.keylesspalace.tusky.util.Resource
import com.keylesspalace.tusky.util.Success import com.keylesspalace.tusky.util.Success
import com.keylesspalace.tusky.util.getServerErrorMessage import com.keylesspalace.tusky.util.getServerErrorMessage
import com.keylesspalace.tusky.util.randomAlphanumericString import com.keylesspalace.tusky.util.randomAlphanumericString
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asFlow
@ -64,7 +63,6 @@ class EditProfileViewModel @Inject constructor(
val headerData = MutableLiveData<Uri>() val headerData = MutableLiveData<Uri>()
val saveData = MutableLiveData<Resource<Nothing>>() val saveData = MutableLiveData<Resource<Nothing>>()
@OptIn(FlowPreview::class)
val instanceData: Flow<InstanceInfo> = instanceInfoRepo::getInstanceInfo.asFlow() val instanceData: Flow<InstanceInfo> = instanceInfoRepo::getInstanceInfo.asFlow()
.shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1) .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)

View File

@ -22,7 +22,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.gson.Gson import com.google.gson.Gson
import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Notification
import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.network.MastodonApi
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import okhttp3.ResponseBody.Companion.toResponseBody import okhttp3.ResponseBody.Companion.toResponseBody
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
@ -38,7 +37,6 @@ import retrofit2.Response
@Config(sdk = [28]) @Config(sdk = [28])
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsPagingSourceTest { class NotificationsPagingSourceTest {
@Test @Test
fun `load() returns error message on HTTP error`() = runTest { fun `load() returns error message on HTTP error`() = runTest {

View File

@ -48,7 +48,7 @@ import retrofit2.HttpException
import retrofit2.Response import retrofit2.Response
@OptIn(ExperimentalCoroutinesApi::class) @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) { override fun starting(description: Description) {
super.starting(description) super.starting(description)
Dispatchers.setMain(dispatcher) Dispatchers.setMain(dispatcher)
@ -62,7 +62,6 @@ class MainCoroutineRule constructor(private val dispatcher: TestDispatcher = Unc
@Config(sdk = [28]) @Config(sdk = [28])
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
@OptIn(ExperimentalCoroutinesApi::class)
abstract class NotificationsViewModelTestBase { abstract class NotificationsViewModelTestBase {
protected lateinit var notificationsRepository: NotificationsRepository protected lateinit var notificationsRepository: NotificationsRepository
protected lateinit var sharedPreferencesMap: MutableMap<String, Boolean> protected lateinit var sharedPreferencesMap: MutableMap<String, Boolean>
@ -73,7 +72,7 @@ abstract class NotificationsViewModelTestBase {
protected lateinit var viewModel: NotificationsViewModel protected lateinit var viewModel: NotificationsViewModel
/** Empty success response, for API calls that return one */ /** Empty success response, for API calls that return one */
protected var emptySuccess = Response.success("".toResponseBody()) protected var emptySuccess: Response<ResponseBody> = Response.success("".toResponseBody())
/** Empty error response, for API calls that return one */ /** Empty error response, for API calls that return one */
protected var emptyError: Response<ResponseBody> = Response.error(404, "".toResponseBody()) protected var emptyError: Response<ResponseBody> = Response.error(404, "".toResponseBody())

View File

@ -19,7 +19,6 @@ package com.keylesspalace.tusky.components.notifications
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
import org.mockito.kotlin.doReturn 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 * This is only tested in the success case; if it passed there it must also
* have passed in the error case. * have passed in the error case.
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestClearNotifications : NotificationsViewModelTestBase() { class NotificationsViewModelTestClearNotifications : NotificationsViewModelTestBase() {
@Test @Test
fun `clearing notifications succeeds && invalidate the repository`() = runTest { fun `clearing notifications succeeds && invalidate the repository`() = runTest {

View File

@ -21,7 +21,6 @@ import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountEntity
import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Notification
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.argumentCaptor
@ -33,7 +32,6 @@ import org.mockito.kotlin.verify
* - Is the [UiState] updated correctly? * - Is the [UiState] updated correctly?
* - Are the correct [AccountManager] functions called, with the correct arguments? * - Are the correct [AccountManager] functions called, with the correct arguments?
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestFilter : NotificationsViewModelTestBase() { class NotificationsViewModelTestFilter : NotificationsViewModelTestBase() {
@Test @Test

View File

@ -21,7 +21,6 @@ import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import com.keylesspalace.tusky.entity.Relationship import com.keylesspalace.tusky.entity.Relationship
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
import org.mockito.kotlin.any 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 * This is only tested in the success case; if it passed there it must also
* have passed in the error case. * have passed in the error case.
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestNotificationAction : NotificationsViewModelTestBase() { class NotificationsViewModelTestNotificationAction : NotificationsViewModelTestBase() {
/** Dummy relationship */ /** Dummy relationship */
private val relationship = Relationship( private val relationship = Relationship(

View File

@ -22,7 +22,6 @@ import at.connyduck.calladapter.networkresult.NetworkResult
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import com.keylesspalace.tusky.FilterV1Test.Companion.mockStatus import com.keylesspalace.tusky.FilterV1Test.Companion.mockStatus
import com.keylesspalace.tusky.viewdata.StatusViewData import com.keylesspalace.tusky.viewdata.StatusViewData
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
import org.mockito.kotlin.any 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 * This is only tested in the success case; if it passed there it must also
* have passed in the error case. * have passed in the error case.
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestStatusAction : NotificationsViewModelTestBase() { class NotificationsViewModelTestStatusAction : NotificationsViewModelTestBase() {
private val status = mockStatus(pollOptions = listOf("Choice 1", "Choice 2", "Choice 3")) private val status = mockStatus(pollOptions = listOf("Choice 1", "Choice 2", "Choice 3"))
private val statusViewData = StatusViewData.Concrete( private val statusViewData = StatusViewData.Concrete(

View File

@ -23,7 +23,6 @@ import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.settings.PrefKeys
import com.keylesspalace.tusky.util.CardViewMode import com.keylesspalace.tusky.util.CardViewMode
import com.keylesspalace.tusky.util.StatusDisplayOptions import com.keylesspalace.tusky.util.StatusDisplayOptions
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
@ -34,7 +33,6 @@ import org.junit.Test
* - Does the make() function correctly use an updated preference? * - Does the make() function correctly use an updated preference?
* - Is the correct update emitted when a relevant preference changes? * - Is the correct update emitted when a relevant preference changes?
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestStatusDisplayOptions : NotificationsViewModelTestBase() { class NotificationsViewModelTestStatusDisplayOptions : NotificationsViewModelTestBase() {
private val defaultStatusDisplayOptions = StatusDisplayOptions( private val defaultStatusDisplayOptions = StatusDisplayOptions(

View File

@ -22,7 +22,6 @@ import com.google.common.truth.Truth.assertThat
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.entity.Notification import com.keylesspalace.tusky.entity.Notification
import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.settings.PrefKeys
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test 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 initial value taken from values in sharedPreferences and account?
* - Is the correct update emitted when a relevant preference changes? * - Is the correct update emitted when a relevant preference changes?
*/ */
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestUiState : NotificationsViewModelTestBase() { class NotificationsViewModelTestUiState : NotificationsViewModelTestBase() {
private val initialUiState = UiState( private val initialUiState = UiState(

View File

@ -19,13 +19,11 @@ package com.keylesspalace.tusky.components.notifications
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import com.keylesspalace.tusky.db.AccountEntity import com.keylesspalace.tusky.db.AccountEntity
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Test import org.junit.Test
import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
@OptIn(ExperimentalCoroutinesApi::class)
class NotificationsViewModelTestVisibleId : NotificationsViewModelTestBase() { class NotificationsViewModelTestVisibleId : NotificationsViewModelTestBase() {
@Test @Test

View File

@ -5,9 +5,6 @@ org.gradle.jvmargs=-XX:+UseParallelGC -Xmx4g -Dfile.encoding=UTF-8 -XX:MaxMetasp
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.configuration-cache=true org.gradle.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 # Disable buildFeatures flags by default
android.defaults.buildfeatures.resvalues=false android.defaults.buildfeatures.resvalues=false
android.defaults.buildfeatures.shaders=false android.defaults.buildfeatures.shaders=false

View File

@ -33,7 +33,7 @@ glide = "4.15.1"
# Deliberate downgrade, https://github.com/tuskyapp/Tusky/issues/3631 # Deliberate downgrade, https://github.com/tuskyapp/Tusky/issues/3631
glide-animation-plugin = "2.23.0" glide-animation-plugin = "2.23.0"
gson = "2.10.1" gson = "2.10.1"
kotlin = "1.8.22" kotlin = "1.9.0"
image-cropper = "4.3.2" image-cropper = "4.3.2"
material = "1.9.0" material = "1.9.0"
material-drawer = "8.4.5" material-drawer = "8.4.5"
@ -56,7 +56,7 @@ xmlwriter = "1.0.4"
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } 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.12"
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
@ -113,7 +113,6 @@ glide-compiler = { module = "com.github.bumptech.glide:ksp", version.ref = "glid
glide-core = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } glide-core = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
glide-okhttp3-integration = { module = "com.github.bumptech.glide:okhttp3-integration", 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" } 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-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-rx3 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3", version.ref = "coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }

View File

@ -2,5 +2,17 @@
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [ "extends": [
"config:base" "config:base"
],
"packageRules": [
{
"groupName": "Kotlin",
"groupSlug": "kotlin",
"matchPackagePrefixes": [
"com.google.devtools.ksp"
],
"matchPackagePatterns": [
"org.jetbrains.kotlin.*"
]
}
] ]
} }