Skip to content

Commit

Permalink
refactor: instance part
Browse files Browse the repository at this point in the history
  • Loading branch information
whitescent committed Jan 18, 2024
1 parent ca1a659 commit f4e297f
Show file tree
Hide file tree
Showing 22 changed files with 102 additions and 156 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ package com.github.whitescent.mastify.data.repository
import androidx.room.withTransaction
import at.connyduck.calladapter.networkresult.fold
import com.github.whitescent.mastify.database.AppDatabase
import com.github.whitescent.mastify.mapper.account.toEntity
import com.github.whitescent.mastify.mapper.toEntity
import com.github.whitescent.mastify.network.MastodonApi
import com.github.whitescent.mastify.network.model.status.Status
import javax.inject.Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,13 @@

package com.github.whitescent.mastify.data.repository

import android.util.Log
import at.connyduck.calladapter.networkresult.fold
import at.connyduck.calladapter.networkresult.getOrElse
import at.connyduck.calladapter.networkresult.onSuccess
import com.github.whitescent.mastify.data.model.ui.InstanceUiData
import com.github.whitescent.mastify.database.AppDatabase
import com.github.whitescent.mastify.database.model.EmojisEntity
import com.github.whitescent.mastify.database.model.InstanceEntity
import com.github.whitescent.mastify.database.model.InstanceInfoEntity
import com.github.whitescent.mastify.network.MastodonApi
import com.github.whitescent.mastify.network.model.emoji.Emoji
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject

class InstanceRepository @Inject constructor(
Expand All @@ -39,63 +34,46 @@ class InstanceRepository @Inject constructor(
private val instanceDao = db.instanceDao()
private val accountDao = db.accountDao()

/**
* Returns the custom emojis of the instance.
* Will always try to fetch them from the api, falls back to cached Emojis in case it is not available.
* Never throws, returns empty list in case of error.
*/
suspend fun getEmojis(): List<Emoji> = withContext(Dispatchers.IO) {
suspend fun getInstanceEmojis(): List<Emoji> {
val instanceName = accountDao.getActiveAccount()!!.domain
api.getCustomEmojis()
.onSuccess { emojiList -> instanceDao.upsert(EmojisEntity(instanceName, emojiList)) }
.getOrElse { throwable ->
Log.w(TAG, "failed to load custom emojis, falling back to cache", throwable)
instanceDao.getEmojiInfo(instanceName)?.emojiList.orEmpty()
}
return instanceDao.getEmojiInfo(instanceName)?.emojiList ?: emptyList()
}

/**
* Returns information about the instance.
* Will always try to fetch the most up-to-date data from the api, falls back to cache in case it is not available.
* Never throws, returns defaults of vanilla Mastodon in case of error.
*/
suspend fun getAndUpdateInstanceInfo(): InstanceUiData = withContext(Dispatchers.IO) {
suspend fun getInstanceInfo(): InstanceEntity? {
val instanceName = accountDao.getActiveAccount()!!.domain
api.fetchInstanceInfo()
.fold(
{ instance ->
val instanceEntity = InstanceInfoEntity(
instance = instanceName,
maximumTootCharacters = instance.configuration?.statuses?.maxCharacters,
maxPollOptions = instance.configuration?.polls?.maxOptions,
maxPollCharactersPerOption = instance.configuration?.polls?.maxCharactersPerOption,
minPollExpiration = instance.configuration?.polls?.minExpiration,
maxPollExpiration = instance.configuration?.polls?.maxExpiration,
videoSizeLimit = instance.configuration?.mediaAttachments?.videoSizeLimit,
imageSizeLimit = instance.configuration?.mediaAttachments?.imageSizeLimit,
imageMatrixLimit = instance.configuration?.mediaAttachments?.imageMatrixLimit,
maxMediaAttachments = instance.configuration?.statuses?.maxMediaAttachments,
)
instanceDao.upsert(instanceEntity)
instanceEntity
},
{ throwable ->
Log.w(TAG, "failed to instance, falling back to cache and default values", throwable)
instanceDao.getInstanceInfo(instanceName)
},
).let { instanceInfo: InstanceInfoEntity? ->
InstanceUiData(
maximumTootCharacters = instanceInfo?.maximumTootCharacters ?: DEFAULT_CHARACTER_LIMIT,
maxPollOptions = instanceInfo?.maxPollOptions ?: DEFAULT_MAX_OPTION_COUNT,
maxPollCharactersPerOption = instanceInfo?.maxPollCharactersPerOption ?: DEFAULT_MAX_OPTION_LENGTH,
minPollExpiration = instanceInfo?.minPollExpiration ?: DEFAULT_MIN_POLL_DURATION,
maxPollExpiration = instanceInfo?.maxPollExpiration ?: DEFAULT_MAX_POLL_DURATION,
videoSizeLimit = instanceInfo?.videoSizeLimit ?: DEFAULT_VIDEO_SIZE_LIMIT,
imageSizeLimit = instanceInfo?.imageSizeLimit ?: DEFAULT_IMAGE_SIZE_LIMIT,
imageMatrixLimit = instanceInfo?.imageMatrixLimit ?: DEFAULT_IMAGE_MATRIX_LIMIT,
maxMediaAttachments = instanceInfo?.maxMediaAttachments ?: DEFAULT_MAX_MEDIA_ATTACHMENTS
return instanceDao.getInstanceInfo(instanceName)
}

suspend fun upsertEmojis(): Boolean {
api.getCustomEmojis().getOrElse {
return false
}.let {
instanceDao.upsert(EmojisEntity(accountDao.getActiveAccount()!!.domain, it))
return true
}
}

suspend fun upsertInstanceInfo(): Boolean {
api.fetchInstanceInfo().getOrElse {
return false
}.let { instance ->
val instanceName = accountDao.getActiveAccount()!!.domain
instanceDao.upsert(
instance = InstanceInfoEntity(
instance = instanceName,
maximumTootCharacters = instance.configuration?.statuses?.maxCharacters,
maxPollOptions = instance.configuration?.polls?.maxOptions,
maxPollCharactersPerOption = instance.configuration?.polls?.maxCharactersPerOption,
minPollExpiration = instance.configuration?.polls?.minExpiration,
maxPollExpiration = instance.configuration?.polls?.maxExpiration,
videoSizeLimit = instance.configuration?.mediaAttachments?.videoSizeLimit,
imageSizeLimit = instance.configuration?.mediaAttachments?.imageSizeLimit,
imageMatrixLimit = instance.configuration?.mediaAttachments?.imageMatrixLimit,
maxMediaAttachments = instance.configuration?.statuses?.maxMediaAttachments,
)
}
)
return true
}
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ interface InstanceDao {

@RewriteQueriesToDropUnusedColumns
@Query("SELECT * FROM InstanceEntity WHERE instance = :instance LIMIT 1")
suspend fun getInstanceInfo(instance: String): InstanceInfoEntity?
suspend fun getInstanceInfo(instance: String): InstanceEntity?

@RewriteQueriesToDropUnusedColumns
@Query("SELECT * FROM InstanceEntity WHERE instance = :instance LIMIT 1")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* see <http://www.gnu.org/licenses>.
*/

package com.github.whitescent.mastify.mapper.account
package com.github.whitescent.mastify.mapper

import com.github.whitescent.mastify.database.model.AccountEntity
import com.github.whitescent.mastify.network.model.account.Account
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* see <http://www.gnu.org/licenses>.
*/

package com.github.whitescent.mastify.mapper.emoji
package com.github.whitescent.mastify.mapper

import com.github.whitescent.mastify.network.model.emoji.Emoji

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* see <http://www.gnu.org/licenses>.
*/

package com.github.whitescent.mastify.mapper.status
package com.github.whitescent.mastify.mapper

import com.github.whitescent.mastify.data.model.ui.StatusUiData
import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType.E
import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType.Null
import com.github.whitescent.mastify.data.repository.HomeRepository.Companion.FETCHNUMBER
import com.github.whitescent.mastify.data.repository.HomeRepository.Companion.PAGINGTHRESHOLD
import com.github.whitescent.mastify.mapper.status.getReplyChainType
import com.github.whitescent.mastify.mapper.status.hasUnloadedParent
import com.github.whitescent.mastify.mapper.getReplyChainType
import com.github.whitescent.mastify.mapper.hasUnloadedParent
import com.github.whitescent.mastify.paging.LoadState
import com.github.whitescent.mastify.paging.LoadState.Error
import com.github.whitescent.mastify.paging.LoadState.NotLoading
Expand Down
42 changes: 24 additions & 18 deletions app/src/main/java/com/github/whitescent/mastify/screen/post/Post.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.github.whitescent.R
import com.github.whitescent.mastify.AppNavGraph
import com.github.whitescent.mastify.data.repository.InstanceRepository.Companion.DEFAULT_CHARACTER_LIMIT
import com.github.whitescent.mastify.extensions.insertString
import com.github.whitescent.mastify.ui.component.AppHorizontalDivider
import com.github.whitescent.mastify.ui.component.CenterRow
Expand All @@ -88,6 +89,8 @@ import com.github.whitescent.mastify.viewModel.PostViewModel
import com.microsoft.fluentui.tokenized.drawer.rememberDrawerState
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch

@AppNavGraph
Expand All @@ -107,7 +110,7 @@ fun Post(
val allowPostStatus by viewModel.allowPostStatus.collectAsStateWithLifecycle()
val postTextField = viewModel.postTextField
val state = viewModel.uiState
val instanceUiData = state.instanceUiData
val instanceUiData = state.instance

val emojiDrawerState = rememberDrawerState()
val visibilitySheetState = rememberDrawerState()
Expand Down Expand Up @@ -258,23 +261,26 @@ fun Post(
}
},
textLimitCircle = {
val progress = postTextField.text.length.toFloat() / instanceUiData.maximumTootCharacters.toFloat()
TextProgressBar(
textProgress = progress
) {
Text(
text = buildAnnotatedString {
pushStyle(
SpanStyle(
color = if (postTextField.text.length <= instanceUiData.maximumTootCharacters)
AppTheme.colors.primaryContent.copy(alpha = 0.48f)
else Color(0xFFF53232)
instanceUiData?.let {
val progress = postTextField.text.length.toFloat() /
(it.maximumTootCharacters ?: DEFAULT_CHARACTER_LIMIT).toFloat()
TextProgressBar(
textProgress = progress
) {
Text(
text = buildAnnotatedString {
pushStyle(
SpanStyle(
color = if (postTextField.text.length <= (instanceUiData.maximumTootCharacters ?: DEFAULT_CHARACTER_LIMIT))
AppTheme.colors.primaryContent.copy(alpha = 0.48f)
else Color(0xFFF53232)
)
)
)
append("${postTextField.text.length}/${instanceUiData.maximumTootCharacters}")
pop()
}
)
append("${postTextField.text.length}/${instanceUiData.maximumTootCharacters}")
pop()
}
)
}
}
},
visibilityButton = {
Expand All @@ -301,7 +307,7 @@ fun Post(
)
EmojiSheet(
drawerState = emojiDrawerState,
emojis = state.emojis,
emojis = state.instance?.emojiList?.toImmutableList() ?: persistentListOf(),
onSelectEmoji = {
viewModel.updateTextFieldValue(
textFieldValue = viewModel.postTextField.copy(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ import coil.request.ImageRequest
import com.github.whitescent.R
import com.github.whitescent.mastify.AppNavGraph
import com.github.whitescent.mastify.data.model.StatusBackResult
import com.github.whitescent.mastify.mapper.emoji.toShortCode
import com.github.whitescent.mastify.mapper.toShortCode
import com.github.whitescent.mastify.network.model.account.Account
import com.github.whitescent.mastify.screen.destinations.ProfileDestination
import com.github.whitescent.mastify.screen.destinations.StatusDetailDestination
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage
import com.github.whitescent.R
import com.github.whitescent.mastify.database.model.AccountEntity
import com.github.whitescent.mastify.mapper.account.toAccount
import com.github.whitescent.mastify.mapper.toAccount
import com.github.whitescent.mastify.network.model.account.Account
import com.github.whitescent.mastify.ui.theme.AppTheme
import com.github.whitescent.mastify.utils.launchCustomChromeTab
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ fun AppScaffold(
activeAccount = activeAccount!!,
appState = appState,
drawerState = drawerState,
navigator = this.destinationsNavigator,
navigator = destinationsNavigator,
resultRecipient = resultRecipient()
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.github.whitescent.R
import com.github.whitescent.mastify.mapper.emoji.toShortCode
import com.github.whitescent.mastify.mapper.toShortCode
import com.github.whitescent.mastify.network.model.account.Account
import com.github.whitescent.mastify.ui.theme.AppTheme
import com.github.whitescent.mastify.utils.PostState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import androidx.compose.ui.unit.dp
import com.github.whitescent.mastify.data.model.ui.StatusUiData
import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType.End
import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType.Null
import com.github.whitescent.mastify.mapper.status.getReplyChainType
import com.github.whitescent.mastify.mapper.getReplyChainType
import com.github.whitescent.mastify.network.model.account.Account
import com.github.whitescent.mastify.network.model.status.Status
import com.github.whitescent.mastify.ui.component.status.StatusListItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ import com.github.whitescent.mastify.data.model.ui.StatusCommonListData
import com.github.whitescent.mastify.data.model.ui.StatusUiData
import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType.End
import com.github.whitescent.mastify.data.model.ui.StatusUiData.ReplyChainType.Null
import com.github.whitescent.mastify.mapper.status.getReplyChainType
import com.github.whitescent.mastify.mapper.status.hasUnloadedParent
import com.github.whitescent.mastify.mapper.getReplyChainType
import com.github.whitescent.mastify.mapper.hasUnloadedParent
import com.github.whitescent.mastify.network.model.account.Account
import com.github.whitescent.mastify.network.model.status.Status
import com.github.whitescent.mastify.network.model.status.Status.Attachment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.github.whitescent.mastify.data.model.ui.StatusUiData
import com.github.whitescent.mastify.data.repository.AccountRepository
import com.github.whitescent.mastify.data.repository.InstanceRepository
import com.github.whitescent.mastify.database.AppDatabase
import com.github.whitescent.mastify.database.model.AccountEntity
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -41,15 +42,16 @@ import javax.inject.Inject
class AppViewModel @Inject constructor(
db: AppDatabase,
private val accountRepository: AccountRepository,
private val instanceRepository: InstanceRepository
) : ViewModel() {

private val accountDao = db.accountDao()

private val accountListFlow = accountDao.getAccountListFlow()
private val activeAccountFlow = accountDao
.getActiveAccountFlow()
.distinctUntilChanged { old, new -> old?.id == new?.id }
.filterNotNull()
.distinctUntilChanged { old, new -> old.id == new.id }

private val changeAccountChannel = Channel<Unit>()
val changeAccountFlow = changeAccountChannel.receiveAsFlow()
Expand Down Expand Up @@ -79,6 +81,10 @@ class AppViewModel @Inject constructor(
val activeAccount = accountDao.getActiveAccount()
isLoggedIn = activeAccount != null
prepared = true
launch {
instanceRepository.upsertInstanceInfo()
instanceRepository.upsertEmojis()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import com.github.whitescent.mastify.domain.StatusActionHandler
import com.github.whitescent.mastify.domain.StatusActionHandler.Companion.updatePollOfStatusList
import com.github.whitescent.mastify.domain.StatusActionHandler.Companion.updateStatusListActions
import com.github.whitescent.mastify.extensions.updateStatusActionData
import com.github.whitescent.mastify.mapper.status.toUiData
import com.github.whitescent.mastify.mapper.toUiData
import com.github.whitescent.mastify.network.MastodonApi
import com.github.whitescent.mastify.network.model.search.SearchResult
import com.github.whitescent.mastify.network.model.status.Hashtag
Expand Down
Loading

0 comments on commit f4e297f

Please sign in to comment.