From 2af8efc6b73dda07ef70d66ad17bea11d068bf21 Mon Sep 17 00:00:00 2001 From: Izzy Oji Date: Wed, 21 Feb 2018 11:54:31 -0500 Subject: [PATCH 1/4] creator tools strings updates with tests for title changes --- app/src/main/assets/json/server-config.json | 88 +++++++++++++++---- ...eatorDashboardReferrerStatsViewHolder.java | 14 ++- ...CreatorDashboardRewardStatsViewHolder.java | 14 +++ ...boardReferrerBreakdownHolderViewModel.java | 14 ++- ...DashboardReferrerStatsHolderViewModel.java | 14 +-- ...orDashboardRewardStatsHolderViewModel.java | 16 +++- .../res/layout/dashboard_funding_view.xml | 2 +- .../dashboard_referrer_breakdown_layout.xml | 12 +-- .../layout/dashboard_referrer_stats_view.xml | 43 +++++---- .../layout/dashboard_reward_stats_view.xml | 21 ++--- app/src/main/res/values-de/strings_i18n.xml | 12 +++ app/src/main/res/values-es/strings_i18n.xml | 12 +++ app/src/main/res/values-fr/strings_i18n.xml | 12 +++ app/src/main/res/values-ja/strings_i18n.xml | 18 +++- app/src/main/res/values/strings_i18n.xml | 12 +++ ...boardReferrerStatsHolderViewModelTest.java | 16 ++-- ...shboardRewardStatsHolderViewModelTest.java | 24 +++++ 17 files changed, 270 insertions(+), 74 deletions(-) diff --git a/app/src/main/assets/json/server-config.json b/app/src/main/assets/json/server-config.json index 39f378edc5..79e4cbb2ae 100644 --- a/app/src/main/assets/json/server-config.json +++ b/app/src/main/assets/json/server-config.json @@ -79,6 +79,7 @@ "Creator_name_will_be_streaming_live_on_Kickstarter_in_duration": "%{creator_name} will be streaming live on Kickstarter %{in_duration}", "Creator_tips": "Creator tips", "Daily_digest": "Daily digest", + "Data_will_appear_here_once": "Data will appear here once somebody backs your project.", "days": { "zero": "days", "one": "day", @@ -154,6 +155,7 @@ "Got_it": "Got it.", "Got_it_your_survey_response_has_been_submitted": "Got it! Your survey response has been submitted.", "Home": "Home", + "How_backers_found_your_project": "How backers found your project", "hours": { "zero": "hours", "one": "hour", @@ -300,6 +302,7 @@ "Replay_past_live_stream": "Replay past live stream", "Replay_past_live_streams": "Replay past live streams", "Reply_to_user_name": "Reply to %{user_name}…", + "Reward_delivered": "Reward delivered?", "Reward_estimated_for_delivery_in_date": "Reward estimated for delivery in %{delivery_date}", "Rewards_count_rewards": { "zero": "%{rewards_count} rewards", @@ -371,8 +374,12 @@ "This_project_will_only_be_funded_on_if_at_least_amount_is_pledged_by_date": "This project will only be funded on if at least %{amount} is pledged by %{date}.", "Time_left_left": "%{time_left} left", "To_access_all_your_favorite_categories_tap_the_explore_dropdown": "To access all your favorite categories, tap the explore dropdown at the top of the app.", - "Toggle_saving_this_project": "Toggle saving this project", "To_read_this_project_update_you_must_be_a_backer": "To read this project update, you must be a backer. Please log in or sign up to continue.", + "To_see_all_rewards_view_your_project": "To see all rewards, view your project.", + "Toggle_saving_this_project": "Toggle saving this project", + "Top_pledge_sources": "Top pledge sources", + "Top_ten_pledge_sources": "Top 10 pledge sources", + "Top_ten_rewards": "Top 10 rewards", "Total_pledged": "Total pledged", "updates_count_updates": { "zero": "%{updates_count} updates", @@ -393,8 +400,13 @@ "Upcoming_live_streams": "Upcoming live streams", "Upcoming_with_creator_name": "Upcoming with
%{creator_name}", "Update_pledge": "Update pledge", + "Use_this_to_keep_track_of_which_rewards_youve_received": "Use this to keep track of which rewards you've received.", + "via_custom": "via custom", + "via_external": "via external", + "via_kickstarter": "via Kickstarter", "Video_disabled_until_the_internet_connection_improves": "Video disabled until the internet connection improves", "View": "View", + "View_project": "View project", "View_your_pledge": "View your pledge", "View_your_reward": "View your reward", "Watch_live": "Watch live", @@ -2004,6 +2016,7 @@ "Creator_name_will_be_streaming_live_on_Kickstarter_in_duration": "%{creator_name} wird in %{in_duration} live auf Kickstarter streamen", "Creator_tips": "Tpps für Projektgründer", "Daily_digest": "Tägliche Zusammenfassung", + "Data_will_appear_here_once": "Info wird hier angezeigt, sobald jemand dein Projekt unterstützt.", "days": { "zero": "Tg", "one": "Tag", @@ -2079,6 +2092,7 @@ "Got_it": "Alles klar!", "Got_it_your_survey_response_has_been_submitted": "Alles klar! Deine Antwort auf die Befragung wurde übermittelt.", "Home": "Home", + "How_backers_found_your_project": "Wie Unterstützer dein Projekt gefunden haben", "hours": { "zero": "Std", "one": "Std", @@ -2225,6 +2239,7 @@ "Replay_past_live_stream": "Wiedergabe des vorigen Live-Streams", "Replay_past_live_streams": "Wiedergabe vergangener Live-Streams", "Reply_to_user_name": "%{user_name} antworten …", + "Reward_delivered": "Belohnung versandt?", "Reward_estimated_for_delivery_in_date": "Voraussichtliche Lieferung der Belohnung im %{delivery_date}", "Rewards_count_rewards": { "zero": "%{rewards_count} Belohnungen", @@ -2296,8 +2311,12 @@ "This_project_will_only_be_funded_on_if_at_least_amount_is_pledged_by_date": "Dieses Projekt wird nur finanziert, wenn bis am %{date} Unterstützungsbeiträge von mindestens %{amount} geleistet werden.", "Time_left_left": "%{time_left} übrig", "To_access_all_your_favorite_categories_tap_the_explore_dropdown": "Für schnellen Zugriff auf deine meist besuchten Kategorien, tippe auf das Dropdown-Menü oben.", - "Toggle_saving_this_project": "Umschalten zu Projekt speichern", "To_read_this_project_update_you_must_be_a_backer": "Um diesen Update zum Projekt lesen zu können, musst du ein Unterstützer dieses Projekts sein. Bitte melde dich an oder registriere dich.", + "To_see_all_rewards_view_your_project": "Um alle Belohnungen zu sehen, gehe zu deinem Projekt.", + "Toggle_saving_this_project": "Umschalten zu Projekt speichern", + "Top_pledge_sources": "Woher deine Unterstützungen kommen", + "Top_ten_pledge_sources": "Top 10 Quellen deiner Beiträge", + "Top_ten_rewards": "Top 10-Belohnungen", "Total_pledged": "Anzahl der Beiträge insgesamt", "updates_count_updates": { "zero": "%{updates_count} Updates", @@ -2318,8 +2337,13 @@ "Upcoming_live_streams": "Zukünftige Live-Streams", "Upcoming_with_creator_name": "Demnächst: Video von
%{creator_name}", "Update_pledge": "Beitrag aktualisieren", + "Use_this_to_keep_track_of_which_rewards_youve_received": "Hier kannst du nachverfolgen, welche Belohnungen du bereits erhalten hast.", + "via_custom": "Benutzerdefiniert", + "via_external": "Extern", + "via_kickstarter": "über Kickstarter", "Video_disabled_until_the_internet_connection_improves": "Video bis zur Wiederherstellung der Internetverbindung deaktiviert", "View": "Anzeigen", + "View_project": "Projekt ansehen", "View_your_pledge": "Deinen Finanzierungsbeitrag ansehen", "View_your_reward": "Belohnung ansehen", "Watch_live": "Live ansehen", @@ -3929,6 +3953,7 @@ "Creator_name_will_be_streaming_live_on_Kickstarter_in_duration": "%{creator_name} estará trasnmitiendo en vivo en Kickstarter %{in_duration}", "Creator_tips": "Consejos para el creador", "Daily_digest": "Resumen diario", + "Data_will_appear_here_once": "Los datos aparecerán aquí una vez que alguien patrocine tu proyecto.", "days": { "zero": "días", "one": "día", @@ -4004,6 +4029,7 @@ "Got_it": "¡Listo!", "Got_it_your_survey_response_has_been_submitted": "¡Listo! Hemos recibido tus respuestas a nuestro cuestionario.", "Home": "Inicio", + "How_backers_found_your_project": "Cómo encontraron tu proyecto los patrocinadores", "hours": { "zero": "horas", "one": "hora", @@ -4150,6 +4176,7 @@ "Replay_past_live_stream": "Repetir live stream pasado", "Replay_past_live_streams": "Repetir live streams pasados", "Reply_to_user_name": "Responder a %{user_name}…", + "Reward_delivered": "¿Recompensa entregada?", "Reward_estimated_for_delivery_in_date": "Recompensa estimada para entregarse en %{delivery_date}", "Rewards_count_rewards": { "zero": "%{rewards_count} recompensas", @@ -4221,8 +4248,12 @@ "This_project_will_only_be_funded_on_if_at_least_amount_is_pledged_by_date": "Este proyecto sólo será financiado si se contribuye al menos un monto de %{amount} antes del %{date}.", "Time_left_left": "%{time_left} restantes", "To_access_all_your_favorite_categories_tap_the_explore_dropdown": "Accede a tus categorías favoritas en el menú en la parte superior de la app.", - "Toggle_saving_this_project": "Guardar/No guardar este proyecto", "To_read_this_project_update_you_must_be_a_backer": "Sólo los patrocinadores pueden leer esta actualización, por favor inicia sesión o regístrate para continuar.", + "To_see_all_rewards_view_your_project": "Para ver todas las recompensas, revisa tu proyecto.", + "Toggle_saving_this_project": "Guardar/No guardar este proyecto", + "Top_pledge_sources": "Principales fuentes de contribución", + "Top_ten_pledge_sources": "Las 10 principales fuentes de contribución", + "Top_ten_rewards": "Las 10 mejores recompensas", "Total_pledged": "Contribuciones en total", "updates_count_updates": { "zero": "%{updates_count} actualizaciones", @@ -4243,8 +4274,13 @@ "Upcoming_live_streams": "Live streams futuros", "Upcoming_with_creator_name": "Próximamente: Video de
%{creator_name}", "Update_pledge": "Actualizar contribución", + "Use_this_to_keep_track_of_which_rewards_youve_received": "Aquí puedes ver las recompensas recibidas.", + "via_custom": "a través de personalizados", + "via_external": "a través de externos", + "via_kickstarter": "a través de Kickstarter", "Video_disabled_until_the_internet_connection_improves": "Video desactivado hasta se reestablezca la conexión de internet", "View": "Ver", + "View_project": "Ver proyecto", "View_your_pledge": "Revisa tu contribución", "View_your_reward": "Mostrar recompensa", "Watch_live": "Ver en vivo", @@ -5854,6 +5890,7 @@ "Creator_name_will_be_streaming_live_on_Kickstarter_in_duration": "%{creator_name} sera en direct sur Kickstarter %{in_duration}", "Creator_tips": "Astuces pour créateurs", "Daily_digest": "Résumé quotidien", + "Data_will_appear_here_once": "Ces données seront visibles dès que vous aurez reçu votre première contribution.", "days": { "zero": "jours", "one": "jour", @@ -5929,6 +5966,7 @@ "Got_it": "Super.", "Got_it_your_survey_response_has_been_submitted": "Merci ! Vos réponses au questionnaire ont bien été envoyées.", "Home": "Accueil", + "How_backers_found_your_project": "Comment les contributeurs ont découvert votre projet", "hours": { "zero": "heures", "one": "heure", @@ -6075,6 +6113,7 @@ "Replay_past_live_stream": "Rediffusion", "Replay_past_live_streams": "Revoir des diffusions en direct passées", "Reply_to_user_name": "Répondre à %{user_name}…", + "Reward_delivered": "Récompense livrée ?", "Reward_estimated_for_delivery_in_date": "Récompense prévue pour %{delivery_date}", "Rewards_count_rewards": { "zero": "%{rewards_count} récompenses", @@ -6146,8 +6185,12 @@ "This_project_will_only_be_funded_on_if_at_least_amount_is_pledged_by_date": "Ce projet ne sera financé que si au moins %{amount} sont engagés d'ici le %{date}.", "Time_left_left": "Plus que %{time_left}", "To_access_all_your_favorite_categories_tap_the_explore_dropdown": "Pour retrouver toutes vos catégories préférées, cliquez sur le menu déroulant Découvrir dans l'application.", - "Toggle_saving_this_project": "Enregistrer / ne pas enregistrer ce projet", "To_read_this_project_update_you_must_be_a_backer": "Seuls les contributeurs ont accès à cette actu de projet. Connectez-vous ou inscrivez-vous pour continuer.", + "To_see_all_rewards_view_your_project": "Accéder à votre projet pour voir toutes vos récompenses", + "Toggle_saving_this_project": "Enregistrer / ne pas enregistrer ce projet", + "Top_pledge_sources": "Vos principales sources de contributions", + "Top_ten_pledge_sources": "Vos 10 principales sources de contributions", + "Top_ten_rewards": "Les 10 récompenses qui ont le plus de succès", "Total_pledged": "Total engagé", "updates_count_updates": { "zero": "%{updates_count} actus", @@ -6168,8 +6211,13 @@ "Upcoming_live_streams": "Diffusions en direct à venir", "Upcoming_with_creator_name": "
%{creator_name} bientôt en direct", "Update_pledge": "Modifier mon engagement", + "Use_this_to_keep_track_of_which_rewards_youve_received": "Utilisez cette fonction pour garder une trace des récompenses que vous avez reçues.", + "via_custom": "sites référents personnalisés", + "via_external": "sites référents externes", + "via_kickstarter": "Kickstarter", "Video_disabled_until_the_internet_connection_improves": "Vidéo désactivée en attente d'une meilleure connexion Internet", "View": "Afficher", + "View_project": "Afficher le projet", "View_your_pledge": "Afficher mon engagement", "View_your_reward": "Afficher ma récompense", "Watch_live": "Regarder en direct", @@ -7779,6 +7827,7 @@ "Creator_name_will_be_streaming_live_on_Kickstarter_in_duration": "%{creator_name} は%{in_duration} にライブ配信を行います", "Creator_tips": "アドバイス", "Daily_digest": "デイリーダイジェスト", + "Data_will_appear_here_once": "誰かがプロジェクトをバック(支援)すると、ここにデータが表示されます。", "days": { "zero": "日", "one": "日", @@ -7854,6 +7903,7 @@ "Got_it": "完了", "Got_it_your_survey_response_has_been_submitted": "サーベイを送信しました!", "Home": "ホーム", + "How_backers_found_your_project": "バッカ―があなたのプロジェクトを見つけた経緯", "hours": { "zero": "時間", "one": "時間", @@ -7944,7 +7994,7 @@ "Please_log_in_or_sign_up_to_participate_in_this_live_stream_chat": "ライブ配信でチャットに参加するためにはログインかサインアップしてください。", "Please_log_in_or_sign_up_to_subscribe_to_this_live_stream": "ログインまたはサインアップして、ライブ配信を見よう!", "Pledge": "プレッジする", - "Pledge_activity": "Pledge activity", + "Pledge_activity": "プレッジ", "pledge_amount_pledged_on_pledge_date": "%{pledge_date} に%{pledge_amount}のプレッジをしました", "Pledge_any_amount_to_help_bring_this_project_to_life": "プレッジでプロジェクトに生命を。", "Pledged_on_date": "%{pledge_date} にプレッジ", @@ -7982,7 +8032,7 @@ "Project_Suspended": "中止プロジェクト", "Projects_We_Love": "Projects We Love", "Projects_youve_launched": "ローンチしたプロジェクト", - "Projects_youve_backed": "Projects you've backed", + "Projects_youve_backed": "バック(支援)したプロジェクト", "Public_comment": "公開コメント", "Pursue_daring_ideas": "大胆な\nアイディアを。", "Push_notifications": "プッシュ通知設定", @@ -8000,6 +8050,7 @@ "Replay_past_live_stream": "過去のライブ配信をリプレイ", "Replay_past_live_streams": "過去のライブ配信をリプレイ", "Reply_to_user_name": "%{user_nameに返信", + "Reward_delivered": "リワードを受け取りましたか?", "Reward_estimated_for_delivery_in_date": "リワードの配達予定日は%{delivery_date}", "Rewards_count_rewards": { "zero": "%{rewards_count} 種類のリワード", @@ -8071,8 +8122,12 @@ "This_project_will_only_be_funded_on_if_at_least_amount_is_pledged_by_date": "このプロジェクトは%{date} までに、少なくとも%{amount}プレッジされるでしょう。", "Time_left_left": "あと%{time_left}", "To_access_all_your_favorite_categories_tap_the_explore_dropdown": "上部の「さがす」をタップし、お気に入りカテゴリにアクセス。", - "Toggle_saving_this_project": "プロジェクトを保存", "To_read_this_project_update_you_must_be_a_backer": "このアップデートはバッカー専用です。 続行するにはログインまたはサインアップしてください。", + "To_see_all_rewards_view_your_project": "すべてのリワードを確認するには、プロジェクトをご覧ください。", + "Toggle_saving_this_project": "プロジェクトを保存", + "Top_pledge_sources": "プレッジソースのトップ", + "Top_ten_pledge_sources": "プレッジソースのトップ10", + "Top_ten_rewards": "リワードのトップ10", "Total_pledged": "プレッジ総計", "updates_count_updates": { "zero": "%{updates_count} 件のアップデート", @@ -8093,8 +8148,13 @@ "Upcoming_live_streams": "ライブ配信が開始します", "Upcoming_with_creator_name": "
%{creator_name}が近日配信", "Update_pledge": "プレッジをアップデートする", + "Use_this_to_keep_track_of_which_rewards_youve_received": "受け取ったリワードを確認するにはこちらをご利用ください。", + "via_custom": "リファラー経由", + "via_external": "外部を経由", + "via_kickstarter": "kickstarterを経由", "Video_disabled_until_the_internet_connection_improves": "インターネット通信状態が向上するまでビデオはご利用いいただけません。", "View": "みる", + "View_project": "プロジェクトを見る", "View_your_pledge": "プレッジをみる", "View_your_reward": "リワードをみる", "Watch_live": "ライブをみる", @@ -9074,7 +9134,7 @@ "messages": "メッセージ", "activity": "アクティビティ", "post_update": "アップデートを投稿", - "project": "Project", + "project": "プロジェクト", "share": "シェア" }, "creator_project": { @@ -9636,7 +9696,8 @@ "ios_live_stream_discovery": true, "ios_live_stream_chat": true, "ios_backer_dashboard": true, - "message_spam": true + "message_spam": true, + "creator_search": true }, "launched_countries": [ { @@ -9817,16 +9878,11 @@ } ], "ab_experiments": { - "koala_alt_frontend_tracking": "experimental", "project_build": "control", - "project_dashboard": "control", + "project_dashboard": "with_dashboard", "react_guest_pledging_run_3": "control", - "favorites_recs": "control", "show_refreshed_thanks_page": "control", - "project_card_hearts": "control", - "currency_conversion": "control", - "isomorphic": "experimental", - "ios_test_test": "control", + "show_created_by_discovery": "control", "guided_search": "control" }, "stripe": { diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java index c5bf35e16a..232ec3df2f 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java @@ -18,6 +18,7 @@ import java.util.List; import butterknife.Bind; +import butterknife.BindString; import butterknife.ButterKnife; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; @@ -28,7 +29,10 @@ public class CreatorDashboardReferrerStatsViewHolder extends KSViewHolder { protected @Bind(R.id.dashboard_referrer_stats_empty_text_view) TextView emptyTextView; protected @Bind(R.id.dashboard_referrer_stats_recycler_view) RecyclerView referrerStatsRecyclerView; - protected @Bind(R.id.dashboard_referrer_stats_truncated_text_view) TextView truncatedTextView; + protected @Bind(R.id.dashboard_referrer_title) TextView referrerTitleTextView; + + protected @BindString(R.string.Top_pledge_sources) String topPledgeSourcesString; + protected @BindString(R.string.Top_ten_pledge_sources) String topTenPledgeSourcesString; public CreatorDashboardReferrerStatsViewHolder(final @NonNull View view) { super(view); @@ -50,10 +54,14 @@ public CreatorDashboardReferrerStatsViewHolder(final @NonNull View view) { .compose(observeForUI()) .subscribe(this::toggleRecyclerViewAndEmptyStateVisibility); - this.viewModel.outputs.referrerStatsTruncatedTextIsGone() + this.viewModel.outputs.referrersTitleIsLimitedCopy() .compose(bindToLifecycle()) .compose(observeForUI()) - .subscribe(gone -> ViewUtils.setGone(this.truncatedTextView, gone)); + .subscribe(this::setTitleCopy); + } + + private void setTitleCopy(final boolean shouldShowLimitedCopy) { + this.referrerTitleTextView.setText(shouldShowLimitedCopy ? this.topTenPledgeSourcesString : this.topPledgeSourcesString); } private void toggleRecyclerViewAndEmptyStateVisibility(final @NonNull Boolean gone) { diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java index 7d9d0c4c58..750ea65f2d 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java @@ -18,6 +18,7 @@ import java.util.List; import butterknife.Bind; +import butterknife.BindString; import butterknife.ButterKnife; import butterknife.OnClick; @@ -31,6 +32,10 @@ public final class CreatorDashboardRewardStatsViewHolder extends KSViewHolder { protected @Bind(R.id.dashboard_reward_stats_pledged_view) View pledgedColumnView; protected @Bind(R.id.dashboard_reward_stats_truncated_text_view) TextView truncatedTextView; protected @Bind(R.id.dashboard_reward_stats_recycler_view) RecyclerView rewardStatsRecyclerView; + protected @Bind(R.id.dashboard_reward_title) TextView rewardsTitleTextView; + + protected @BindString(R.string.dashboard_graphs_rewards_top_rewards) String topRewardsString; + protected @BindString(R.string.Top_ten_rewards) String topTenRewardsString; public CreatorDashboardRewardStatsViewHolder(final @NonNull View view) { super(view); @@ -56,6 +61,15 @@ public CreatorDashboardRewardStatsViewHolder(final @NonNull View view) { .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(gone -> ViewUtils.setGone(this.truncatedTextView, gone)); + + this.viewModel.outputs.rewardsTitleIsLimitedCopy() + .compose(bindToLifecycle()) + .compose(observeForUI()) + .subscribe(this::setTitleCopy); + } + + private void setTitleCopy(final boolean shouldShowLimitedCopy) { + this.rewardsTitleTextView.setText(shouldShowLimitedCopy ? this.topTenRewardsString : this.topRewardsString); } private void toggleRecyclerViewAndEmptyStateVisibility(final @NonNull Boolean gone) { diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerBreakdownHolderViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerBreakdownHolderViewModel.java index 0d6fba0000..d0660e45f5 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerBreakdownHolderViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerBreakdownHolderViewModel.java @@ -75,6 +75,9 @@ interface Outputs { /** Emits the current project and the amount pledged via internal referrers **/ Observable> projectAndInternalReferrerPledgedAmount(); + + /** Emits when there are more than 10 referrer stats and title copy should reflect limited list. */ + Observable referrersTitleIsLimitedCopy(); } final class ViewModel extends ActivityViewModel implements Inputs, Outputs { @@ -194,6 +197,12 @@ public ViewModel(final @NonNull Environment environment) { this.pledgedViaInternalLayoutIsGone = this.internalReferrerPledgedAmount .map(amount -> amount <= 0f); + + referrerStats + .map(rs -> rs.size() > 10) + .distinctUntilChanged() + .compose(bindToLifecycle()) + .subscribe(this.referrersTitleIsLimitedCopy); } public final Inputs inputs = this; @@ -220,6 +229,7 @@ public ViewModel(final @NonNull Environment environment) { private final Observable> projectAndCustomReferrerPledgedAmount; private final Observable> projectAndExternalReferrerPledgedAmount; private final Observable> projectAndInternalReferrerPledgedAmount; + private final PublishSubject referrersTitleIsLimitedCopy = PublishSubject.create(); @Override public void projectAndStatsInput(final @NonNull Pair projectAndStats) { @@ -291,6 +301,8 @@ public void projectAndStatsInput(final @NonNull Pair> projectAndInternalReferrerPledgedAmount() { return this.projectAndInternalReferrerPledgedAmount; } - + @Override public @NonNull Observable referrersTitleIsLimitedCopy() { + return this.referrersTitleIsLimitedCopy; + } } } diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java index 97fb531dad..0e1b91b99d 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java @@ -35,8 +35,8 @@ interface Outputs { /** Emits when there are no referrer stats. */ Observable referrerStatsListIsGone(); - /** Emits when there are more than 10 referrer stats. */ - Observable referrerStatsTruncatedTextIsGone(); + /** Emits when there are more than 10 referrer stats and title copy should reflect limited list. */ + Observable referrersTitleIsLimitedCopy(); } final class ViewModel extends ActivityViewModel implements Inputs, Outputs { @@ -62,10 +62,10 @@ public ViewModel(final @NonNull Environment environment) { .subscribe(this.referrerStatsListIsGone); sortedReferrerStats - .map(pr -> pr.size() <= 10) + .map(rs -> rs.size() > 10) .distinctUntilChanged() .compose(bindToLifecycle()) - .subscribe(this.referrerStatsTruncatedTextIsGone); + .subscribe(this.referrersTitleIsLimitedCopy); } final private class OrderByBackersReferrerStatsComparator implements Comparator { @@ -89,7 +89,7 @@ public int compare(final @NonNull ProjectStatsEnvelope.ReferrerStats o1, final @ private final Observable>> projectAndReferrerStats; private final PublishSubject referrerStatsListIsGone = PublishSubject.create(); - private final PublishSubject referrerStatsTruncatedTextIsGone = PublishSubject.create(); + private final PublishSubject referrersTitleIsLimitedCopy = PublishSubject.create(); @Override public void projectAndReferrerStatsInput(final @NonNull Pair> projectAndReferrerStats) { @@ -101,8 +101,8 @@ public void projectAndReferrerStatsInput(final @NonNull Pair referrerStatsListIsGone() { return this.referrerStatsListIsGone; } - @Override public @NonNull Observable referrerStatsTruncatedTextIsGone() { - return this.referrerStatsTruncatedTextIsGone; + @Override public @NonNull Observable referrersTitleIsLimitedCopy() { + return this.referrersTitleIsLimitedCopy; } } } diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java index b4605c11f7..2bf17dac2e 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java @@ -40,6 +40,9 @@ interface Outputs { /** Emits when there are more than 10 reward stats. */ Observable rewardsStatsTruncatedTextIsGone(); + + /** Emits when there are more than 10 reward stats and title copy should reflect limited list. */ + Observable rewardsTitleIsLimitedCopy(); } final class ViewModel extends ActivityViewModel implements Inputs, Outputs { @@ -65,10 +68,16 @@ public ViewModel(final @NonNull Environment environment) { .subscribe(this.rewardsStatsListIsGone); sortedRewardStats - .map(pr -> pr.size() <= 10) + .map(rs -> rs.size() <= 10) .distinctUntilChanged() .compose(bindToLifecycle()) .subscribe(this.rewardsStatsTruncatedTextIsGone); + + sortedRewardStats + .map(rs -> rs.size() > 10) + .distinctUntilChanged() + .compose(bindToLifecycle()) + .subscribe(this.rewardsTitleIsLimitedCopy); } final private class OrderByPledgedRewardStatsComparator implements Comparator { @@ -94,6 +103,7 @@ public int compare(final ProjectStatsEnvelope.RewardStats o1, final ProjectStats private final Observable>> projectAndRewardStats; private final PublishSubject rewardsStatsListIsGone = PublishSubject.create(); private final PublishSubject rewardsStatsTruncatedTextIsGone = PublishSubject.create(); + private final PublishSubject rewardsTitleIsLimitedCopy = PublishSubject.create(); @Override public void pledgedColumnTitleClicked() { @@ -113,5 +123,9 @@ public void projectAndRewardStatsInput(final @NonNull Pair rewardsStatsTruncatedTextIsGone() { return this.rewardsStatsTruncatedTextIsGone; } + @Override + public Observable rewardsTitleIsLimitedCopy() { + return this.rewardsTitleIsLimitedCopy; + } } } diff --git a/app/src/main/res/layout/dashboard_funding_view.xml b/app/src/main/res/layout/dashboard_funding_view.xml index 8eafc33898..2d2c7136c3 100644 --- a/app/src/main/res/layout/dashboard_funding_view.xml +++ b/app/src/main/res/layout/dashboard_funding_view.xml @@ -37,7 +37,7 @@ android:layout_height="match_parent" android:layout_alignParentStart="true" android:gravity="center_vertical" - android:text="@string/dashboard_buttons_project" + android:text="@string/View_project" android:textColor="@color/ksr_soft_black" android:textSize="@dimen/callout" /> diff --git a/app/src/main/res/layout/dashboard_referrer_breakdown_layout.xml b/app/src/main/res/layout/dashboard_referrer_breakdown_layout.xml index 77d0961dda..686c8c0588 100644 --- a/app/src/main/res/layout/dashboard_referrer_breakdown_layout.xml +++ b/app/src/main/res/layout/dashboard_referrer_breakdown_layout.xml @@ -6,7 +6,8 @@ android:layout_height="wrap_content" android:divider="@drawable/divider_dark_grey_500_horizontal" android:orientation="vertical" - android:showDividers="beginning"> + android:showDividers="beginning" + android:visibility="gone"> + android:text="@string/How_backers_found_your_project" + android:visibility="gone" /> + android:text="@string/via_kickstarter" /> @@ -118,7 +120,7 @@ + android:text="@string/via_external" /> @@ -163,7 +165,7 @@ + android:text="@string/via_custom" /> diff --git a/app/src/main/res/layout/dashboard_referrer_stats_view.xml b/app/src/main/res/layout/dashboard_referrer_stats_view.xml index 845b940a60..c3a79a7307 100644 --- a/app/src/main/res/layout/dashboard_referrer_stats_view.xml +++ b/app/src/main/res/layout/dashboard_referrer_stats_view.xml @@ -2,20 +2,32 @@ + android:showDividers="beginning"> + + + android:orientation="vertical" + android:paddingEnd="@dimen/grid_2" + android:paddingStart="@dimen/grid_2" + android:showDividers="middle"> @@ -48,9 +60,9 @@ android:text="@string/dashboard_graphs_funding_backers" /> @@ -59,24 +71,17 @@ android:id="@+id/dashboard_referrer_stats_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" - tools:listitem="@layout/dashboard_referrer_stats_row_view"/> + tools:listitem="@layout/dashboard_referrer_stats_row_view" /> - - + android:paddingBottom="@dimen/grid_10" + android:paddingTop="@dimen/grid_10" + android:text="@string/Data_will_appear_here_once" /> diff --git a/app/src/main/res/layout/dashboard_reward_stats_view.xml b/app/src/main/res/layout/dashboard_reward_stats_view.xml index f3250a7482..b7e3d21369 100644 --- a/app/src/main/res/layout/dashboard_reward_stats_view.xml +++ b/app/src/main/res/layout/dashboard_reward_stats_view.xml @@ -4,14 +4,15 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/grid_5" android:layout_marginBottom="@dimen/grid_7" + android:layout_marginTop="@dimen/grid_5" android:orientation="vertical" - android:paddingTop="@dimen/grid_2" + android:paddingEnd="@dimen/grid_2" android:paddingStart="@dimen/grid_2" - android:paddingEnd="@dimen/grid_2"> + android:paddingTop="@dimen/grid_2"> + android:layout_height="wrap_content" + android:orientation="vertical"> + android:paddingBottom="@dimen/grid_10" + android:paddingTop="@dimen/grid_10" + android:text="@string/Data_will_appear_here_once" /> + android:text="@string/To_see_all_rewards_view_your_project" /> diff --git a/app/src/main/res/values-de/strings_i18n.xml b/app/src/main/res/values-de/strings_i18n.xml index ae36c1d9a1..f39ae48fab 100644 --- a/app/src/main/res/values-de/strings_i18n.xml +++ b/app/src/main/res/values-de/strings_i18n.xml @@ -74,6 +74,7 @@ Unterstützer %{creator_name} wird in %{in_duration} live auf Kickstarter streamen Tpps für Projektgründer Tägliche Zusammenfassung + Info wird hier angezeigt, sobald jemand dein Projekt unterstützt. Verschickt Erkunde mehr Projekte. Verwerfen @@ -138,6 +139,7 @@ Unterstützer Alles klar! Alles klar! Deine Antwort auf die Befragung wurde übermittelt. Home + Wie Unterstützer dein Projekt gefunden haben Ich möchte das Projekt einfach nur unterstützen. Individuelle E-Mails Info @@ -247,6 +249,7 @@ Unterstützer Befragung %{reward_survey_count} Befragungen %{reward_survey_count} Befragungen + Belohnung versandt? Voraussichtliche Lieferung der <b>Belohnung</b> im %{delivery_date} Ausgewählte Belohnung %{rewards_count} Belohnungen: @@ -307,7 +310,11 @@ Unterstützer %{time_left} übrig Für schnellen Zugriff auf deine meist besuchten Kategorien, tippe auf das Dropdown-Menü oben. Um diesen Update zum Projekt lesen zu können, musst du ein Unterstützer dieses Projekts sein. Bitte melde dich an oder registriere dich. + Um alle Belohnungen zu sehen, gehe zu deinem Projekt. Umschalten zu Projekt speichern + Woher deine Unterstützungen kommen + Top 10 Quellen deiner Beiträge + Top 10-Belohnungen Anzahl der Beiträge insgesamt %{friend_name} nicht mehr folgen %{friend_name} nicht mehr folgen. @@ -320,8 +327,10 @@ Unterstützer Zukünftige Live-Streams Demnächst: Video von <br/><b>%{creator_name}</b> Beitrag aktualisieren + Hier kannst du nachverfolgen, welche Belohnungen du bereits erhalten hast. Video bis zur Wiederherstellung der Internetverbindung deaktiviert Anzeigen + Projekt ansehen Deinen Finanzierungsbeitrag ansehen Belohnung ansehen Live ansehen @@ -1307,4 +1316,7 @@ gespeichert %{updates_count} Update %{updates_count} Updates %{updates_count} Updates + Benutzerdefiniert + Extern + über Kickstarter diff --git a/app/src/main/res/values-es/strings_i18n.xml b/app/src/main/res/values-es/strings_i18n.xml index 8fc8078119..2a0b6d226d 100644 --- a/app/src/main/res/values-es/strings_i18n.xml +++ b/app/src/main/res/values-es/strings_i18n.xml @@ -74,6 +74,7 @@ patrocinadores %{creator_name} estará trasnmitiendo en vivo en Kickstarter %{in_duration} Consejos para el creador Resumen diario + Los datos aparecerán aquí una vez que alguien patrocine tu proyecto. Entregado Descubre más proyectos. Descartar @@ -138,6 +139,7 @@ patrocinadores ¡Listo! ¡Listo! Hemos recibido tus respuestas a nuestro cuestionario. Inicio + Cómo encontraron tu proyecto los patrocinadores Sólo quiero apoyar este proyecto. Notificaciones por correo electrónico individuales Información @@ -247,6 +249,7 @@ patrocinadores Cuestionario %{reward_survey_count} cuestionarios %{reward_survey_count} cuestionarios + ¿Recompensa entregada? <b>Recompensa</b> estimada para entregarse en %{delivery_date} Recompensa seleccionada %{rewards_count} recompensas: @@ -307,7 +310,11 @@ patrocinadores %{time_left} restantes Accede a tus categorías favoritas en el menú en la parte superior de la app. Sólo los patrocinadores pueden leer esta actualización, por favor inicia sesión o regístrate para continuar. + Para ver todas las recompensas, revisa tu proyecto. Guardar/No guardar este proyecto + Principales fuentes de contribución + Las 10 principales fuentes de contribución + Las 10 mejores recompensas Contribuciones en total Dejar de seguir a %{friend_name} Dejar de seguir a %{friend_name}. @@ -320,8 +327,10 @@ patrocinadores Live streams futuros Próximamente: Video de <br/><b>%{creator_name}</b> Actualizar contribución + Aquí puedes ver las recompensas recibidas. Video desactivado hasta se reestablezca la conexión de internet Ver + Ver proyecto Revisa tu contribución Mostrar recompensa Ver en vivo @@ -1313,4 +1322,7 @@ guardados %{updates_count} actualización %{updates_count} actualizaciones %{updates_count} actualizaciones + a través de personalizados + a través de externos + a través de Kickstarter diff --git a/app/src/main/res/values-fr/strings_i18n.xml b/app/src/main/res/values-fr/strings_i18n.xml index 19c2cd7bf0..63a19a0318 100644 --- a/app/src/main/res/values-fr/strings_i18n.xml +++ b/app/src/main/res/values-fr/strings_i18n.xml @@ -74,6 +74,7 @@ contributeurs %{creator_name} sera en direct sur Kickstarter %{in_duration} Astuces pour créateurs Résumé quotidien + Ces données seront visibles dès que vous aurez reçu votre première contribution. Distribué Découvrez plus de projets. Ignorer @@ -138,6 +139,7 @@ contributeurs Super. Merci ! Vos réponses au questionnaire ont bien été envoyées. Accueil + Comment les contributeurs ont découvert votre projet Je souhaite simplement soutenir le projet. E-mails individuels Info @@ -248,6 +250,7 @@ n\'ont rien soutenu. Questionnaire %{reward_survey_count} questionnaires %{reward_survey_count} questionnaires + Récompense livrée ? <b>Récompense</b> prévue pour %{delivery_date} Récompense sélectionnée %{rewards_count} récompenses : @@ -308,7 +311,11 @@ n\'ont rien soutenu. Plus que %{time_left} Pour retrouver toutes vos catégories préférées, cliquez sur le menu déroulant Découvrir dans l\'application. Seuls les contributeurs ont accès à cette actu de projet. Connectez-vous ou inscrivez-vous pour continuer. + Accéder à votre projet pour voir toutes vos récompenses Enregistrer / ne pas enregistrer ce projet + Vos principales sources de contributions + Vos 10 principales sources de contributions + Les 10 récompenses qui ont le plus de succès Total engagé Ne plus suivre %{friend_name} Désabonnement des actus de %{friend_name}. @@ -321,8 +328,10 @@ n\'ont rien soutenu. Diffusions en direct à venir <br/><b>%{creator_name}</b> bientôt en direct Modifier mon engagement + Utilisez cette fonction pour garder une trace des récompenses que vous avez reçues. Vidéo désactivée en attente d\'une meilleure connexion Internet Afficher + Afficher le projet Afficher mon engagement Afficher ma récompense Regarder en direct @@ -1314,4 +1323,7 @@ projets enregistrés %{updates_count} actu %{updates_count} actus %{updates_count} actus + sites référents personnalisés + sites référents externes + Kickstarter diff --git a/app/src/main/res/values-ja/strings_i18n.xml b/app/src/main/res/values-ja/strings_i18n.xml index bc1a957736..1abbe3821c 100644 --- a/app/src/main/res/values-ja/strings_i18n.xml +++ b/app/src/main/res/values-ja/strings_i18n.xml @@ -73,6 +73,7 @@ %{creator_name} は%{in_duration} にライブ配信を行います アドバイス デイリーダイジェスト + 誰かがプロジェクトをバック(支援)すると、ここにデータが表示されます。 発送済 プロジェクトをさがす 破棄 @@ -137,6 +138,7 @@ 完了 サーベイを送信しました! ホーム + バッカ―があなたのプロジェクトを見つけた経緯 プロジェクトをサポートしたい 個人メール インフォメーション @@ -208,7 +210,7 @@ ライブ配信でチャットに参加するためにはログインかサインアップしてください。 ログインまたはサインアップして、ライブ配信を見よう! プレッジする - Pledge activity + プレッジ プレッジでプロジェクトに生命を。 プロジェクトを探す、プロジェクトにプレッジする、プロジェクトを保存する、全て一つの場所で。 ここにバックした全プロジェクトが表示されます。 @@ -222,7 +224,7 @@ プロジェクトが取り消されました。 プロジェクトを保存しました。 Projects We Love - Projects you\'ve backed + バック(支援)したプロジェクト ローンチしたプロジェクト 公開コメント 大胆な\n @@ -247,6 +249,7 @@ リワードサーベイ %{reward_survey_count} リワードのサーベイ %{reward_survey_count} リワードのサーベイ + リワードを受け取りましたか? <b>リワード</b>の配達予定日は%{delivery_date} 選択中のリワード %{rewards_count} 種類のリワード @@ -307,7 +310,11 @@ あと%{time_left} 上部の「さがす」をタップし、お気に入りカテゴリにアクセス。 このアップデートはバッカー専用です。 続行するにはログインまたはサインアップしてください。 + すべてのリワードを確認するには、プロジェクトをご覧ください。 プロジェクトを保存 + プレッジソースのトップ + プレッジソースのトップ10 + リワードのトップ10 プレッジ総計 %{friend_name} のフォロー解除 %{friend_name} のフォロー解除 @@ -320,8 +327,10 @@ ライブ配信が開始します <br/><b>%{creator_name}</b>が近日配信 プレッジをアップデートする + 受け取ったリワードを確認するにはこちらをご利用ください。 インターネット通信状態が向上するまでビデオはご利用いいただけません。 みる + プロジェクトを見る プレッジをみる リワードをみる ライブをみる @@ -498,7 +507,7 @@ アクティビティ メッセージ アップデートを投稿 - Project + プロジェクト シェア 現在のライブ %{deadline} に達成 @@ -1306,4 +1315,7 @@ iOSの場合、設定からFacebookのアクセスを許可してください。 %{updates_count} 件のアップデート %{updates_count} 件のアップデート %{updates_count} 件のアップデート + リファラー経由 + 外部を経由 + kickstarterを経由 diff --git a/app/src/main/res/values/strings_i18n.xml b/app/src/main/res/values/strings_i18n.xml index 8ddeea19f4..b1ad829c4a 100644 --- a/app/src/main/res/values/strings_i18n.xml +++ b/app/src/main/res/values/strings_i18n.xml @@ -74,6 +74,7 @@ backers %{creator_name} will be streaming live on Kickstarter %{in_duration} Creator tips Daily digest + Data will appear here once somebody backs your project. Delivered Discover more projects. Dismiss @@ -138,6 +139,7 @@ backers Got it. Got it! Your survey response has been submitted. Home + How backers found your project I’d just like to support the project. Individual emails Info @@ -250,6 +252,7 @@ daring ideas. Reward Survey %{reward_survey_count} Reward Surveys %{reward_survey_count} Reward Surveys + Reward delivered? <b>Reward</b> estimated for delivery in %{delivery_date} Reward selected %{rewards_count} rewards: @@ -311,7 +314,11 @@ catch your eye? %{time_left} left To access all your favorite categories, tap the explore dropdown at the top of the app. To read this project update, you must be a backer. Please log in or sign up to continue. + To see all rewards, view your project. Toggle saving this project + Top pledge sources + Top 10 pledge sources + Top 10 rewards Total pledged Unfollow %{friend_name} Unfollows %{friend_name}. @@ -324,8 +331,10 @@ catch your eye? Upcoming live streams Upcoming with<br/><b>%{creator_name}</b> Update pledge + Use this to keep track of which rewards you\'ve received. Video disabled until the internet connection improves View + View project View your pledge View your reward Watch live @@ -1319,4 +1328,7 @@ saved %{updates_count} update %{updates_count} updates %{updates_count} updates + via custom + via external + via Kickstarter diff --git a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java index 1ba14e3a13..8f81b075c8 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java +++ b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java @@ -26,14 +26,14 @@ public class CreatorDashboardReferrerStatsHolderViewModelTest extends KSRobolect private final TestSubscriber projectOutput = new TestSubscriber<>(); private final TestSubscriber referrerStatsListIsGone = new TestSubscriber<>(); private final TestSubscriber> referrerStatsOutput = new TestSubscriber<>(); - private final TestSubscriber referrerStatsTruncatedTextIsGone = new TestSubscriber<>(); + private final TestSubscriber referrersTitleIsLimitedCopy = new TestSubscriber<>(); protected void setUpEnvironment(final @NonNull Environment environment) { this.vm = new CreatorDashboardReferrerStatsHolderViewModel.ViewModel(environment); this.vm.outputs.projectAndReferrerStats().map(PairUtils::first).subscribe(this.projectOutput); this.vm.outputs.projectAndReferrerStats().map(PairUtils::second).subscribe(this.referrerStatsOutput); this.vm.outputs.referrerStatsListIsGone().subscribe(this.referrerStatsListIsGone); - this.vm.outputs.referrerStatsTruncatedTextIsGone().subscribe(this.referrerStatsTruncatedTextIsGone); + this.vm.outputs.referrersTitleIsLimitedCopy().subscribe(this.referrersTitleIsLimitedCopy); } @Test @@ -59,21 +59,21 @@ public void testReferrerStatsListIsGone() { this.vm.inputs.projectAndReferrerStatsInput(Pair.create(project, new ArrayList<>())); this.referrerStatsListIsGone.assertValue(true); - this.referrerStatsTruncatedTextIsGone.assertValue(true); + this.referrersTitleIsLimitedCopy.assertValue(false); this.vm.inputs.projectAndReferrerStatsInput(Pair.create(project, Collections.singletonList(ProjectStatsEnvelopeFactory.ReferrerStatsFactory.referrerStats()))); this.referrerStatsListIsGone.assertValues(true, false); - this.referrerStatsTruncatedTextIsGone.assertValue(true); + this.referrersTitleIsLimitedCopy.assertValue(false); } @Test - public void testReferrerStatsTruncatedTextIsGone() { + public void testReferrersTitleIsLimitedCopy() { setUpEnvironment(environment()); final Project project = ProjectFactory.project(); this.vm.inputs.projectAndReferrerStatsInput(Pair.create(project, Collections.singletonList(ProjectStatsEnvelopeFactory.ReferrerStatsFactory.referrerStats()))); - this.referrerStatsTruncatedTextIsGone.assertValue(true); + this.referrersTitleIsLimitedCopy.assertValue(false); final List maxStats = new ArrayList<>(); for (int i = 1; i <= 10; i++) { @@ -81,10 +81,10 @@ public void testReferrerStatsTruncatedTextIsGone() { } this.vm.inputs.projectAndReferrerStatsInput(Pair.create(project, maxStats)); - this.referrerStatsTruncatedTextIsGone.assertValues(true); + this.referrersTitleIsLimitedCopy.assertValues(false); maxStats.add(ProjectStatsEnvelopeFactory.ReferrerStatsFactory.referrerStats().toBuilder().pledged(11).build()); this.vm.inputs.projectAndReferrerStatsInput(Pair.create(project, maxStats)); - this.referrerStatsTruncatedTextIsGone.assertValues(true, false); + this.referrersTitleIsLimitedCopy.assertValues(false, true); } } diff --git a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java index b6c78c4ffe..be712f589a 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java +++ b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java @@ -27,6 +27,7 @@ public class CreatorDashboardRewardStatsHolderViewModelTest extends KSRobolectri private final TestSubscriber> rewardStatsOutput = new TestSubscriber<>(); private final TestSubscriber rewardsStatsListIsGone = new TestSubscriber<>(); private final TestSubscriber rewardsStatsTruncatedTextIsGone = new TestSubscriber<>(); + private final TestSubscriber rewardsTitleIsLimitedCopy = new TestSubscriber<>(); protected void setUpEnvironment(final @NonNull Environment environment) { this.vm = new CreatorDashboardRewardStatsHolderViewModel.ViewModel(environment); @@ -34,6 +35,7 @@ protected void setUpEnvironment(final @NonNull Environment environment) { this.vm.outputs.projectAndRewardStats().map(PairUtils::second).subscribe(this.rewardStatsOutput); this.vm.outputs.rewardsStatsListIsGone().subscribe(this.rewardsStatsListIsGone); this.vm.outputs.rewardsStatsTruncatedTextIsGone().subscribe(this.rewardsStatsTruncatedTextIsGone); + this.vm.outputs.rewardsTitleIsLimitedCopy().subscribe(this.rewardsTitleIsLimitedCopy); } @Test @@ -87,4 +89,26 @@ public void testRewardsStatsTruncatedTextIsGone() { this.vm.inputs.projectAndRewardStatsInput(Pair.create(project, maxStats)); this.rewardsStatsTruncatedTextIsGone.assertValues(true, false); } + + @Test + public void rewardsTitleIsLimitedCopy() { + setUpEnvironment(environment()); + + final Project project = ProjectFactory.project(); + this.vm.inputs.projectAndRewardStatsInput(Pair.create(project, Collections.singletonList(ProjectStatsEnvelopeFactory.RewardStatsFactory.rewardStats()))); + + this.rewardsTitleIsLimitedCopy.assertValue(false); + + final List maxStats = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + maxStats.add(ProjectStatsEnvelopeFactory.RewardStatsFactory.rewardStats().toBuilder().pledged(i).build()); + } + + this.vm.inputs.projectAndRewardStatsInput(Pair.create(project, maxStats)); + this.rewardsTitleIsLimitedCopy.assertValues(false); + + maxStats.add(ProjectStatsEnvelopeFactory.RewardStatsFactory.rewardStats().toBuilder().pledged(11).build()); + this.vm.inputs.projectAndRewardStatsInput(Pair.create(project, maxStats)); + this.rewardsTitleIsLimitedCopy.assertValues(false, true); + } } From 67185b05e9e2f5b338d372792fb83a1e70f642aa Mon Sep 17 00:00:00 2001 From: Izzy Oji Date: Wed, 21 Feb 2018 12:28:07 -0500 Subject: [PATCH 2/4] sentence casing top rewards string with tests --- .../java/com/kickstarter/libs/utils/StringUtils.java | 7 +++++++ .../CreatorDashboardRewardStatsViewHolder.java | 4 +++- .../java/com/kickstarter/libs/utils/StringUtilsTest.java | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java b/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java index fce71a3eb1..9276418c4a 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java +++ b/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java @@ -19,6 +19,13 @@ public static boolean isPresent(final @Nullable String str) { return !isEmpty(str); } + /** + * Returns a string with only the first character capitalized. + */ + public static @NonNull String sentenceCase(final @NonNull String str) { + return str.length() <= 1 ? str.toUpperCase() : str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase(); + } + /** * Returns a string wrapped in parentheses. */ diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java index 750ea65f2d..ac82eff9ee 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java @@ -9,6 +9,7 @@ import android.widget.TextView; import com.kickstarter.R; +import com.kickstarter.libs.utils.StringUtils; import com.kickstarter.libs.utils.ViewUtils; import com.kickstarter.models.Project; import com.kickstarter.services.apiresponses.ProjectStatsEnvelope; @@ -69,7 +70,8 @@ public CreatorDashboardRewardStatsViewHolder(final @NonNull View view) { } private void setTitleCopy(final boolean shouldShowLimitedCopy) { - this.rewardsTitleTextView.setText(shouldShowLimitedCopy ? this.topTenRewardsString : this.topRewardsString); + final String formattedTopRewards = StringUtils.sentenceCase(this.topRewardsString); + this.rewardsTitleTextView.setText(shouldShowLimitedCopy ? this.topTenRewardsString : formattedTopRewards); } private void toggleRecyclerViewAndEmptyStateVisibility(final @NonNull Boolean gone) { diff --git a/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java b/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java index 0b7a337cdb..e219a83c50 100644 --- a/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java +++ b/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java @@ -31,4 +31,13 @@ public void testIsPresent() { assertTrue(StringUtils.isPresent("a")); assertTrue(StringUtils.isPresent(" a ")); } + + @Test + public void testSentenceCase() { + assertEquals("Apple", StringUtils.sentenceCase("APPLE")); + assertEquals("Apple", StringUtils.sentenceCase("APple")); + assertEquals("Apple", StringUtils.sentenceCase("apple")); + assertEquals("Snapple apple", StringUtils.sentenceCase("Snapple Apple")); + assertEquals("Snapple apple snapple", StringUtils.sentenceCase("Snapple Apple Snapple")); + } } From 0bd2c3f6788eb784c61bc3acbc01cc9c8d89e5c5 Mon Sep 17 00:00:00 2001 From: Izzy Oji Date: Wed, 21 Feb 2018 12:55:17 -0500 Subject: [PATCH 3/4] little did i know, i needed to specify a locale --- .../main/java/com/kickstarter/libs/utils/StringUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java b/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java index 9276418c4a..6e95a62c64 100644 --- a/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java +++ b/app/src/main/java/com/kickstarter/libs/utils/StringUtils.java @@ -4,6 +4,8 @@ import android.support.annotation.Nullable; import android.util.Patterns; +import java.util.Locale; + public final class StringUtils { private StringUtils() {} @@ -23,7 +25,9 @@ public static boolean isPresent(final @Nullable String str) { * Returns a string with only the first character capitalized. */ public static @NonNull String sentenceCase(final @NonNull String str) { - return str.length() <= 1 ? str.toUpperCase() : str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase(); + return str.length() <= 1 + ? str.toUpperCase(Locale.getDefault()) + : str.substring(0, 1).toUpperCase(Locale.getDefault()) + str.substring(1).toLowerCase(Locale.getDefault()); } /** From eb272341087afef489fed8eadbbb004a6ed44306 Mon Sep 17 00:00:00 2001 From: Izzy Oji Date: Wed, 21 Feb 2018 16:34:35 -0500 Subject: [PATCH 4/4] PR feedback: -renaming -adding more test cases --- .../CreatorDashboardReferrerStatsViewHolder.java | 6 +++--- .../viewholders/CreatorDashboardRewardStatsViewHolder.java | 6 +++--- .../CreatorDashboardReferrerStatsHolderViewModel.java | 4 ++-- .../CreatorDashboardRewardStatsHolderViewModel.java | 4 ++-- .../java/com/kickstarter/libs/utils/StringUtilsTest.java | 2 ++ .../CreatorDashboardReferrerStatsHolderViewModelTest.java | 2 +- .../CreatorDashboardRewardStatsHolderViewModelTest.java | 2 +- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java index 232ec3df2f..f0f88a6cad 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardReferrerStatsViewHolder.java @@ -54,14 +54,14 @@ public CreatorDashboardReferrerStatsViewHolder(final @NonNull View view) { .compose(observeForUI()) .subscribe(this::toggleRecyclerViewAndEmptyStateVisibility); - this.viewModel.outputs.referrersTitleIsLimitedCopy() + this.viewModel.outputs.referrersTitleIsTopTen() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::setTitleCopy); } - private void setTitleCopy(final boolean shouldShowLimitedCopy) { - this.referrerTitleTextView.setText(shouldShowLimitedCopy ? this.topTenPledgeSourcesString : this.topPledgeSourcesString); + private void setTitleCopy(final boolean shouldTitleHaveIsTen) { + this.referrerTitleTextView.setText(shouldTitleHaveIsTen ? this.topTenPledgeSourcesString : this.topPledgeSourcesString); } private void toggleRecyclerViewAndEmptyStateVisibility(final @NonNull Boolean gone) { diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java index ac82eff9ee..703c336732 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardRewardStatsViewHolder.java @@ -63,15 +63,15 @@ public CreatorDashboardRewardStatsViewHolder(final @NonNull View view) { .compose(observeForUI()) .subscribe(gone -> ViewUtils.setGone(this.truncatedTextView, gone)); - this.viewModel.outputs.rewardsTitleIsLimitedCopy() + this.viewModel.outputs.rewardsTitleIsTopTen() .compose(bindToLifecycle()) .compose(observeForUI()) .subscribe(this::setTitleCopy); } - private void setTitleCopy(final boolean shouldShowLimitedCopy) { + private void setTitleCopy(final boolean referrersTitleIsTopTen) { final String formattedTopRewards = StringUtils.sentenceCase(this.topRewardsString); - this.rewardsTitleTextView.setText(shouldShowLimitedCopy ? this.topTenRewardsString : formattedTopRewards); + this.rewardsTitleTextView.setText(referrersTitleIsTopTen ? this.topTenRewardsString : formattedTopRewards); } private void toggleRecyclerViewAndEmptyStateVisibility(final @NonNull Boolean gone) { diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java index 0e1b91b99d..38597b5caf 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModel.java @@ -36,7 +36,7 @@ interface Outputs { Observable referrerStatsListIsGone(); /** Emits when there are more than 10 referrer stats and title copy should reflect limited list. */ - Observable referrersTitleIsLimitedCopy(); + Observable referrersTitleIsTopTen(); } final class ViewModel extends ActivityViewModel implements Inputs, Outputs { @@ -101,7 +101,7 @@ public void projectAndReferrerStatsInput(final @NonNull Pair referrerStatsListIsGone() { return this.referrerStatsListIsGone; } - @Override public @NonNull Observable referrersTitleIsLimitedCopy() { + @Override public @NonNull Observable referrersTitleIsTopTen() { return this.referrersTitleIsLimitedCopy; } } diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java index 2bf17dac2e..4088ec5e5b 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModel.java @@ -42,7 +42,7 @@ interface Outputs { Observable rewardsStatsTruncatedTextIsGone(); /** Emits when there are more than 10 reward stats and title copy should reflect limited list. */ - Observable rewardsTitleIsLimitedCopy(); + Observable rewardsTitleIsTopTen(); } final class ViewModel extends ActivityViewModel implements Inputs, Outputs { @@ -124,7 +124,7 @@ public void projectAndRewardStatsInput(final @NonNull Pair rewardsTitleIsLimitedCopy() { + public Observable rewardsTitleIsTopTen() { return this.rewardsTitleIsLimitedCopy; } } diff --git a/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java b/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java index e219a83c50..950e958ac4 100644 --- a/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java +++ b/app/src/test/java/com/kickstarter/libs/utils/StringUtilsTest.java @@ -34,6 +34,8 @@ public void testIsPresent() { @Test public void testSentenceCase() { + assertEquals("", StringUtils.sentenceCase("")); + assertEquals("A", StringUtils.sentenceCase("a")); assertEquals("Apple", StringUtils.sentenceCase("APPLE")); assertEquals("Apple", StringUtils.sentenceCase("APple")); assertEquals("Apple", StringUtils.sentenceCase("apple")); diff --git a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java index 8f81b075c8..518127f28d 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java +++ b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardReferrerStatsHolderViewModelTest.java @@ -33,7 +33,7 @@ protected void setUpEnvironment(final @NonNull Environment environment) { this.vm.outputs.projectAndReferrerStats().map(PairUtils::first).subscribe(this.projectOutput); this.vm.outputs.projectAndReferrerStats().map(PairUtils::second).subscribe(this.referrerStatsOutput); this.vm.outputs.referrerStatsListIsGone().subscribe(this.referrerStatsListIsGone); - this.vm.outputs.referrersTitleIsLimitedCopy().subscribe(this.referrersTitleIsLimitedCopy); + this.vm.outputs.referrersTitleIsTopTen().subscribe(this.referrersTitleIsLimitedCopy); } @Test diff --git a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java index be712f589a..230896d567 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java +++ b/app/src/test/java/com/kickstarter/viewmodels/CreatorDashboardRewardStatsHolderViewModelTest.java @@ -35,7 +35,7 @@ protected void setUpEnvironment(final @NonNull Environment environment) { this.vm.outputs.projectAndRewardStats().map(PairUtils::second).subscribe(this.rewardStatsOutput); this.vm.outputs.rewardsStatsListIsGone().subscribe(this.rewardsStatsListIsGone); this.vm.outputs.rewardsStatsTruncatedTextIsGone().subscribe(this.rewardsStatsTruncatedTextIsGone); - this.vm.outputs.rewardsTitleIsLimitedCopy().subscribe(this.rewardsTitleIsLimitedCopy); + this.vm.outputs.rewardsTitleIsTopTen().subscribe(this.rewardsTitleIsLimitedCopy); } @Test