An adaptation of the JSR-310 backport for Android.

Overview

ThreeTen Android Backport

An adaptation of the JSR-310 backport for Android.

Attention: Development on this library is winding down. Please consider switching to Android Gradle plugin 4.0, java.time.*, and its core library desugaring feature in the coming months.

Usage

Initialize the timezone information in your Application.onCreate() method:

@Override public void onCreate() {
  super.onCreate();
  AndroidThreeTen.init(this);
}

That's it. Otherwise usage is the exact same as the ThreeTenBP library and you should consult its website for usage information: https://www.threeten.org/threetenbp/.

Why JSR-310?

JSR-310 was included in Java 8 as the java.time.* package. It is a full replacement for the ailing Date and Calendar APIs in both Java and Android. JSR-310 was backported to Java 6 by its creator, Stephen Colebourne, from which this library is adapted.

Why not use ThreeTenBP?

Similar to the problems with using Joda-Time on Android, the threetenbp uses a JAR resource for loading timezone information. This is an extremely inefficient mechanism on Android.

This library places the timezone information as a standard Android asset and provides a custom loader for parsing it efficiently.

Why not use Joda-Time?

Joda-Time has a very large API which brings with it a very large binary size and large method count. The creator of both JSR-310 and Joda-Time has also said that while Joda-Time isn't broken, it does have design flaws.

If you are using Joda-Time already, there's little reason to switch unless its size or method count is relevant to you. For new projects, however, this library offers the standard APIs in Java 8 as a much smaller package in not only binary size and method count, but also in API size.

Download

implementation 'com.jakewharton.threetenabp:threetenabp:1.3.0'

Snapshots of the development version are available in Sonatype's snapshots repository.

License

Copyright (C) 2015 Jake Wharton

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
  • R8 issue with Ser

    R8 issue with Ser

    It looks like the public constructor is getting stripped.

    Our solution is:

    -keepclassmembers class org.threeten.bp.Ser {
        <init>();
    }
    

    but not sure if more would need to be done.

    opened by eygraber 14
  • Make it compatible with Retrofit

    Make it compatible with Retrofit

    I am having issues using this library with Retrofit and GSON.

    Since some of the classes, like ZoneId are abstract and GSON can't create them, I am getting exceptions on Retrofit when I try do deserialize my webservice JSON response.

    It would be great to have an adapter that could be plugged into Retrofit to provide GSON the ability to deal with this library.

    opened by feinstein 14
  • Question: in which cases is `AndroidThreeTen.init(this)` a

    Question: in which cases is `AndroidThreeTen.init(this)` a "must"?

    Is it possible to avoid calling it in some cases? I've noticed it loads time zones from a file. It's just that in the Application.onCreate, it takes about 59-70 ms (on Nexus 5x with Android 8.1), and adding this to other libraries that need initialization... it adds up... I mainly use LocalDate and formatting of it. Are there any cases that I won't need this call? Or, which cases would require calling this?

    Would having a signed app (with proguard and all) make it a bit faster ? Maybe it will compress the file, so that loading it will be faster?

    opened by AndroidDeveloperLB 12
  • Ship proguard rules in the aar?

    Ship proguard rules in the aar?

    Would require:

    • Consensus on rules to include. Ideally would be as limited as possible to allow some stripping to occur, where feasible.
    • Enabling proguard for the instrumentation tests
    • Tests which exercise as much of the API as easily as possible to validate the rules.
    opened by JakeWharton 12
  • Sending ZonedDateTime through Intent loses tz info if Proguard is enabled

    Sending ZonedDateTime through Intent loses tz info if Proguard is enabled

    Here is a minimal project to reproduce the issue: https://github.com/reisub/ZonedDateTimeProguardBug

    After fiddling with proguard for the last hour and half - I only know that this will definitely fix it:

    -keep class org.threeten.bp.** { *; }

    .. but that keeps the whole library from being obfuscated. Proguard is pain.

    opened by reisub 10
  • Android Studio preview?

    Android Studio preview?

    Is there a way to make ThreeTenABP work in Android Studio's Preview tab? Initialising the library when in edit mode still raises the errors below in the preview tab.

    I've tried @tymm's solution for #24 to no avail. Any suggestions?

    Error after building the project:

    java.io.FileNotFoundException: Asset file: org/threeten/bp/TZDB.dat
        at android.content.res.AssetManager.open(AssetManager.java:354)
        at android.content.res.AssetManager.open(AssetManager.java:321)
        at com.jakewharton.threetenabp.AndroidThreeTen.init(AndroidThreeTen.java:27)
        at some.package.name.view.SomeCustomView.<init>(SomeCustomView.kt:61)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:465)
        at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:172)
        at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:105)
        at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:186)
        at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:334)
        at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:345)
        at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:245)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
        at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:858)
        at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater_Delegate.parseInclude(LayoutInflater_Delegate.java:197)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:902)
        at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:854)
        at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:861)
        at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
        at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:324)
        at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:429)
        at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:389)
        at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:548)
        at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:533)
        at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:966)
        at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:533)
        at com.android.tools.idea.rendering.RenderTask.lambda$inflate$53(RenderTask.java:659)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    

    Error after refreshing the layout:

    org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered
        at org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:176)
        at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:133)
        at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
        at org.threeten.bp.ZoneId.of(ZoneId.java:357)
        at org.threeten.bp.ZoneId.of(ZoneId.java:285)
        at org.threeten.bp.ZoneId.systemDefault(ZoneId.java:244)
        at org.threeten.bp.Clock.systemDefaultZone(Clock.java:137)
        at org.threeten.bp.OffsetDateTime.now(OffsetDateTime.java:175)
        at some.package.name.view.SomeCustomView.updateItems(SomeCustomView.kt:77)
        at some.package.name.view.SomeCustomView.<init>(SomeCustomView.kt:72)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:465)
        at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:172)
        at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:105)
        at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:186)
        at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:334)
        at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:345)
        at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:245)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
        at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:858)
        at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater_Delegate.parseInclude(LayoutInflater_Delegate.java:197)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:902)
        at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:854)
        at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:861)
        at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:70)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:834)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
        at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:324)
        at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:429)
        at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:389)
        at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:548)
        at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:533)
        at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:966)
        at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:533)
        at com.android.tools.idea.rendering.RenderTask.lambda$inflate$53(RenderTask.java:659)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
    

    Initialisation used in the custom view:

    if(isInEditMode)
        AndroidThreeTen.init(context)
    
    opened by AndreasBackx 10
  • Question: Where's the code exactly?

    Question: Where's the code exactly?

    It is said this library is better than ThreeTenBP repo, here .

    So I was curious and looked at the repo's files, but I don't see a lot at all, especially not of LocalDate, which I somehow use by using this repo.

    How could it be?

    Is it somehow using the threetenbp library, yet with some changes applied?

    If so, is it frequently updated like it? Maybe even auto-updated ? I ask this because I notice that the threetenbp library seems updated more recently (has some files updated 6 months ago), yet here it's not (newest files updated 11 months ago) .

    opened by AndroidDeveloperLB 9
  • Comparison to joda-time-android

    Comparison to joda-time-android

    I am sorry to ask you this bluntly, but how does your solution compares to: https://github.com/dlew/joda-time-android

    I am evaluating a good way to implement JSR-310 on old devices and I can't figure how you two are different and which one to choose.

    opened by feinstein 9
  • Getting pure-java modules with ThreeTenBP to play nice with ThreeTenABP?

    Getting pure-java modules with ThreeTenBP to play nice with ThreeTenABP?

    Disclaimer: this is probably a gradle config issue rather than an issue with this library per-se. But hopefully this issue is relevant to android developers wanting to use JSR 310 in multi-module projects.

    I have a pure java (non-android) gradle module called common with some utility functions for building ZonedDateTime objects. It depends on the standard jvm backport library (org.threeten:threetenbp).

    What I'd like is to have the android app module depend on the common module to make use of these platform-independent utility functions, but depend on threetenABP instead for performance. Should this be possible? Attempting to do it naiively gives this build error:

    Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDevelopDebug'.
    > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK org/threeten/bp/format/ChronologyText.properties
      	File1: /Users/matthewcl/.gradle/caches/modules-2/files-2.1/org.threeten/threetenbp/1.3.1/5769e9c27cd5ba74cd3a73785dde0bbb5a2d3c0d/threetenbp-1.3.1.jar
      	File2: /Users/matthewcl/.gradle/caches/modules-2/files-2.1/org.threeten/threetenbp/1.3.1/fecd59cfa6acebf3d0f2f41f55a1cc3e24e59726/threetenbp-1.3.1-no-tzdb.jar
    

    From what I understand, the same public classes and interfaces are in use in both modules (e.g. ZonedDateTime). It seems like something like gradle's provided keyword to have compilation succeed and yet use ABP at runtime would work, but I haven't had much success with it.

    Any thoughts?

    opened by kiwiandroiddev 8
  • ThreeTen is ignoring Android 24/12 hour display settings

    ThreeTen is ignoring Android 24/12 hour display settings

    When trying to print ZoneDateTime time using DateTimeFormatter, the user system settings regarding 24/12 hour display is ignored

    The issue is if you use: DateTimeFormatter timeFormat = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);

    The time format will only consider the Locale and not the user settings, example: DE Locale will display a 24Hours format: 23:30 EN Locale will display a 12Hours format: 11:30 PM Regardless of the user system settings.

    android.text.DateFormat.getTimeFormat(Context context) will take the system settings in consideration but only accepts Date objects, the conversion isn't straight forward and might lead to mistakes.

    opened by rnevet 8
  • NoClassDefFoundError in android 4.4?

    NoClassDefFoundError in android 4.4?

    I'm getting a NoClassDefFoundError when initializing the library in Application#onCreate

    The stacktrace I'm getting is:

    java.lang.NoClassDefFoundError: org.threeten.bp.zone.TzdbZoneRulesProvider
                          at com.jakewharton.threetenabp.AndroidThreeTen.init(AndroidThreeTen.java:28)
                          at com.jakewharton.threetenabp.AndroidThreeTen.init(AndroidThreeTen.java:16)
                          at com.crumbit.crumbitapp.App.onCreate(App.java:99)
                          at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
                          at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4344)
                          at android.app.ActivityThread.access$1500(ActivityThread.java:135)
                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:136)
                          at android.app.ActivityThread.main(ActivityThread.java:5017)
                          at java.lang.reflect.Method.invokeNative(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:515)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                          at dalvik.system.NativeStart.main(Native Method)
    

    I'm trying to find out why, but meanwhile I have a clue I'm just opening this to see if somebody else has a clue on that, guess that mostly has to do with build process.

    opened by davidgarciaanton 7
  • IllegalStateException: Already initialized

    IllegalStateException: Already initialized

    Caused by java.lang.IllegalStateException: Already initialized
           at org.threeten.bp.zone.ZoneRulesInitializer.setInitializer(ZoneRulesInitializer.java:74)
           at com.jakewharton.threetenabp.AndroidThreeTen.init(AndroidThreeTen.java:22)
           at com.jakewharton.threetenabp.AndroidThreeTen.init(AndroidThreeTen.java:17)
           at com.jakewharton.threetenabp.AndroidThreeTen.init(AndroidThreeTen.java:13)
           at com.wave.waveradio.WaveApplication.onCreate(WaveApplication.java:108)
    

    We have seen this exception on some devices since last release.

    //jsr310
        implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
        testImplementation("org.threeten:threetenbp:1.4.0") {
            exclude module: "com.jakewharton.threetenabp:threetenabp:1.2.1"
        }
    //previously added duplicate entry
    //testImplementation("org.threeten:threetenbp:1.4.0")
    

    We have tried remove that testImplementation duplicate entry, try/catch that exception and continue. But new exception occurred.

    Fatal Exception: org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered
           at org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:165)
           at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:122)
           at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
           at org.threeten.bp.ZoneId.of(ZoneId.java:358)
           at org.threeten.bp.ZoneId.of(ZoneId.java:286)
           at org.threeten.bp.ZoneId.systemDefault(ZoneId.java:245)
           at org.threeten.bp.Clock.systemDefaultZone(Clock.java:137)
           at org.threeten.bp.LocalDateTime.now(LocalDateTime.java:152)
    

    I have seen two library entry in Android Studio,

    org.threeten:threetenbp:1.4.0:no-tzdb@jar
    org.threeten:threetenbp:1.4.0@jar
    

    But only 1.4.0@jar version when run ./gradlew app::dependencies 2>&1 1> log2

    I have also clear AndroidStudio & gradle caches. Do you know what might cause this issue? Thank you.

    opened by ksc91u 14
  • Issue with unit tests in multi-module project

    Issue with unit tests in multi-module project

    I was seeing the unit testing issues described in #14, and successfully applied the solutions outlined - however when I try to declare the threetenabp dependencies in another module via gradle's api and testApi commands, I'm still seeing the ZoneRulesException: No time-zone data files registered error.

    It's pretty clear that the change to api is the problem, but I'm just curious if someone knows why and/or how I can possibly change my gradle setup to get it to work? It's ideal to declare dependencies like this that are re-used throughout multiple modules in the base "core" module and let them transitively apply, instead of having to redeclare in every module's gradle file. Any help is appreciated :)

    I have a core module and a main app module that depends on it, relevant info from gradle files below:

    Declaring in app build.gradle (working):

    implementation project(':core')
    
    implementation 'com.jakewharton.threetenabp:threetenabp:1.0.4'
    testImplementation 'org.threeten:threetenbp:1.3.2'
    

    Declaring in core build.gradle (not working):

    api 'com.jakewharton.threetenabp:threetenabp:1.0.4'
    testApi 'org.threeten:threetenbp:1.3.2'
    
    opened by erawhctim 4
  • Cannot Run Project on Android Phone Even After Compiling Due to

    Cannot Run Project on Android Phone Even After Compiling Due to "unable to merge dex" Error

    I am currently using the Android Studio 3.0 and I have faced this problem of compiling this project with ApexNLP library and I am facing this error. I tried the library in the previous version of the android studio but it still failed. I need the ApexNLP library for the project. So please help me out.

    ApexNLP Project Link : https://github.com/6thsolution/ApexNLP

    Error: Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.

    com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

    opened by agarwalmayank32 4
Owner
Jake Wharton
Jake Wharton
Joda-Time library with Android specialization

Android has built-in date and time handling - why bother with a library? If you've worked with Java's Date and Calendar classes you can probably answer this question yourself, but if not, check out Joda-Time's list of benefits.

Daniel Lew 2.6k Dec 9, 2022
Android NTP time library. Get the true current time impervious to device clock time changes

TrueTime for Android Make sure to check out our counterpart too: TrueTime, an NTP library for Swift. NTP client for Android. Calculate the date and ti

Instacart 1.3k Jan 4, 2023
A better calendar for Android

Caldroid Caldroid is a fragment that display calendar with dates in a month. Caldroid can be used as embedded fragment, or as dialog fragment. User ca

Roomorama 1.4k Nov 29, 2022
Standalone Android widget for picking a single date from a calendar view.

TimesSquare for Android Standalone Android widget for picking a single date from a calendar view. Usage Include CalendarPickerView in your layout XML.

Square 4.4k Dec 20, 2022
Android library for better Picker DialogFragments

DialogFragments modeled after the AOSP Clock and Calendar apps to improve UX for picking time, date, numbers, and other things.

Code-Troopers 2.7k Dec 29, 2022
Android calendar view inspired by Sunrise calendar and iOS7 stock calendar

SilkCal Android calendar view inspired by Sunrise calendar and iOS7 stock calendar. Usage Add compile 'me.nlmartian.silkcal:library:0.1.1' to your dep

JunGuan Zhu 385 Nov 25, 2022
A material-styled android view that provisions picking of a date, time & recurrence option, all from a single user-interface.

SublimePicker A customizable view that provisions picking of a date, time & recurrence option, all from a single user-interface. You can also view 'Su

Vikram 2.3k Jan 4, 2023
Pick a date or time on Android in style

Material DateTime Picker - Select a time/date in style Material DateTime Picker tries to offer you the date and time pickers as shown in the Material

null 4.7k Dec 29, 2022
An android library which provides a compact calendar view much like the one used in google calenders.

CompactCalendarView CompactCalendarView is a simple calendar view which provides scrolling between months. It's based on Java's Date and Calendar clas

SundeepK 1.5k Jan 7, 2023
A Material design back port of Android's CalendarView

Material Calendar View A Material design back port of Android's CalendarView. The goal is to have a Material look and feel, rather than 100% parity wi

Prolific Interactive 5.8k Jan 3, 2023
android library dialog month picker

RackMonthPicker android library dialog month picker Download Download via Maven: Add the JitPack repository to your build file <repositories> <rep

Kristiawan Adi L 41 Aug 13, 2022
Android open source calendar

Etar Calendar Etar (from Arabic: إِيتَار) is an open source material designed calendar made for everyone! Why? Well, I wanted a simple, material desig

null 1.5k Jan 4, 2023
PopTimer is a simple, lightweight Rubik's Cube timer for Android

PopTimer (developing) PopTimer is a simple, lightweight Rubik's Cube timer, localization support, It uses the TNoodle library to generate scramble seq

Nthily 5 Sep 8, 2022
MinutesAliveApp - Basic Android App that ask for your date of birth and shows your age in minutes

MinutesAliveApp Basic Android App that ask for your date of birth and shows your

JestorDev 0 Jan 30, 2022
GoogleCalendar Android Clone with Compose

GoogleCalendar Android Clone with Compose Status: WIP This is a jetpack compose sample app written in Kotlin following clean architecture principles.

Anmol Verma 4 Oct 8, 2022
An Android platform component management tool chain, based on Kotlin language.

Rubik Rubik是一套解决Android平台组件化的综合方案,提供gradle project之间的路由通讯能力,以及对gradle project的组件定义、版本控制、maven发布、aar/jar与源码之间的切换以及组件的自由组合等能力。 Rubik由两部分组成: Rubik Router

Baidu 135 Jan 3, 2023
A backport of the SwitchPreference component that was introduced on Android 4 (ICS / level 14). This port works on Android 2.1+ (Eclair MR1 / level 7).

Android Switch Preference Backport A backport of the SwitchPreference component that was introduced on Android 4 (ICS / level 14). This port works on

Benoit Lubek 498 Dec 29, 2022
A backport of the new Transitions API for Android

TransitionsBackport Android library for using the Transitions API released with Android KitKat on older versions of Android. At the moment, it is comp

Stéphane Guérin 578 Dec 29, 2022
A backport of the Android 4.2 GlowPadView that works on the SDK on API levels 4+

GlowPadBackport A backport of the Android 4.2 GlowPadView that works on the SDK on API levels 4+. It is heavily based upon Google's own internal imple

Frakbot 246 Dec 9, 2022
Backport of Material dialogs with easy-to-use API based on DialogFragment

StyledDialogs for Android Demo app: Features: Compatible with Material Design Guidelines Same look for Android 2.2+ Built on top of standard DialogFra

Avast 2.2k Dec 29, 2022