Mavericks: Android on Autopilot

Related tags

App mavericks
Overview

Build Status Maven Central

Mavericks (formerly MvRx): Android on Autopilot

For full documentation, check out our docs site.

Mavericks is the Android framework from Airbnb that we use for nearly all product development at Airbnb.

When we began creating Mavericks, our goal was not to create yet another architecture pattern for Airbnb, it was to make building products easier, faster, and more fun. All of our decisions have built on that. We believe that for Mavericks to be successful, it must be effective for building everything from the simplest of screens to the most complex in our app.

This is what it looks like:

data class HelloWorldState(val title: String = "Hello World") : MavericksState

/**
 * Refer to the wiki for how to set up your base ViewModel.
 */
class HelloWorldViewModel(initialState: HelloWorldState) : MavericksViewModel<HelloWorldState>(initialState) {
    fun getMoreExcited() = setState { copy(title = "$title!") }
}

class HelloWorldFragment : Fragment(R.layout.hello_world_fragment), MavericksView {
    private val viewModel: HelloWorldViewModel by fragmentViewModel()

    override fun invalidate = withState(viewModel) { state ->
        // Update your views with the latest state here.
        // This will get called any time your state changes and the viewLifecycleOwner is STARTED.
    }
}

Installation

Gradle is the only supported build configuration, so just add the dependency to your project build.gradle file:

dependencies {
  implementation 'com.airbnb.android:mavericks:x.y.z'
}

The latest version of mavericks is Maven Central

For full documentation, check out the docs site

Legacy documentation for MvRx 1.x can still be found in the wiki

Comments
  • Add select function.

    Add select function.

    Another option for the selectSubscribe methods. It eliminates the use of reflection and allows to write more concise code.

    Sample usage looks like

    viewModel
        .select { + prop1 + prop2 + prop3 }
        .subscribe{ (p1, p2, p3) -> ... }
    
    opened by jinxinzheng 27
  • ClassNotFoundException on 1.0.2

    ClassNotFoundException on 1.0.2

    Hi there,

    We have recently updated mvrx dependency from 1.0.1 to 1.0.2. Which has messed up lots of our classes on our release builds with proguard. We are basically getting java.lang.ClassNotFoundException all over the app(data classes, enums, Async from mvrx, etc..)

    Reverting to 1.0.1 fixes the problem

    opened by dlleixap 23
  • Conductor and MvRx

    Conductor and MvRx

    Hey, Just wondering how crazy it is for me to attempt integratin MvRx with Conductor. I would be more than happy to provide a PR/separate module, but I first need to know how feasible this is.

    Is MvRx based on delegation? Haven't check the internals yet to make sure of this nor I've fully tested MvRx myself, but if its delegation based I should be able to use MvRx on Controllers (or any sort of Views) instead of Fragments, right?

    Any tips are very much appreciated :)

    Thanks!

    opened by mradzinski 21
  • Mavericks as generic purpose state management

    Mavericks as generic purpose state management

    I know this feature request might be a bit of stretch but want to start a conversation.

    Mavericks showed a great result as state management in Android VM world but looks like its purpose can be extended beyond it. What if Mavericks becomes a generic purpose state management where it can be used in pure Kotlin world? Like extract the engine that has 0 dependencies to Android artifacts and provide extension to connect it with Android VM?

    There is a potential that Mavericks can be used anywhere where stateful component is needed (like repository that requires to have a state). Also having separate pure Kotlin engine will make it possible to use it outside of VM like it was mentioned in this issue and make it possible to bring it to iOS by making it KMP

    I know these questions have been already asked before but has anyone done any assessment on the effort required for this kind of work? Are you open for such transformation? Do you think it makes sense and the time is right?

    opened by sav007 19
  • Do not collapse state change notifications

    Do not collapse state change notifications

    I think it's more expected behavior to have 1 reducer to trigger 1 state change. Collapsing notifications can result in missing changes.

    For example, if we have value changes from 0 -> 1 -> 0, after collapsing, that state change information is gone.

    I agree that collapsing is more performant since it reduces unnecessary UI rendering. But it's possible that developers subscribe to state not just for UI purpose.

    Maybe we can allow a customization on whether to collapse or not.

    @BenSchwab @elihart @gpeal

    opened by hellohuanlin 19
  • Decouple State and Args

    Decouple State and Args

    Now to pass some arguments to ViewModel we have to include them into the initialState, like in the example below.

    data class MyState(val foo: Int) : MvRxState {
        constructor(args: MyArgs) : this(args.foo)
    }
    

    It works well in the simple examples, but sometimes we need some info that does not need to be rendered. An api parameter, some userId, for example. We have to use "dead" fields in state that make no sense for the View and only needed to construct a ViewModel or perform background operations.

    @Parcelize
    data class MyArgs(val userId: String)
    
    data class MyState(val args: MyArgs, val coinsCount: Int = 0) : MvRxState{
        constructor(args: MyArgs) : this(args)
    }
    
    class MyViewModel(initialState: MyState) : BaseMvRxViewModel(initialState) {
        init {
            // retrieve `userId`
           initialState.args.let { 
                 // use it 
           }
        }
    }
    

    The factory approach is not working, because MvRxViewModelFactory<MyState, MyViewModel>#create gets the internally constructed state.

    Wouldn't be nice to have something like other MvRxViewModelArgFactory version, taking MyArgs in create?

    class MyViewModel(private val args: MyArgs, initialState: MyState) : BaseMvRxViewModel(initialState) {
        init {
           // just use the args
           args.let { // ... }
        }
        companion object : MvRxViewModelArgFactory<MyState, MyViewModel> {
            @JvmStatic
            override fun create(activity: FragmentActivity, args: MyArgs): MyViewModel {
                return MyViewModel(args, createState())
            }
        }
    }
    

    Any thoughts? It would be a neat thing to hide this implementation details from the View

    opened by Mishkun 17
  • Work with Dagger

    Work with Dagger

    At the moment I see no way of integrating with an existing ViewModelProvider.Factory. This is necessary to be able to use Dagger to inject ViewModels.

    Example fragment

    Is there a way?

    opened by chrisbanes 16
  • Exposing unique subscription handling for custom flow operations

    Exposing unique subscription handling for custom flow operations

    Exposing unique subscription handling for custom flow operations so that users can write customized subscriptions, for example, one to drop the first element in the flow before continuing:

    viewModel.stateFlow
               .drop(1)
               .collectLatest(deliveryMode = UniqueOnly("onCreate_Custom")) { state ->
                   ...
             }
    

    Also includes a fix for FragmentViewBindingDelegate which can try to observe on a background thread causing a crash. (reproed in sample app launcher)

    opened by podarsmarty 14
  • Creating view actions not dependent on state

    Creating view actions not dependent on state

    Hello,

    I have been working with MvRx for almost a year now and I must say i'm really satisfied of how it works and simplifies view/logic isolation ;).

    However I am missing one thing in this concept, which is what I call "ViewActions". It is an anonymous action on the view eg. showToast, showPopup which I think should not be included in a ViewState as It could very easy become very overloaded State but should be possible for ViewModel to invoke. I couldn't find it in documentation and that's why i decided to write this post :).

    My concept extends ViewModel functionality with a function called makeAction which could be a stream for a View to observe and react on it. Yes, you could create this functionality using state and "posting" these actions into state, but it is more like a hack than a solution to a given problem.

    Give me your thoughts about it ;)

    opened by xMickeymikex 14
  • Use SavedStateRegistry for persisting state

    Use SavedStateRegistry for persisting state

    This PR demonstrates how we could use the SavedStateRegistry to persist viewModel state due to process recreation.

    I believe this would allow us to remove the concept of the MvRxViewModelStoreOwner as we no longer need to hook into the activity, or fragment's onSaveInstanceState and onCreate methods to directly save and restore the viewModels. Instead, we can register a SavedStateProvider that directly hooks in to the lifecycle when we create the viewModel. When we go to recreate the viewModel, we check the saved state registry to see if there is a persisted state we can restore.

    The restoreViewModel method in MvRxViewModelStoreOwner helped ensure that all existingViewModels and parentViewModels were created before being accessed after system-initiated process death. Without the MvRxViewModelStoreOwner now, existingViewModel and parentViewModel could potentially access the viewModel before they have been recreated. This requires both these extensions to call into the modified MvRxViewModelProvider.get method and provide their own viewModel factories instead of using ViewModelProviders.of

    Would love to get your thoughts on this @elihart @BenSchwab Thanks!

    opened by mmcwong 14
  • iOS version

    iOS version

    According to this https://github.com/airbnb/epoxy/issues/562#issuecomment-427986157 Epoxy for iOS is coming soon, are you planning to open source iOS MvRX as well? Would be great to have consistent architecture on both platforms.

    Thank you for your awesome work!

    opened by qbait 14
  • Build doesn't work on JDK 17: `Unrecognized VM option 'CMSClassUnloadingEnabled'`

    Build doesn't work on JDK 17: `Unrecognized VM option 'CMSClassUnloadingEnabled'`

    run ./gradlew help in this repo with JDK 17

    You will get:

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Unable to start the daemon process.
    This problem might be caused by incorrect configuration of the daemon.
    For example, an unrecognized jvm option is used.
    Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/7.5.1/userguide/gradle_daemon.html
    
    -----------------------
    Unrecognized VM option 'CMSClassUnloadingEnabled'
    Error: Could not create the Java Virtual Machine.
    Error: A fatal exception has occurred. Program will exit.
    

    Caused by this JVM args here: https://github.com/airbnb/mavericks/blob/3bbb62530794ce828e76530a1182c27219734e8c/gradle.properties#L24

    opened by yogurtearl 0
  • Dagger in a single activity compose app (no fragment)

    Dagger in a single activity compose app (no fragment)

    I've been looking at the anvil-sample, and I don't see how to make a dagger component scoped to a navigation graph. I would like to create some subcomponent on feature module, scoped to the feature. But the mavericks factory API only gives me access to a fragment or an activity.

    Have you some idea on how to do this?

    opened by ganfra 0
  • Passing the arguments of a fragment if `mavericks:arg` is not available

    Passing the arguments of a fragment if `mavericks:arg` is not available

    This will be helpful for those who are using the fragment navigation library for deeplink since they match the argument key with the query or path parameter

    opened by rohithThammaiah 1
  • How to inject SavedStateHandle with hilt?

    How to inject SavedStateHandle with hilt?

    class AuthCodeViewModel @AssistedInject constructor(
        @Assisted initState: AuthCodeState,
        savedStateHandle: SavedStateHandle
    ) : MavericksViewModel<AuthCodeState>(initState) {
    
        @AssistedFactory
        interface Factory : AssistedViewModelFactory<AuthCodeViewModel, AuthCodeState> {
            override fun create(state: AuthCodeState): AuthCodeViewModel
        }
    
        companion object : MavericksViewModelFactory<AuthCodeViewModel, AuthCodeState> by hiltMavericksViewModelFactory()
    }
    

    It is not working!

    opened by Kilnn 0
  • The link on the Threading documentation page is broken.

    The link on the Threading documentation page is broken.

    Threading (https://airbnb.io/mavericks/#/threading)

    You can view some more complex ordering situations here.

    This link returns a 404.

    Maybe it should be updated to this one?

    opened by chris-sloan 0
Releases(v3.0.1)
  • v3.0.1(Sep 30, 2022)

  • 3.0.0(Sep 29, 2022)

    3.0.0

    • Experimental mvrx-common module with new abstraction MavericksRepository that behaves exactly like MavericksViewModel except it doesn't have any Android dependencies and can be used in pure Kotlin modules (#635)
    • Breaking changes: MavericksViewModelConfig.BlockExecutions is extracted into top level class MavericksBlockExecutions (#635)
    • New mavericks extension argsOrNull to handle optional (nullable) fragment args (#639)
    • New Anvil sample in the sample-anvil module

    See more details in https://airbnb.io/mavericks/#/new-3x

    Source code(tar.gz)
    Source code(zip)
  • 2.7.0(Jul 5, 2022)

  • 2.6.1(Mar 2, 2022)

    Expose state restoration functions (https://github.com/airbnb/mavericks/pull/611) Use passed scope as fragment if possible (https://github.com/airbnb/mavericks/pull/618)

    Source code(tar.gz)
    Source code(zip)
  • 2.6.0(Feb 1, 2022)

    Big thanks to @itsandreramon for contributing the two main improvements in this release!

    • Pre-configure Hilt by adding a new "mvrx-hilt" artifact (#598)

      See the updated Hilt documentation for guidance on how to more easily use Hilt with Mavericks https://airbnb.io/mavericks/#/dagger?id=hilt

    • Add support to use Mavericks with JUnit 5 (#600)

      See the new testing documentation at https://airbnb.io/mavericks/#/testing for details.

    • Don't expose lifecycleAwareLazy in viewModel return type (#603)

    Source code(tar.gz)
    Source code(zip)
  • 2.5.1(Dec 18, 2021)

    • Add ability to manually pass argument to composable viewModel factories (#595)
    • Fix Fragment arguments not being correctly passed to viewmodel state initialization in compose usage (#595)
    • Switch mavericks-compose artifact to use same versioning scheme as other artifacts
    Source code(tar.gz)
    Source code(zip)
  • 2.5.0(Dec 6, 2021)

    • Fix issue when the LocalContext is not directly an Activity (#582)
    • update to Compose 1.0.4, Kotlin 1.5.31, Koin 3.1.3 (#586)
    • Ignore VerifyError Exception when loading potential mockable classes #590
    Source code(tar.gz)
    Source code(zip)
  • 2.4.0(Oct 9, 2021)

    2.4.0

    • Add covariant recreation support (#565)
    • Exposing unique subscription handling for custom flow operations (#560)
    • Add support for restoring ViewModels that were initially created with a companion factory in a superclass #566
    Source code(tar.gz)
    Source code(zip)
  • 2.3.0(May 19, 2021)

    2.3.0

    • Error handling enhancements (#540)
    • Upgraded Compose to beta07 (#549)

    Note: Compose support is experimental and mvrx-compose artifact is at version 2.1.0-alpha02

    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Apr 23, 2021)

    • Fix subscriptionLifecycleOwner to use viewLifecycleOwner in Fragment's onCreateView (#533)
    • Remove createUnsafe and don't auto-subscribe on background threads (#525)
    • Fix lifecycle 2.3.0 throwing IllegalStateException when using MavericksLauncherActivity (#523)
    Source code(tar.gz)
    Source code(zip)
  • 2.1.0(Mar 2, 2021)

    • Initial release of mavericks-compose:2.1.0-alpha01.
    • Upgraded to Kotlin 1.4.30.
    • Removed @RestrictTo annotations in favor of just @InternalMavericksApi. The Kotlin opt-in annotations work more reliably than the Android lint rules and there is no need for both.
    • Created initial release of mavericks-compose (use version 2.1.0-alpha01 for the mavericks-compose artifact)
    • Fixed a change in androidx-lifecycle 2.2.0 that would have required any unit tests that use Mavericks to also use robolectric.

    Breaking Changes

    • ActivityViewModelContext and MavericksViewModelFactory now uses ComponentActivity instead of FragmentActivity to improve Compose interop. ComponentActivity is the super class of FragmentActivity so you may need to replace FragmentActivity with ComponentActivity if you using ActivityViewModelContext.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Feb 4, 2021)

    Mavericks 2.0 is a ground up rewrite for coroutines. Check out the documentation for 2.0 to find out what is new and how to upgrade.

    Breaking Changes

    • All mvrx artifact names are now mavericks.
    • If you are using RxJava, you will need to use mavericks-rxjava2 to maintain backwards compatibility. New Mavericks users who just use coroutines can just use mavericks.
    • If your MavericksView/Fragment does not use any ViewModels, invalidate() will NOT be called in onStart(). In MvRx 1.x, invalidate would be called even if MvRx was not used at all. If you would like to maintain the original behavior, call postInvalidate() from onStart in your base Fragment class
    • MavericksViewModel and BaseMvRxViewModel (from mavericks-rxjava2) no longer extends Jetpack ViewModel. However, viewModelScope and onCleared() still exist to match the existing API
    • The order of nested with and set states has changed slightly. It now matches the original intention. If you had code like:
    withState {
        // W1
        withState {
            // W2
        }
        setState {
            // S1
            setState {
                // S2
                setState {
                    // S3
                }
            }
        }
    }
    

    Previously, setState would only be prioritized at that nesting level so it would run: [W1, S1, W2, S2, S3] Now, it will run: [W1, S1, S2, S3, W2]

    • viewModelScope is now a property on MavericksViewModel and BaseMvRxViewModel (from mavericks-rxjava2), not the Jetpack extension function for ViewModel. Functionally, this is the same but the previous viewModelScope import will now be unused
    • If you had been using any restricted internal mavericks library functions your build may break as they have been renamed (you shouldn't be doing this, but in case you are...)

    Other Changes

    • Make MavericksViewModel extension functions protected (#488)
    • Add MavericksViewModel.awaitState (#487) to access current ViewModel state via a suspend function
    • Mark all @RestrictTo APIs with @InternalMavericksApi (#480)
    • Api additions to the mocking framework (#475) (#477)
    • Migrated CoroutinesStateStore to SharedFlow (#469)
    • Launcher and mock speed optimizations (#468)
    • FragmentViewModelContext now allows for custom ViewModelStoreOwner and/or SavedStateRegistry that are different from the fragment ones in FragmentViewModelContext. (#443)
    • Add mavericks-navigation artifact to support AndroidX Navigation destination ViewModels navGraphViewModel(R.id.my_graph) (#443)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta3(Dec 2, 2020)

    Changes since beta 2

    Make MavericksViewModel extension functions protected (#488) Add MavericksViewModel.awaitState (#487) to access current ViewModel state via a suspend function Mark all @RestrictTo APIs with @InternalMavericksApi (#480) Api additions to the mocking framework (#475) (#477) Migrated CoroutinesStateStore to SharedFlow (#469) Launcher and mock speed optimizations (#468)

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta2(Oct 21, 2020)

    Coroutine api tweaks (#464) Fix mocking docs (#465) Never complete ViewModel.stateFlow (#460) Tweaks and additions to the mocking framework (#461) Allow configurable StateStore CoroutineContext (#454) [2.0] Cleaned up and obfuscated some @RestrictTo APIs (#453)

    Breaking

    • If you had been using any restricted internal mvrx library functions your build may break as they have been renamed (you shouldn't be doing this, but in case you are...)
    • MockableMavericks.initialize function signature has changed
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta1(Sep 18, 2020)

    • The mvrx artifact no longer has a dependency on RxJava, and the ViewModel and StateStore are now implemented with Kotlin Coroutines
    • You can continue accessing the previous RxJava ViewModel extensions by using the mvrx-rxjava2 artifact
    • To reflect the underlying removal of RxJava from the MvRx implementation we are renaming the implementation to Mavericks
    • New documentation for the rewrite is available at https://airbnb.io/MvRx/#/
    • A mvrx-mocking artifact now provides built in support for mocking viewmodels, states, and full screens
    • The order of nested with and set states has changed slightly. It now matches the original intention. If you had code like:
    withState {
        // W1
        withState {
            // W2
        }
        setState {
            // S1
            setState {
                // S2
                setState {
                    // S3
                }
            }
        }
    }
    

    Previously, setState would only be prioritized at that nesting level so it would run: [W1, S1, W2, S2, S3] Now, it will run: [W1, S1, S2, S3, W2]

    • If your MvRxView/Fragment does not use any ViewModels, invalidate() will NOT be called in onStart(). In MvRx 1.x, invalidate would be called even if MvRx was not used at all. If you would like to maintain the original behavior, call postInvalidate() from onStart in your base Fragment class.
    • BaseMvRxViewModel no longer extends Jetpack ViewModel
    • viewModelScope is now a property on BaseMvRxViewModel, not the Jetpack extension function for ViewModel. Functionally, this is the same but the previous viewModelScope import will now be unused.
    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(Jun 22, 2020)

  • 1.5.0(May 15, 2020)

    • Add an optional nullable value to all Async classes (#383)
    • Update various dependencies

    Note: MvRx now targets 1.8 for Java/Kotlin, so you may need to update your projects to also target 1.8

    android {
        kotlinOptions {
            jvmTarget = JavaVersion.VERSION_1_8.toString()
        }
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Mar 16, 2020)

  • 2.0.0-alpha2(Dec 18, 2019)

  • 2.0.0-alpha1(Dec 11, 2019)

    This is a new major release with breaking changes. It incorporates a mocking system into MvRx to declare test data for screens and leverage that data with various testing tools. For a high level overview of this system, see this article series.

    The main breaking change is that the debugMode parameter no longer exists on BaseMvRxViewModel. Instead, you define a global app wide debug setting by setting MvRx.viewModelConfigFactory = MvRxViewModelConfigFactory(applicationContext) from your app's initialization.

    See the configuration wiki for more details.

    Additionally, the MvRxTestRule from the mvrx-testing artifact has changed its interface slightly. Notably the debug mode enum has been changed to a boolean. See the testing wiki page for details on this artifact.

    Mocking

    If you would like to use the new mocking system, you can replace the MvRx configuration call with MvRxMocks.install(applicationContext).

    Additionally, you can define mocks for your screens by using the MockableMvRxView interface instead of MvRxView. This unlocks usage of the MvRx Launcher for easily browsing all screens and mocks in your app.

    For more details on the mocking system, see the wiki page

    Feedback

    This is an alpha so that we can receive feedback on the mocking apis and documentation (as well as bugs of course). Please let us know what you think and what changes you would like to see before the stable release!

    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Oct 29, 2019)

    • Revamp state saving to use Android Jetpack SavedStateRegistry (#254)

    Breaking - This removes the need for MvRxViewModelStoreOwner and BaseMvRxActivity and thus those classes are now deleted.

    If you were using BaseMvRxActivity you can instead now extend from AppCompatActivity.

    All usages of mvrxViewModelStore can simply be deleted - state saving now happens completley automatically.

    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Oct 14, 2019)

  • 1.2.0(Oct 11, 2019)

    • Make searching for the companion object factory more robust #283
    • Fix infinite thread leaks while flushing queues in state store #302
    • Adding inter view model subscription support #287
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Aug 30, 2019)

  • v1.0.0(Apr 3, 2019)

    • MvRx now requires androidx.
    • Fix: prevented duplicate subscriptions when subscriptions are made after onCreate. #210
    • Respect uniqueOnly across configuration changes. #207
      • This comes with additional code in BaseMvRxFragment. If you are not using BaseMvRxFragment, please refer to #207 for the additional required code.
    • Remove state coalescing. #206
    • Require that all MvRxViewModels actually provide a value for debugMode. #196
    Source code(tar.gz)
    Source code(zip)
Android cutout screen support Android P. Android O support huawei, xiaomi, oppo and vivo.

CutoutScreenSupport Android cutout screen support Android P. Android O support huawei, xiaomi, oppo and vivo. Usage whether the mobile phone is cutout

hacket 5 Nov 3, 2022
FoldingNavigationDrawer-Android This is a sample project present how to use Folding-Android to add Folding Efect to Navigation Drawer.

FoldingNavigationDrawer-Android Sample (Play Store Demo) This is a sample project present how to use Folding-Android to add Folding Efect to Navigatio

null 242 Nov 25, 2022
Twidere-Android Twidere is a powerful twitter client for Android 1.6+ 1 , which gives you a full Holo experience and nearly full Twitter's feature.

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

Twidere Project 2.7k Jan 2, 2023
:movie_camera: Movie discovery app showcasing Android best practices with Google's recommended architecture: MVVM + Repository + Offline support + Android Architecture Components + Paging library & Retrofit2.

Popular Movies Stage 1 + Stage 2 Discover the most popular and top rated movies playing. Movies data fetched using themoviedb.org API. ✨ Screenshots M

Yassin AJDI 189 Nov 26, 2022
Extensible Android mobile voice framework: wakeword, ASR, NLU, and TTS. Easily add voice to any Android app!

Spokestack is an all-in-one solution for mobile voice interfaces on Android. It provides every piece of the speech processing puzzle, including voice

Spokestack 57 Nov 20, 2022
Aggregated Android news, articles, podcasts and conferences about Android Development

DroidFeed Curated news feed for Android Developers! Stay up to date with the latest Android Development news. Built for the Android developer communit

Dogan Gulcan 183 Dec 2, 2022
Shreyas Patil 2.1k Dec 30, 2022
A simple app to showcase Androids Material Design and some of the cool new cool stuff in Android Lollipop. RecyclerView, CardView, ActionBarDrawerToggle, DrawerLayout, Animations, Android Compat Design, Toolbar

#Android-LollipopShowcase This is a simple showcase to show off Android's all new Material Design and some other cool new stuff which is (new) in Andr

Mike Penz 1.8k Nov 10, 2022
The Android startup used to schedule tasks, jobs while launching Android App.

Android Startup, schedule your startup jobs Introduction AndroidStartup is an open source project used to refine your Andriod App startup. Compared wi

ShouHeng 46 Aug 24, 2022
Android playground project with modularization by feature (android libraries), unit tests, MVVM & MVI.

Movies Movies is a simple project to study and play with some android components, architecture and tools for Android development. Tech Stack This proj

Christopher Elias 333 Dec 30, 2022
🌄 Photo editor using native modules for iOS and Android. Inherit from 2 available libraries, Brightroom (iOS) and PhotoEditor (Android)

React Native Photo Editor (RNPE) ?? Image editor using native modules for iOS and Android. Inherit from 2 available libraries, Brightroom (iOS) and Ph

Baron Ha. 242 Dec 28, 2022
Ride-Sharing Uber Lyft Android App - Learn to build a ride-sharing Android Taxi Clone App like Uber, Lyft - Open-Source Project By MindOrks

Ride-Sharing Uber Lyft Android App - Learn to build a ride-sharing Android Taxi Clone App like Uber, Lyft - Open-Source Project By MindOrks

MindOrks 1.2k Dec 29, 2022
A simple Android app to demonstrate the use of Hover SDK for M-PESA Send Money while offline. This SDK does not require an internet connection, it automates USSD sessions in the background of an android application.

HoverSDKDemo Hover SDK is an Android SDK that lets mobile developers to add money features to the applications. This SDK does not require an internet

Joel Kanyi 9 Dec 21, 2022
Source code of JekyllEx Android App which can manage your Jekyll blog directly from your Android device!

JekyllEx Android App Built with ❤︎ by Gourav Khunger ?? Introduction JekyllEx is an Android App that allows you to manage a Jekyll Blog directly from

JekyllEx 24 Nov 8, 2022
A Simple and Minimal Quotes Android Application to demonstrate the Modern Android Development tools

Quotee Android ?? A Simple and Minimal Quotes Android Application to demonstrate the Modern Android Development tools. Developed with ❤️ by Aminullah

null 12 Aug 24, 2022
🎥 A Simple and Minimal Movies Android Application to demonstrate the Modern Android Development and Jetpack Compose.

ComposeMovie Android ?? A Simple and Minimal Movies Android Application to demonstrate the Modern Android Development and Jetpack Compose. Built with

null 13 Oct 1, 2022
Android Studio project wrapper around the Elixir TodoApp Desktop app to run on Android including the Erlang runtime

TodoApp Android: An Android Sample App This Android Studio project wraps the Desktop Sample App to run on an Android phone. How to build & run Install

elixir-desktop 78 Dec 10, 2022
GmailCompose is an Android application 📱 for showcasing Jetpack Compose for building declarative UI in Android.

GmailCompose GmailCompose Demo GmailCompose is an Android application ?? for showcasing Jetpack Compose for building declarative UI in Android. About

Baljeet Singh 35 Nov 29, 2022
Parsing and re-packing Android boot.img/vbmeta.img, supporting Android 12(preview)

Android_boot_image_editor A tool for reverse engineering Android ROM images. Getting Started install required packages Mac: brew install lz4 xz dtc Li

null 615 Dec 30, 2022