Skip to content

Commit

Permalink
Merge pull request konifar#23 from DroidKaigi/session-detail
Browse files Browse the repository at this point in the history
Session detail(without design)
  • Loading branch information
takahirom authored Dec 28, 2017
2 parents a23dd19 + 0fd6031 commit 1669729
Show file tree
Hide file tree
Showing 36 changed files with 514 additions and 127 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ android {
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0"
versionName "0.1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".presentation.detail.SessionDetailActivity" />
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ fun SessionWithSpeakers.toSession(speakerEntities: List<SpeakerEntity>, favList:
level = Level(sessionEntity.level.id, sessionEntity.level.name),
language = sessionEntity.language,
topic = Topic(sessionEntity.topic.id, sessionEntity.topic.name),
sessionFormat = sessionEntity.sessionFormat,
speakers = speakers
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,14 @@ import io.github.droidkaigi.confsched2018.presentation.App
import javax.inject.Singleton

@Singleton
@Component(modules = [(AndroidInjectionModule::class), (AppModule::class), (MainActivityModule::class)])
@Component(modules = [
AndroidInjectionModule::class,
AppModule::class,
NetworkModule::class,
DatabaseModule::class,
MainActivityBuilder::class,
SessionDetailActivityBuilder::class
])
interface AppComponent {
@Component.Builder
interface Builder {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,24 @@
package io.github.droidkaigi.confsched2018.di

import android.app.Application
import android.arch.persistence.room.Room
import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
import io.github.droidkaigi.confsched2018.data.api.DroidKaigiApi
import io.github.droidkaigi.confsched2018.data.api.FeedApi
import io.github.droidkaigi.confsched2018.data.api.FeedFireStoreApi
import io.github.droidkaigi.confsched2018.data.api.response.mapper.ApplicationJsonAdapterFactory
import io.github.droidkaigi.confsched2018.data.api.response.mapper.LocalDateTimeJsonAdapter
import io.github.droidkaigi.confsched2018.data.db.*
import io.github.droidkaigi.confsched2018.data.db.dao.SessionDao
import io.github.droidkaigi.confsched2018.data.db.dao.SessionSpeakerJoinDao
import io.github.droidkaigi.confsched2018.data.db.dao.SpeakerDao
import io.github.droidkaigi.confsched2018.data.db.FavoriteDatabase
import io.github.droidkaigi.confsched2018.data.db.SessionDatabase
import io.github.droidkaigi.confsched2018.data.repository.FeedDataRepository
import io.github.droidkaigi.confsched2018.data.repository.FeedRepository
import io.github.droidkaigi.confsched2018.data.repository.SessionDataRepository
import io.github.droidkaigi.confsched2018.data.repository.SessionRepository
import io.github.droidkaigi.confsched2018.util.rx.AppSchedulerProvider
import io.github.droidkaigi.confsched2018.util.rx.SchedulerProvider
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.threeten.bp.LocalDateTime
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton

@Module(includes = [(ViewModelModule::class)])
internal class AppModule {

@Singleton @Provides
fun provideSessionReposiotry(
fun provideSessionRepository(
api: DroidKaigiApi,
sessionDatabase: SessionDatabase,
favoriteDatabase: FavoriteDatabase,
Expand All @@ -41,58 +27,11 @@ internal class AppModule {
SessionDataRepository(api, sessionDatabase, favoriteDatabase, schedulerProvider)

@Singleton @Provides
fun provideSessionDatabase(
appDatabase: AppDatabase,
sessionDbDao: SessionDao,
speakerDao: SpeakerDao,
sessionSpeakerJoinDao: SessionSpeakerJoinDao
): SessionDatabase = SessionRoomDatabase(appDatabase, sessionDbDao, speakerDao, sessionSpeakerJoinDao)

@Singleton @Provides
fun provideFeedReposiotry(
fun provideFeedRepository(
feedApi: FeedApi
): FeedRepository =
FeedDataRepository(feedApi)

@Singleton @Provides
fun provideDroidKaigiService(): DroidKaigiApi {
val httpClient = OkHttpClient
.Builder()
.addNetworkInterceptor(HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY))
.build()
return Retrofit.Builder()
.client(httpClient)
.baseUrl("https://sessionize.com/api/v2/xtj7shk8/view/")
.addConverterFactory(MoshiConverterFactory.create(Moshi.Builder()
.add(ApplicationJsonAdapterFactory.INSTANCE)
.add(LocalDateTime::class.java, LocalDateTimeJsonAdapter())
.build()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
.build()
.create<DroidKaigiApi>(DroidKaigiApi::class.java)
}

@Singleton @Provides
fun provideFeedApi(): FeedApi = FeedFireStoreApi()

@Singleton @Provides
fun provideFavoriteDatabase(): FavoriteDatabase =
FavoriteFireStoreDatabase()

@Singleton @Provides
fun provideDb(app: Application): AppDatabase =
Room.databaseBuilder(app, AppDatabase::class.java, "droidkaigi.db").build()

@Singleton @Provides
fun provideSessionsDao(db: AppDatabase): SessionDao = db.sessionDao()

@Singleton @Provides
fun provideSpeakerDao(db: AppDatabase): SpeakerDao = db.speakerDao()

@Singleton @Provides
fun provideSessionSpeakerJoinDao(db: AppDatabase): SessionSpeakerJoinDao = db.sessionSpeakerDao()

@Singleton @Provides
fun provideSchedulerProvider(): SchedulerProvider = AppSchedulerProvider()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.github.droidkaigi.confsched2018.di

import android.app.Application
import android.arch.persistence.room.Room
import dagger.Module
import dagger.Provides
import io.github.droidkaigi.confsched2018.data.db.*
import io.github.droidkaigi.confsched2018.data.db.dao.SessionDao
import io.github.droidkaigi.confsched2018.data.db.dao.SessionSpeakerJoinDao
import io.github.droidkaigi.confsched2018.data.db.dao.SpeakerDao
import javax.inject.Singleton

@Module internal class DatabaseModule {

@Singleton @Provides
fun provideSessionDatabase(
appDatabase: AppDatabase,
sessionDbDao: SessionDao,
speakerDao: SpeakerDao,
sessionSpeakerJoinDao: SessionSpeakerJoinDao
): SessionDatabase = SessionRoomDatabase(appDatabase, sessionDbDao, speakerDao, sessionSpeakerJoinDao)

@Singleton @Provides
fun provideFavoriteDatabase(): FavoriteDatabase =
FavoriteFireStoreDatabase()

@Singleton @Provides
fun provideDb(app: Application): AppDatabase =
Room.databaseBuilder(app, AppDatabase::class.java, "droidkaigi.db").build()

@Singleton @Provides
fun provideSessionsDao(db: AppDatabase): SessionDao = db.sessionDao()

@Singleton @Provides
fun provideSpeakerDao(db: AppDatabase): SpeakerDao = db.speakerDao()

@Singleton @Provides
fun provideSessionSpeakerJoinDao(db: AppDatabase): SessionSpeakerJoinDao = db.sessionSpeakerDao()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package io.github.droidkaigi.confsched2018.di

import dagger.Module
import dagger.android.ContributesAndroidInjector
import io.github.droidkaigi.confsched2018.presentation.detail.DetailFragment
import io.github.droidkaigi.confsched2018.presentation.favorite.FavoriteSessionsFragment
import io.github.droidkaigi.confsched2018.presentation.feed.FeedFragment
import io.github.droidkaigi.confsched2018.presentation.search.SearchFragment
Expand All @@ -24,4 +25,6 @@ import io.github.droidkaigi.confsched2018.presentation.sessions.SessionsFragment
@ContributesAndroidInjector abstract fun contributeFavoriteSessionsFragment(): FavoriteSessionsFragment

@ContributesAndroidInjector abstract fun contributeFeedFragment(): FeedFragment

@ContributesAndroidInjector abstract fun contributeDetailFragment(): DetailFragment
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.github.droidkaigi.confsched2018.di

import dagger.Module
import dagger.android.ContributesAndroidInjector
import io.github.droidkaigi.confsched2018.presentation.MainActivity

@Module abstract class MainActivityBuilder {
@ContributesAndroidInjector(modules = [FragmentBuildersModule::class, MainActivityModule::class])
abstract fun contributeMainActivity(): MainActivity
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package io.github.droidkaigi.confsched2018.di

import android.support.v7.app.AppCompatActivity
import dagger.Binds
import dagger.Module
import dagger.android.ContributesAndroidInjector
import io.github.droidkaigi.confsched2018.presentation.MainActivity

@Module abstract class MainActivityModule {
@ContributesAndroidInjector(modules = [(FragmentBuildersModule::class)])
abstract fun contributeMainActivity(): MainActivity
@Module
interface MainActivityModule {
@Binds fun providesAppCompatActivity(mainActivity: MainActivity): AppCompatActivity
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.github.droidkaigi.confsched2018.di

import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
import io.github.droidkaigi.confsched2018.data.api.DroidKaigiApi
import io.github.droidkaigi.confsched2018.data.api.FeedApi
import io.github.droidkaigi.confsched2018.data.api.FeedFireStoreApi
import io.github.droidkaigi.confsched2018.data.api.response.mapper.ApplicationJsonAdapterFactory
import io.github.droidkaigi.confsched2018.data.api.response.mapper.LocalDateTimeJsonAdapter
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.threeten.bp.LocalDateTime
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton

@Module internal class NetworkModule {

@Singleton @Provides
fun provideDroidKaigiService(): DroidKaigiApi {
val httpClient = OkHttpClient
.Builder()
.addNetworkInterceptor(HttpLoggingInterceptor()
.setLevel(HttpLoggingInterceptor.Level.BODY))
.build()
return Retrofit.Builder()
.client(httpClient)
.baseUrl("https://sessionize.com/api/v2/xtj7shk8/view/")
.addConverterFactory(MoshiConverterFactory.create(Moshi.Builder()
.add(ApplicationJsonAdapterFactory.INSTANCE)
.add(LocalDateTime::class.java, LocalDateTimeJsonAdapter())
.build()))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createAsync())
.build()
.create<DroidKaigiApi>(DroidKaigiApi::class.java)
}

@Singleton @Provides
fun provideFeedApi(): FeedApi = FeedFireStoreApi()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.github.droidkaigi.confsched2018.di

import dagger.Module
import dagger.android.ContributesAndroidInjector
import io.github.droidkaigi.confsched2018.presentation.detail.SessionDetailActivity

@Module abstract class SessionDetailActivityBuilder {
@ContributesAndroidInjector(modules = [FragmentBuildersModule::class, SessionDetailActivityModule::class])
abstract fun contributeSessionDetailActivity(): SessionDetailActivity

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.github.droidkaigi.confsched2018.di

import android.support.v7.app.AppCompatActivity
import dagger.Binds
import dagger.Module
import io.github.droidkaigi.confsched2018.presentation.detail.SessionDetailActivity

@Module
interface SessionDetailActivityModule {
@Binds
fun providesAppCompatActivity(sessionDetailActivity: SessionDetailActivity): AppCompatActivity
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.arch.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import io.github.droidkaigi.confsched2018.presentation.detail.SessionDetailViewModel
import io.github.droidkaigi.confsched2018.presentation.favorite.FavoriteSessionsViewModel
import io.github.droidkaigi.confsched2018.presentation.feed.FeedViewModel
import io.github.droidkaigi.confsched2018.presentation.search.SearchSessionViewModel
Expand All @@ -20,19 +21,19 @@ import io.github.droidkaigi.confsched2018.presentation.sessions.SessionsViewMode

@Binds @IntoMap
@ViewModelKey(FavoriteSessionsViewModel::class)
abstract fun bindFavoriteSessionsViewModel(allSessionsViewModel: FavoriteSessionsViewModel): ViewModel
abstract fun bindFavoriteSessionsViewModel(favoriteSessionsViewModel: FavoriteSessionsViewModel): ViewModel

@Binds @IntoMap
@ViewModelKey(SessionsViewModel::class)
abstract fun bindSessionsViewModel(sessionsViewModel: SessionsViewModel): ViewModel

@Binds @IntoMap
@ViewModelKey(RoomSessionsViewModel::class)
abstract fun bindRoomSessionsViewModel(sessionsViewModel: RoomSessionsViewModel): ViewModel
abstract fun bindRoomSessionsViewModel(roomSessionsViewModel: RoomSessionsViewModel): ViewModel

@Binds @IntoMap
@ViewModelKey(SearchSessionViewModel::class)
abstract fun bindSearchSessionViewModel(sessionsViewModel: SearchSessionViewModel): ViewModel
abstract fun bindSearchSessionViewModel(searchSessionViewModel: SearchSessionViewModel): ViewModel


@Binds @IntoMap
Expand All @@ -41,7 +42,11 @@ import io.github.droidkaigi.confsched2018.presentation.sessions.SessionsViewMode

@Binds @IntoMap
@ViewModelKey(FeedViewModel::class)
abstract fun bindFeedViewModel(searchViewModel: FeedViewModel): ViewModel
abstract fun bindFeedViewModel(feedViewModel: FeedViewModel): ViewModel

@Binds @IntoMap
@ViewModelKey(SessionDetailViewModel::class)
abstract fun bindSessionDetailViewModel(sessionDetailViewModel: SessionDetailViewModel): ViewModel

@Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class MainActivity : AppCompatActivity(), HasSupportFragmentInjector {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(binding.toolbar)

setupBottomNavigation(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package io.github.droidkaigi.confsched2018.presentation

import android.support.v4.app.FragmentManager
import android.support.v7.app.AppCompatActivity
import io.github.droidkaigi.confsched2018.R
import io.github.droidkaigi.confsched2018.model.Session
import io.github.droidkaigi.confsched2018.presentation.detail.DetailFragment
import io.github.droidkaigi.confsched2018.presentation.detail.SessionDetailActivity
import io.github.droidkaigi.confsched2018.presentation.favorite.FavoriteSessionsFragment
import io.github.droidkaigi.confsched2018.presentation.feed.FeedFragment
import io.github.droidkaigi.confsched2018.presentation.search.SearchFragment
import io.github.droidkaigi.confsched2018.presentation.sessions.SessionsFragment
import javax.inject.Inject

class NavigationController @Inject constructor(mainActivity: MainActivity) {
private val containerId: Int
private val fragmentManager: FragmentManager

init {
this.containerId = R.id.content
this.fragmentManager = mainActivity.supportFragmentManager
}
class NavigationController @Inject constructor(private val activity: AppCompatActivity) {
private val containerId: Int = R.id.content
private val fragmentManager: FragmentManager = activity.supportFragmentManager

fun navigateToSessions() {
fragmentManager
Expand Down Expand Up @@ -44,4 +43,15 @@ class NavigationController @Inject constructor(mainActivity: MainActivity) {
.replace(containerId, FeedFragment.newInstance())
.commitAllowingStateLoss()
}

fun navigateToDetail(sessionId: String) {
fragmentManager
.beginTransaction()
.replace(containerId, DetailFragment.newInstance(sessionId))
.commitAllowingStateLoss()
}

fun navigateToDetailActivity(session: Session) {
SessionDetailActivity.start(activity, session)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class ImageBinding {}

@BindingAdapter("bind:colorTint", "app:srcCompat")
fun ImageView.setColorTint(@ColorInt color: Int, drawable: Drawable) {
drawable ?: return
val wrappedDrawable = DrawableCompat.wrap(drawable.mutate())
DrawableCompat.setTint(wrappedDrawable, color)
setImageDrawable(wrappedDrawable)
Expand Down
Loading

0 comments on commit 1669729

Please sign in to comment.