Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ jobs:
uses: gradle/actions/setup-gradle@v5

- name: Verify
run: ./gradlew detektAll lintDebug testDebugUnitTest :app:assembleDebug
run: ./gradlew detektAll lintDebug test testDebugUnitTest :app:assembleDebug
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ android {

dependencies {
implementation(project(":core:data"))
implementation(project(":core:domain"))
implementation(project(":core:ui"))

implementation(project(":feature:forum"))
Expand Down
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
android:name=".RedfaceApplication"
android:allowBackup="true"
android:enableOnBackInvokedCallback="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true">
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Redface2">
<activity
android:name=".MainActivity"
android:exported="true"
Expand Down
10 changes: 9 additions & 1 deletion app/src/main/java/fr/forumhfr/redface2/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,15 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import dagger.hilt.android.AndroidEntryPoint
import fr.forumhfr.redface2.core.domain.fixtures.TopicFixtureRepository
import fr.forumhfr.redface2.navigation.RedfaceApp
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject
lateinit var topicFixtureRepository: TopicFixtureRepository

private var latestIntent by mutableStateOf<Intent?>(null)

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -21,7 +26,10 @@ class MainActivity : ComponentActivity() {
latestIntent = intent

setContent {
RedfaceApp(intent = latestIntent)
RedfaceApp(
intent = latestIntent,
topicFixtureRepository = topicFixtureRepository,
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.ui.NavDisplay
import fr.forumhfr.redface2.core.domain.fixtures.FixedTopicFixtures
import fr.forumhfr.redface2.core.domain.fixtures.TopicFixtureRepository
import fr.forumhfr.redface2.FlagsScreen
import fr.forumhfr.redface2.R
import fr.forumhfr.redface2.core.ui.RedfaceTheme
Expand All @@ -29,6 +31,7 @@ import fr.forumhfr.redface2.feature.forum.CategoryScreen
import fr.forumhfr.redface2.feature.forum.ForumScreen
import fr.forumhfr.redface2.feature.messages.MessagesScreen
import fr.forumhfr.redface2.feature.search.SearchScreen
import fr.forumhfr.redface2.feature.topic.TopicRequest
import fr.forumhfr.redface2.feature.topic.TopicScreen
import kotlinx.serialization.Serializable

Expand Down Expand Up @@ -91,7 +94,10 @@ private data class ParsedDeepLink(
)

@Composable
fun RedfaceApp(intent: Intent?) {
fun RedfaceApp(
intent: Intent?,
topicFixtureRepository: TopicFixtureRepository,
) {
RedfaceTheme {
val flagsBackStack = rememberNavBackStack(FlagsListRoute)
val forumBackStack = rememberNavBackStack(ForumRoute)
Expand Down Expand Up @@ -133,7 +139,10 @@ fun RedfaceApp(intent: Intent?) {
) {
Surface(modifier = Modifier.padding(horizontal = 8.dp)) {
val activeBackStack = backStacks.getValue(currentDestination)
RedfaceNavHost(backStack = activeBackStack)
RedfaceNavHost(
backStack = activeBackStack,
topicFixtureRepository = topicFixtureRepository,
)
}
}
}
Expand All @@ -142,6 +151,7 @@ fun RedfaceApp(intent: Intent?) {
@Composable
private fun RedfaceNavHost(
backStack: NavBackStack<NavKey>,
topicFixtureRepository: TopicFixtureRepository,
) {
NavDisplay(
backStack = backStack,
Expand All @@ -154,7 +164,13 @@ private fun RedfaceNavHost(
entry<FlagsListRoute> {
FlagsScreen(
onOpenUnreadTopic = {
backStack.add(TopicRoute(cat = 23, post = 35395, page = 3))
backStack.add(
TopicRoute(
cat = FixedTopicFixtures.cat,
post = FixedTopicFixtures.post,
page = 1,
),
)
},
onOpenTrackedCategory = {
backStack.add(CategoryRoute(cat = 23, subcat = 0))
Expand All @@ -167,21 +183,40 @@ private fun RedfaceNavHost(
backStack.add(CategoryRoute(cat = 23, subcat = 0))
},
onOpenTopic = {
backStack.add(TopicRoute(cat = 23, post = 35395, page = 1))
backStack.add(
TopicRoute(
cat = FixedTopicFixtures.cat,
post = FixedTopicFixtures.post,
page = 1,
),
)
},
)
}
entry<SearchRoute> {
SearchScreen(
onOpenResult = {
backStack.add(TopicRoute(cat = 23, post = 35395, page = 5, scrollTo = 12345))
backStack.add(
TopicRoute(
cat = FixedTopicFixtures.cat,
post = FixedTopicFixtures.post,
page = 146,
scrollTo = 18085119,
),
)
},
)
}
entry<MessagesRoute> {
MessagesScreen(
onOpenTopic = {
backStack.add(TopicRoute(cat = 23, post = 35395, page = 2))
backStack.add(
TopicRoute(
cat = FixedTopicFixtures.cat,
post = FixedTopicFixtures.post,
page = 2,
),
)
},
)
}
Expand All @@ -190,16 +225,25 @@ private fun RedfaceNavHost(
cat = route.cat,
subcat = route.subcat,
onOpenTopic = {
backStack.add(TopicRoute(cat = route.cat, post = 35395, page = 1))
backStack.add(
TopicRoute(
cat = FixedTopicFixtures.cat,
post = FixedTopicFixtures.post,
page = 1,
),
)
},
)
}
entry<TopicRoute> { route ->
TopicScreen(
cat = route.cat,
post = route.post,
page = route.page,
scrollTo = route.scrollTo,
request = TopicRequest(
cat = route.cat,
post = route.post,
page = route.page,
scrollTo = route.scrollTo,
),
topicFixtureRepository = topicFixtureRepository,
onReply = { postId ->
backStack.add(
EditorRoute(
Expand All @@ -209,6 +253,17 @@ private fun RedfaceNavHost(
),
)
},
onOpenPage = { targetPage ->
backStack.removeAt(backStack.lastIndex)
backStack.add(
TopicRoute(
cat = route.cat,
post = route.post,
page = targetPage,
scrollTo = null,
),
)
},
)
}
entry<EditorRoute> { route ->
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/drawable/ic_launcher_background.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="#FFFFFF" />
</shape>
5 changes: 5 additions & 0 deletions app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@mipmap/ic_launcher_foreground" />
</adaptive-icon>
5 changes: 5 additions & 0 deletions app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@mipmap/ic_launcher_foreground" />
</adaptive-icon>
Binary file added app/src/main/res/mipmap-hdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/mipmap-mdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/mipmap-xhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions app/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Redface2" parent="@android:style/Theme.DeviceDefault.NoActionBar" />
</resources>
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package fr.forumhfr.redface2.core.data.di

import android.content.Context
import dagger.Module
import dagger.Provides
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import fr.forumhfr.redface2.core.data.fixtures.AssetTopicFixtureRepository
import fr.forumhfr.redface2.core.domain.coroutines.DefaultDispatcher
import fr.forumhfr.redface2.core.domain.coroutines.IoDispatcher
import fr.forumhfr.redface2.core.domain.coroutines.MainDispatcher
import fr.forumhfr.redface2.core.domain.fixtures.TopicFixtureRepository
import fr.forumhfr.redface2.core.parser.HfrParser
import java.time.Clock
import javax.inject.Singleton
import kotlinx.coroutines.CoroutineDispatcher
Expand All @@ -33,4 +38,20 @@ object PlatformBindingsModule {
@Singleton
@MainDispatcher
fun provideMainDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate

@Provides
@Singleton
fun provideHfrParser(): HfrParser = HfrParser()

@Provides
@Singleton
fun provideTopicFixtureRepository(
@ApplicationContext context: Context,
parser: HfrParser,
@IoDispatcher ioDispatcher: CoroutineDispatcher,
): TopicFixtureRepository = AssetTopicFixtureRepository(
context = context,
parser = parser,
ioDispatcher = ioDispatcher,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package fr.forumhfr.redface2.core.data.fixtures

import android.content.Context
import fr.forumhfr.redface2.core.domain.fixtures.FixedTopicFixtures
import fr.forumhfr.redface2.core.domain.fixtures.TopicFixtureRepository
import fr.forumhfr.redface2.core.model.Topic
import fr.forumhfr.redface2.core.parser.HfrParser
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext

class AssetTopicFixtureRepository(
private val context: Context,
private val parser: HfrParser,
private val ioDispatcher: CoroutineDispatcher,
) : TopicFixtureRepository {
override suspend fun loadTopicPage(page: Int): Topic = withContext(ioDispatcher) {
require(page in FixedTopicFixtures.availablePages) {
"Unsupported embedded topic page: $page"
}

val assetPath = "topic_khakha/topic_khakha_page_${page}.html"
val html = context.assets.open(assetPath)
.bufferedReader()
.use { reader -> reader.readText() }
parser.parseTopicPage(html)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package fr.forumhfr.redface2.core.domain.fixtures

object FixedTopicFixtures {
const val cat: Int = 13
const val post: Int = 84540

val availablePages: List<Int> = listOf(1, 2, 146)

fun isFixedTopic(
cat: Int,
post: Int,
): Boolean = cat == FixedTopicFixtures.cat && post == FixedTopicFixtures.post
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package fr.forumhfr.redface2.core.domain.fixtures

import fr.forumhfr.redface2.core.model.Topic

interface TopicFixtureRepository {
suspend fun loadTopicPage(page: Int): Topic
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package fr.forumhfr.redface2.core.model

import java.time.Instant

data class Post(
val numreponse: Int,
val author: String,
val date: Instant,
val content: String,
val avatarUrl: String?,
val isEditable: Boolean,
val isOwnPost: Boolean,
val quotedAuthors: List<String>,
val postIndex: Int?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package fr.forumhfr.redface2.core.model

data class Topic(
val cat: Int,
val post: Int,
val title: String,
val posts: List<Post>,
val page: Int,
val totalPages: Int,
val isFirstPostOwner: Boolean,
val poll: Poll?,
)

data class Poll(
val question: String,
val options: List<PollOption>,
val multipleChoice: Boolean,
val totalVotes: Int,
val hasVoted: Boolean,
)

data class PollOption(
val text: String,
val votes: Int,
val percentage: Float,
)
3 changes: 3 additions & 0 deletions core/parser/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ plugins {

dependencies {
api(project(":core:model"))
implementation(libs.jsoup)

testImplementation(libs.junit4)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package fr.forumhfr.redface2.core.parser

import fr.forumhfr.redface2.core.model.Topic

class HfrParser(
private val topicPageParser: TopicPageParser = TopicPageParser(),
) {
fun parseTopicPage(html: String): Topic = topicPageParser.parse(html)
}
Loading