Open Event Organizer Android
Open Event Mobile App for Organizers and Entry Managers https://play.google.com/store/apps/details?id=com.eventyay.organizer
Install / Use
npx skills add fossasia/open-event-organizer-androidInstalls into whichever agent you are using.
README

Open Event Organizer Android App
Event management app for organizers using Open Event Platform
<img height="256px" src="docs/images/organizer_app_logo.png" />The core features of this Android Application are
- Scan a QR code
- Check-in attendees
- Overview of sales
- Ticket Management
- Data sync with the Open Event Organizer Server
Currently, the application is released in alpha phase and available here: Google Play and F-Droid.
<a href='https://play.google.com/store/apps/details?id=com.eventyay.organizer'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height="80"/></a> <a href='https://f-droid.org/en/packages/com.eventyay.organizer/'><img alt='Get it on F-Droid' src='https://fdroid.gitlab.io/artwork/badge/get-it-on.png' height="80"/></a>
Roadmap
Planned features & enhancements are:
- Overview of tracks and sessions
- Quick session re-scheduling
- Push notifications for certain triggers
Communication
Please join our mailing list to discuss questions regarding the project: https://groups.google.com/forum/#!forum/open-event
Our chat channel is on gitter here: https://gitter.im/fossasia/open-event-orga-app
Screenshots
<table> <tr> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/login.png"></td> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/dashboard_one.png"></td> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/dashboard_two.png"></td> </tr> <tr> <td><img src="docs/images/attendees.png"></td> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/checkin.png"></td> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/order_checkin.png"></td> </tr> <tr> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/create_ticket.png"></td> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/navigation.png"></td> <td><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/organizer.png"></td> </tr> </table>Development
- The Open Event Organizer Server acts as the backend for this application. The API docs for the same can be accessed at https://open-event-api-dev.herokuapp.com/ .
- The following account can be used for testing and development purposes.
Publishing
Each push to master branch automatically publishes the application to Play Store as an Alpha Release. Thus, on each merge into master, the versionCode and versionName MUST be changed accordingly in app/build.gradle
versionCode: Integer : To be monotonically incremented with each merge. Failure to do so will lead to publishing error, and thus is a crucial step before any mergeversionName: String : User visible version of the app. To be changed following symantic versioning
Libraries:
- RxJava 2
- Dagger 2
- ThreeTenABP
- Jackson
- jsonapi-converter
- ButterKnife
- Lombok
- Glide
- Retrofit + OkHttp
- DBFlow
- FastAdapter
- MPAndroidChart
- Leakcanary
- Stetho
- Sentry
- Timber
- Static Analysis:
- android-check - Contains checkstyle, PMD and findbugs
- Testing:
Android Development Setup
Please find info about the set up of the App in your development environment here.
Project Conventions
There are certain conventions we follow in the project, we recommend that you become familiar with these so that the development process is uniform for everyone:
Dependency Injection
We use Dagger 2 for DI, so please take a look at how it works. We did not create very complex graphs, component or scopes to keep it simple and easy to refactor. But, we do have certain guidelines as to what needs to be injected and how. Every object which is configurable or there is a possibility for it to be shared among objects, instances or lifecycles in future, must be injected through DI. The interface implementations which have obvious constructions are @Binded to their concrete classes and a general rule of thumb we follow is to have only one new keyword in the injectable construction (the @Provides method in Dagger). Meaning that all other dependencies that need to be instantiated during its creation must be passed as arguments and provided by the DI itself.
MVP
The project follows Model-View-Presenter design pattern and requires schematic interfaces for each component to be written first as contracts and then implemented.
All the interactions are done using interfaces only and concrete classes are only used when being injected into required positions. This means any model, view or presenter will only be referenced by its interface. We do so it is easy to mock and test them and there is no discrepancy in the callable methods of the concrete class and the interface.
We realize that MVP is opinionated and there is no strict boundary between the responsibility of each component, but we recommend following this style:
Viewis passive and dumb, there is no logic to be exercised in View, only the ability to show data provided by the presenter through contract is present in the View. This makes it easy to unit test and remove the dependence on Android APIs, thus making the need of instrumentation tests scarcePresenteris responsible for most of the business logic, manipulation of data and organising it for the view to present. All logic for the app is present here and it is devoid of ANY Android related code, making it 100% unit testable. We have created wrapper around common Android APIs in form of models so that they can be mocked and presenter stays clean. The responsibility of presenter includes the fetching of data from external source, observing changes and providing the view with the latest data. It also needs to handle all View interactions that require any logic, such as UI triggers causing complex interactions. Notable exception for this is launching of an Activity on click of a button. There is no logic required in the action and is completely dependent on Android APIs. Lastly, presenter should always clean up after the view is detached to prevent memory leaksModelhas the responsibility to hold the data, load it intelligently from appropriate source, be it disk or network, monitor the changes and notify presenter about those, be self sufficient; meaning to update data accordingly as needed without any external trigger (saving the data in disk after updating from network and providing the saved data from next time on), but be configurable (presenter may be able to ask for fresh data from network). The presenter should not worry about the data loading and syncing conditions (like network connectivity, failed update, scheduling jobs, etc) as it is the job of model itself.
Project Structure
Generally, projects are created using package by layer approach where packages are names by layers like ui, activity, fragment, etc but it quickly becomes unscalable in large projects where large number of unrelated classes are crammed in one layer and it becomes difficult to navigate through them.
Instead, we follow package by feature, which at the cost of flatness of our project, provides us packages of isolated functioning related classes which are likely to be a complete self sufficient component of the application. Each package all related classes of view, presenter, their implementations like Activities and Fragments.
A notable exception to this is the common module and data classes like Models and Repositories as they are used in a cross component way.
Note: The interface contract for Presenter and View is present in contract package in each module`
Unit Testing
We have tight and almost complete coverage of unit tests for models and presenters and it was
Related Skills
node-connect
385.5kDiagnose OpenClaw Android, iOS, or macOS node pairing, QR/setup code, route, auth, and connection failures.
blender-python-addon
40.5kBlender Python add-on rules for operators, panels, properties, registration, testing, and API-safe scripting
flutter-development-guidelines-cursorrules-prompt-file
40.5kCursor rules for Flutter development with MVVM architecture, Riverpod state management, Material widgets, and Dart style guidelines.
commit-push-pr
140.7kCommit, push, and open a PR
