Apply ktlint and add to CI
This commit is contained in:
parent
004a9b4921
commit
c7a91fb1df
|
@ -22,6 +22,7 @@ jobs:
|
||||||
|
|
||||||
- run: |
|
- run: |
|
||||||
chmod +x ./gradlew
|
chmod +x ./gradlew
|
||||||
|
./gradlew :ktlintCheck
|
||||||
./gradlew :app:testBlueDebugUnitTest
|
./gradlew :app:testBlueDebugUnitTest
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@ import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.activity.viewModels
|
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
|
import androidx.activity.viewModels
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.appcompat.view.menu.MenuBuilder
|
import androidx.appcompat.view.menu.MenuBuilder
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
|
@ -621,11 +621,11 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.mainDrawer.addItems(
|
binding.mainDrawer.addItems(
|
||||||
secondaryDrawerItem {
|
secondaryDrawerItem {
|
||||||
nameText = "Yuito (by kyori19)"
|
nameText = "Yuito (by kyori19)"
|
||||||
isEnabled = false
|
isEnabled = false
|
||||||
textColor = ColorStateList.valueOf(ThemeUtils.getColor(this@MainActivity, R.attr.colorInfo))
|
textColor = ColorStateList.valueOf(ThemeUtils.getColor(this@MainActivity, R.attr.colorInfo))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,8 +732,8 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
}
|
}
|
||||||
R.id.tabEditList -> {
|
R.id.tabEditList -> {
|
||||||
AccountsInListFragment.newInstance(
|
AccountsInListFragment.newInstance(
|
||||||
tabs[i].arguments.getOrNull(0).orEmpty(),
|
tabs[i].arguments.getOrNull(0).orEmpty(),
|
||||||
tabs[i].arguments.getOrNull(1).orEmpty()
|
tabs[i].arguments.getOrNull(1).orEmpty()
|
||||||
).show(supportFragmentManager, null)
|
).show(supportFragmentManager, null)
|
||||||
}
|
}
|
||||||
R.id.tabToggleStreaming -> {
|
R.id.tabToggleStreaming -> {
|
||||||
|
@ -750,18 +750,20 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
|
||||||
it.tabPreferences = tabs
|
it.tabPreferences = tabs
|
||||||
accountManager.saveAccount(it)
|
accountManager.saveAccount(it)
|
||||||
}
|
}
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
||||||
.subscribe()
|
.subscribe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
R.id.tabToggleNotificationsFilter -> {
|
R.id.tabToggleNotificationsFilter -> {
|
||||||
if (fragment is NotificationsFragment) {
|
if (fragment is NotificationsFragment) {
|
||||||
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
prefs.edit().putBoolean("showNotificationsFilter",
|
prefs.edit().putBoolean(
|
||||||
!prefs.getBoolean("showNotificationsFilter", true))
|
"showNotificationsFilter",
|
||||||
.apply()
|
!prefs.getBoolean("showNotificationsFilter", true)
|
||||||
|
)
|
||||||
|
.apply()
|
||||||
eventHub.dispatch(PreferenceChangedEvent("showNotificationsFilter"))
|
eventHub.dispatch(PreferenceChangedEvent("showNotificationsFilter"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,12 +23,12 @@ import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
import androidx.lifecycle.lifecycleScope
|
|
||||||
import androidx.lifecycle.Lifecycle
|
import androidx.lifecycle.Lifecycle
|
||||||
import autodispose2.androidx.lifecycle.autoDispose
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.keylesspalace.tusky.appstore.EventHub
|
|
||||||
import at.connyduck.calladapter.networkresult.fold
|
import at.connyduck.calladapter.networkresult.fold
|
||||||
|
import autodispose2.androidx.lifecycle.autoDispose
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import com.keylesspalace.tusky.appstore.EventHub
|
||||||
import com.keylesspalace.tusky.components.timeline.TimelineFragment
|
import com.keylesspalace.tusky.components.timeline.TimelineFragment
|
||||||
import com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel.Kind
|
import com.keylesspalace.tusky.components.timeline.viewmodel.TimelineViewModel.Kind
|
||||||
import com.keylesspalace.tusky.databinding.ActivityStatuslistBinding
|
import com.keylesspalace.tusky.databinding.ActivityStatuslistBinding
|
||||||
|
@ -36,8 +36,8 @@ import com.keylesspalace.tusky.di.ViewModelFactory
|
||||||
import com.keylesspalace.tusky.util.viewBinding
|
import com.keylesspalace.tusky.util.viewBinding
|
||||||
import dagger.android.DispatchingAndroidInjector
|
import dagger.android.DispatchingAndroidInjector
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import net.accelf.yuito.QuickTootViewModel
|
import net.accelf.yuito.QuickTootViewModel
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector {
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var viewModelFactory: ViewModelFactory
|
lateinit var viewModelFactory: ViewModelFactory
|
||||||
|
|
||||||
private val quickTootViewModel: QuickTootViewModel by viewModels{ viewModelFactory }
|
private val quickTootViewModel: QuickTootViewModel by viewModels { viewModelFactory }
|
||||||
|
|
||||||
private val binding: ActivityStatuslistBinding by viewBinding(ActivityStatuslistBinding::inflate)
|
private val binding: ActivityStatuslistBinding by viewBinding(ActivityStatuslistBinding::inflate)
|
||||||
private lateinit var kind: Kind
|
private lateinit var kind: Kind
|
||||||
|
@ -95,9 +95,9 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector {
|
||||||
binding.viewQuickToot.attachViewModel(quickTootViewModel, this)
|
binding.viewQuickToot.attachViewModel(quickTootViewModel, this)
|
||||||
|
|
||||||
eventHub.events
|
eventHub.events
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
|
||||||
.subscribe(binding.viewQuickToot::handleEvent)
|
.subscribe(binding.viewQuickToot::handleEvent)
|
||||||
binding.floatingBtn.setOnClickListener(binding.viewQuickToot::onFABClicked)
|
binding.floatingBtn.setOnClickListener(binding.viewQuickToot::onFABClicked)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -529,16 +529,16 @@ class ComposeActivity :
|
||||||
binding.checkboxUseDefaultText.isChecked = preferences.getBoolean(PREF_USE_DEFAULT_TAG, false)
|
binding.checkboxUseDefaultText.isChecked = preferences.getBoolean(PREF_USE_DEFAULT_TAG, false)
|
||||||
binding.checkboxUseDefaultText.setOnCheckedChangeListener { _, isChecked ->
|
binding.checkboxUseDefaultText.setOnCheckedChangeListener { _, isChecked ->
|
||||||
preferences.edit()
|
preferences.edit()
|
||||||
.putBoolean(PREF_USE_DEFAULT_TAG, isChecked)
|
.putBoolean(PREF_USE_DEFAULT_TAG, isChecked)
|
||||||
.apply()
|
.apply()
|
||||||
eventHub.dispatch(PreferenceChangedEvent(PREF_USE_DEFAULT_TAG))
|
eventHub.dispatch(PreferenceChangedEvent(PREF_USE_DEFAULT_TAG))
|
||||||
}
|
}
|
||||||
|
|
||||||
binding.editTextDefaultText.setText(preferences.getString(PREF_DEFAULT_TAG, ""))
|
binding.editTextDefaultText.setText(preferences.getString(PREF_DEFAULT_TAG, ""))
|
||||||
binding.editTextDefaultText.doAfterTextChanged {
|
binding.editTextDefaultText.doAfterTextChanged {
|
||||||
preferences.edit()
|
preferences.edit()
|
||||||
.putString(PREF_DEFAULT_TAG, it.toString())
|
.putString(PREF_DEFAULT_TAG, it.toString())
|
||||||
.apply()
|
.apply()
|
||||||
eventHub.dispatch(PreferenceChangedEvent(PREF_DEFAULT_TAG))
|
eventHub.dispatch(PreferenceChangedEvent(PREF_DEFAULT_TAG))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,16 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.FlowPreview
|
import kotlinx.coroutines.FlowPreview
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.channels.BufferOverflow
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
|
import kotlinx.coroutines.flow.catch
|
||||||
|
import kotlinx.coroutines.flow.filter
|
||||||
|
import kotlinx.coroutines.flow.first
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.shareIn
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
|
import kotlinx.coroutines.flow.updateAndGet
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
@ -71,14 +80,18 @@ class ComposeViewModel @Inject constructor(
|
||||||
private var hasScheduledTimeChanged: Boolean = false
|
private var hasScheduledTimeChanged: Boolean = false
|
||||||
|
|
||||||
private val useCache = MutableStateFlow(true)
|
private val useCache = MutableStateFlow(true)
|
||||||
val instanceInfo = useCache.map { when (it) {
|
val instanceInfo = useCache.map {
|
||||||
true -> instanceInfoRepo.getCachedInstanceInfo()
|
when (it) {
|
||||||
false -> instanceInfoRepo.getInstanceInfo()
|
true -> instanceInfoRepo.getCachedInstanceInfo()
|
||||||
} }.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
|
false -> instanceInfoRepo.getInstanceInfo()
|
||||||
val emoji = useCache.map { when (it) {
|
}
|
||||||
true -> instanceInfoRepo.getCachedEmojis()
|
}.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
|
||||||
false -> instanceInfoRepo.getEmojis()
|
val emoji = useCache.map {
|
||||||
} }.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
|
when (it) {
|
||||||
|
true -> instanceInfoRepo.getCachedEmojis()
|
||||||
|
false -> instanceInfoRepo.getEmojis()
|
||||||
|
}
|
||||||
|
}.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
|
||||||
|
|
||||||
val markMediaAsSensitive: MutableStateFlow<Boolean> =
|
val markMediaAsSensitive: MutableStateFlow<Boolean> =
|
||||||
MutableStateFlow(accountManager.activeAccount?.defaultMediaSensitivity ?: false)
|
MutableStateFlow(accountManager.activeAccount?.defaultMediaSensitivity ?: false)
|
||||||
|
|
|
@ -322,14 +322,17 @@ class PreferencesFragment : PreferenceFragmentCompat(), Injectable {
|
||||||
setTitle(R.string.pref_title_stacktrace_send)
|
setTitle(R.string.pref_title_stacktrace_send)
|
||||||
setOnPreferenceClickListener {
|
setOnPreferenceClickListener {
|
||||||
activity?.let { activity ->
|
activity?.let { activity ->
|
||||||
val intent = ComposeActivity.startIntent(activity, ComposeOptions(
|
val intent = ComposeActivity.startIntent(
|
||||||
|
activity,
|
||||||
|
ComposeOptions(
|
||||||
content = "@ars42525@odakyu.app $stackTrace".substring(0, 400),
|
content = "@ars42525@odakyu.app $stackTrace".substring(0, 400),
|
||||||
contentWarning = "Yuito StackTrace"
|
contentWarning = "Yuito StackTrace"
|
||||||
))
|
)
|
||||||
|
)
|
||||||
activity.startActivity(intent)
|
activity.startActivity(intent)
|
||||||
prefs.edit()
|
prefs.edit()
|
||||||
.remove(PrefKeys.STACK_TRACE)
|
.remove(PrefKeys.STACK_TRACE)
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,9 @@ import com.keylesspalace.tusky.network.NotestockApi
|
||||||
import com.keylesspalace.tusky.viewdata.StatusViewData
|
import com.keylesspalace.tusky.viewdata.StatusViewData
|
||||||
|
|
||||||
class SearchNotestockPagingSourceFactory(
|
class SearchNotestockPagingSourceFactory(
|
||||||
private val notestockApi: NotestockApi,
|
private val notestockApi: NotestockApi,
|
||||||
private val initialItems: List<StatusViewData.Concrete>? = null,
|
private val initialItems: List<StatusViewData.Concrete>? = null,
|
||||||
private val parser: (SearchResult) -> List<StatusViewData.Concrete>
|
private val parser: (SearchResult) -> List<StatusViewData.Concrete>
|
||||||
) : () -> SearchNotestockPagingSource {
|
) : () -> SearchNotestockPagingSource {
|
||||||
|
|
||||||
private var searchRequest: String = ""
|
private var searchRequest: String = ""
|
||||||
|
|
|
@ -36,5 +36,4 @@ class SearchPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(acti
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemCount() = 4
|
override fun getItemCount() = 4
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,6 @@ class SearchNotestockFragment : SearchFragment<StatusViewData.Concrete>(), Statu
|
||||||
return SearchStatusesAdapter(statusDisplayOptions, this)
|
return SearchStatusesAdapter(statusDisplayOptions, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun onContentHiddenChange(isShowing: Boolean, position: Int) {
|
override fun onContentHiddenChange(isShowing: Boolean, position: Int) {
|
||||||
searchAdapter.peek(position)?.let {
|
searchAdapter.peek(position)?.let {
|
||||||
viewModel.contentHiddenNotestockChange(it, isShowing)
|
viewModel.contentHiddenNotestockChange(it, isShowing)
|
||||||
|
@ -133,9 +132,7 @@ class SearchNotestockFragment : SearchFragment<StatusViewData.Concrete>(), Statu
|
||||||
Attachment.Type.UNKNOWN -> {
|
Attachment.Type.UNKNOWN -> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewThread(position: Int) {
|
override fun onViewThread(position: Int) {
|
||||||
|
@ -491,11 +488,9 @@ class SearchNotestockFragment : SearchFragment<StatusViewData.Concrete>(), Statu
|
||||||
Log.w("SearchStatusesFragment", "error deleting status", error)
|
Log.w("SearchStatusesFragment", "error deleting status", error)
|
||||||
Toast.makeText(context, R.string.error_generic, Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, R.string.error_generic, Toast.LENGTH_SHORT).show()
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,7 +240,7 @@ class SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), Status
|
||||||
}
|
}
|
||||||
|
|
||||||
val intent = ComposeActivity.startIntent(
|
val intent = ComposeActivity.startIntent(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
ComposeOptions(
|
ComposeOptions(
|
||||||
quoteId = status.actionableId,
|
quoteId = status.actionableId,
|
||||||
quoteStatusAuthor = actionableStatus.account.localUsername,
|
quoteStatusAuthor = actionableStatus.account.localUsername,
|
||||||
|
|
|
@ -252,11 +252,14 @@ class NetworkTimelineViewModel @Inject constructor(
|
||||||
statusData.add(0, StatusViewData.Placeholder(status.id, isLoading = false))
|
statusData.add(0, StatusViewData.Placeholder(status.id, isLoading = false))
|
||||||
isFirstOfStreaming = false
|
isFirstOfStreaming = false
|
||||||
} else {
|
} else {
|
||||||
statusData.add(0, status.toViewData(
|
statusData.add(
|
||||||
isShowingContent = activeAccount.alwaysShowSensitiveMedia,
|
0,
|
||||||
isExpanded = activeAccount.alwaysOpenSpoiler,
|
status.toViewData(
|
||||||
isCollapsed = true,
|
isShowingContent = activeAccount.alwaysShowSensitiveMedia,
|
||||||
))
|
isExpanded = activeAccount.alwaysOpenSpoiler,
|
||||||
|
isCollapsed = true,
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
currentSource?.invalidate()
|
currentSource?.invalidate()
|
||||||
|
|
|
@ -240,8 +240,8 @@ abstract class TimelineViewModel(
|
||||||
protected fun shouldFilterStatus(statusViewData: StatusViewData): Boolean {
|
protected fun shouldFilterStatus(statusViewData: StatusViewData): Boolean {
|
||||||
val status = statusViewData.asStatusOrNull()?.status ?: return false
|
val status = statusViewData.asStatusOrNull()?.status ?: return false
|
||||||
return status.inReplyToId != null && filterRemoveReplies ||
|
return status.inReplyToId != null && filterRemoveReplies ||
|
||||||
status.reblog != null && filterRemoveReblogs ||
|
status.reblog != null && filterRemoveReblogs ||
|
||||||
filterModel.shouldFilterStatus(status.actionableStatus)
|
filterModel.shouldFilterStatus(status.actionableStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onPreferenceChanged(key: String) {
|
private fun onPreferenceChanged(key: String) {
|
||||||
|
|
|
@ -75,7 +75,7 @@ class Converters @Inject constructor (
|
||||||
// List name may include ":"
|
// List name may include ":"
|
||||||
return tabData?.joinToString(";") {
|
return tabData?.joinToString(";") {
|
||||||
(if (it.enableStreaming) { it.id + STREAMING } else { it.id }) + ":" +
|
(if (it.enableStreaming) { it.id + STREAMING } else { it.id }) + ":" +
|
||||||
it.arguments.joinToString(":") { s -> URLEncoder.encode(s, "UTF-8") }
|
it.arguments.joinToString(":") { s -> URLEncoder.encode(s, "UTF-8") }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,5 +95,4 @@ abstract class FragmentBuildersModule {
|
||||||
|
|
||||||
@ContributesAndroidInjector
|
@ContributesAndroidInjector
|
||||||
abstract fun searchNotestockFragment(): SearchNotestockFragment
|
abstract fun searchNotestockFragment(): SearchNotestockFragment
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ class NetworkModule {
|
||||||
@Singleton
|
@Singleton
|
||||||
fun providesNotestockApi(
|
fun providesNotestockApi(
|
||||||
okHttpClient: OkHttpClient,
|
okHttpClient: OkHttpClient,
|
||||||
gson: Gson
|
gson: Gson
|
||||||
): NotestockApi {
|
): NotestockApi {
|
||||||
val retrofit = Retrofit.Builder().baseUrl("https://notestock.osa-p.net")
|
val retrofit = Retrofit.Builder().baseUrl("https://notestock.osa-p.net")
|
||||||
.client(okHttpClient)
|
.client(okHttpClient)
|
||||||
|
|
|
@ -132,5 +132,5 @@ abstract class ViewModelModule {
|
||||||
@ViewModelKey(QuickTootViewModel::class)
|
@ViewModelKey(QuickTootViewModel::class)
|
||||||
internal abstract fun quickTootViewModel(viewModel: QuickTootViewModel): ViewModel
|
internal abstract fun quickTootViewModel(viewModel: QuickTootViewModel): ViewModel
|
||||||
|
|
||||||
//Add more ViewModels here
|
// Add more ViewModels here
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,7 @@ interface NotestockApi {
|
||||||
|
|
||||||
@GET("api/v1/search.json")
|
@GET("api/v1/search.json")
|
||||||
fun searchObservable(
|
fun searchObservable(
|
||||||
@Query("q") q: String,
|
@Query("q") q: String,
|
||||||
@Query("max_dt") maxDt: String? = null
|
@Query("max_dt") maxDt: String? = null
|
||||||
): Single<SearchResult>
|
): Single<SearchResult>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,9 @@ import kotlinx.coroutines.launch
|
||||||
import kotlin.properties.Delegates
|
import kotlin.properties.Delegates
|
||||||
|
|
||||||
class QuickTootView @JvmOverloads constructor(
|
class QuickTootView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
attrs: AttributeSet? = null,
|
attrs: AttributeSet? = null,
|
||||||
defStyleAttr: Int = 0,
|
defStyleAttr: Int = 0,
|
||||||
) : ConstraintLayout(context, attrs, defStyleAttr) {
|
) : ConstraintLayout(context, attrs, defStyleAttr) {
|
||||||
|
|
||||||
private val binding = ViewQuickTootBinding.inflate(LayoutInflater.from(context), this, true)
|
private val binding = ViewQuickTootBinding.inflate(LayoutInflater.from(context), this, true)
|
||||||
|
|
|
@ -12,8 +12,8 @@ import kotlinx.coroutines.flow.update
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class QuickTootViewModel @Inject constructor(
|
class QuickTootViewModel @Inject constructor(
|
||||||
accountManager: AccountManager
|
accountManager: AccountManager
|
||||||
): ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private val account = accountManager.activeAccount!!
|
private val account = accountManager.activeAccount!!
|
||||||
|
|
||||||
|
@ -31,11 +31,13 @@ class QuickTootViewModel @Inject constructor(
|
||||||
val defaultTag: MutableStateFlow<String?> = MutableStateFlow(null)
|
val defaultTag: MutableStateFlow<String?> = MutableStateFlow(null)
|
||||||
|
|
||||||
fun setInitialVisibility(num: Int) {
|
fun setInitialVisibility(num: Int) {
|
||||||
visibilityMutable.value = (Visibility.byNum(num)
|
visibilityMutable.value = (
|
||||||
|
Visibility.byNum(num)
|
||||||
.takeUnless { it == Visibility.UNKNOWN }
|
.takeUnless { it == Visibility.UNKNOWN }
|
||||||
?: account.defaultPostPrivacy)
|
?: account.defaultPostPrivacy
|
||||||
.takeUnless { it == Visibility.UNLEAKABLE && unleakableAllowed }
|
)
|
||||||
?: Visibility.PRIVATE
|
.takeUnless { it == Visibility.UNLEAKABLE && unleakableAllowed }
|
||||||
|
?: Visibility.PRIVATE
|
||||||
}
|
}
|
||||||
|
|
||||||
fun stepVisibility() {
|
fun stepVisibility() {
|
||||||
|
@ -63,18 +65,18 @@ class QuickTootViewModel @Inject constructor(
|
||||||
|
|
||||||
fun composeOptions(tootRightNow: Boolean): ComposeActivity.ComposeOptions {
|
fun composeOptions(tootRightNow: Boolean): ComposeActivity.ComposeOptions {
|
||||||
return ComposeActivity.ComposeOptions(
|
return ComposeActivity.ComposeOptions(
|
||||||
content = content.value,
|
content = content.value,
|
||||||
mentionedUsernames = inReplyTo.value
|
mentionedUsernames = inReplyTo.value
|
||||||
?.let {
|
?.let {
|
||||||
linkedSetOf(it.account.username, *(it.mentions.map { mention -> mention.username }.toTypedArray()))
|
linkedSetOf(it.account.username, *(it.mentions.map { mention -> mention.username }.toTypedArray()))
|
||||||
.apply { remove(account.username) }
|
.apply { remove(account.username) }
|
||||||
},
|
},
|
||||||
inReplyToId = inReplyTo.value?.id,
|
inReplyToId = inReplyTo.value?.id,
|
||||||
visibility = visibility.value,
|
visibility = visibility.value,
|
||||||
contentWarning = inReplyTo.value?.spoilerText,
|
contentWarning = inReplyTo.value?.spoilerText,
|
||||||
replyingStatusAuthor = inReplyTo.value?.account?.name,
|
replyingStatusAuthor = inReplyTo.value?.account?.name,
|
||||||
replyingStatusContent = inReplyTo.value?.content,
|
replyingStatusContent = inReplyTo.value?.content,
|
||||||
tootRightNow = tootRightNow
|
tootRightNow = tootRightNow
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,10 +70,12 @@ class QuoteInlineHelper(
|
||||||
true -> View.VISIBLE
|
true -> View.VISIBLE
|
||||||
false -> View.GONE
|
false -> View.GONE
|
||||||
}
|
}
|
||||||
binding.statusQuoteInlineContentWarningButton.setText(when (show) {
|
binding.statusQuoteInlineContentWarningButton.setText(
|
||||||
true -> R.string.post_content_warning_show_less
|
when (show) {
|
||||||
false -> R.string.post_content_warning_show_more
|
true -> R.string.post_content_warning_show_less
|
||||||
})
|
false -> R.string.post_content_warning_show_more
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hideSpoilerText() {
|
private fun hideSpoilerText() {
|
||||||
|
|
|
@ -11,7 +11,7 @@ import com.keylesspalace.tusky.entity.Status.Visibility
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class VisibilityToggleButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
class VisibilityToggleButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
||||||
AppCompatImageView(context, attrs) {
|
AppCompatImageView(context, attrs) {
|
||||||
|
|
||||||
private val preference by lazy { PreferenceManager.getDefaultSharedPreferences(context) }
|
private val preference by lazy { PreferenceManager.getDefaultSharedPreferences(context) }
|
||||||
|
|
||||||
|
@ -25,35 +25,35 @@ class VisibilityToggleButton @JvmOverloads constructor(context: Context, attrs:
|
||||||
viewModel.visibility.collect(::updateVisibility)
|
viewModel.visibility.collect(::updateVisibility)
|
||||||
}
|
}
|
||||||
viewModel.setInitialVisibility(preference.getInt(PREF_CURRENT_VISIBILITY, Visibility.UNKNOWN.num))
|
viewModel.setInitialVisibility(preference.getInt(PREF_CURRENT_VISIBILITY, Visibility.UNKNOWN.num))
|
||||||
setOnClickListener{ viewModel.stepVisibility() }
|
setOnClickListener { viewModel.stepVisibility() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateVisibility(visibility: Visibility) {
|
private fun updateVisibility(visibility: Visibility) {
|
||||||
setImageResource(
|
setImageResource(
|
||||||
when (visibility) {
|
when (visibility) {
|
||||||
Visibility.PUBLIC -> R.drawable.ic_public_24dp
|
Visibility.PUBLIC -> R.drawable.ic_public_24dp
|
||||||
Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp
|
Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp
|
||||||
Visibility.PRIVATE -> R.drawable.ic_lock_outline_24dp
|
Visibility.PRIVATE -> R.drawable.ic_lock_outline_24dp
|
||||||
Visibility.DIRECT -> R.drawable.ic_email_24dp
|
Visibility.DIRECT -> R.drawable.ic_email_24dp
|
||||||
Visibility.UNLEAKABLE -> R.drawable.ic_low_vision_24dp
|
Visibility.UNLEAKABLE -> R.drawable.ic_low_vision_24dp
|
||||||
else -> R.drawable.ic_lock_open_24dp
|
else -> R.drawable.ic_lock_open_24dp
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
contentDescription = context.getString(
|
contentDescription = context.getString(
|
||||||
when (visibility) {
|
when (visibility) {
|
||||||
Visibility.UNKNOWN -> R.string.visibility_unknown
|
Visibility.UNKNOWN -> R.string.visibility_unknown
|
||||||
Visibility.PUBLIC -> R.string.visibility_public
|
Visibility.PUBLIC -> R.string.visibility_public
|
||||||
Visibility.UNLISTED -> R.string.visibility_unlisted
|
Visibility.UNLISTED -> R.string.visibility_unlisted
|
||||||
Visibility.PRIVATE -> R.string.visibility_private
|
Visibility.PRIVATE -> R.string.visibility_private
|
||||||
Visibility.DIRECT -> R.string.visibility_direct
|
Visibility.DIRECT -> R.string.visibility_direct
|
||||||
Visibility.UNLEAKABLE -> R.string.visibility_unleakable
|
Visibility.UNLEAKABLE -> R.string.visibility_unleakable
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
preference.edit()
|
preference.edit()
|
||||||
.putInt(PREF_CURRENT_VISIBILITY, visibility.num)
|
.putInt(PREF_CURRENT_VISIBILITY, visibility.num)
|
||||||
.apply()
|
.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -4,8 +4,6 @@ import android.app.Activity
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.content.ComponentName
|
import android.content.ComponentName
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Looper
|
|
||||||
import android.view.View
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
import androidx.viewpager2.widget.ViewPager2
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
|
@ -19,7 +17,6 @@ import com.keylesspalace.tusky.entity.Account
|
||||||
import com.keylesspalace.tusky.entity.Instance
|
import com.keylesspalace.tusky.entity.Instance
|
||||||
import com.keylesspalace.tusky.entity.Notification
|
import com.keylesspalace.tusky.entity.Notification
|
||||||
import com.keylesspalace.tusky.entity.TimelineAccount
|
import com.keylesspalace.tusky.entity.TimelineAccount
|
||||||
import net.accelf.yuito.FooterDrawerItem
|
|
||||||
import net.accelf.yuito.QuickTootViewModel
|
import net.accelf.yuito.QuickTootViewModel
|
||||||
import net.accelf.yuito.streaming.StreamingManager
|
import net.accelf.yuito.streaming.StreamingManager
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
|
|
Loading…
Reference in New Issue