🐘 Mastodon client for Android, iOS and Desktop (JVM)

Overview

MastodonX

GNU GPL-3.0 CI

A multiplatform Mastodon client written in Kotlin for the amazing androiddev.social community and everyone else who enjoys #Fediverse

Join our Slack


Getting started

The app is not published nor ready for use. Later on it will probably just be installed from any of the available sources.

[F-Droid] [Google Play] [Apple Appstore]

Contribution

This is a free and open project and lives from contributions of the community.

See our Contribution Guidelines

MVP

A MVP (Minimum viable product) is a similified version of a product with only some base funcionality. This is often used to prove a concept or set the baseline of a project.

Roadmap

  • Sign up a new account
  • Sign in with credentials
  • Browse local timeline
  • Create a Toot!
  • Log out

Check out the Progress

License

MastodonX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

MastodonX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with MastodonX. If not, see https://www.gnu.org/licenses/.

Comments
  • [FEAT]: Add Detekt & Lint checker to project

    [FEAT]: Add Detekt & Lint checker to project

    Description

    https://detekt.dev/ https://pinterest.github.io/ktlint/

    At some point it would be nice to get these setup in the project so developers can focus more on contributions and have these checkers as part of CI.

    Additional Information

    No response

    enhancement 
    opened by crocsandcoffee 10
  • Setup Detekt

    Setup Detekt

    πŸ“‘ What does this PR do?

    This PR adds support for Detekt as discussed on issue #11

    The rule add here are the default ones with some tweaks for Jetpack Compose. Such function naming, complexity, compose annotations and Twitter Comose Rules

    βœ… Checklist

    • [x] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [x] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    • Run ./gradlew detekt to run Detekt for the entire project
    • Run ./gradlew module:detekt to run Detekt on a specific module

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    πŸ–ΌοΈ Screenshots (if applicable):

    opened by racka98 5
  • [FEAT]: Find a good / meaningful name

    [FEAT]: Find a good / meaningful name

    Description

    When talking about a product it is mandatory to have a proper name which can be remembered and linked to its functionality. Like the community once came up with Boaty McBoatface we should be able to find some good names as well.

    Let's first collect some ideas and later on we can start a poll for the decision.

    Additional Information

    No response

    help wanted 
    opened by thebino 5
  • [BUG]: ./gradlew installDebug, open the App, it will crashed.

    [BUG]: ./gradlew installDebug, open the App, it will crashed.

    Description of the bug

    ./gradlew installDebug, open the App, it will crashed.

    Steps To Reproduce

    1. git clone https://github.com/AndroidDev-social/MastodonCompose.git
    2. ./gradlew installDebug, open the App, holder seconds in login screen, it will crash

    Additional Information

    Android Version: Android 13 OS: Pixel experience the crash log 2022-11-25 07:57:49.860 28704-28704/? E/AndroidRuntime: FATAL EXCEPTION: main Process: social.androiddev.mastodon, PID: 28704 java.lang.NullPointerException: decodeByteArray(byteArray, 0, byteArray.size) must not be null at social.androiddev.common.utils.ImageLoadingKt.loadImageIntoPainter(ImageLoading.kt:21) at social.androiddev.common.utils.ImageLoadingKt$loadImageIntoPainter$1.invokeSuspend(Unknown Source:13) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42) at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664) Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [[email protected], [email protected], StandaloneCoroutine{Cancelling}@526bd62, [email protected]] 2022-11-25 07:57:49.864 1440-28746/? I/Dro

    bug 
    opened by xuwanjin 4
  • Initial Koin setup across modules

    Initial Koin setup across modules

    πŸ“‘ What does this PR do?

    • Renamed MastodonApiImpl to MastodonApiKtor and marked internal. Added Koin bean to provide the interface MastodonApi which encapsulates implementation.
    • Marked AuthenticationRepositoryImpl as internal. Added Koin bean to provide the interface AuthenticationRepository which encapsulates implementation.
    • Created network and repository koin modules
    • Created new di module for shared DI as well as entry point for resolving all DI modules cross platform and cross project

    βœ… Checklist

    • [x] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [x] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • What is remaining to be implemented in this PR? Mention a list of them

    πŸ–ΌοΈ Screenshots (if applicable):

    opened by crocsandcoffee 4
  • Setup skeleton of authenticating client app

    Setup skeleton of authenticating client app

    πŸ“‘ What does this PR do?

    • I added the first example of a network call with more end-to-end architecture between different modules. This example is the authentication call done to register the client app, before taking them to OAuth for login.

    At a high level here is how the changes look:

    • Updated the domain module to not depend on data module. IMO it should be independent and only depend on platform agnostic shared utilities such as kotlin-utils. (Open for discussion!)
    • Added new module under data for repository implementations that wrap network and persistence. data now has network , persistence and repositories
    • domain module now has interfaces for repositories, and a new use case has been added that works directly with the repository interface.
    • data.network has been updated to expose the relevant mastodon API for authenticating an application
    • data.repositories has a new class that implements the AuthenticationRepository interface, and calls the API in data.network to perform the authentication request, then takes the response client metadata and will store in cache via a data.persistence source (TODO added in PR here)

    I would appreciate any thoughts, questions, feedback on the PR about the dependency graph and architecture set here in addition to whatever else. Thanks :slightly_smiling_face:

    βœ… Checklist

    • [ ] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • What is remaining to be implemented in this PR? Mention a list of them

    πŸ–ΌοΈ Screenshots (if applicable):

    opened by crocsandcoffee 4
  • Sign-In through android and desktop webview

    Sign-In through android and desktop webview

    πŸ“‘ What does this PR do?

    The login is done through a Webview. So I set up two implementations of the Webview, one on Android and the second on desktop.

    The pr aims to identify a viable solution to use a Webview on a desktop. For this, I used JavaFX without going through the official plugin because it is not currently possible to use it in the module alongside the Android Library plugin.

    βœ… Checklist

    • [ ] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • Find a viable solution to use webview on desktop
    • Look at all the places where I put TODO 😬

    πŸ–ΌοΈ Screenshots (if applicable):

    https://user-images.githubusercontent.com/795846/205469581-50d062e3-8a3b-4bb8-aa24-6e6dae125096.mov

    opened by mboukadir 3
  • Add Spacers

    Add Spacers

    πŸ“‘ What does this PR do?

    Add Spacers to start creating our own design language

    βœ… Checklist

    • [x] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    πŸ–ΌοΈ Screenshots (if applicable):

    opened by hrules6872 3
  • [FEAT]: Add iOS targets to existing modules

    [FEAT]: Add iOS targets to existing modules

    Description

    We should add iOS targets to our modules (data and domain layers) as early as possible, even without creating the iOS project. This way we will prevent putting jvm specific code to the common source sets.

    Additional Information

    No response

    enhancement iOS 
    opened by r-gurzkowski 3
  • [FEAT]:  Mocking?

    [FEAT]: Mocking?

    Description

    Since this will be at some point a topic in terms of testing and has some implications - are we going for mocks?

    Currently, there 3 Frameworks (I know of):

    Mockative -> not sure if this is still active MocKMP KMock -> my baby/you can play with it here

    Additional Information

    A few words to KMock - I am currently preparing my next iteration of, which will bring, aside from some dependencies updates, some new stuff. But I will need a bit time for that. However, KMock is a bit different to mockk or Mockito if you are used to it, so I recommend trying it upfront. The big plus is no worries about the setup since the KMock's gradle plugin will do it. It is tightly tested so most limitation are known this far.

    enhancement 
    opened by bitPogo 3
  • [FEAT]: Find a proper license

    [FEAT]: Find a proper license

    Description

    There are many licenses out there, we should find a license where most of the contributors are happy with.

    • should not prohibit the usage of closed source libraries
    • should prevent people from making money based on the community contribution

    Additional Information

    • https://opensource.org/licenses
    • https://creativecommons.org/about/cclicenses/

    Screenshot 2022-11-08 at 15 59 23

    help wanted 
    opened by thebino 3
  • Authenticate using an external browser on desktop

    Authenticate using an external browser on desktop

    πŸ“‘ What does this PR do?

    Authenticate using an external browser on desktop, creating an interface that works on both desktop and android. Making this a draft pr for now because while I'm happy with the functionally I'm not super happy on how things are organized and would like some input there.

    βœ… Checklist

    • [ ] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • What is remaining to be implemented in this PR? Mention a list of them

    πŸ–ΌοΈ Screenshots (if applicable):

    opened by evant 0
  • WIP Basic toot creation screen ui layer

    WIP Basic toot creation screen ui layer

    πŸ“‘ What does this PR do?

    WIP the basic toot creation feature :

    1. UI layer (in progress)
    2. domain (todo)
    3. data (todo)

    βœ… Checklist

    • [ ] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • What is remaining to be implemented in this PR? Mention a list of them

    πŸ–ΌοΈ Screenshots (if applicable):

    Desktop demo

    https://user-images.githubusercontent.com/795846/209015060-f33e2c4f-e93d-4ff7-ab29-6200c3301c55.mov

    opened by mboukadir 0
  • feat(logout): Keep user signed in

    feat(logout): Keep user signed in

    πŸ“‘ What does this PR do?

    As part of https://github.com/AndroidDev-social/DodoForMastodon/issues/107, navigate user to sign in flow once authenticated.

    βœ… Checklist

    • [ ] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [ ] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • Use case to control auth state, exposed via flow

    πŸ–ΌοΈ Screenshots (if applicable):

    opened by krizzu 0
  • Update Image Loader and Implement Naive content templating

    Update Image Loader and Implement Naive content templating

    πŸ“‘ What does this PR do?

    Adds an image loading library Adds a html parsing library displays the avatar parses content html and displays as annotated string with links in blue

    βœ… Checklist

    • [x] My pull request adheres to the code style of this project
    • [ ] My code requires changes to the documentation
    • [ ] I have updated the documentation as required
    • [x] All the tests have passed

    πŸ§ͺ How can this PR been tested?

    🧾 Tasks Remaining: (List of tasks remaining to be implemented)

    • What is remaining to be implemented in this PR? Mention a list of them

    πŸ–ΌοΈ Screenshots (if applicable):

    Screen Shot 2022-12-21 at 9 53 25 AM
    opened by digitalbuddha 1
  • [FEAT]: Settings and Logout

    [FEAT]: Settings and Logout

    Description

    for now, is just add a dummy TopAppBar to the root screen hierarchy when logged in, and add a settings icon that takes you to a new screen with a simple logout button. You'll need to also add logic for clearing/deleting the right user session data which may only be local, not sure yet. Plz feel free to create a GitHub issue with this info if there isn't one already

    Additional Information

    No response

    enhancement 
    opened by krizzu 0
Owner
null
BlurHash support for iOS, Android and JVM via Kotlin Multiplatform

blurhash A Kotlin Multiplatform library to use blurhash in your Android App, iOS / Mac App & JVM Backend. Android iOS JVM Why? If you've tried using b

Niklas Baudy 19 Nov 17, 2022
Cross-platform framework for building truly native mobile apps with Java or Kotlin. Write Once Run Anywhere support for iOS, Android, Desktop & Web.

Codename One - Cross Platform Native Apps with Java or Kotlin Codename One is a mobile first cross platform environment for Java and Kotlin developers

Codename One 1.4k Jan 9, 2023
Kotlin Multiplatform Sample - Android, iOS, Web, Desktop

KMP-Sample Kotlin Multiplatform Sample Android iOS Web (Compose for web) Desktop (Compose for desktop) ?? Structure Diagram ?? Build At least android

μ•ˆν™λ²” 14 Dec 13, 2022
Create an application with Kotlin/JVM and Kotlin/JS, and explore features around code sharing, serialization, server- and client

Practical Kotlin Multiplatform on the Web λ³Έ μ €μž₯μ†ŒλŠ” μ½”ν‹€λ¦° λ©€ν‹°ν”Œλž«νΌ 기반 μ›Ή ν”„λ‘œκ·Έλž˜λ° μ›Œν¬μˆ(κ°•μ’Œ)을 μœ„ν•΄ μž‘μ„±λœ ν…œν”Œλ¦Ώ ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” κ³³μž…λ‹ˆλ‹€. μ›Œν¬μˆ κ³Όμ •μ—μ„œ μ½”ν‹€λ¦° λ©€ν‹°ν”Œλž«νΌμ„ 기반으둜 ν”„λ‘ νŠΈμ—”λ“œ(front-end)λŠ” Ko

SpringRunner 14 Nov 5, 2022
Create an application with Kotlin/JVM and Kotlin/JS, and explore features around code sharing, serialization, server- and client

Building a Full Stack Web App with Kotlin Multiplatform λ³Έ μ €μž₯μ†ŒλŠ” INFCON 2022μ—μ„œ μ½”ν‹€λ¦° λ©€ν‹°ν”Œλž«νΌ 기반 μ›Ή ν”„λ‘œκ·Έλž˜λ° ν•Έμ¦ˆμ˜¨λž©μ„ μœ„ν•΄ μž‘μ„±λœ ν…œν”Œλ¦Ώ ν”„λ‘œμ νŠΈκ°€ μžˆλŠ” κ³³μž…λ‹ˆλ‹€. ν•Έμ¦ˆμ˜¨ κ³Όμ •μ—μ„œ μ½”ν‹€λ¦° λ©€ν‹°ν”Œλž«νΌμ„

Arawn Park 19 Sep 8, 2022
Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.

Kotlin Multiplatform is an SDK for cross-platform mobile development, which enables teams to use the same business logic in both Android and iOS client applications.

Chris Russell 1 Feb 11, 2022
Kotlin-client-dsl - A kotlin-based dsl project for a (Client) -> (Plugin) styled program

kotlin-client-dsl a kotlin-based dsl project for a (Client) -> (Plugin) styled p

jackson 3 Dec 10, 2022
A Kotlin Multiplatform and Compose template that allows you to easily set up your project targeting: Android, Desktop, and Web

A Kotlin Multiplatform and Compose template that allows you to easily set up your project targeting: Android, Desktop, and Web

Carlos Mota 3 Oct 27, 2021
Unsplash application for Android, Desktop and Web. Built using Kotlin Multiplatform and Compose

Unsplash Unsplash application for Android, Desktop and Web. Built using Kotlin Multiplatform and Compose with ❀️ ?? Presentation Set up the environmen

Carlos Mota 15 Nov 11, 2022
:blowfish: An Android & JVM key-value storage powered by Protobuf and Coroutines

PufferDB PufferDB is a ⚑ key-value storage powered by Protocol Buffers (aka Protobuf) and Coroutines. The purpose of this library is to provide an eff

Adriel CafΓ© 94 Dec 7, 2022
🚟 Lightweight, and simple scheduling library made for Kotlin (JVM)

Haru ?? Lightweight, and simple scheduling library made for Kotlin (JVM) Why did you build this? I built this library as a personal usage library to h

Noel 13 Dec 16, 2022
A Template for a Github Actions Pipeline for building and publishing Gradle-JVM Applications

github-actions-cd-template-jvm A Template for a Github Actions Pipeline for building and publishing Gradle-JVM Applications It build a executable shad

Raphael Panic 0 Dec 5, 2021
Run Kotlin/JS libraries in Kotlin/JVM and Kotlin/Native programs

Zipline This library streamlines using Kotlin/JS libraries from Kotlin/JVM and Kotlin/Native programs. It makes it possible to do continuous deploymen

Cash App 1.5k Dec 30, 2022
Lightweight compiler plugin intended for Kotlin/JVM library development and symbol visibility control.

Restrikt A Kotlin/JVM compiler plugin to restrict symbols access, from external project sources. This plugin offers two ways to hide symbols: An autom

Lorris Creantor 18 Nov 24, 2022
πŸ”– A Quotes Application built to Demonstrate the Compose for Desktop UI

A Quotes Application built to Demonstrate the use of Jetpack Compose for building declarative UI in Desktop

Sanju S 60 Sep 9, 2022
Location-history-viewer - Small compose-desktop app to view data from google's location history

Google Location History Takeout Viewer This application provides a minimalistic

Chris StelzmΓΌller 3 Jun 23, 2022
Funstuff - Minimal Kotlin Multiplatform project with SwiftUI, Jetpack Compose, Compose for Wear OS, Compose for Desktop

PeopleInSpace Minimal Kotlin Multiplatform project with SwiftUI, Jetpack Compose

Shivam Dhuria 2 Feb 15, 2022
πŸ”΄ A non-deterministic finite-state machine for Android & JVM that won't let you down

HAL is a non-deterministic finite-state machine for Android & JVM built with Coroutines StateFlow and LiveData. Why non-deterministic? Because in a no

Adriel CafΓ© 73 Nov 28, 2022
Blog implemented via the Storyblok Kotlin Multiplatform SDK (Android, JVM)

storyblok-mp-SDK-blog ... a showcase of using the Storyblok Kotlin Multiplatform Client to build a blog application (Android, JVM) What's included ??

Mike Penz 5 Sep 28, 2022