diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5eb54cfdfb..14a9307fb1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,6 +40,7 @@ + - \ No newline at end of file + diff --git a/app/src/main/assets/json/server-config.json b/app/src/main/assets/json/server-config.json index b7e6d2c626..faf77ad3f2 100644 --- a/app/src/main/assets/json/server-config.json +++ b/app/src/main/assets/json/server-config.json @@ -4,6 +4,7 @@ "A_weekly_roundup_of_the_best_and_brightest": "A weekly roundup of the best and brightest projects on Kickstarter, handpicked by our team.", "About_reward_amount": "About %{reward_amount}", "Account": "Account", + "Add": "Add", "Add_attachments": "Add attachments…", "All_Projects": "All Projects", "All_category_name_Projects": "All %{category_name} Projects", @@ -220,6 +221,7 @@ "If_your_profile_is_public": "If your profile is not private, others can also see the projects you've backed, your location, bio and websites.", "Individual_Emails": "Individual emails", "Info": "Info", + "Introduce_yourself": "Introduce yourself", "It_may_take_up_to_24_hours_to_collect_your_data": "It may take up to 24 hours to collect your data. When it’s ready, we’ll send instructions to download your data to the email associated with this account. If you don’t hear from us, come back here to try again.", "Its_a_way_to_bring_creative_projects_to_life": "It’s a way to bring creative projects to life.", "Its_better_with_friends": "It’s better\nwith friends.", @@ -515,6 +517,7 @@ "We_were_unable_to_load_the_shipping_destinations": "We were unable to load the shipping destinations.\nPlease try again later.", "When_following_is_on_you_can_follow_the_acticity_of_others": "When following is on, you can follow the activity of others and others can follow your activity. Turn following off to permanently delete this data.", "When_you_save_a_project_we_ll_send_you_a_reminder": "When you save a project we’ll send you a reminder 48 hours before it ends", + "Write_a_bio": "Write a short bio. Just a sentence or two is great.", "Yes_turn_off": "Yes, turn off", "You_backed_this_project": "You backed this project.", "You_Launched": "You Launched!", @@ -524,6 +527,7 @@ "Youre_about_to_create_a_new_Kickstarter_account": "You're about to create a new Kickstarter account with the email address you use for Facebook. Please confirm that it’s correct before proceeding.", "Your_chat_message_wasnt_sent_successfully": "Your chat message wasn't sent successfully.", "Your_friends_havent_backed_any_projects_yet": "Your friends haven’t backed any projects yet, but once they do, you’ll see them listed here.", + "Your_name_displayed": "Your name is always displayed on your profile.", "Your_payment_method_was_successfully_charged": "Your payment method was successfully charged.", "Your_pledge": "Your pledge", "Your_pledge_amount": "Your pledge amount:", @@ -2052,6 +2056,7 @@ "A_weekly_roundup_of_the_best_and_brightest": "Eine wöchentliche Zusammenfassung der besten und cleversten Projekte auf Kickstarter, handverlesen von unserem Team.", "About_reward_amount": "Ungefähr %{reward_amount}", "Account": "Konto", + "Add": "Add", "Add_attachments": "Anhänge hinzufügen ...", "All_Projects": "Alle Projekte", "All_category_name_Projects": "Alle Projekte der Kategorie %{category_name}", @@ -2268,6 +2273,7 @@ "If_your_profile_is_public": "Wenn dein Profil nicht privat ist, sind außerdem die Projekte, die du unterstützt hast, dein Standort, deine Biografie und deine Websites für Andere sichtbar.", "Individual_Emails": "Individuelle E-Mails", "Info": "Info", + "Introduce_yourself": "Introduce yourself", "It_may_take_up_to_24_hours_to_collect_your_data": "Die Zusammenstellung deiner Daten kann bis zu 24 Stunden dauern. Sobald sie zum Download bereitstehen, werden wir dir eine Anleitung dazu per E-Mail schicken. Solltest du nichts von uns hören, versuche es von hier aus noch einmal.", "Its_a_way_to_bring_creative_projects_to_life": "Es ist eine Plattform, um kreative Projekte ins Leben zu rufen.", "Its_better_with_friends": "Gemeinsam mehr erreichen", @@ -2563,6 +2569,7 @@ "We_were_unable_to_load_the_shipping_destinations": "Das Laden der Versandadressen war leider nicht möglich.\nBitte versuche es später noch einmal.", "When_following_is_on_you_can_follow_the_acticity_of_others": "Wenn die Funktion Folgen gewählt wurde, kannst du die Aktivitäten von anderen einsehen und diese sehen deine Aktivitäten. Wenn die Funktion abgewählt wurde, werden diese Daten endgültig gelöscht.", "When_you_save_a_project_we_ll_send_you_a_reminder": "Wenn du ein Projekt speicherst, senden wir dir 48 Stunden vor Ablauf eine Erinnerungs-E-Mail", + "Write_a_bio": "Write a short bio. Just a sentence or two is great.", "Yes_turn_off": "Ja, deaktivieren", "You_backed_this_project": "Du hast dieses Projekt unterstützt.", "You_Launched": "Dein Projekt ist live!", @@ -2572,6 +2579,7 @@ "Youre_about_to_create_a_new_Kickstarter_account": "Du wirst hiermit ein neues Kickstarter-Konto mit deiner Facebook-E-Mail-Adresse anlegen. Bitte bestätige diesen Vorgang.", "Your_chat_message_wasnt_sent_successfully": "Deine Chat-Nachricht konnte leider nicht gesendet werden.", "Your_friends_havent_backed_any_projects_yet": "Deine Freunde haben bisher noch kein Projekt unterstützt. Aber sobald sie das tun, wird es hier angezeigt.", + "Your_name_displayed": "Your name is always displayed on your profile.", "Your_payment_method_was_successfully_charged": "Deine Zahlungsmethode wurde erfolgreich belastet.", "Your_pledge": "Dein Beitrag", "Your_pledge_amount": "Dein Beitrag:", @@ -4100,6 +4108,7 @@ "A_weekly_roundup_of_the_best_and_brightest": "Un resumen semanal de los mejores y más brillantes proyectos de Kickstarter, seleccionados por nuestro equipo.", "About_reward_amount": "Aprox. %{reward_amount}", "Account": "Cuenta", + "Add": "Add", "Add_attachments": "Agregar anexos …", "All_Projects": "Todos los proyectos", "All_category_name_Projects": "Todos los proyectos de la categoría %{category_name}", @@ -4167,7 +4176,7 @@ "many": "%{comments_count} commentarios" }, "Complete_payment": "Completar pago", - "Confirm_password": "Confirm new password", + "Confirm_password": "Confirmar nueva contraseña", "Connect_with_Facebook_to_follow_friends_and_get_notified": "Si te conectas via Facebook puedes seguir a tus amigos y te avisaremos cada vez que publican o patrocinan un proyecto.", "Contact_creator": "Comunicarse con el creador", "Continue_to_payment": "Continuar a pago", @@ -4316,6 +4325,7 @@ "If_your_profile_is_public": "Si tu perfil no es privado, otros usuarios también podrán ver los proyectos que has patrocinado, tu ubicación, biografía y sitios web.", "Individual_Emails": "Notificaciones por correo electrónico individuales", "Info": "Información", + "Introduce_yourself": "Introduce yourself", "It_may_take_up_to_24_hours_to_collect_your_data": "Puede demorar hasta 24 horas recopilar tus datos. Cuando estén listos, te enviaremos instrucciones para descargar tus datos al correo electrónico asociado con esta cuenta. Si no recibes noticias nuestras, vuelve aquí e inténtalo de nuevo.", "Its_a_way_to_bring_creative_projects_to_life": "Es una plataforma para dar vida a proyectos creativos.", "Its_better_with_friends": "Todo en la vida es mejor con amigos ...", @@ -4371,7 +4381,7 @@ "Newsletters": "Boletines informativos", "News_events": "Unas cuantas veces al año: Noticias sobresalientes y eventos cerca de ti.", "Never": "Nunca", - "New_password": "New password", + "New_password": "Contraseña nueva", "New_pledge_activity": "Nueva actividad de contribución", "New_work_and_big_ideas_from_established_and": "Nuevos trabajos y grandes ideas de artistas establecidos y emergentes.", "No_comments_yet": "No hay comentarios todavia.", @@ -4611,6 +4621,7 @@ "We_were_unable_to_load_the_shipping_destinations": "No se pudieron cargar los destinos de envío.\nPor favor inténtalo de nuevo más tarde.", "When_following_is_on_you_can_follow_the_acticity_of_others": "Cuando el seguimiento está activado, puedes seguir la actividad de los demás y otros pueden seguir tu actividad. Desactiva el seguimiento para eliminar esta información definitivamente.", "When_you_save_a_project_we_ll_send_you_a_reminder": "Cuando guardes un proyecto, te enviaremos un recordatorio por correo electrónico 48 horas antes de que finalice", + "Write_a_bio": "Write a short bio. Just a sentence or two is great.", "Yes_turn_off": "Sí, desactivar", "You_backed_this_project": "Patrocinaste este proyecto.", "You_Launched": "¡Tu proyecto fue publicado!", @@ -4620,6 +4631,7 @@ "Youre_about_to_create_a_new_Kickstarter_account": "Estás a punto de crear una nueva cuenta de Kickstarter usando el correo electrónico associado a tu cuenta de Facebook. Por favor confírmalo antes de proceder.", "Your_chat_message_wasnt_sent_successfully": "Tu mensaje no fue enviado.", "Your_friends_havent_backed_any_projects_yet": "Tus amigos todavía no han hecho contribuciones, pero en cuanto lo hagan, se verán reflejadas aquí.", + "Your_name_displayed": "Your name is always displayed on your profile.", "Your_payment_method_was_successfully_charged": "Se efectuó el cargo a tu método de pago.", "Your_pledge": "Tu contribución", "Your_pledge_amount": "Monto de tu contribución:", @@ -6148,6 +6160,7 @@ "A_weekly_roundup_of_the_best_and_brightest": "Un tour d'horizon hebdomadaire des meilleurs projets Kickstarter, triés sur le volet par nos soins.", "About_reward_amount": "Environ %{reward_amount}", "Account": "Votre compte", + "Add": "Add", "Add_attachments": "Ajouter des pièces jointes...", "All_Projects": "Tous les projets", "All_category_name_Projects": "Tous les projets de la catégorie %{category_name}", @@ -6364,6 +6377,7 @@ "If_your_profile_is_public": "Si votre profil n'est pas privé, les projets que vous avez soutenus, votre bio, votre emplacement géographique et vos sites Web seront également visibles.", "Individual_Emails": "E-mails individuels", "Info": "Info", + "Introduce_yourself": "Introduce yourself", "It_may_take_up_to_24_hours_to_collect_your_data": "La préparation de vos données personnelles peut prendre jusqu'à 24 heures. Nous vous enverrons des instructions de téléchargement à l'adresse e-mail associée à ce compte une fois que tout sera prêt. Si vous ne recevez rien, revenez ici pour réessayer.", "Its_a_way_to_bring_creative_projects_to_life": "C'est un outil qui permet de donner vie à des projets créatifs.", "Its_better_with_friends": "On est mieux ensemble.", @@ -6659,6 +6673,7 @@ "We_were_unable_to_load_the_shipping_destinations": "Nous n'avons pas été en mesure de charger les destinations d'expédition.\nVeuillez réessayer ultérieurement.", "When_following_is_on_you_can_follow_the_acticity_of_others": "Lorsque les fonctionnalités de suivi sont activées, vous pouvez vous abonner aux activités des autres, qui pourront à leur tour s'abonner aux vôtres. Pour supprimer définitivement ces données, il vous suffit de désactiver les fonctionnalités de suivi.", "When_you_save_a_project_we_ll_send_you_a_reminder": "Pour chaque projet que vous enregistrez, nous vous enverrons un rappel 48 heures avant la fin de sa campagne.", + "Write_a_bio": "Write a short bio. Just a sentence or two is great.", "Yes_turn_off": "Oui, désactiver", "You_backed_this_project": "Vous avez soutenu ce projet.", "You_Launched": "Projet lancé !", @@ -6668,6 +6683,7 @@ "Youre_about_to_create_a_new_Kickstarter_account": "Vous êtes sur le point de créer un nouveau compte Kickstarter avec l'adresse e-mail que vous utilisez sur Facebook. Veuillez confirmer avant de continuer.", "Your_chat_message_wasnt_sent_successfully": "Votre message n'a pas été envoyé.", "Your_friends_havent_backed_any_projects_yet": "Vos amis n'ont encore rien soutenu, mais dès qu'ils s'y seront mis, leurs engagements s'afficheront ici.", + "Your_name_displayed": "Your name is always displayed on your profile.", "Your_payment_method_was_successfully_charged": "Votre moyen de paiement a bien été débité.", "Your_pledge": "Mon engagement", "Your_pledge_amount": "Montant engagé :", @@ -8196,6 +8212,7 @@ "A_weekly_roundup_of_the_best_and_brightest": "Kickstarter スタッフがセレクトした今週のおすすめプロジェクト総まとめ。", "About_reward_amount": "約 %{reward_amount} ", "Account": "アカウント", + "Add": "Add", "Add_attachments": "添付ファイルを追加...", "All_Projects": "全てのプロジェクト", "All_category_name_Projects": "%{category_name} の全プロジェクト", @@ -8412,6 +8429,7 @@ "If_your_profile_is_public": "プロフィールがプライベート (非公開) 設定でない場合は、過去にあなたがバックしたプロジェクトや、あなたの地域情報、あなたの自己紹介欄とウェブサイトも表示されます。", "Individual_Emails": "個人メール", "Info": "インフォメーション", + "Introduce_yourself": "Introduce yourself", "It_may_take_up_to_24_hours_to_collect_your_data": "データの収集には最大で24時間かかる場合があります。ダウンロードの準備が整いましたら、このアカウントに登録されているメールアドレス宛てにデータのダウンロード手順が記載されたメールをお送りします。メールが届かなかった場合には、お手数ですがこちらに戻って再試行してください。", "Its_a_way_to_bring_creative_projects_to_life": "クリエイティブなプロジェクトに生命を。", "Its_better_with_friends": "友達にとってより良い。", @@ -8707,6 +8725,7 @@ "We_were_unable_to_load_the_shipping_destinations": "配送先の読込に失敗。\n再度お試しください。", "When_following_is_on_you_can_follow_the_acticity_of_others": "フォローがオンになっていると、他の人のアクティビティをフォローすることができ、また、他の人もあなたのアクティビティをフォローすることができます。このようなデータを永久に削除するためにはフォローをオフにしてください。", "When_you_save_a_project_we_ll_send_you_a_reminder": "プロジェクトを保存し、終了の48時間前にリマインドする。", + "Write_a_bio": "Write a short bio. Just a sentence or two is great.", "Yes_turn_off": "はい、オフにします", "You_backed_this_project": "バック済", "You_Launched": "発表されました!", @@ -8716,6 +8735,7 @@ "Youre_about_to_create_a_new_Kickstarter_account": "Facebookのメールアドレスで新しいアカウントを作成しようとしています。再度確認してください。", "Your_chat_message_wasnt_sent_successfully": "メッセージの送信に失敗。", "Your_friends_havent_backed_any_projects_yet": "バックした友達はまだいませんが、今後こちらに表示されます。", + "Your_name_displayed": "Your name is always displayed on your profile.", "Your_payment_method_was_successfully_charged": "支払方法の登録完了。", "Your_pledge": "プレッジ", "Your_pledge_amount": "プレッジ額:", @@ -10439,7 +10459,7 @@ "telegraf_proxy": "experimental", "telegraf_checkout": "experimental", "stripe_elements_sepa": "control", - "es5_woe_location_search": "experimental" + "es5_woe_location_search": "control" }, "stripe": { "publishable_key": "pk_live_zjuK52lEUYcvBhIXEUnOEJzk" diff --git a/app/src/main/java/com/kickstarter/ui/activities/EditProfileActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/EditProfileActivity.kt new file mode 100644 index 0000000000..b943d214b8 --- /dev/null +++ b/app/src/main/java/com/kickstarter/ui/activities/EditProfileActivity.kt @@ -0,0 +1,61 @@ +package com.kickstarter.ui.activities + +import android.os.Bundle +import android.widget.TextView +import com.kickstarter.R +import com.kickstarter.libs.BaseActivity +import com.kickstarter.libs.qualifiers.RequiresActivityViewModel +import com.kickstarter.libs.rx.transformers.Transformers +import com.kickstarter.libs.transformations.CircleTransformation +import com.kickstarter.libs.utils.BooleanUtils +import com.kickstarter.libs.utils.SwitchCompatUtils +import com.kickstarter.libs.utils.ViewUtils +import com.kickstarter.models.User +import com.kickstarter.viewmodels.EditProfileViewModel +import com.squareup.picasso.Picasso +import kotlinx.android.synthetic.main.activity_edit_profile.* +import rx.android.schedulers.AndroidSchedulers + +@RequiresActivityViewModel(EditProfileViewModel.ViewModel::class) +class EditProfileActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_edit_profile) + + this.viewModel.outputs.avatarImageViewUrl() + .compose(bindToLifecycle()) + .compose(Transformers.observeForUI()) + .subscribe { url -> + Picasso.with(this).load(url).transform(CircleTransformation()).into(avatar_image_view) + } + + this.viewModel.outputs.user() + .compose(bindToLifecycle()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ this.displayPreferences(it) }) + + this.viewModel.outputs.userNameTextViewText() + .compose(bindToLifecycle()) + .compose(Transformers.observeForUI()) + .subscribe({ name_edit_text.setText(it, TextView.BufferType.EDITABLE) }) + + this.viewModel.outputs.hidePrivateProfileRow() + .compose(bindToLifecycle()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + ViewUtils.setGone(private_profile_row, it) + ViewUtils.setGone(private_profile_text_view, it) + ViewUtils.setGone(public_profile_text_view, it) + }) + + private_profile_switch.setOnClickListener { + this.viewModel.inputs.showPublicProfile(private_profile_switch.isChecked) + } + + } + + private fun displayPreferences(user: User) { + SwitchCompatUtils.setCheckedWithoutAnimation(private_profile_switch, BooleanUtils.isFalse(user.showPublicProfile())) + } +} diff --git a/app/src/main/java/com/kickstarter/ui/activities/SettingsActivity.kt b/app/src/main/java/com/kickstarter/ui/activities/SettingsActivity.kt index 7f68ee1176..3290db678d 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/SettingsActivity.kt +++ b/app/src/main/java/com/kickstarter/ui/activities/SettingsActivity.kt @@ -7,10 +7,13 @@ import com.kickstarter.R import com.kickstarter.extensions.startActivityWithSlideUpTransition import com.kickstarter.libs.* import com.kickstarter.libs.qualifiers.RequiresActivityViewModel +import com.kickstarter.libs.rx.transformers.Transformers +import com.kickstarter.libs.transformations.CircleTransformation import com.kickstarter.libs.utils.ApplicationUtils import com.kickstarter.libs.utils.TransitionUtils.slideInFromLeft import com.kickstarter.libs.utils.ViewUtils import com.kickstarter.viewmodels.SettingsViewModel +import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.settings_layout.* import rx.android.schedulers.AndroidSchedulers @@ -33,6 +36,16 @@ class SettingsActivity : BaseActivity() { version_name_text_view.text = this.build.versionName() + this.viewModel.outputs.avatarImageViewUrl() + .compose(bindToLifecycle()) + .compose(Transformers.observeForUI()) + .subscribe { url -> Picasso.with(this).load(url).transform(CircleTransformation()).into(profile_picture_image_view) } + + this.viewModel.outputs.logout() + .compose(bindToLifecycle()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { logout() } + this.viewModel.outputs.showConfirmLogoutPrompt() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) @@ -44,15 +57,19 @@ class SettingsActivity : BaseActivity() { } }) - this.viewModel.outputs.logout() + this.viewModel.outputs.userNameTextViewText() .compose(bindToLifecycle()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { logout() } + .compose(Transformers.observeForUI()) + .subscribe({ name_text_view.text = it }) account_row.setOnClickListener { startActivityWithSlideUpTransition(Intent(this, AccountActivity::class.java)) } + edit_profile_row.setOnClickListener { + startActivityWithSlideUpTransition(Intent(this, EditProfileActivity::class.java)) + } + help_row.setOnClickListener { startActivityWithSlideUpTransition(Intent(this, HelpSettingsActivity::class.java)) } diff --git a/app/src/main/java/com/kickstarter/viewmodels/EditProfileViewModel.kt b/app/src/main/java/com/kickstarter/viewmodels/EditProfileViewModel.kt new file mode 100644 index 0000000000..2a94f2cbbd --- /dev/null +++ b/app/src/main/java/com/kickstarter/viewmodels/EditProfileViewModel.kt @@ -0,0 +1,133 @@ +package com.kickstarter.viewmodels + +import android.support.annotation.NonNull +import com.kickstarter.libs.ActivityViewModel +import com.kickstarter.libs.CurrentUserType +import com.kickstarter.libs.Environment +import com.kickstarter.libs.rx.transformers.Transformers +import com.kickstarter.libs.utils.IntegerUtils +import com.kickstarter.libs.utils.ListUtils +import com.kickstarter.libs.utils.ObjectUtils +import com.kickstarter.models.User +import com.kickstarter.services.ApiClientType +import com.kickstarter.ui.activities.EditProfileActivity +import rx.Observable +import rx.subjects.BehaviorSubject +import rx.subjects.PublishSubject + +interface EditProfileViewModel { + + interface Inputs { + /** Call when user toggles the private profile switch. */ + fun showPublicProfile(checked: Boolean) + } + + interface Outputs { + /** Emits the user avatar image to be displayed. */ + fun avatarImageViewUrl(): Observable + + /** Emits when the user is a creator and we need to hide the private profile row. */ + fun hidePrivateProfileRow(): Observable + + /** Emits user containing settings state. */ + fun user(): Observable + + /** Emits the user name to be displayed. */ + fun userNameTextViewText(): Observable + } + + interface Errors { + /** Emits when saving preference fails. */ + fun unableToSavePreferenceError(): Observable + } + + class ViewModel(@NonNull val environment: Environment) : ActivityViewModel(environment), Inputs, Outputs, Errors { + + private val client: ApiClientType = environment.apiClient() + private val currentUser: CurrentUserType = environment.currentUser() + + private val userInput = PublishSubject.create() + private val unableToSavePreferenceError = PublishSubject.create() + private val updateSuccess = PublishSubject.create() + + private var hidePrivateProfileRow = BehaviorSubject.create() + private val userOutput = BehaviorSubject.create() + + private val avatarImageViewUrl: Observable + private val userNameTextViewText: Observable + + val inputs: Inputs = this + val outputs: Outputs = this + + init { + + this.client.fetchCurrentUser() + .retry(2) + .compose(Transformers.neverError()) + .compose(bindToLifecycle()) + .subscribe { this.currentUser.refresh(it) } + + this.currentUser.observable() + .take(1) + .compose(bindToLifecycle()) + .subscribe({ this.userOutput.onNext(it) }) + + this.userInput + .concatMap({ this.updateSettings(it) }) + .compose(bindToLifecycle()) + .subscribe({ this.success(it) }) + + this.userInput + .compose(bindToLifecycle()) + .subscribe(this.userOutput) + + this.userOutput + .window(2, 1) + .flatMap>({ it.toList() }) + .map({ ListUtils.first(it) }) + .compose(Transformers.takeWhen(this.unableToSavePreferenceError)) + .compose(bindToLifecycle()) + .subscribe(this.userOutput) + + val currentUser = this.currentUser.observable() + + currentUser + .compose(bindToLifecycle()) + .filter(ObjectUtils::isNotNull) + .map { user -> IntegerUtils.isNonZero(user.createdProjectsCount()) } + .subscribe(this.hidePrivateProfileRow) + + this.avatarImageViewUrl = this.currentUser.loggedInUser().map { u -> u.avatar().medium() } + + this.userNameTextViewText = this.currentUser.loggedInUser().map({ it.name() }) + + this.koala.trackSettingsView() + } + + override fun avatarImageViewUrl() = this.avatarImageViewUrl + + override fun hidePrivateProfileRow(): Observable = this.hidePrivateProfileRow + + override fun showPublicProfile(checked: Boolean) { + this.userInput.onNext(this.userOutput.value.toBuilder().showPublicProfile(!checked).build()) + } + + override fun unableToSavePreferenceError(): Observable = this.unableToSavePreferenceError + .takeUntil(this.updateSuccess) + .map { _ -> null } + + override fun user(): Observable = this.userOutput + + override fun userNameTextViewText() = this.userNameTextViewText + + private fun success(user: User) { + this.currentUser.refresh(user) + this.updateSuccess.onNext(null) + } + + private fun updateSettings(user: User): Observable { + return this.client.updateUserSettings(user) + .compose(Transformers.pipeErrorsTo(this.unableToSavePreferenceError)) + } + } +} diff --git a/app/src/main/java/com/kickstarter/viewmodels/SettingsViewModel.kt b/app/src/main/java/com/kickstarter/viewmodels/SettingsViewModel.kt index b7643ef481..f281ccb572 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/SettingsViewModel.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/SettingsViewModel.kt @@ -27,11 +27,17 @@ interface SettingsViewModel { } interface Outputs { + /** Emits the user avatar image to be displayed. */ + fun avatarImageViewUrl(): Observable + /** Emits when its time to log the user out. */ fun logout(): Observable /** Emits a boolean that determines if the logout confirmation should be displayed. */ fun showConfirmLogoutPrompt(): Observable + + /** Emits the user name to be displayed. */ + fun userNameTextViewText(): Observable } class ViewModel(@NonNull val environment: Environment) : ActivityViewModel(environment), Inputs, Outputs { @@ -43,6 +49,9 @@ interface SettingsViewModel { private val showConfirmLogoutPrompt = BehaviorSubject.create() private val userOutput = BehaviorSubject.create() + private val avatarImageViewUrl: Observable + private val userNameTextViewText: Observable + val inputs: Inputs = this val outputs: Outputs = this @@ -61,14 +70,20 @@ interface SettingsViewModel { this.confirmLogoutClicked .compose(bindToLifecycle()) - .subscribe{ + .subscribe { this.koala.trackLogout() this.logout.onNext(null) } + this.avatarImageViewUrl = this.currentUser.loggedInUser().map { u -> u.avatar().medium() } + + this.userNameTextViewText = this.currentUser.loggedInUser().map({ it.name() }) + this.koala.trackSettingsView() } + override fun avatarImageViewUrl() = this.avatarImageViewUrl + override fun closeLogoutConfirmationClicked() = this.showConfirmLogoutPrompt.onNext(false) override fun confirmLogoutClicked() = this.confirmLogoutClicked.onNext(null) @@ -79,5 +94,7 @@ interface SettingsViewModel { override fun showConfirmLogoutPrompt(): Observable = this.showConfirmLogoutPrompt + override fun userNameTextViewText() = this.userNameTextViewText + } } diff --git a/app/src/main/res/drawable-hdpi/edit_icon.png b/app/src/main/res/drawable-hdpi/edit_icon.png new file mode 100644 index 0000000000..0c0f49111c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/edit_icon.png differ diff --git a/app/src/main/res/drawable-mdpi/edit_icon.png b/app/src/main/res/drawable-mdpi/edit_icon.png new file mode 100644 index 0000000000..b0fa8a6295 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/edit_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/edit_icon.png b/app/src/main/res/drawable-xhdpi/edit_icon.png new file mode 100644 index 0000000000..96b087f609 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/edit_icon.png differ diff --git a/app/src/main/res/drawable-xxhdpi/edit_icon.png b/app/src/main/res/drawable-xxhdpi/edit_icon.png new file mode 100644 index 0000000000..6466d7475c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/edit_icon.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/edit_icon.png b/app/src/main/res/drawable-xxxhdpi/edit_icon.png new file mode 100644 index 0000000000..b08d140ea5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/edit_icon.png differ diff --git a/app/src/main/res/drawable/edit_profile_linear_background.xml b/app/src/main/res/drawable/edit_profile_linear_background.xml new file mode 100644 index 0000000000..8bfcdfe443 --- /dev/null +++ b/app/src/main/res/drawable/edit_profile_linear_background.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_edit_profile.xml b/app/src/main/res/layout/activity_edit_profile.xml new file mode 100644 index 0000000000..a13de32832 --- /dev/null +++ b/app/src/main/res/layout/activity_edit_profile.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/edit_profile_toolbar.xml b/app/src/main/res/layout/edit_profile_toolbar.xml new file mode 100644 index 0000000000..0993102fee --- /dev/null +++ b/app/src/main/res/layout/edit_profile_toolbar.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/settings_layout.xml b/app/src/main/res/layout/settings_layout.xml index eeafc41f21..73fff79699 100644 --- a/app/src/main/res/layout/settings_layout.xml +++ b/app/src/main/res/layout/settings_layout.xml @@ -1,12 +1,13 @@ + android:orientation="vertical" + xmlns:tools="http://schemas.android.com/tools"> + + + + + + + + + + + + + + Eine wöchentliche Zusammenfassung der besten und cleversten Projekte auf Kickstarter, handverlesen von unserem Team. Ungefähr %{reward_amount} Konto + Add Anhänge hinzufügen ... Alle Projekte der Kategorie Kunst Alle Projekte der Kategorie Comics @@ -198,6 +199,7 @@ Wenn dein Profil nicht privat ist, sind außerdem die Projekte, die du unterstü Wenn dein Profil nicht privat ist, sind außerdem die Projekte, die du unterstützt hast, dein Standort, deine Biografie und deine Websites für Andere sichtbar. Individuelle E-Mails Info + Introduce yourself Die Zusammenstellung deiner Daten kann bis zu 24 Stunden dauern. Sobald sie zum Download bereitstehen, werden wir dir eine Anleitung dazu per E-Mail schicken. Solltest du nichts von uns hören, versuche es von hier aus noch einmal. Es ist eine Plattform, um kreative Projekte ins Leben zu rufen. Gemeinsam mehr erreichen @@ -442,6 +444,7 @@ Bitte versuche es später noch einmal. Wir werden dir 48 Stunden vor Ablauf dieses Projekts eine Benachrichtigung senden, sowie für alle Projekte, die du in Zukunft speicherst. Um alle gespeicherten Projekte anzusehen, gehe bitte zu deiner Profilseite. Wenn die Funktion Folgen gewählt wurde, kannst du die Aktivitäten von anderen einsehen und diese sehen deine Aktivitäten. Wenn die Funktion abgewählt wurde, werden diese Daten endgültig gelöscht. Wenn du ein Projekt speicherst, senden wir dir 48 Stunden vor Ablauf eine Erinnerungs-E-Mail + Write a short bio. Just a sentence or two is great. Ja, deaktivieren Dein Projekt ist live! Du hast dieses Projekt unterstützt. @@ -450,6 +453,7 @@ Bitte versuche es später noch einmal. Du hast dieses Projekt gespeichert. Deine Chat-Nachricht konnte leider nicht gesendet werden. Deine Freunde haben bisher noch kein Projekt unterstützt. Aber sobald sie das tun, wird es hier angezeigt. + Your name is always displayed on your profile. Deine Zahlungsmethode wurde erfolgreich belastet. Dein Beitrag Dein Beitrag: diff --git a/app/src/main/res/values-es/strings_i18n.xml b/app/src/main/res/values-es/strings_i18n.xml index cd9e9cfd18..3299f35fbc 100644 --- a/app/src/main/res/values-es/strings_i18n.xml +++ b/app/src/main/res/values-es/strings_i18n.xml @@ -4,6 +4,7 @@ Un resumen semanal de los mejores y más brillantes proyectos de Kickstarter, seleccionados por nuestro equipo. Aprox. %{reward_amount} Cuenta + Add Agregar anexos … Todos los proyectos de la categoría Arte Todos los proyectos de la categoría Comics @@ -66,7 +67,7 @@ patrocinadores Muestra menos subcategorías. Colecciones Completar pago - Confirm new password + Confirmar nueva contraseña Si te conectas via Facebook puedes seguir a tus amigos y te avisaremos cada vez que publican o patrocinan un proyecto. Comunicarse con el creador Continuar a pago @@ -198,6 +199,7 @@ Si tu perfil no es privado, otros usuarios también podrán ver los proyectos qu Si tu perfil no es privado, otros usuarios también podrán ver los proyectos que has patrocinado, tu ubicación, biografía y sitios web. Notificaciones por correo electrónico individuales Información + Introduce yourself Puede demorar hasta 24 horas recopilar tus datos. Cuando estén listos, te enviaremos instrucciones para descargar tus datos al correo electrónico asociado con esta cuenta. Si no recibes noticias nuestras, vuelve aquí e inténtalo de nuevo. Es una plataforma para dar vida a proyectos creativos. Todo en la vida es mejor con amigos ... @@ -241,7 +243,7 @@ Si tu perfil no es privado, otros usuarios también podrán ver los proyectos qu Mensajes Nombre Nunca - New password + Contraseña nueva Nueva actividad de contribución Nuevos trabajos y grandes ideas de artistas establecidos y emergentes. Unas cuantas veces al año: Noticias sobresalientes y eventos cerca de ti. @@ -442,6 +444,7 @@ Por favor inténtalo de nuevo más tarde. Te recordaremos 48 horas antes de que finalice este proyecto y recibirás un recordatorio sobre todos los proyectos que guardes de aquí en adelante. Para ver todo lo que has guardado, visita tu perfil. Cuando el seguimiento está activado, puedes seguir la actividad de los demás y otros pueden seguir tu actividad. Desactiva el seguimiento para eliminar esta información definitivamente. Cuando guardes un proyecto, te enviaremos un recordatorio por correo electrónico 48 horas antes de que finalice + Write a short bio. Just a sentence or two is great. Sí, desactivar ¡Tu proyecto fue publicado! Patrocinaste este proyecto. @@ -450,6 +453,7 @@ Por favor inténtalo de nuevo más tarde. Uno de tus proyectos guardados. Tu mensaje no fue enviado. Tus amigos todavía no han hecho contribuciones, pero en cuanto lo hagan, se verán reflejadas aquí. + Your name is always displayed on your profile. Se efectuó el cargo a tu método de pago. Tu contribución Monto de tu contribución: diff --git a/app/src/main/res/values-fr/strings_i18n.xml b/app/src/main/res/values-fr/strings_i18n.xml index d6d670eb85..1ce445ac44 100644 --- a/app/src/main/res/values-fr/strings_i18n.xml +++ b/app/src/main/res/values-fr/strings_i18n.xml @@ -4,6 +4,7 @@ Un tour d\'horizon hebdomadaire des meilleurs projets Kickstarter, triés sur le volet par nos soins. Environ %{reward_amount} Votre compte + Add Ajouter des pièces jointes... Tous les projets de la catégorie Art Tous les projets de la catégorie Bande dessinée @@ -196,6 +197,7 @@ contributeurs Si votre profil n\'est pas privé, les projets que vous avez soutenus, votre bio, votre emplacement géographique et vos sites Web seront également visibles. E-mails individuels Info + Introduce yourself La préparation de vos données personnelles peut prendre jusqu\'à 24 heures. Nous vous enverrons des instructions de téléchargement à l\'adresse e-mail associée à ce compte une fois que tout sera prêt. Si vous ne recevez rien, revenez ici pour réessayer. C\'est un outil qui permet de donner vie à des projets créatifs. On est mieux ensemble. @@ -441,6 +443,7 @@ Veuillez réessayer ultérieurement. Nous vous enverrons un rappel 48 heures avant la fin de cette campagne. Vous recevrez aussi des rappels pour tous les projets que vous avez enregistré. Ceux-ci sont tous accessibles depuis votre profil. Lorsque les fonctionnalités de suivi sont activées, vous pouvez vous abonner aux activités des autres, qui pourront à leur tour s\'abonner aux vôtres. Pour supprimer définitivement ces données, il vous suffit de désactiver les fonctionnalités de suivi. Pour chaque projet que vous enregistrez, nous vous enverrons un rappel 48 heures avant la fin de sa campagne. + Write a short bio. Just a sentence or two is great. Oui, désactiver Projet lancé ! Vous avez soutenu ce projet. @@ -449,6 +452,7 @@ Veuillez réessayer ultérieurement. Vous avez enregistré ce projet. Votre message n\'a pas été envoyé. Vos amis n\'ont encore rien soutenu, mais dès qu\'ils s\'y seront mis, leurs engagements s\'afficheront ici. + Your name is always displayed on your profile. Votre moyen de paiement a bien été débité. Mon engagement Montant engagé : diff --git a/app/src/main/res/values-ja/strings_i18n.xml b/app/src/main/res/values-ja/strings_i18n.xml index 4fda5a7302..21affbcd47 100644 --- a/app/src/main/res/values-ja/strings_i18n.xml +++ b/app/src/main/res/values-ja/strings_i18n.xml @@ -4,6 +4,7 @@ Kickstarter スタッフがセレクトした今週のおすすめプロジェクト総まとめ。 約 %{reward_amount}  アカウント + Add 添付ファイルを追加... 全てのアートプロジェクト 全てのコミックプロジェクト @@ -195,6 +196,7 @@ プロフィールがプライベート (非公開) 設定でない場合は、過去にあなたがバックしたプロジェクトや、あなたの地域情報、あなたの自己紹介欄とウェブサイトも表示されます。 個人メール インフォメーション + Introduce yourself データの収集には最大で24時間かかる場合があります。ダウンロードの準備が整いましたら、このアカウントに登録されているメールアドレス宛てにデータのダウンロード手順が記載されたメールをお送りします。メールが届かなかった場合には、お手数ですがこちらに戻って再試行してください。 クリエイティブなプロジェクトに生命を。 友達にとってより良い。 @@ -440,6 +442,7 @@ 終了48時間前に通知が届きます。保存アイテムをみるにはプロフィールをご覧ください。 フォローがオンになっていると、他の人のアクティビティをフォローすることができ、また、他の人もあなたのアクティビティをフォローすることができます。このようなデータを永久に削除するためにはフォローをオフにしてください。 プロジェクトを保存し、終了の48時間前にリマインドする。 + Write a short bio. Just a sentence or two is great. はい、オフにします 発表されました! バック済 @@ -448,6 +451,7 @@ 保存済みです メッセージの送信に失敗。 バックした友達はまだいませんが、今後こちらに表示されます。 + Your name is always displayed on your profile. 支払方法の登録完了。 プレッジ プレッジ額: diff --git a/app/src/main/res/values/strings_i18n.xml b/app/src/main/res/values/strings_i18n.xml index d9a4f69e32..3b09da14dc 100644 --- a/app/src/main/res/values/strings_i18n.xml +++ b/app/src/main/res/values/strings_i18n.xml @@ -4,6 +4,7 @@ A weekly roundup of the best and brightest projects on Kickstarter, handpicked by our team. About %{reward_amount} Account + Add Add attachments… All Art Projects All Comics Projects @@ -196,6 +197,7 @@ backers If your profile is not private, others can also see the projects you\'ve backed, your location, bio and websites. Individual emails Info + Introduce yourself It may take up to 24 hours to collect your data. When it’s ready, we’ll send instructions to download your data to the email associated with this account. If you don’t hear from us, come back here to try again. It’s a way to bring creative projects to life. It’s better\n @@ -444,6 +446,7 @@ Please try again later. We’ll remind you 48 hours before this project ends, and you\'ll get a reminder about all projects you save moving forward. To view everything you’ve saved, visit your profile. When following is on, you can follow the activity of others and others can follow your activity. Turn following off to permanently delete this data. When you save a project we’ll send you a reminder 48 hours before it ends + Write a short bio. Just a sentence or two is great. Yes, turn off You Launched! You backed this project. @@ -452,6 +455,7 @@ Please try again later. You saved this project. Your chat message wasn\'t sent successfully. Your friends haven’t backed any projects yet, but once they do, you’ll see them listed here. + Your name is always displayed on your profile. Your payment method was successfully charged. Your pledge Your pledge amount: