Skip to content

Commit

Permalink
Username UX refresh.
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-signal authored and cody-signal committed Aug 18, 2022
1 parent 3252871 commit 28310a8
Show file tree
Hide file tree
Showing 24 changed files with 1,232 additions and 567 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.thoughtcrime.securesms.profiles.edit.pnp

import androidx.fragment.app.viewModels
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter
import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.util.FeatureFlags
import org.thoughtcrime.securesms.util.LifecycleDisposable

/**
* Allows the user to select who can see their phone number during registration.
*/
class WhoCanSeeMyPhoneNumberFragment : DSLSettingsFragment(titleId = R.string.WhoCanSeeMyPhoneNumberFragment__who_can_find_me_by_number) {

private val viewModel: WhoCanSeeMyPhoneNumberViewModel by viewModels()
private val lifecycleDisposable = LifecycleDisposable()

override fun bindAdapter(adapter: DSLSettingsAdapter) {
require(FeatureFlags.phoneNumberPrivacy())

lifecycleDisposable += viewModel.state.subscribe {
adapter.submitList(getConfiguration(it).toMappingModelList())
}
}

private fun getConfiguration(state: WhoCanSeeMyPhoneNumberState): DSLConfiguration {
return configure {
radioPref(
title = DSLSettingsText.from(R.string.PhoneNumberPrivacy_everyone),
summary = DSLSettingsText.from(R.string.WhoCanSeeMyPhoneNumberFragment__anyone_who_has),
isChecked = state == WhoCanSeeMyPhoneNumberState.EVERYONE,
onClick = { viewModel.onEveryoneCanSeeMyPhoneNumberSelected() }
)

radioPref(
title = DSLSettingsText.from(R.string.PhoneNumberPrivacy_nobody),
summary = DSLSettingsText.from(R.string.WhoCanSeeMyPhoneNumberFragment__nobody_on_signal),
isChecked = state == WhoCanSeeMyPhoneNumberState.NOBODY,
onClick = { viewModel.onNobodyCanSeeMyPhoneNumberSelected() }
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.thoughtcrime.securesms.profiles.edit.pnp

enum class WhoCanSeeMyPhoneNumberState {
EVERYONE,
NOBODY
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.thoughtcrime.securesms.profiles.edit.pnp

import androidx.lifecycle.ViewModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.disposables.CompositeDisposable
import org.thoughtcrime.securesms.util.rx.RxStore

class WhoCanSeeMyPhoneNumberViewModel : ViewModel() {

private val store = RxStore(WhoCanSeeMyPhoneNumberState.EVERYONE)
private val disposables = CompositeDisposable()

val state: Flowable<WhoCanSeeMyPhoneNumberState> = store.stateFlowable.subscribeOn(AndroidSchedulers.mainThread())

fun onEveryoneCanSeeMyPhoneNumberSelected() {
store.update { WhoCanSeeMyPhoneNumberState.EVERYONE }
}

fun onNobodyCanSeeMyPhoneNumberSelected() {
store.update { WhoCanSeeMyPhoneNumberState.NOBODY }
}

override fun onCleared() {
disposables.clear()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.thoughtcrime.securesms.profiles.manage

import org.thoughtcrime.securesms.databinding.CopyButtonBinding
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

/**
* Outlined button that allows the user to copy a piece of data.
*/
object CopyButton {
fun register(mappingAdapter: MappingAdapter) {
mappingAdapter.registerFactory(Model::class.java, BindingFactory(::ViewHolder, CopyButtonBinding::inflate))
}

class Model(
val text: CharSequence,
val onClick: (Model) -> Unit
) : MappingModel<Model> {
override fun areItemsTheSame(newItem: Model): Boolean = true

override fun areContentsTheSame(newItem: Model): Boolean = text == newItem.text
}

private class ViewHolder(binding: CopyButtonBinding) : BindingViewHolder<Model, CopyButtonBinding>(binding) {
override fun bind(model: Model) {
binding.root.text = model.text
binding.root.setOnClickListener { model.onClick(model) }
}
}
}

0 comments on commit 28310a8

Please sign in to comment.