Skip to content

Commit

Permalink
style: adds edge to edge (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
kikin81 authored May 19, 2024
1 parent d73f9b0 commit bbfb825
Show file tree
Hide file tree
Showing 43 changed files with 908 additions and 440 deletions.
2 changes: 2 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[*.{kt,kts}]
ktlint_function_naming_ignore_when_annotated_with=Composable
31 changes: 31 additions & 0 deletions .github/workflows/build-debug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Build debug apk

on:
push:
branches:
- main
workflow_dispatch:

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: "zulu"
java-version: "17"

- name: Setup Gradle
uses: gradle/gradle-build-action@v3

- name: Set up local.properties
run: echo 'API_KEY=${{ secrets.API_KEY }}' > ./local.properties
- run: echo 'SERVER_URL=${{ secrets.SERVER_URL }}' > ./local.properties

- name: Build with Gradle
run: ./gradlew app:assembleDebug
1 change: 0 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 21 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ plugins {
alias(libs.plugins.sortDependencies)
alias(libs.plugins.ksp)
alias(libs.plugins.hilt)
alias(libs.plugins.secrets)
alias(libs.plugins.ktlint)
}

secrets {
defaultPropertiesFileName = "local.defaults.properties"
}

android {
Expand All @@ -29,7 +35,7 @@ android {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
"proguard-rules.pro",
)
}
}
Expand All @@ -42,6 +48,7 @@ android {
}
buildFeatures {
compose = true
buildConfig = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.14"
Expand All @@ -55,29 +62,41 @@ android {

dependencies {
ksp(libs.hilt.compiler)
ksp(libs.moshi.codegen)

ktlintRuleset(libs.ktlint.compose.rules)

lintChecks(libs.slack.compose.lint)

implementation(platform(libs.androidx.compose.bom))
implementation(libs.accompanist.placeholder)
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.core.splashscreen)
implementation(libs.androidx.datastore.preferences)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
implementation(libs.androidx.paging.compose)
implementation(libs.androidx.paging.runtime)
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.text.google.fonts)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.coil.compose)
implementation(libs.collections.immutable)
implementation(libs.hilt)
implementation(libs.hilt.navigation)
implementation(libs.igdb.api)
implementation(libs.moshi)
implementation(libs.retrofit)
implementation(libs.retrofit.moshi)

debugImplementation(libs.androidx.ui.test.manifest)
debugImplementation(libs.androidx.ui.tooling)

testImplementation(libs.junit)
testImplementation(libs.androidx.navigation.testing)
testImplementation(libs.junit)

androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.espresso.core)
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".BacklogApplication"
android:allowBackup="true"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,4 @@ import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class BacklogApplication: Application() {
}
class BacklogApplication : Application()
16 changes: 14 additions & 2 deletions app/src/main/kotlin/us/kikin/android/gamingbacklog/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package us.kikin.android.gamingbacklog

import android.graphics.Color
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
Expand All @@ -17,16 +19,26 @@ import us.kikin.android.gamingbacklog.ui.theme.AppTheme

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

private val viewModel: MainViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge(
statusBarStyle =
SystemBarStyle.light(
Color.TRANSPARENT,
Color.TRANSPARENT,
),
navigationBarStyle =
SystemBarStyle.light(
Color.TRANSPARENT,
Color.TRANSPARENT,
),
)
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
installSplashScreen().apply {
setKeepOnScreenCondition { viewModel.splashCondition }
}
enableEdgeToEdge()
setContent {
AppTheme {
Box(modifier = Modifier.background(color = MaterialTheme.colorScheme.background)) {
Expand Down
41 changes: 21 additions & 20 deletions app/src/main/kotlin/us/kikin/android/gamingbacklog/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,31 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import us.kikin.android.gamingbacklog.domain.usecase.AppEntryUseCases
import us.kikin.android.gamingbacklog.domain.usecase.appentry.AppEntryUseCases
import us.kikin.android.gamingbacklog.presentation.navigation.Route
import javax.inject.Inject

@HiltViewModel
class MainViewModel @Inject constructor(
private val appEntryUseCases: AppEntryUseCases
): ViewModel() {
class MainViewModel
@Inject
constructor(
private val appEntryUseCases: AppEntryUseCases,
) : ViewModel() {
var splashCondition by mutableStateOf(true)
private set

var splashCondition by mutableStateOf(true)
private set
var startDestination by mutableStateOf(Route.AppStartNavigation.route)
private set

var startDestination by mutableStateOf(Route.AppStartNavigation.route)
private set

init {
appEntryUseCases.readAppEntry().onEach { shouldStartFromHomeScreen ->
if (shouldStartFromHomeScreen) {
startDestination = Route.GamesNavigation.route
} else {
startDestination = Route.AppStartNavigation.route
}
delay(300)
splashCondition = false
}.launchIn(viewModelScope)
init {
appEntryUseCases.readAppEntry().onEach { shouldStartFromHomeScreen ->
startDestination = if (shouldStartFromHomeScreen) {
Route.GamesNavigation.route
} else {
Route.AppStartNavigation.route
}
delay(300)
splashCondition = false
}.launchIn(viewModelScope)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,9 @@ import us.kikin.android.gamingbacklog.domain.manager.LocalUserManager
import us.kikin.android.gamingbacklog.utils.Constants
import us.kikin.android.gamingbacklog.utils.Constants.USER_SETTINGS


class LocalUserManagerImpl(
private val context: Context
private val context: Context,
) : LocalUserManager {

override suspend fun saveAppEntry() {
context.dataStore.edit { settings ->
settings[PreferencesKeys.APP_ENTRY] = true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package us.kikin.android.gamingbacklog.data.remote

import proto.Game

interface GamesApi {
suspend fun getGames(
limit: Int = 10,
offset: Int,
): List<Game>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package us.kikin.android.gamingbacklog.data.remote

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.api.igdb.apicalypse.APICalypse
import com.api.igdb.apicalypse.Sort
import com.api.igdb.request.IGDBWrapper
import com.api.igdb.request.games
import proto.Game

class GamesPagingSource(
private val igdbWrapper: IGDBWrapper,
) : PagingSource<Int, Game>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Game> {
val offset = params.key ?: 0
val limit = 10
return try {
val games =
igdbWrapper.games(
APICalypse()
.fields("*")
.limit(limit)
.offset(offset)
.sort("release_dates.date", Sort.ASCENDING),
).distinctBy { it.id }
LoadResult.Page(
data = games,
prevKey = if (offset == 0) null else offset - limit,
nextKey = if (games.isEmpty()) null else offset + limit,
)
} catch (e: Exception) {
e.printStackTrace()
LoadResult.Error(e)
}
}

override fun getRefreshKey(state: PagingState<Int, Game>): Int? {
TODO("Not yet implemented")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package us.kikin.android.gamingbacklog.data.repository

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.api.igdb.request.IGDBWrapper
import kotlinx.coroutines.flow.Flow
import proto.Game
import us.kikin.android.gamingbacklog.data.remote.GamesPagingSource
import us.kikin.android.gamingbacklog.domain.repository.GamesRepository

class GamesRepositoryImpl(
private val igdbWrapper: IGDBWrapper,
) : GamesRepository {
override fun getGames(): Flow<PagingData<Game>> {
return Pager(
config = PagingConfig(pageSize = 10),
pagingSourceFactory = {
GamesPagingSource(
igdbWrapper = igdbWrapper,
)
},
).flow
}
}
47 changes: 35 additions & 12 deletions app/src/main/kotlin/us/kikin/android/gamingbacklog/di/AppModule.kt
Original file line number Diff line number Diff line change
@@ -1,34 +1,57 @@
package us.kikin.android.gamingbacklog.di

import android.app.Application
import com.api.igdb.request.IGDBWrapper
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import us.kikin.android.gamingbacklog.BuildConfig
import us.kikin.android.gamingbacklog.data.manager.LocalUserManagerImpl
import us.kikin.android.gamingbacklog.data.repository.GamesRepositoryImpl
import us.kikin.android.gamingbacklog.domain.manager.LocalUserManager
import us.kikin.android.gamingbacklog.domain.usecase.AppEntryUseCases
import us.kikin.android.gamingbacklog.domain.usecase.ReadAppEntry
import us.kikin.android.gamingbacklog.domain.usecase.SaveAppEntry
import us.kikin.android.gamingbacklog.domain.repository.GamesRepository
import us.kikin.android.gamingbacklog.domain.usecase.appentry.AppEntryUseCases
import us.kikin.android.gamingbacklog.domain.usecase.appentry.ReadAppEntry
import us.kikin.android.gamingbacklog.domain.usecase.appentry.SaveAppEntry
import us.kikin.android.gamingbacklog.domain.usecase.games.GamesUseCase
import us.kikin.android.gamingbacklog.domain.usecase.games.GetGames
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideLocalUserManager(application: Application): LocalUserManager = LocalUserManagerImpl(application)

@Provides
@Singleton
fun provideLocalUserManager(
application: Application
): LocalUserManager = LocalUserManagerImpl(application)
fun provideAppEntryUseCases(localUserManager: LocalUserManager): AppEntryUseCases =
AppEntryUseCases(
readAppEntry = ReadAppEntry(localUserManager),
saveAppEntry = SaveAppEntry(localUserManager),
)

@Provides
@Singleton
fun provideIGDBWrapper(): IGDBWrapper {
IGDBWrapper.setupProxy(
BuildConfig.SERVER_URL,
mapOf("x-api-key" to BuildConfig.API_KEY),
)
return IGDBWrapper
}

@Provides
@Singleton
fun providesGamesRepository(igdbWrapper: IGDBWrapper): GamesRepository = GamesRepositoryImpl(igdbWrapper)

@Provides
@Singleton
fun provideAppEntryUseCases(
localUserManager: LocalUserManager
): AppEntryUseCases = AppEntryUseCases(
readAppEntry = ReadAppEntry(localUserManager),
saveAppEntry = SaveAppEntry(localUserManager)
)
fun providesGamesUseCases(repository: GamesRepository): GamesUseCase {
return GamesUseCase(
getGames = GetGames(repository),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package us.kikin.android.gamingbacklog.domain.manager
import kotlinx.coroutines.flow.Flow

interface LocalUserManager {

suspend fun saveAppEntry()

fun readAppEntry(): Flow<Boolean>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package us.kikin.android.gamingbacklog.domain.repository

import androidx.paging.PagingData
import kotlinx.coroutines.flow.Flow
import proto.Game

interface GamesRepository {
fun getGames(): Flow<PagingData<Game>>
}
Loading

0 comments on commit bbfb825

Please sign in to comment.