fix codestyle
This commit is contained in:
parent
9ca7e708bd
commit
2cc53d6772
|
@ -48,7 +48,12 @@ import com.bumptech.glide.request.transition.Transition
|
||||||
import com.google.android.material.tabs.TabLayout
|
import com.google.android.material.tabs.TabLayout
|
||||||
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
|
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
|
||||||
import com.google.android.material.tabs.TabLayoutMediator
|
import com.google.android.material.tabs.TabLayoutMediator
|
||||||
import com.keylesspalace.tusky.appstore.*
|
import com.keylesspalace.tusky.appstore.AnnouncementReadEvent
|
||||||
|
import com.keylesspalace.tusky.appstore.CacheUpdater
|
||||||
|
import com.keylesspalace.tusky.appstore.Event
|
||||||
|
import com.keylesspalace.tusky.appstore.EventHub
|
||||||
|
import com.keylesspalace.tusky.appstore.MainTabsChangedEvent
|
||||||
|
import com.keylesspalace.tusky.appstore.ProfileEditedEvent
|
||||||
import com.keylesspalace.tusky.components.announcements.AnnouncementsActivity
|
import com.keylesspalace.tusky.components.announcements.AnnouncementsActivity
|
||||||
import com.keylesspalace.tusky.components.compose.ComposeActivity
|
import com.keylesspalace.tusky.components.compose.ComposeActivity
|
||||||
import com.keylesspalace.tusky.components.compose.ComposeActivity.Companion.canHandleMimeType
|
import com.keylesspalace.tusky.components.compose.ComposeActivity.Companion.canHandleMimeType
|
||||||
|
@ -67,7 +72,14 @@ import com.keylesspalace.tusky.interfaces.ActionButtonActivity
|
||||||
import com.keylesspalace.tusky.interfaces.ReselectableFragment
|
import com.keylesspalace.tusky.interfaces.ReselectableFragment
|
||||||
import com.keylesspalace.tusky.pager.MainPagerAdapter
|
import com.keylesspalace.tusky.pager.MainPagerAdapter
|
||||||
import com.keylesspalace.tusky.settings.PrefKeys
|
import com.keylesspalace.tusky.settings.PrefKeys
|
||||||
import com.keylesspalace.tusky.util.*
|
import com.keylesspalace.tusky.util.ThemeUtils
|
||||||
|
import com.keylesspalace.tusky.util.deleteStaleCachedMedia
|
||||||
|
import com.keylesspalace.tusky.util.emojify
|
||||||
|
import com.keylesspalace.tusky.util.hide
|
||||||
|
import com.keylesspalace.tusky.util.removeShortcut
|
||||||
|
import com.keylesspalace.tusky.util.updateShortcut
|
||||||
|
import com.keylesspalace.tusky.util.viewBinding
|
||||||
|
import com.keylesspalace.tusky.util.visible
|
||||||
import com.mikepenz.iconics.IconicsDrawable
|
import com.mikepenz.iconics.IconicsDrawable
|
||||||
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
|
import com.mikepenz.iconics.typeface.library.googlematerial.GoogleMaterial
|
||||||
import com.mikepenz.iconics.utils.colorInt
|
import com.mikepenz.iconics.utils.colorInt
|
||||||
|
@ -76,9 +88,24 @@ import com.mikepenz.materialdrawer.holder.BadgeStyle
|
||||||
import com.mikepenz.materialdrawer.holder.ColorHolder
|
import com.mikepenz.materialdrawer.holder.ColorHolder
|
||||||
import com.mikepenz.materialdrawer.holder.StringHolder
|
import com.mikepenz.materialdrawer.holder.StringHolder
|
||||||
import com.mikepenz.materialdrawer.iconics.iconicsIcon
|
import com.mikepenz.materialdrawer.iconics.iconicsIcon
|
||||||
import com.mikepenz.materialdrawer.model.*
|
import com.mikepenz.materialdrawer.model.AbstractDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.interfaces.*
|
import com.mikepenz.materialdrawer.model.DividerDrawerItem
|
||||||
import com.mikepenz.materialdrawer.util.*
|
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem
|
||||||
|
import com.mikepenz.materialdrawer.model.ProfileDrawerItem
|
||||||
|
import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem
|
||||||
|
import com.mikepenz.materialdrawer.model.SecondaryDrawerItem
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.IProfile
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.descriptionRes
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.descriptionText
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.iconRes
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.iconUrl
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.nameRes
|
||||||
|
import com.mikepenz.materialdrawer.model.interfaces.nameText
|
||||||
|
import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
|
||||||
|
import com.mikepenz.materialdrawer.util.DrawerImageLoader
|
||||||
|
import com.mikepenz.materialdrawer.util.addItems
|
||||||
|
import com.mikepenz.materialdrawer.util.addItemsAtPosition
|
||||||
|
import com.mikepenz.materialdrawer.util.updateBadge
|
||||||
import com.mikepenz.materialdrawer.widget.AccountHeaderView
|
import com.mikepenz.materialdrawer.widget.AccountHeaderView
|
||||||
import dagger.android.DispatchingAndroidInjector
|
import dagger.android.DispatchingAndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
|
@ -156,7 +183,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
forwardShare(intent)
|
forwardShare(intent)
|
||||||
} else {
|
} else {
|
||||||
// No account was provided, show the chooser
|
// No account was provided, show the chooser
|
||||||
showAccountChooserDialog(getString(R.string.action_share_as), true, object : AccountSelectionListener {
|
showAccountChooserDialog(
|
||||||
|
getString(R.string.action_share_as), true,
|
||||||
|
object : AccountSelectionListener {
|
||||||
override fun onAccountSelected(account: AccountEntity) {
|
override fun onAccountSelected(account: AccountEntity) {
|
||||||
val requestedId = account.id
|
val requestedId = account.id
|
||||||
if (requestedId == activeAccount.id) {
|
if (requestedId == activeAccount.id) {
|
||||||
|
@ -168,7 +197,8 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
changeAccount(requestedId, intent)
|
changeAccount(requestedId, intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} else if (accountRequested && savedInstanceState == null) {
|
} else if (accountRequested && savedInstanceState == null) {
|
||||||
// user clicked a notification, show notification tab
|
// user clicked a notification, show notification tab
|
||||||
|
@ -323,12 +353,15 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP
|
headerBackgroundScaleType = ImageView.ScaleType.CENTER_CROP
|
||||||
currentHiddenInList = true
|
currentHiddenInList = true
|
||||||
onAccountHeaderListener = { _: View?, profile: IProfile, current: Boolean -> handleProfileClick(profile, current) }
|
onAccountHeaderListener = { _: View?, profile: IProfile, current: Boolean -> handleProfileClick(profile, current) }
|
||||||
addProfile(ProfileSettingDrawerItem().apply {
|
addProfile(
|
||||||
|
ProfileSettingDrawerItem().apply {
|
||||||
identifier = DRAWER_ITEM_ADD_ACCOUNT
|
identifier = DRAWER_ITEM_ADD_ACCOUNT
|
||||||
nameRes = R.string.add_account_name
|
nameRes = R.string.add_account_name
|
||||||
descriptionRes = R.string.add_account_description
|
descriptionRes = R.string.add_account_description
|
||||||
iconicsIcon = GoogleMaterial.Icon.gmd_add
|
iconicsIcon = GoogleMaterial.Icon.gmd_add
|
||||||
}, 0)
|
},
|
||||||
|
0
|
||||||
|
)
|
||||||
attachToSliderView(binding.mainDrawer)
|
attachToSliderView(binding.mainDrawer)
|
||||||
dividerBelowHeader = false
|
dividerBelowHeader = false
|
||||||
closeDrawerOnProfileListClick = true
|
closeDrawerOnProfileListClick = true
|
||||||
|
@ -468,14 +501,16 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
)
|
)
|
||||||
|
|
||||||
if (addSearchButton) {
|
if (addSearchButton) {
|
||||||
binding.mainDrawer.addItemsAtPosition(4,
|
binding.mainDrawer.addItemsAtPosition(
|
||||||
|
4,
|
||||||
primaryDrawerItem {
|
primaryDrawerItem {
|
||||||
nameRes = R.string.action_search
|
nameRes = R.string.action_search
|
||||||
iconicsIcon = GoogleMaterial.Icon.gmd_search
|
iconicsIcon = GoogleMaterial.Icon.gmd_search
|
||||||
onClick = {
|
onClick = {
|
||||||
startActivityWithSlideInAnimation(SearchActivity.getIntent(context))
|
startActivityWithSlideInAnimation(SearchActivity.getIntent(context))
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
setSavedInstance(savedInstanceState)
|
setSavedInstance(savedInstanceState)
|
||||||
|
@ -572,24 +607,23 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
binding.mainToolbar.setOnClickListener {
|
binding.mainToolbar.setOnClickListener {
|
||||||
(adapter.getFragment(activeTabLayout.selectedTabPosition) as? ReselectableFragment)?.onReselect()
|
(adapter.getFragment(activeTabLayout.selectedTabPosition) as? ReselectableFragment)?.onReselect()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleProfileClick(profile: IProfile, current: Boolean): Boolean {
|
private fun handleProfileClick(profile: IProfile, current: Boolean): Boolean {
|
||||||
val activeAccount = accountManager.activeAccount
|
val activeAccount = accountManager.activeAccount
|
||||||
|
|
||||||
//open profile when active image was clicked
|
// open profile when active image was clicked
|
||||||
if (current && activeAccount != null) {
|
if (current && activeAccount != null) {
|
||||||
val intent = AccountActivity.getIntent(this, activeAccount.accountId)
|
val intent = AccountActivity.getIntent(this, activeAccount.accountId)
|
||||||
startActivityWithSlideInAnimation(intent)
|
startActivityWithSlideInAnimation(intent)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
//open LoginActivity to add new account
|
// open LoginActivity to add new account
|
||||||
if (profile.identifier == DRAWER_ITEM_ADD_ACCOUNT) {
|
if (profile.identifier == DRAWER_ITEM_ADD_ACCOUNT) {
|
||||||
startActivityWithSlideInAnimation(LoginActivity.getIntent(this, true))
|
startActivityWithSlideInAnimation(LoginActivity.getIntent(this, true))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
//change Account
|
// change Account
|
||||||
changeAccount(profile.identifier, null)
|
changeAccount(profile.identifier, null)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -641,9 +675,9 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fetchUserInfo() {
|
private fun fetchUserInfo() {
|
||||||
mastodonApi.accountVerifyCredentials()
|
mastodonApi.accountVerifyCredentials()
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
||||||
|
@ -655,9 +689,9 @@ private fun fetchUserInfo() {
|
||||||
Log.e(TAG, "Failed to fetch user info. " + throwable.message)
|
Log.e(TAG, "Failed to fetch user info. " + throwable.message)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onFetchUserInfoSuccess(me: Account) {
|
private fun onFetchUserInfoSuccess(me: Account) {
|
||||||
glide.asBitmap()
|
glide.asBitmap()
|
||||||
.load(me.header)
|
.load(me.header)
|
||||||
.into(header.accountHeaderBackground)
|
.into(header.accountHeaderBackground)
|
||||||
|
@ -671,9 +705,9 @@ private fun onFetchUserInfoSuccess(me: Account) {
|
||||||
|
|
||||||
updateProfiles()
|
updateProfiles()
|
||||||
updateShortcut(this, accountManager.activeAccount!!)
|
updateShortcut(this, accountManager.activeAccount!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadDrawerAvatar(avatarUrl: String, showPlaceholder: Boolean) {
|
private fun loadDrawerAvatar(avatarUrl: String, showPlaceholder: Boolean) {
|
||||||
val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)
|
val navIconSize = resources.getDimensionPixelSize(R.dimen.avatar_toolbar_nav_icon_size)
|
||||||
|
|
||||||
glide.asDrawable()
|
glide.asDrawable()
|
||||||
|
@ -704,9 +738,9 @@ private fun loadDrawerAvatar(avatarUrl: String, showPlaceholder: Boolean) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fetchAnnouncements() {
|
private fun fetchAnnouncements() {
|
||||||
mastodonApi.listAnnouncements(false)
|
mastodonApi.listAnnouncements(false)
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
||||||
|
@ -719,13 +753,13 @@ private fun fetchAnnouncements() {
|
||||||
Log.w(TAG, "Failed to fetch announcements.", it)
|
Log.w(TAG, "Failed to fetch announcements.", it)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateAnnouncementsBadge() {
|
private fun updateAnnouncementsBadge() {
|
||||||
binding.mainDrawer.updateBadge(DRAWER_ITEM_ANNOUNCEMENTS, StringHolder(if (unreadAnnouncementsCount <= 0) null else unreadAnnouncementsCount.toString()))
|
binding.mainDrawer.updateBadge(DRAWER_ITEM_ANNOUNCEMENTS, StringHolder(if (unreadAnnouncementsCount <= 0) null else unreadAnnouncementsCount.toString()))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateProfiles() {
|
private fun updateProfiles() {
|
||||||
val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)
|
val animateEmojis = preferences.getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false)
|
||||||
val profiles: MutableList<IProfile> = accountManager.getAllAccountsOrderedByActive().map { acc ->
|
val profiles: MutableList<IProfile> = accountManager.getAllAccountsOrderedByActive().map { acc ->
|
||||||
val emojifiedName = EmojiCompat.get().process(acc.displayName.emojify(acc.emojis, header, animateEmojis))
|
val emojifiedName = EmojiCompat.get().process(acc.displayName.emojify(acc.emojis, header, animateEmojis))
|
||||||
|
@ -750,18 +784,18 @@ private fun updateProfiles() {
|
||||||
header.clear()
|
header.clear()
|
||||||
header.profiles = profiles
|
header.profiles = profiles
|
||||||
header.setActiveProfile(accountManager.activeAccount!!.id)
|
header.setActiveProfile(accountManager.activeAccount!!.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getActionButton() = binding.composeButton
|
override fun getActionButton() = binding.composeButton
|
||||||
|
|
||||||
override fun androidInjector() = androidInjector
|
override fun androidInjector() = androidInjector
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "MainActivity" // logging tag
|
private const val TAG = "MainActivity" // logging tag
|
||||||
private const val DRAWER_ITEM_ADD_ACCOUNT: Long = -13
|
private const val DRAWER_ITEM_ADD_ACCOUNT: Long = -13
|
||||||
private const val DRAWER_ITEM_ANNOUNCEMENTS: Long = 14
|
private const val DRAWER_ITEM_ANNOUNCEMENTS: Long = 14
|
||||||
const val STATUS_URL = "statusUrl"
|
const val STATUS_URL = "statusUrl"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun primaryDrawerItem(block: PrimaryDrawerItem.() -> Unit): PrimaryDrawerItem {
|
private inline fun primaryDrawerItem(block: PrimaryDrawerItem.() -> Unit): PrimaryDrawerItem {
|
||||||
|
|
|
@ -28,17 +28,27 @@ import com.keylesspalace.tusky.components.search.SearchType
|
||||||
import com.keylesspalace.tusky.db.AccountManager
|
import com.keylesspalace.tusky.db.AccountManager
|
||||||
import com.keylesspalace.tusky.db.AppDatabase
|
import com.keylesspalace.tusky.db.AppDatabase
|
||||||
import com.keylesspalace.tusky.db.InstanceEntity
|
import com.keylesspalace.tusky.db.InstanceEntity
|
||||||
import com.keylesspalace.tusky.entity.*
|
import com.keylesspalace.tusky.entity.Attachment
|
||||||
|
import com.keylesspalace.tusky.entity.Emoji
|
||||||
|
import com.keylesspalace.tusky.entity.NewPoll
|
||||||
import com.keylesspalace.tusky.entity.Status
|
import com.keylesspalace.tusky.entity.Status
|
||||||
import com.keylesspalace.tusky.network.MastodonApi
|
import com.keylesspalace.tusky.network.MastodonApi
|
||||||
import com.keylesspalace.tusky.service.ServiceClient
|
import com.keylesspalace.tusky.service.ServiceClient
|
||||||
import com.keylesspalace.tusky.service.TootToSend
|
import com.keylesspalace.tusky.service.TootToSend
|
||||||
import com.keylesspalace.tusky.util.*
|
import com.keylesspalace.tusky.util.Either
|
||||||
|
import com.keylesspalace.tusky.util.RxAwareViewModel
|
||||||
|
import com.keylesspalace.tusky.util.VersionUtils
|
||||||
|
import com.keylesspalace.tusky.util.combineLiveData
|
||||||
|
import com.keylesspalace.tusky.util.filter
|
||||||
|
import com.keylesspalace.tusky.util.map
|
||||||
|
import com.keylesspalace.tusky.util.randomAlphanumericString
|
||||||
|
import com.keylesspalace.tusky.util.toLiveData
|
||||||
|
import com.keylesspalace.tusky.util.withoutFirstWhich
|
||||||
import io.reactivex.rxjava3.core.Observable
|
import io.reactivex.rxjava3.core.Observable
|
||||||
import io.reactivex.rxjava3.core.Single
|
import io.reactivex.rxjava3.core.Single
|
||||||
import io.reactivex.rxjava3.disposables.Disposable
|
import io.reactivex.rxjava3.disposables.Disposable
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.*
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ComposeViewModel @Inject constructor(
|
class ComposeViewModel @Inject constructor(
|
||||||
|
@ -91,7 +101,9 @@ class ComposeViewModel @Inject constructor(
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
||||||
Single.zip(api.getCustomEmojis(), api.getInstance(), { emojis, instance ->
|
Single.zip(
|
||||||
|
api.getCustomEmojis(), api.getInstance(),
|
||||||
|
{ emojis, instance ->
|
||||||
InstanceEntity(
|
InstanceEntity(
|
||||||
instance = accountManager.activeAccount?.domain!!,
|
instance = accountManager.activeAccount?.domain!!,
|
||||||
emojiList = emojis,
|
emojiList = emojis,
|
||||||
|
@ -100,20 +112,24 @@ class ComposeViewModel @Inject constructor(
|
||||||
maxPollOptionLength = instance.pollLimits?.maxOptionChars,
|
maxPollOptionLength = instance.pollLimits?.maxOptionChars,
|
||||||
version = instance.version
|
version = instance.version
|
||||||
)
|
)
|
||||||
})
|
}
|
||||||
|
)
|
||||||
.doOnSuccess {
|
.doOnSuccess {
|
||||||
db.instanceDao().insertOrReplace(it)
|
db.instanceDao().insertOrReplace(it)
|
||||||
}
|
}
|
||||||
.onErrorResumeNext {
|
.onErrorResumeNext {
|
||||||
db.instanceDao().loadMetadataForInstance(accountManager.activeAccount?.domain!!)
|
db.instanceDao().loadMetadataForInstance(accountManager.activeAccount?.domain!!)
|
||||||
}
|
}
|
||||||
.subscribe({ instanceEntity ->
|
.subscribe(
|
||||||
|
{ instanceEntity ->
|
||||||
emoji.postValue(instanceEntity.emojiList)
|
emoji.postValue(instanceEntity.emojiList)
|
||||||
instance.postValue(instanceEntity)
|
instance.postValue(instanceEntity)
|
||||||
}, { throwable ->
|
},
|
||||||
|
{ throwable ->
|
||||||
// this can happen on network error when no cached data is available
|
// this can happen on network error when no cached data is available
|
||||||
Log.w(TAG, "error loading instance data", throwable)
|
Log.w(TAG, "error loading instance data", throwable)
|
||||||
})
|
}
|
||||||
|
)
|
||||||
.autoDispose()
|
.autoDispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,19 +140,23 @@ class ComposeViewModel @Inject constructor(
|
||||||
mediaUploader.prepareMedia(uri)
|
mediaUploader.prepareMedia(uri)
|
||||||
.map { (type, uri, size) ->
|
.map { (type, uri, size) ->
|
||||||
val mediaItems = media.value!!
|
val mediaItems = media.value!!
|
||||||
if (type != QueuedMedia.Type.IMAGE
|
if (type != QueuedMedia.Type.IMAGE &&
|
||||||
&& mediaItems.isNotEmpty()
|
mediaItems.isNotEmpty() &&
|
||||||
&& mediaItems[0].type == QueuedMedia.Type.IMAGE) {
|
mediaItems[0].type == QueuedMedia.Type.IMAGE
|
||||||
|
) {
|
||||||
throw VideoOrImageException()
|
throw VideoOrImageException()
|
||||||
} else {
|
} else {
|
||||||
addMediaToQueue(type, uri, size, description)
|
addMediaToQueue(type, uri, size, description)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.subscribe({ queuedMedia ->
|
.subscribe(
|
||||||
|
{ queuedMedia ->
|
||||||
liveData.postValue(Either.Right(queuedMedia))
|
liveData.postValue(Either.Right(queuedMedia))
|
||||||
}, { error ->
|
},
|
||||||
|
{ error ->
|
||||||
liveData.postValue(Either.Left(error))
|
liveData.postValue(Either.Left(error))
|
||||||
})
|
}
|
||||||
|
)
|
||||||
.autoDispose()
|
.autoDispose()
|
||||||
return liveData
|
return liveData
|
||||||
}
|
}
|
||||||
|
@ -157,7 +177,8 @@ class ComposeViewModel @Inject constructor(
|
||||||
media.value = media.value!! + mediaItem
|
media.value = media.value!! + mediaItem
|
||||||
mediaToDisposable[mediaItem.localId] = mediaUploader
|
mediaToDisposable[mediaItem.localId] = mediaUploader
|
||||||
.uploadMedia(mediaItem)
|
.uploadMedia(mediaItem)
|
||||||
.subscribe({ event ->
|
.subscribe(
|
||||||
|
{ event ->
|
||||||
val item = media.value?.find { it.localId == mediaItem.localId }
|
val item = media.value?.find { it.localId == mediaItem.localId }
|
||||||
?: return@subscribe
|
?: return@subscribe
|
||||||
val newMediaItem = when (event) {
|
val newMediaItem = when (event) {
|
||||||
|
@ -169,16 +190,20 @@ class ComposeViewModel @Inject constructor(
|
||||||
synchronized(media) {
|
synchronized(media) {
|
||||||
val mediaValue = media.value!!
|
val mediaValue = media.value!!
|
||||||
val index = mediaValue.indexOfFirst { it.localId == newMediaItem.localId }
|
val index = mediaValue.indexOfFirst { it.localId == newMediaItem.localId }
|
||||||
media.postValue(if (index == -1) {
|
media.postValue(
|
||||||
|
if (index == -1) {
|
||||||
mediaValue + newMediaItem
|
mediaValue + newMediaItem
|
||||||
} else {
|
} else {
|
||||||
mediaValue.toMutableList().also { it[index] = newMediaItem }
|
mediaValue.toMutableList().also { it[index] = newMediaItem }
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}, { error ->
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ error ->
|
||||||
media.postValue(media.value?.filter { it.localId != mediaItem.localId } ?: emptyList())
|
media.postValue(media.value?.filter { it.localId != mediaItem.localId } ?: emptyList())
|
||||||
uploadError.postValue(error)
|
uploadError.postValue(error)
|
||||||
})
|
}
|
||||||
|
)
|
||||||
return mediaItem
|
return mediaItem
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,12 +223,14 @@ class ComposeViewModel @Inject constructor(
|
||||||
|
|
||||||
fun didChange(content: String?, contentWarning: String?): Boolean {
|
fun didChange(content: String?, contentWarning: String?): Boolean {
|
||||||
|
|
||||||
val textChanged = !(content.isNullOrEmpty()
|
val textChanged = !(
|
||||||
|| startingText?.startsWith(content.toString()) ?: false)
|
content.isNullOrEmpty() ||
|
||||||
|
startingText?.startsWith(content.toString()) ?: false
|
||||||
|
)
|
||||||
|
|
||||||
val contentWarningChanged = showContentWarning.value!!
|
val contentWarningChanged = showContentWarning.value!! &&
|
||||||
&& !contentWarning.isNullOrEmpty()
|
!contentWarning.isNullOrEmpty() &&
|
||||||
&& !startingContentWarning.startsWith(contentWarning.toString())
|
!startingContentWarning.startsWith(contentWarning.toString())
|
||||||
val mediaChanged = !media.value.isNullOrEmpty()
|
val mediaChanged = !media.value.isNullOrEmpty()
|
||||||
val pollChanged = poll.value != null
|
val pollChanged = poll.value != null
|
||||||
|
|
||||||
|
@ -316,11 +343,14 @@ class ComposeViewModel @Inject constructor(
|
||||||
media.removeObserver(this)
|
media.removeObserver(this)
|
||||||
} else if (updatedItem.id != null) {
|
} else if (updatedItem.id != null) {
|
||||||
api.updateMedia(updatedItem.id, description)
|
api.updateMedia(updatedItem.id, description)
|
||||||
.subscribe({
|
.subscribe(
|
||||||
|
{
|
||||||
completedCaptioningLiveData.postValue(true)
|
completedCaptioningLiveData.postValue(true)
|
||||||
}, {
|
},
|
||||||
|
{
|
||||||
completedCaptioningLiveData.postValue(false)
|
completedCaptioningLiveData.postValue(false)
|
||||||
})
|
}
|
||||||
|
)
|
||||||
.autoDispose()
|
.autoDispose()
|
||||||
media.removeObserver(this)
|
media.removeObserver(this)
|
||||||
}
|
}
|
||||||
|
@ -389,7 +419,8 @@ class ComposeViewModel @Inject constructor(
|
||||||
|
|
||||||
val replyVisibility = composeOptions?.replyVisibility ?: Status.Visibility.UNKNOWN
|
val replyVisibility = composeOptions?.replyVisibility ?: Status.Visibility.UNKNOWN
|
||||||
startingVisibility = Status.Visibility.byNum(
|
startingVisibility = Status.Visibility.byNum(
|
||||||
preferredVisibility.num.coerceAtLeast(replyVisibility.num))
|
preferredVisibility.num.coerceAtLeast(replyVisibility.num)
|
||||||
|
)
|
||||||
|
|
||||||
inReplyToId = composeOptions?.inReplyToId
|
inReplyToId = composeOptions?.inReplyToId
|
||||||
|
|
||||||
|
@ -468,7 +499,6 @@ class ComposeViewModel @Inject constructor(
|
||||||
private companion object {
|
private companion object {
|
||||||
const val TAG = "ComposeViewModel"
|
const val TAG = "ComposeViewModel"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> mutableLiveData(default: T) = MutableLiveData<T>().apply { value = default }
|
fun <T> mutableLiveData(default: T) = MutableLiveData<T>().apply { value = default }
|
||||||
|
|
|
@ -162,5 +162,4 @@ class DraftHelper @Inject constructor(
|
||||||
IOUtils.copyToFile(contentResolver, this, file)
|
IOUtils.copyToFile(contentResolver, this, file)
|
||||||
return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file)
|
return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileprovider", file)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -93,7 +93,7 @@ class ScheduledTootActivity : BaseActivity(), ScheduledTootActionListener, Injec
|
||||||
}
|
}
|
||||||
if (loadState.refresh is LoadState.NotLoading) {
|
if (loadState.refresh is LoadState.NotLoading) {
|
||||||
binding.progressBar.hide()
|
binding.progressBar.hide()
|
||||||
if(adapter.itemCount == 0) {
|
if (adapter.itemCount == 0) {
|
||||||
binding.errorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_scheduled_status)
|
binding.errorMessageView.setup(R.drawable.elephant_friend_empty, R.string.no_scheduled_status)
|
||||||
binding.errorMessageView.show()
|
binding.errorMessageView.show()
|
||||||
} else {
|
} else {
|
||||||
|
@ -117,7 +117,9 @@ class ScheduledTootActivity : BaseActivity(), ScheduledTootActionListener, Injec
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun edit(item: ScheduledStatus) {
|
override fun edit(item: ScheduledStatus) {
|
||||||
val intent = ComposeActivity.startIntent(this, ComposeActivity.ComposeOptions(
|
val intent = ComposeActivity.startIntent(
|
||||||
|
this,
|
||||||
|
ComposeActivity.ComposeOptions(
|
||||||
scheduledTootId = item.id,
|
scheduledTootId = item.id,
|
||||||
tootText = item.params.text,
|
tootText = item.params.text,
|
||||||
contentWarning = item.params.spoilerText,
|
contentWarning = item.params.spoilerText,
|
||||||
|
@ -126,7 +128,8 @@ class ScheduledTootActivity : BaseActivity(), ScheduledTootActionListener, Injec
|
||||||
visibility = item.params.visibility,
|
visibility = item.params.visibility,
|
||||||
scheduledAt = item.scheduledAt,
|
scheduledAt = item.scheduledAt,
|
||||||
sensitive = item.params.sensitive
|
sensitive = item.params.sensitive
|
||||||
))
|
)
|
||||||
|
)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ interface ScheduledTootActionListener {
|
||||||
class ScheduledTootAdapter(
|
class ScheduledTootAdapter(
|
||||||
val listener: ScheduledTootActionListener
|
val listener: ScheduledTootActionListener
|
||||||
) : PagingDataAdapter<ScheduledStatus, BindingHolder<ItemScheduledTootBinding>>(
|
) : PagingDataAdapter<ScheduledStatus, BindingHolder<ItemScheduledTootBinding>>(
|
||||||
object: DiffUtil.ItemCallback<ScheduledStatus>(){
|
object : DiffUtil.ItemCallback<ScheduledStatus>() {
|
||||||
override fun areItemsTheSame(oldItem: ScheduledStatus, newItem: ScheduledStatus): Boolean {
|
override fun areItemsTheSame(oldItem: ScheduledStatus, newItem: ScheduledStatus): Boolean {
|
||||||
return oldItem.id == newItem.id
|
return oldItem.id == newItem.id
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,6 @@ class ScheduledTootAdapter(
|
||||||
override fun areContentsTheSame(oldItem: ScheduledStatus, newItem: ScheduledStatus): Boolean {
|
override fun areContentsTheSame(oldItem: ScheduledStatus, newItem: ScheduledStatus): Boolean {
|
||||||
return oldItem == newItem
|
return oldItem == newItem
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
@ -50,7 +49,7 @@ class ScheduledTootAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: BindingHolder<ItemScheduledTootBinding>, position: Int) {
|
override fun onBindViewHolder(holder: BindingHolder<ItemScheduledTootBinding>, position: Int) {
|
||||||
getItem(position)?.let{ item ->
|
getItem(position)?.let { item ->
|
||||||
holder.binding.edit.isEnabled = true
|
holder.binding.edit.isEnabled = true
|
||||||
holder.binding.delete.isEnabled = true
|
holder.binding.delete.isEnabled = true
|
||||||
holder.binding.text.text = item.params.text
|
holder.binding.text.text = item.params.text
|
||||||
|
|
|
@ -24,7 +24,7 @@ import kotlinx.coroutines.rx3.await
|
||||||
|
|
||||||
class ScheduledTootPagingSourceFactory(
|
class ScheduledTootPagingSourceFactory(
|
||||||
private val mastodonApi: MastodonApi
|
private val mastodonApi: MastodonApi
|
||||||
): () -> ScheduledTootPagingSource {
|
) : () -> ScheduledTootPagingSource {
|
||||||
|
|
||||||
private val scheduledTootsCache = mutableListOf<ScheduledStatus>()
|
private val scheduledTootsCache = mutableListOf<ScheduledStatus>()
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ class ScheduledTootPagingSourceFactory(
|
||||||
class ScheduledTootPagingSource(
|
class ScheduledTootPagingSource(
|
||||||
private val mastodonApi: MastodonApi,
|
private val mastodonApi: MastodonApi,
|
||||||
private val scheduledTootsCache: MutableList<ScheduledStatus>
|
private val scheduledTootsCache: MutableList<ScheduledStatus>
|
||||||
): PagingSource<String, ScheduledStatus>() {
|
) : PagingSource<String, ScheduledStatus>() {
|
||||||
|
|
||||||
override fun getRefreshKey(state: PagingState<String, ScheduledStatus>): String? {
|
override fun getRefreshKey(state: PagingState<String, ScheduledStatus>): String? {
|
||||||
return null
|
return null
|
||||||
|
|
Loading…
Reference in New Issue