Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,12 @@

<activity
android:name="org.stepik.android.view.auth.ui.activity.RegistrationActivity"
android:windowSoftInputMode="adjustResize" />
android:windowSoftInputMode="adjustNothing" />

<activity
android:name="org.stepik.android.view.auth.ui.activity.CredentialAuthActivity"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustResize" />
android:windowSoftInputMode="adjustNothing" />

<activity
android:name="org.stepic.droid.ui.activities.MainFeedActivity"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,8 @@ import org.stepic.droid.di.home.HomeScope
import org.stepic.droid.di.qualifiers.BackgroundScheduler
import org.stepic.droid.di.qualifiers.MainScheduler
import org.stepic.droid.preferences.SharedPreferenceHelper
import org.stepic.droid.util.StepikUtil
import org.stepik.android.domain.user_activity.repository.UserActivityRepository
import ru.nobird.android.domain.rx.emptyOnErrorStub
import ru.nobird.android.domain.rx.toMaybe
import javax.inject.Inject

@HomeScope
Expand All @@ -32,14 +30,8 @@ constructor(
fun onNeedShowStreak() {
compositeDisposable += Maybe
.fromCallable { sharedPreferences.profile?.id }
.flatMapSingleElement(userActivityRepository::getUserActivities)
.flatMap { userActivities ->
userActivities
.firstOrNull()
?.pins
?.let(StepikUtil::getCurrentStreak)
.toMaybe()
}
.flatMapSingleElement(userActivityRepository::getUserActivitySummary)
.map { it.recentStrike }
.subscribeOn(backgroundScheduler)
.observeOn(mainScheduler)
.subscribeBy(
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/java/org/stepic/droid/di/NotificationModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import org.stepik.android.view.purchase_notification.notification.PurchaseNotifi
import org.stepik.android.view.splash.notification.RemindRegistrationNotificationDelegate
import org.stepik.android.view.splash.notification.RetentionNotificationDelegate
import org.stepik.android.view.streak.notification.StreakNotificationDelegate
import org.stepik.android.view.streak.notification.StreakNotificationScheduler

@Module(includes = [CourseDataModule::class])
interface NotificationModule {
Expand Down Expand Up @@ -54,7 +55,10 @@ interface NotificationModule {
@IntoSet
fun provideStreakNotificationDelegate(streakNotificationDelegate: StreakNotificationDelegate): NotificationDelegate

@Binds
fun bindStreakNotificationScheduler(streakNotificationDelegate: StreakNotificationDelegate): StreakNotificationScheduler

@Binds
@IntoSet
fun providePurchaseNotificationDelegate(purchaseNotificationDelegate: PurchaseNotificationDelegate): NotificationDelegate
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,12 @@
import kotlin.jvm.functions.Function1;

public class SocialAuthAdapter extends RecyclerView.Adapter<SocialAuthAdapter.SocialViewHolder> implements OnItemClickListener {
private SocialNetwork[] socialList;
private Function1<SocialNetwork, Unit> onSocialItemClick;
private final SocialNetwork[] socialList;
private final Function1<SocialNetwork, Unit> onSocialItemClick;

private State state;

public enum State {
EXPANDED(4), NORMAL(3);

public final int multiplier;
State(int multiplier) {
this.multiplier = multiplier;
}
}

public SocialAuthAdapter(Function1<SocialNetwork, Unit> onSocialItemClick, State state) {
public SocialAuthAdapter(Function1<SocialNetwork, Unit> onSocialItemClick) {
this.onSocialItemClick = onSocialItemClick;
socialList = SocialNetwork.values();
if (state == null) {
this.state = State.NORMAL;
} else {
this.state = state;
}
}


Expand All @@ -56,32 +40,14 @@ public void onBindViewHolder(SocialViewHolder holder, int position) {

@Override
public int getItemCount() {
return state.multiplier;
return socialList.length;
}

@Override
public void onItemClick(int position) {
onSocialItemClick.invoke(socialList[position]);
}

public void showMore() {
int start = getItemCount();
state = State.EXPANDED;
int end = getItemCount();
notifyItemRangeInserted(start, end - start);
}

public void showLess() {
int end = getItemCount();
state = State.NORMAL;
int start = getItemCount();
notifyItemRangeRemoved(start, end - start);
}

public State getState() {
return state;
}

static class SocialViewHolder extends RecyclerView.ViewHolder {
private final ImageView imageView;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import io.reactivex.Single
import org.stepik.android.data.user_activity.source.UserActivityRemoteDataSource
import org.stepik.android.domain.user_activity.repository.UserActivityRepository
import org.stepik.android.model.user.UserActivity
import org.stepik.android.model.user.UserActivitySummary
import javax.inject.Inject

class UserActivityRepositoryImpl
Expand All @@ -14,4 +15,7 @@ constructor(

override fun getUserActivities(userId: Long): Single<List<UserActivity>> =
userActivityRemoteDataSource.getUserActivities(userId)

override fun getUserActivitySummary(userId: Long): Single<UserActivitySummary> =
userActivityRemoteDataSource.getUserActivitySummary(userId)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package org.stepik.android.data.user_activity.source

import io.reactivex.Single
import org.stepik.android.model.user.UserActivity
import org.stepik.android.model.user.UserActivitySummary

interface UserActivityRemoteDataSource {
fun getUserActivities(userId: Long): Single<List<UserActivity>>

fun getUserActivitySummary(userId: Long): Single<UserActivitySummary>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@ package org.stepik.android.domain.profile_activities.interactor
import io.reactivex.Single
import org.stepik.android.domain.profile_activities.model.ProfileActivitiesData
import org.stepik.android.domain.user_activity.repository.UserActivityRepository
import org.stepik.android.model.user.UserActivity
import ru.nobird.android.domain.rx.first
import org.stepik.android.model.user.UserActivitySummary
import javax.inject.Inject
import kotlin.math.max

class ProfileActivitiesInteractor
@Inject
Expand All @@ -15,28 +13,14 @@ constructor(
) {
fun getProfileActivities(userId: Long): Single<ProfileActivitiesData> =
userActivityRepository
.getUserActivities(userId)
.first()
.getUserActivitySummary(userId)
.map(::mapToProfileActivities)

private fun mapToProfileActivities(userActivity: UserActivity): ProfileActivitiesData {
var streak = 0
var maxStreak = 0
var buffer = 0

for (i in 0..userActivity.pins.size) {
val pin = userActivity.pins.getOrElse(i) { 0 }
if (pin > 0) {
buffer++
} else {
maxStreak = max(maxStreak, buffer)
if (buffer == i || buffer == i - 1) { // first is solved today, second not solved
streak = buffer
}
buffer = 0
}
}

return ProfileActivitiesData(userActivity.pins, streak, maxStreak, isSolvedToday = userActivity.pins[0] > 0)
}
private fun mapToProfileActivities(userActivitySummary: UserActivitySummary): ProfileActivitiesData =
ProfileActivitiesData(
pins = userActivitySummary.pins,
streak = userActivitySummary.recentStrike,
maxStreak = userActivitySummary.maxStrike,
isSolvedToday = userActivitySummary.solvedToday > 0
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@ package org.stepik.android.domain.streak.interactor

import io.reactivex.Maybe
import org.stepic.droid.preferences.SharedPreferenceHelper
import org.stepic.droid.util.StepikUtil
import ru.nobird.android.domain.rx.toMaybe
import org.stepik.android.domain.user_activity.repository.UserActivityRepository
import org.stepik.android.view.streak.notification.StreakNotificationDelegate
import org.stepik.android.view.streak.notification.StreakNotificationScheduler
import javax.inject.Inject

class StreakInteractor
@Inject
constructor(
private val userActivityRepository: UserActivityRepository,
private val sharedPreferenceHelper: SharedPreferenceHelper,
private val streakNotificationDelegate: StreakNotificationDelegate
private val streakNotificationScheduler: StreakNotificationScheduler
) {

fun needShowStreakDialog(): Boolean =
Expand All @@ -24,14 +22,13 @@ constructor(
fun onNeedShowStreak(): Maybe<Int> =
Maybe
.fromCallable { sharedPreferenceHelper.profile?.id }
.flatMapSingleElement { userActivityRepository.getUserActivities(it) }
.flatMap { it.firstOrNull()?.pins.toMaybe() }
.map { StepikUtil.getCurrentStreak(it) }
.flatMapSingleElement { userActivityRepository.getUserActivitySummary(it) }
.map { it.recentStrike }

fun setStreakTime(timeIntervalCode: Int) {
sharedPreferenceHelper.isStreakNotificationEnabled = true
sharedPreferenceHelper.timeNotificationCode = timeIntervalCode
streakNotificationDelegate.scheduleStreakNotification()
streakNotificationScheduler.scheduleStreakNotification()
}

fun wasStreakDialogSeenOnHomeScreen(): Boolean =
Expand All @@ -49,4 +46,4 @@ constructor(

private fun isAuthResponseFromStore(): Boolean =
sharedPreferenceHelper.authResponseFromStore != null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package org.stepik.android.domain.user_activity.repository

import io.reactivex.Single
import org.stepik.android.model.user.UserActivity
import org.stepik.android.model.user.UserActivitySummary

interface UserActivityRepository {
fun getUserActivities(userId: Long): Single<List<UserActivity>>

fun getUserActivitySummary(userId: Long): Single<UserActivitySummary>
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import io.reactivex.Single
import io.reactivex.functions.Function
import org.stepik.android.data.user_activity.source.UserActivityRemoteDataSource
import org.stepik.android.model.user.UserActivity
import org.stepik.android.model.user.UserActivitySummary
import org.stepik.android.remote.user_activity.model.UserActivityResponse
import org.stepik.android.remote.user_activity.model.UserActivitySummaryResponse
import org.stepik.android.remote.user_activity.service.UserActivityService
import javax.inject.Inject

Expand All @@ -16,8 +18,16 @@ constructor(
private val userActivityResponseMapper =
Function<UserActivityResponse, List<UserActivity>>(UserActivityResponse::userActivities)

private val userActivitySummaryResponseMapper =
Function<UserActivitySummaryResponse, UserActivitySummary> { it.userActivitySummaries.first() }

override fun getUserActivities(userId: Long): Single<List<UserActivity>> =
userActivityService
.getUserActivitiesReactive(userId)
.map(userActivityResponseMapper)

override fun getUserActivitySummary(userId: Long): Single<UserActivitySummary> =
userActivityService
.getUserActivitySummaryReactive(userId)
.map(userActivitySummaryResponseMapper)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.stepik.android.remote.user_activity.model

import com.google.gson.annotations.SerializedName
import org.stepik.android.model.Meta
import org.stepik.android.model.user.UserActivitySummary
import org.stepik.android.remote.base.model.MetaResponse

class UserActivitySummaryResponse(
@SerializedName("meta")
override val meta: Meta,
@SerializedName("user-activity-summaries")
val userActivitySummaries: List<UserActivitySummary>
) : MetaResponse
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@ package org.stepik.android.remote.user_activity.service

import io.reactivex.Single
import org.stepik.android.remote.user_activity.model.UserActivityResponse
import org.stepik.android.remote.user_activity.model.UserActivitySummaryResponse
import retrofit2.http.GET
import retrofit2.http.Path

interface UserActivityService {
@GET("api/user-activities/{userId}")
fun getUserActivitiesReactive(@Path("userId") userId: Long): Single<UserActivityResponse>

@GET("api/user-activity-summaries/{userId}")
fun getUserActivitySummaryReactive(@Path("userId") userId: Long): Single<UserActivitySummaryResponse>
}
Loading