Loop Habit Tracker, a mobile app for creating and maintaining long-term positive habits

Overview

Loop Habit Tracker

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. It is completely ad-free and open source.

Get it on Google Play Get it on F-Droid

Screenshots

Main screen Edit habit Habit strength Habit history and streaks Widgets Night mode

Features

  • Beautiful, minimalistic and lightweight interface. Loop has an elegant and minimalistic interface that is very easy to use, even for first-time users. Highly optimized for speed, the app works well even on older phones.

  • Habit score. Loop has an advanced formula for calculating the strength of your habits. Every repetition makes your habit stronger and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your progress, unlike many other don't-break-the-chain apps.

  • Flexible schedules. In addition to daily habits, Loop supports habits with more complex schedules, such as 3 times per week or every other day.

  • Reminders. Schedule notifications to remind you of your habits. Each habit can have its own reminder, at a chosen time of the day. Easily check or dismiss your habit directly from the notification.

  • Widgets. Be reminded of your habits whenever you unlock your phone. Colorful widgets allow you to track your habits directly from your home screen, without even opening the app.

  • Take control of your data. If you want to further analyze your data, or move it to another service, Loop allows you to export it to spreadsheets (CSV) or to a database file (SQLite). For power users, checkmarks can be added through other apps, such as Tasker.

  • No limitations. Track as many habits as you wish. Loop imposes no artificial limits on how many habits you can have. All features are available to all users. There are no in-app purchases.

  • Completely ad-free and open source. There are no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The app is completely open-source (GPLv3).

  • Works offline and respects your privacy. Loop doesn't require an Internet connection or online account registration. Your confidential data is never sent to anyone. Neither the developers nor any third-parties have access to it.

Installing

The easiest way to install Loop is through the Google Play Store or F-Droid. You may also download and install the APK from the releases page; note, however, that the app will not be updated automatically. To build this app from the source code, see build instructions.

Contributing

Loop is an open source project developed entirely by volunteers. If you would like to contribute to the project, you are very welcome. There are many ways to contribute, even if you are not a software developer.

  • Report bugs, suggest features. The easiest way to contribute is to simply use the app and let us know if you find any problems or have any suggestions to improve it. To report a problem, please create a new bug report. To request a new feature or vote on existing feature requests, please visit our GitHub Discussions page. If you would like to receive the newest versions of the app earlier than everyone else, join our open beta on Google Play.

  • Spread the word. If you like the app, share it with your family, friends and colleagues. You can also rate and review the app on Google Play Store, to help other users find it more easily.

  • Translate the app into your own language. If you are not a native English speaker, and would like to see the app translated into your own language, please join our open translation project. If the translation is already completed, you are also very welcome to join and proofread it.

  • Write some code. If you are an Android developer, you are very welcome to contribute with code. Please see docs/GUIDELINES.md.

License

Copyright (C) 2016-2021 Álinson Santos Xavier [email protected]

Loop Habit Tracker is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

Loop Habit Tracker is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Comments
  • Make skips freeze score

    Make skips freeze score

    The way skip days are currently implemented in the app have a couple of problems. The biggest one of them is that they are no different than a check for the current day, and only distinct visually, making them a visual gimmick. The desire for skip days comes from situations where a habit can neither be completed or failed, it's just not valid for a given day. In those days the person can add a check not to break score/streak, but then he is getting rewarded for doing nothing and it feels like cheating. Another thing you can do it is let them be unchecked, but then you are being penalized for things outside of your control (sick days, inability because of location, etc.). The way the app currently implements them is the same as adding a check (which feels like cheating and rewards you for doing nothing), but only visually saves that something happened that day. A couple of concrete examples why the current behavior doesn't work:

    Streaks

    1. For a daily habit that I skipped Mon-Wed, did it on Thu, and skipped Friday-Sunday, the app will tell me I have a streak of 7 days. In reality I just did it a single day so my streak should be 1. (Beginning and ending a streak with skipped days doesn't make sense)
    2. If in January I did a daily habit 7 days in a row, that is a streak of 7. If then in February I do the habit once on monday, once on sunday and skip everything in between, the app will also reward me a streak of 7, even though the one in february I barely did the habit. They shouldn't be equal. (Skipped days shouldn't be counted as successful days in streak).
    3. Something both implementations get right is that if you skip a couple of days between successful repetitions, this shouldn't end your streak. (Failing only occurs on a day when that was possible, not skipped and not implicitly checked day with missing repetition)

    Score

    1. Today in the app skipping 67 days in a row gives you 100% score as if you mastered the habit even though you didn't do a single repetition. (Skipping days shouldn't be rewarding, it should be neutral)
    2. If I have been doing a daily habit successfully for a month (e.g. workout every day) and then have an injury that makes it impossible to continue doing the habit for another month. You shouldn't get rewarded for this month of injury when you weren't working out, but you shouldn't also get penalized for it by losing all your progress. In terms of that habit your score should be frozen until you can do the habit again and you can keep tracking it. The same applies for a work habit that is invalid on weekends, you shouldn't get rewarded or penalized for skipping it during the weekend or during a vacation. (Skipping days shouldn't penalize you because the habit was not possible to complete).

    This PR implements fixes for those problems:

    1. Skip days don't break streaks but are also excluded from the number of successful days you were in a streak to give more days when doing the habit, instead of just skipping it.
    2. Skip days don't change the score for the current day and just freeze the score from the previous one.
    opened by KristianTashkov 37
  • Create a landing page for the project

    Create a landing page for the project

    Our domain loophabits.org currently shows a blank screen. It would be nice to have a simple landing page for the app, containing some descriptions, screenshots and links to Google Play / Github. The descriptions can be copied from the Google Play page. A high resolution version of the screenshots is available in our repository.

    Since I am hosting this on GitHub Pages, it has to be a static website.

    new-feature 
    opened by iSoron 28
  • Export issues (app choice dialog, files not appearing on MTP, error message, characters have to be supported by the filesystem)

    Export issues (app choice dialog, files not appearing on MTP, error message, characters have to be supported by the filesystem)

    When exporting, it makes me select an app. Today one is "e-mail", and the other is "Termux" (a terminal). I chose Termux, and export failed.

    I just want a quick way to copy it to my PC without any MitM. Exporting a single file to the internal storage available via MTP would be best (it is supposed to encrypted, unlike the SD card, and MTP via jmtpfs+Vifm takes multiple seconds per file).

    opened by aleksejrs 25
  • Failure when exporting

    Failure when exporting

    Pre-submission checklist

    • [x] I am submitting a bug report, not a feature request.
    • [x] I have searched for similar issues, but did not find any matches.

    Description

    When I install the app the first time and go to settings and click on export as csv or full save, I cant click anywhere, my phone gets black and the app crashes.

    Steps to reproduce

      1. Click on settings
      1. Go to database section
      1. Click on export as csv

    System information

    • Phone: Xiaomi Redmi Note 8 pro
    • Phone Operating System: Android 11
    • App version: 2.0.3
    bug cant-reproduce 
    opened by BenHerbst 23
  • History plot (calendar) confusing filling

    History plot (calendar) confusing filling

    First of all thank you for the amazing app! I've tried many and your app is the best for me! Amazing work!

    For me the most important feature is the calendar view - I need to see 1-3 months in the past so that I'm really pushed to not break my habbit. This works almost great - I have just one problem:

    I have a habbit that I want to do 3x a week - but every week it is 3 different days... The visualization somehow tries to "guess" the schedule, but since it is irregular I end up with a confusing plot:

    screenshot_2016-06-10-13-52-44

    My proposal would be:

    1. simple: add an option to disable the automatic filling of days (so that only days where the user does tick the habit are colored, nothing else).
    2. bit harder: add "full week" coloring: simply for each finished week in the past, check if the target was filled (e.g. in my case 3x the given week) and if yes, fill all the unfilled days in that week (signifying that the week was successful).

    Thank you very much. I can say that the calendar widget occupies 1/2 of my home screen :) - it is a strong motivation and a great product!

    small-enhancement 
    opened by rsuhada 21
  • Release/2.1.0

    Release/2.1.0

    This is the release branch for Loop Habit Tracker 2.1.0. To recall:

    Release branches support preparation of a new production release. They allow for last-minute dotting of i’s and crossing t’s. Furthermore, they allow for minor bug fixes and preparing meta-data for a release (version number, build dates, etc.). https://nvie.com/posts/a-successful-git-branching-model/

    Please test and let me know if you spot any bugs or issues. Any other feedback is also welcome.

    Blockers:

    • [x] #1234
    • [x] #1370
    • [x] "Enter" notification button does not work on API 31
    • [x] #1488
    • [x] #1425 (broken for numerical habits)

    Minor tasks:

    • [x] Write CHANGELOG
    • [x] Write Google Play / F-Droid release notes
    • [x] Download translations from Crowdin
    • [x] Update list of developers
    • [x] Update list of translators
    opened by iSoron 20
  • ticking off reminder doesn't tick off in app

    ticking off reminder doesn't tick off in app

    (Android 5.1, no google play services) When I tick off that I did stuff at the reminder and then open the app it says stuff still has to be done.

    Thanks!

    bug confirmed 
    opened by hoschi-it 20
  • The widget stopped presenting the progress in One UI 3

    The widget stopped presenting the progress in One UI 3

    Hey, First, thanks for a great app! I have been using it for 4 years now and it's amazing!

    As for the bug, I've updated my Android One UI to the 3rd version and I stopped seeing the circle with the progress on while using the widget.

    Is this a known issue?

    cant-reproduce 
    opened by giladraf 18
  • Add option to set default value for habits on unknown days

    Add option to set default value for habits on unknown days

    Implements: https://github.com/iSoron/uhabits/discussions/125 image image

    This change propagates to a lot of places so list of things: Implemented

    1. History card can have a default square depending on the default value
    2. Scores can now start from values above 0.
    3. Main screen can start with completed habits, but they are not filtered unless you specifically enter the value.

    Things to do left

    • [ ] Happy to get guidance of the order of numerical EditHabit dialog and the titles for the new value to make it prettier
    • [ ] Score is mostly consistent, but score chart starts from the first repetition. Do we want to change that?
    • [ ] Streaks are not calculated for default value YES. Are we okay with them being calculated from the first "actual" occurence?
    • [ ] Frequency/History/Total in the habit page is inconsistent with these default values too
    • [x] ~I expect some tests to crash, but I prefer some guidance on the above before I continue~
    • [ ] We probably need to add a lot of new tests to cover this functionality as well

    @iSoron Waiting on some guidance for all of this before I continue cause it's a lot and don't want to spend more effort if you don't like where this is going.

    opened by KristianTashkov 17
  • Fail to import the full backup

    Fail to import the full backup

    Pre-submission checklist

    • [x] I am submitting a bug report, not a feature request.
    • [x] I have searched for similar issues, but did not find any matches.

    Description

    I have generated a full backup from my older phone. But when I'm trying to import it from my new phone, I have a fail message and no import.

    Steps to reproduce

    1. Go to Settings in old phone
    2. Click on Export full backup
    3. Save file in a cloud
    4. Go to setting in new phone
    5. Click on import
    6. Choose file in the cloud
    7. See error message

    System information

    NEW PHONE

    • Phone: OnePlus Nord
    • Phone Operating System: OxygenOS 11.1.1.3
    • App version: 2.0.2

    OLD PHONE

    • Phone: OnePlus 6T
    • Phone Operating System: OxygenOS 10.3.11
    • App version: 1.8.12
    bug cant-reproduce high-severity 
    opened by DelphineM 15
  • Streaks calculating incorrectly

    Streaks calculating incorrectly

    Pre-submission checklist

    • [y ] I am submitting a bug report, not a feature request.
    • [ y] I have searched for similar issues, but did not find any matches.

    Description

    A clear and concise description of what the problem is.

    The current behaviour for streak calculation appears to be that if the previous x days meet the frequency requirement (e.g. for 2/7, if there are 2 successes in the past 7 days) , then all those previous x days are marked as a streak. However, some of those previous x days may not pass this same test, and should actually cause broken streaks...

    See screenshot for clarity. The screenshot is of a 2/7 frequency. It shows a long streak, however I have clearly not achieved a frequency of 2 successes EVERY 7 days. The success rate is actually 1/6, or 2/12. E.g. when the habit wasn't completed on the 29th, 30th, 31st, 1st, and 2nd, these days were originally a x and a broken streak. However when the habit was completed on the 3rd, all these days got overwritten to hollow ticks / a streak.

    Screenshot_20220707-203708

    I believe the fix is to change streak determination (or hollow ticks) to a per day basis. E.g. each day should do the 'previous x days check'. This should not be overridden by the result of 'previous x days check' of future days.

    Steps to reproduce: see screenshot for 2/7 frequency habit

    System information

    • Phone: [Google pixel 5]
    • Phone Operating System: [Android 12]
    • App version: [2.0.3]

    Screenshots

    If applicable, add screenshots to help explain your problem.

    opened by Randomname876 14
  • Stacked Checklist on Android 13 Not Checking Habits Off

    Stacked Checklist on Android 13 Not Checking Habits Off

    Pre-submission checklist

    • [ x] I am submitting a bug report, not a feature request.
    • [x ] I have searched for similar issues, but did not find any matches. -

    Nothing open. Found an old one marked as closed, but issue is not resolved.

    Description

    When using the stacked checklist widget, it will not actually check things off. Nothing happens when you hit the button to check off. Only happens in when habits are stacked. If they are single habits it will work fine.

    Steps to reproduce

    1. Have a checklist widget added and select multiple habits to create a stacked checklist
    2. When you try to check off a habit, Nothing happens

    System information

    • Phone: Samsung S22
    • Phone Operating System: Android 13
    • App version: 2.0.3

    Screenshots

    Screenshot_20230101_180056_One UI Home

    opened by sstewart122 0
  • Bump kotlin-stdlib from 1.7.21 to 1.8.0

    Bump kotlin-stdlib from 1.7.21 to 1.8.0

    Bumps kotlin-stdlib from 1.7.21 to 1.8.0.

    Release notes

    Sourced from kotlin-stdlib's releases.

    Kotlin 1.8.0

    Changelog

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend

    ... (truncated)

    Changelog

    Sourced from kotlin-stdlib's changelog.

    1.8.0

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend
    • KT-55065 Kotlin Gradle DSL: Reflection cannot find class data for lambda, produced by JVM IR backend

    ... (truncated)

    Commits
    • da1a843 Add ChangeLog for 1.8.0-RC2
    • d325cf8 Call additional publishToMavenLocal in maven build scripts and enable info
    • 0403d70 Don't leave Gradle daemons after build scripts
    • 52b225d Fix task module-name is not propagated to compiler arguments
    • d40ebc3 Specify versions-maven-plugin version explicitly
    • 2e829ed Fix version parsing crash on Gradle rich version string
    • f603c0e Scripting, IR: fix capturing of implicit receiver
    • 06cbf8f Scripting, tests: enable custom script tests with IR
    • d61cef0 Fix deserialization exception for DNN types from Java
    • ea33e72 JVM IR: script is a valid container for local delegated properties
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump logback-classic from 1.4.4 to 1.4.5

    Bump logback-classic from 1.4.4 to 1.4.5

    Bumps logback-classic from 1.4.4 to 1.4.5.

    Commits
    • 34a6efc preparfe release 1.4.5
    • 0d3ac63 fix LOGBACK-1698, [Nested appenders are not allowed] warning using SiftingApp...
    • a64b8d4 make jakarta.servlet-api as both provided and optional
    • 114b3de bump slf4j version
    • 1df6662 fix LOGBACK-1706
    • ea165fb fix LOGBACK-1703
    • 9e07bd0 fix LOGBACK-1703
    • a871e9f minor edits in README.md
    • 7dc0ce5 Merge pull request #605 from Zardoz89/patch-1
    • 7130dfe README.md MUST inform about Java & Jackarta EE support
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump espressoVersion from 3.4.0 to 3.5.0

    Bump espressoVersion from 3.4.0 to 3.5.0

    Bumps espressoVersion from 3.4.0 to 3.5.0. Updates espresso-contrib from 3.4.0 to 3.5.0

    Updates espresso-core from 3.4.0 to 3.5.0

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump kotlinVersion from 1.7.21 to 1.8.0

    Bump kotlinVersion from 1.7.21 to 1.8.0

    Bumps kotlinVersion from 1.7.21 to 1.8.0. Updates org.jetbrains.kotlin.android from 1.7.21 to 1.8.0

    Updates org.jetbrains.kotlin.kapt from 1.7.21 to 1.8.0

    Updates org.jetbrains.kotlin.android.extensions from 1.7.21 to 1.8.0

    Updates org.jetbrains.kotlin.multiplatform from 1.7.21 to 1.8.0

    Updates kotlin-stdlib-jdk8 from 1.7.21 to 1.8.0

    Release notes

    Sourced from kotlin-stdlib-jdk8's releases.

    Kotlin 1.8.0

    Changelog

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend

    ... (truncated)

    Changelog

    Sourced from kotlin-stdlib-jdk8's changelog.

    1.8.0

    Analysis API

    • KT-50255 Analysis API: Implement standalone mode for the Analysis API

    Analysis API. FIR

    • KT-54292 Symbol Light classes: implement PsiVariable.computeConstantValue for light field
    • KT-54293 Analysis API: fix constructor symbol creation when its accessed via type alias

    Android

    • KT-53342 TCS: New AndroidSourceSet layout for multiplatform
    • KT-53013 Increase AGP compile version in KGP to 4.1.3
    • KT-54013 Report error when using deprecated Kotlin Android Extensions compiler plugin
    • KT-53709 MPP, Android SSL2: Conflicting warnings for androidTest/kotlin source set folder

    Backend. Native. Debug

    • KT-53561 Invalid LLVM module: "inlinable function call in a function with debug info must have a !dbg location"

    Compiler

    New Features

    • KT-52817 Add @JvmSerializableLambda annotation to keep old behavior of non-invokedynamic lambdas
    • KT-54460 Implementation of non-local break and continue
    • KT-53916 Support Xcode 14 and new Objective-C frameworks in Kotlin/Native compiler
    • KT-32208 Generate method annotations into bytecode for suspend lambdas (on invokeSuspend)
    • KT-53438 Introduce a way to get SourceDebugExtension attribute value via JVMTI for profiler and coverage

    Performance Improvements

    • KT-53347 Get rid of excess allocations in parser
    • KT-53689 JVM: Optimize equality on class literals
    • KT-53119 Improve String Concatenation Lowering

    Fixes

    • KT-53465 Unnecessary checkcast to array of reified type is not optimized since Kotlin 1.6.20
    • KT-49658 NI: False negative TYPE_MISMATCH on nullable type with when
    • KT-48162 NON_VARARG_SPREAD isn't reported on *toTypedArray() call
    • KT-43493 NI: False negative: no compilation error "Operator '==' cannot be applied to 'Long' and 'Int'" is reported in builder inference lambdas
    • KT-54393 Change in behavior from 1.7.10 to 1.7.20 for java field override.
    • KT-55357 IllegalStateException when reading a class that delegates to a Java class with a definitely-not-null type with a flexible upper bound
    • KT-55068 Kotlin Gradle DSL: No mapping for symbol: VALUE_PARAMETER SCRIPT_IMPLICIT_RECEIVER on JVM IR backend
    • KT-51284 SAM conversion doesn't work if method has context receivers
    • KT-48532 Remove old JVM backend
    • KT-55065 Kotlin Gradle DSL: Reflection cannot find class data for lambda, produced by JVM IR backend

    ... (truncated)

    Commits
    • da1a843 Add ChangeLog for 1.8.0-RC2
    • d325cf8 Call additional publishToMavenLocal in maven build scripts and enable info
    • 0403d70 Don't leave Gradle daemons after build scripts
    • 52b225d Fix task module-name is not propagated to compiler arguments
    • d40ebc3 Specify versions-maven-plugin version explicitly
    • 2e829ed Fix version parsing crash on Gradle rich version string
    • f603c0e Scripting, IR: fix capturing of implicit receiver
    • 06cbf8f Scripting, tests: enable custom script tests with IR
    • d61cef0 Fix deserialization exception for DNN types from Java
    • ea33e72 JVM IR: script is a valid container for local delegated properties
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • it shouldnt ask in a notification if the info has already being submited

    it shouldnt ask in a notification if the info has already being submited

    Pre-submission checklist

    • [x] I am submitting a bug report, not a feature request.
    • [x] I have searched for similar issues, but did not find any matches.

    Description

    Even if the info is already entered, the notification with the reminder asking you will pop up at the designed time

    Steps to reproduce

    • Create a habit where you have to enter a number and add a notification with a date
    • fill it for the day manually in the app
    • time for the notification will come and ask for it again
    opened by voidplayer 3
Releases(v2.1.1)
  • v2.1.1(Sep 25, 2022)

  • v2.1.0(Sep 10, 2022)

    Added

    • Allow user to add notes to specific dates (@vbh, #1103)
    • Allow user to track "at most" numerical habits (@KristianTashkov, #1101)
    • Allow user to add skips to measurable habits (@kalina559, #1319)
    • Bring back custom frequencies (x times in y days) (@hiqua, #1079)
    • Improve number picker (@hiqua, @iSoron, #1082, #1370)
    • Add new checkmark and number picker (@iSoron, #1370)
    • Allow user to import numerical habits from HabitBull (@hiqua, #1278)
    • Add support for Android 13 themed icons (@cheeeeer, #1497)

    Removed

    • Hide snooze button on Android 12 notifications (@hiqua, #1226)
    • Remove preference to set LED lights (@iSoron)

    Changed

    • Hide failed habits along with completed ones (@hiqua, #1052)
    • Cycle through all checkmark states when toggling (@iSoron)
    • Add delay after toggling a habit (@hiqua, @kalina559, #1147)
    • Small theme improvements (@KristianTashkov, #1113)
    • Left-align habit notes (@iSoron)
    • Increase target SDK to 31 (@hiqua)

    Fixed

    • Fix small dialog buttons (@kalina559, #1096)
    • Fix invalid CSV files (@hiqua, #1177)
    • Fix small issues in calendar chart (@kalina559, #1314)
    • Resort habit list after edit (@hiqua, #1350)
    • Fix marker scaling in frequency display (@eduebernal, #1425)

    Refactoring & Testing

    • Replace raster icons by vector assets (@kalina559)
    • Remove JVM dependencies from uhabits-core module (@sgallese)
    • Add various missing tests (@sgallese)
    • Upgrade project dependencies (@hiqua, @sgallese)
    Source code(tar.gz)
    Source code(zip)
    loop-2.1.0-debug.apk(12.39 MB)
    loop-2.1.0-release.apk(5.10 MB)
  • v2.0.3(Aug 21, 2021)

  • v2.0.2(May 23, 2021)

    Changed

    • Make checkmark widget resizable

    Fixed

    • Fix crash caused by numerical habits with zero target (@iSoron, #903)
    • Fix small issues with font size (@iSoron)
    • Allow fractional target values (@sumanabhi, #911)
    • Fix IllegalStateException in androidx.customview.view (@iSoron, #906)
    • Fix crash when selecting habit frequency in some languages (@iSoron, #926)
    • Fix IllegalArgumentException in RingView (@iSoron, #904)
    Source code(tar.gz)
    Source code(zip)
    loop-2.0.2-debug.apk(11.54 MB)
    loop-2.0.2-release.apk(5.02 MB)
  • v2.0.1(May 9, 2021)

    Added

    • Make midnight delay optional and disabled by default (@hiqua)
    • Add arrows to sort menu (@iSoron)

    Removed

    • Temporarily remove experimental device sync functionality. This feature will be re-added in Loop 2.1.

    Changed

    • Make implicit checkmarks easier to read (@iSoron)
    • Update and improve list of translators (@hiqua, @iSoron)

    Fixed

    • Disable transparency for stacked widgets (@hiqua)
    • Fix various color issues on the dark theme (@hiqua, @iSoron)
    • Fix "customize notifications" on older devices (@hiqua)
    • Fix snooze button in notifications when device is locked (@hiqua)
    • Fix a crash when deleting habits (@engineering4good)
    • Fix checkmark widget not rendering properly on some Samsung phones (@iSoron)

    Refactoring & Testing

    • Finish conversion of the entire project to Kotlin (@hiqua, @iSoron, @MarKco)
    • Automatically run large tests on GitHub Actions (@iSoron)
    • Remove unused v21 resources (@hiqua)
    Source code(tar.gz)
    Source code(zip)
    loop-2.0.1-debug.apk(11.52 MB)
    loop-2.0.1-release.apk(5.00 MB)
  • v1.8.12(Jan 31, 2021)

  • v1.8.11(Dec 30, 2020)

  • v2.0.0-alpha(Nov 29, 2020)

    • WARNING: This is an unstable alpha release, made for testing purposes only. It has received minimal testing, and is not suitable for regular daily usage. Be warned that it may contains serious bugs that could completely destroy or silently corrupt your data. Before upgrading to this alpha release, please create a full database backup. You will not be able to downgrade to a stable version unless you uninstall the app first, losing your data in the process.

    • F-Droid maintainers, please do not make this version available on F-Droid.

    Major new features

    • Sync across devices (#104, @iSoron)
    • Track numerical habits (#42, @iSoron, @namnl)
    • Show question marks for missing data (#96, @iSoron)
    • Skip days without breaking streak (#88, @KristianTashkov)
    • Add notes to habits (#56, @recheej)
    • Delay start of a new day until 3am (#621, @KristianTashkov)

    Small enhancements to existing features

    • Export backups daily (#178, @iSoron)
    • Sort habits by status (#660, @hiqua)
    • Sort habits in reverse order (#497, @iSoron)

    Bug fixes

    • Improve readibility of charts (#460, @chennemann)
    • Reset chart offset when switching scale (#596, @alxmjo)
    • Don't show reminders from archived habits (@KristianTashkov)
    • Lapses on non-daily habits decrease the score too much (#641, @iSoron)
    • Update widgets at midnight (#634, @KristianTashkov)
    • Fixes to dark theme (#655, @Sunxy88)

    Refactoring

    • Convert files to Kotlin (#519, @olegivo)
    • Migrate to AndroidX (#544, @olegivo)
    Source code(tar.gz)
    Source code(zip)
    loop-2.0.0-alpha-debug.apk(10.43 MB)
  • v1.8.9(Nov 18, 2020)

  • v1.8.8(Jun 24, 2020)

  • v1.8.7(Jun 15, 2020)

    • New bar chart showing number of repetitions performed in each week, month, quarter or year.
    • Improved calculation of streaks for non-daily habits: performing habits on irregular weekdays will no longer break your streak.
    • Many more colors to choose from (now 20 in total).
    • Ability to customize how transparent the widgets are on your home screen.
    • Ability to customize the first day of the week.
    • Yes/No buttons on notifications, instead of just "Check".
    • Automatic dark theme according to phone settings (Android 10).
    • Smaller APK and backup files.
    • Many other internal code changes improving performance and stability.
    Source code(tar.gz)
    Source code(zip)
    loop-1.8.7.apk(3.37 MB)
  • v1.7.11(Dec 30, 2019)

  • v1.7.9(Apr 21, 2018)

  • v1.7.8(Sep 30, 2017)

  • v1.7.6(Jul 19, 2017)

  • v1.7.5(Jun 10, 2017)

  • v1.7.2(May 28, 2017)

  • v1.7.1(May 21, 2017)

  • v1.7.0(Apr 9, 2017)

  • v1.6.2(Oct 13, 2016)

  • v1.6.1(Oct 10, 2016)

  • v1.6.0(Oct 10, 2016)

    • Add option to make notifications sticky
    • Add option to hide completed habits
    • Display total number of repetitions for each habit
    • Pebble integration: check/snooze habits from the watch
    • Tasker/Locale integration: allow third-party apps to add checkmarks
    • Export a unified CSV file, with checkmarks for all the habits
    • Increase width of name column according to screen size
    • Stop showing reminders for archived habits
    • Add Danish, Dutch, Greek, Hindi and Portuguese (European) translations
    • Other minor fixes and enhancements
    Source code(tar.gz)
    Source code(zip)
    loop-1.6.0.apk(3.41 MB)
  • v1.5.6(Jun 19, 2016)

  • v1.5.5(Jun 19, 2016)

  • v1.5.4(May 29, 2016)

  • v1.5.3(May 22, 2016)

  • v1.5.2(May 19, 2016)

  • v1.5.1(May 17, 2016)

  • v1.5.0(May 15, 2016)

    • Add night mode, with AMOLED support
    • Backport material design to older devices
    • Display more information on statistics screen
    • Display score on main screen and checkmark widget
    • Make widgets react immediately to touch
    • Reschedule reminders after reboot
    • Pick first day of the week according to country
    • Add option to reverse order of days on main screen
    • Add option to change notification sounds
    • Add Catalan, Indonesian, Turkish, Ukrainian translations
    • Switch between Simplified/Traditional Chinese according to country
    Source code(tar.gz)
    Source code(zip)
    loop-1.5.0.apk(2.53 MB)
Owner
Alinson S. Xavier
Alinson S. Xavier
🚧 A fully open-source project for creating and maintaining a Kotlin-based Minecraft: Java Edition server.

Hexalite: Java Edition ⚠️ WARNING: The Hexalite Network is a work in progress. It is not yet ready for production. You may encounter bugs and other is

Hexalite Network 38 Nov 28, 2022
Alkatraz is an app that helps you to Reach your goals by managing your Habits .

Alkatraz - Build healthy habits for healthy life Alkatraz is an app that helps you to Reach your goals by managing your Habits . It's makes your life

Nishant Kumar 11 Nov 28, 2022
Nab-challenge - Take home challenge from NAB in partnership with Positive Thinking Company

nab-challenge Take home challenge from NAB in partnership with Positive Thinking

Hieu Vu 0 Dec 30, 2021
A Task Management and Habit-building App, representating my journey in Android as well as my first Kotlin App. 🤗 ✨

A Task Management and Habit-building App, representating my journey in Android as well as my first Kotlin App. ?? ✨

Sarthak Musmade 8 May 8, 2022
A simple Pokedex App getting API with Retrofit, maintaining data using LiveData, and Material Design based on MVVM architecture

PokedexApp Pokedex A simple Pokedex App getting API with Retrofit, maintaining data using LiveData, and Material Design based on MVVM architecture. Te

Steven Adriano 0 Apr 12, 2022
A simple and minimal app to track how long you've been sober from anything you want.

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", wh

Katherine Rose 26 Nov 21, 2022
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
Water tracker app helps you with daily reminder to drink water. This app is just a trial to test and improve my android development skills.

?? About Me I am a self-thaught developer learning web and android development. This app is just a trial to test and improve my android development sk

Sinan Sonmez (Chaush) 28 Dec 17, 2022
Episodie is a TV show time tracker app with unusual design written in kotlin and clean architecture approach. Get to know how much time you spent watching tv shows.

Episodie Episodie is a TV show time tracker app with unusual design. Get to know how much time you spent watching tv shows. Track easily overall progr

Przemek 126 Dec 7, 2022
Open Source Magic: The Gathering life tracker and companion app

SpellCounter SpellCounter is a free, open source Magic: The Gathering life and counter tracking app Features 100% free with no ads Supports up to 8 pl

Sean Kenkeremath 3 Jul 27, 2022
NimTome is a Free and open-source spell tracker application for Dungeons and Dragons

Nimtome: An open source application to manage all your spells in D&D About This project came to life as a homework assignment, but it became a lot bit

null 2 Jan 11, 2022
Open source Crypto Currency Tracker Android App made fully in Kotlin

CoinBit CoinBit is a beautiful CryptoCurrency app, completely open sourced and 100% in kotlin. It supports following features Track prices of over 300

Pranay Airan 50 Dec 5, 2022
A Simple Expense Tracker App 📱 built to demonstrate the use of modern android architecture component with MVVM Architecture

Expenso ?? A Simple Expense Tracker App ?? built to demonstrate the use of modern android architecture component with MVVM Architecture ?? . Made with

Michel Horacio 1 Dec 28, 2022
Room : Sleep Quality Tracker app

Room - SleepQualityTracker app This is the toy app for Lesson 6 of the Android App Development in Kotlin course on Udacity. SleepQualityTracker The Sl

Martin 0 Dec 8, 2021
The Sleep tracker app for lesson 6 of the Udacity: Developing Android Apps with Kotlin Course

App Architecture-Presistence This is the Sleep tracker app for lesson 6 of the U

null 0 Dec 28, 2021
A productivity tracker app published on Google Play

producktivity-tracker A productivity tracker app published on Google Play. Includes Google AdMob and in-app-purchases to disable ads. This project was

null 1 Mar 9, 2022
DNS over HTTPS / DNS over Tor / DNSCrypt client, firewall, and connection tracker for Android.

RethinkDNS + Firewall for Android An OpenSnitch-inspired firewall and network monitor + a pi-hole-inspired DNS over HTTPS client with blocklists. In o

null 1.1k Jan 5, 2023
Google map location tracker uploading current to realtime database and displaying location information from firebase realtime.

WEEK-8-SQ009-ANDROID LOCATION - GROUP WORK (2) Problem Description Track your partner(s). Implementation 1: You are to build a map application to show

null 0 Mar 16, 2022
Self hosted read and to-read list book tracker

JELU Official documentation Like Jelu or find it useful ? Offer me a coffee ☕ Purpose This app main purpose is to track what you have read, what you a

null 181 Dec 28, 2022