From cdfbc2b1d4cf892cf8aaa242413e6468bac04743 Mon Sep 17 00:00:00 2001 From: Izzy Oji Date: Wed, 31 Jan 2018 14:48:57 -0500 Subject: [PATCH 1/3] start of project switcher --- .../CreatorDashboardBottomSheetAdapter.java | 9 ++++++++- .../main/res/layout/creator_dashboard_layout.xml | 3 ++- .../creator_dashboard_project_switcher_title.xml | 13 +++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/layout/creator_dashboard_project_switcher_title.xml diff --git a/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java b/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java index 079bf87f44..572cac2586 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java +++ b/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java @@ -8,6 +8,7 @@ import com.kickstarter.R; import com.kickstarter.models.Project; import com.kickstarter.ui.viewholders.CreatorDashboardBottomSheetViewHolder; +import com.kickstarter.ui.viewholders.EmptyViewHolder; import com.kickstarter.ui.viewholders.KSViewHolder; import java.util.List; @@ -29,7 +30,13 @@ protected int layout(final @NonNull SectionRow sectionRow) { @Override protected @NonNull KSViewHolder viewHolder(final @LayoutRes int layout, final @NonNull View view) { - return new CreatorDashboardBottomSheetViewHolder(view, this.delegate); + switch (layout) { + case R.layout.creator_dashboard_project_switcher_view: + return new CreatorDashboardBottomSheetViewHolder(view, this.delegate); + case R.layout.creator_dashboard_project_switcher_title: + default: + return new EmptyViewHolder(view); + } } public void takeProjects(final @NonNull List projects) { diff --git a/app/src/main/res/layout/creator_dashboard_layout.xml b/app/src/main/res/layout/creator_dashboard_layout.xml index 7e3ada6774..c58b41fc0e 100644 --- a/app/src/main/res/layout/creator_dashboard_layout.xml +++ b/app/src/main/res/layout/creator_dashboard_layout.xml @@ -23,6 +23,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black_alpha_17" + android:clickable="true" android:fitsSystemWindows="true" android:visibility="gone" /> @@ -33,7 +34,7 @@ + + + + + From a10b1b0f9f5a753f3a19c1350ac9ecc6b6262f7f Mon Sep 17 00:00:00 2001 From: Izzy Oji Date: Fri, 2 Feb 2018 14:41:23 -0500 Subject: [PATCH 2/3] creator tools bottom sheet without current project selected other projects button only shows if creator has multiple projects tests and refactoring --- .../activities/CreatorDashboardActivity.java | 6 +++ .../CreatorDashboardBottomSheetAdapter.java | 17 ++++++-- .../CreatorDashboardHeaderViewHolder.java | 7 +++ ...CreatorDashboardHeaderHolderViewModel.java | 19 +++++++- .../viewmodels/CreatorDashboardViewModel.java | 9 +++- .../res/layout/creator_dashboard_layout.xml | 34 ++++++++++----- ...ator_dashboard_project_switcher_header.xml | 11 +++++ ...eator_dashboard_project_switcher_title.xml | 13 ------ ...reator_dashboard_project_switcher_view.xml | 2 +- app/src/main/res/values/styles.xml | 5 +++ ...torDashboardHeaderHolderViewModelTest.java | 23 ++++++++++ .../CreatorDashboardViewModelTest.java | 43 ++++++++++++------- 12 files changed, 144 insertions(+), 45 deletions(-) create mode 100644 app/src/main/res/layout/creator_dashboard_project_switcher_header.xml delete mode 100644 app/src/main/res/layout/creator_dashboard_project_switcher_title.xml diff --git a/app/src/main/java/com/kickstarter/ui/activities/CreatorDashboardActivity.java b/app/src/main/java/com/kickstarter/ui/activities/CreatorDashboardActivity.java index f55567cf4e..53390616b1 100644 --- a/app/src/main/java/com/kickstarter/ui/activities/CreatorDashboardActivity.java +++ b/app/src/main/java/com/kickstarter/ui/activities/CreatorDashboardActivity.java @@ -25,6 +25,7 @@ import butterknife.Bind; import butterknife.ButterKnife; +import butterknife.OnClick; import static com.kickstarter.libs.rx.transformers.Transformers.observeForUI; @@ -82,6 +83,11 @@ public void back() { } } + @OnClick(R.id.creator_dashboard_bottom_sheet_scrim) + protected void bottomSheetScrimClicked() { + hideBottomSheet(); + } + @Override protected void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java b/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java index 572cac2586..e2cd9100c2 100644 --- a/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java +++ b/app/src/main/java/com/kickstarter/ui/adapters/CreatorDashboardBottomSheetAdapter.java @@ -6,14 +6,18 @@ import android.view.View; import com.kickstarter.R; +import com.kickstarter.models.Empty; import com.kickstarter.models.Project; import com.kickstarter.ui.viewholders.CreatorDashboardBottomSheetViewHolder; import com.kickstarter.ui.viewholders.EmptyViewHolder; import com.kickstarter.ui.viewholders.KSViewHolder; +import java.util.Collections; import java.util.List; public final class CreatorDashboardBottomSheetAdapter extends KSAdapter { + private static final int SECTION_PROJECTS_HEADER = 0; + private static final int SECTION_PROJECTS = 1; private Delegate delegate; @@ -25,7 +29,13 @@ public CreatorDashboardBottomSheetAdapter(final @Nullable Delegate delegate) { @Override protected int layout(final @NonNull SectionRow sectionRow) { - return R.layout.creator_dashboard_project_switcher_view; + switch (sectionRow.section()) { + case SECTION_PROJECTS_HEADER: + return R.layout.creator_dashboard_project_switcher_header; + case SECTION_PROJECTS: + return R.layout.creator_dashboard_project_switcher_view; + } + return R.layout.empty_view; } @Override @@ -33,7 +43,7 @@ protected int layout(final @NonNull SectionRow sectionRow) { switch (layout) { case R.layout.creator_dashboard_project_switcher_view: return new CreatorDashboardBottomSheetViewHolder(view, this.delegate); - case R.layout.creator_dashboard_project_switcher_title: + case R.layout.creator_dashboard_project_switcher_header: default: return new EmptyViewHolder(view); } @@ -41,7 +51,8 @@ protected int layout(final @NonNull SectionRow sectionRow) { public void takeProjects(final @NonNull List projects) { clearSections(); - addSection(projects); + insertSection(SECTION_PROJECTS_HEADER, Collections.singletonList(Empty.get())); + insertSection(SECTION_PROJECTS, projects); notifyDataSetChanged(); } } diff --git a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardHeaderViewHolder.java b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardHeaderViewHolder.java index 74f3ea6eca..e5e25c0ac6 100644 --- a/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardHeaderViewHolder.java +++ b/app/src/main/java/com/kickstarter/ui/viewholders/CreatorDashboardHeaderViewHolder.java @@ -7,6 +7,7 @@ import android.support.v4.content.ContextCompat; import android.util.Pair; import android.view.View; +import android.widget.Button; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; @@ -43,6 +44,7 @@ public final class CreatorDashboardHeaderViewHolder extends KSViewHolder { protected @Bind(R.id.creator_dashboard_funding_text) TextView fundingTextTextView; protected @Bind(R.id.creator_dashboard_messages) RelativeLayout messagesButton; protected @Bind(R.id.creator_dashboard_percent) TextView percentTextView; + protected @Bind(R.id.creator_dashboard_project_selector) Button projectsButton; protected @Bind(R.id.creator_dashboard_time_remaining) TextView timeRemainingTextView; protected @Bind(R.id.creator_dashboard_time_remaining_text) TextView timeRemainingTextTextView; @@ -82,6 +84,11 @@ public CreatorDashboardHeaderViewHolder(final @NonNull View view, final @Nullabl .compose(observeForUI()) .subscribe(ViewUtils.setGone(this.messagesButton)); + this.viewModel.outputs.otherProjectsButtonIsGone() + .compose(bindToLifecycle()) + .compose(observeForUI()) + .subscribe(ViewUtils.setGone(this.projectsButton)); + this.viewModel.outputs.percentageFunded() .compose(bindToLifecycle()) .compose(observeForUI()) diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardHeaderHolderViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardHeaderHolderViewModel.java index c1792a7b89..38d273e05e 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardHeaderHolderViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardHeaderHolderViewModel.java @@ -10,10 +10,12 @@ import com.kickstarter.libs.Environment; import com.kickstarter.libs.RefTag; import com.kickstarter.libs.utils.NumberUtils; +import com.kickstarter.libs.utils.ObjectUtils; import com.kickstarter.libs.utils.PairUtils; import com.kickstarter.libs.utils.ProgressBarUtils; import com.kickstarter.libs.utils.ProjectUtils; import com.kickstarter.models.Project; +import com.kickstarter.models.User; import com.kickstarter.services.apiresponses.ProjectStatsEnvelope; import com.kickstarter.ui.viewholders.CreatorDashboardHeaderViewHolder; @@ -42,6 +44,9 @@ interface Outputs { /** Emits when the messages button should be gone. */ Observable messagesButtonIsGone(); + /** Emits when the other projects button should be gone. */ + Observable otherProjectsButtonIsGone(); + /** string number with the percentage of a projects funding */ Observable percentageFunded(); @@ -75,10 +80,18 @@ public ViewModel(final @NonNull Environment environment) { this.currentUser = environment.currentUser(); + final Observable user = this.currentUser.observable(); + + this.otherProjectsButtonIsGone = user + .map(User::createdProjectsCount) + .filter(ObjectUtils::isNotNull) + .map(count -> count <= 1) + .compose(bindToLifecycle()); + this.currentProject = this.projectAndStats .map(PairUtils::first); - this.messagesButtonIsGone = Observable.zip(this.currentProject, this.currentUser.observable(), Pair::create) + this.messagesButtonIsGone = Observable.zip(this.currentProject, user, Pair::create) .map(projectAndUser -> projectAndUser.first.creator().id() != projectAndUser.second.id()); this.percentageFunded = this.currentProject @@ -123,6 +136,7 @@ public ViewModel(final @NonNull Environment environment) { private final Observable currentProject; private final Observable messagesButtonIsGone; + private final Observable otherProjectsButtonIsGone; private final Observable percentageFunded; private final Observable percentageFundedProgress; private final Observable progressBarBackground; @@ -148,6 +162,9 @@ public ViewModel(final @NonNull Environment environment) { @Override public @NonNull Observable messagesButtonIsGone() { return this.messagesButtonIsGone; } + @Override public @NonNull Observable otherProjectsButtonIsGone() { + return this.otherProjectsButtonIsGone; + } @Override public @NonNull Observable percentageFunded() { return this.percentageFunded; } diff --git a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardViewModel.java b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardViewModel.java index 69de7b9e70..3eab2ddc80 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardViewModel.java +++ b/app/src/main/java/com/kickstarter/viewmodels/CreatorDashboardViewModel.java @@ -79,7 +79,14 @@ public ViewModel(final @NonNull Environment environment) { final Observable projectStatsEnvelope = projectStatsEnvelopeNotification .compose(values()); - this.projectsForBottomSheet = projects; + this.projectsForBottomSheet = Observable.combineLatest( + projects.filter(projectList -> projectList.size() > 1), + this.projectSelected, + (projectList, project) -> Observable + .from(projectList) + .filter(p -> p.id() != project.id()) + .toList()) + .flatMap(listObservable -> listObservable); this.projectSelected .compose(combineLatestPair(projectStatsEnvelope)) diff --git a/app/src/main/res/layout/creator_dashboard_layout.xml b/app/src/main/res/layout/creator_dashboard_layout.xml index c58b41fc0e..bae7435dd8 100644 --- a/app/src/main/res/layout/creator_dashboard_layout.xml +++ b/app/src/main/res/layout/creator_dashboard_layout.xml @@ -27,19 +27,33 @@ android:fitsSystemWindows="true" android:visibility="gone" /> - + android:layout_height="match_parent" + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:layout_weight="1" /> + + + + + + + + - diff --git a/app/src/main/res/layout/creator_dashboard_project_switcher_header.xml b/app/src/main/res/layout/creator_dashboard_project_switcher_header.xml new file mode 100644 index 0000000000..4eeb55e9d4 --- /dev/null +++ b/app/src/main/res/layout/creator_dashboard_project_switcher_header.xml @@ -0,0 +1,11 @@ + + diff --git a/app/src/main/res/layout/creator_dashboard_project_switcher_title.xml b/app/src/main/res/layout/creator_dashboard_project_switcher_title.xml deleted file mode 100644 index c461806522..0000000000 --- a/app/src/main/res/layout/creator_dashboard_project_switcher_title.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/creator_dashboard_project_switcher_view.xml b/app/src/main/res/layout/creator_dashboard_project_switcher_view.xml index f2f1693e69..614f2c87fb 100644 --- a/app/src/main/res/layout/creator_dashboard_project_switcher_view.xml +++ b/app/src/main/res/layout/creator_dashboard_project_switcher_view.xml @@ -5,7 +5,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/click_indicator_light" + android:background="@drawable/click_indicator_light_masked" android:orientation="vertical" android:padding="@dimen/grid_3"> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1e64843273..d98b68510e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -359,6 +359,11 @@ @string/font_family_sans_serif_medium + +