Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mark as Read on Open and Scroll #1025

Merged
merged 27 commits into from
Aug 3, 2023
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
beb6fba
Mark as read on open and scroll option
IzakJoubert Jul 12, 2023
897a447
Mark as read on open and scroll option
IzakJoubert Jul 12, 2023
a62f335
Merge branch 'main' into issue/403
ZJouba Jul 12, 2023
286175b
Fixing mark all
IzakJoubert Jul 12, 2023
d1df954
Merge branch 'issue/403' of https://github.com/ZJouba/jerboa into iss…
IzakJoubert Jul 12, 2023
cdb4ee1
Merge branch 'main' into issue/403
IzakJoubert Jul 12, 2023
1a9860f
Update Http.kt
ZJouba Jul 12, 2023
8a23a7e
Merge branch 'main' into issue/403
ZJouba Jul 13, 2023
96f35c3
Update Home in PostActivity
IzakJoubert Jul 13, 2023
37b251c
Merge branch 'main' into issue/403
ZJouba Jul 13, 2023
6dab5b6
Updates and merge conflict fixes
IzakJoubert Jul 20, 2023
f297596
Merged main
IzakJoubert Jul 20, 2023
c6aa4a9
Merge remote-tracking branch 'upstream/main' into issue/403
IzakJoubert Jul 24, 2023
4d4375f
Merge branch 'main' into issue/403
ZJouba Jul 27, 2023
ccd7f46
Check if read first and use appState to launch coroutine
IzakJoubert Jul 27, 2023
7d6c6d8
Adding back migration
IzakJoubert Jul 27, 2023
1083197
Removing dev
IzakJoubert Jul 27, 2023
29dd480
Removing unused functions
IzakJoubert Jul 28, 2023
e7987ee
Merge branch 'main' into issue/403
ZJouba Jul 28, 2023
94190d1
Merge remote-tracking branch 'upstream/main' into issue/403
IzakJoubert Aug 3, 2023
2d964eb
Fixing merge conflicts
IzakJoubert Aug 3, 2023
b5de940
Fixing migration
IzakJoubert Aug 3, 2023
74300ac
New account check
IzakJoubert Aug 3, 2023
942b810
Merging ifs
IzakJoubert Aug 3, 2023
92d3a96
Removed manual mark as read
IzakJoubert Aug 3, 2023
0e2576c
Only for Accounts
IzakJoubert Aug 3, 2023
690f4b5
Trigger woodpecker
IzakJoubert Aug 3, 2023
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
35 changes: 29 additions & 6 deletions app/src/main/java/com/jerboa/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import com.jerboa.model.AccountViewModelFactory
import com.jerboa.model.AppSettingsViewModel
import com.jerboa.model.AppSettingsViewModelFactory
import com.jerboa.model.CommunityViewModel
import com.jerboa.model.HomeViewModel
import com.jerboa.model.ReplyItem
import com.jerboa.model.SiteViewModel
import com.jerboa.ui.components.comment.edit.CommentEditActivity
Expand Down Expand Up @@ -108,9 +109,13 @@ class MainActivity : AppCompatActivity() {

setContent {
val ctx = LocalContext.current
val accountViewModel: AccountViewModel = viewModel(factory = AccountViewModelFactory.Factory)
val appSettingsViewModel: AppSettingsViewModel = viewModel(factory = AppSettingsViewModelFactory.Factory)
val accountSettingsViewModel: AccountSettingsViewModel = viewModel(factory = AccountSettingsViewModelFactory.Factory)
val accountViewModel: AccountViewModel =
viewModel(factory = AccountViewModelFactory.Factory)
val appSettingsViewModel: AppSettingsViewModel =
viewModel(factory = AppSettingsViewModelFactory.Factory)
val accountSettingsViewModel: AccountSettingsViewModel =
viewModel(factory = AccountSettingsViewModelFactory.Factory)
val homeViewModel: HomeViewModel = viewModel()

API.errorHandler = {
Log.e("jerboa", it.toString())
Expand Down Expand Up @@ -154,9 +159,13 @@ class MainActivity : AppCompatActivity() {
BackConfirmationMode.Toast -> {
[email protected](navController, ctx)
}

BackConfirmationMode.Dialog -> {
[email protected](navController) { showConfirmationDialog.value = true }
[email protected](navController) {
showConfirmationDialog.value = true
}
}

BackConfirmationMode.None -> {}
}

Expand All @@ -178,13 +187,18 @@ class MainActivity : AppCompatActivity() {
when (val siteRes = siteViewModel.siteRes) {
is ApiState.Success -> {
val siteVersion = siteRes.data.version
if (compareVersions(siteVersion, MINIMUM_API_VERSION) < 0 && !serverVersionOutdatedViewed.value) {
if (compareVersions(
siteVersion,
MINIMUM_API_VERSION,
) < 0 && !serverVersionOutdatedViewed.value
) {
ShowOutdatedServerDialog(
siteVersion = siteVersion,
onConfirm = { serverVersionOutdatedViewed.value = true },
)
}
}

else -> {}
}

Expand Down Expand Up @@ -241,6 +255,7 @@ class MainActivity : AppCompatActivity() {
appSettingsViewModel = appSettingsViewModel,
appSettings = appSettings,
drawerState = drawerState,
homeViewModel = homeViewModel,
)
}

Expand Down Expand Up @@ -272,6 +287,7 @@ class MainActivity : AppCompatActivity() {
useCustomTabs = appSettings.useCustomTabs,
usePrivateTabs = appSettings.usePrivateTabs,
blurNSFW = appSettings.blurNSFW,
markAsReadOnScroll = appSettings.markAsReadOnScroll,
)
}

Expand Down Expand Up @@ -304,6 +320,7 @@ class MainActivity : AppCompatActivity() {
useCustomTabs = appSettings.useCustomTabs,
usePrivateTabs = appSettings.usePrivateTabs,
blurNSFW = appSettings.blurNSFW,
markAsReadOnScroll = appSettings.markAsReadOnScroll,
)
}

Expand Down Expand Up @@ -372,6 +389,7 @@ class MainActivity : AppCompatActivity() {
blurNSFW = appSettings.blurNSFW,
drawerState = drawerState,
openImageViewer = navController::toView,
markAsReadOnScroll = appSettings.markAsReadOnScroll,
)
}

Expand Down Expand Up @@ -405,6 +423,7 @@ class MainActivity : AppCompatActivity() {
blurNSFW = appSettings.blurNSFW,
drawerState = drawerState,
openImageViewer = navController::toView,
markAsReadOnScroll = appSettings.markAsReadOnScroll,
)
}

Expand Down Expand Up @@ -497,6 +516,7 @@ class MainActivity : AppCompatActivity() {
PostActivity(
id = Either.Left(args.id),
accountViewModel = accountViewModel,
homeViewModel = homeViewModel,
navController = navController,
showCollapsedCommentContent = appSettings.showCollapsedCommentContent,
showActionBarByDefault = appSettings.showCommentActionBarByDefault,
Expand All @@ -515,7 +535,9 @@ class MainActivity : AppCompatActivity() {
composable(
route = Route.COMMENT,
deepLinks = DEFAULT_LEMMY_INSTANCES.map { instance ->
navDeepLink { uriPattern = "$instance/comment/{${Route.CommentArgs.ID}}" }
navDeepLink {
uriPattern = "$instance/comment/{${Route.CommentArgs.ID}}"
}
},
arguments = listOf(
navArgument(Route.CommentArgs.ID) {
Expand All @@ -527,6 +549,7 @@ class MainActivity : AppCompatActivity() {
PostActivity(
id = Either.Right(args.id),
accountViewModel = accountViewModel,
homeViewModel = homeViewModel,
navController = navController,
useCustomTabs = appSettings.useCustomTabs,
usePrivateTabs = appSettings.usePrivateTabs,
Expand Down
13 changes: 12 additions & 1 deletion app/src/main/java/com/jerboa/api/Http.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@ interface API {
@POST("post/like")
suspend fun likePost(@Body form: CreatePostLike): Response<PostResponse>

/**
* Mark post as read.
*/
@POST("post/mark_as_read")
suspend fun markAsRead(@Body form: MarkPostAsRead): Response<PostResponse>

/**
* Like / vote on a comment.
*/
Expand Down Expand Up @@ -290,7 +296,12 @@ interface API {
.build()
}
}
.addInterceptor(CustomHttpLoggingInterceptor(REDACTED_QUERY_PARAMS, REDACTED_BODY_FIELDS))
.addInterceptor(
CustomHttpLoggingInterceptor(
REDACTED_QUERY_PARAMS,
REDACTED_BODY_FIELDS,
),
)
.build()

return Retrofit.Builder()
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/jerboa/db/AppDB.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ val APP_SETTINGS_DEFAULT = AppSettings(
blurNSFW = true,
showTextDescriptionsInNavbar = true,
backConfirmationMode = 1,
markAsReadOnScroll = false,
)

@Database(
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/java/com/jerboa/db/AppDBMigrations.kt
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,15 @@ val MIGRATION_19_20 = object : Migration(19, 20) {
}
}

val MIGRATION_20_21 = object : Migration(19, 20) {
ZJouba marked this conversation as resolved.
Show resolved Hide resolved
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UPDATE_APP_CHANGELOG_UNVIEWED)
database.execSQL(
"ALTER TABLE AppSettings ADD COLUMN markAsReadOnScroll INTEGER NOT NULL DEFAULT 0",
)
}
}

// Don't forget to test your migration with `./gradlew app:connectAndroidTest`
val MIGRATIONS_LIST = arrayOf(
MIGRATION_1_2,
Expand All @@ -282,4 +291,5 @@ val MIGRATIONS_LIST = arrayOf(
MIGRATION_17_18,
MIGRATION_18_19,
MIGRATION_19_20,
MIGRATION_20_21,
)
5 changes: 5 additions & 0 deletions app/src/main/java/com/jerboa/db/entity/AppSettings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ data class AppSettings(
defaultValue = "1",
)
val showTextDescriptionsInNavbar: Boolean,
@ColumnInfo(
name = "markAsReadOnScroll",
defaultValue = "0",
)
val markAsReadOnScroll: Boolean,
@ColumnInfo(
name = "backConfirmationMode",
defaultValue = "1",
Expand Down
50 changes: 27 additions & 23 deletions app/src/main/java/com/jerboa/model/CommunityViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,11 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.jerboa.*
import com.jerboa.api.API
import com.jerboa.api.ApiState
import com.jerboa.api.apiWrapper
import com.jerboa.datatypes.types.BlockCommunity
import com.jerboa.datatypes.types.BlockCommunityResponse
import com.jerboa.datatypes.types.BlockPerson
import com.jerboa.datatypes.types.BlockPersonResponse
import com.jerboa.datatypes.types.CommunityId
import com.jerboa.datatypes.types.CommunityResponse
import com.jerboa.datatypes.types.CreatePostLike
import com.jerboa.datatypes.types.DeletePost
import com.jerboa.datatypes.types.FollowCommunity
import com.jerboa.datatypes.types.GetCommunity
import com.jerboa.datatypes.types.GetCommunityResponse
import com.jerboa.datatypes.types.GetPosts
import com.jerboa.datatypes.types.GetPostsResponse
import com.jerboa.datatypes.types.PostResponse
import com.jerboa.datatypes.types.PostView
import com.jerboa.datatypes.types.SavePost
import com.jerboa.datatypes.types.SortType
import com.jerboa.findAndUpdatePost
import com.jerboa.mergePosts
import com.jerboa.serializeToMap
import com.jerboa.showBlockCommunityToast
import com.jerboa.showBlockPersonToast
import com.jerboa.datatypes.types.*
import com.jerboa.ui.components.common.Initializable
import kotlinx.coroutines.launch

Expand All @@ -53,6 +33,7 @@ class CommunityViewModel : ViewModel(), Initializable {
private var blockCommunityRes: ApiState<BlockCommunityResponse> by
mutableStateOf(ApiState.Empty)
private var blockPersonRes: ApiState<BlockPersonResponse> by mutableStateOf(ApiState.Empty)
private var markPostRes: ApiState<PostResponse> by mutableStateOf(ApiState.Empty)

var sortType by mutableStateOf(SortType.Active)
private set
Expand Down Expand Up @@ -118,8 +99,16 @@ class CommunityViewModel : ViewModel(), Initializable {
if (newRes.data.posts.isEmpty()) { // Hit the end of the posts
prevPage()
}
ApiState.Success(GetPostsResponse(mergePosts(oldRes.data.posts, newRes.data.posts)))
ApiState.Success(
GetPostsResponse(
mergePosts(
oldRes.data.posts,
newRes.data.posts,
),
),
)
}

else -> {
prevPage()
oldRes
Expand Down Expand Up @@ -247,4 +236,19 @@ class CommunityViewModel : ViewModel(), Initializable {
else -> {}
}
}

fun markPostAsRead(form: MarkPostAsRead) {
viewModelScope.launch {
markPostRes = ApiState.Loading
markPostRes = apiWrapper(API.getInstance().markAsRead(form))

when (val markRes = markPostRes) {
is ApiState.Success -> {
updatePost(markRes.data.post_view)
}

else -> {}
}
}
}
}
55 changes: 53 additions & 2 deletions app/src/main/java/com/jerboa/model/HomeViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ import com.jerboa.datatypes.types.BlockPerson
import com.jerboa.datatypes.types.BlockPersonResponse
import com.jerboa.datatypes.types.CreatePostLike
import com.jerboa.datatypes.types.DeletePost
import com.jerboa.datatypes.types.GetPost
import com.jerboa.datatypes.types.GetPostResponse
import com.jerboa.datatypes.types.GetPosts
import com.jerboa.datatypes.types.GetPostsResponse
import com.jerboa.datatypes.types.ListingType
import com.jerboa.datatypes.types.MarkPostAsRead
import com.jerboa.datatypes.types.PostResponse
import com.jerboa.datatypes.types.PostView
import com.jerboa.datatypes.types.SavePost
Expand All @@ -38,11 +41,14 @@ class HomeViewModel : ViewModel(), Initializable {
var postsRes: ApiState<GetPostsResponse> by mutableStateOf(ApiState.Empty)
private set

private var postRes: ApiState<GetPostResponse> by mutableStateOf(ApiState.Empty)

private var likePostRes: ApiState<PostResponse> by mutableStateOf(ApiState.Empty)
private var savePostRes: ApiState<PostResponse> by mutableStateOf(ApiState.Empty)
private var deletePostRes: ApiState<PostResponse> by mutableStateOf(ApiState.Empty)
private var blockCommunityRes: ApiState<BlockCommunityResponse> by mutableStateOf(ApiState.Empty)
private var blockPersonRes: ApiState<BlockPersonResponse> by mutableStateOf(ApiState.Empty)
private var markPostRes: ApiState<PostResponse> by mutableStateOf(ApiState.Empty)

var sortType by mutableStateOf(SortType.Active)
private set
Expand Down Expand Up @@ -97,8 +103,16 @@ class HomeViewModel : ViewModel(), Initializable {
if (newRes.data.posts.isEmpty()) { // Hit the end of the posts
prevPage()
}
ApiState.Success(GetPostsResponse(mergePosts(oldRes.data.posts, newRes.data.posts)))
ApiState.Success(
GetPostsResponse(
mergePosts(
oldRes.data.posts,
newRes.data.posts,
),
),
)
}

else -> {
prevPage()
oldRes
Expand Down Expand Up @@ -169,7 +183,28 @@ class HomeViewModel : ViewModel(), Initializable {

fun updateFromAccount(account: Account) {
updateSortType(SortType.values().getOrElse(account.defaultSortType) { sortType })
updateListingType(ListingType.values().getOrElse(account.defaultListingType) { listingType })
updateListingType(
ListingType.values().getOrElse(account.defaultListingType) { listingType },
)
}

fun refreshSinglePost(id: Int, account: Account) {
viewModelScope.launch {
val postForm = GetPost(id = id, auth = account.jwt)
MV-GH marked this conversation as resolved.
Show resolved Hide resolved
postRes = apiWrapper(API.getInstance().getPost(postForm.serializeToMap()))
val refreshedPost = postRes
val existing = postsRes
when {
refreshedPost is ApiState.Success && existing is ApiState.Success -> {
val refreshedPosts =
findAndUpdatePost(existing.data.posts, refreshedPost.data.post_view)
val newPosts = ApiState.Success(existing.data.copy(posts = refreshedPosts))
postsRes = newPosts
}

else -> {}
}
}
}

fun updatePost(postView: PostView) {
Expand All @@ -179,6 +214,7 @@ class HomeViewModel : ViewModel(), Initializable {
val newRes = ApiState.Success(existing.data.copy(posts = newPosts))
postsRes = newRes
}

else -> {}
}
}
Expand Down Expand Up @@ -216,4 +252,19 @@ class HomeViewModel : ViewModel(), Initializable {
auth = jwt,
)
}

fun markPostAsRead(form: MarkPostAsRead) {
viewModelScope.launch {
markPostRes = ApiState.Loading
markPostRes = apiWrapper(API.getInstance().markAsRead(form))

when (val markRes = markPostRes) {
is ApiState.Success -> {
updatePost(markRes.data.post_view)
}

else -> {}
}
}
}
}
Loading