Real life Kotlin Multiplatform project with an iOS application developed in Swift with SwiftUI, an Android application developed in Kotlin with Jetpack Compose and a backed in Kotlin hosted on AppEngine.

Overview

Conferences4Hall

Real life Kotlin Multiplatform project with an iOS application developed in Swift with SwiftUI, an Android application developed in Kotlin with Jetpack Compose and a backed in Kotlin hosted on AppEngine.

Features

  • Create the agenda of your conference, optionally from Conference Hall
  • Fetch your partners from CMS4Partners
  • Create your feedback forms to OpenFeedback.io
  • Import a participant ticket from BilletWeb
  • Networking space which respect privacy from mobile to mobile
  • Mobile application for Android and iOS

Build With

  • Kotlin - First class and official programming language for Android development
  • Jetpack Compose - Modern toolkit for building native UI
  • Accompanist - Collection of extension libraries for Jetpack Compose
  • Coil - Media management and image loading framework for Android
  • ViewModel - Stores UI-related data that isn't destroyed on UI changes
  • Navigation Compose - Allow users to navigate across, into, and back out from the different pieces of content within your app
  • Swift - First class and official programming language for iOS development
  • SwiftUI - Build apps across all Apple platforms with Swift
  • Kotlin Coroutines - Light-weight threads
  • kotlinx.serialization - Kotlin Multiplatform / multi format serialization
  • SQLDelight - Generates typesafe Kotlin APIs from SQL
  • Multiplatform Settings - Kotlin Multiplatform library for saving simple key-value data
  • ktor - Client to make HTTP request and HTTP server routing
  • Firestore - JVM client to make request on Firestore
  • Storage - JVM client to make request on Storage

Architecture

Kotlin Multiplatform project where :androidApp and :iosApp share the same codebase for the business logic (with :shared module). :backend and :shared modules share the same models due to :models module and avoid any errors in the parsing of backend responses.

flowchart LR
    :androidApp --> :shared
    :iosApp --> :shared
    :shared --> :models
    :backend --> :models

Testing

Running in local

Start firebase emulators inside a terminal with Firestore service.

firebase login # If you are not yet logged
firebase emulators:start --project $RANDOM_FIREBASE_PROJECT_ID

Start appengine server inside another terminal to interact with the local instance of your Firebase.

# Export credential of a random GCP account.
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json
./gradlew :backend:installDist && ./backend/build/install/backend/bin/backend

Now, you can start to interact with the backend.

Deploy in GCP

# If you are not yet logged
gcloud auth login
gcloud config set project $PROJECT_ID
# Deploy in production
./gradlew :backend:appengineDeploy

References

License

Copyright 2022 Gérard Paligot.

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.
Comments
  • feat(android): ProfileInput UI changes

    feat(android): ProfileInput UI changes

    • Content padding
    • From TextField to OutlinedTextField (arguable)
    • Enable/disable button depending on form fields

    | Before | After | | ------------- | ------------- | | | | | | |

    opened by BapNesS 2
  • feat(android): Request permission screen improvement

    feat(android): Request permission screen improvement

    • Small improvement of request permission screens : outlined button, wording, spacing, margin, …
    • Extract composable to enable Previews

    Result without external margin: image

    opened by BapNesS 1
  • Rework Material You implementation inspired by Vitamin implementation

    Rework Material You implementation inspired by Vitamin implementation

    After the integration of the new Design System Vitamin, Material You implementation should be updated to match features and UI of Vitamin implementation which is so much better than M2 and M3 implementations.

    enhancement Android a11y 
    opened by GerardPaligot 0
  • Fetch speakers from conferences hall

    Fetch speakers from conferences hall

    • Fetch all speakers from Conferences Hall with their avatars
    • Fetch only one speaker from Conferences Hall to update their information
    • Can override their information with a body in the request if it is a specific speaker
    enhancement backend 
    opened by GerardPaligot 0
  • Link to replay and slides

    Link to replay and slides

    Describe

    • Add fields replay_link and slides_link in the talk object
    • Below network links, add a button for the replay and/or slides

    Specification proposal

    {
      "talks": {
        "hh:mm": {
          "replay_link": "https://...",
          "slides_link": "https://..."
        }
      }
    }
    
    enhancement good first issue iOS Android backend 
    opened by GerardPaligot 0
  • Support event with several days

    Support event with several days

    Describe

    • Update the output of the /agenda route to support multiple days
    • Add tabs if there are more than one day

    Specification proposal

    {
      "YYYY-MM-dd": {
        "hh:mm": {
          // schedule object
        }
      }
    }
    
    enhancement iOS Android backend 
    opened by GerardPaligot 0
  • Add Baseline Profile to improve performance at the start of the app

    Add Baseline Profile to improve performance at the start of the app

    Describe

    • Add the baseline profile library in the androidApp module
    • Add a test to generate the baseline profile output
    • Get the output from the device and put it on src/main directory

    Resources

    https://developer.android.com/topic/performance/baselineprofiles

    enhancement good first issue Android 
    opened by GerardPaligot 0
  • Return 304 http status code when the agenda doesn't change

    Return 304 http status code when the agenda doesn't change

    Describe

    • /agenda need to return the version of the agenda (like the last update timestamp)
    • Clients need to send a version name in a header (but can be optional, in this case, 304 won't be sent)
    • If the version name is the same in database, we return 304. Otherwise, we return the full agenda

    Solutions

    This should impact only the shared and backend modules.

    enhancement iOS Android backend 
    opened by GerardPaligot 0
  • Use AndroidX startup to load remote data if needed

    Use AndroidX startup to load remote data if needed

    Describe

    • Add Jetpack startup dependency in the project
    • Migrate the import call from Agenda ViewModel to the startup initializer

    Resources

    https://developer.android.com/topic/libraries/app-startup

    enhancement good first issue Android 
    opened by GerardPaligot 0
  • Compose tests on ui components

    Compose tests on ui components

    Describe

    • Junit compose tests
    • Snapshot testing with Paparazzi
    • Github Actions dedicated to start tests

    Resources

    • Testing your compose layout: https://developer.android.com/jetpack/compose/testing
    • Paparazzi: https://github.com/cashapp/paparazzi
    good first issue Android 
    opened by GerardPaligot 0
  • Support adaptive UI with Window Size Classes

    Support adaptive UI with Window Size Classes

    Describe

    • Use Material3 artifact to get Window Size Classes and check the current size of the device
    • Keep the same navigation across all window sizes to avoid any state issue
    • Adapt the UI for each window size

    Resources

    • Support different screen sizes: https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes
    • Material3 windowsizeclass: https://developer.android.com/reference/kotlin/androidx/compose/material3/windowsizeclass/package-summary
    enhancement Android 
    opened by GerardPaligot 0
  • Better support of the status and navigation bar color

    Better support of the status and navigation bar color

    Describe

    Because the android app use a bottom app bar with a tonal elevation, the surface color used is transformed according to the elevation. We need to add a better support of the status and navigation bar colors for a better experience.

    Solutions

    1. NowInAndroid implements the status and navigation bar colors with window api and theming based on style
    2. SystemUiController in Accompanist libraries to customize the color of the status and navigation bar colors
    enhancement Android 
    opened by GerardPaligot 1
Owner
Gérard Paligot
Father and Husband // Google Dev Export for Android // Staff Engineer @Decathlon // LAUG, @GDG-Lille, DevfestLille organizer // Disney Fan
Gérard Paligot
🍭 GithubSearchKMM - Github Repos Search - Android - iOS - Kotlin Multiplatform Mobile using Jetpack Compose, SwiftUI, FlowRedux, Coroutines Flow, Dagger Hilt, Koin Dependency Injection, shared KMP ViewModel, Clean Architecture

GithubSearchKMM Github Repos Search - Kotlin Multiplatform Mobile using Jetpack Compose, SwiftUI, FlowRedux, Coroutines Flow, Dagger Hilt, Koin Depend

Petrus Nguyễn Thái Học 50 Jan 7, 2023
KmMScientists is a Kotlin multiplatform app with swift ui, jetpack compose, koin and realm

KmMScientists KmMScientists is a Kotlin multiplatform app built with swift ui, jetpack compose, koin and realm. Whats Shared? Local Data Persistence w

Kashif Mehmood 20 Dec 27, 2022
Opinionated Redux-like implementation backed by Kotlin Coroutines and Kotlin Multiplatform Mobile

CoRed CoRed is Redux-like implementation that maintains the benefits of Redux's core idea without the boilerplate. No more action types, action creato

Kittinun Vantasin 28 Dec 10, 2022
Server Sent Events (SSE) client multiplatform library made with Kotlin and backed by coroutines

OkSSE OkSSE is an client for Server Sent events protocol written in Kotlin Multiplatform. The implementation is written according to W3C Recommendatio

BioWink GmbH 39 Nov 4, 2022
GraphQL based Jetpack Compose and SwiftUI Kotlin Multiplatform sample

GraphQL based Jetpack Compose and SwiftUI Kotlin Multiplatform sample

John O'Reilly 151 Jan 3, 2023
Kotlin Multiplatform lifecycle-aware business logic components (aka BLoCs) with routing functionality and pluggable UI (Jetpack Compose, SwiftUI, JS React, etc.), inspired by Badoos RIBs fork of the Uber RIBs framework

Decompose Please see the project website for documentation and APIs. Decompose is a Kotlin Multiplatform library for breaking down your code into life

Arkadii Ivanov 819 Dec 29, 2022
Kotlin Multiplatform Mobile + Mobile Declarative UI Framework (Jetpack Compose and SwiftUI)

Kotlin Multiplatform Mobile + Mobile Declarative UI Framework (Jetpack Compose and SwiftUI)

Kotchaphan Muangsan 3 Nov 15, 2022
MangaKu App Powered by Kotlin Multiplatform Mobile, Jetpack Compose, and SwiftUI

MangaKu ?? Introduction MangaKu App Powered by Kotlin Multiplatform Mobile, Jetpack Compose, and SwiftUI Module core: data and domain layer iosApp: io

Uwais Alqadri 132 Jan 8, 2023
Image loading for Android backed by Kotlin Coroutines.

An image loading library for Android backed by Kotlin Coroutines. Coil is: Fast: Coil performs a number of optimizations including memory and disk cac

Coil 8.8k Jan 7, 2023
D-KMP Architecture official sample: it uses a shared KMP ViewModel and Navigation for Compose and SwiftUI apps.

D-KMP architecture - official sample This is the official sample of the D-KMP architecture, presenting a simple master/detail app, for Android, iOS an

null 594 Jan 3, 2023
Kotlin and Java API for generating .swift source files.

SwiftPoet SwiftPoet is a Kotlin and Java API for generating .swift source files. Source file generation can be useful when doing things such as annota

Outfox 232 Jan 2, 2023
Library to use Kotlin Coroutines from Swift code in KMP apps

KMP-NativeCoroutines A library to use Kotlin Coroutines from Swift code in KMP apps. Flows Kotlin Create an extension property to expose the Flow as a

Rick Clephas 508 Jan 3, 2023
Swift-friendly api generator for Kotlin/Native frameworks

MOKO KSwift KSwift it's gradle plugin for generation Swift-friendly API for Kotlin/Native framework. Kotlin sealed interface/class to Swift enum Kotli

IceRock Development 226 Dec 28, 2022
A Kotlin Multiplatform Project using TMDB Api. Currently supports Android,iOS,Desktop and web platforms

A Kotlin Multiplatform Project using TMDB Api(https://www.themoviedb.org/). Currently this project is implemented in following platforms Andr

Jackson E J 11 Nov 10, 2022
EightyTwenty is life planner application with beautiful user interface.

EightyTwenty EightyTwenty is life planner application with beautiful user interface. Version 0.0.1 Add notes Add categories Add notes with image Move

Behzod Halil 3 Jul 15, 2022
Kstr is a set of helpful methods library for Kotlin intended for make the developer life easier.

Kstr is a set of helpful methods library for Kotlin intended for make the developer life easier. Kstr uses the powerful feature of extension func

Rafael Acioly 0 Nov 3, 2021
Schedule-4-me is an opinionated to-do app to bring chaos to your life.

Schedule-4-me Have you ever had too much control in your life? Ever find yourself stuck at home repeating the same motions over and over again? Well f

null 4 Jan 16, 2022
A Bluetooth kotlin multiplatform "Cross-Platform" library for iOS and Android

Blue-Falcon A Bluetooth "Cross Platform" Kotlin Multiplatform library for iOS, Android, MacOS, Raspberry Pi and Javascript. Bluetooth in general has t

Andrew Reed 220 Dec 28, 2022
Dependency Injection library for Kotlin Multiplatform, support iOS and Android

Multiplatform-DI library for Kotlin Multiplatform Lightweight dependency injection framework for Kotlin Multiplatform application Dependency injection

Anna Zharkova 32 Nov 10, 2022