diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt index 8d13fae..8d1bd04 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/TimelineFragment.kt @@ -80,7 +80,6 @@ class TimelineFragment : DaggerFragment(R.layout.fragment_timeline), TimeLineAct adapter.addLoadStateListener { if (it.refresh != LoadState.Loading) { binding.timelineSwipeRefresh.isRefreshing = false - } } } @@ -94,7 +93,7 @@ class TimelineFragment : DaggerFragment(R.layout.fragment_timeline), TimeLineAct } override fun onReply(status: StatusEntity) { - TODO("Not yet implemented") + startActivity(DetailActivity.newIntent(requireContext(), status.actionableId, reply = true)) } override fun onMediaVisibilityChanged(status: StatusEntity) { diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt index 2fe8221..498b651 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailActivity.kt @@ -6,7 +6,6 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.core.graphics.Insets import androidx.core.view.WindowInsetsCompat -import androidx.lifecycle.Observer import androidx.recyclerview.widget.ConcatAdapter import at.connyduck.pixelcat.R import at.connyduck.pixelcat.components.general.BaseActivity @@ -75,7 +74,7 @@ class DetailActivity : BaseActivity(), TimeLineActionListener { viewModel.currentStatus.observe( this, - Observer { + { when (it) { is Success -> { binding.detailSwipeRefresh.show() @@ -84,6 +83,12 @@ class DetailActivity : BaseActivity(), TimeLineActionListener { binding.detailSwipeRefresh.isRefreshing = false binding.detailRecyclerView.show() statusAdapter.submitList(listOf(it.data)) + it.data?.let { status -> + if (intent.getBooleanExtra(EXTRA_REPLY, false)) { + intent.removeExtra(EXTRA_REPLY) + onReply(status) + } + } } is Loading -> { binding.detailSwipeRefresh.hide() @@ -102,7 +107,7 @@ class DetailActivity : BaseActivity(), TimeLineActionListener { viewModel.replies.observe( this, - Observer { + { if (it is Success) { repliesAdapter.submitList(it.data) } @@ -122,6 +127,12 @@ class DetailActivity : BaseActivity(), TimeLineActionListener { val replyBottomsheet = BottomSheetBehavior.from(binding.detailReplyBottomSheet) replyBottomsheet.state = BottomSheetBehavior.STATE_EXPANDED binding.detailReply.requestFocus() + binding.detailReply.setText("@" + status.account.username + " ") + binding.detailReply.setSelection(binding.detailReply.text?.length ?: 0) + + binding.detailReplyLayout.setEndIconOnClickListener { + viewModel.onReply(status, binding.detailReply.text?.toString().orEmpty()) + } } override fun onMediaVisibilityChanged(status: StatusEntity) { @@ -134,10 +145,12 @@ class DetailActivity : BaseActivity(), TimeLineActionListener { companion object { private const val EXTRA_STATUS_ID = "STATUS_ID" + private const val EXTRA_REPLY = "REPLY" - fun newIntent(context: Context, statusId: String): Intent { + fun newIntent(context: Context, statusId: String, reply: Boolean = false): Intent { return Intent(context, DetailActivity::class.java).apply { putExtra(EXTRA_STATUS_ID, statusId) + putExtra(EXTRA_REPLY, reply) } } } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt index 91f7d5c..62b0879 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/timeline/detail/DetailViewModel.kt @@ -31,15 +31,18 @@ import at.connyduck.pixelcat.db.AccountManager import at.connyduck.pixelcat.db.AppDatabase import at.connyduck.pixelcat.db.entitity.StatusEntity import at.connyduck.pixelcat.db.entitity.toEntity +import at.connyduck.pixelcat.model.NewStatus import at.connyduck.pixelcat.network.FediverseApi import kotlinx.coroutines.launch +import java.util.Locale import javax.inject.Inject class DetailViewModel @Inject constructor( private val api: FediverseApi, private val db: AppDatabase, private val accountManager: AccountManager, - private val useCases: TimelineUseCases + private val useCases: TimelineUseCases, + private val fediverseApi: FediverseApi ) : ViewModel() { val currentStatus = MutableLiveData>() @@ -122,4 +125,19 @@ class DetailViewModel @Inject constructor( useCases.onMediaVisibilityChanged(status) } } + + fun onReply(statusToReply: StatusEntity, replyText: String) { + viewModelScope.launch { + + fediverseApi.reply( + NewStatus( + status = replyText, + inReplyToId = statusToReply.actionableId, + visibility = statusToReply.visibility.name.toLowerCase(Locale.ROOT), + sensitive = statusToReply.sensitive, + mediaIds = null + ) + ) + } + } } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/dagger/NetworkModule.kt b/app/src/main/kotlin/at/connyduck/pixelcat/dagger/NetworkModule.kt index 3d39a2f..3a12c3a 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/dagger/NetworkModule.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/dagger/NetworkModule.kt @@ -56,7 +56,7 @@ class NetworkModule { if (BuildConfig.DEBUG) { okHttpClientBuilder.addInterceptor( HttpLoggingInterceptor().apply { - level = HttpLoggingInterceptor.Level.BASIC + level = HttpLoggingInterceptor.Level.BODY } ) } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/network/FediverseApi.kt b/app/src/main/kotlin/at/connyduck/pixelcat/network/FediverseApi.kt index 4124327..a7c64ba 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/network/FediverseApi.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/network/FediverseApi.kt @@ -165,6 +165,11 @@ interface FediverseApi { @Body status: NewStatus ): NetworkResponse + @POST("api/v1/statuses") + suspend fun reply( + @Body status: NewStatus + ): NetworkResponse + @POST("api/v1/statuses/{id}/favourite") suspend fun favouriteStatus( @Path("id") statusId: String diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 10500f9..77eab44 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -77,6 +77,7 @@ app:layout_constraintTop_toTopOf="parent" />