All Projects → DroidKaigi → Conference App 2018

DroidKaigi / Conference App 2018

Licence: apache-2.0
The Official Conference App for DroidKaigi 2018 Tokyo

Programming Languages

kotlin
9241 projects

Projects that are alternatives of or similar to Conference App 2018

Conference App 2017
The Official Conference App for DroidKaigi 2017 Tokyo
Stars: ✭ 476 (-64.02%)
Mutual labels:  android-app, conference
Kotlin Mpp Standard
A standard setup for Kotlin multiplatform projects.
Stars: ✭ 92 (-93.05%)
Mutual labels:  android-app
Xprivacylua
Really simple to use privacy manager for Android 6.0 Marshmallow and later
Stars: ✭ 1,222 (-7.63%)
Mutual labels:  android-app
Lbrnmeituan
ReactNative 仿美团项目
Stars: ✭ 84 (-93.65%)
Mutual labels:  android-app
Showmethecode
Stars: ✭ 80 (-93.95%)
Mutual labels:  conference
Moonlight Android
GameStream client for Android
Stars: ✭ 1,273 (-3.78%)
Mutual labels:  android-app
Marinator
Delicious Dependency Injection
Stars: ✭ 79 (-94.03%)
Mutual labels:  android-app
One Vue
仿韩寒「ONE · 一个」,基于vue2.0+混合式开发的一款跨终端、高性能、用户体验高的移动端App! 学习Vue的同学可以看下,感谢 Star 和 Fork!!
Stars: ✭ 93 (-92.97%)
Mutual labels:  android-app
Glide Support
Android application to test out issues from the Glide image loading library
Stars: ✭ 88 (-93.35%)
Mutual labels:  android-app
Photok
Encrypted Photo Safe for Android
Stars: ✭ 83 (-93.73%)
Mutual labels:  android-app
Calenstyle
Responsive Drag-&-Drop Event Calendar Library for Web, Mobile Sites, Android, iOS & Windows Phone
Stars: ✭ 83 (-93.73%)
Mutual labels:  android-app
Confcitizens
Open-source and crowd-sourced conference speakers website
Stars: ✭ 83 (-93.73%)
Mutual labels:  conference
Awesome Cfp
A collection of awesome Call For Papers to never miss to speak anymore 🗣
Stars: ✭ 87 (-93.42%)
Mutual labels:  conference
Chatter App
This is a flutter based modern messaging app where users can sign up and log in to chat with their friends, family, colleagues among groups with enriched User-Experience.
Stars: ✭ 80 (-93.95%)
Mutual labels:  android-app
Twitlatte
Twitter and Mastodon client for Android
Stars: ✭ 92 (-93.05%)
Mutual labels:  android-app
Cfp Devoxx
Call for Papers application created for Devoxx France, used by many conferences
Stars: ✭ 79 (-94.03%)
Mutual labels:  conference
Mihomeplus
HomeKit 的 Android 操作代理
Stars: ✭ 83 (-93.73%)
Mutual labels:  android-app
Camcontrol
Open source app to connect with popular action cameras, replacing your vendor's closed source app system.
Stars: ✭ 85 (-93.58%)
Mutual labels:  android-app
Pasta For Spotify
A material design Spotify client for Android
Stars: ✭ 93 (-92.97%)
Mutual labels:  android-app
Deautherdroid
Additional android app for SpaceHunn's ESP8266 DeAuther.
Stars: ✭ 93 (-92.97%)
Mutual labels:  android-app

DroidKaigi 2018 official Android app

CircleCIWaffle.io - Columns and their card count

DroidKaigi 2018 is a conference tailored for developers on 8th and 9th February 2018.

Try it on your device via DeployGate

Features

  • View conference schedule and details of each session
  • Set notification for upcoming sessions on your preference
  • Search sessions and speakers and topics
  • Show Information Feed

Contributing

We are always welcome your contribution!

How to find the tasks

We use waffle.io to manage the tasks. Please find the issues you'd like to contribute in it. welcome contribute and easy are good for first contribution.

Of course, it would be great to send PullRequest which has no issue!

How to contribute

If you find the tasks you want to contribute, please comment in the issue like this to prevent to conflict contribution. We'll reply as soon as possible, but it's unnecessary to wait our reaction. It's okay to start contribution and send PullRequest!

We've designated these issues as good candidates for easy contribution. You can always fork the repository and send a pull request (on a branch other than master).

Development Environment

Kotlin

This app is full Kotlin!

RxJava2 & LiveData

Converting RxJava2's publisher to AAC LiveData with LiveDataReactiveStreams.

AllSessionsViewModel.kt

repository.sessions
    .toResult(schedulerProvider)
    .toLiveData()

LiveDataReactiveStreamsExt.kt

fun <T> Publisher<T>.toLiveData() = LiveDataReactiveStreams.fromPublisher(this)

Groupie

By using Groupie you can simplify the implementation around RecyclerView.

data class SpeakerItem(
        val speaker: Speaker
) : BindableItem<ItemSpeakerBinding>(speaker.id.hashCode().toLong()) {

    override fun bind(viewBinding: ItemSpeakerBinding, position: Int) {
        viewBinding.speaker = speaker
    }

    override fun getLayout(): Int = R.layout.item_speaker
}

Architecture

This app uses an Android Architecture Components(AAC) based architecture using AAC(LiveData, ViewModel, Room), Kotlin, RxJava, DataBinding, dependency injection, Firebase.

Fragment -> ViewModel

Use LifecycleObserver for telling lifecycle to ViewModel.

SessionsFragment.kt

class SessionsFragment : Fragment(), Injectable {

    private lateinit var sessionsViewModel: SessionsViewModel

...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        ...
        lifecycle.addObserver(sessionsViewModel)
        ...

SessionsViewModel.kt

class SessionsViewModel @Inject constructor(
        private val repository: SessionRepository,
        private val schedulerProvider: SchedulerProvider
) : ViewModel(), LifecycleObserver {
  ...
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate() {
    ...
}

ViewModel -> Repository

Use RxJava2(RxKotlin) and ViewModel#onCleared() for preventing leaking.

SessionsViewModel.kt

    private val compositeDisposable: CompositeDisposable = CompositeDisposable()

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate() {
        repository
                .refreshSessions()
                .subscribeBy(onError = defaultErrorHandler())
                .addTo(compositeDisposable)
    }

    override fun onCleared() {
        super.onCleared()
        compositeDisposable.clear()
    }

Repository -> API, Repository -> DB

Use Retrofit and save to the Architecture Component Room.

SessionDataRepository.kt

    override fun refreshSessions(): Completable {
        return api.getSessions()
                .doOnSuccess { response ->
                    sessionDatabase.save(response)
                }
                .subscribeOn(schedulerProvider.computation())
                .toCompletable()
    }

DB -> Repository

Use Room with RxJava2 Flowable Support. And SessionDataRepository holds Flowable property.

SessionDao.kt

    @Query("SELECT room_id, room_name FROM session GROUP BY room_id ORDER BY room_id")
    abstract fun getAllRoom(): Flowable<List<RoomEntity>>

SessionDataRepository.kt

class SessionDataRepository @Inject constructor(
        private val sessionDatabase: SessionDatabase,
...
) : SessionRepository {

    override val rooms: Flowable<List<Room>> =
            sessionDatabase.getAllRoom().toRooms()

Repository -> ViewModel

We create LiveData from a ReactiveStreams publisher with LiveDataReactiveStreams

SessionsViewModel.kt

    val rooms: LiveData<Result<List<Room>>> by lazy {
        repository.rooms
                .toResult(schedulerProvider)
                .toLiveData()
    }

LiveDataReactiveStreamsExt.kt

fun <T> Publisher<T>.toLiveData() = LiveDataReactiveStreams.fromPublisher(this) as LiveData<T>

And using Result class for error handling with Kotlin extension.

fun <T> Flowable<T>.toResult(schedulerProvider: SchedulerProvider): Flowable<Result<T>> =
        compose { item ->
            item
                    .map { Result.success(it) }
                    .onErrorReturn { e -> Result.failure(e.message ?: "unknown", e) }
                    .observeOn(schedulerProvider.ui())
                    .startWith(Result.inProgress())
        }
sealed class Result<T>(val inProgress: Boolean) {
    class InProgress<T> : Result<T>(true)
    data class Success<T>(var data: T) : Result<T>(false)
    data class Failure<T>(val errorMessage: String?, val e: Throwable) : Result<T>(false)

ViewModel -> Fragment

Fragment observe ViewModel's LiveData. We can use the result with Kotlin when expression. In is Result.Success block, you can access data with result.data by Kotlin Smart cast.

SessionsFragment.kt

        sessionsViewModel.rooms.observe(this, { result ->
            when (result) {
                is Result.InProgress -> {
                    binding.progress.show()
                }
                is Result.Success -> {
                    binding.progress.hide()
                    sessionsViewPagerAdapter.setRooms(result.data)
                }
                is Result.Failure -> {
                    Timber.e(result.e)
                    binding.progress.hide()
                }
            }
        })

Release

The release process is automated by using gradle-play-publisher. When we add git tag, CI deploys the release apk to GooglePlay alpha. To know more details, see .circleci/config.yml

elif [[ "${CIRCLE_TAG}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo "Deploy to Google Play"
    openssl aes-256-cbc -k $PUBLISHER_KEYS_JSON_DECRYPT_PASSWORD -d -in encrypted-publisher-keys.json -out app/publisher-keys.json
    ./gradlew publishApkRelease
fi

iOS App with Kotlin/Native and Kotlin Multiplatform Projects

Some contributors are challenging to develop iOS app with Kotlin/Native and Kotlin Multiplatform Projects.
We are watching this project. DroidKaigi2018iOS

DroidKaigi 2018 Flutter App

The unofficial conference app for DroidKaigi 2018 Tokyo https://github.com/konifar/droidkaigi2018-flutter

Thanks

Thank you for contributing!

Credit

This project uses some modern Android libraries and source codes.

License

Copyright 2018 DroidKaigi

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].