From 43caec69e38f12439eae1b5de4c7eaec9121130d Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 13 Oct 2022 09:57:40 -0300 Subject: [PATCH] Update new story button. --- .../thoughtcrime/securesms/stories/Stories.kt | 2 +- .../stories/settings/story/NewStoryItem.kt | 29 +++++++++++++++++++ .../story/StoriesPrivacySettingsFragment.kt | 17 +++++++---- .../story/StoriesPrivacySettingsViewModel.kt | 10 +------ app/src/main/res/layout/new_story_item.xml | 29 +++++++++++++++++++ app/src/main/res/values/strings.xml | 7 ++++- 6 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/NewStoryItem.kt create mode 100644 app/src/main/res/layout/new_story_item.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt index 3146334b82..e5dbbd406d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/Stories.kt @@ -96,7 +96,7 @@ object Stories { fun getHeaderAction(onClick: () -> Unit): HeaderAction { return HeaderAction( - R.string.ContactsCursorLoader_new_story, + R.string.ContactsCursorLoader_add_to, R.drawable.ic_plus_12, onClick ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/NewStoryItem.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/NewStoryItem.kt new file mode 100644 index 0000000000..39dbd6df64 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/NewStoryItem.kt @@ -0,0 +1,29 @@ +package org.thoughtcrime.securesms.stories.settings.story + +import org.thoughtcrime.securesms.databinding.NewStoryItemBinding +import org.thoughtcrime.securesms.util.adapter.mapping.BindingFactory +import org.thoughtcrime.securesms.util.adapter.mapping.BindingViewHolder +import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter +import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel + +/** + * Entry point for new story creation. + */ +object NewStoryItem { + fun register(mappingAdapter: MappingAdapter) { + mappingAdapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, NewStoryItemBinding::inflate)) + } + + class Model(val onClick: () -> Unit) : MappingModel { + override fun areItemsTheSame(newItem: Model) = true + override fun areContentsTheSame(newItem: Model) = true + } + + private class ViewHolder(binding: NewStoryItemBinding) : BindingViewHolder(binding) { + override fun bind(model: Model) { + binding.root.setOnClickListener { + model.onClick() + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt index 388793e2a4..1b9d3ca2fe 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsFragment.kt @@ -69,7 +69,8 @@ class StoriesPrivacySettingsFragment : } } ) - ContactSearchItems.registerHeaders(middle) + + NewStoryItem.register(top as MappingAdapter) middle.setPagingController(viewModel.pagingController) @@ -82,10 +83,6 @@ class StoriesPrivacySettingsFragment : viewModel.pagingController.onDataInvalidated() } - lifecycleDisposable += viewModel.headerActionRequests.subscribe { - ChooseStoryTypeBottomSheet().show(childFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) - } - lifecycleDisposable += viewModel.state.subscribe { state -> if (state.isUpdatingEnabledState) { progressDisplayManager.show(viewLifecycleOwner, childFragmentManager) @@ -93,7 +90,7 @@ class StoriesPrivacySettingsFragment : progressDisplayManager.hide() } - (top as MappingAdapter).submitList(getTopConfiguration(state).toMappingModelList()) + top.submitList(getTopConfiguration(state).toMappingModelList()) middle.submitList(getMiddleConfiguration(state).toMappingModelList()) (bottom as MappingAdapter).submitList(getBottomConfiguration(state).toMappingModelList()) } @@ -113,6 +110,14 @@ class StoriesPrivacySettingsFragment : ) space(20.dp) + + sectionHeaderPref(R.string.StoriesPrivacySettingsFragment__stories) + + customPref( + NewStoryItem.Model { + ChooseStoryTypeBottomSheet().show(childFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + ) } else { clickPref( title = DSLSettingsText.from(R.string.StoriesPrivacySettingsFragment__turn_on_stories), diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt index be46426b1b..f062e73e50 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/settings/story/StoriesPrivacySettingsViewModel.kt @@ -4,10 +4,8 @@ import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable -import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign -import io.reactivex.rxjava3.subjects.PublishSubject import org.signal.paging.PagedData import org.signal.paging.PagingConfig import org.signal.paging.ProxyPagingController @@ -17,7 +15,6 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchPagedDataSource import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.rx.RxStore -import java.util.concurrent.TimeUnit class StoriesPrivacySettingsViewModel : ViewModel() { @@ -36,21 +33,16 @@ class StoriesPrivacySettingsViewModel : ViewModel() { .build() private val disposables = CompositeDisposable() - private val headerActionRequestSubject = PublishSubject.create() val state: Flowable = store.stateFlowable.observeOn(AndroidSchedulers.mainThread()) val userHasActiveStories: Boolean get() = store.state.userHasStories val pagingController = ProxyPagingController() - val headerActionRequests: Observable = headerActionRequestSubject.debounce(100, TimeUnit.MILLISECONDS) init { val configuration = ContactSearchConfiguration.build { addSection( ContactSearchConfiguration.Section.Stories( - includeHeader = true, - headerAction = Stories.getHeaderAction { - headerActionRequestSubject.onNext(Unit) - } + includeHeader = false, ) ) } diff --git a/app/src/main/res/layout/new_story_item.xml b/app/src/main/res/layout/new_story_item.xml new file mode 100644 index 0000000000..cc53f40c56 --- /dev/null +++ b/app/src/main/res/layout/new_story_item.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0467e432b3..60e055b58c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -220,7 +220,7 @@ My Stories - New story + Add to… Message %s @@ -5269,6 +5269,11 @@ You will no longer be able to share or view stories. Story updates you have recently shared will also be deleted. Story privacy + + Stories + + + New story