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:
parent
5391b5f797
commit
40bd95d752
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 &&
|
||||||
(
|
(
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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" }
|
||||||
|
|
|
@ -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.*"
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue