From 99c1a3ec870096ad454d3c5f195779d2bd6b3057 Mon Sep 17 00:00:00 2001 From: Konrad Pozniak Date: Wed, 17 Jun 2020 14:48:18 +0200 Subject: [PATCH] improve composing statuses --- .../components/compose/ComposeActivity.kt | 39 +++- .../components/compose/ComposeImageAdapter.kt | 30 ++- .../components/compose/ComposeViewModel.kt | 41 +++-- .../pixelcat/components/main/MainActivity.kt | 2 - .../res/drawable/background_bottom_sheet.xml | 2 +- .../res/drawable/ic_plus_square_large.xml | 27 +++ app/src/main/res/layout/activity_compose.xml | 173 +++++++++--------- .../main/res/layout/item_compose_image.xml | 5 +- 8 files changed, 199 insertions(+), 120 deletions(-) create mode 100644 app/src/main/res/drawable/ic_plus_square_large.xml diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeActivity.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeActivity.kt index 3b0fca1..03ab5ea 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeActivity.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeActivity.kt @@ -4,21 +4,24 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle -import android.util.Log import androidx.activity.viewModels import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.lifecycle.Observer +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import at.connyduck.pixelcat.R import at.connyduck.pixelcat.components.general.BaseActivity import at.connyduck.pixelcat.dagger.ViewModelFactory import at.connyduck.pixelcat.databinding.ActivityComposeBinding import at.connyduck.pixelcat.util.viewBinding +import com.fxn.pix.Options import com.fxn.pix.Pix +import com.fxn.utility.ImageQuality import com.google.android.material.bottomsheet.BottomSheetBehavior +import kotlinx.coroutines.launch import javax.inject.Inject -class ComposeActivity : BaseActivity() { +class ComposeActivity : BaseActivity(), OnImageActionClickListener { @Inject lateinit var viewModelFactory: ViewModelFactory @@ -27,7 +30,7 @@ class ComposeActivity : BaseActivity() { private val binding by viewBinding(ActivityComposeBinding::inflate) - private val adapter = ComposeImageAdapter() + private val adapter = ComposeImageAdapter(this) private lateinit var visibilityBottomSheet: BottomSheetBehavior<*> @@ -44,20 +47,28 @@ class ComposeActivity : BaseActivity() { insets.consumeSystemWindowInsets() } - if (viewModel.images.value.isNullOrEmpty()) { + if (viewModel.imageLiveData.value.isNullOrEmpty()) { viewModel.addImage(intent.getStringExtra(EXTRA_MEDIA_URI)!!) } - setSupportActionBar(binding.composeToolBar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) + binding.composeToolBar.setNavigationOnClickListener { + onBackPressed() + } binding.composeImages.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) binding.composeImages.adapter = adapter visibilityBottomSheet = BottomSheetBehavior.from(binding.composeVisibilityBottomSheet) + visibilityBottomSheet.state = BottomSheetBehavior.STATE_HIDDEN binding.composeShareButton.setOnClickListener { - viewModel.sendStatus() + lifecycleScope.launch { + viewModel.sendStatus( + caption = binding.composeCaptionInput.text?.toString().orEmpty(), + sensitive = binding.composeNsfwSwitch.isChecked + ) + finish() + } } binding.composeVisibilityButton.setOnClickListener { @@ -73,7 +84,7 @@ class ComposeActivity : BaseActivity() { changeVisibility(VISIBILITY.FOLLOWERS_ONLY) } - viewModel.images.observe( + viewModel.imageLiveData.observe( this, Observer { adapter.submitList(it) @@ -99,14 +110,22 @@ class ComposeActivity : BaseActivity() { if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_PICK_MEDIA) { val returnValue = data?.getStringArrayListExtra(Pix.IMAGE_RESULTS) - Log.e("Result", returnValue.toString()) viewModel.addImage(returnValue?.first()!!) } } private fun changeVisibility(visibility: VISIBILITY) { viewModel.setVisibility(visibility) - visibilityBottomSheet.state = BottomSheetBehavior.STATE_COLLAPSED + visibilityBottomSheet.state = BottomSheetBehavior.STATE_HIDDEN + } + + override fun onAddImage() { + val options = Options.init() + .setRequestCode(REQUEST_CODE_PICK_MEDIA) + .setImageQuality(ImageQuality.HIGH) + .setScreenOrientation(Options.SCREEN_ORIENTATION_PORTRAIT) + + Pix.start(this, options) } companion object { diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeImageAdapter.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeImageAdapter.kt index 970976c..901962f 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeImageAdapter.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeImageAdapter.kt @@ -2,15 +2,23 @@ package at.connyduck.pixelcat.components.compose import android.view.LayoutInflater import android.view.ViewGroup +import androidx.core.view.setPadding import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import at.connyduck.pixelcat.R import at.connyduck.pixelcat.databinding.ItemComposeImageBinding +import at.connyduck.sparkbutton.helpers.Utils import coil.api.load import java.io.File -class ComposeImageAdapter : ListAdapter( +interface OnImageActionClickListener { + fun onAddImage() +} + +class ComposeImageAdapter( + private val listener: OnImageActionClickListener +) : ListAdapter( object : DiffUtil.ItemCallback() { override fun areItemsTheSame(old: String, new: String): Boolean { return old == new @@ -32,12 +40,26 @@ class ComposeImageAdapter : ListAdapter( getItem(position)?.let { uri -> - holder.binding.root.load(File(uri)) { - placeholder(R.drawable.ic_cat) - error(R.drawable.ic_message) + if (uri == ADD_ITEM) { + holder.binding.root.load(R.drawable.ic_plus_square_large) + holder.binding.root.setPadding(Utils.dpToPx(holder.binding.root.context, 40)) + holder.binding.root.setOnClickListener { + listener.onAddImage() + } + return + } else { + holder.binding.root.load(File(uri)) { + placeholder(R.drawable.ic_cat) + error(R.drawable.ic_message) + } + holder.binding.root.setOnClickListener {} } } } + + companion object { + const val ADD_ITEM = "add_item" + } } class ComposeImageViewHolder(val binding: ItemComposeImageBinding) : diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeViewModel.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeViewModel.kt index 9379d65..b66e7c5 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeViewModel.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/compose/ComposeViewModel.kt @@ -4,9 +4,8 @@ import android.content.Context import androidx.core.content.ContextCompat import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope +import at.connyduck.pixelcat.components.compose.ComposeImageAdapter.Companion.ADD_ITEM import at.connyduck.pixelcat.db.AccountManager -import kotlinx.coroutines.launch import javax.inject.Inject class ComposeViewModel @Inject constructor( @@ -14,33 +13,41 @@ class ComposeViewModel @Inject constructor( val accountManager: AccountManager ) : ViewModel() { - val images = MutableLiveData>() + private val images: MutableList = mutableListOf() + + val imageLiveData = MutableLiveData>() val visibility = MutableLiveData(VISIBILITY.PUBLIC) fun addImage(imageUri: String) { - - images.value = images.value.orEmpty() + imageUri + images.add(imageUri) + imageLiveData.value = if (images.size < MAX_IMAGE_COUNT) { + images + ADD_ITEM + } else { + images + } } fun setVisibility(visibility: VISIBILITY) { this.visibility.value = visibility } - fun sendStatus() { + suspend fun sendStatus(caption: String, sensitive: Boolean) { - viewModelScope.launch { - val statusToSend = StatusToSend( - accountId = accountManager.activeAccount()!!.id, - text = "test", - visibility = visibility.value!!.serverName, - sensitive = false, - mediaUris = images.value!! - ) + val statusToSend = StatusToSend( + accountId = accountManager.activeAccount()!!.id, + text = caption, + visibility = visibility.value!!.serverName, + sensitive = sensitive, + mediaUris = images + ) - val intent = SendStatusService.sendStatusIntent(context, statusToSend) - ContextCompat.startForegroundService(context, intent) - } + val intent = SendStatusService.sendStatusIntent(context, statusToSend) + ContextCompat.startForegroundService(context, intent) + } + + companion object { + private const val MAX_IMAGE_COUNT = 4 } } diff --git a/app/src/main/kotlin/at/connyduck/pixelcat/components/main/MainActivity.kt b/app/src/main/kotlin/at/connyduck/pixelcat/components/main/MainActivity.kt index a14edd4..5fca2fa 100644 --- a/app/src/main/kotlin/at/connyduck/pixelcat/components/main/MainActivity.kt +++ b/app/src/main/kotlin/at/connyduck/pixelcat/components/main/MainActivity.kt @@ -3,7 +3,6 @@ package at.connyduck.pixelcat.components.main import android.app.Activity import android.content.Intent import android.os.Bundle -import android.util.Log import android.widget.LinearLayout import androidx.activity.viewModels import at.connyduck.pixelcat.R @@ -93,7 +92,6 @@ class MainActivity : BaseActivity() { if (resultCode == Activity.RESULT_OK && requestCode == 100) { val returnValue = data?.getStringArrayListExtra(Pix.IMAGE_RESULTS) - Log.e("Result", returnValue.toString()) startActivity(ComposeActivity.newIntent(this, returnValue?.firstOrNull()!!)) } diff --git a/app/src/main/res/drawable/background_bottom_sheet.xml b/app/src/main/res/drawable/background_bottom_sheet.xml index 48f944b..da7ab6e 100644 --- a/app/src/main/res/drawable/background_bottom_sheet.xml +++ b/app/src/main/res/drawable/background_bottom_sheet.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_plus_square_large.xml b/app/src/main/res/drawable/ic_plus_square_large.xml new file mode 100644 index 0000000..71d17dc --- /dev/null +++ b/app/src/main/res/drawable/ic_plus_square_large.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/layout/activity_compose.xml b/app/src/main/res/layout/activity_compose.xml index 110cf0b..b707974 100644 --- a/app/src/main/res/layout/activity_compose.xml +++ b/app/src/main/res/layout/activity_compose.xml @@ -1,121 +1,128 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/pixelcat_gradient"> + android:id="@+id/composeAppBar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:layout_constraintTop_toTopOf="parent"> + android:id="@+id/composeToolBar" + style="@style/Widget.MaterialComponents.Toolbar.Surface" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:navigationIcon="@drawable/ic_arrow_back" + app:title="@string/compose_new_post">