diff --git a/app/src/main/graphql/fragments.graphql b/app/src/main/graphql/fragments.graphql index 09185eaac..99956d79f 100644 --- a/app/src/main/graphql/fragments.graphql +++ b/app/src/main/graphql/fragments.graphql @@ -68,6 +68,9 @@ fragment fullProject on Project { creator { ... user } + flagging { + kind + } currency canComment prelaunchActivated diff --git a/app/src/main/java/com/kickstarter/models/Project.kt b/app/src/main/java/com/kickstarter/models/Project.kt index d8e217962..3a366b257 100644 --- a/app/src/main/java/com/kickstarter/models/Project.kt +++ b/app/src/main/java/com/kickstarter/models/Project.kt @@ -60,7 +60,8 @@ class Project private constructor( private val projectFaqs: List?, private val envCommitments: List?, private val risks: String?, - private val story: String? + private val story: String?, + private val isFlagged: Boolean? ) : Parcelable, Relay { fun availableCardTypes() = this.availableCardTypes fun backersCount() = this.backersCount @@ -111,6 +112,7 @@ class Project private constructor( fun envCommitments() = this.envCommitments fun risks() = this.risks fun story() = this.story + fun isFlagged() = this.isFlagged @Parcelize data class Builder( @@ -163,7 +165,8 @@ class Project private constructor( private var projectFaqs: List? = emptyList(), private var envCommitments: List? = emptyList(), private var risks: String? = "", - private var story: String? = "" + private var story: String? = "", + private var isFlagged: Boolean? = null ) : Parcelable { fun availableCardTypes(availableCardTypes: List?) = apply { this.availableCardTypes = availableCardTypes } fun backersCount(backersCount: Int?) = apply { this.backersCount = backersCount ?: 0 } @@ -214,6 +217,7 @@ class Project private constructor( fun envCommitments(envCommitments: List?) = apply { this.envCommitments = envCommitments ?: emptyList() } fun risks(risks: String?) = apply { this.risks = risks ?: "" } fun story(story: String?) = apply { this.story = story ?: "" } + fun isFlagged(isFlagged: Boolean?) = apply { this.isFlagged = isFlagged } fun build() = Project( availableCardTypes = availableCardTypes, backersCount = backersCount, @@ -263,7 +267,8 @@ class Project private constructor( projectFaqs = projectFaqs, envCommitments = envCommitments, risks = risks, - story = story + story = story, + isFlagged = isFlagged ) } @@ -316,7 +321,8 @@ class Project private constructor( projectFaqs = projectFaqs, envCommitments = envCommitments, risks = risks, - story = story + story = story, + isFlagged = isFlagged ) @kotlin.annotation.Retention(AnnotationRetention.SOURCE) @@ -481,7 +487,9 @@ class Project private constructor( video() == other.video() && projectFaqs() == other.projectFaqs() && envCommitments() == other.envCommitments() && - risks() == other.risks() + risks() == other.risks() && + story() == other.story() && + isFlagged() == other.isFlagged() } return equals } diff --git a/app/src/main/java/com/kickstarter/services/transformers/GraphQLTransformers.kt b/app/src/main/java/com/kickstarter/services/transformers/GraphQLTransformers.kt index 7fa23ab6f..fe08300b5 100644 --- a/app/src/main/java/com/kickstarter/services/transformers/GraphQLTransformers.kt +++ b/app/src/main/java/com/kickstarter/services/transformers/GraphQLTransformers.kt @@ -311,6 +311,7 @@ fun projectTransformer(projectFragment: FullProject?): Project { val risks = projectFragment?.risks() val story = projectFragment?.story()?.toString() ?: "" val userCanComment = projectFragment?.canComment() ?: false + val isFlagged = projectFragment?.flagging()?.kind()?.let { true } ?: false return Project.builder() .availableCardTypes(availableCards.map { it.name }) @@ -362,6 +363,7 @@ fun projectTransformer(projectFragment: FullProject?): Project { .envCommitments(eCommitment) .risks(risks) .story(story) + .isFlagged(isFlagged) .build() } diff --git a/app/src/main/java/com/kickstarter/ui/fragments/projectpage/ProjectOverviewFragment.kt b/app/src/main/java/com/kickstarter/ui/fragments/projectpage/ProjectOverviewFragment.kt index b8e1d46c5..bcb3bc8f5 100644 --- a/app/src/main/java/com/kickstarter/ui/fragments/projectpage/ProjectOverviewFragment.kt +++ b/app/src/main/java/com/kickstarter/ui/fragments/projectpage/ProjectOverviewFragment.kt @@ -366,6 +366,13 @@ class ProjectOverviewFragment : BaseFragment binding.projectCreatorInfoLayout.reportProject.setGone(!it) } + viewModel.outputs.shouldShowProjectFlagged() + .compose(bindToLifecycle()) + .compose(Transformers.observeForUI()) + .subscribe { + binding.projectCreatorInfoLayout.projectFlagged.setGone(!it) + } + binding.projectCreatorDashboardHeader.projectDashboardButton.setOnClickListener { this.viewModel.inputs.creatorDashboardClicked() } diff --git a/app/src/main/java/com/kickstarter/viewmodels/projectpage/ProjectOverviewViewModel.kt b/app/src/main/java/com/kickstarter/viewmodels/projectpage/ProjectOverviewViewModel.kt index 879236f15..9895afe1d 100644 --- a/app/src/main/java/com/kickstarter/viewmodels/projectpage/ProjectOverviewViewModel.kt +++ b/app/src/main/java/com/kickstarter/viewmodels/projectpage/ProjectOverviewViewModel.kt @@ -183,6 +183,7 @@ interface ProjectOverviewViewModel { fun startReportProjectView(): Observable fun startLoginView(): Observable fun shouldShowReportProject(): Observable + fun shouldShowProjectFlagged(): Observable } class ViewModel(environment: Environment) : FragmentViewModel(environment), Inputs, Outputs { @@ -253,6 +254,7 @@ interface ProjectOverviewViewModel { private val startReportProjectView: Observable private val startLogin = PublishSubject.create() private val shouldShowReportProject: Observable + private val shouldShowProjectFlagged: Observable val inputs: Inputs = this val outputs: Outputs = this @@ -471,6 +473,10 @@ interface ProjectOverviewViewModel { return this.shouldShowReportProject } + override fun shouldShowProjectFlagged(): Observable { + return this.shouldShowProjectFlagged + } + init { val project = projectData .distinctUntilChanged() @@ -763,7 +769,16 @@ interface ProjectOverviewViewModel { this.startLogin.onNext(null) } - shouldShowReportProject = Observable.just(this.optimizely?.isFeatureEnabled(OptimizelyFeature.Key.ANDROID_UGC) ?: false) + shouldShowProjectFlagged = project + .map { it.isFlagged() ?: false } + .withLatestFrom(Observable.just(this.optimizely?.isFeatureEnabled(OptimizelyFeature.Key.ANDROID_UGC) ?: false)) { isFlagged, isEnabled -> + return@withLatestFrom isEnabled && isFlagged + } + + shouldShowReportProject = shouldShowProjectFlagged + .withLatestFrom(Observable.just(this.optimizely?.isFeatureEnabled(OptimizelyFeature.Key.ANDROID_UGC) ?: false)) { isFlagged, isEnabled -> + return@withLatestFrom isEnabled && !isFlagged + } projectData .compose(Transformers.takePairWhen(campaignClicked)) diff --git a/app/src/main/res/layout/fragment_project_overview.xml b/app/src/main/res/layout/fragment_project_overview.xml index 9ead9ed72..5d5664747 100644 --- a/app/src/main/res/layout/fragment_project_overview.xml +++ b/app/src/main/res/layout/fragment_project_overview.xml @@ -170,6 +170,7 @@ diff --git a/app/src/main/res/layout/project_creator_info.xml b/app/src/main/res/layout/project_creator_info.xml index 2f572519a..c85a57553 100644 --- a/app/src/main/res/layout/project_creator_info.xml +++ b/app/src/main/res/layout/project_creator_info.xml @@ -87,7 +87,8 @@ android:focusable="true" android:foreground="?android:attr/selectableItemBackground" android:paddingTop="@dimen/grid_2" - android:paddingBottom="@dimen/grid_2"> + android:paddingBottom="@dimen/grid_2" + android:visibility="gone"> - - + + + + + + + + + + "The largest risk comes from the creation/manufacturing of the pins at the pin factory. We are working with a vendor in China, who has lots of experience in projects for us. Still, there is a chance that something may go wrong during the manufacturing process and if that happens it could cause a delay in shipping. It can be common in the pin-making world that manus are delayed or make mistakes with an order. However, we don’t anticipate this being an issue, as our vendor has done many similar projects with us, but there is always a possibility. These items are handmade! If anything does happen, we will make sure to keep everyone informed and up to date regarding where we are in the process. The timeline for shipping is NOT solid due to these factors but we will keep all backers updated each step of the way. Also- Please be aware, there might be a delay due to the situation with the COVID-19 virus. This is causing delays all over the world as shipping gets limited, cities shutting down services and other issues arise. At this point, we do not think this will impact our project timeline. However, we cannot predict how things will go and our pin factory is located in China (they are all back at work now and we have gotten pins from them within the last month, so things appear to be going well now.) If this will affect our production, I will inform everyone through an update as soon as I know." - Report this project to Kickstarter + + It looks like you’ve already reported this project to us. Our Trust and Safety team will screen your report against Our Rules and Community Guidelines. Thanks for your feedback! + Report this project to Kickstarter diff --git a/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt b/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt index 4d1f9e906..0a01171ff 100644 --- a/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt +++ b/app/src/test/java/com/kickstarter/viewmodels/ProjectOverviewViewModelTest.kt @@ -86,6 +86,7 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() { private val startReportProjectView = TestSubscriber() private val startLoginView = TestSubscriber() private val shouldShowReportProject = TestSubscriber() + private val shouldShowProjectFlagged = TestSubscriber() private fun setUpEnvironment(environment: Environment, projectData: ProjectData) { vm = ProjectOverviewViewModel.ViewModel(environment) @@ -147,6 +148,7 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() { vm.outputs.shouldShowReportProject().subscribe(shouldShowReportProject) vm.outputs.startLoginView().subscribe(startLoginView) vm.outputs.startReportProjectView().subscribe(startReportProjectView) + vm.outputs.shouldShowProjectFlagged().subscribe(shouldShowProjectFlagged) vm.inputs.configureWith(projectData) } @@ -689,6 +691,18 @@ class ProjectOverviewViewModelTest : KSRobolectricTestCase() { this.startReportProjectView.assertValue(projectData) } + @Test + fun testProjectReported() { + val env = environmentForFeatureFlag(true) + val project = ProjectFactory.project().toBuilder() + .isFlagged(true) + .build() + setUpEnvironment(env, project(project)) + + this.shouldShowProjectFlagged.assertValue(true) + this.shouldShowReportProject.assertValue(false) + } + private fun environmentForFeatureFlag(enabled: Boolean): Environment { val mockExperimentsClientType: MockExperimentsClientType = object : MockExperimentsClientType() {