diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/StatusDataRepository.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/StatusDataRepository.kt index 0e5b28f..5138193 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/StatusDataRepository.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/StatusDataRepository.kt @@ -16,8 +16,8 @@ class StatusDataRepository private val statusDataStoreFactory: StatusDataStoreFactory ): StatusRepository { - override fun post(text: String, warning: String?, sensitive: Boolean?, mediaId: String?): Single = - statusDataStoreFactory.create().post(text, warning, sensitive, mediaId) + override fun post(text: String, warning: String?, inReplyToId: Int?, sensitive: Boolean?, visibility: String?, mediaId: String?): Single = + statusDataStoreFactory.create().post(text, warning, inReplyToId, sensitive, visibility, mediaId) override fun post(statusForm: StatusForm): Single = statusDataStoreFactory.create().post(statusForm) diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/ApiStatusDataStore.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/ApiStatusDataStore.kt index ceae709..aaf1dc9 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/ApiStatusDataStore.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/ApiStatusDataStore.kt @@ -18,7 +18,7 @@ class ApiStatusDataStore( private val statusService: StatusService ) : StatusDataStore { - override fun post(text: String, warning: String?, sensitive: Boolean?, mediaId: String?): Single { + override fun post(text: String, warning: String?, inReplyToId: Int?, sensitive: Boolean?, visibility: String?, mediaId: String?): Single { val mediaIds: List? = if (mediaId != null) { listOf(mediaId) @@ -29,7 +29,9 @@ class ApiStatusDataStore( return statusService.post( text = text, warning = warning, + inReplyToId = inReplyToId, sensitive = sensitive, + visibility = visibility, mediaIds = mediaIds ) } @@ -45,8 +47,9 @@ class ApiStatusDataStore( return statusService.post( text = statusForm.status, warning = statusForm.spoilerText, - inReplyTo = statusForm.inReplyToId, + inReplyToId = statusForm.inReplyToId, sensitive = statusForm.sensitive, + visibility = statusForm.visibility, mediaIds = mediaIds ) } diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusDataStore.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusDataStore.kt index ecab605..6b48d56 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusDataStore.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusDataStore.kt @@ -11,7 +11,9 @@ interface StatusDataStore { fun post( text: String, warning: String? = null, + inReplyToId: Int? = null, sensitive: Boolean? = null, + visibility: String? = null, mediaId: String? = null ): Single diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusService.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusService.kt index 1a9ef5e..a05e004 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusService.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/repository/datasource/status/StatusService.kt @@ -16,9 +16,11 @@ interface StatusService { @Field("spoiler_text") warning: String? = null, @Field("in_reply_to_id") - inReplyTo: Int? = null, + inReplyToId: Int? = null, @Field("sensitive") sensitive: Boolean? = null, + @Field("visibility") + visibility: String? = null, @Field("media_ids[]") mediaIds: List? = null ): Single diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/type_adapter/StatusTypeAdapter.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/type_adapter/StatusTypeAdapter.kt index 9d194d0..7df599d 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/data/type_adapter/StatusTypeAdapter.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/data/type_adapter/StatusTypeAdapter.kt @@ -31,6 +31,7 @@ class StatusTypeAdapter : TypeAdapter() { var favourited: Boolean = false var mediaAttachments: List? = null var sensitive: Boolean = false + var visibility: String? = null var createdAt: Date? = null var url: String? = null @@ -57,6 +58,7 @@ class StatusTypeAdapter : TypeAdapter() { "reblogged" -> reblogged = input.nextBooleanExtra(false) "media_attachments" -> mediaAttachments = input.mediaList() "sensitive" -> sensitive = input.nextBooleanExtra(false) + "visibility" -> visibility = input.nextStringExtra() "created_at" -> createdAt = DateTime.parse(input.nextString()).toDate() "url" -> url = input.nextStringExtra() else -> input.skipValue() @@ -75,6 +77,7 @@ class StatusTypeAdapter : TypeAdapter() { favourited = favourited, mediaAttachments = mediaAttachments ?: listOf(), sensitive = sensitive, + visibility = visibility, createdAt = createdAt, url = url) } @@ -94,6 +97,7 @@ class StatusTypeAdapter : TypeAdapter() { var reblogged: Boolean = false var mediaAttachments: List? = null var sensitive: Boolean = false + var visibility: String? = null var createdAt: Date? = null var url: String? = null @@ -114,6 +118,7 @@ class StatusTypeAdapter : TypeAdapter() { "reblogged" -> reblogged = nextBooleanExtra(false) "media_attachments" -> mediaAttachments = mediaList() "sensitive" -> sensitive = nextBooleanExtra(false) + "visibility" -> visibility = nextStringExtra() "created_at" -> createdAt = DateTime.parse(nextStringExtra()).toDate() "url" -> url = nextStringExtra() else -> skipValue() @@ -131,6 +136,7 @@ class StatusTypeAdapter : TypeAdapter() { favourited = favourited, mediaAttachments = mediaAttachments ?: listOf(), sensitive = sensitive, + visibility = visibility, createdAt = createdAt, url = url) } diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/Status.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/Status.kt index 1bb84fa..5206a7f 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/Status.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/Status.kt @@ -17,6 +17,7 @@ data class Status( val favourited: Boolean, val mediaAttachments: List = listOf(), val sensitive: Boolean = false, + val visibility: String? = null, val createdAt: Date? = null, val url: String? ) { @@ -33,6 +34,7 @@ data class Status( reblogged = reblogged, favourited = favourited, sensitive = sensitive, + visibility = visibility, createdAt = createdAt, url = url ).also { realmStatus -> diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/realm/RealmStatus.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/realm/RealmStatus.kt index 6066a89..97eb8cc 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/realm/RealmStatus.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/entity/realm/RealmStatus.kt @@ -16,6 +16,7 @@ open class RealmStatus( open var favourited: Boolean = false, open var mediaAttachments: RealmList = RealmList(), open var sensitive: Boolean = false, + open var visibility: String? = null, open var createdAt: Date? = null, open var url: String? = null ): RealmObject() { @@ -30,6 +31,7 @@ open class RealmStatus( favourited = favourited, mediaAttachments = mediaAttachments.map { it.toMedia() }, sensitive = sensitive, + visibility = visibility, createdAt = createdAt, url = url ) diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/interactor/status/PostStatusUseCase.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/interactor/status/PostStatusUseCase.kt index 906272b..27eae4b 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/interactor/status/PostStatusUseCase.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/interactor/status/PostStatusUseCase.kt @@ -29,18 +29,20 @@ class PostStatusUseCase( private fun postParam(params: Array): Single { val text = params[0] as String val warning = params[1] as String - val sensitive = params[2] as Boolean - if (params.size > 3) { - val mediaId: Int? = params[3] as Int? + val inReplyToId = params[2] as Int + val sensitive = params[3] as Boolean + val visibility = params[4] as String + if (params.size > 5) { + val mediaId: Int? = params[5] as Int? val mediaIdString: String? = if (mediaId != null) { mediaId.toString() } else { null } - return statusRepository.post(text, warning, sensitive, mediaIdString) + return statusRepository.post(text, warning, inReplyToId, sensitive, visibility, mediaIdString) } else { - return statusRepository.post(text, warning, sensitive) + return statusRepository.post(text, warning, inReplyToId, sensitive, visibility) } } } \ No newline at end of file diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/repository/StatusRepository.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/repository/StatusRepository.kt index a7f3827..7054bb2 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/repository/StatusRepository.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/repository/StatusRepository.kt @@ -11,7 +11,9 @@ interface StatusRepository { fun post( text: String, warning: String? = null, + inReplyToId: Int? = null, sensitive: Boolean? = null, + visibility: String? = null, mediaId: String? = null ): Single diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/value_object/StatusForm.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/value_object/StatusForm.kt index 1dddf2a..b345c28 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/value_object/StatusForm.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/domain/value_object/StatusForm.kt @@ -5,7 +5,8 @@ data class StatusForm( val inReplyToId: Int? = null, val mediaIds: List = listOf(), val sensitive: Boolean = false, - val spoilerText: String? = null) { + val spoilerText: String? = null, + val visibility: String? = null) { fun debug(): String = "status: %s, spoilerText: %s, mediaId: %s".format(status, spoilerText, mediaIds.joinToString()) diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/adapter/timeline/TimelineItemViewHolder.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/adapter/timeline/TimelineItemViewHolder.kt index e4e945f..6069d33 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/adapter/timeline/TimelineItemViewHolder.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/adapter/timeline/TimelineItemViewHolder.kt @@ -181,12 +181,18 @@ class TimelineItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) } private fun initActions(status: Status) { + val visibility = status.visibility + reblogButton.background = - if (status.reblogged) { - ContextCompat.getDrawable(itemView.context, R.drawable.ic_reblog_reblog) - } else { - ContextCompat.getDrawable(itemView.context, R.drawable.ic_reblog_unreblog) - } + if (visibility == "direct") { + ContextCompat.getDrawable(itemView.context, R.drawable.ic_reblog_direct) + } else if (visibility == "private") { + ContextCompat.getDrawable(itemView.context, R.drawable.ic_reblog_private) + } else if (status.reblogged) { + ContextCompat.getDrawable(itemView.context, R.drawable.ic_reblog_reblog) + } else { + ContextCompat.getDrawable(itemView.context, R.drawable.ic_reblog_unreblog) + } favouriteButton.background = if (status.favourited) { diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/AccountFragment.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/AccountFragment.kt index 020d51f..be642b1 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/AccountFragment.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/AccountFragment.kt @@ -117,17 +117,19 @@ class AccountFragment : RxFragment() { } adapter.onClickReblog.subscribe { status -> val target = status.reblog ?: status - presenter.reblog(target) - .compose(bindToLifecycle()) - .subscribe { status, error -> - if (error != null) { - showError(error) - return@subscribe - } + if (target.visibility == "public" || target.visibility == "unlisted") { + presenter.reblog(target) + .compose(bindToLifecycle()) + .subscribe { status, error -> + if (error != null) { + showError(error) + return@subscribe + } - val updateTarget = status.reblog ?: status - adapter.update(updateTarget) - } + val updateTarget = status.reblog ?: status + adapter.update(updateTarget) + } + } } adapter.onClickFavourite.subscribe { status -> val target = status.reblog ?: status diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/KatsuFragment.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/KatsuFragment.kt index c1ecbca..451c247 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/KatsuFragment.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/KatsuFragment.kt @@ -9,10 +9,13 @@ import android.support.design.widget.Snackbar import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater +import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import android.widget.PopupMenu import android.widget.TextView +import android.widget.Toast import com.bl_lia.kirakiratter.App import com.bl_lia.kirakiratter.R import com.bl_lia.kirakiratter.domain.extension.preparedErrorMessage @@ -54,6 +57,8 @@ class KatsuFragment : RxFragment() { lateinit var presenter: KatsuPresenter val mediaUris = ArrayList() + val visibility = arrayOf("public", "unlisted", "private", "direct") + var vindex = 0 private val component: StatusComponent by lazy { DaggerStatusComponent.builder() @@ -73,6 +78,15 @@ class KatsuFragment : RxFragment() { override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + val visibilityListener = View.OnClickListener { it -> + when (it.id) { + R.id.visibility_menu -> { + showPopup(it) + } + } + } + visibility_menu.setOnClickListener(visibilityListener) + button_katsu.setOnClickListener { val header = content_warning_edittext.text.toString() val body = katsu_content_body.text.toString() @@ -91,7 +105,8 @@ class KatsuFragment : RxFragment() { warning = header, attachment = mediaUris, sensitive = nsfw, - inReplyToId = replyTo) + inReplyToId = replyTo, + visibility = visibility[vindex]) .compose(bindToLifecycle()) .subscribe { status, error -> button_katsu.isEnabled = true @@ -193,6 +208,40 @@ class KatsuFragment : RxFragment() { } } + private fun showPopup(view: View) { + var popup: PopupMenu? + popup = PopupMenu(this.context, view) + popup.inflate(R.menu.menu_visibility) + + popup.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener { item: MenuItem? -> + when (item!!.itemId) { + R.id.menu_public -> { + visibility_menu.setBackgroundResource(R.drawable.ic_public_black_24dp) + Toast.makeText(this.context, item.title, Toast.LENGTH_SHORT).show() + vindex = 0 + } + R.id.menu_unlisted -> { + visibility_menu.setBackgroundResource(R.drawable.ic_lock_open_black_24dp) + Toast.makeText(this.context, item.title, Toast.LENGTH_SHORT).show() + vindex = 1 + } + R.id.menu_private -> { + visibility_menu.setBackgroundResource(R.drawable.ic_lock_outline_black_24dp) + Toast.makeText(this.context, item.title, Toast.LENGTH_SHORT).show() + vindex = 2 + } + R.id.menu_direct -> { + visibility_menu.setBackgroundResource(R.drawable.ic_email_black_24dp) + Toast.makeText(this.context, item.title, Toast.LENGTH_SHORT).show() + vindex = 3 + } + } + true + }) + + popup.show() + } + private fun setHint() { val hintHeader = content_warning_textinput.hint content_warning_textinput.hint = null diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/TimelineFragment.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/TimelineFragment.kt index 87e3c67..f8f4466 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/TimelineFragment.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/fragment/TimelineFragment.kt @@ -121,17 +121,19 @@ class TimelineFragment : RxFragment(), ScrollableFragment { startActivity(intent) } adapter.onClickReblog.subscribe { status -> - presenter.reblog(status) - .subscribe { status, error -> - if (error != null) { - showError(error) - return@subscribe - } + if (status.visibility == "public" || status.visibility == "unlisted") { + presenter.reblog(status) + .subscribe { status, error -> + if (error != null) { + showError(error) + return@subscribe + } - status.reblog?.let { - adapter.update(it) + status.reblog?.let { + adapter.update(it) + } } - } + } } adapter.onClickFavourite.subscribe { status -> presenter.favourite(status) diff --git a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/presenter/KatsuPresenter.kt b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/presenter/KatsuPresenter.kt index 6f19179..9d26cd0 100644 --- a/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/presenter/KatsuPresenter.kt +++ b/app/src/main/kotlin/com/bl_lia/kirakiratter/presentation/presenter/KatsuPresenter.kt @@ -35,7 +35,7 @@ class KatsuPresenter TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - fun post(text: String, warning: String? = null, inReplyToId: Int? = null, sensitive: Boolean = false, attachment: List = listOf()): Single { + fun post(text: String, warning: String? = null, inReplyToId: Int? = null, sensitive: Boolean = false,visibility: String? = null, attachment: List = listOf()): Single { if (attachment.isNotEmpty()) { return Single.concat(attachment.map { uploadMedia.execute(it) }) @@ -46,6 +46,7 @@ class KatsuPresenter spoilerText = warning, inReplyToId = inReplyToId, sensitive = sensitive, + visibility = visibility, mediaIds = medias.map { it.id } )) } @@ -53,7 +54,9 @@ class KatsuPresenter return postStatus.execute(StatusForm( status = text, spoilerText = warning, - inReplyToId = inReplyToId + inReplyToId = inReplyToId, + sensitive = sensitive, + visibility = visibility )) } } diff --git a/app/src/main/res/drawable/ic_email_black_24dp.xml b/app/src/main/res/drawable/ic_email_black_24dp.xml new file mode 100644 index 0000000..ce97ab8 --- /dev/null +++ b/app/src/main/res/drawable/ic_email_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock_open_black_24dp.xml b/app/src/main/res/drawable/ic_lock_open_black_24dp.xml new file mode 100644 index 0000000..c812598 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock_open_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock_outline_black_24dp.xml b/app/src/main/res/drawable/ic_lock_outline_black_24dp.xml new file mode 100644 index 0000000..9a14b68 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock_outline_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_public_black_24dp.xml b/app/src/main/res/drawable/ic_public_black_24dp.xml new file mode 100644 index 0000000..d976b42 --- /dev/null +++ b/app/src/main/res/drawable/ic_public_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_reblog_direct.xml b/app/src/main/res/drawable/ic_reblog_direct.xml new file mode 100644 index 0000000..d1c6dfd --- /dev/null +++ b/app/src/main/res/drawable/ic_reblog_direct.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_reblog_private.xml b/app/src/main/res/drawable/ic_reblog_private.xml new file mode 100644 index 0000000..e5575e1 --- /dev/null +++ b/app/src/main/res/drawable/ic_reblog_private.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_katsu.xml b/app/src/main/res/layout/fragment_katsu.xml index adc9d41..67e69cf 100644 --- a/app/src/main/res/layout/fragment_katsu.xml +++ b/app/src/main/res/layout/fragment_katsu.xml @@ -93,12 +93,22 @@ + +