Skip to content

Commit

Permalink
Merge pull request #777 from StepicOrg/release/1.162
Browse files Browse the repository at this point in the history
Release/1.162
  • Loading branch information
rostikjoystick authored Feb 25, 2021
2 parents a99c963 + a10ac5d commit e2f753f
Show file tree
Hide file tree
Showing 56 changed files with 1,335 additions and 154 deletions.
2 changes: 1 addition & 1 deletion app/src/main/java/org/stepic/droid/core/ScreenManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public interface ScreenManager {

void showPdfInBrowserByGoogleDocs(Activity activity, String fullPath);

void openComments(Activity context, @NonNull DiscussionThread discussionThread, @NonNull Step step, @Nullable Long discussionId, boolean needOpenForm);
void openComments(Activity context, @NonNull DiscussionThread discussionThread, @NonNull Step step, @Nullable Long discussionId, boolean needOpenForm, boolean isTeacher);

void showSteps(Activity sourceActivity, @NotNull Unit unit, @NotNull Lesson lesson, @NotNull Section section);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -559,9 +559,9 @@ public void showPdfInBrowserByGoogleDocs(Activity activity, String fullPath) {
}

@Override
public void openComments(Activity context, @NonNull DiscussionThread discussionThread, @NonNull Step step, @Nullable Long discussionId, boolean needOpenForm) {
public void openComments(Activity context, @NonNull DiscussionThread discussionThread, @NonNull Step step, @Nullable Long discussionId, boolean needOpenForm, boolean isTeacher) {
analytic.reportEvent(Analytic.Screens.OPEN_COMMENT);
context.startActivity(CommentsActivity.Companion.createIntent(context, step, discussionThread, discussionId, needOpenForm));
context.startActivity(CommentsActivity.Companion.createIntent(context, step, discussionThread, discussionId, needOpenForm, isTeacher));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.stepic.droid.storage.migration

import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import org.stepik.android.cache.course_collection.structure.DbStructureCourseCollection

object MigrationFrom63To64 : Migration(63, 64) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE ${DbStructureCourseCollection.TABLE_NAME} ADD COLUMN ${DbStructureCourseCollection.Columns.SIMILAR_AUTHORS} TEXT")
db.execSQL("ALTER TABLE ${DbStructureCourseCollection.TABLE_NAME} ADD COLUMN ${DbStructureCourseCollection.Columns.SIMILAR_COURSE_LISTS} TEXT")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ object Migrations {
MigrationFrom59To60,
MigrationFrom60To61,
MigrationFrom61To62,
MigrationFrom62To63
MigrationFrom62To63,
MigrationFrom63To64
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ import org.stepik.android.domain.visited_courses.model.VisitedCourse
)
abstract class AppDatabase : RoomDatabase() {
companion object {
const val VERSION = 63
const val VERSION = 64
const val NAME = "stepic_database.db"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ constructor(databaseOperations: DatabaseOperations) : DaoBase<CourseCollection>(
persistentObject.id.toString()

override fun getContentValues(persistentObject: CourseCollection): ContentValues =
ContentValues(7)
ContentValues(9)
.apply {
put(DbStructureCourseCollection.Columns.ID, persistentObject.id)
put(DbStructureCourseCollection.Columns.POSITION, persistentObject.position)
Expand All @@ -34,6 +34,8 @@ constructor(databaseOperations: DatabaseOperations) : DaoBase<CourseCollection>(
put(DbStructureCourseCollection.Columns.COURSES, DbParseHelper.parseLongListToString(persistentObject.courses))
put(DbStructureCourseCollection.Columns.DESCRIPTION, persistentObject.description)
put(DbStructureCourseCollection.Columns.PLATFORM, persistentObject.platform)
put(DbStructureCourseCollection.Columns.SIMILAR_AUTHORS, DbParseHelper.parseLongListToString(persistentObject.similarAuthors))
put(DbStructureCourseCollection.Columns.SIMILAR_COURSE_LISTS, DbParseHelper.parseLongListToString(persistentObject.similarCourseLists))
}

override fun parsePersistentObject(cursor: Cursor): CourseCollection =
Expand All @@ -44,6 +46,8 @@ constructor(databaseOperations: DatabaseOperations) : DaoBase<CourseCollection>(
cursor.getString(DbStructureCourseCollection.Columns.LANGUAGE)!!,
DbParseHelper.parseStringToLongList(cursor.getString(DbStructureCourseCollection.Columns.COURSES)) ?: listOf(),
cursor.getString(DbStructureCourseCollection.Columns.DESCRIPTION)!!,
cursor.getInt(DbStructureCourseCollection.Columns.PLATFORM)
cursor.getInt(DbStructureCourseCollection.Columns.PLATFORM),
DbParseHelper.parseStringToLongList(cursor.getString(DbStructureCourseCollection.Columns.SIMILAR_AUTHORS)) ?: listOf(),
DbParseHelper.parseStringToLongList(cursor.getString(DbStructureCourseCollection.Columns.SIMILAR_COURSE_LISTS)) ?: listOf()
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ object DbStructureCourseCollection {
const val COURSES = "courses"
const val DESCRIPTION = "description"
const val PLATFORM = "platform"

const val SIMILAR_AUTHORS = "similar_authors"
const val SIMILAR_COURSE_LISTS = "similar_course_lists"
}

const val TABLE_SCHEMA =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import ru.nobird.android.domain.rx.doCompletableOnSuccess
import org.stepik.android.data.submission.source.SubmissionCacheDataSource
import org.stepik.android.data.submission.source.SubmissionRemoteDataSource
import org.stepik.android.domain.base.DataSourceType
import org.stepik.android.domain.filter.model.SubmissionsFilterQuery
import org.stepik.android.domain.submission.repository.SubmissionRepository
import org.stepik.android.model.Submission
import javax.inject.Inject
Expand Down Expand Up @@ -45,8 +46,8 @@ constructor(
}
}

override fun getSubmissionsForStep(stepId: Long, userId: Long?, status: Submission.Status?, page: Int): Single<PagedList<Submission>> =
submissionRemoteDataSource.getSubmissionsForStep(stepId, userId, status, page)
override fun getSubmissionsForStep(stepId: Long, submissionsFilterQuery: SubmissionsFilterQuery, page: Int): Single<PagedList<Submission>> =
submissionRemoteDataSource.getSubmissionsForStep(stepId, submissionsFilterQuery, page)

override fun removeSubmissionsForAttempt(attemptId: Long): Completable =
submissionCacheDataSource.removeSubmissionsForAttempt(attemptId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package org.stepik.android.data.submission.source

import io.reactivex.Single
import org.stepic.droid.util.PagedList
import org.stepik.android.domain.filter.model.SubmissionsFilterQuery
import org.stepik.android.model.Submission

interface SubmissionRemoteDataSource {
fun createSubmission(submission: Submission): Single<Submission>
fun getSubmissionsForAttempt(attemptId: Long): Single<List<Submission>>
fun getSubmissionsForStep(stepId: Long, userId: Long?, status: Submission.Status?, page: Int): Single<PagedList<Submission>>
fun getSubmissionsForStep(stepId: Long, submissionsFilterQuery: SubmissionsFilterQuery, page: Int): Single<PagedList<Submission>>
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,124 @@
package org.stepik.android.domain.course_collection.interactor

import io.reactivex.Flowable
import io.reactivex.Single
import io.reactivex.rxkotlin.Singles.zip
import org.stepic.droid.util.PagedList
import org.stepik.android.domain.base.DataSourceType
import org.stepik.android.domain.catalog.model.CatalogAuthor
import org.stepik.android.domain.catalog.model.CatalogCourseList
import org.stepik.android.domain.course.analytic.CourseViewSource
import org.stepik.android.domain.course.model.SourceTypeComposition
import org.stepik.android.domain.course_collection.model.CourseCollectionResult
import org.stepik.android.domain.course_collection.repository.CourseCollectionRepository
import org.stepik.android.domain.course_list.interactor.CourseListInteractor
import org.stepik.android.domain.course_list.model.CourseListItem
import org.stepik.android.domain.user.repository.UserRepository
import org.stepik.android.model.CourseCollection
import javax.inject.Inject

class CourseCollectionInteractor
@Inject
constructor(
private val courseCollectionRepository: CourseCollectionRepository
private val courseListInteractor: CourseListInteractor,
private val courseCollectionRepository: CourseCollectionRepository,
private val userRepository: UserRepository
) {
fun getCourseCollection(id: Long, dataSource: DataSourceType): Single<CourseCollection> =
companion object {
private const val PAGE_SIZE = 20
}

fun getCourseCollectionResult(id: Long, viewSource: CourseViewSource): Flowable<CourseCollectionResult> =
Flowable
.fromArray(SourceTypeComposition.CACHE, SourceTypeComposition.REMOTE)
.concatMapSingle { sourceType ->
getCourseCollection(id, sourceType.generalSourceType)
.flatMap { collection ->
if (collection.courses.isEmpty()) {
Single.just(
CourseCollectionResult(
courseCollection = collection,
courseListDataItems = PagedList(emptyList()),
courseListItems = emptyList(),
sourceType = sourceType.generalSourceType
)
)
} else {
resolveCollectionLoading(collection, sourceType, viewSource)
}
}
}

fun getCourseListItems(
courseId: List<Long>,
courseViewSource: CourseViewSource,
sourceTypeComposition: SourceTypeComposition = SourceTypeComposition.REMOTE
): Single<PagedList<CourseListItem.Data>> =
courseListInteractor.getCourseListItems(courseId, courseViewSource, sourceTypeComposition)

private fun getCourseCollection(id: Long, dataSource: DataSourceType): Single<CourseCollection> =
courseCollectionRepository
.getCourseCollections(id, dataSource)

private fun getSimilarCourseLists(ids: List<Long>, dataSource: DataSourceType): Single<List<CatalogCourseList>> =
courseCollectionRepository
.getCourseCollections(ids, dataSource)
.map { it.map { courseCollection ->
CatalogCourseList(
id = courseCollection.id,
title = courseCollection.title,
description = courseCollection.description,
courses = courseCollection.courses,
coursesCount = courseCollection.courses.size
)
} }

private fun getSimilarAuthorLists(ids: List<Long>, dataSource: DataSourceType): Single<List<CatalogAuthor>> =
userRepository
.getUsers(ids, dataSource)
.map { it.map { user ->
CatalogAuthor(
id = user.id,
isOrganization = user.isOrganization,
fullName = user.fullName ?: "",
alias = null,
avatar = user.avatar ?: "",
createdCoursesCount = user.createdCoursesCount.toInt(),
followersCount = user.followersCount.toInt()
)
} }

private fun resolveCollectionLoading(collection: CourseCollection, sourceType: SourceTypeComposition, viewSource: CourseViewSource): Single<CourseCollectionResult> =
zip(
courseListInteractor.getCourseListItems(
courseIds =
if (collection.similarCourseLists.isNotEmpty() || collection.similarAuthors.isNotEmpty()) {
collection.courses
} else {
collection.courses.take(PAGE_SIZE)
},
sourceTypeComposition = sourceType,
courseViewSource = viewSource
),
getSimilarCourseLists(collection.similarCourseLists, dataSource = sourceType.generalSourceType),
getSimilarAuthorLists(collection.similarAuthors, dataSource = sourceType.generalSourceType)
) { items, similarCourses, authors ->
CourseCollectionResult(
courseCollection = collection,
courseListDataItems = items,
courseListItems = items + formHorizontalLists(authors, similarCourses),
sourceType = sourceType.generalSourceType
)
}

private fun formHorizontalLists(authors: List<CatalogAuthor>, similarCourses: List<CatalogCourseList>): List<CourseListItem> {
val list = mutableListOf<CourseListItem>()
if (authors.isNotEmpty()) {
list += CourseListItem.SimilarAuthors(authors)
}
if (similarCourses.isNotEmpty()) {
list += CourseListItem.SimilarCourses(similarCourses)
}
return list
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.stepik.android.domain.course_collection.model

import org.stepic.droid.util.PagedList
import org.stepik.android.domain.base.DataSourceType
import org.stepik.android.domain.course_list.model.CourseListItem
import org.stepik.android.model.CourseCollection

data class CourseCollectionResult(
val courseCollection: CourseCollection,
val courseListDataItems: PagedList<CourseListItem.Data>,
val courseListItems: List<CourseListItem>,
val sourceType: DataSourceType
)
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ constructor(
.reduce(emptyList()) { a, b -> a + b }

fun getCourseListItems(
courseId: List<Long>,
courseIds: List<Long>,
courseViewSource: CourseViewSource,
sourceTypeComposition: SourceTypeComposition = SourceTypeComposition.REMOTE
): Single<PagedList<CourseListItem.Data>> =
getCourseListItems(
coursesSource = courseRepository.getCourses(courseId, primarySourceType = sourceTypeComposition.generalSourceType),
coursesSource = courseRepository.getCourses(courseIds, primarySourceType = sourceTypeComposition.generalSourceType),
courseViewSource = courseViewSource,
sourceTypeComposition = sourceTypeComposition
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ constructor(
private fun getCourseListItems(courseIds: List<Long>): Single<PagedList<CourseListItem.Data>> =
courseListInteractor
.getCourseListItems(
courseId = courseIds,
courseIds = courseIds,
courseViewSource = CourseViewSource.Visited,
sourceTypeComposition = SourceTypeComposition.CACHE
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.stepik.android.domain.course_list.model

import org.stepik.android.domain.catalog.model.CatalogAuthor
import org.stepik.android.domain.catalog.model.CatalogCourseList
import org.stepik.android.domain.course.analytic.CourseViewSource
import org.stepik.android.domain.course.model.CourseStats
import org.stepik.android.model.Course
Expand All @@ -19,4 +21,8 @@ sealed class CourseListItem {
class PlaceHolder(val courseId: Long = -1) : CourseListItem()

object ViewAll : CourseListItem()

data class SimilarCourses(val similarCourses: List<CatalogCourseList>) : CourseListItem()

data class SimilarAuthors(val similarAuthors: List<CatalogAuthor>) : CourseListItem()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.stepik.android.domain.filter.model

import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.android.parcel.Parcelize
import ru.nobird.android.core.model.mapOfNotNull

@Parcelize
data class SubmissionsFilterQuery(
@SerializedName("user")
val user: Long? = null,
@SerializedName("order")
val order: Order? = null,
@SerializedName("status")
val status: String? = null,
@SerializedName("review_status")
val reviewStatus: ReviewStatus? = null,
@SerializedName("search")
val search: String? = null
) : Parcelable {
companion object {
private const val USER = "user"
private const val ORDER = "order"
private const val STATUS = "status"
private const val REVIEW_STATUS = "review_status"
private const val SEARCH = "search"

val DEFAULT_QUERY = SubmissionsFilterQuery(order = Order.DESC)
}
enum class Order(val order: String) {
@SerializedName("desc")
DESC("desc"),
@SerializedName("asc")
ASC("asc")
}

enum class ReviewStatus(val reviewStatus: String) {
@SerializedName("awaiting")
AWAITING("awaiting"),
@SerializedName("done")
DONE("done")
}

fun toMap(): Map<String, String> =
mapOfNotNull(
USER to user?.toString(),
STATUS to status,
ORDER to order?.order,
REVIEW_STATUS to reviewStatus?.reviewStatus,
SEARCH to search
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import ru.nobird.android.domain.rx.maybeFirst
import ru.nobird.android.domain.rx.toMaybe
import org.stepik.android.domain.attempt.repository.AttemptRepository
import org.stepik.android.domain.base.DataSourceType
import org.stepik.android.domain.filter.model.SubmissionsFilterQuery
import org.stepik.android.domain.lesson.model.LessonData
import org.stepik.android.domain.step_quiz.model.StepQuizRestrictions
import org.stepik.android.domain.submission.repository.SubmissionRepository
Expand Down Expand Up @@ -119,7 +120,7 @@ constructor(

private fun getStepSubmissionCount(stepId: Long): Single<Int> =
submissionRepository
.getSubmissionsForStep(stepId)
.getSubmissionsForStep(stepId, SubmissionsFilterQuery())
.map { it.size }
.onErrorReturnItem(0)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.stepik.android.domain.submission.interactor

import io.reactivex.Maybe
import org.stepic.droid.preferences.UserPreferences
import org.stepik.android.domain.filter.model.SubmissionsFilterQuery
import ru.nobird.android.domain.rx.maybeFirst
import org.stepik.android.domain.submission.repository.SubmissionRepository
import org.stepik.android.model.Submission
Expand All @@ -15,7 +16,7 @@ constructor(
) {
fun getLastSubmission(stepId: Long): Maybe<Submission> =
submissionRepository
.getSubmissionsForStep(stepId, userPreferences.userId)
.getSubmissionsForStep(stepId, SubmissionsFilterQuery(user = userPreferences.userId))
.map { it as List<Submission> }
.maybeFirst()
}
Loading

0 comments on commit e2f753f

Please sign in to comment.