Skip to content

Commit

Permalink
Insert Koin 💰
Browse files Browse the repository at this point in the history
  • Loading branch information
aksh1618 committed Jan 25, 2019
1 parent d6d9bc1 commit 9899dfb
Show file tree
Hide file tree
Showing 11 changed files with 111 additions and 28 deletions.
5 changes: 5 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ ext {
retrofit_version = "2.5.0"
retrofit2_kotlin_coroutines_version = "0.9.2"
nav_version = "1.0.0-alpha09"
koin_version = "2.0.0-beta-1"
}

dependencies {
Expand Down Expand Up @@ -77,6 +78,10 @@ dependencies {
implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version"
implementation "android.arch.navigation:navigation-ui-ktx:$nav_version"

// Koin
implementation "org.koin:koin-android:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"

}

apply plugin: 'com.google.gms.google-services'
1 change: 1 addition & 0 deletions app/src/main/assets/koin.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
baseUrl=https://bitotsav.in/api/app/
15 changes: 15 additions & 0 deletions app/src/main/java/in/bitotsav/Bitotsav19.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
package `in`.bitotsav

import `in`.bitotsav.koin.repositoriesModule
import `in`.bitotsav.notification.utils.createNotificationChannels
import android.app.Application
import android.os.Build
import android.util.Log
import com.google.firebase.messaging.FirebaseMessaging
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidFileProperties
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin

class Bitotsav19 : Application() {
companion object {
private const val TAG = "Bitotsav19"
}

override fun onCreate() {
super.onCreate()

Expand All @@ -25,5 +31,14 @@ class Bitotsav19 : Application() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannels(this)
}

startKoin {
androidContext(this@Bitotsav19)
// Enable logging, log.INFO by default
androidLogger()
// Use properties from assets/koin.properties
androidFileProperties()
modules(repositoriesModule)
}
}
}
11 changes: 7 additions & 4 deletions app/src/main/java/in/bitotsav/events/data/Event.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package `in`.bitotsav.events.data

import `in`.bitotsav.shared.Singleton
import android.content.Context
import androidx.room.Entity
import androidx.room.PrimaryKey
Expand All @@ -9,6 +8,8 @@ import com.google.gson.annotations.SerializedName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import org.koin.core.KoinComponent
import org.koin.core.get
import java.util.*

@Entity
Expand Down Expand Up @@ -47,7 +48,7 @@ data class Event(
@SerializedName("eventPosition1") val position1: Map<String, String>?,
@SerializedName("eventPosition2") val position2: Map<String, String>?,
@SerializedName("eventPosition3") val position3: Map<String, String>?
) {
) : KoinComponent {
// Using @Transient also makes room ignore the property
@Expose(serialize = false, deserialize = false)
var timestamp = getTimestampFromString(day, timeString)
Expand All @@ -66,9 +67,11 @@ data class Event(
}

fun toggleStarred(context: Context) {
isStarred = isStarred.not()
isStarred.apply { not() }
CoroutineScope(Dispatchers.IO).async {
EventRepository(Singleton.database.getInstance(context).eventDao()).insert(this@Event)
// koine!
// EventRepository(Singleton.database.getInstance(context).eventDao()).insert(this@Event)
get<EventRepository>().insert(this@Event)
}
}
}
15 changes: 10 additions & 5 deletions app/src/main/java/in/bitotsav/feed/data/FeedRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package `in`.bitotsav.feed.data

import `in`.bitotsav.events.data.EventRepository
import `in`.bitotsav.feed.api.FeedService
import `in`.bitotsav.shared.Singleton
import `in`.bitotsav.shared.data.DatabaseException
import `in`.bitotsav.shared.data.Repository
import `in`.bitotsav.shared.network.NetworkException
Expand All @@ -15,10 +14,12 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import org.koin.core.KoinComponent
import org.koin.core.get

private const val TAG = "FeedRepository"

class FeedRepository(private val feedDao: FeedDao): Repository<Feed> {
class FeedRepository(private val feedDao: FeedDao) : Repository<Feed>, KoinComponent {
override fun getAll(): LiveData<List<Feed>> {
return feedDao.getAll()
}
Expand All @@ -39,11 +40,15 @@ class FeedRepository(private val feedDao: FeedDao): Repository<Feed> {
if (response.code() == 200) {
Log.d(TAG, "Feeds received after $timestamp")
val feeds = response.body() ?: throw NetworkException("Response body is empty")
val database = Singleton.database.getInstance(context).eventDao()
// koine!
// val database = Singleton.database.getInstance(context).eventDao()
feeds.forEachParallel {
if (it.eventId != null) {
val isStarred = EventRepository(database).isStarred(it.eventId) ?: false
val eventName = EventRepository(database).getEventName(it.eventId)
// koine!
// val isStarred = EventRepository(database).isStarred(it.eventId) ?: false
// val eventName = EventRepository(database).getEventName(it.eventId)
val isStarred = get<EventRepository>().isStarred(it.eventId) ?: false
val eventName = get<EventRepository>().getEventName(it.eventId)
?: throw DatabaseException("Event name not found for ${it.eventId}")
it.setProperties(isStarred, eventName)
} else {
Expand Down
41 changes: 41 additions & 0 deletions app/src/main/java/in/bitotsav/koin/modules.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package `in`.bitotsav.koin

import `in`.bitotsav.database.AppDatabase
import `in`.bitotsav.events.data.EventRepository
import `in`.bitotsav.feed.data.FeedRepository
import `in`.bitotsav.teams.championship.data.ChampionshipTeamRepository
import `in`.bitotsav.teams.nonchampionship.data.NonChampionshipTeamRepository
import androidx.room.Room
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module

val repositoriesModule = module {

single {
Room.databaseBuilder(androidContext(), AppDatabase::class.java, "App.db")
.build()
}
factory { EventRepository(get<AppDatabase>().eventDao()) }
factory { FeedRepository(get<AppDatabase>().feedDao()) }
factory { ChampionshipTeamRepository(get<AppDatabase>().championshipTeamDao()) }
factory { NonChampionshipTeamRepository(get<AppDatabase>().nonChampionshipTeamDao()) }
}

/*
// TODO: Use this!
val retrofitModule = module {
single("custom_gson") {
GsonBuilder().addDeserializationExclusionStrategy(object : ExclusionStrategy {
override fun shouldSkipField(fieldAttributes: FieldAttributes): Boolean {
val expose = fieldAttributes.getAnnotation(Expose::class.java)
return expose != null && !expose.deserialize
}
override fun shouldSkipClass(aClass: Class<*>): Boolean {
return false
}
}).create()//!! <- Is this needed?
}
factory { GsonConverterFactory.create(get<Gson>("custom_gson")) }
}*/
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import org.koin.android.ext.android.get
import java.util.*

//TODO("Complete this list")
Expand Down Expand Up @@ -75,7 +76,9 @@ class DefaultFirebaseMessagingService : FirebaseMessagingService() {
val feedType = FeedType.valueOf(updateType.name)
var channel = Channel.valueOf(updateType.name)

val database = Singleton.database.getInstance(applicationContext)
// TODO: Test still working.
// koine!
// val database = Singleton.database.getInstance(applicationContext)

when (updateType) {
UpdateType.ANNOUNCEMENT, UpdateType.PM -> {
Expand All @@ -90,7 +93,9 @@ class DefaultFirebaseMessagingService : FirebaseMessagingService() {
null
)
CoroutineScope(Dispatchers.IO).async {
FeedRepository(database.feedDao()).insert(feed)
// koine!
// FeedRepository(database.feedDao()).insert(feed)
get<FeedRepository>().insert(feed)
}
// TODO("Pass appropriate intent")
val intent = Intent(this, HomeActivity::class.java)
Expand All @@ -106,10 +111,14 @@ class DefaultFirebaseMessagingService : FirebaseMessagingService() {
else -> {
val eventId = remoteMessage.data["eventId"]?.toInt() ?: return
val deferredIsStarred = CoroutineScope(Dispatchers.IO).async {
EventRepository(database.eventDao()).isStarred(eventId)
// koine!
// EventRepository(database.eventDao()).isStarred(eventId)
get<EventRepository>().isStarred(eventId)
}
val deferredEventName = CoroutineScope(Dispatchers.IO).async {
EventRepository(database.eventDao()).getEventName(eventId)
// koine!
// EventRepository(database.eventDao()).getEventName(eventId)
get<EventRepository>().getEventName(eventId)
}
// TODO("Refresh data from server here")
// TODO("Schedule Job")
Expand All @@ -126,7 +135,9 @@ class DefaultFirebaseMessagingService : FirebaseMessagingService() {
eventName
)
CoroutineScope(Dispatchers.IO).async {
FeedRepository(database.feedDao()).insert(feed)
// koine!
// FeedRepository(database.feedDao()).insert(feed)
get<FeedRepository>().insert(feed)
}
if (isStarred) channel = Channel.STARRED
// TODO("Pass appropriate intent")
Expand Down
13 changes: 6 additions & 7 deletions app/src/main/java/in/bitotsav/shared/Singleton.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package `in`.bitotsav.shared

import `in`.bitotsav.database.AppDatabase
import android.content.Context
import androidx.room.Room
import com.firebase.jobdispatcher.FirebaseJobDispatcher
import com.firebase.jobdispatcher.GooglePlayDriver
import com.google.gson.ExclusionStrategy
Expand All @@ -17,11 +15,12 @@ object Singleton {
FirebaseJobDispatcher(GooglePlayDriver(it))
}

val database = SingletonHolder<AppDatabase, Context> {
Room.databaseBuilder(it.applicationContext,
AppDatabase::class.java, "App.db")
.build()
}
// koine!
// val database = SingletonHolder<AppDatabase, Context> {
// Room.databaseBuilder(it.applicationContext,
// AppDatabase::class.java, "App.db")
// .build()
// }

val gson by lazy { GsonBuilder().addDeserializationExclusionStrategy(object: ExclusionStrategy {
override fun shouldSkipField(fieldAttributes: FieldAttributes):Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package `in`.bitotsav.teams.nonchampionship.data

import `in`.bitotsav.events.data.EventRepository
import `in`.bitotsav.shared.Singleton
import `in`.bitotsav.shared.data.Repository
import `in`.bitotsav.teams.api.NonChampionshipTeamService
import android.content.Context
Expand All @@ -12,12 +11,14 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import org.koin.core.KoinComponent
import org.koin.core.get

private const val TAG = "NonBCTeamRepository"

class NonChampionshipTeamRepository(
private val nonChampionshipTeamDao: NonChampionshipTeamDao
): Repository<NonChampionshipTeam> {
) : Repository<NonChampionshipTeam>, KoinComponent {
override fun getAll(): LiveData<List<NonChampionshipTeam>> {
return nonChampionshipTeamDao.getAll()
}
Expand Down Expand Up @@ -55,8 +56,10 @@ class NonChampionshipTeamRepository(
@Suppress("UNCHECKED_CAST")
val members = response.body()?.get("teamMembers") as Map<String, String>
// TODO("Retrieve all parameters")
val eventDao = Singleton.database.getInstance(context).eventDao()
val event = EventRepository(eventDao).getById(eventId)
// koine!
// val eventDao = Singleton.database.getInstance(context).eventDao()
// val event = EventRepository(eventDao).getById(eventId)
val event = get<EventRepository>().getById(eventId)
// eventPosition1: {
// teamLeader: req.body.eventPosition1,
// teamLeaderName: map[req.body.eventPosition1].name,
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ buildscript {

}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0-alpha01'
classpath 'com.android.tools.build:gradle:3.5.0-alpha02'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.2.0'
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha09"
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Thu Jan 10 20:55:02 IST 2019
#Sat Jan 26 01:08:47 IST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-milestone-1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

0 comments on commit 9899dfb

Please sign in to comment.