diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerFragment.kt new file mode 100644 index 0000000000..3a40e94324 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerFragment.kt @@ -0,0 +1,77 @@ +package org.thoughtcrime.securesms.badges.self.none + +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.viewModels +import org.signal.core.util.DimensionUnit +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.badges.models.BadgePreview +import org.thoughtcrime.securesms.components.settings.DSLConfiguration +import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter +import org.thoughtcrime.securesms.components.settings.DSLSettingsBottomSheetFragment +import org.thoughtcrime.securesms.components.settings.DSLSettingsText +import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity +import org.thoughtcrime.securesms.components.settings.app.subscription.SubscriptionsRepository +import org.thoughtcrime.securesms.components.settings.configure +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies +import org.thoughtcrime.securesms.util.BottomSheetUtil + +class BecomeASustainerFragment : DSLSettingsBottomSheetFragment() { + + private val viewModel: BecomeASustainerViewModel by viewModels( + factoryProducer = { + BecomeASustainerViewModel.Factory(SubscriptionsRepository(ApplicationDependencies.getDonationsService())) + } + ) + + override fun bindAdapter(adapter: DSLSettingsAdapter) { + BadgePreview.register(adapter) + + viewModel.state.observe(viewLifecycleOwner) { + adapter.submitList(getConfiguration(it).toMappingModelList()) + } + } + + private fun getConfiguration(state: BecomeASustainerState): DSLConfiguration { + return configure { + customPref(BadgePreview.Model(badge = state.badge)) + + sectionHeaderPref( + title = DSLSettingsText.from( + R.string.BecomeASustainerFragment__get_badges, + DSLSettingsText.CenterModifier, + DSLSettingsText.Title2BoldModifier + ) + ) + + space(DimensionUnit.DP.toPixels(8f).toInt()) + + noPadTextPref( + title = DSLSettingsText.from( + R.string.BecomeASustainerFragment__signal_is_a_non_profit, + DSLSettingsText.CenterModifier + ) + ) + + space(DimensionUnit.DP.toPixels(77f).toInt()) + + primaryButton( + text = DSLSettingsText.from( + R.string.BecomeASustainerMegaphone__become_a_sustainer + ), + onClick = { + requireActivity().finish() + requireActivity().startActivity(AppSettingsActivity.subscriptions(requireContext())) + } + ) + + space(DimensionUnit.DP.toPixels(8f).toInt()) + } + } + + companion object { + @JvmStatic + fun show(fragmentManager: FragmentManager) { + BecomeASustainerFragment().show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerState.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerState.kt new file mode 100644 index 0000000000..3c40f4de05 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerState.kt @@ -0,0 +1,7 @@ +package org.thoughtcrime.securesms.badges.self.none + +import org.thoughtcrime.securesms.badges.models.Badge + +data class BecomeASustainerState( + val badge: Badge? = null +) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerViewModel.kt new file mode 100644 index 0000000000..27d5a19f06 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/self/none/BecomeASustainerViewModel.kt @@ -0,0 +1,45 @@ +package org.thoughtcrime.securesms.badges.self.none + +import androidx.lifecycle.LiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.kotlin.subscribeBy +import org.signal.core.util.logging.Log +import org.thoughtcrime.securesms.components.settings.app.subscription.SubscriptionsRepository +import org.thoughtcrime.securesms.util.livedata.Store + +class BecomeASustainerViewModel(subscriptionsRepository: SubscriptionsRepository) : ViewModel() { + + private val store = Store(BecomeASustainerState()) + + val state: LiveData = store.stateLiveData + + private val disposables = CompositeDisposable() + + init { + disposables += subscriptionsRepository.getSubscriptions().subscribeBy( + onError = { Log.w(TAG, "Could not load subscriptions.") }, + onSuccess = { subscriptions -> + store.update { + it.copy(badge = subscriptions.firstOrNull()?.badge) + } + } + ) + } + + override fun onCleared() { + disposables.clear() + } + + companion object { + private val TAG = Log.tag(BecomeASustainerViewModel::class.java) + } + + class Factory(private val subscriptionsRepository: SubscriptionsRepository) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return modelClass.cast(BecomeASustainerViewModel(subscriptionsRepository))!! + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java index 3e711964d8..826c6b0b0e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/ManageProfileFragment.java @@ -29,10 +29,12 @@ import org.thoughtcrime.securesms.avatar.Avatars; import org.thoughtcrime.securesms.avatar.picker.AvatarPickerFragment; import org.thoughtcrime.securesms.badges.BadgeImageView; import org.thoughtcrime.securesms.badges.models.Badge; +import org.thoughtcrime.securesms.badges.self.none.BecomeASustainerFragment; import org.thoughtcrime.securesms.components.emoji.EmojiUtil; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.profiles.manage.ManageProfileViewModel.AvatarState; +import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.NameUtil; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; @@ -118,7 +120,11 @@ public class ManageProfileFragment extends LoggingFragment { if (FeatureFlags.donorBadges()) { badgesContainer.setOnClickListener(v -> { - Navigation.findNavController(v).navigate(ManageProfileFragmentDirections.actionManageProfileFragmentToBadgeManageFragment()); + if (Recipient.self().getBadges().isEmpty()) { + BecomeASustainerFragment.show(getParentFragmentManager()); + } else { + Navigation.findNavController(v).navigate(ManageProfileFragmentDirections.actionManageProfileFragmentToBadgeManageFragment()); + } }); } else { badgesContainer.setVisibility(View.GONE); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0730929e9..e11617b7d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3971,6 +3971,9 @@ Done When you have more than one badge, you can choose one to feature for others to see on your profile. + Get badges for your profile by supporting Signal. + Signal is a nonprofit with no advertisers or investors, supported only by people like you. + My support Manage subscription Badges