Apply ktlint and add to CI

This commit is contained in:
kyori19 2022-11-10 23:16:52 +09:00
parent 004a9b4921
commit c7a91fb1df
No known key found for this signature in database
GPG Key ID: F7BDE7DD42BF366A
22 changed files with 126 additions and 111 deletions

View File

@ -22,6 +22,7 @@ jobs:
- run: |
chmod +x ./gradlew
./gradlew :ktlintCheck
./gradlew :app:testBlueDebugUnitTest

View File

@ -39,8 +39,8 @@ import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import android.widget.ImageView
import androidx.activity.viewModels
import androidx.activity.OnBackPressedCallback
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.menu.MenuBuilder
import androidx.appcompat.widget.PopupMenu
@ -621,11 +621,11 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
binding.mainDrawer.addItems(
secondaryDrawerItem {
nameText = "Yuito (by kyori19)"
isEnabled = false
textColor = ColorStateList.valueOf(ThemeUtils.getColor(this@MainActivity, R.attr.colorInfo))
}
secondaryDrawerItem {
nameText = "Yuito (by kyori19)"
isEnabled = false
textColor = ColorStateList.valueOf(ThemeUtils.getColor(this@MainActivity, R.attr.colorInfo))
}
)
}
@ -732,8 +732,8 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
}
R.id.tabEditList -> {
AccountsInListFragment.newInstance(
tabs[i].arguments.getOrNull(0).orEmpty(),
tabs[i].arguments.getOrNull(1).orEmpty()
tabs[i].arguments.getOrNull(0).orEmpty(),
tabs[i].arguments.getOrNull(1).orEmpty()
).show(supportFragmentManager, null)
}
R.id.tabToggleStreaming -> {
@ -750,18 +750,20 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, HasAndroidInje
it.tabPreferences = tabs
accountManager.saveAccount(it)
}
.subscribeOn(Schedulers.io())
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
.subscribe()
.subscribeOn(Schedulers.io())
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
.subscribe()
}
}
}
R.id.tabToggleNotificationsFilter -> {
if (fragment is NotificationsFragment) {
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
prefs.edit().putBoolean("showNotificationsFilter",
!prefs.getBoolean("showNotificationsFilter", true))
.apply()
prefs.edit().putBoolean(
"showNotificationsFilter",
!prefs.getBoolean("showNotificationsFilter", true)
)
.apply()
eventHub.dispatch(PreferenceChangedEvent("showNotificationsFilter"))
}
}

View File

@ -23,12 +23,12 @@ import android.view.Menu
import android.view.MenuItem
import androidx.activity.viewModels
import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.Lifecycle
import autodispose2.androidx.lifecycle.autoDispose
import com.keylesspalace.tusky.appstore.EventHub
import androidx.lifecycle.lifecycleScope
import at.connyduck.calladapter.networkresult.fold
import autodispose2.androidx.lifecycle.autoDispose
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.viewmodel.TimelineViewModel.Kind
import com.keylesspalace.tusky.databinding.ActivityStatuslistBinding
@ -36,8 +36,8 @@ import com.keylesspalace.tusky.di.ViewModelFactory
import com.keylesspalace.tusky.util.viewBinding
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import kotlinx.coroutines.launch
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import kotlinx.coroutines.launch
import net.accelf.yuito.QuickTootViewModel
import javax.inject.Inject
@ -50,7 +50,7 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector {
@Inject
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 lateinit var kind: Kind
@ -95,9 +95,9 @@ class StatusListActivity : BottomSheetActivity(), HasAndroidInjector {
binding.viewQuickToot.attachViewModel(quickTootViewModel, this)
eventHub.events
.observeOn(AndroidSchedulers.mainThread())
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
.subscribe(binding.viewQuickToot::handleEvent)
.observeOn(AndroidSchedulers.mainThread())
.autoDispose(this, Lifecycle.Event.ON_DESTROY)
.subscribe(binding.viewQuickToot::handleEvent)
binding.floatingBtn.setOnClickListener(binding.viewQuickToot::onFABClicked)
}

View File

@ -529,16 +529,16 @@ class ComposeActivity :
binding.checkboxUseDefaultText.isChecked = preferences.getBoolean(PREF_USE_DEFAULT_TAG, false)
binding.checkboxUseDefaultText.setOnCheckedChangeListener { _, isChecked ->
preferences.edit()
.putBoolean(PREF_USE_DEFAULT_TAG, isChecked)
.apply()
.putBoolean(PREF_USE_DEFAULT_TAG, isChecked)
.apply()
eventHub.dispatch(PreferenceChangedEvent(PREF_USE_DEFAULT_TAG))
}
binding.editTextDefaultText.setText(preferences.getString(PREF_DEFAULT_TAG, ""))
binding.editTextDefaultText.doAfterTextChanged {
preferences.edit()
.putString(PREF_DEFAULT_TAG, it.toString())
.apply()
.putString(PREF_DEFAULT_TAG, it.toString())
.apply()
eventHub.dispatch(PreferenceChangedEvent(PREF_DEFAULT_TAG))
}
}

View File

@ -38,7 +38,16 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.Job
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.withContext
import javax.inject.Inject
@ -71,14 +80,18 @@ class ComposeViewModel @Inject constructor(
private var hasScheduledTimeChanged: Boolean = false
private val useCache = MutableStateFlow(true)
val instanceInfo = useCache.map { when (it) {
true -> instanceInfoRepo.getCachedInstanceInfo()
false -> instanceInfoRepo.getInstanceInfo()
} }.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
val emoji = useCache.map { when (it) {
true -> instanceInfoRepo.getCachedEmojis()
false -> instanceInfoRepo.getEmojis()
} }.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
val instanceInfo = useCache.map {
when (it) {
true -> instanceInfoRepo.getCachedInstanceInfo()
false -> instanceInfoRepo.getInstanceInfo()
}
}.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
val emoji = useCache.map {
when (it) {
true -> instanceInfoRepo.getCachedEmojis()
false -> instanceInfoRepo.getEmojis()
}
}.shareIn(viewModelScope, SharingStarted.Eagerly, 1)
val markMediaAsSensitive: MutableStateFlow<Boolean> =
MutableStateFlow(accountManager.activeAccount?.defaultMediaSensitivity ?: false)

View File

@ -322,14 +322,17 @@ class PreferencesFragment : PreferenceFragmentCompat(), Injectable {
setTitle(R.string.pref_title_stacktrace_send)
setOnPreferenceClickListener {
activity?.let { activity ->
val intent = ComposeActivity.startIntent(activity, ComposeOptions(
val intent = ComposeActivity.startIntent(
activity,
ComposeOptions(
content = "@ars42525@odakyu.app $stackTrace".substring(0, 400),
contentWarning = "Yuito StackTrace"
))
)
)
activity.startActivity(intent)
prefs.edit()
.remove(PrefKeys.STACK_TRACE)
.apply()
.remove(PrefKeys.STACK_TRACE)
.apply()
}
true
}

View File

@ -5,9 +5,9 @@ import com.keylesspalace.tusky.network.NotestockApi
import com.keylesspalace.tusky.viewdata.StatusViewData
class SearchNotestockPagingSourceFactory(
private val notestockApi: NotestockApi,
private val initialItems: List<StatusViewData.Concrete>? = null,
private val parser: (SearchResult) -> List<StatusViewData.Concrete>
private val notestockApi: NotestockApi,
private val initialItems: List<StatusViewData.Concrete>? = null,
private val parser: (SearchResult) -> List<StatusViewData.Concrete>
) : () -> SearchNotestockPagingSource {
private var searchRequest: String = ""

View File

@ -36,5 +36,4 @@ class SearchPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(acti
}
override fun getItemCount() = 4
}

View File

@ -74,7 +74,6 @@ class SearchNotestockFragment : SearchFragment<StatusViewData.Concrete>(), Statu
return SearchStatusesAdapter(statusDisplayOptions, this)
}
override fun onContentHiddenChange(isShowing: Boolean, position: Int) {
searchAdapter.peek(position)?.let {
viewModel.contentHiddenNotestockChange(it, isShowing)
@ -133,9 +132,7 @@ class SearchNotestockFragment : SearchFragment<StatusViewData.Concrete>(), Statu
Attachment.Type.UNKNOWN -> {
}
}
}
}
override fun onViewThread(position: Int) {
@ -491,11 +488,9 @@ class SearchNotestockFragment : SearchFragment<StatusViewData.Concrete>(), Statu
Log.w("SearchStatusesFragment", "error deleting status", error)
Toast.makeText(context, R.string.error_generic, Toast.LENGTH_SHORT).show()
})
}
.setNegativeButton(android.R.string.cancel, null)
.show()
}
}
}

View File

@ -240,7 +240,7 @@ class SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), Status
}
val intent = ComposeActivity.startIntent(
requireContext(),
requireContext(),
ComposeOptions(
quoteId = status.actionableId,
quoteStatusAuthor = actionableStatus.account.localUsername,

View File

@ -252,11 +252,14 @@ class NetworkTimelineViewModel @Inject constructor(
statusData.add(0, StatusViewData.Placeholder(status.id, isLoading = false))
isFirstOfStreaming = false
} else {
statusData.add(0, status.toViewData(
isShowingContent = activeAccount.alwaysShowSensitiveMedia,
isExpanded = activeAccount.alwaysOpenSpoiler,
isCollapsed = true,
))
statusData.add(
0,
status.toViewData(
isShowingContent = activeAccount.alwaysShowSensitiveMedia,
isExpanded = activeAccount.alwaysOpenSpoiler,
isCollapsed = true,
)
)
}
currentSource?.invalidate()

View File

@ -240,8 +240,8 @@ abstract class TimelineViewModel(
protected fun shouldFilterStatus(statusViewData: StatusViewData): Boolean {
val status = statusViewData.asStatusOrNull()?.status ?: return false
return status.inReplyToId != null && filterRemoveReplies ||
status.reblog != null && filterRemoveReblogs ||
filterModel.shouldFilterStatus(status.actionableStatus)
status.reblog != null && filterRemoveReblogs ||
filterModel.shouldFilterStatus(status.actionableStatus)
}
private fun onPreferenceChanged(key: String) {

View File

@ -75,7 +75,7 @@ class Converters @Inject constructor (
// List name may include ":"
return tabData?.joinToString(";") {
(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") }
}
}

View File

@ -95,5 +95,4 @@ abstract class FragmentBuildersModule {
@ContributesAndroidInjector
abstract fun searchNotestockFragment(): SearchNotestockFragment
}

View File

@ -140,7 +140,7 @@ class NetworkModule {
@Singleton
fun providesNotestockApi(
okHttpClient: OkHttpClient,
gson: Gson
gson: Gson
): NotestockApi {
val retrofit = Retrofit.Builder().baseUrl("https://notestock.osa-p.net")
.client(okHttpClient)

View File

@ -132,5 +132,5 @@ abstract class ViewModelModule {
@ViewModelKey(QuickTootViewModel::class)
internal abstract fun quickTootViewModel(viewModel: QuickTootViewModel): ViewModel
//Add more ViewModels here
// Add more ViewModels here
}

View File

@ -9,8 +9,7 @@ interface NotestockApi {
@GET("api/v1/search.json")
fun searchObservable(
@Query("q") q: String,
@Query("max_dt") maxDt: String? = null
@Query("q") q: String,
@Query("max_dt") maxDt: String? = null
): Single<SearchResult>
}

View File

@ -24,9 +24,9 @@ import kotlinx.coroutines.launch
import kotlin.properties.Delegates
class QuickTootView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
) : ConstraintLayout(context, attrs, defStyleAttr) {
private val binding = ViewQuickTootBinding.inflate(LayoutInflater.from(context), this, true)

View File

@ -12,8 +12,8 @@ import kotlinx.coroutines.flow.update
import javax.inject.Inject
class QuickTootViewModel @Inject constructor(
accountManager: AccountManager
): ViewModel() {
accountManager: AccountManager
) : ViewModel() {
private val account = accountManager.activeAccount!!
@ -31,11 +31,13 @@ class QuickTootViewModel @Inject constructor(
val defaultTag: MutableStateFlow<String?> = MutableStateFlow(null)
fun setInitialVisibility(num: Int) {
visibilityMutable.value = (Visibility.byNum(num)
visibilityMutable.value = (
Visibility.byNum(num)
.takeUnless { it == Visibility.UNKNOWN }
?: account.defaultPostPrivacy)
.takeUnless { it == Visibility.UNLEAKABLE && unleakableAllowed }
?: Visibility.PRIVATE
?: account.defaultPostPrivacy
)
.takeUnless { it == Visibility.UNLEAKABLE && unleakableAllowed }
?: Visibility.PRIVATE
}
fun stepVisibility() {
@ -63,18 +65,18 @@ class QuickTootViewModel @Inject constructor(
fun composeOptions(tootRightNow: Boolean): ComposeActivity.ComposeOptions {
return ComposeActivity.ComposeOptions(
content = content.value,
mentionedUsernames = inReplyTo.value
?.let {
linkedSetOf(it.account.username, *(it.mentions.map { mention -> mention.username }.toTypedArray()))
.apply { remove(account.username) }
},
inReplyToId = inReplyTo.value?.id,
visibility = visibility.value,
contentWarning = inReplyTo.value?.spoilerText,
replyingStatusAuthor = inReplyTo.value?.account?.name,
replyingStatusContent = inReplyTo.value?.content,
tootRightNow = tootRightNow
content = content.value,
mentionedUsernames = inReplyTo.value
?.let {
linkedSetOf(it.account.username, *(it.mentions.map { mention -> mention.username }.toTypedArray()))
.apply { remove(account.username) }
},
inReplyToId = inReplyTo.value?.id,
visibility = visibility.value,
contentWarning = inReplyTo.value?.spoilerText,
replyingStatusAuthor = inReplyTo.value?.account?.name,
replyingStatusContent = inReplyTo.value?.content,
tootRightNow = tootRightNow
)
}

View File

@ -70,10 +70,12 @@ class QuoteInlineHelper(
true -> View.VISIBLE
false -> View.GONE
}
binding.statusQuoteInlineContentWarningButton.setText(when (show) {
true -> R.string.post_content_warning_show_less
false -> R.string.post_content_warning_show_more
})
binding.statusQuoteInlineContentWarningButton.setText(
when (show) {
true -> R.string.post_content_warning_show_less
false -> R.string.post_content_warning_show_more
}
)
}
private fun hideSpoilerText() {

View File

@ -11,7 +11,7 @@ import com.keylesspalace.tusky.entity.Status.Visibility
import kotlinx.coroutines.launch
class VisibilityToggleButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
AppCompatImageView(context, attrs) {
AppCompatImageView(context, attrs) {
private val preference by lazy { PreferenceManager.getDefaultSharedPreferences(context) }
@ -25,35 +25,35 @@ class VisibilityToggleButton @JvmOverloads constructor(context: Context, attrs:
viewModel.visibility.collect(::updateVisibility)
}
viewModel.setInitialVisibility(preference.getInt(PREF_CURRENT_VISIBILITY, Visibility.UNKNOWN.num))
setOnClickListener{ viewModel.stepVisibility() }
setOnClickListener { viewModel.stepVisibility() }
}
private fun updateVisibility(visibility: Visibility) {
setImageResource(
when (visibility) {
Visibility.PUBLIC -> R.drawable.ic_public_24dp
Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp
Visibility.PRIVATE -> R.drawable.ic_lock_outline_24dp
Visibility.DIRECT -> R.drawable.ic_email_24dp
Visibility.UNLEAKABLE -> R.drawable.ic_low_vision_24dp
else -> R.drawable.ic_lock_open_24dp
}
when (visibility) {
Visibility.PUBLIC -> R.drawable.ic_public_24dp
Visibility.UNLISTED -> R.drawable.ic_lock_open_24dp
Visibility.PRIVATE -> R.drawable.ic_lock_outline_24dp
Visibility.DIRECT -> R.drawable.ic_email_24dp
Visibility.UNLEAKABLE -> R.drawable.ic_low_vision_24dp
else -> R.drawable.ic_lock_open_24dp
}
)
contentDescription = context.getString(
when (visibility) {
Visibility.UNKNOWN -> R.string.visibility_unknown
Visibility.PUBLIC -> R.string.visibility_public
Visibility.UNLISTED -> R.string.visibility_unlisted
Visibility.PRIVATE -> R.string.visibility_private
Visibility.DIRECT -> R.string.visibility_direct
Visibility.UNLEAKABLE -> R.string.visibility_unleakable
}
when (visibility) {
Visibility.UNKNOWN -> R.string.visibility_unknown
Visibility.PUBLIC -> R.string.visibility_public
Visibility.UNLISTED -> R.string.visibility_unlisted
Visibility.PRIVATE -> R.string.visibility_private
Visibility.DIRECT -> R.string.visibility_direct
Visibility.UNLEAKABLE -> R.string.visibility_unleakable
}
)
preference.edit()
.putInt(PREF_CURRENT_VISIBILITY, visibility.num)
.apply()
.putInt(PREF_CURRENT_VISIBILITY, visibility.num)
.apply()
}
companion object {

View File

@ -4,8 +4,6 @@ import android.app.Activity
import android.app.NotificationManager
import android.content.ComponentName
import android.content.Intent
import android.os.Looper
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
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.Notification
import com.keylesspalace.tusky.entity.TimelineAccount
import net.accelf.yuito.FooterDrawerItem
import net.accelf.yuito.QuickTootViewModel
import net.accelf.yuito.streaming.StreamingManager
import org.junit.Assert.assertEquals