The sweetest calendar for Android

Overview

Archived

The repo is now archived and no new commits will take place. Thank for your support and contributions.

Memento Calendar for Android alt text

Memento Calendar is a modern namedays app for Android. This repository contains the source code of Memento Calendar.

You can get started by having a look at the project's wiki. It contains some information about how to get Memento up and running on your machine and other useful info.

This repo is open for PRs and they are more than welcome! Have a look at the wiki page to see how to contribute.

alt text

Project Goal

Memento Calendar is my pet project/playground in which I experiment with various platform features development patterns and share my foundings with the community my foundings via blog posts and talks. Memento started off as a side project app back in 2014 and has been on development on and off. Current goal of the project is to split out the business logic of the app from the app logic so that it could potentially be ported into other platforms with the help of Kotlin.

Modules

The app is split into multiple modules. The business logic of the app can be found in the memento module. There are three other Android Modules:

android_common

This is the shared resources across all Android specific modules. It depends on memento.

android_wear

This is the Android Wear module. It depends on android_common.

android_mobile

This is the Android mobile app module. It depends on android_common.

Architecture

The Model-View-Presenter is used in order to architecture the app.

Presenters are platform agnostic and live in the memento module, in order to be able to be used across all platforms. They contain the core logic of forwarding Models to the Views. It is up for the specific platform component to create a View

Views are responsible displaying information back to the user. For each view there is one interface that lives in the memento module. A view is not to be confused with Android's View classes, Activities or Fragments.

Models contain the minimum amount of information needed to render the information on the screen.

I did a talk in the GDG Android Athens about the structure of Memento Calendar. The talk is in Greek, but the slides contain more information about the structure (see the slides).

License

MIT License

Copyright (c) 2016 Alex Styl

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Comments
  • Notification enhancement

    Notification enhancement

    Description

    Enhanced the notifications for birthdays:

    • In case of only one birthday, show the name and the age
    • In case of multiple birthdays:
      • If the notification is collapsed, keep the original behaviour except for the number of events (right bottom of notification) which now displays the number of birthdays
      • If the notification is expanded, show the name of each person and their age
    Test(s) added

    no. Frankly I don't know how I could test this :smile:

    Screenshots

    In case of only one birthday _20160907_204043

    In case of multiple birthdays: Collapsed screenshot_2016-09-08-10-06-25

    Expanded screenshot_2016-09-08-09-48-41

    opened by auricgoldfinger 9
  • Birthday on February 29,2017 is not displayed

    Birthday on February 29,2017 is not displayed

    Short Description

    App currently in Play Store crashes on Marshmallow, custom rom

    Steps to reproduce
    1. Open app from home screen's icon FYI: There's a contact that has his birthday on 29th of february.
    Resulted in

    App crashes.

    More details in case that could matter: My XPeria Z was acting fishy and especially gave a lot of bluetooth problems. That much that my bluetooth headset stopped working. Before buying another phone, I decided to unlock the bootloader and flash another rom. I chose StryFlex - an AOSP Marshmallow based ROM, based on the original Sony rom for the XPeria ZX. The phone is working smoothly now and I have no more issues.

    Except for Memento 😉

    I checked out the most recent code, build and installed that one to see whether I could solve the problem myself. But that build works smoothly, except for the fact that the contact isn't displayed

    FYI: I am using dummy crashlyticsKey, androidVendingKey and mixpanelKey here and I even commented out apply plugin: 'com.google.gms.google-services' in mobile/build.gradle to work around the missing google-services.json. So maybe the error is somewhere inthere?

    So I sent the crash report anyway. Maybe you can find the cause... Since it's obfuscated, I can't read the stacktrace :-)

    At the end of this post is the logcat for the app installed using the Google Play Store. I included the entire logcat from the moment I start the application, not just the exception

    For now, I'm going to install your all_events_create_event branch on my phone, for which I'm very grateful :-)

    logcat
    01-21 14:11:42.064 645-3717/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.alexstyl.specialdates/.ui.activity.MainActivity (has extras)} from uid 10117 on display 0
    01-21 14:11:42.347 645-21331/system_process I/ActivityManager: Start proc 30884:com.alexstyl.specialdates/u0a187 for activity com.alexstyl.specialdates/.ui.activity.MainActivity
    01-21 14:11:42.465 30884-30884/com.alexstyl.specialdates W/System: ClassLoader referenced unknown path: /data/app/com.alexstyl.specialdates-1/lib/arm
    01-21 14:11:42.494 30884-30884/com.alexstyl.specialdates D/FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
    01-21 14:11:42.503 30884-30884/com.alexstyl.specialdates D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
    01-21 14:11:42.523 30884-30884/com.alexstyl.specialdates I/FA: App measurement is starting up, version: 9683
    01-21 14:11:42.524 30884-30884/com.alexstyl.specialdates I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
    01-21 14:11:42.551 30884-30884/com.alexstyl.specialdates I/FA: To enable faster debug mode event logging run:
                                                                     adb shell setprop firebase.analytics.debug-mode com.alexstyl.specialdates
    01-21 14:11:42.568 30884-30884/com.alexstyl.specialdates I/FirebaseInitProvider: FirebaseApp initialization successful
    01-21 14:11:42.642 30884-30884/com.alexstyl.specialdates W/d: diskCache() and diskCacheFileNameGenerator() calls overlap each other
    01-21 14:11:42.733 30884-30884/com.alexstyl.specialdates I/CrashlyticsCore: Initializing Crashlytics 2.3.8.97
    01-21 14:11:42.785 30884-30895/com.alexstyl.specialdates I/art: Background partial concurrent mark sweep GC freed 17599(1282KB) AllocSpace objects, 18(360KB) LOS objects, 72% free, 1565KB/5MB, paused 14.007ms total 40.679ms
    01-21 14:11:42.841 30884-30913/com.alexstyl.specialdates W/System: ClassLoader referenced unknown path: /system/framework/tcmclient.jar
    01-21 14:11:42.939 30884-30884/com.alexstyl.specialdates W/MixpanelAPI.RsrcReader: Can't load names for Android view ids from 'com.alexstyl.specialdates.R$id', ids by name will not be available in the events editor.
    01-21 14:11:42.939 30884-30884/com.alexstyl.specialdates I/MixpanelAPI.RsrcReader: You may be missing a Resources class for your package due to your proguard configuration, or you may be using an applicationId in your build that isn't the same as the package declared in your AndroidManifest.xml file.
                                                                                       If you're using proguard, you can fix this issue by adding the following to your proguard configuration:
                                                                                       
                                                                                       -keep class **.R$* {
                                                                                           <fields>;
                                                                                       }
                                                                                       
                                                                                       If you're not using proguard, or if your proguard configuration already contains the directive above, you can add the following to your AndroidManifest.xml file to explicitly point the Mixpanel library to the appropriate library for your resources class:
                                                                                       
                                                                                       <meta-data android:name="com.mixpanel.android.MPConfig.ResourcePackageName" android:value="YOUR_PACKAGE_NAME" />
                                                                                       
                                                                                       where YOUR_PACKAGE_NAME is the same string you use for the "package" attribute in your <manifest> tag.
    01-21 14:11:42.970 30884-30884/com.alexstyl.specialdates D/MixpanelAPI.AL: To enable App Links tracking android.support.v4 must be installed: getInstance [class android.content.Context]
    01-21 14:11:42.971 30884-30884/com.alexstyl.specialdates D/MixpanelAPI.AL: Please install the Bolts library >= 1.1.2 to track App Links: bolts.AppLinks
    01-21 14:11:43.125 30884-30884/com.alexstyl.specialdates W/MixpanelAPI.ConfigurationChecker: com.mixpanel.android.surveys.a is not registered as an activity in your application, so surveys can't be shown.
    01-21 14:11:43.125 30884-30884/com.alexstyl.specialdates I/MixpanelAPI.ConfigurationChecker: Please add the child tag <activity android:name="com.mixpanel.android.surveys.SurveyActivity" /> to your <application> tag.
    01-21 14:11:43.197 30884-30937/com.alexstyl.specialdates D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
    01-21 14:11:43.293 30884-30937/com.alexstyl.specialdates I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/21/15, 369a2ea, I96aee987eb
    01-21 14:11:43.297 30884-30937/com.alexstyl.specialdates I/OpenGLRenderer: Initialized EGL, version 1.4
    01-21 14:11:43.471 645-664/system_process I/ActivityManager: Displayed com.alexstyl.specialdates/.ui.activity.MainActivity: +1s145ms
    01-21 14:11:43.644 30884-30903/com.alexstyl.specialdates I/FA: Tag Manager is not found and thus will not be used
                                                                   
                                                                   --------- beginning of crash
    01-21 14:11:45.338 30884-30935/com.alexstyl.specialdates E/AndroidRuntime: FATAL EXCEPTION: ModernAsyncTask #1
                                                                               Process: com.alexstyl.specialdates, PID: 30884
                                                                               java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                                   at android.support.v4.b.k$3.done(ModernAsyncTask.java:161)
                                                                                   at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                                   at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                                   at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                                   at java.lang.Thread.run(Thread.java:818)
                                                                                Caused by: java.lang.IllegalArgumentException: 29/2/2017 is invalid
                                                                                   at com.alexstyl.specialdates.c.c.a(Date.java:48)
                                                                                   at com.alexstyl.specialdates.events.b.b$a.a(PeopleEventsContract.java:55)
                                                                                   at com.alexstyl.specialdates.events.b.b$a.a(PeopleEventsContract.java:30)
                                                                                   at com.alexstyl.specialdates.service.a.b(PeopleEventsProvider.java:193)
                                                                                   at com.alexstyl.specialdates.service.a.a(PeopleEventsProvider.java:149)
                                                                                   at com.alexstyl.specialdates.upcoming.l.B(UpcomingEventsLoader.java:59)
                                                                                   at com.alexstyl.specialdates.upcoming.l.d(UpcomingEventsLoader.java:29)
                                                                                   at android.support.v4.b.a.e(AsyncTaskLoader.java:299)
                                                                                   at android.support.v4.b.a$a.a(AsyncTaskLoader.java:57)
                                                                                   at android.support.v4.b.a$a.a(AsyncTaskLoader.java:45)
                                                                                   at android.support.v4.b.k$2.call(ModernAsyncTask.java:138)
                                                                                   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                                   at java.lang.Thread.run(Thread.java:818) 
    01-21 14:11:45.345 645-21331/system_process W/ActivityManager:   Force finishing activity com.alexstyl.specialdates/.ui.activity.MainActivity
    01-21 14:11:45.354 30884-30893/com.alexstyl.specialdates W/CursorWrapperInner: Cursor finalized without prior close()
    01-21 14:11:46.125 30884-30916/com.alexstyl.specialdates I/CrashlyticsCore: Crashlytics report upload complete: 58835E0E030B-0001-78A4-2590DBC70216.cls
    
    
    bug 
    opened by auricgoldfinger 8
  • [develop] Birthdays aren't displayed anymore

    [develop] Birthdays aren't displayed anymore

    Short Description

    On develop branch, birthdays aren't displayed anymore

    Steps to reproduce

    Change the launchpoint to launch com.alexstyl.specialdates.ui.activity.MainActivity in stead of the Debug activity

    1. Set a breakpoint in BirthdayDatabaseRefresher.storeContactsToProvider
    2. Launch the app from the debug branch
    3. See that the BirthdayMarshaller.marshall just returns new ContentValues[0]; (I'm not entirely sure this is the problem)
    4. Continue the application
    Resulted in

    The app opens without any birthday

    Expected Results

    Birthdays are displayed

    Video/Screenshots

    scaled_image

    opened by auricgoldfinger 5
  • Generate google_services.json if it doesn't exist

    Generate google_services.json if it doesn't exist

    Issue #182

    Description

    In case the google_services.json is not located inside the android_mobile file then its added there the mock file for google_services.json

    Test(s) added

    No, change is done on the building scripts

    Extra info

    I don't really like the check for the file existance because if by mistake the file edited then the build breaks. But if I remove this then you won't be able to use the actual file for the production of your application.

    An ideal solution will be to replace the if existance check with a check that will add to the proper location either the actual file or the if this does not exist the mock one. With this approach you can always have the updated file in each build.

    Additionaly, I am quite positive that we can completly remove the ci-mock-google-services-setup.sh completely as this should be auto triggered by gradle sync but in this first step I though to keep it a bit simple till we find the best approach.

    opened by madlymad 4
  • Chapter 5: Generics

    Chapter 5: Generics

    Description

    This PR looks into the usage of generics according to Chapter 5 of the Effective Java book and improves the usage of generics overall around the app.

    More specifically:

    • Preferred the usage of Generics for references instead of concrete implementations (Item 26)
    • Removed "unchecked warnings (Item 24)
    Test(s) added

    nope. Just updated the already existing ones

    ncu 
    opened by alexstyl 4
  • Frequently Asked Question (FAQ) Proposal

    Frequently Asked Question (FAQ) Proposal

    Hello there, I'd like to contribute to your awesome project by writing a Frequent Asked Questions for users self-service. Would love to hear from you, thanks.

    opened by olayhemy 3
  • User image is not uploading when you clicked image from device camera and clicked image quality is also very poor.

    User image is not uploading when you clicked image from device camera and clicked image quality is also very poor.

    Expected behavior

    Memento Calendar is a modern namedays app for Android. In this app you can see upcoming events like birthdays etc. of your contacts or you can also add a new event for your contact from the app in 'Add a new event section'. While adding a new event for your contacts you can also set profile pictures to your contacts from your gallery or from your camera. When you select camera to add a profile picture, your device camera will open and you need to click a new image. After clicking image the image will upload and show in contact image area (at place of blue area). WhatsApp Image 2018-02-12 at 17.06.42.jpeg

    Actual behavior

    Today i installed Memento Namedays android app and after installing i came to main screen of where i can see list of my added events or i can add a new event on clicking the "+" button. I clicked on the "+" button to add a new event. After clicking on "+", a new page opened where i can create a new event with user image, contact name and event dates. I clicked on user image(the blue area with white user icon) to add contact image, select camera, click a new image and select ok. I came back to add event screen but the image i clicked from my camera is not uploaded at place of user image placeholder. WhatsApp Image 2018-02-12 at 17.06.42.jpeg

    How to reproduce

    To reproduce the bug follow the following steps -

    • Open app and click on "+" button to add a new event.
    • Now click on camera icon to upload a picture and select camera to click a picture.
    • Click image from device camera and click ok.

    Now you see that your clicked image is not set as contact profile image.

    
    * Device:  Samsung J7 Prime
    * Operating system: Android 7.0 Nougatt
    * App Version: v11.2
    
    

    Recording Of The Bug

    https://youtu.be/VNzcpiORv1E



    Posted on Utopian.io - Rewarding Open Source Contributors

    bug mid priority 
    opened by iamank1t 3
  • icon for memento- calendar

    icon for memento- calendar

    hi@alexatyl,I am a graphic designer, I want to help you in graphic design.

    After I review your project, your app is very good. Therefore I suggest a new logo and icon for you. If you want it, I will design it for you and it's free.

    opened by somratking420 2
  • Use max day in picker depending on month, year

    Use max day in picker depending on month, year

    • Use JodaDate to calculate the accepted values that will shown on the EventDatePicker.
    • Override logic of Joda when the year is not present for February so as to keep existing functionality.

    Resolve issue #169

    Description

    The date picker was crashing when it is started a month with 31 days (ie. May). Then you select at day the 31st and then switch to previous month that has 30 days (ie. April) Pressing ok will cause a crash.

    Same problem was repoducible with February that has 28 days.

    Test(s) added

    Yes

    opened by madlymad 2
  • Bug in app calendar which leads app to crash.

    Bug in app calendar which leads app to crash.

    Expected behaviour

    While creating a contact in app, app gives option to select birth date of contact. When selecting birth date from date picker, app needs to show 28 days in February month because 2018 is not a leap year.

    Actual behaviour

    While selecting birth date from date picker, the date picker showing me 30 Feb 2018 as a date. When i set 30 Feb 2018 as birthday of contact, the app got crashed. Screenshot_20180228-163225.png

    How to reproduce

    To reproduce the bug follow the following steps :-

    • Create a new contact from app.
    • Click on birthday field and set 30 Feb 2018 as birthday date.
    • App crashed immediately.
    • For better understanding see recording of bug.
    
    * Device:  Samsung J7 Prime
    * Operating system: Android 7.0 Nougatt
    * App Version: v11.2
    

    Recording Of The Bug

    watch video till end.

    https://youtu.be/BN-NH2l4sAg



    Posted on Utopian.io - Rewarding Open Source Contributors

    opened by iamank1t 2
  • Use the ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS for newer Android devices

    Use the ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS for newer Android devices

    Some people mention that sometimes the application does not show an notification to them. This is probably do to this:

    ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS

    added in API level 23 String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Activity Action: Show screen for controlling which apps can ignore battery optimizations.

    Input: Nothing.

    Output: Nothing.

    You can use PowerManager.isIgnoringBatteryOptimizations() to determine if an application is already ignoring optimizations. You can use ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS to ask the user to put you on this list.

    Constant Value: "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS" ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

    added in API level 23 String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Activity Action: Ask the user to allow an app to ignore battery optimizations (that is, put them on the whitelist of apps shown by ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS). For an app to use this, it also must hold the REQUEST_IGNORE_BATTERY_OPTIMIZATIONS permission.

    Note: most applications should not use this; there are many facilities provided by the platform for applications to operate correctly in the various power saving modes. This is only for unusual applications that need to deeply control their own execution, at the potential expense of the user's battery life. Note that these applications greatly run the risk of showing to the user as high power consumers on their device.

    Input: The Intent's data URI must specify the application package name to be shown, with the "package" scheme. That is "package:com.my.app".

    Output: Nothing.

    You can use PowerManager.isIgnoringBatteryOptimizations() to determine if an application is already ignoring optimizations.

    Constant Value: "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" https://developer.android.com/reference/android/provider/Settings.html#ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

    enhancement 
    opened by alexstyl 2
Releases(11.2)
Owner
Alex Styl
Alex Styl
Android calendar library provides easy to use widget with events

Kotlin-AgendaCalendarView Kotlin-AgendaCalendarView based on AgendaCalendarView Kotlin-AgendaCalendarView is a awesome calendar widget with a list of

Ognev Zair 88 Nov 21, 2022
A beautiful material calendar with endless scroll, range selection and a lot more!

CrunchyCalendar A light, powerful and easy to use Calendar Widget with a number out of the box features: Infinite vertical scrolling in both direction

CleverPumpkin 483 Dec 25, 2022
Workout Journal is a mobile app based on Multi-Module and Clean Architecture for those who want to track their progress over a workout and a calendar period.

Workout-Journal Workout Journal is a mobile app for those who want to track their progress over a workout and a calendar period. The app allows you to

Maxim Smolyakov 4 Oct 23, 2022
Modern Calendar View Supporting Both Hijri and Gregorian Calendars but in highly dynamic way

KCalendar-View Modern calendar view supporting both Hijri and Gregorian calendar

Ahmed Ibrahim 8 Oct 29, 2022
Android MVVM framework write in kotlin, develop Android has never been so fun.

KBinding 中文版 Android MVVM framework write in kotlin, base on anko, simple but powerful. It depends on my another project AutoAdapter(A library for sim

Benny 413 Dec 5, 2022
Klimatic is an android app built using Kotlin. It try to showcase all the latest technologies used in android.

Klimatic Klimatic is an android app built using Kotlin. It try to showcase all the latest technologies used in android. Built using Android Architectu

Shivam Satija 34 Oct 11, 2022
Oratio Library for Android Studio helps you simplify your Android TTS codes

Oratio Oratio is a library for Android Studio. This library is useful to a number of developers who are currently making apps using android TTS(Text-T

Jacob Lim 1 Oct 28, 2021
This is a demo android app representing implementation of SE principles in android app development

Articles Demo This repository contains a sample Android App that shows most popular articles data from NY Times API. This is a sample app that shows h

Waesem Abbas 2 Jan 20, 2022
Android-Boilerplate - Base project for android development with new technology

Android-Boilerplate Base project for android development with new technology, in

Muhammad Rizky Arifin 1 Aug 15, 2022
Gits-android-extensions - A collection of Kotlin extensions to simplify Android development

gits-android-extensions A collection of Kotlin extensions to simplify Android de

GITS Indonesia 3 Feb 3, 2022
Android Clean Architecture in Rorty is a sample project that presents modern, approach to Android application development using Kotlin and latest tech-stack.

Android Clean Architecture in Rorty is a sample project that presents modern, approach to Android application development using Kotlin and latest tech-stack.

Mr.Sanchez 176 Jan 4, 2023
Android Ptrace Inject for all ABIs and all APIs. Help you inject Shared Library on Android.

Android Ptrace Inject 中文可以参考我的注释内容进行理解 我写的注释相对来说比较全面了 How to build Make sure you have CMake and Ninja in your PATH Edit CMakeLists.txt. Set ANDROID_ND

SsageParuders 65 Dec 19, 2022
Pleasant Android application development

⚠️ Anko is deprecated. Please see this page for more information. Anko is a Kotlin library which makes Android application development faster and easi

Kotlin 15.9k Jan 5, 2023
YouTube Player library for Android and Chromecast, stable and customizable.

android-youtube-player android-youtube-player is a stable and customizable open source YouTube player for Android. It provides a simple View that can

Pierfrancesco Soffritti 2.9k Jan 2, 2023
View "injection" library for Android.

Kotter Knife Deprecated: This was a terrible idea because it allocates an object for every view reference. Do not use, and do not use anything like it

Jake Wharton 2.2k Dec 28, 2022
Android library that creates app shortcuts from annotations

Shortbread Android library that generates app shortcuts for activities and methods annotated with @Shortcut. No need to touch the manifest, create XML

Matthias Robbers 1.8k Dec 30, 2022
Android + Kotlin + Github Actions + ktlint + Detekt + Gradle Kotlin DSL + buildSrc = ❤️

kotlin-android-template ?? A simple Github template that lets you create an Android/Kotlin project and be up and running in a few seconds. This templa

Nicola Corti 1.5k Jan 3, 2023
🛠️ The missing drawable toolbox for Android. Create drawables programmatically and get rid of the boring and always repeated drawable.xml files.

DrawableToolbox English | 中文 The missing DrawableToolbox for Android. Create drawables programmatically and get rid of the boring and always repeated

Hong Duan 1.1k Jan 4, 2023
Kotlin library for Android

KAndroid Kotlin library for Android providing useful extensions to eliminate boilerplate code in Android SDK and focus on productivity. Download Downl

Paweł Gajda 890 Nov 13, 2022