A simple and minimal app to track how long you've been sober from anything you want.

Overview

Sobriety

A simple and minimal app to track how long you've been sober from anything you want.

I mostly designed this out of spite for "I Am Sober", which monetizes addiction recovery. The whole app was written in a day (specifically 03/10/2022) in the spare time I had between classes. It's not perfect but it's usable, and I plan to improve it.

Repository Metadata (via Shields.io)

Core

GitHub GitHub Workflow Status Maintenance

Size

GitHub code size GitHub repo size

Release Info

GitHub all releases GitHub downloads by release (latest by date)

GitHub release (latest SemVer) GitHub Release Date IzzyOnDroid

Issue Counts

GitHub open issues GitHub closed issues

PR Counts

GitHub open pull requests GitHub closed pull requests

Stats

GitHub commit activity GitHub commits since latest release (by date)

GitHub contributors GitHub Discussions

Comments
  • addiction list doubles

    addiction list doubles

    I used to have one thing in my addiction list (Fresh new install from fdroid today) and a half hour later when i looked again the list has doubled to two duplicate addictions..

    This happened a few times

    I recently added another item to my list and only a few minutes later the list has doubled again to 4 items both items both duplicated.

    bug question 
    opened by nutpantz 8
  • Cached times aren't working, even in previous releases

    Cached times aren't working, even in previous releases

    I am 100% sure they worked before but now on every release on multiple devices the cached times don't reset correctly

    Expected: Reset time, close and open app, time is relatively small because of the recent reset Actual: Reset time, close and open app, time is back where it was

    I am genuinely baffled.

    bug 
    opened by KiARC 8
  • UI improvements

    UI improvements

    I have made some qol improvements on various parts of the ui:

    • Use Material components instead of regular Android components. If you want to implement Material You theme later, you pretty much have to use them. Also, as I explained earlier, you don't have to avoid it and they simply look nicer.
    • Fix toolbar not showing on light mode.
    • Fix a bug where you can pick a future time in today.
    • The date formatting now expands to years, months and weeks. Also, if any time unit is 0, it's hidden. Fixes #24
    • The Create activity is more optimized for one handed usage. (all elements are positioned lower).
    opened by unbiaseduser 6
  • stop\restart option over relapse

    stop\restart option over relapse

    Many people stop for a length of time rather then a one time relapse. Then they restart abstaining from whatever. It would be nice if that was an option over just a relapse button that restarts automatically. Maybe keep time since abstaining was stopped. I personally would feel better if i could restart a fresh new abstaining attempt from an existing button if i have stopped for a few days, where i would likely trash the last attempt over use the relapse button when i wanted to try abstaining again

    enhancement question 
    opened by nutpantz 6
  • Crash when reading old cache

    Crash when reading old cache

    Unfortunately this bug seems to keep reappearing😄 The clean install of 5.1.4 works perfectly fine (also thanks for crediting me in the release notes) but when updating from 4.0.1 with an existing save file it crashes again.

    However this time its reproducible in the Emulator, so maybe that helps in getting rid of the bug.

    Steps to reproduce:

    1. Check out the revision of the repository where version was updated to 4.0.1
    2. Build and clean install this version on the emulator
    3. Open the app and create an entry
    4. Check out the current master branch (5.1.4) and update the app on the emulator by building and running again

    I appended the full crash log at the end, but the only relevant lines are

    Caused by: java.io.InvalidClassException: com.katiearose.sobriety.Addiction; at com.katiearose.sobriety.CacheHandler.readCache(CacheHandler.kt:17) at com.katiearose.sobriety.Main.onCreate(Main.kt:61)

    I don't really get why it crashes, because there is try catch blocks everywhere that should have caught that exception. Mabye its worth considering to use a different way of storage, since these FileOutPutStreams etc. are a bit tricky to debug. Since the data is very simple, you could use Android's Shared Preferences, and save the list as a serialized string in a single key value pair there. Or if you want to debug the current system, here is the full crash log:

    E/AndroidRuntime: FATAL EXCEPTION: main Process: com.katiearose.sobriety, PID: 21703 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.katiearose.sobriety/com.katiearose.sobriety.Main}: java.io.InvalidClassException: com.katiearose.sobriety.Addiction; local class incompatible: stream classdesc serialVersionUID = -8477717136644775154, local class serialVersionUID = 7971970991809636397 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.io.InvalidClassException: com.katiearose.sobriety.Addiction; local class incompatible: stream classdesc serialVersionUID = -8477717136644775154, local class serialVersionUID = 7971970991809636397 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:624) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1713) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1594) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1872) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427) at java.util.ArrayList.readObject(ArrayList.java:791) at java.lang.reflect.Method.invoke(Native Method) at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1066) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2013) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1899) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427) at com.katiearose.sobriety.CacheHandler.readCache(CacheHandler.kt:17) at com.katiearose.sobriety.Main.onCreate(Main.kt:61) at android.app.Activity.performCreate(Activity.java:8051) at android.app.Activity.performCreate(Activity.java:8031) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loopOnce(Looper.java:201)  at android.os.Looper.loop(Looper.java:288)  at android.app.ActivityThread.main(ActivityThread.java:7839)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

    bug 
    opened by JakeGonder 6
  • crash after update to 5.2.1

    crash after update to 5.2.1

    Just updated via F-Droid and got this error when attempting to launch the app.

    type: crash
    osVersion: google/oriole/oriole:13/TP1A.220905.004.A1/2022091400:user/release-keys
    package: com.katiearose.sobriety:12
    process: com.katiearose.sobriety
    
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.katiearose.sobriety/com.katiearose.sobriety.Main}: java.io.InvalidClassException: m1.a; class invalid for deserialization
    	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3677)
    	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3814)
    	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
    	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2309)
    	at android.os.Handler.dispatchMessage(Handler.java:106)
    	at android.os.Looper.loopOnce(Looper.java:201)
    	at android.os.Looper.loop(Looper.java:288)
    	at android.app.ActivityThread.main(ActivityThread.java:7904)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    	at com.android.internal.os.ExecInit.main(ExecInit.java:49)
    	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:355)
    Caused by: java.io.InvalidClassException: m1.a; class invalid for deserialization
    	at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:154)
    	at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:798)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1901)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1440)
    	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)
    	at java.util.ArrayList.readObject(ArrayList.java:791)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1066)
    	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2041)
    	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1927)
    	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1440)
    	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:428)
    	at n1.e.a(Unknown Source:105)
    	at com.katiearose.sobriety.Main.onCreate(Unknown Source:88)
    	at android.app.Activity.performCreate(Activity.java:8301)
    	at android.app.Activity.performCreate(Activity.java:8280)
    	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1389)
    	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3658)
    	... 14 more
    
    
    bug 
    opened by fuzzblob 5
  • Bug: Out of memory exception when reading old files

    Bug: Out of memory exception when reading old files

    There seems to be an issue when updating the app, and then reading a save file created in the old version.

    Steps to reproduce: 1 Checkout version 3.0.0 2 Add a couple of entries 3 Checkout the newest version => update the app => start the app => app crashes with this error:

    java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack trace available
    

    Re-installing the app fixes this bug but also gets rid of previous entries.

    opened by JakeGonder 5
  • Bugs with the

    Bugs with the "recent average" function?

    Afaik the "recent average" function calculates the average of the last 3 abstaining periods. With that in mind, I'd like to report some, uh, weird behavior with it:

    • If the addiction has never been relapsed at all, the average displays the time of the current abstaining period. That's kinda odd (and wrong as well), since there's no abstaining history to begin with.
    • If it has been relapsed, when you first log the relapse, the average is calculated and displayed correctly. However, when you close the app and open it again, the average displays the time of the new abstaining period.

    Example: If I create an addiction with the time of 1 hour ago and I log the relapse, the average is displayed as 20 minutes (which is correct). However, if I close and open the app again, if the time of the new period is 10 seconds, when I open the app, the "average" is displayed as 10 seconds instead of the actual average value.

    Am i gonna fix it?

    • [x] Yes, but only after #38 since i'm not exactly familiar with resolving merge conflicts and stuff. If you know how, plz teach me.
    bug 
    opened by unbiaseduser 4
  • Recent Average

    Recent Average

    When adding a new entry, I think the recent average should be null instead of the current implementation. If I add an entry with a future time, it shows the recent average as the difference between now and the set time (in negative). Same applies to adding an entry with a past time (difference in positive).

    wontfix 
    opened by E0697 4
  • minSdk too high

    minSdk too high

    Are there any limitations that make this app incompatible with older Android devices? Can't install it from provided APK files.

    I think it can be easily lowered to 21.

    https://github.com/KiARC/Sobriety/blob/master/app/build.gradle#L11

    enhancement 
    opened by sadellie 4
  • Refactored Main to use Recyclerview instead of manually created card objects

    Refactored Main to use Recyclerview instead of manually created card objects

    I admit, this might look like a big change, but i promise it only has advantages😄 I refactored Main to use a RecyclerView to display the cards, replacing the createNewCard method.

    Advantages of using a recycler view:

    • More efficient (Views are "recycled" when scrolling)
    • Allows updating of all cards in sync
    • Animations for deleting / inserting
    • Design of cards is now easier to modify

    To put it simply, the logic part of createNewCard is now in the onBindViewHolder method of the Recyclerview Adapter, the design part of createNewCard is now fixed into the card_addiction.xml

    I also made some minor design changes, trying out if icons would work as reset / delete buttons, this is just a suggestion.

    ⚠️These changes still don't contain a fix for the current crash when trying to read old files.

    opened by JakeGonder 4
  • Lengths of time dont match calendar dates

    Lengths of time dont match calendar dates

    Does this app follow the calendar year or does it just accumulate seconds and minutes to form weeks and months? The app says im 11 months 3 weeks, but by the calendar im 1 year 4 days?

    bug 
    opened by Taxit0m 6
  • Milestones and Savings disappear

    Milestones and Savings disappear

    The milestones and savings disappear when closing the milestones and savings view.

    Here is a Youtube Short of the bug https://youtu.be/0iBE2V1FUvA

    Don't ask me why a short; Youtube decided it was a short.

    I am running the latest version available on F-Droid (just updated and tested before posting the issue).

    • OnePlus 6 (A6003)
    • OxygenOS 11.1.2.2 (Android version 11)
    • Sobriety v7.0.0
    • F-Droid 1.15.4
    opened by inuitviking 1
  • Crashed on launch after F-Droid update to 7.0

    Crashed on launch after F-Droid update to 7.0

    Upgraded from the F-Droid 6.2.1 release and the App crashed on launch. The App cache was already empty and I don't want to clear the actual data and set it up again :unamused: .

    Here is the startup exception:

    11-23 16:33:54.950 15702 15702 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.katiearose.sobriety/com.katiearose.sobriety.activities.Main}: java.io.InvalidClassException: j$.time.t; class invalid for deserialization
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3280)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3419)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2026)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:107)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:214)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7400)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime: Caused by: java.io.InvalidClassException: j$.time.t; class invalid for deserialization
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:154)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:798)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1873)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.util.HashMap.readObject(HashMap.java:1408)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1066)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2013)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1899)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.util.ArrayList.readObject(ArrayList.java:791)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1066)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2013)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1899)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1412)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at j1.a.a(Unknown Source:105)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at com.katiearose.sobriety.activities.Main.onCreate(Unknown Source:148)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:7824)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.Activity.performCreate(Activity.java:7813)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3255)
    11-23 16:33:54.950 15702 15702 E AndroidRuntime:        ... 11 more
    

    Maybe this issue is related to #48 , but I'm wondering why it's not mentioned in the release notes (or fixed before the F-Droid release), as the Issue seems to be known for about a month.

    opened by bibo38 5
  • Make Sobriety Cross Platform

    Make Sobriety Cross Platform

    It would be great to be able to release Sobriety on iOS but a lot of work would need to be done on making the code work on both platforms. Luckily Kotlin can be used for both, but Android APIs wouldn't work and neither would many Google libraries I would assume. This is a very long term goal.

    enhancement 
    opened by KiARC 3
Releases(v7.0.0)
  • v7.0.0(Nov 17, 2022)

    Thank you so much to @unbiaseduser

    What's Changed

    • Foss reimplementation of i am sober features by @KiARC in https://github.com/KiARC/Sobriety/pull/51
    • v7.0.0 Upgrade Time by @KiARC in https://github.com/KiARC/Sobriety/pull/52

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v6.2.1...v7.0.0

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v7.0.0-release.apk(2.42 MB)
  • v6.2.1(Nov 14, 2022)

    What's Changed

    • Adaptive icon + Android 13 themed icon by @unbiaseduser in https://github.com/KiARC/Sobriety/pull/46
    • Add settings page (only appearance settings for now) by @unbiaseduser in https://github.com/KiARC/Sobriety/pull/47
    • v6.2.1 Settings by @KiARC in https://github.com/KiARC/Sobriety/pull/49

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v6.1.1...v6.2.1

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v6.2.1-release.apk(2.33 MB)
  • v6.1.1(Oct 21, 2022)

  • v6.0.0(Oct 20, 2022)

    Thank you so so much to @unbiaseduser, who helped immensely with this release and implemented so many new features I don't even know where to begin!

    In my excitement to publish this I forgot the binary, but it's available now 😅 my bad

    What's Changed

    • Merge I'm Definitely Sober features back into Sobriety by @KiARC in https://github.com/KiARC/Sobriety/pull/41

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v5.9.9...v6.0.0

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v6.0.0-release.apk(2.13 MB)
  • v5.9.9(Oct 20, 2022)

  • v5.4.2(Oct 17, 2022)

    What's Changed

    • Update README.md by @Poussinou in https://github.com/KiARC/Sobriety/pull/34
    • Fix duplicate cards showing on many cases by @unbiaseduser in https://github.com/KiARC/Sobriety/pull/36
    • v5.4.2 Lots of Patches by @KiARC in https://github.com/KiARC/Sobriety/pull/37

    New Contributors

    • @Poussinou made their first contribution in https://github.com/KiARC/Sobriety/pull/34
    • @unbiaseduser made their first contribution in https://github.com/KiARC/Sobriety/pull/36

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v5.2.1...v5.4.2

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v5.4.2-release.apk(1.54 MB)
  • v5.2.1(Sep 13, 2022)

    I'm tired of changing the cache format so this should last longer

    What's Changed

    • New cache format by @KiARC in https://github.com/KiARC/Sobriety/pull/30
    • 5.2.1 by @KiARC in https://github.com/KiARC/Sobriety/pull/31

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v5.1.5...v5.2.1

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v5.2.1-release.apk(1.54 MB)
  • v5.1.5(Aug 4, 2022)

    No more legacy cache support 😭 but at least it won't crash anymore. A new cache format is on the way, and will hopefully use built-in datatypes to avoid serialization issues. I'm envisioning potentially an ArrayList of HashMaps which could be used to assemble Addictions... We'll see.

    What's Changed

    • Quickfix for 4.x.x caches crashing 5.x.x by @KiARC in https://github.com/KiARC/Sobriety/pull/23

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v5.1.4...v5.1.5

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v5.1.5-release.apk(2.46 MB)
  • v5.1.4(Aug 2, 2022)

    Glorious Button Icons!

    • CircularBuffers + last-3 averages are back, because I realized how much more useful a last-3 average is
    • New RecyclerView implementation courtesy of JakeGonder, which should improve performance
    • Updated caching system that is much more reliable
    • Code has been refactored to be more understandable
    • UI updates, also courtesy of JakeGonder!

    What's Changed

    • Refactored Main to use Recyclerview instead of manually created card objects by @JakeGonder in https://github.com/KiARC/Sobriety/pull/17
    • v5.0.0! by @KiARC in https://github.com/KiARC/Sobriety/pull/19

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v4.0.1...v5.1.4

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v5.1.4-release.apk(2.46 MB)
  • v4.0.1(Mar 30, 2022)

  • v4.0.0(Mar 25, 2022)

    Note: There is a known issue that has been fixed in v4.0.1, where reading legacy caches results in excessive memory usage and a crash. Please update to v4.0.1.

    What's Changed

    • Bugfix: Reset not working by @JakeGonder in https://github.com/KiARC/Sobriety/pull/13
    • Fixing Things by @KiARC in https://github.com/KiARC/Sobriety/pull/14

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v3.0.0...v4.0.0

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v4.0.0-release.apk(2.45 MB)
  • v3.0.0(Mar 24, 2022)

    Added a display of the average time between the last three relapses.

    What's Changed

    • Average sober time by @KiARC in https://github.com/KiARC/Sobriety/pull/9
    • Average Sober Time by @KiARC in https://github.com/KiARC/Sobriety/pull/10

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v2.1.0...v3.0.0

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v3.0.0-release.apk(2.45 MB)
  • v2.1.0(Mar 22, 2022)

    What's Changed

    • Bug fix, code optimization, small ux changes by @JakeGonder in https://github.com/KiARC/Sobriety/pull/6
    • Bug Fixes by @KiARC in https://github.com/KiARC/Sobriety/pull/7

    New Contributors

    • @JakeGonder made their first contribution in https://github.com/KiARC/Sobriety/pull/6

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v2.0.2...v2.1.0

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v2.1.0-release.apk(2.45 MB)
  • v2.0.2(Mar 21, 2022)

  • v2.0.1(Mar 21, 2022)

    • Create page has been redesigned
    • Confirmation dialogs have been added for the delete and reset actions

    What's Changed

    • Redesign by @JakeGonder in https://github.com/KiARC/Sobriety/pull/4

    New Contributors

    • @JakeGonder made their first contribution in https://github.com/KiARC/Sobriety/pull/4

    Full Changelog: https://github.com/KiARC/Sobriety/compare/v1.1.0...v2.0.1

    Source code(tar.gz)
    Source code(zip)
    Sobriety.v2.0.1-release.apk(2.43 MB)
  • v1.1.0(Mar 14, 2022)

  • v1.0.1(Mar 14, 2022)

  • v1.0.0(Mar 14, 2022)

Owner
Katherine Rose
Heya, I'm Kat!
Katherine Rose
Android app that allows you to draw anything and turn it into a jigsaw puzzle.

Android-Jigsaw-Puzzle Like to draw? Like to solve jigsaw puzzles? Try JigDraw! This is an Android app where a user draws something and use it to gener

Jay Paulynice 149 Nov 24, 2022
Android app that helps you keep track of the medical supplements you need to take and how you spend your days

Android app that helps you keep track of the medical supplements you need to take and how you spend your days, similar to a bullet journal. It also allows you to reflect on your day, week, year, etc.

Rachelle Hu 4 Nov 10, 2022
A movie application where you can search a movie that you want and see the detail of movie

MovieApp This is a simple movie application where you can search a movie that you want and see the detail of movie Technologies Hilt (Dependency Injec

Serhad Mert 5 Nov 30, 2021
CutableTextView - the super lightweight library that helps to you cut long text. ✂️

An easy to use CutableTextView when you need to cut a long text. ✂️ ✂️ ✂️ Gradle dependencies { implementation 'com.github.devit951:cutabletextvie

Ildarov 2 Aug 29, 2019
Task Timer - An android app that helps you to keep a track of how much time you spend on each task

Task Timer - An android app that helps you to keep a track of how much time you spend on each task

Hassan Al-Shammari 1 Feb 24, 2022
Loop Habit Tracker, a mobile app for creating and maintaining long-term positive habits

Loop is a mobile app that helps you create and maintain good habits, allowing you to achieve your long-term goals. Detailed graphs and statistics show you how your habits improved over time.

Alinson S. Xavier 5.8k Jan 7, 2023
The News App has been carried out within the framework of the MVVM architecture, information about news is obtained by consulting an API, it is built usisng Jetpack Copose, Coroutines, Dependency Injection with Hilt and Retrofit

Journalist The News App consists of an application that displays the latest news from EEUU from an API that provides official and updated information.

null 0 Nov 3, 2021
Here OneSignal push and in-app-message have been implemented

OneSIgnal demo project Here we have implemented OneSignal inAppMessage and Push Notification ANDROID SDK SETUP WITH ONESIGNAL: https://documentation.o

Fakhrul Alam Siddiqei 2 Dec 7, 2022
A digital wellbeing Android app that helps minimise distractions when you don't want them

Bundel is a digital wellbeing Android app, helping you to focus by grouping up notifications and only releasing them in batches, at set times. This minimises context switching and improves productivity, while decreasing the impulse to continuously check your phone.

Code with the Italians 238 Dec 27, 2022
With this simple app, you can keep track of your favourite cryptocurrency on your wrist.

Capstone project crypto Tracker ?? Final Product (05-06) V1.1 "somebody toucha my spaghet" feature set State Note Track the current price of a crypto

Stefan de Kraker 2 Aug 20, 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 port of Simon Tatham's Puzzles. *git replace in use* - you might want to {{ git fetch origin 'refs/replace/*:refs/replace/*' }}

This is the README accompanying the source code to Simon Tatham's puzzle collection. The collection's web site is at <https://www.chiark.greenend.org.

Chris Boyle 470 Dec 22, 2022
Xposed module which will set location where you want without effect mock location.

GPS Setter Support/Discussion: XDA thread As most of GPS spoof app not working anymore coz some are old and some are not proper implement with current

Android1500 73 Dec 28, 2022
SlushFlicks has been built upon public APIs from IMDB.

SlushFlicks SlushFlicks has been built upon public APIs from IMDB. This application helps users to view trending, popular, upcoming and top-rated movi

Sifat Oshan 14 Jul 28, 2022
This assignment has been given to me for Android developer position at SonyLiv.

asssignmentSonyLiv This assignment has been given to me for Android developer position at SonyLiv. This codeis not full functional but can give a cont

Rudra Chouhan 0 Nov 21, 2021
This is an open source launcher project for Android devices that has been built completely from scratch

Description This is an open source launcher project for Android devices that has been built completely from scratch. The main goal of this launcher is

OpenLauncher Team 1.3k Dec 21, 2022
This repository has been created to teach SOLID principles.

SOLID Principles Single Responsibility Each class should have only one purpose and not be filled with excessive functionality. Let's look at this Area

Ali Soleimani 2 Aug 15, 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