Skip to content

Commit

Permalink
- Create readable content feature
Browse files Browse the repository at this point in the history
  • Loading branch information
DesarrolloAntonio committed May 29, 2024
1 parent c98f5f7 commit e2309af
Show file tree
Hide file tree
Showing 23 changed files with 527 additions and 17 deletions.
9 changes: 9 additions & 0 deletions data/src/main/java/com/desarrollodroide/data/mapper/Mapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -155,5 +155,14 @@ fun LoginResponseMessageDTO.toDomainModel() = LoginResponseMessage(
token = token?:""
)

fun ReadableContentResponseDTO.toDomainModel() = ReadableContent(
ok = ok?:false,
message = message?.toDomainModel() ?: ReadableMessage("", "")
)

fun ReadableMessageDto.toDomainModel() = ReadableMessage(
content = content?:"",
html = html?:""
)


Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.paging.PagingData
import kotlinx.coroutines.flow.Flow
import com.desarrollodroide.model.Bookmark
import com.desarrollodroide.common.result.Result
import com.desarrollodroide.model.ReadableContent
import com.desarrollodroide.model.Tag
import com.desarrollodroide.model.UpdateCachePayload

Expand Down Expand Up @@ -53,4 +54,10 @@ interface BookmarksRepository {
serverUrl: String,
updateCachePayload: UpdateCachePayload
): Flow<Result<Bookmark>>

fun getBookmarkReadableContent(
token: String,
serverUrl: String,
bookmarkId: Int
): Flow<Result<ReadableContent>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ import com.desarrollodroide.data.local.room.dao.BookmarksDao
import com.desarrollodroide.data.mapper.*
import com.desarrollodroide.data.repository.paging.BookmarkPagingSource
import com.desarrollodroide.model.Bookmark
import com.desarrollodroide.model.ReadableContent
import com.desarrollodroide.model.Tag
import com.desarrollodroide.model.UpdateCachePayload
import com.desarrollodroide.network.model.BookmarkDTO
import com.desarrollodroide.network.model.BookmarkResponseDTO
import com.desarrollodroide.network.model.BookmarksDTO
import com.desarrollodroide.network.model.ReadableContentResponseDTO
import com.desarrollodroide.network.retrofit.NetworkBoundResource
import com.desarrollodroide.network.retrofit.NetworkNoCacheResource
import com.desarrollodroide.network.retrofit.RetrofitNetwork
Expand Down Expand Up @@ -179,5 +181,23 @@ class BookmarksRepositoryImpl(
}.asFlow().flowOn(Dispatchers.IO)

override suspend fun deleteAllLocalBookmarks() { bookmarksDao.deleteAll() }

override fun getBookmarkReadableContent(
token: String,
serverUrl: String,
bookmarkId: Int
) = object :
NetworkNoCacheResource<ReadableContentResponseDTO, ReadableContent>(errorHandler = errorHandler) {
override suspend fun fetchFromRemote(): Response<ReadableContentResponseDTO> = apiService.getBookmarkReadableContent(
url = "${serverUrl.removeTrailingSlash()}/api/v1/bookmarks/${bookmarkId}/readable",
authorization = "Bearer $token",
)

override fun fetchResult(data: ReadableContentResponseDTO): Flow<ReadableContent> {
return flow {
emit(data.toDomainModel())
}
}
}.asFlow().flowOn(Dispatchers.IO)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.desarrollodroide.domain.usecase

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
import com.desarrollodroide.common.result.Result
import com.desarrollodroide.data.repository.BookmarksRepository
import com.desarrollodroide.model.ReadableContent

class GetBookmarkReadableContentUseCase(
private val bookmarksRepository: BookmarksRepository
) {
operator fun invoke(
serverUrl: String,
token: String,
bookmarkId: Int
): Flow<Result<ReadableContent>> {
return bookmarksRepository.getBookmarkReadableContent(
token = token,
serverUrl = serverUrl,
bookmarkId = bookmarkId
).flowOn(Dispatchers.IO)
}
}
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ android.nonTransitiveRClass=true
compileSdkVersion=34
minSdkVersion=21
targetSdkVersion=34
versionCode=40
versionName=1.31.01
versionCode=41
versionName=1.32

android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ junitPlatformSuiteApi = "1.8.1"
koinAndroidxCompose = "3.4.2"
mockitoCore = "3.9.0"
mockitoKotlin = "3.2.0"
compose = "1.6.4"
compose = "1.7.0-beta01"
composeMaterial3 = "1.2.1"
# gradlePlugin and lint need to be updated together
gradlePlugin = "7.3.1"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.desarrollodroide.model

data class ReadableContent(
val ok: Boolean,
val message: ReadableMessage,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.desarrollodroide.model

data class ReadableMessage(
val content: String,
val html: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.desarrollodroide.network.model

data class ReadableContentResponseDTO (
val ok: Boolean?,
val message: ReadableMessageDto?,
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.desarrollodroide.network.model

data class ReadableMessageDto(
val content: String?,
val html: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.desarrollodroide.network.model.BookmarkResponseDTO
import com.desarrollodroide.network.model.BookmarksDTO
import com.desarrollodroide.network.model.LivenessResponseDTO
import com.desarrollodroide.network.model.LoginResponseDTO
import com.desarrollodroide.network.model.ReadableContentResponseDTO
import com.desarrollodroide.network.model.SessionDTO
import com.desarrollodroide.network.model.TagDTO
import com.desarrollodroide.network.model.TagsDTO
Expand Down Expand Up @@ -127,4 +128,10 @@ interface RetrofitNetwork {
@Url url: String
): Response<LivenessResponseDTO>

@GET()
suspend fun getBookmarkReadableContent(
@Url url: String,
@Header("Authorization") authorization: String,
): Response<ReadableContentResponseDTO>

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.desarrollodroide.pagekeeper

import android.content.Context
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.RequiresApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.Surface
Expand All @@ -19,6 +21,7 @@ class MainActivity : ComponentActivity() {

private val themeManager: ThemeManager by inject()

@RequiresApi(Build.VERSION_CODES.N)
@OptIn(ExperimentalFoundationApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.desarrollodroide.domain.usecase.AddBookmarkUseCase
import com.desarrollodroide.domain.usecase.DeleteBookmarkUseCase
import com.desarrollodroide.domain.usecase.DownloadFileUseCase
import com.desarrollodroide.domain.usecase.EditBookmarkUseCase
import com.desarrollodroide.domain.usecase.GetBookmarkReadableContentUseCase
import com.desarrollodroide.domain.usecase.GetBookmarksUseCase
import com.desarrollodroide.domain.usecase.GetPagingBookmarksUseCase
import com.desarrollodroide.domain.usecase.GetTagsUseCase
Expand Down Expand Up @@ -94,6 +95,12 @@ fun appModule() = module {
)
}

single {
GetBookmarkReadableContentUseCase(
bookmarksRepository = get()
)
}

single { ThemeManagerImpl(get()) as ThemeManager }


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.desarrollodroide.pagekeeper.ui.feed.FeedViewModel
import com.desarrollodroide.pagekeeper.ui.login.LoginViewModel
import com.desarrollodroide.pagekeeper.ui.bookmarkeditor.BookmarkViewModel
import com.desarrollodroide.pagekeeper.ui.feed.SearchViewModel
import com.desarrollodroide.pagekeeper.ui.readablecontent.ReadableContentViewModel
import com.desarrollodroide.pagekeeper.ui.settings.SettingsViewModel
import org.koin.dsl.module
import org.koin.androidx.viewmodel.dsl.viewModel
Expand Down Expand Up @@ -57,4 +58,11 @@ fun presenterModule() = module {
)
}

viewModel {
ReadableContentViewModel(
getBookmarkReadableContentUseCase = get(),
settingsPreferenceDataSource = get(),
)
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.desarrollodroide.pagekeeper.navigation

import android.net.Uri
import androidx.navigation.NavType
import androidx.navigation.navArgument

Expand All @@ -13,6 +14,14 @@ sealed class NavItem(
object SettingsNavItem : NavItem("settings")
object TermsOfUseNavItem : NavItem("termsOfUse")
object PrivacyPolicyNavItem : NavItem("privacyPolicy")
object ReadableContentNavItem : NavItem("readable_content/{bookmarkId}/{bookmarkUrl}/{bookmarkDate}/{bookmarkTitle}") {
fun createRoute(bookmarkId: Int, bookmarkUrl: String, bookmarkDate: String, bookmarkTitle: String): String {
val encodedUrl = Uri.encode(bookmarkUrl)
val encodedDate = Uri.encode(bookmarkDate)
val encodedTitle = Uri.encode(bookmarkTitle)
return "readable_content/$bookmarkId/$encodedUrl/$encodedDate/$encodedTitle"
}
}

object FeedNavItem : NavItem("feed")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.desarrollodroide.pagekeeper.navigation

import android.os.Build
import androidx.annotation.RequiresApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import androidx.navigation.NavBackStackEntry
Expand All @@ -14,6 +16,7 @@ import com.desarrollodroide.pagekeeper.ui.login.LoginViewModel
import org.koin.androidx.compose.get
import java.io.File

@RequiresApi(Build.VERSION_CODES.N)
@ExperimentalFoundationApi
@Composable
fun Navigation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import java.io.File
fun FeedScreen(
feedViewModel: FeedViewModel,
goToLogin: () -> Unit,
goToReadableContent:(Bookmark) -> Unit,
openUrlInBrowser: (String) -> Unit,
shareEpubFile: (File) -> Unit,
isCategoriesVisible: MutableState<Boolean>,
Expand Down Expand Up @@ -85,8 +86,7 @@ fun FeedScreen(
goToLogin()
},
onBookmarkSelect = { bookmark ->
Log.v("FeedContent", feedViewModel.getUrl(bookmark))
openUrlInBrowser(feedViewModel.getUrl(bookmark))
goToReadableContent(bookmark)
},
onRefreshFeed = {
feedViewModel.refreshFeed()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ class FeedViewModel(
MutableStateFlow(value = PagingData.empty())
val bookmarksState: MutableStateFlow<PagingData<Bookmark>> get() = _bookmarksState


private val _tagsState = MutableStateFlow(UiState<List<Tag>>(idle = true))
val tagsState = _tagsState.asStateFlow()

Expand Down Expand Up @@ -135,13 +134,10 @@ class FeedViewModel(
is Result.Error -> {
Log.v("FeedViewModel", "Error getting tags: ${result.error?.message}")
}

is Result.Loading -> {
Log.v("FeedViewModel", "Loading, updating tags from cache...")
_tagsState.success(result.data)

}

is Result.Success -> {
Log.v("FeedViewModel", "Tags loaded successfully.")
_tagsState.success(result.data)
Expand Down Expand Up @@ -202,6 +198,8 @@ class FeedViewModel(
_bookmarksUiState.isUpdating(false)
refreshFeed()
}

else -> {}
}
}
}
Expand Down Expand Up @@ -238,15 +236,11 @@ class FeedViewModel(
.collect { result ->
when (result) {
is Result.Error -> {
Log.v(
"FeedViewModel",
"Error deleting bookmark: ${result.error?.message}"
)
Log.v("FeedViewModel","Error deleting bookmark: ${result.error?.message}")
_bookmarksUiState.error(
errorMessage = result.error?.message ?: "Unknown error"
)
}

is Result.Loading -> {
Log.v("FeedViewModel", "Deleting bookmark...")
_bookmarksUiState.isLoading(true)
Expand All @@ -257,6 +251,7 @@ class FeedViewModel(
_bookmarksUiState.isLoading(false)
refreshFeed()
}
else -> {}
}
}
}
Expand Down
Loading

0 comments on commit e2309af

Please sign in to comment.