Repository: Crazy-Marvin/ToDont
Branch: development
Commit: 4a35a8759f14
Files: 539
Total size: 64.1 MB
Directory structure:
gitextract_f40de0sl/
├── .devcontainer/
│ └── devcontainer.json
├── .github/
│ ├── CODEOWNERS
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── SECURITY.md
│ ├── SUPPORT.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── build.yml
│ ├── ci.yml
│ ├── codacy-analysis.yml
│ ├── codeql-analysis.yml
│ └── windows.yml
├── .gitignore
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── rocks/
│ │ └── poopjournal/
│ │ └── todont/
│ │ └── ExampleInstrumentedTest.kt
│ ├── debug/
│ │ └── res/
│ │ ├── drawable/
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── drawable-v24/
│ │ │ └── ic_launcher_background.xml
│ │ └── mipmap-anydpi-v26/
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ └── main/
│ ├── AndroidManifest.xml
│ ├── java/
│ │ └── rocks/
│ │ └── poopjournal/
│ │ └── todont/
│ │ ├── About.kt
│ │ ├── Helper.kt
│ │ ├── LabelsActivity.kt
│ │ ├── MainActivity.kt
│ │ ├── MyApp.kt
│ │ ├── NotificationReceiver.kt
│ │ ├── OnBoardingActivity.kt
│ │ ├── Settings.kt
│ │ ├── SplashScreenActivity.kt
│ │ ├── adapters/
│ │ │ ├── AvoidedOrDoneAdapter.kt
│ │ │ ├── AvoidedOrDoneLogAdapter.kt
│ │ │ ├── HabitsAdapter.kt
│ │ │ ├── HabitsLogAdapter.kt
│ │ │ └── LabelsAdapter.kt
│ │ ├── fragments/
│ │ │ ├── AvoidedOrDoneFragment.kt
│ │ │ ├── AvoidedOrDoneLogFragment.kt
│ │ │ ├── DailyFragment.kt
│ │ │ ├── FragmentLog.kt
│ │ │ ├── FragmentToday.kt
│ │ │ ├── HabitsFragment.kt
│ │ │ ├── HabitsLogFragment.kt
│ │ │ ├── MonthlyFragment.kt
│ │ │ ├── WeeklyFragment.kt
│ │ │ ├── YearlyFragment.kt
│ │ │ └── menuFragment.kt
│ │ ├── model/
│ │ │ ├── Alarm.kt
│ │ │ ├── Habit.kt
│ │ │ ├── HabitRecord.kt
│ │ │ └── Label.kt
│ │ ├── showcaseview/
│ │ │ ├── RippleBackground.kt
│ │ │ └── ShowcaseViewBuilder.kt
│ │ ├── utils/
│ │ │ ├── Constants.kt
│ │ │ ├── DatabaseUtils.kt
│ │ │ ├── HabitsBottomSheetDialog.kt
│ │ │ ├── NotificationActionReceiver.kt
│ │ │ ├── NotificationReceiver.kt
│ │ │ ├── SharedPrefUtils.kt
│ │ │ └── Utils.kt
│ │ └── widgets/
│ │ ├── MyAppNoButtonsWidgetProvider.kt
│ │ ├── MyAppSmallWidgetProvider.kt
│ │ ├── NobuttonsWidgetService.kt
│ │ └── WidgetService.kt
│ ├── res/
│ │ ├── anim/
│ │ │ ├── fade_in.xml
│ │ │ └── fade_out.xml
│ │ ├── drawable/
│ │ │ ├── _cross.xml
│ │ │ ├── _tick.xml
│ │ │ ├── about.xml
│ │ │ ├── backgorundinner.xml
│ │ │ ├── bell.xml
│ │ │ ├── bottom_nav_color.xml
│ │ │ ├── bottom_sheet.xml
│ │ │ ├── continuebutton2.xml
│ │ │ ├── continuebuttontrans.xml
│ │ │ ├── dis.xml
│ │ │ ├── email.xml
│ │ │ ├── fix_cross.xml
│ │ │ ├── fix_fab.xml
│ │ │ ├── fix_rounded_rectangle.xml
│ │ │ ├── fix_tick.xml
│ │ │ ├── frame__4_.xml
│ │ │ ├── frame__5_.xml
│ │ │ ├── frame__6_.xml
│ │ │ ├── git.xml
│ │ │ ├── grad_tab_back.xml
│ │ │ ├── grad_window_backgrond.xml
│ │ │ ├── gradient_background.xml
│ │ │ ├── gradient_fab.xml
│ │ │ ├── habitlogcheck.xml
│ │ │ ├── ic_about.xml
│ │ │ ├── ic_add.xml
│ │ │ ├── ic_appearance.xml
│ │ │ ├── ic_avoided.xml
│ │ │ ├── ic_back.xml
│ │ │ ├── ic_backarrow.xml
│ │ │ ├── ic_backarrowpressed.xml
│ │ │ ├── ic_background.xml
│ │ │ ├── ic_cross.xml
│ │ │ ├── ic_delete.xml
│ │ │ ├── ic_done.xml
│ │ │ ├── ic_downarrow.xml
│ │ │ ├── ic_facebook.xml
│ │ │ ├── ic_foreground.xml
│ │ │ ├── ic_habitscircle.xml
│ │ │ ├── ic_label_light.xml
│ │ │ ├── ic_log.xml
│ │ │ ├── ic_menu.xml
│ │ │ ├── ic_monochrome.xml
│ │ │ ├── ic_nextarrow.xml
│ │ │ ├── ic_nextpressed.xml
│ │ │ ├── ic_sad.xml
│ │ │ ├── ic_spinner.xml
│ │ │ ├── ic_today.xml
│ │ │ ├── info.xml
│ │ │ ├── log_frag_selected.xml
│ │ │ ├── monitor.xml
│ │ │ ├── mygradient.xml
│ │ │ ├── mygradient1.xml
│ │ │ ├── myinnergradient.xml
│ │ │ ├── myinnergradientlog.xml
│ │ │ ├── myinnergradientlogs.xml
│ │ │ ├── notification_logo.xml
│ │ │ ├── onboard.xml
│ │ │ ├── reportproblem.xml
│ │ │ ├── roundbutton.xml
│ │ │ ├── rounded_button.xml
│ │ │ ├── rounded_corners.xml
│ │ │ ├── rounded_dialog_bg.xml
│ │ │ ├── selectedround.xml
│ │ │ ├── spinner_background.xml
│ │ │ ├── tabcolor.xml
│ │ │ ├── translate.xml
│ │ │ ├── trash.xml
│ │ │ ├── twitter.xml
│ │ │ └── viewsrc.xml
│ │ ├── layout/
│ │ │ ├── activity_about.xml
│ │ │ ├── activity_labels.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_on_boarding.xml
│ │ │ ├── activity_settings.xml
│ │ │ ├── activity_splash__screen.xml
│ │ │ ├── dialog_info.xml
│ │ │ ├── dialogbox.xml
│ │ │ ├── dialogbox_add_new_habit.xml
│ │ │ ├── dialogbox_labels.xml
│ │ │ ├── fragment_avoided.xml
│ │ │ ├── fragment_daily.xml
│ │ │ ├── fragment_done.xml
│ │ │ ├── fragment_habits.xml
│ │ │ ├── fragment_log2.xml
│ │ │ ├── fragment_log_habits.xml
│ │ │ ├── fragment_monthly.xml
│ │ │ ├── fragment_today2.xml
│ │ │ ├── fragment_weekly.xml
│ │ │ ├── fragment_yearly.xml
│ │ │ ├── initial_no_buttons_widget_view.xml
│ │ │ ├── initial_widget_view.xml
│ │ │ ├── labels_recyclerview_layout.xml
│ │ │ ├── layout_habit_bottom_sheet.xml
│ │ │ ├── menu_fragment.xml
│ │ │ ├── no_buttons_widget_preview.xml
│ │ │ ├── recyclerview_layout.xml
│ │ │ ├── recyclerview_layout_habits.xml
│ │ │ ├── recyclerview_layout_log_habits.xml
│ │ │ ├── widget_item.xml
│ │ │ ├── widget_item_no_buttons.xml
│ │ │ ├── widget_layout.xml
│ │ │ ├── widget_layout_no_buttons.xml
│ │ │ └── widget_preview.xml
│ │ ├── menu/
│ │ │ ├── navigation.xml
│ │ │ └── topmenu.xml
│ │ ├── resources.properties
│ │ ├── values/
│ │ │ ├── attrs.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimen.xml
│ │ │ ├── ids.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── values-ar/
│ │ │ └── strings.xml
│ │ ├── values-az/
│ │ │ └── strings.xml
│ │ ├── values-b+art/
│ │ │ └── strings.xml
│ │ ├── values-be/
│ │ │ └── strings.xml
│ │ ├── values-bg/
│ │ │ └── strings.xml
│ │ ├── values-bs/
│ │ │ └── strings.xml
│ │ ├── values-ca/
│ │ │ └── strings.xml
│ │ ├── values-cs/
│ │ │ └── strings.xml
│ │ ├── values-da/
│ │ │ └── strings.xml
│ │ ├── values-de/
│ │ │ └── strings.xml
│ │ ├── values-dum/
│ │ │ └── strings.xml
│ │ ├── values-el/
│ │ │ └── strings.xml
│ │ ├── values-eo/
│ │ │ └── strings.xml
│ │ ├── values-es/
│ │ │ └── strings.xml
│ │ ├── values-et/
│ │ │ └── strings.xml
│ │ ├── values-fa/
│ │ │ └── strings.xml
│ │ ├── values-fi/
│ │ │ └── strings.xml
│ │ ├── values-fil/
│ │ │ └── strings.xml
│ │ ├── values-fr/
│ │ │ └── strings.xml
│ │ ├── values-ga/
│ │ │ └── strings.xml
│ │ ├── values-he/
│ │ │ └── strings.xml
│ │ ├── values-hi/
│ │ │ └── strings.xml
│ │ ├── values-hr/
│ │ │ └── strings.xml
│ │ ├── values-hu/
│ │ │ └── strings.xml
│ │ ├── values-hy/
│ │ │ └── strings.xml
│ │ ├── values-ia/
│ │ │ └── strings.xml
│ │ ├── values-id/
│ │ │ └── strings.xml
│ │ ├── values-is/
│ │ │ └── strings.xml
│ │ ├── values-it/
│ │ │ └── strings.xml
│ │ ├── values-ja/
│ │ │ └── strings.xml
│ │ ├── values-ka/
│ │ │ └── strings.xml
│ │ ├── values-kk/
│ │ │ └── strings.xml
│ │ ├── values-ko/
│ │ │ └── strings.xml
│ │ ├── values-la/
│ │ │ └── strings.xml
│ │ ├── values-lb/
│ │ │ └── strings.xml
│ │ ├── values-lt/
│ │ │ └── strings.xml
│ │ ├── values-mk/
│ │ │ └── strings.xml
│ │ ├── values-ms/
│ │ │ └── strings.xml
│ │ ├── values-mt/
│ │ │ └── strings.xml
│ │ ├── values-nb-rNO/
│ │ │ └── strings.xml
│ │ ├── values-ne/
│ │ │ └── strings.xml
│ │ ├── values-night/
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── values-night-v35/
│ │ │ └── styles.xml
│ │ ├── values-nl/
│ │ │ └── strings.xml
│ │ ├── values-pl/
│ │ │ └── strings.xml
│ │ ├── values-pt/
│ │ │ └── strings.xml
│ │ ├── values-pt-rBR/
│ │ │ └── strings.xml
│ │ ├── values-ro/
│ │ │ └── strings.xml
│ │ ├── values-ru/
│ │ │ └── strings.xml
│ │ ├── values-sk/
│ │ │ └── strings.xml
│ │ ├── values-sl/
│ │ │ └── strings.xml
│ │ ├── values-sr/
│ │ │ └── strings.xml
│ │ ├── values-sv/
│ │ │ └── strings.xml
│ │ ├── values-ta/
│ │ │ └── strings.xml
│ │ ├── values-th/
│ │ │ └── strings.xml
│ │ ├── values-tl/
│ │ │ └── strings.xml
│ │ ├── values-tr/
│ │ │ └── strings.xml
│ │ ├── values-uk/
│ │ │ └── strings.xml
│ │ ├── values-ur/
│ │ │ └── strings.xml
│ │ ├── values-uz/
│ │ │ └── strings.xml
│ │ ├── values-v35/
│ │ │ └── styles.xml
│ │ ├── values-vi/
│ │ │ └── strings.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ ├── values-zh-rTW/
│ │ │ └── strings.xml
│ │ ├── xml/
│ │ │ ├── backup_rules.xml
│ │ │ ├── data_extraction_rules.xml
│ │ │ ├── locales_config.xml
│ │ │ ├── no_buttons_widget_info.xml
│ │ │ └── widget_info.xml
│ │ └── xml-v31/
│ │ ├── no_buttons_widget_info.xml
│ │ └── widget_info.xml
│ └── test/
│ └── java/
│ └── rocks/
│ └── poopjournal/
│ └── todont/
│ └── ExampleUnitTest.kt
├── build.gradle
├── fastlane/
│ └── metadata/
│ └── android/
│ ├── cs/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── de-DE/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ └── 2.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── en-US/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 300.txt
│ │ │ ├── 4.txt
│ │ │ ├── 400.txt
│ │ │ ├── 410.txt
│ │ │ ├── 420.txt
│ │ │ ├── 430.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ ├── title.txt
│ │ └── video.txt
│ ├── eo/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── es/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 30.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── fi/
│ │ └── changelogs/
│ │ └── 410.txt
│ ├── fr/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── ga/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 300.txt
│ │ │ ├── 4.txt
│ │ │ ├── 400.txt
│ │ │ ├── 410.txt
│ │ │ ├── 420.txt
│ │ │ ├── 430.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── he/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 3.txt
│ │ │ ├── 30.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── hy/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── id/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 3.txt
│ │ │ ├── 30.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── it/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ ├── 3.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── ko/
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── nb-NO/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ ├── 3.txt
│ │ │ └── 4.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── nl/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── pl-PL/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 3.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── pt/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ └── 7.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── pt-BR/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── ro/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── ru/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 300.txt
│ │ │ ├── 4.txt
│ │ │ ├── 400.txt
│ │ │ ├── 410.txt
│ │ │ ├── 420.txt
│ │ │ ├── 430.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── ta-IN/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 300.txt
│ │ │ ├── 4.txt
│ │ │ ├── 400.txt
│ │ │ ├── 410.txt
│ │ │ ├── 420.txt
│ │ │ ├── 430.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── tr/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 30.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── uk/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 3.txt
│ │ │ ├── 30.txt
│ │ │ ├── 4.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── ur/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 2.txt
│ │ │ └── 3.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ ├── zh-CN/
│ │ ├── changelogs/
│ │ │ ├── 1.txt
│ │ │ ├── 10.txt
│ │ │ ├── 2.txt
│ │ │ ├── 210.txt
│ │ │ ├── 3.txt
│ │ │ ├── 300.txt
│ │ │ ├── 4.txt
│ │ │ ├── 400.txt
│ │ │ ├── 410.txt
│ │ │ ├── 420.txt
│ │ │ ├── 430.txt
│ │ │ ├── 5.txt
│ │ │ ├── 6.txt
│ │ │ ├── 7.txt
│ │ │ ├── 8.txt
│ │ │ └── 9.txt
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ └── zh-TW/
│ ├── changelogs/
│ │ ├── 1.txt
│ │ ├── 10.txt
│ │ ├── 2.txt
│ │ ├── 3.txt
│ │ ├── 30.txt
│ │ ├── 4.txt
│ │ ├── 5.txt
│ │ ├── 6.txt
│ │ ├── 7.txt
│ │ └── 9.txt
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── sentry-wizard
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.195.0/containers/java
{
"name": "Java",
"build": {
"dockerfile": "Dockerfile",
"args": {
// Update the VARIANT arg to pick a Java version: 8, 11, 17
// Append -bullseye or -buster to pin to an OS version.
// Use the -bullseye variants on local arm64/Apple Silicon.
"VARIANT": "17-bullseye",
// Options
"INSTALL_MAVEN": "true",
"MAVEN_VERSION": "3.8.5",
"INSTALL_GRADLE": "false",
"NODE_VERSION": "lts/*"
}
},
// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Set *default* container specific settings.json values on container create.
"settings": {
"maven.executable.path": "/usr/local/sdkman/candidates/maven/current/bin/mvn"
},
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
"vscjava.vscode-java-pack"
]
}
},
// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],
// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "java -version",
// Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "vscode"
}
================================================
FILE: .github/CODEOWNERS
================================================
/app/ @arafaatqureshi
================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
Welcome to the To Don't community.
Within desired privacy, accept and grant criticism constructively.
Finding yourself unable to do so e-mail [marvin@poopjournal.rocks](mailto:marvin@poopjournal.rocks) answered by Crazy Marvin, the project maintainer.
================================================
FILE: .github/CONTRIBUTING.md
================================================
================================================
FILE: .github/FUNDING.yml
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
---
## :writing_hand: Describe the bug
## :bomb: Steps to reproduce
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
## :wrench: Expected behavior
## :camera: Screenshots
## :iphone: Tech info
- Device:
- OS:
- App Version:
## :page_facing_up: Additional context
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
---
## :warning: Is your feature request related to a problem? Please describe
## :bulb: Describe the solution you'd like
## :bar_chart: Describe alternatives you've considered
## :page_facing_up: Additional context
## :raising_hand: Do you want to develop this feature yourself?
- [ ] Yes
- [ ] No
================================================
FILE: .github/SECURITY.md
================================================
Please report (suspected) security vulnerabilities to [marvin@poopjournal.rocks](mailto:marvin@poopjournal.rocks). It would be great if you could prepare a patch too. Thanks!
================================================
FILE: .github/SUPPORT.md
================================================
Hi! 👋
We’re excited that you’re using **To Dont't** and we’d love to help.
To help us help you, please read through the following guidelines.
Please understand that people involved with this project often do so for fun,
next to their day job; you are not entitled to free customer service.
## Help us help you!
Spending time framing a question and adding support links or resources makes it
much easier for us to help.
It’s easy to fall into the trap of asking something too specific when you’re
close to a problem.
Then, those trying to help you out have to spend a lot of time asking additional
questions to understand what you are hoping to achieve.
Spending the extra time up front can help save everyone time in the long run.
* Try to define what you need help with:
* Is there something in particular you want to do?
* What problem are you encountering and what steps have you taken to try
and fix it?
* Is there a concept you’re not understanding?
* Learn about the [rubber duck debugging method](https://rubberduckdebugging.com/)
* Avoid falling for the [XY problem](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem/66378#66378)
* Search on GitHub to see if a similar question has been asked
* If possible, provide sample code, a [CodeSandbox](https://codesandbox.io/), or a video/GIF
* The more time you put into asking your question, the better we can help you
## Contributions
See [`contributing.md`](https://github.com/Crazy-Marvin/ToDont/blob/trunk/.github/CONTRIBUTING.md) on how to contribute. Quality PRs are really appreaciated!
================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "gradle" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "monthly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
================================================
FILE: .github/workflows/build.yml
================================================
name: Android Build
on: push
jobs:
build:
name: "Assemble artifacts"
runs-on: ubuntu-latest
steps:
# Checkout
- name: SCM
uses: actions/checkout@v6
- name: "Make gradlew executable"
run: chmod +x ./gradlew
# Assemble artifacts
- name: Assemble
uses: vgaidarji/android-github-actions-build@v1.0.1
with:
args: "./gradlew assemble"
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: "📥 Check-out"
uses: actions/checkout@v6
# - name: "🧪 Gradle Wrapper Validation"
# uses: gradle/wrapper-validation-action@v1
- name: "🧰 Install JDK"
uses: actions/setup-java@v5
with:
distribution: 'adopt'
java-version: 8
java-package: jdk
- name: "🧰 Setup Android SDK"
uses: android-actions/setup-android@v4
- name: "🦸 Make gradlew executable"
run: chmod +x ./gradlew
- name: "🏗 Build"
run: ./gradlew assembleDebug
- name: "🧪 Code coverage"
run: ./gradlew test
- name: "📤 Upload code coverage"
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: "🧪 Android LINT"
run: ./gradlew lint
- name: "🧪 Unit test"
run: ./gradlew test
================================================
FILE: .github/workflows/codacy-analysis.yml
================================================
# This workflow checks out code, performs a Codacy security scan
# and integrates the results with the
# GitHub Advanced Security code scanning feature. For more information on
# the Codacy security scan action usage and parameters, see
# https://github.com/codacy/codacy-analysis-cli-action.
# For more information on Codacy Analysis CLI in general, see
# https://github.com/codacy/codacy-analysis-cli.
name: Codacy Security Scan
on:
push:
branches: [ development, master, trunk ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ development ]
schedule:
- cron: '25 8 * * 3'
jobs:
codacy-security-scan:
name: Codacy Security Scan
runs-on: ubuntu-latest
steps:
# Checkout the repository to the GitHub Actions runner
- name: Checkout code
uses: actions/checkout@v6
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
- name: Run Codacy Analysis CLI
uses: codacy/codacy-analysis-cli-action@v4.4.7
with:
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
# You can also omit the token and run the tools that support default configurations
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
verbose: true
output: results.sarif
format: sarif
# Adjust severity of non-security issues
gh-code-scanning-compat: true
# Force 0 exit code to allow SARIF file generation
# This will handover control about PR rejection to the GitHub side
max-allowed-issues: 2147483647
# Upload the SARIF file generated in the previous step
- name: Upload SARIF results file
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: results.sarif
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"
on:
push:
branches: [development]
pull_request:
# The branches below must be a subset of the branches above
branches: [trunk]
schedule:
- cron: '0 9 * * 4'
jobs:
analyse:
name: Analyse
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
fetch-depth: 2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v4
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
================================================
FILE: .github/workflows/windows.yml
================================================
name: CI
on: push
jobs:
build:
runs-on: windows-latest
steps:
- name: "📥 Check-out"
uses: actions/checkout@v6
# - name: "🧪 Gradle Wrapper Validation"
# uses: gradle/wrapper-validation-action@v1
- name: "🧰 Install JDK"
uses: actions/setup-java@v5
with:
distribution: 'adopt'
java-version: 8
java-package: jdk
- name: "🧰 Setup Android SDK"
uses: android-actions/setup-android@v4
- name: "🦸 Make gradlew executable"
run: chmod +x ./gradlew
- name: "🏗 Build"
run: ./gradlew assembleDebug
- name: "🧪 Code coverage"
run: ./gradlew jacocoTestReport
- name: "📤 Upload code coverage"
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
yml: .codecov.yml
- name: "🧪 Android LINT"
run: ./gradlew lint
- name: "🧪 Unit test"
run: ./gradlew test
================================================
FILE: .gitignore
================================================
# Built application files
*.apk
*.aar
*.ap_
*.aab
app/release
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
.idea/gradle.xml
.idea/libraries
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries/
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
*.jks
*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# Android Profiling
*.hprof
*.dm
# Kotlin
.kotlin/sessions/
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.
================================================
FILE: README.md
================================================
[](https://github.com/Crazy-Marvin/ToDont/actions)
[](https://github.com/Crazy-Marvin/ToDont/blob/development/LICENSE)
[](https://www.figma.com/file/RoX4IQYdduFH1TxXV3fxla/To-Don%E2%80%99t?node-id=0%3A1)
[](https://github.com/Crazy-Marvin/ToDont/commits)
[](https://github.com/Crazy-Marvin/ToDont/releases)
[](https://github.com/Crazy-Marvin/ToDont/tags)
[](https://github.com/Crazy-Marvin/ToDont/issues)
[](https://github.com/Crazy-Marvin/ToDont/pulls)
[](https://app.codacy.com/gh/Crazy-Marvin/ToDont/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
[](https://hosted.weblate.org/engage/todont/)
[](https://sentry.com)
[](https://snyk.io/test/github/Crazy-Marvin/ToDont?targetFile=app%2Fbuild.gradle)
[](https://android-arsenal.com/api?level=19)
[](https://f-droid.org/en/packages/rocks.poopjournal.todont/)
[](https://play.google.com/store/apps/details?id=rocks.poopjournal.todont)
# To Don't
This libre software app keeps track of things you do __NOT__ want to do.
A good look at bad habits. Jot down your vices, right from the home page. Use notes to add details — like a healthy alternative to that chocolate bar you cannot resist. And organise your input with labels.
Faster than you can grab a pen. Find and cross out the bad habits you give into on the home page. These will move to "Done" for the day. The next morning fresh, with a full list of things to avoid.
Stay on top of your progress. The log grants insight into your overall success rates, pinpointing bad habits you have grown most attached to — over a week, a month, or a year. _Your better you can easily work toward an even better you_.
# Contributing
The ```development``` or a feature branch is used while developing the code, and pushed into the master branch ```trunk``` afterwards for releases.
PRs to the ```trunk``` need at least one approving review before getting merged.
Help translate the app at [Hosted Weblate](https://hosted.weblate.org/engage/todont/).
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
Check out the [contribution guidelines](https://github.com/Crazy-Marvin/ToDont/blob/trunk/.github/CONTRIBUTING.md) for details please.
# License
[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
plugins {
id 'com.android.application'
// id 'kotlin-android-extensions'
id 'org.jetbrains.kotlin.android'
id 'kotlin-android'
id 'kotlin-kapt'
id "io.sentry.android.gradle" version "6.3.0"
// id 'com.google.gms.google-services'
// id 'kotlin-parcelize'
}
android {
namespace 'rocks.poopjournal.todont'
compileSdk 36
defaultConfig {
applicationId "rocks.poopjournal.todont"
minSdkVersion 26
targetSdkVersion 36
versionCode 420
versionName "4.2.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
setProperty("archivesBaseName", "ToDont-$versionName")
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
buildFeatures {
buildConfig = true
dataBinding true
viewBinding true
// for view binding:
// viewBinding true
}
/*
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}*/
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.16.0'
implementation 'androidx.core:core:1.16.0' // Check for the latest version
implementation 'com.google.android.material:material:1.13.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.13.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.leanback:leanback:1.2.0'
implementation 'androidx.activity:activity:1.13.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
//noinspection GradleCompatible
implementation 'com.android.support:design:28.0.0'
implementation 'com.jaredrummler:material-spinner:1.3.1'
implementation 'com.google.android.material:material:1.13.0'
// implementation 'com.ornach.nobobutton:nobobutton:1.5'
implementation 'de.hdodenhof:circleimageview:3.1.0'
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
//noinspection GradleCompatible
implementation 'com.android.support:cardview-v7:28.0.0'
implementation("com.github.mreram:showcaseview:1.4.1")
implementation 'com.github.bumptech.glide:glide:5.0.5'
annotationProcessor 'com.github.bumptech.glide:compiler:5.0.5'
implementation 'jp.wasabeef:glide-transformations:4.3.0'
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/androidTest/java/rocks/poopjournal/todont/ExampleInstrumentedTest.kt
================================================
package rocks.poopjournal.todont
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("rocks.poopjournal.todont", appContext.packageName)
}
}
================================================
FILE: app/src/debug/res/drawable/ic_launcher_foreground.xml
================================================
================================================
FILE: app/src/debug/res/drawable-v24/ic_launcher_background.xml
================================================
================================================
FILE: app/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
================================================
FILE: app/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/About.kt
================================================
package rocks.poopjournal.todont
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.View.OnTouchListener
import android.view.WindowManager
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import rocks.poopjournal.todont.utils.SharedPrefUtils
import rocks.poopjournal.todont.utils.setAppTheme
import smartdevelop.ir.eram.showcaseviewlib.GuideView
import smartdevelop.ir.eram.showcaseviewlib.config.DismissType
import smartdevelop.ir.eram.showcaseviewlib.config.Gravity
import smartdevelop.ir.eram.showcaseviewlib.config.PointerType
class About : AppCompatActivity() {
var version: TextView? = null
lateinit var mainRelative : RelativeLayout
private var contributionView: LinearLayout? = null
private var prefUtils: SharedPrefUtils? = null
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAppTheme(this)
setContentView(R.layout.activity_about)
//actionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.mygradient))
WindowCompat.setDecorFitsSystemWindows(window, false);
mainRelative = findViewById(R.id.main_relative)
// Apply insets padding to avoid notch / status bar / nav bar overlap
ViewCompat.setOnApplyWindowInsetsListener(mainRelative) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.updatePadding(
left = systemBars.left,
top = systemBars.top,
right = systemBars.right,
)
insets
}
window.statusBarColor = Color.TRANSPARENT
WindowCompat.getInsetsController(window, window.decorView).apply {
val isDark =
(resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) ==
Configuration.UI_MODE_NIGHT_YES
isAppearanceLightStatusBars = !isDark
}
contributionView = findViewById(R.id.contributionView)
version = findViewById(R.id.versiontext)
version?.setText(BuildConfig.VERSION_NAME + " Beta ")
prefUtils = SharedPrefUtils(this)
contributionView?.setOnTouchListener(OnTouchListener { view, motionEvent ->
if (!prefUtils!!.getBool(SharedPrefUtils.KEY_CONTRIBUTION_VIEW)) {
val guideView = GuideView.Builder(this@About)
.setContentText(this@About.resources.getString(R.string.help_make_to_don_t_better))
.setTargetView(contributionView)
.setDismissType(DismissType.anywhere)
.setPointerType(PointerType.arrow)
.setGravity(Gravity.center)
.setGuideListener {
prefUtils!!.setBool(
SharedPrefUtils.KEY_CONTRIBUTION_VIEW,
true
)
}
guideView.build().show()
return@OnTouchListener true
}
false
})
}
fun contact_codeaquaria(view: View) {
when (view.id) {
R.id.btnmail_codeaquaria -> {
val mailto = "mailto:codeaquaria20@gmail.com"
val emailIntent = Intent(Intent.ACTION_SENDTO)
emailIntent.setData(Uri.parse(mailto))
try {
startActivity(emailIntent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, " Error to open Email ", Toast.LENGTH_SHORT).show()
}
}
R.id.btngit_codeaquaria -> {
val uri =
Uri.parse("https://github.com/arafaatqureshi") // missing 'http://' will cause crashed
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
}
R.id.btntwitter_codeaquaria -> {
val ui =
Uri.parse("https://www.facebook.com/Code-Aquaria-109834144196326") // missing 'http://' will cause crashed
val it = Intent(Intent.ACTION_VIEW, ui)
startActivity(it)
}
}
}
fun contact_codeaquariatar(view: View) {
when (view.id) {
R.id.btnmail_tarik -> {
val mailto = "mailto:imamtariq7@gmail.com"
val emailIntent = Intent(Intent.ACTION_SENDTO)
emailIntent.setData(Uri.parse(mailto))
try {
startActivity(emailIntent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, " Error to open Email ", Toast.LENGTH_SHORT).show()
}
}
R.id.btngit_tarik -> {
val uri =
Uri.parse("https://github.com/theftzoku") // missing 'http://' will cause crashed
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
}
R.id.btntwitter_tarik -> {
val ui =
Uri.parse("https://www.facebook.com/Code-Aquaria-109834144196326") // missing 'http://' will cause crashed
val it = Intent(Intent.ACTION_VIEW, ui)
startActivity(it)
}
}
}
fun contact_marvin(view: View) {
when (view.id) {
R.id.btnmail_crazymarvin -> {
val mailto = "mailto:marvin@poopjournal.rocks"
val emailIntent = Intent(Intent.ACTION_SENDTO)
emailIntent.setData(Uri.parse(mailto))
try {
startActivity(emailIntent)
} catch (e: ActivityNotFoundException) {
Toast.makeText(this, " Error to open Email ", Toast.LENGTH_SHORT).show()
}
}
R.id.btngit_crazymarvin -> {
val uri =
Uri.parse("https://github.com/Crazy-Marvin") // missing 'http://' will cause crashed
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)
}
R.id.btntwitter_crazymarvin -> {
val u =
Uri.parse("https://twitter.com/CrazyMarvinApps") // missing 'http://' will cause crashed
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
}
}
fun translate(view: View?) {
val u = Uri.parse("https://hosted.weblate.org/projects/todont/")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun report(view: View?) {
val u = Uri.parse("https://github.com/Crazy-Marvin/ToDont/issues")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun viewsource(view: View?) {
val u = Uri.parse("https://github.com/Crazy-Marvin/ToDont")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun back(view: View?) {
// val i = Intent(this@About, Settings::class.java)
// finishAffinity()
// startActivity(i)
finish()
overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
fun jetpack(view: View?) {
val u = Uri.parse("https://developer.android.com/jetpack")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun logoclicked(view: View?) {
val u = Uri.parse("https://crazymarvin.com/todont")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun feather(view: View?) {
val u = Uri.parse("https://feathericons.com/")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun apacheee(view: View?) {
val u = Uri.parse("https://github.com/Crazy-Marvin/ToDont/blob/development/LICENSE")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun spinner(view: View?) {
val u = Uri.parse("https://github.com/jaredrummler/MaterialSpinner/blob/master/LICENSE")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun nobobutton(view: View?) {
val u = Uri.parse("https://github.com/alex31n/NoboButton/blob/master/LICENSE")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun cImgButton(view: View?) {
val u = Uri.parse("https://github.com/hdodenhof/CircleImageView/blob/master/LICENSE.txt")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun MPAndroidChart(view: View?) {
val u = Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/LICENSE")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun JUnit(view: View?) {
val u = Uri.parse("https://junit.org/junit4/license.html")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun Kotlin(view: View?) {
val u = Uri.parse("https://github.com/JetBrains/kotlin/blob/master/license/LICENSE.txt")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun Java(view: View?) {
val u = Uri.parse("http://openjdk.java.net/legal/gplv2+ce.html")
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
fun showCaseView(view: View?) {
val u = Uri.parse(resources.getString(R.string.showCaseViewLink))
val i = Intent(Intent.ACTION_VIEW, u)
startActivity(i)
}
override fun onBackPressed() {
super.onBackPressed()
// val i = Intent(this@About, Settings::class.java)
// finishAffinity()
// startActivity(i)
overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/Helper.kt
================================================
package rocks.poopjournal.todont
object Helper {
//@JvmField
//var labels_array: ArrayList = ArrayList()
// @JvmField
// var avoidedData: ArrayList> = ArrayList()
// @JvmField
// var avoidedlogdata: ArrayList> = ArrayList()
// @JvmField
// var donedata: ArrayList> = ArrayList()
// @JvmField
// var donelogdata: ArrayList> = ArrayList()
// @JvmField
// var avoidedweeklydata: ArrayList = ArrayList()
// @JvmField
// var avoidedmonthlydata: ArrayList = ArrayList()
// @JvmField
// var donemonthlydata: ArrayList = ArrayList()
// @JvmField
// var doneweeklydata: ArrayList = ArrayList()
// @JvmField
// var doneyearlydata: ArrayList = ArrayList()
// @JvmField
// var avoidedyearlydata: ArrayList = ArrayList()
@JvmField
var SelectedButtonOfTodayTab: Int = 0
@JvmField
var SelectedButtonOfLogTab: Int = 0
@JvmField
var SelectedButtonOfLogDailyTab: Int = 0
@JvmField
var isTodaySelected: Boolean = true
// @JvmField
// var getSelecteddate: String = ""
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/LabelsActivity.kt
================================================
package rocks.poopjournal.todont
import android.app.Dialog
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.Window
import android.view.WindowManager
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import rocks.poopjournal.todont.adapters.LabelsAdapter
import rocks.poopjournal.todont.databinding.ActivityLabelsBinding
import rocks.poopjournal.todont.databinding.DialogboxLabelsBinding
import rocks.poopjournal.todont.model.Label
import rocks.poopjournal.todont.showcaseview.RippleBackground
import rocks.poopjournal.todont.showcaseview.ShowcaseViewBuilder
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.SharedPrefUtils
import rocks.poopjournal.todont.utils.setAppTheme
import smartdevelop.ir.eram.showcaseviewlib.GuideView
import smartdevelop.ir.eram.showcaseviewlib.config.DismissType
import smartdevelop.ir.eram.showcaseviewlib.config.Gravity
import smartdevelop.ir.eram.showcaseviewlib.config.PointerType
class LabelsActivity : AppCompatActivity() {
private var rvLabels: RecyclerView? = null
private var dbHelper: DatabaseUtils? = null
private var adapter: LabelsAdapter? = null
private var labels = ArrayList()
private var labelsFloatingButton: FloatingActionButton? = null
private var showcaseViewBuilder: ShowcaseViewBuilder? = null
private var prefUtils: SharedPrefUtils? = null
private var fabHighlighter: RippleBackground? = null
private lateinit var binding: ActivityLabelsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAppTheme(this)
binding = ActivityLabelsBinding.inflate(layoutInflater)
setContentView(binding.root)
//actionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.mygradient))
rvLabels = binding.rvLabels
prefUtils = SharedPrefUtils(this)
showcaseViewBuilder = ShowcaseViewBuilder.init(this)
fabHighlighter = binding.fabHighlighter
dbHelper = DatabaseUtils(this)
labelsFloatingButton = binding.labelFloatingbtn
loadLabel()
rvLabels?.setLayoutManager(LinearLayoutManager(this))
ItemTouchHelper(itemTouchHelper).attachToRecyclerView(rvLabels)
adapter = LabelsAdapter(this, dbHelper!!, labels)
rvLabels?.setAdapter(adapter)
rvLabels?.setLayoutManager(LinearLayoutManager(this))
labelsFloatingButton?.setOnClickListener(View.OnClickListener {
if (!prefUtils!!.getBool("plus1")) {
showcaseFab()
} else {
showLabelAddingDialog()
}
})
}
private fun showLabelAddingDialog() {
val dialog = Dialog(this@LabelsActivity,R.style.Dialog_Theme)
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
// Inflate the custom layout
val dialogView = DialogboxLabelsBinding.inflate(layoutInflater)
dialog.setContentView(dialogView.root)
// Set the dialog background to transparent to support rounded corners from CardView
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
// Set the layout parameters for the dialog
val lp = dialog.window?.attributes
lp?.width = WindowManager.LayoutParams.MATCH_PARENT
lp?.height = WindowManager.LayoutParams.WRAP_CONTENT
//lp?.dimAmount = 0.8f // Adjust the dimming amount for background
// dialog.window?.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) // Ensure the dim effect is enabled
dialog.window?.attributes = lp
// Handle the Save button click
dialogView.saveLabelButton.setOnClickListener {
val enteredText = dialogView.label.text.toString().replace("'", "''")
if (enteredText.trim().isNotEmpty()) {
dbHelper?.insertLabel(Label(name = enteredText))
loadLabel() // Refresh the label list
adapter?.updateData(labels) // Update the adapter data
dialog.dismiss() // Dismiss the dialog
} else {
dialogView.label.error = "Please enter a label" // Show error for empty input
}
}
// Show the dialog
dialog.show()
}
private fun loadLabel() {
dbHelper?.getAllLabels()?.let {
labels.clear()
labels.addAll(it)
}
}
private var itemTouchHelper: ItemTouchHelper.SimpleCallback =
object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
if (direction == 8) {
val dialog = AlertDialog.Builder(this@LabelsActivity)
dialog.setMessage(getString(R.string.do_you_really_want_to_delete_this_this_will_also_delete_all_habits_related_to_this_label))
dialog.setCancelable(true)
dialog.setPositiveButton(
"Yes"
) { dialog, id ->
val i = viewHolder.adapterPosition
val habits=dbHelper?.getHabitsWithLabelId(labels[i].labelId)
for(habit in habits!!){
dbHelper?.deleteAllHabitRecords(habit.id)
dbHelper?.deleteHabit(habit.id)
}
dbHelper?.deleteLabel(labels[i].labelId)
labels.removeAt(i)
adapter?.notifyItemRemoved(i)
overridePendingTransition(0, 0)
dialog.cancel()
}
dialog.setNegativeButton(
"No"
) { dialog, id ->
// val intent = Intent(applicationContext, LabelsActivity::class.java)
// startActivity(intent)
adapter?.notifyDataSetChanged()
overridePendingTransition(0, 0)
dialog.dismiss()
}
val alert11 = dialog.create()
alert11.show()
}
}
}
fun backBtnClicked(view: View?) {
// val i = Intent(this, MainActivity::class.java)
// startActivity(i)
finish()
}
private fun showcaseFab() {
val guideView = GuideView.Builder(this@LabelsActivity)
.setContentText(getString(R.string.add_label))
.setTargetView(labelsFloatingButton)
.setDismissType(DismissType.anywhere)
.setPointerType(PointerType.arrow)
.setGravity(Gravity.center)
.setGuideListener {
prefUtils!!.setBool(
"plus1",
true
)
}
guideView.build().show()
}
override fun onBackPressed() {
super.onBackPressed()
// val i = Intent(this, MainActivity::class.java)
// startActivity(i)
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/MainActivity.kt
================================================
package rocks.poopjournal.todont
import android.content.Intent
import android.content.res.Configuration
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.databinding.DataBindingUtil
import rocks.poopjournal.todont.databinding.ActivityMainBinding
import rocks.poopjournal.todont.fragments.FragmentLog
import rocks.poopjournal.todont.fragments.FragmentToday
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.SharedPrefUtils
import rocks.poopjournal.todont.utils.setAppTheme
import smartdevelop.ir.eram.showcaseviewlib.GuideView
import smartdevelop.ir.eram.showcaseviewlib.config.DismissType
import smartdevelop.ir.eram.showcaseviewlib.config.Gravity
import smartdevelop.ir.eram.showcaseviewlib.config.PointerType
class MainActivity : AppCompatActivity() {
// Database controller instance
private var dbHelper: DatabaseUtils? = null
private lateinit var binding: ActivityMainBinding
private var prefUtils: SharedPrefUtils? = null
private lateinit var fragmentToday: FragmentToday
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//setTheme(R.style.Theme_Todon_Dracula)
setAppTheme(this)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
WindowCompat.setDecorFitsSystemWindows(window, false);
// Apply insets padding to avoid notch / status bar / nav bar overlap
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.updatePadding(
left = systemBars.left,
top = systemBars.top,
right = systemBars.right,
)
insets
}
window.statusBarColor = Color.TRANSPARENT
WindowCompat.getInsetsController(window, window.decorView).apply {
val isDark =
(resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) ==
Configuration.UI_MODE_NIGHT_YES
isAppearanceLightStatusBars = !isDark
}
// Initialize the database controller
prefUtils = SharedPrefUtils(this)
dbHelper = DatabaseUtils(this)
// Set toolbar text to "Today"
binding.toolbartext.setText(R.string.today)
// Make the label and settings views visible
binding.label.visibility = View.VISIBLE
binding.settings.visibility = View.VISIBLE
// Retrieve and apply the night mode setting from the database
//db?.getNightMode()
binding.floatingbtn.setOnClickListener {
if (!prefUtils!!.getBool("plus")) {
showcaseFab(it)
}else{
fragmentToday.addNewHabit()
}
}
// Customize the action bar background
//actionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.mygradient))
// Define a listener for the bottom navigation view
binding.navigationView.setOnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_today -> {
// Switch to the 'FragmentToday' when "Today" is selected
replaceFragment(fragmentToday)
showFAB()
binding.toolbartext.setText(R.string.today)
binding.label.visibility = View.VISIBLE
binding.settings.visibility = View.VISIBLE
true
}
R.id.navigation_log -> {
// Show tutorial guide for first-time usage
if (prefUtils?.getBool(SharedPrefUtils.KEY_LOG) != true && !intent.getBooleanExtra(
"openLog",
false
)
) {
showLogGuide()
} else {
// Switch to the 'FragmentLog' when "Log" is selected
replaceFragment(FragmentLog())
hideFAB()
binding.toolbartext.setText(R.string.log)
binding.label.visibility = View.INVISIBLE
binding.settings.visibility = View.INVISIBLE
}
true
}
else -> false
}
}
// Initialize the default fragment
if (intent.getBooleanExtra("openLog", false)) {
binding.navigationView.selectedItemId = R.id.navigation_log
} else if (intent.getBooleanExtra(Constants.ADD_NEW_HABIT, false)) {
fragmentToday=FragmentToday.newInstance(true)
replaceFragment(fragmentToday)
} else {
fragmentToday=FragmentToday.newInstance(false)
replaceFragment(fragmentToday)
}
// Set label click action
binding.label.setOnClickListener {
val intent = Intent(this, LabelsActivity::class.java)
startActivity(intent)
//finish()
}
}
private fun showLogGuide() {
GuideView.Builder(this@MainActivity)
.setContentText(getString(R.string.view_your_stats))
.setTargetView(binding.navigationView.findViewById(R.id.navigation_log))
.setDismissType(DismissType.anywhere)
.setPointerType(PointerType.arrow)
.setGravity(Gravity.center)
.setGuideListener {
prefUtils?.setBool(SharedPrefUtils.KEY_LOG, true)
}
.build()
.show()
}
private fun showcaseFab(view:View) {
val guideView = GuideView.Builder(this)
.setContentText(getString(R.string.to_start_off_put_down_a_bad_habit))
.setTargetView(view)
.setDismissType(DismissType.anywhere)
.setPointerType(PointerType.arrow)
.setGravity(Gravity.center)
.setGuideListener {
prefUtils!!.setBool(
"plus",
true
)
}
guideView.build().show()
}
fun hideFAB() {
binding.floatingbtn.visibility = View.INVISIBLE
}
fun showFAB() {
binding.floatingbtn.visibility = View.VISIBLE
}
private fun replaceFragment(fragment: androidx.fragment.app.Fragment) {
val fragmentTag = fragment.javaClass.simpleName
// Replace the fragment and add it to the back stack
supportFragmentManager.beginTransaction()
.replace(R.id.container, fragment, fragmentTag)
.commit()
}
private val settingsLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
recreate() // Recreate the activity if the result is OK
}
}
// Handle the "Settings" action when a view is clicked
fun mySettings(view: View) {
val intent = Intent(this, Settings::class.java)
settingsLauncher.launch(intent)
overridePendingTransition(0, 0)
//finish()
}
// Handle the back button press
override fun onBackPressed() {
// // Customize the back button behavior
// if (supportFragmentManager.backStackEntryCount > 0) {
// // If fragments are in the back stack, pop the latest one
// supportFragmentManager.popBackStack()
// } else {
// If no fragments are in the back stack, exit the activity
super.onBackPressed()
//finish()
// }
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/MyApp.kt
================================================
package rocks.poopjournal.todont
import android.app.Application
import io.sentry.android.core.SentryAndroid
import rocks.poopjournal.todont.utils.SharedPrefUtils
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
val pref = SharedPrefUtils(this)
if (pref.isMonitorEnabled()) {
enableSentry()
} else {
disableSentry()
}
}
private fun enableSentry() {
SentryAndroid.init(this) { options ->
// DSN will be read automatically from manifest
options.isEnableUserInteractionTracing = true
options.isAttachScreenshot = true
options.isAttachViewHierarchy = true
}
}
private fun disableSentry() {
io.sentry.Sentry.close()
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/NotificationReceiver.kt
================================================
package rocks.poopjournal.todont
import android.Manifest
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
class NotificationReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val channel =
NotificationChannel("Tasks", "tasks reminder", NotificationManager.IMPORTANCE_HIGH)
val manager = ContextCompat.getSystemService(
context,
NotificationManager::class.java
)
manager!!.createNotificationChannel(channel)
val task = intent.getStringExtra("task")
// Create notification when the alarm is triggered
val pendingIntent = Intent(context, MainActivity::class.java)
pendingIntent.putExtra("openLog", true)
val builder = NotificationCompat.Builder(context, "Tasks")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(context.getString(R.string.todon_t_reminder))
.setContentText(context.getString(R.string.mark_your_todon_t_task)+task)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setContentIntent(
PendingIntent.getActivity(
context,
0,
pendingIntent,
PendingIntent.FLAG_IMMUTABLE
)
) // Pass the pending intent here
val notificationManager = NotificationManagerCompat.from(context)
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
return
}
notificationManager.notify(1, builder.build())
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/OnBoardingActivity.kt
================================================
package rocks.poopjournal.todont
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.TypedValue
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
import rocks.poopjournal.todont.databinding.ActivityOnBoardingBinding
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.SharedPrefUtils
import rocks.poopjournal.todont.utils.ThemeMode
import rocks.poopjournal.todont.utils.setAppTheme
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
class OnBoardingActivity : AppCompatActivity() {
private lateinit var binding: ActivityOnBoardingBinding
private lateinit var sharedPrefUtils: SharedPrefUtils
private val calendar: Calendar = Calendar.getInstance()
private val dateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAppTheme(this)
// Use ViewBinding to inflate the layout
binding = ActivityOnBoardingBinding.inflate(layoutInflater)
setContentView(binding.root)
//actionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.mygradient))
// Change the status bar color for devices with Lollipop or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
val typedValue = TypedValue()
theme.resolveAttribute(com.google.android.material.R.attr.backgroundColor, typedValue, true)
window.statusBarColor = typedValue.data
}
// Initialize SharedPrefUtils
sharedPrefUtils = SharedPrefUtils(this)
// Set the button click listener using coroutines for better handling of async tasks
binding.btncontinue.setOnClickListener {
MainScope().launch {
handleOnBoardingCompletion()
}
}
}
/**
* Handle the on-boarding completion, save necessary data to SharedPreferences and navigate to MainActivity.
*/
private fun handleOnBoardingCompletion() {
// Save settings in SharedPreferences
sharedPrefUtils.apply {
putString(SharedPrefUtils.KEY_NIGHT_MODE, ThemeMode.LIGHT_MODE.value)
putString(SharedPrefUtils.KEY_FIRST_TIME, Constants.NO)
putString(Constants.INITIAL_DATE_KEY, dateFormat.format(calendar.time))
}
// Start MainActivity
val intent = Intent(this@OnBoardingActivity, MainActivity::class.java)
startActivity(intent)
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/Settings.kt
================================================
package rocks.poopjournal.todont;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.app.Dialog;
import android.app.LocaleManager;
import android.content.ContentValues
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration
import android.content.res.Resources.Theme
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.LocaleList;
import android.provider.DocumentsContract;
import android.provider.MediaStore
import android.util.Log;
import android.view.View;
import android.view.ViewGroup
import android.view.Window;
import android.view.WindowManager
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView
import android.widget.Toast;
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import rocks.poopjournal.todont.databinding.ActivitySettingsBinding
import rocks.poopjournal.todont.databinding.DialogInfoBinding
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import java.io.FileOutputStream;
import java.util.Locale;
import rocks.poopjournal.todont.utils.SharedPrefUtils;
import rocks.poopjournal.todont.utils.ThemeMode
import rocks.poopjournal.todont.utils.getAppTheme
import rocks.poopjournal.todont.utils.setAppTheme
import smartdevelop.ir.eram.showcaseviewlib.GuideView;
import smartdevelop.ir.eram.showcaseviewlib.config.DismissType;
import smartdevelop.ir.eram.showcaseviewlib.config.Gravity;
import smartdevelop.ir.eram.showcaseviewlib.config.PointerType;
import java.io.File
import java.io.FileInputStream
import java.io.IOException
class Settings : AppCompatActivity() {
private lateinit var binding: ActivitySettingsBinding
private lateinit var prefUtils: SharedPrefUtils
private lateinit var dbHelper: DatabaseUtils
private val REQUEST_CODE_WRITE_EXTERNAL_STORAGE = 100
private val REQUEST_CODE_PICK_DB_FILE = 200
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAppTheme(this)
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
//actionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.mygradient))
WindowCompat.setDecorFitsSystemWindows(window, false);
// Apply insets padding to avoid notch / status bar / nav bar overlap
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.updatePadding(
left = systemBars.left,
top = systemBars.top,
right = systemBars.right,
bottom = systemBars.bottom
)
insets
}
window.statusBarColor = Color.TRANSPARENT
WindowCompat.getInsetsController(window, window.decorView).apply {
val isDark =
(resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) ==
Configuration.UI_MODE_NIGHT_YES
isAppearanceLightStatusBars = !isDark
}
prefUtils = SharedPrefUtils(this)
dbHelper = DatabaseUtils(this)
// Handle back press
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
finishMYActivity()
overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
})
binding.btnBack.setOnClickListener {
finishMYActivity()
overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
binding.modetitle.text = getThemeMode(this.getAppTheme())
binding.backUpButton.setOnClickListener {
if (checkStoragePermission()) {
backupDatabase()
}
}
binding.restoreButton.setOnClickListener {
if (checkStoragePermission()) {
openFilePicker()
}
}
binding.monitorInfoBtn.setOnClickListener {
showMaterialInfoDialog()
}
binding.monitorSwitch.isChecked = prefUtils.isMonitorEnabled()
binding.monitorSwitch.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
// switch turned ON
prefUtils.setMonitorEnabled(true)
} else {
// switch turned OFF
prefUtils.setMonitorEnabled(false)
}
}
}
// Check and request storage permission
private fun checkStoragePermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q || ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
) {
true
} else {
ActivityCompat.requestPermissions(
this,
arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
REQUEST_CODE_WRITE_EXTERNAL_STORAGE
)
false
}
}
// Backup the database to the Downloads folder
private fun backupDatabase() {
try {
val dbFile = dbHelper.getDatabaseFile()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
saveFileToDownloadsUsingMediaStore(dbFile)
} else {
val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
val destFile = File(downloadsDir, dbFile.name)
copyFile(dbFile, destFile)
Toast.makeText(this, "Database backed up to Downloads", Toast.LENGTH_LONG).show()
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, "Failed to backup database: ${e.message}", Toast.LENGTH_LONG).show()
}
}
// Save file to Downloads using MediaStore (Android 10+)
@RequiresApi(Build.VERSION_CODES.Q)
private fun saveFileToDownloadsUsingMediaStore(sourceFile: File) {
val contentResolver = contentResolver
val values = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, sourceFile.name)
put(MediaStore.MediaColumns.MIME_TYPE, "application/octet-stream")
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
}
val fileUri = contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values)
if (fileUri != null) {
try {
contentResolver.openOutputStream(fileUri)?.use { outputStream ->
FileInputStream(sourceFile).use { inputStream ->
inputStream.copyTo(outputStream)
}
}
Toast.makeText(this, "Database backed up to Downloads", Toast.LENGTH_LONG).show()
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, "Failed to save file: ${e.message}", Toast.LENGTH_LONG).show()
}
}
}
// Open file picker to select a backup file
private fun openFilePicker() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/octet-stream"
}
startActivityForResult(intent, REQUEST_CODE_PICK_DB_FILE)
}
// Handle file picker result
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_PICK_DB_FILE && resultCode == RESULT_OK && data != null) {
val fileUri = data.data
if (fileUri != null) {
restoreDatabase(fileUri)
}
}
}
// Restore the database from the selected file
private fun restoreDatabase(fileUri: Uri) {
try {
dbHelper.close()
val dbFile = dbHelper.getDatabaseFile()
contentResolver.openInputStream(fileUri)?.use { inputStream ->
FileOutputStream(dbFile).use { outputStream ->
inputStream.copyTo(outputStream)
}
}
Toast.makeText(this, "Database restored successfully", Toast.LENGTH_LONG).show()
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, "Failed to restore database: ${e.message}", Toast.LENGTH_LONG).show()
} finally {
dbHelper = DatabaseUtils(this) // Reinitialize the database helper
}
}
// Copy file from source to destination
@Throws(IOException::class)
private fun copyFile(sourceFile: File, destFile: File) {
FileInputStream(sourceFile).use { inputStream ->
FileOutputStream(destFile).use { outputStream ->
inputStream.copyTo(outputStream)
}
}
}
// Handle permission request result
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE_WRITE_EXTERNAL_STORAGE) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
backupDatabase()
} else {
Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show()
}
}
}
fun changeMode(view: View) {
if (prefUtils.getBool(SharedPrefUtils.KEY_APPEAR_VIEW)) {
val guideView = GuideView.Builder(this)
.setContentText(getString(R.string.help_make_to_don_t_better))
.setTargetView(view)
.setDismissType(DismissType.anywhere)
.setPointerType(PointerType.arrow)
.setGravity(Gravity.center)
.setGuideListener { prefUtils.setBool(SharedPrefUtils.KEY_APPEAR_VIEW, true) }
.build()
guideView.show()
} else {
val dialog = Dialog(this).apply {
requestWindowFeature(Window.FEATURE_NO_TITLE)
setContentView(R.layout.dialogbox)
setCancelable(false)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}
val lp = dialog.window!!.attributes
lp.dimAmount = 0.9f
val window = dialog.window
window!!.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
dialog.window!!.attributes = lp
val btndone = dialog.findViewById(R.id.btndone)
val light = dialog.findViewById(R.id.light)
val dark = dialog.findViewById(R.id.dark)
val dracula = dialog.findViewById(R.id.dracula)
val fsys = dialog.findViewById(R.id.followsys)
val draculaPro= dialog.findViewById(R.id.dracula_pro)
val draculaProAlucard= dialog.findViewById(R.id.dracula_pro_alucard)
val draculaProBuffy= dialog.findViewById(R.id.dracula_pro_buffy)
val draculaProBlade= dialog.findViewById(R.id.dracula_pro_blade)
when (binding.modetitle.text.toString()) {
resources.getString(R.string.followsys) -> fsys.isChecked = true
resources.getString(R.string.light) -> light.isChecked = true
resources.getString(R.string.dark) -> dark.isChecked = true
resources.getString(R.string.dracula) -> dracula.isChecked = true
resources.getString(R.string.dracula_pro) -> draculaPro.isChecked = true
resources.getString(R.string.dracula_pro_alucard) -> draculaProAlucard.isChecked = true
resources.getString(R.string.dracula_pro_buffy) -> draculaProBuffy.isChecked = true
resources.getString(R.string.dracula_pro_blade) -> draculaProBlade.isChecked = true
}
dialog.window?.attributes = dialog.window?.attributes?.apply {
dimAmount = 0.9f
}
btndone.setOnClickListener {
setNewThemeMode()
dialog.dismiss()
}
dialog.show()
}
}
private fun setNewThemeMode() {
// Usage in when block
val theme=prefUtils.getThemeMode()
when (theme) {
ThemeMode.FOLLOW_SYS.value -> {
applyThemeMode(
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.FOLLOW_SYS.value
)
}
ThemeMode.LIGHT_MODE.value-> {
applyThemeMode(
//AppCompatDelegate.MODE_NIGHT_NO,
R.style.Theme_Todon_Light,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.LIGHT_MODE.value
)
}
ThemeMode.DARK_MODE.value -> {
applyThemeMode(
// AppCompatDelegate.MODE_NIGHT_YES,
R.style.Theme_Todon_Dark,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.DARK_MODE.value
)
}
ThemeMode.DRACULA.value -> {
applyThemeMode(
//AppCompatDelegate.MODE_NIGHT_YES,
R.style.Theme_Todon_Dracula,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.DRACULA.value
)
}
ThemeMode.DRACULA_PRO.value -> {
applyThemeMode(
//AppCompatDelegate.MODE_NIGHT_YES,
R.style.Theme_Todon_Dracula_Pro,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.DRACULA_PRO.value
)
}
ThemeMode.DRACULA_PRO_ALUCARD.value -> {
applyThemeMode(
//AppCompatDelegate.MODE_NIGHT_YES,
R.style.Theme_Todon_Dracula_Alucard,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.DRACULA_PRO_ALUCARD.value
)
}
ThemeMode.DRACULA_PRO_BUFFY.value -> {
applyThemeMode(
//AppCompatDelegate.MODE_NIGHT_YES,
R.style.Theme_Todon_DraculaBlade_Buffy,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.DRACULA_PRO_BUFFY.value
)
}
ThemeMode.DRACULA_PRO_BLADE.value -> {
applyThemeMode(
//AppCompatDelegate.MODE_NIGHT_YES,
R.style.Theme_Todon_DraculaBlade,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.DRACULA_PRO_BLADE.value
)
}
else -> {
applyThemeMode(
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM,
String.format("To Don't is using the %s now",getThemeMode(theme)),
ThemeMode.FOLLOW_SYS.value
)
}
}
}
private fun applyThemeMode(mode: Int, toastMessageRes: String, modeTitle: String) {
Log.d("checkmode", "Mode set to: $mode")
//binding.modetitle.text = getThemeMode(modeTitle)
//prefUtils.setThemeMode(modeTitle)
//AppCompatDelegate.setDefaultNightMode(mode)
//setTheme(mode)
Constants.CURRENT_THEME=prefUtils.getThemeMode()
if(Constants.IS_OK){
Toast.makeText(applicationContext, toastMessageRes, Toast.LENGTH_SHORT).show()
recreate()
}
}
private fun getThemeMode(modeTitle: String): String {
return when (modeTitle) {
ThemeMode.FOLLOW_SYS.value -> {
resources.getString(R.string.followsys)
}
ThemeMode.LIGHT_MODE.value -> {
resources.getString(R.string.light)
}
ThemeMode.DARK_MODE.value -> {
resources.getString(R.string.dark)
}
ThemeMode.DRACULA.value -> {
resources.getString(R.string.dracula)
}
ThemeMode.DRACULA_PRO.value ->{
resources.getString(R.string.dracula_pro)
}
ThemeMode.DRACULA_PRO_ALUCARD.value ->{
resources.getString(R.string.dracula_pro_alucard)
}
ThemeMode.DRACULA_PRO_BUFFY.value ->{
resources.getString(R.string.dracula_pro_buffy)
}
ThemeMode.DRACULA_PRO_BLADE.value ->{
resources.getString(R.string.dracula_pro_blade)
}
else -> {
modeTitle
}
}
}
fun onRadioButtonClicked(view: View) {
// Check if the button is now checked
val checked = (view as RadioButton).isChecked
// Determine which radio button was clicked
when (view.id) {
R.id.followsys -> {
if (checked) {
updateThemeMode(ThemeMode.FOLLOW_SYS.value)
}
}
R.id.light -> {
if (checked) {
updateThemeMode(ThemeMode.LIGHT_MODE.value)
}
}
R.id.dark -> {
if (checked) {
updateThemeMode(ThemeMode.DARK_MODE.value)
}
}
R.id.dracula -> {
if (checked) {
updateThemeMode(ThemeMode.DRACULA.value)
}
}
R.id.dracula_pro -> {
if (checked) {
updateThemeMode(ThemeMode.DRACULA_PRO.value)
}
}
R.id.dracula_pro_alucard -> {
if (checked) {
updateThemeMode(ThemeMode.DRACULA_PRO_ALUCARD.value)
}
}
R.id.dracula_pro_buffy -> {
if (checked) {
updateThemeMode(ThemeMode.DRACULA_PRO_BUFFY.value)
}
}
R.id.dracula_pro_blade -> {
if (checked) {
updateThemeMode(ThemeMode.DRACULA_PRO_BLADE.value)
}
}
}
Constants.IS_OK= Constants.CURRENT_THEME != prefUtils.getThemeMode()
}
private fun updateThemeMode(value: String) {
binding.modetitle.text =getThemeMode(value)
prefUtils.setThemeMode(value)
}
private fun backBtn(view: View) {
finishMYActivity()
}
fun aboutus(view: View) {
Intent(this, About::class.java).also { intent ->
//finishAffinity()
startActivity(intent)
overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
}
fun restore(view: View) {
openFilePicker()
}
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
private fun setAppLocale(locale: Locale) {
val localeManager = getSystemService(LocaleManager::class.java)
localeManager?.applicationLocales = LocaleList(locale)
}
private fun showPermissionDeniedDialog() {
AlertDialog.Builder(this)
.setTitle(getString(R.string.permission_required))
.setMessage(getString(R.string.this_app_requires_access_to_your_external_storage_to_restore_the_database_please_enable_this_permission_in_the_app_settings))
.setPositiveButton(getString(R.string.open_settings)) { _, _ ->
val intent =
Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.fromParts("package", packageName, null)
}
startActivity(intent)
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.dismiss()
}
.show()
}
private fun showMaterialInfoDialog() {
val dialogBinding = DialogInfoBinding.inflate(layoutInflater)
val dialog = MaterialAlertDialogBuilder(this)
.setView(dialogBinding.root)
.setCancelable(true)
.create()
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialogBinding.btnOk.setOnClickListener {
dialog.dismiss()
}
dialog.show()
}
fun finishMYActivity(){
if(Constants.IS_OK){
setResult(RESULT_OK)
}else{
setResult(RESULT_CANCELED)
}
finish()
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/SplashScreenActivity.kt
================================================
package rocks.poopjournal.todont
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import rocks.poopjournal.todont.databinding.ActivitySplashScreenBinding
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.SharedPrefUtils
import rocks.poopjournal.todont.utils.ThemeMode
import rocks.poopjournal.todont.utils.setAppTheme
class SplashScreenActivity : AppCompatActivity() {
private lateinit var sharedPrefUtils: SharedPrefUtils
private val splashScope = CoroutineScope(Dispatchers.Main)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setAppTheme(this)
// Use viewBinding to inflate the layout
val binding = ActivitySplashScreenBinding.inflate(layoutInflater)
setContentView(binding.root)
//actionBar?.setBackgroundDrawable(resources.getDrawable(R.drawable.mygradient))
// Initialize SharedPrefUtils
sharedPrefUtils = SharedPrefUtils(this)
// Retrieve first-time check and apply theme if necessary
val isFirstTime = sharedPrefUtils.getString(SharedPrefUtils.KEY_FIRST_TIME, Constants.NO)
splashScope.launch {
delay(2000) // 2-second delay before launching the next activity
checkStatus(isFirstTime) // Pass the actual value from SharedPreferences or logic
}
}
private fun checkStatus(isFirstTime: String?) {
val nextActivity = if (isFirstTime == Constants.NO) {
MainActivity::class.java
} else {
OnBoardingActivity::class.java
}
startActivity(Intent(this@SplashScreenActivity, nextActivity))
finishAffinity() // Ensures the splash screen is properly closed
overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
}
override fun onDestroy() {
super.onDestroy()
splashScope.cancel() // Cancel coroutine to prevent memory leaks
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/adapters/AvoidedOrDoneAdapter.kt
================================================
package rocks.poopjournal.todont.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.databinding.RecyclerviewLayoutBinding
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
class AvoidedOrDoneAdapter(
val context: Context,
val dbHelper: DatabaseUtils,
val habits:ArrayList,
val isAvoided:Boolean,
val resIcon:Int
) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding=RecyclerviewLayoutBinding.inflate(inflater,viewGroup,false)
return RecyclerViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val habit = habits[position]
with(holder.binding){
tvAvoidedCount.text=if(isAvoided){
habit.countAvoided.toString()
}else{
habit.countDone.toString()
}
tvHabitName.text=habit.name
tvLabelName.text=habit.label?.name
}
}
override fun getItemCount()=habits.size
inner class RecyclerViewHolder(val binding: RecyclerviewLayoutBinding) : RecyclerView.ViewHolder(binding.root) {
init {
binding.btnAddToAvoided.setBackgroundResource(resIcon)
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/adapters/AvoidedOrDoneLogAdapter.kt
================================================
package rocks.poopjournal.todont.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.databinding.RecyclerviewLayoutBinding
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.HabitsBottomSheetDialog
class AvoidedOrDoneLogAdapter(
val context: Context,
val dbHelper: DatabaseUtils,
val habits: ArrayList,
val isAvoided: Boolean,
val resIcon: Int
) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding= RecyclerviewLayoutBinding.inflate(inflater,viewGroup,false)
return RecyclerViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val habit = habits[position]
with(holder.binding){
tvAvoidedCount.text=if(isAvoided){
habit.countAvoided.toString()
}else{
habit.countDone.toString()
}
tvHabitName.text=habit.name
tvLabelName.text=habit.label?.name
llRootView.setOnClickListener{
val bottomSheet=HabitsBottomSheetDialog(
context,
habit,
position,
dbHelper,
object :HabitsBottomSheetDialog.HabitSheetListener{
override fun updateCount(_habit: Habit, _position: Int) {
habits[_position].countDone=_habit.countDone
habits[_position].countAvoided=_habit.countAvoided
}
override fun deleted(_habit: Habit, _position: Int) {
habits.removeAt(_position)
notifyItemRemoved(_position)
notifyItemRangeChanged(_position,habits.size)
}
override fun dismissed() {
notifyDataSetChanged()
}
}
)
}
}
}
override fun getItemCount()=habits.size
inner class RecyclerViewHolder(val binding: RecyclerviewLayoutBinding) : RecyclerView.ViewHolder(binding.root) {
init {
binding.btnAddToAvoided.setBackgroundResource(resIcon)
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/adapters/HabitsAdapter.kt
================================================
package rocks.poopjournal.todont.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.RecyclerviewLayoutHabitsBinding
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.model.HabitRecord
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.HabitStatus
import rocks.poopjournal.todont.utils.HabitsBottomSheetDialog
import rocks.poopjournal.todont.utils.SharedPrefUtils
import smartdevelop.ir.eram.showcaseviewlib.GuideView
import smartdevelop.ir.eram.showcaseviewlib.config.DismissType
import smartdevelop.ir.eram.showcaseviewlib.config.Gravity
import smartdevelop.ir.eram.showcaseviewlib.config.PointerType
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class HabitsAdapter(
var context: Context,
private var dbHelper: DatabaseUtils,
var habits: ArrayList,
) :
RecyclerView.Adapter() {
private val prefUtils: SharedPrefUtils = SharedPrefUtils(context)
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding=RecyclerviewLayoutHabitsBinding.inflate(inflater,viewGroup,false)
return RecyclerViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val habit=habits[position]
with(holder.binding){
tvHabitName.text=habit.name
tvLabelOfHabit.text=habit.label?.name
tvAvoided.text=habit.countAvoided.toString()
tvDone.text=habit.countDone.toString()
llRootView.setOnClickListener {
val bottomSheet=HabitsBottomSheetDialog(
context,habit,position,dbHelper,
object :HabitsBottomSheetDialog.HabitSheetListener{
override fun updateCount(_habit: Habit, _position: Int) {
habits[_position].countDone=_habit.countDone
habits[_position].countAvoided=_habit.countAvoided
tvAvoided.text=_habit.countAvoided.toString()
tvDone.text=_habit.countDone.toString()
}
override fun deleted(_habit: Habit, _position: Int) {
habits.removeAt(_position)
notifyItemRemoved(_position)
notifyItemRangeChanged(_position,habits.size)
}
override fun dismissed() {
notifyDataSetChanged()
}
}
)
bottomSheet.show()
}
btnAddToDone.setOnClickListener {
if (!prefUtils.getBool(SharedPrefUtils.KEY_ADD_OR_AVOIDED)) {
showGuidedView(viewDoneOrAvoided)
} else if (Helper.isTodaySelected) {
habit.countDone++
dbHelper.updateHabit(habit)
dbHelper.insertRecord(
HabitRecord(
date = getTodayDate(),
status = HabitStatus.DONE.value,
habitId = habit.id
)
)
tvDone.text=habit.countDone.toString()
}
}
btnAddToAvoided.setOnClickListener {
if (!prefUtils.getBool(SharedPrefUtils.KEY_ADD_OR_AVOIDED)) {
showGuidedView(viewDoneOrAvoided)
} else if (Helper.isTodaySelected) {
habit.countAvoided++
dbHelper.updateHabit(habit)
dbHelper.insertRecord(
HabitRecord(
date = getTodayDate(),
status = HabitStatus.AVOIDED.value,
habitId = habit.id
)
)
tvAvoided.text=habit.countAvoided.toString()
}
}
}
}
private fun showGuidedView(view: View){
val guideView = GuideView.Builder(context)
.setContentText(context.getString(R.string.mark_as_done_or_avoided))
.setTargetView(view)
.setDismissType(DismissType.anywhere)
.setPointerType(PointerType.arrow)
.setGravity(Gravity.center)
.setGuideListener {
prefUtils.setBool(
SharedPrefUtils.KEY_ADD_OR_AVOIDED,
true
)
}
guideView.build().show()
}
private fun getTodayDate(): String {
var date: Date = Calendar.getInstance().time
val dateFormat: SimpleDateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
var formattedDate: String = dateFormat.format(date)
//Calendar.getInstance().timeInMillis.toString()
return formattedDate
}
override fun getItemCount()=habits.size
inner class RecyclerViewHolder(val binding: RecyclerviewLayoutHabitsBinding) : RecyclerView.ViewHolder(binding.root){
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/adapters/HabitsLogAdapter.kt
================================================
package rocks.poopjournal.todont.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.RecyclerviewLayoutLogHabitsBinding
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.HabitsBottomSheetDialog
class HabitsLogAdapter(
val context: Context,
val dbHelper: DatabaseUtils,
val habits:ArrayList
) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding=RecyclerviewLayoutLogHabitsBinding.inflate(inflater)
return RecyclerViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val habit = habits[position]
with(holder.binding){
tvHabitName.text=habit.name
tvLabelName.text=habit.label?.name
llRootView.setOnClickListener{
val bottomSheet=HabitsBottomSheetDialog(
context,
habit,
position,
dbHelper,
object : HabitsBottomSheetDialog.HabitSheetListener{
override fun updateCount(_habit: Habit, _position: Int) {
habits[_position].countDone=_habit.countDone
habits[_position].countAvoided=_habit.countAvoided
}
override fun deleted(_habit: Habit, _position: Int) {
habits.removeAt(_position)
notifyItemRemoved(_position)
notifyItemRangeChanged(_position,habits.size)
}
override fun dismissed() {
notifyDataSetChanged()
}
}
)
}
}
}
override fun getItemCount()=habits.size
inner class RecyclerViewHolder(val binding: RecyclerviewLayoutLogHabitsBinding) : RecyclerView.ViewHolder(binding.root) {
init {
binding.habitsbutton.setBackgroundResource(R.drawable.ic_habitscircle)
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/adapters/LabelsAdapter.kt
================================================
package rocks.poopjournal.todont.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.LabelsRecyclerviewLayoutBinding
import rocks.poopjournal.todont.model.Label
import rocks.poopjournal.todont.utils.DatabaseUtils
class LabelsAdapter(var context: Context, var dbHelper: DatabaseUtils, var labels: ArrayList) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerViewHolder {
val inflater = LayoutInflater.from(viewGroup.context)
val binding = LabelsRecyclerviewLayoutBinding.inflate(inflater, viewGroup, false)
return RecyclerViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
val label = labels[position]
with(holder.binding) {
tvLabel.text = label.name
tvSum.text = label.habitCount.toString() + " " + context.resources.getString(R.string.habits)
}
}
fun updateData(newLabels: List) {
//labels.clear()
// labels.addAll(newLabels)
notifyDataSetChanged()
}
override fun getItemCount() = labels.size
inner class RecyclerViewHolder(val binding: LabelsRecyclerviewLayoutBinding) :
RecyclerView.ViewHolder(binding.root)
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/AvoidedOrDoneFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.app.AlertDialog
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.adapters.AvoidedOrDoneAdapter
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.MainActivity
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
class AvoidedOrDoneFragment() : Fragment() {
var rv: RecyclerView? = null
var habits=ArrayList()
var dbHelper: DatabaseUtils? = null
var adapter: AvoidedOrDoneAdapter? = null
var isAvoided:Boolean=false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.getBoolean("ARG_DATA")?.let {
isAvoided=it
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_avoided, container, false)
//Helper.SelectedButtonOfTodayTab=true;
rv = view.findViewById(R.id.rv)
dbHelper = DatabaseUtils(requireContext())
return view
}
override fun onResume() {
super.onResume()
setDataInList()
}
private fun setDataInList() {
getData()?.let {
habits=it
rv!!.layoutManager = LinearLayoutManager(activity)
ItemTouchHelper(itemtouchhelper).attachToRecyclerView(rv)
val resIcon=if(isAvoided) R.drawable.ic_avoided else R.drawable.ic_done
adapter = context?.let {
AvoidedOrDoneAdapter(
requireContext(), dbHelper!!,habits,isAvoided,resIcon
)
}
rv!!.adapter = adapter
rv!!.layoutManager = LinearLayoutManager(activity)
}
}
private fun getData(): ArrayList? {
return if(isAvoided){
dbHelper?.getAvoidedHabits()
}else{
dbHelper?.getDoneHabits()
}
}
private var itemtouchhelper: ItemTouchHelper.SimpleCallback =
object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
if (direction == 8) {
val builder1 = AlertDialog.Builder(
context
)
builder1.setMessage(R.string.delete_habit)
builder1.setCancelable(true)
builder1.setPositiveButton(
"Yes"
) { dialog, id ->
val i = viewHolder.adapterPosition
dbHelper?.deleteHabit(habits[i].id)
Helper.SelectedButtonOfTodayTab = 1
habits.removeAt(i)
adapter?.notifyItemRemoved(i)
adapter?.notifyItemRangeChanged(i, habits.size)
// val intent = Intent(activity, MainActivity::class.java)
// startActivity(intent)
activity!!.overridePendingTransition(0, 0)
dialog.cancel()
}
builder1.setNegativeButton(
R.string.no
) { dialog, id ->
// val i = Intent(activity, MainActivity::class.java)
// startActivity(i)
adapter?.notifyDataSetChanged()
activity!!.overridePendingTransition(0, 0)
dialog.cancel()
}
val alert11 = builder1.create()
alert11.show()
}
}
}
companion object {
fun newInstance(someData: Boolean): AvoidedOrDoneFragment {
val fragment = AvoidedOrDoneFragment()
val args = Bundle()
args.putBoolean("ARG_DATA", someData)
fragment.arguments = args
return fragment
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/AvoidedOrDoneLogFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.adapters.AvoidedOrDoneLogAdapter
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
class AvoidedOrDoneLogFragment() : Fragment() {
private var rv: RecyclerView? = null
private var habits = ArrayList()
private var dbHelper: DatabaseUtils? = null
private var adapter: AvoidedOrDoneLogAdapter? = null
private var isAvoided: Boolean=false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.getBoolean("ARG_DATA")?.let {
isAvoided=it
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_avoided, container, false)
//Helper.SelectedButtonOfTodayTab=true;
rv = view.findViewById(R.id.rv)
dbHelper = DatabaseUtils(requireContext())
setDataInList()
return view
}
fun setDataInList() {
getData()?.let {
habits = it
rv!!.layoutManager = LinearLayoutManager(activity)
val resIcon = if (isAvoided) R.drawable.ic_avoided else R.drawable.ic_done
adapter = AvoidedOrDoneLogAdapter(
requireContext(), dbHelper!!, habits, isAvoided, resIcon
)
rv!!.adapter = adapter
rv!!.layoutManager = LinearLayoutManager(activity)
}
}
private fun getData(): ArrayList? {
return if (isAvoided) {
dbHelper?.getAvoidedHabits()
} else {
dbHelper?.getDoneHabits()
}
}
companion object {
fun newInstance(someData: Boolean): AvoidedOrDoneLogFragment {
val fragment = AvoidedOrDoneLogFragment()
val args = Bundle()
args.putBoolean("ARG_DATA", someData)
fragment.arguments = args
return fragment
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/DailyFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.graphics.Color
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.data.PieData
import com.github.mikephil.charting.data.PieDataSet
import com.github.mikephil.charting.data.PieEntry
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.FragmentDailyBinding
import rocks.poopjournal.todont.model.HabitRecord
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.HabitStatus
import rocks.poopjournal.todont.utils.SharedPrefUtils
import rocks.poopjournal.todont.fragments.HabitsLogFragment
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
class DailyFragment() : Fragment() {
private var binding: FragmentDailyBinding? = null
private val calendar: Calendar = Calendar.getInstance()
private val currentDayCalendar: Calendar = Calendar.getInstance()
private var formattedDate: String = ""
private var databaseUtils: DatabaseUtils? = null
private var habitsTotalCount: Double = 0.0
private var avoidedCount: Double = 0.0
private var avoidedPercentage: Int = 0
private var sharedPreferences: SharedPrefUtils? = null
private var initialDate: String? = null
private var avoidedHabitRecords: List? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentDailyBinding.inflate(inflater, container, false)
sharedPreferences = SharedPrefUtils(requireContext())
initialDate = sharedPreferences?.getString("InitialDate", "")
Helper.SelectedButtonOfLogTab = 1
databaseUtils = DatabaseUtils(requireContext())
val dateFormatter = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
formattedDate = dateFormatter.format(calendar.time)
binding?.apply {
date.text = formattedDate
updateHabitStatistics(formattedDate)
before.setOnClickListener { handleDateChange(-1, dateFormatter) }
after.setOnClickListener { handleDateChange(1, dateFormatter) }
}
return binding?.root
}
private fun handleDateChange(dayOffset: Int, dateFormatter: SimpleDateFormat) {
calendar.add(Calendar.DATE, dayOffset)
formattedDate = dateFormatter.format(calendar.time)
binding?.apply {
date.text = formattedDate
// before.isEnabled = formattedDate != initialDate
// after.isEnabled = formattedDate != dateFormatter.format(currentDayCalendar.time)
updateHabitStatistics(formattedDate)
}
}
private fun updateHabitStatistics(date: String) {
avoidedHabitRecords = databaseUtils?.getRecordsByDateAndStatus(date, HabitStatus.AVOIDED.value)
habitsTotalCount = databaseUtils?.getHabitsCount()?.toDouble() ?: 0.0
avoidedCount = avoidedHabitRecords?.size?.toDouble() ?: 0.0
avoidedPercentage = if (habitsTotalCount > 0) ((avoidedCount / habitsTotalCount) * 100).toInt() else 0
binding?.apply {
percentage.text = "$avoidedPercentage% "+getString(R.string.avoided)
progressText.text = getString(
if (avoidedPercentage == 100) R.string.habits_are_avoided else R.string.habits_are_avoided_way_to_go,
avoidedCount.toInt(), habitsTotalCount.toInt()
)
updatePieChart(avoidedPercentage)
}
}
private fun updatePieChart(avoidedPercentage: Int) {
binding?.pieChart?.apply {
setUsePercentValues(true)
val entries = listOf(
PieEntry(avoidedPercentage.toFloat(), getString(R.string.avoided)),
PieEntry((100 - avoidedPercentage).toFloat(), getString(R.string.habits))
)
val dataSet = PieDataSet(entries, "").apply {
valueTextColor = Color.WHITE
val lightSurface=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorOnBackground3,lightSurface,true)
val primaryColor=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorAccent,primaryColor,true)
setColors(primaryColor.data, lightSurface.data)
}
data = PieData(dataSet)
legend.isEnabled = false
description = Description().apply { text = "" }
holeRadius = 50f
val typedValue = TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorBackground, typedValue, true)
setHoleColor(typedValue.data)
transparentCircleRadius = 50f
animateXY(1000, 1000)
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/FragmentLog.kt
================================================
package rocks.poopjournal.todont.fragments
import android.os.Build
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.Fragment
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.FragmentLog2Binding
import rocks.poopjournal.todont.utils.DatabaseUtils
class FragmentLog() : Fragment() {
private var db: DatabaseUtils? = null
private var binding: FragmentLog2Binding? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
binding = FragmentLog2Binding.inflate(inflater, container, false)
val view = inflater.inflate(R.layout.fragment_log2, container, false)
db = DatabaseUtils(requireContext())
Helper.isTodaySelected = false
Helper.SelectedButtonOfLogTab = 0
binding?.dhabits?.setOnClickListener {
updateTabSelection(0, HabitsLogFragment())
}
binding?.davoided?.setOnClickListener {
val frag=AvoidedOrDoneLogFragment.newInstance(true)
updateTabSelection(1, frag)
}
binding?.ddone?.setOnClickListener {
val frag=AvoidedOrDoneLogFragment.newInstance(false)
updateTabSelection(2, frag)
}
binding!!.day.setOnClickListener {
binding!!.day.setBackgroundResource(R.drawable.continuebutton2)
binding!!.day.backgroundTintList=null
binding!!.week.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.month.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.year.setBackgroundResource(R.drawable.continuebuttontrans)
Helper.SelectedButtonOfLogTab = 0
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, DailyFragment())
ft.commit()
}
binding!!.week.setOnClickListener {
binding!!.day.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.week.setBackgroundResource(R.drawable.continuebutton2)
binding!!.week.backgroundTintList=null
binding!!.month.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.year.setBackgroundResource(R.drawable.continuebuttontrans)
Helper.SelectedButtonOfLogTab = 1
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, WeeklyFragment())
ft.commit()
}
binding!!.month.setOnClickListener {
binding!!.day.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.week.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.month.setBackgroundResource(R.drawable.continuebutton2)
binding!!.month.backgroundTintList=null
binding!!.year.setBackgroundResource(R.drawable.continuebuttontrans)
Helper.SelectedButtonOfLogTab = 2
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, MonthlyFragment())
ft.commit()
}
binding!!.year.setOnClickListener {
binding!!.day.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.week.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.month.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.year.setBackgroundResource(R.drawable.continuebutton2)
binding!!.year.backgroundTintList=null
Helper.SelectedButtonOfLogTab = 3
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, YearlyFragment())
ft.commit()
}
updateTabSelection(0, HabitsLogFragment())
when (Helper.SelectedButtonOfLogTab) {
0 -> {
binding!!.day.setBackgroundResource(R.drawable.continuebutton2)
binding!!.day.backgroundTintList=null
binding!!.week.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.month.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.year.setBackgroundResource(R.drawable.continuebuttontrans)
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, DailyFragment())
ft.commit()
}
1 -> {
binding!!.day.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.week.backgroundTintList=null
binding!!.week.setBackgroundResource(R.drawable.continuebutton2)
binding!!.month.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.year.setBackgroundResource(R.drawable.continuebuttontrans)
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, WeeklyFragment())
ft.commit()
}
2 -> {
binding!!.day.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.week.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.month.setBackgroundResource(R.drawable.continuebutton2)
binding!!.month.backgroundTintList=null
binding!!.year.setBackgroundResource(R.drawable.continuebuttontrans)
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, MonthlyFragment())
ft.commit()
}
3 -> {
binding!!.day.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.week.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.month.setBackgroundResource(R.drawable.continuebuttontrans)
binding!!.year.setBackgroundResource(R.drawable.continuebutton2)
binding!!.year.backgroundTintList=null
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerLogFragment, YearlyFragment())
ft.commit()
}
}
return binding!!.root
}
private fun updateTabSelection(selectedTab: Int, fragment: Fragment) {
Helper.SelectedButtonOfLogDailyTab = selectedTab
binding?.apply {
when(selectedTab) {
0->{
dhabits?.setBackgroundResource(R.drawable.continuebutton2)
dhabits?.backgroundTintList=null
davoided?.setBackgroundResource(R.drawable.continuebuttontrans)
ddone?.setBackgroundResource(R.drawable.continuebuttontrans)
}
1->{
dhabits?.setBackgroundResource(R.drawable.continuebuttontrans)
davoided?.setBackgroundResource(R.drawable.continuebutton2)
davoided?.backgroundTintList=null
ddone?.setBackgroundResource(R.drawable.continuebuttontrans)
}
2->{
dhabits?.setBackgroundResource(R.drawable.continuebuttontrans)
davoided?.setBackgroundResource(R.drawable.continuebuttontrans)
ddone?.setBackgroundResource(R.drawable.continuebutton2)
ddone?.backgroundTintList=null
}
else-> {
dhabits?.setBackgroundResource(R.drawable.continuebutton2)
dhabits?.backgroundTintList=null
davoided?.setBackgroundResource(R.drawable.continuebuttontrans)
ddone?.setBackgroundResource(R.drawable.continuebuttontrans)
}
}
}
activity?.supportFragmentManager?.beginTransaction()?.replace(R.id.containerLogDailyFragment, fragment)?.commit()
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/FragmentToday.kt
================================================
package rocks.poopjournal.todont.fragments
import android.content.res.ColorStateList
import android.graphics.Color
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.google.android.material.button.MaterialButton
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.MainActivity
import rocks.poopjournal.todont.R
class FragmentToday : Fragment() {
var avoided: MaterialButton? = null
var done: Button? = null
var habits: Button? = null
private lateinit var habitsFrags: HabitsFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.getBoolean("ARG_DATA")?.let {
habitsFrags = HabitsFragment.newInstance(it)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_today2, container, false)
Helper.isTodaySelected = true
avoided = view.findViewById(R.id.avoided)
done = view.findViewById(R.id.done)
habits = view.findViewById(R.id.habits)
if (Helper.SelectedButtonOfTodayTab == 0) {
habits?.setBackgroundResource(R.drawable.continuebutton2)
habits?.backgroundTintList = null
(requireActivity() as MainActivity)?.showFAB()
avoided?.setBackgroundResource(R.drawable.continuebuttontrans)
done?.setBackgroundResource(R.drawable.continuebuttontrans)
replaceFragment(habitsFrags)
} else if (Helper.SelectedButtonOfTodayTab == 1) {
habits?.setBackgroundResource(R.drawable.continuebuttontrans)
avoided?.setBackgroundResource(R.drawable.continuebutton2)
avoided?.backgroundTintList = null
(requireActivity() as MainActivity)?.hideFAB()
done?.setBackgroundResource(R.drawable.continuebuttontrans)
val frag = AvoidedOrDoneFragment.newInstance(true)
replaceFragment(frag)
} else if (Helper.SelectedButtonOfTodayTab == 2) {
habits?.setBackgroundResource(R.drawable.continuebuttontrans)
avoided?.setBackgroundResource(R.drawable.continuebuttontrans)
done?.setBackgroundResource(R.drawable.continuebutton2)
(requireActivity() as MainActivity)?.hideFAB()
done?.backgroundTintList = null
val frag = AvoidedOrDoneFragment.newInstance(false)
replaceFragment(frag)
}
habits?.setOnClickListener(View.OnClickListener {
habits?.setBackgroundResource(R.drawable.continuebutton2)
habits?.backgroundTintList = null
(requireActivity() as MainActivity)?.showFAB()
avoided?.setBackgroundResource(R.drawable.continuebuttontrans)
done?.setBackgroundResource(R.drawable.continuebuttontrans)
replaceFragment(habitsFrags)
})
avoided?.setOnClickListener(View.OnClickListener {
habits?.setBackgroundResource(R.drawable.continuebuttontrans)
avoided?.setBackgroundResource(R.drawable.continuebutton2)
avoided?.backgroundTintList = null
(requireActivity() as MainActivity)?.hideFAB()
done?.setBackgroundResource(R.drawable.continuebuttontrans)
val frag = AvoidedOrDoneFragment.newInstance(true)
replaceFragment(frag)
})
done?.setOnClickListener(View.OnClickListener {
habits?.setBackgroundResource(R.drawable.continuebuttontrans)
avoided?.setBackgroundResource(R.drawable.continuebuttontrans)
done?.setBackgroundResource(R.drawable.continuebutton2)
(requireActivity() as MainActivity)?.hideFAB()
done?.backgroundTintList = null
val frag = AvoidedOrDoneFragment.newInstance(false)
replaceFragment(frag)
})
return view
}
fun addNewHabit() {
habitsFrags.addNewHabit()
}
fun replaceFragment(fragment: Fragment) {
val ft = requireActivity().supportFragmentManager.beginTransaction()
ft.replace(R.id.containerTodayFragment, fragment)
ft.commit()
}
companion object {
fun newInstance(someData: Boolean): FragmentToday {
val fragment = FragmentToday()
val args = Bundle()
args.putBoolean("ARG_DATA", someData)
fragment.arguments = args
return fragment
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/HabitsFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.app.Activity
import android.app.AlertDialog
import android.app.Dialog
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.google.android.material.floatingactionbutton.FloatingActionButton
import jp.wasabeef.glide.transformations.BlurTransformation
import rocks.poopjournal.todont.adapters.HabitsAdapter
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.DialogboxAddNewHabitBinding
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.model.Label
import rocks.poopjournal.todont.showcaseview.ShowcaseViewBuilder
import rocks.poopjournal.todont.showcaseview.ShowcaseViewBuilder.Companion.init
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.SharedPrefUtils
import smartdevelop.ir.eram.showcaseviewlib.GuideView
import smartdevelop.ir.eram.showcaseviewlib.config.DismissType
import smartdevelop.ir.eram.showcaseviewlib.config.Gravity
import smartdevelop.ir.eram.showcaseviewlib.config.PointerType
import java.io.File
import java.io.FileOutputStream
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class HabitsFragment() : Fragment() {
private var rv: RecyclerView? = null
private var habitsList = ArrayList()
private var date: Date = Calendar.getInstance().time
private var selectedLabel: Label? = null
private var dbHelper: DatabaseUtils? = null
private var adapter: HabitsAdapter? = null
private var tvNoHabits: TextView? = null
private var showcaseViewBuilder: ShowcaseViewBuilder? = null
private var prefUtils: SharedPrefUtils? = null
private val PICK_IMAGE_REQUEST = 1001
private var selectedImageUri: Uri? = null
private var addNewHabit=false;
private var dialogView: DialogboxAddNewHabitBinding? = null;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.getBoolean("ARG_DATA")?.let {
addNewHabit=it
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_habits, container, false)
Helper.SelectedButtonOfTodayTab = 0
rv = view.findViewById(R.id.rv)
dbHelper = DatabaseUtils(requireContext())
showcaseViewBuilder = init(requireActivity())
prefUtils = SharedPrefUtils(requireActivity())
// tv1 = view.findViewById(R.id.a);
tvNoHabits = view.findViewById(R.id.b)
if(addNewHabit){
addNewHabit()
addNewHabit=false
}
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
override fun onResume() {
super.onResume()
setDataInList()
}
fun addNewHabit() {
val labelCount = dbHelper?.getLabelsCount()
if (labelCount == 0) {
Toast.makeText(activity, R.string.please_add_a_label_first, Toast.LENGTH_LONG)
.show()
} else {
val dateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
val formattedDate = dateFormat.format(date)
val dialog = Dialog(requireActivity())
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialogView = DialogboxAddNewHabitBinding.inflate(layoutInflater)
dialog.setContentView(dialogView!!.root)
val lp = dialog.window!!.attributes
lp.dimAmount = 0.9f
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val window = dialog.window
window!!.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
dialog.window!!.attributes = lp
if (labelCount == 0) {
dialogView!!.txt.visibility = View.VISIBLE
dialogView!!.spinner.visibility = View.GONE
} else {
dialogView!!.txt.visibility = View.GONE
dialogView!!.spinner.visibility = View.VISIBLE
}
val labels = dbHelper?.getAllLabels()!!
labels.add(0, Label(-1, "Select a label"))
val arrayAdapter = ArrayAdapter(
requireActivity(),
android.R.layout.simple_spinner_item,
labels
)
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
dialogView!!.spinner.adapter = arrayAdapter
dialogView!!.spinner.onItemSelectedListener =
object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(
adapterView: AdapterView<*>,
view: View,
i: Int,
l: Long
) {
if (i != 0) {
selectedLabel = labels[i]
val typedValue = TypedValue()
requireContext().theme.resolveAttribute(
R.attr.colorOnBackground2,
typedValue,
true
)
(adapterView.getChildAt(0) as TextView).setTextColor(
typedValue.data
)
}
}
override fun onNothingSelected(adapterView: AdapterView<*>?) {
}
}
dialogView!!.btnSelectImg.setOnClickListener {
openImagePicker()
}
dialogView!!.saveTaskButton.setOnClickListener {
val habit_text = dialogView?.habit?.text.toString()
val detail_text = dialogView?.detail?.text.toString()
val imageUriString = selectedImageUri?.toString()
dbHelper?.insertHabit(
Habit(
date = formattedDate,
name = habit_text,
description = detail_text,
countAvoided = 0,
countDone = 0,
labelId = selectedLabel?.labelId!!,
coverImageUri = imageUriString // Add this line
)
)
// Reset image selection
selectedImageUri = null
dialogView?.frameSelectedImage?.visibility = View.GONE
Helper.SelectedButtonOfTodayTab = 0
// val i = Intent(activity, MainActivity::class.java)
// startActivity(i)
setDataInList()
requireActivity().overridePendingTransition(0, 0)
dialog.dismiss()
}
dialogView!!.spinner.adapter = arrayAdapter
dialog.show()
}
}
// Function to load image with blur effect
private fun loadImageWithBlur(imageUri: Uri) {
// Show both ImageViews
dialogView?.frameSelectedImage?.visibility = View.VISIBLE
// Load blurred image into background ImageView
dialogView?.ivBlurredBackground?.let {
Glide.with(requireContext())
.load(imageUri)
.apply(RequestOptions.bitmapTransform(BlurTransformation(25, 3)))
.into(it)
}
// Load normal image into foreground ImageView
dialogView?.ivSelectedImage?.let {
Glide.with(requireContext())
.load(imageUri)
.into(it)
}
}
// Add this function to handle image selection
private fun openImagePicker() {
val intent = Intent(Intent.ACTION_PICK).apply {
type = "image/*"
putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/jpeg", "image/png"))
}
startActivityForResult(intent, PICK_IMAGE_REQUEST)
}
// Handle the result
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {
val inputUri = data?.data
inputUri?.let { uri ->
// Save the image to internal storage and get the new URI
val savedImageUri = saveImageToInternalStorage(uri)
savedImageUri?.let {
// Set the selectedImageUri to the URI of the saved image
selectedImageUri = it
// Load the image (e.g., with blur)
loadImageWithBlur(it)
}
}
}
}
private fun saveImageToInternalStorage(uri: Uri): Uri? {
return try {
// Open an input stream from the original URI
val inputStream = requireContext().contentResolver.openInputStream(uri)
inputStream?.use { stream ->
// Get the internal storage directory for the app
val directory = File(requireContext().filesDir, "Cover_Images")
if (!directory.exists()) {
directory.mkdirs() // Create the directory if it doesn't exist
}
// Create a file in the app's internal storage
val fileName = "image_${System.currentTimeMillis()}.jpg"
val file = File(directory, fileName)
// Write the image data to the file
val outputStream = FileOutputStream(file)
outputStream.use { out ->
stream.copyTo(out)
}
// Return the URI of the saved file
Uri.fromFile(file)
}
} catch (e: Exception) {
e.printStackTrace()
null
}
}
private fun setDataInList() {
dbHelper?.getAllHabits()?.let {
habitsList = it
if (habitsList.isNotEmpty()) {
tvNoHabits?.visibility = View.INVISIBLE
rv?.layoutManager = LinearLayoutManager(activity)
ItemTouchHelper(itemtouchhelper).attachToRecyclerView(rv)
adapter =
HabitsAdapter(
requireContext(),
dbHelper!!, habitsList
)
rv!!.adapter = adapter
rv!!.layoutManager = LinearLayoutManager(activity)
} else {
tvNoHabits?.visibility = View.VISIBLE
}
} ?: run { tvNoHabits?.setVisibility(View.VISIBLE) }
}
var itemtouchhelper: ItemTouchHelper.SimpleCallback =
object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
if (direction == 8) {
val builder1 = AlertDialog.Builder(
context
)
builder1.setMessage(R.string.do_you_really_want_to_delete_this)
builder1.setCancelable(true)
builder1.setPositiveButton(
R.string.yes
) { dialog, id ->
val i = viewHolder.adapterPosition
habitsList[i].coverImageUri?.let { it1 -> deleteImageFromInternalStorage(it1) }
dbHelper?.deleteHabit(habitsList[i].id)
dbHelper?.deleteAllHabitRecords(habitsList[i].id)
Helper.SelectedButtonOfTodayTab = 0
habitsList.removeAt(i)
adapter?.notifyItemRemoved(i)
adapter?.notifyItemRangeChanged(0, habitsList.size)
// val intent = Intent(activity, MainActivity::class.java)
// startActivity(intent)
activity!!.overridePendingTransition(0, 0)
dialog.cancel()
}
builder1.setNegativeButton(
R.string.no
) { dialog, id ->
Helper.SelectedButtonOfTodayTab = 0
// val i = Intent(activity, MainActivity::class.java)
// startActivity(i)
adapter?.notifyDataSetChanged()
activity!!.overridePendingTransition(0, 0)
dialog.cancel()
}
val alert11 = builder1.create()
alert11.show()
}
}
private fun deleteImageFromInternalStorage(uriString: String): Boolean {
val uri = Uri.parse(uriString)
return try {
// Convert the URI to a File object
val file = File(uri.path)
// Check if the file exists and delete it
if (file.exists()) {
file.delete()
} else {
false // File does not exist
}
} catch (e: Exception) {
e.printStackTrace()
false
}
}
}
companion object {
fun newInstance(someData: Boolean): HabitsFragment {
val fragment = HabitsFragment()
val args = Bundle()
args.putBoolean("ARG_DATA", someData)
fragment.arguments = args
return fragment
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/HabitsLogFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import rocks.poopjournal.todont.adapters.HabitsLogAdapter
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
class HabitsLogFragment : Fragment() {
var rv: RecyclerView? = null
var habitsList = ArrayList()
private var dbHelper: DatabaseUtils? = null
private var adapter: HabitsLogAdapter? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_log_habits, container, false)
rv = view.findViewById(R.id.rv)
dbHelper = DatabaseUtils(requireContext())
setDataInList()
return view
}
private fun setDataInList() {
dbHelper?.getAllHabits()?.let {
habitsList = it
if (habitsList.isNotEmpty()) {
rv?.layoutManager = LinearLayoutManager(activity)
adapter =
HabitsLogAdapter(
requireContext(),
dbHelper!!, habitsList
)
rv!!.adapter = adapter
rv!!.layoutManager = LinearLayoutManager(activity)
}
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/MonthlyFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.graphics.Color
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.IntegerRes
import androidx.fragment.app.Fragment
import com.github.mikephil.charting.charts.PieChart
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.data.PieData
import com.github.mikephil.charting.data.PieDataSet
import com.github.mikephil.charting.data.PieEntry
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.SharedPrefUtils
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class MonthlyFragment : Fragment() {
private lateinit var calendar: Calendar
private lateinit var dbHelper: DatabaseUtils
private lateinit var dateFormatter: SimpleDateFormat
private lateinit var pieChart: PieChart
private lateinit var dateText: TextView
private lateinit var yearText: TextView
private lateinit var mostAvoidedText: TextView
private lateinit var leastAvoidedText: TextView
private lateinit var dateRangeText: TextView
private lateinit var btnBefore: ImageView
private lateinit var btnAfter: ImageView
private var currentMonth: String = ""
private var habitsSize: Double = 0.0
private var avoidedSize: Double = 0.0
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_monthly, container, false)
initViews(view)
setupInitialData()
setupListeners()
return view
}
private fun initViews(view: View) {
dbHelper = DatabaseUtils(requireContext())
dateFormatter = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
pieChart = view.findViewById(R.id.pieChart)
dateText = view.findViewById(R.id.date)
yearText = view.findViewById(R.id.year)
mostAvoidedText = view.findViewById(R.id.mostavoided)
leastAvoidedText = view.findViewById(R.id.leastavoided)
dateRangeText = view.findViewById(R.id.daterange)
btnBefore = view.findViewById(R.id.before)
btnAfter = view.findViewById(R.id.after)
btnBefore.setBackgroundResource(R.drawable.ic_backarrow)
btnAfter.setBackgroundResource(R.drawable.ic_nextarrow)
}
private fun setupInitialData() {
calendar = Calendar.getInstance()
val currentDate = dateFormatter.format(calendar.time).split("-")
currentMonth = getMonthName(currentDate[1])
val currentYear = currentDate[0]
dateText.text = currentMonth
yearText.text = currentYear
val monthStart = "${currentYear}-${currentDate[1]}-01"
val monthEnd = "${currentYear}-${currentDate[1]}-31"
habitsSize = (dbHelper.getHabitsCount() * 30).toDouble()
avoidedSize = dbHelper.getMonthlyAvoidedDataList(monthStart, monthEnd).size.toDouble()
val percentageAvoided = (avoidedSize / habitsSize) * 100
dbHelper.getMonthlyAvoidedData(monthStart, monthEnd).apply {
if(this.isNotEmpty()){
mostAvoidedText.text = dbHelper.getHabitById(this.toInt())?.name
mostAvoidedText.visibility = View.VISIBLE
}else{
mostAvoidedText.visibility = View.GONE
}
}
dbHelper.getMonthlyDoneData(monthStart, monthEnd).apply {
if(this.isNotEmpty()){
leastAvoidedText.text =dbHelper.getHabitById(this.toInt())?.name
leastAvoidedText.visibility = View.VISIBLE
}else{
leastAvoidedText.visibility = View.GONE
}
}
setupPieChart(percentageAvoided.toInt())
}
private fun setupListeners() {
btnBefore.setOnClickListener {
updateMonthData(isNext = false)
}
btnAfter.setOnClickListener {
updateMonthData(isNext = true)
}
}
private fun updateMonthData(isNext: Boolean) {
val currentMonthIndex = calendar.get(Calendar.MONTH)
calendar.set(Calendar.MONTH, if (isNext) currentMonthIndex + 1 else currentMonthIndex - 1)
val newMonth = calendar.get(Calendar.MONTH) + 1 // 0-based index
val newYear = calendar.get(Calendar.YEAR)
currentMonth = getMonthName(newMonth.toString().padStart(2, '0'))
dateText.text = currentMonth
yearText.text = newYear.toString()
val monthStart = "${newYear}-${newMonth.toString().padStart(2, '0')}-01"
val monthEnd = "${newYear}-${newMonth.toString().padStart(2, '0')}-31"
dbHelper.getMonthlyAvoidedData(monthStart, monthEnd).apply {
if(this.isNotEmpty()){
mostAvoidedText.text = dbHelper.getHabitById(this.toInt())?.name
mostAvoidedText.visibility = View.VISIBLE
}else{
mostAvoidedText.visibility = View.GONE
}
}
dbHelper.getMonthlyDoneData(monthStart, monthEnd).apply {
if(this.isNotEmpty()){
leastAvoidedText.text =dbHelper.getHabitById(this.toInt())?.name
leastAvoidedText.visibility = View.VISIBLE
}else{
leastAvoidedText.visibility = View.GONE
}
}
avoidedSize = dbHelper.getMonthlyAvoidedDataList(monthStart, monthEnd).size.toDouble()
val percentageAvoided = (avoidedSize / habitsSize) * 100
setupPieChart(percentageAvoided.toInt())
}
private fun setupPieChart(avoidedPercentage: Int) {
val pieEntries = listOf(
PieEntry(avoidedPercentage.toFloat(), getString(R.string.avoided)),
PieEntry((100 - avoidedPercentage).toFloat(), getString(R.string.habits))
)
val pieDataSet = PieDataSet(pieEntries, "").apply {
val lightSurface=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorOnBackground3,lightSurface,true)
val primaryColor=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorAccent,primaryColor,true)
setColors(primaryColor.data, lightSurface.data)
valueTextColor = Color.WHITE
}
pieChart.data = PieData(pieDataSet).apply {
setValueTextColor(Color.WHITE)
}
pieChart.apply {
legend.isEnabled = false
description = Description().apply { text = "" }
holeRadius = 50f
val typedValue = TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorBackground, typedValue, true)
setHoleColor(typedValue.data)
transparentCircleRadius = 50f
animateXY(1000, 1000)
}
}
private fun getMonthName(monthNumber: String): String {
return resources.getStringArray(R.array.month_names)[monthNumber.toInt() - 1]
}
private fun getTodayDate(): String {
var date: Date = Calendar.getInstance().time
val dateFormat: SimpleDateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
var formattedDate: String = dateFormat.format(date)
//Calendar.getInstance().timeInMillis.toString()
return formattedDate
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/WeeklyFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.IntegerRes
import androidx.fragment.app.Fragment
import com.github.mikephil.charting.charts.PieChart
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.data.PieData
import com.github.mikephil.charting.data.PieDataSet
import com.github.mikephil.charting.data.PieEntry
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.SharedPrefUtils
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class WeeklyFragment : Fragment() {
private lateinit var calendar: Calendar
private lateinit var dateFormatter: SimpleDateFormat
private lateinit var dbHelper: DatabaseUtils
private var dateTextView: TextView? = null
private var mostAvoidedTextView: TextView? = null
private var leastAvoidedTextView: TextView? = null
private var dateRangeTextView: TextView? = null
private var previousButton: ImageView? = null
private var nextButton: ImageView? = null
private var pieChart: PieChart? = null
private var startDate: String = ""
private var endDate: String = ""
private var habitCount: Double = 0.0
private var avoidedCount: Double = 0.0
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_weekly, container, false)
// Initialize components
initializeComponents(view)
updateDateRangeAndRecords()
// Set button listeners
setupButtonListeners()
return view
}
private fun initializeComponents(view: View) {
dbHelper = DatabaseUtils(requireContext())
dateFormatter = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
calendar = Calendar.getInstance()
getDates()
dateTextView = view.findViewById(R.id.date)
mostAvoidedTextView = view.findViewById(R.id.mostavoided)
leastAvoidedTextView = view.findViewById(R.id.leastavoided)
dateRangeTextView = view.findViewById(R.id.daterange)
previousButton = view.findViewById(R.id.before)
nextButton = view.findViewById(R.id.after)
pieChart = view.findViewById(R.id.pieChart)
previousButton?.setBackgroundResource(R.drawable.ic_backarrow)
nextButton?.setBackgroundResource(R.drawable.ic_nextarrow)
dateTextView?.text = dateFormatter.format(calendar.time)
}
private fun getDates() {
startDate = getTodayDate()
calendar.add(Calendar.DATE, 7)
endDate = dateFormatter.format(calendar.time)
}
private fun setupButtonListeners() {
previousButton?.setOnClickListener {
handlePreviousButtonClick()
}
nextButton?.setOnClickListener {
handleNextButtonClick()
}
}
private fun handlePreviousButtonClick() {
previousButton?.setBackgroundResource(R.drawable.ic_backarrowpressed)
Handler().postDelayed({
previousButton?.setBackgroundResource(R.drawable.ic_backarrow)
}, 100)
adjustDateBy(-7)
updateDateRangeAndRecords()
}
private fun handleNextButtonClick() {
nextButton?.setBackgroundResource(R.drawable.ic_nextpressed)
Handler().postDelayed({
nextButton?.setBackgroundResource(R.drawable.ic_nextarrow)
}, 100)
adjustDateBy(7)
updateDateRangeAndRecords()
}
private fun adjustDateBy(days: Int) {
if (days < 0) {
calendar = getCalendarFromFormattedDate(startDate)
endDate = startDate
calendar.add(Calendar.DATE, days)
startDate = dateFormatter.format(calendar.time)
} else {
calendar = getCalendarFromFormattedDate(endDate)
startDate = endDate
calendar.add(Calendar.DATE, days)
endDate = dateFormatter.format(calendar.time)
}
dateTextView?.text = "$startDate To $endDate"
}
private fun updateDateRangeAndRecords() {
dateRangeTextView?.text = "$startDate To $endDate"
val mostAvoided = dbHelper.getWeeklyAvoidedRecord(startDate, endDate)
val leastAvoided = dbHelper.getWeeklyDoneRecord(startDate, endDate)
if (mostAvoided.isNotEmpty()) {
mostAvoidedTextView?.text =
dbHelper.getHabitById(Integer.parseInt(mostAvoided))?.name
mostAvoidedTextView?.visibility = View.VISIBLE
} else {
mostAvoidedTextView?.visibility = View.GONE
}
if (leastAvoided.isNotEmpty()) {
leastAvoidedTextView?.visibility = View.VISIBLE
leastAvoidedTextView?.text =
dbHelper.getHabitById(Integer.parseInt(leastAvoided))?.name
} else {
leastAvoidedTextView?.visibility = View.GONE
}
habitCount = dbHelper.getHabitsCount() * 7.0
avoidedCount = dbHelper.getWeeklyAvoidedRecordList(startDate, endDate).size.toDouble()
val avoidedPercentage = calculateAvoidedPercentage()
updatePieChart(avoidedPercentage)
}
private fun calculateAvoidedPercentage(): Int {
return if (habitCount == 0.0) 0 else ((avoidedCount / habitCount) * 100).toInt()
}
private fun updatePieChart(avoidedPercentage: Int) {
pieChart?.apply {
setUsePercentValues(true)
data = PieData(PieDataSet(
listOf(
PieEntry(avoidedPercentage.toFloat(), getString(R.string.avoided)),
PieEntry((100 - avoidedPercentage).toFloat(), getString(R.string.habits))
),
""
).apply {
val lightSurface=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorOnBackground3,lightSurface,true)
val primaryColor=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorAccent,primaryColor,true)
setColors(primaryColor.data, lightSurface.data)
valueTextColor = Color.WHITE
})
legend.isEnabled = false
description = Description().apply { text = "" }
holeRadius = 50f
val typedValue = TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorBackground, typedValue, true)
setHoleColor(typedValue.data)
transparentCircleRadius = 50f
animateXY(1000, 1000)
}
}
private fun getTodayDate(): String {
var date: Date = Calendar.getInstance().time
val dateFormat: SimpleDateFormat =
SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
var formattedDate: String = dateFormat.format(date)
calendar.timeInMillis = Calendar.getInstance().timeInMillis
return formattedDate
}
fun getCalendarFromFormattedDate(formattedDate: String): Calendar {
val dateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
val date =
dateFormat.parse(formattedDate) // Parse the formatted date string into a Date object
val calendar = Calendar.getInstance()
calendar.time = date // Set the Calendar time to the parsed date
return calendar
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/YearlyFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.content.Context
import android.content.SharedPreferences
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import com.github.mikephil.charting.charts.PieChart
import com.github.mikephil.charting.components.Description
import com.github.mikephil.charting.data.PieData
import com.github.mikephil.charting.data.PieDataSet
import com.github.mikephil.charting.data.PieEntry
import rocks.poopjournal.todont.Helper
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
import rocks.poopjournal.todont.utils.SharedPrefUtils
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class YearlyFragment : Fragment() {
private lateinit var calendar: Calendar
private lateinit var dbHelper: DatabaseUtils
private lateinit var dateFormat: SimpleDateFormat
private lateinit var preferences: SharedPrefUtils
private var pieChart: PieChart? = null
private var currentYear: Int = 0
private var initialDate: String? = null
private lateinit var yearText: TextView
private lateinit var mostAvoidedText: TextView
private lateinit var leastAvoidedText: TextView
private lateinit var dateRangeText: TextView
private lateinit var btnPrevious: ImageView
private lateinit var btnNext: ImageView
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view = inflater.inflate(R.layout.fragment_yearly, container, false)
initializeComponents(view)
setupInitialData()
updateYearData()
btnPrevious.setOnClickListener {
updateYear(-1)
}
btnNext.setOnClickListener {
updateYear(1)
}
return view
}
private fun initializeComponents(view: View) {
dbHelper = DatabaseUtils(requireContext())
dateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
preferences = SharedPrefUtils(requireContext())
yearText = view.findViewById(R.id.year)
mostAvoidedText = view.findViewById(R.id.mostavoided)
leastAvoidedText = view.findViewById(R.id.leastavoided)
dateRangeText = view.findViewById(R.id.daterange)
btnPrevious = view.findViewById(R.id.before)
btnNext = view.findViewById(R.id.after)
pieChart = view.findViewById(R.id.pieChart)
btnPrevious.setBackgroundResource(R.drawable.ic_backarrow)
btnNext.setBackgroundResource(R.drawable.ic_nextarrow)
}
private fun setupInitialData() {
calendar = Calendar.getInstance()
currentYear = calendar.get(Calendar.YEAR)
yearText.text = currentYear.toString()
initialDate = preferences.getString("InitialDate", getTodayDate())
Helper.SelectedButtonOfLogTab = 3
}
private fun updateYear(offset: Int) {
currentYear += offset
yearText.text = currentYear.toString()
Handler().postDelayed({
btnPrevious.setBackgroundResource(R.drawable.ic_backarrow)
}, 100)
updateYearData()
// btnPrevious.isEnabled = initialDate?.split("-")?.get(0)?.toInt() != currentYear
// btnNext.isEnabled = currentYear != Calendar.getInstance().get(Calendar.YEAR)
}
private fun updateYearData() {
val startDate = "$currentYear-01-01"
val endDate = "$currentYear-12-31"
val avoided = dbHelper.getYearlyAvoidedData(startDate, endDate)
val done = dbHelper.getYearlyDoneData(startDate, endDate)
if(avoided.isNotEmpty()){
mostAvoidedText.text = dbHelper?.getHabitById(avoided.toInt())?.name
mostAvoidedText.visibility=View.VISIBLE
}else{
mostAvoidedText.visibility=View.GONE
}
if(done.isNotEmpty()){
leastAvoidedText.text = dbHelper?.getHabitById(done.toInt())?.name
leastAvoidedText.visibility=View.VISIBLE
}else{
leastAvoidedText.visibility=View.GONE
}
val totalHabits = dbHelper.getHabitsCount() * 365.0
val avoidedCount = dbHelper.getYearlyAvoidedDataList(startDate, endDate).size.toDouble()
val percentage = (avoidedCount / totalHabits) * 100
setupPieChart(percentage.toInt())
}
private fun setupPieChart(avoidedPercentage: Int) {
pieChart?.apply {
setUsePercentValues(true)
val entries = listOf(
PieEntry(avoidedPercentage.toFloat(), getString(R.string.avoided)),
PieEntry((100 - avoidedPercentage).toFloat(), getString(R.string.habits))
)
val dataSet = PieDataSet(entries, "").apply {
valueTextColor = Color.WHITE
val lightSurface=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorOnBackground3,lightSurface,true)
val primaryColor=TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorAccent,primaryColor,true)
setColors(primaryColor.data, lightSurface.data)
}
data = PieData(dataSet)
description = Description().apply { text = "" }
holeRadius = 50f
transparentCircleRadius = 50f
val typedValue = TypedValue()
requireContext().theme.resolveAttribute(R.attr.colorBackground, typedValue, true)
setHoleColor(typedValue.data)
animateXY(1000, 1000)
}
}
private fun getTodayDate(): String {
var date: Date = Calendar.getInstance().time
val dateFormat: SimpleDateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
var formattedDate: String = dateFormat.format(date)
//Calendar.getInstance().timeInMillis.toString()
return formattedDate
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/fragments/menuFragment.kt
================================================
package rocks.poopjournal.todont.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import rocks.poopjournal.todont.R
class menuFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.menu_fragment, container, false)
return view
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/model/Alarm.kt
================================================
package rocks.poopjournal.todont.model
import rocks.poopjournal.todont.utils.Constants
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
class Alarm // Constructor
(// Getters and setters
var habitId:Int?,var alarmTime: Long, var frequency: String
) {
val formattedAlarmTime: String
// Optional: Convert alarm time to readable format (for display purposes)
get() {
val sdf =
SimpleDateFormat(Constants.DATE_TIME_FORMAT, Locale.getDefault())
return sdf.format(Date(alarmTime))
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/model/Habit.kt
================================================
package rocks.poopjournal.todont.model
data class Habit(
val id: Int? = null,
val date: String,
val name: String,
val description: String?,
var countAvoided: Int,
var countDone: Int,
val labelId: Int,
val coverImageUri: String? = null // Add this line
) {
var label: Label? = null
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/model/HabitRecord.kt
================================================
package rocks.poopjournal.todont.model
import rocks.poopjournal.todont.utils.HabitStatus
data class HabitRecord (
val id: Int? = null,
val date: String,
val status: String,
val habitId: Int?,
)
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/model/Label.kt
================================================
package rocks.poopjournal.todont.model
data class Label (
var labelId: Int? = null,
var name: String? = null,
){
var habitCount: Int = 0
override fun toString(): String {
return name!!
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/showcaseview/RippleBackground.kt
================================================
package rocks.poopjournal.todont.showcaseview
import android.animation.Animator
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.annotation.TargetApi
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.os.Build
import android.util.AttributeSet
import android.view.View
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.RelativeLayout
import rocks.poopjournal.todont.R
import kotlin.math.min
class RippleBackground : RelativeLayout {
private var rippleColor = 0
private var rippleStrokeWidth = 0f
private var rippleRadius = 0f
private var rippleDurationTime = 0
private var rippleAmount = 0
private var rippleDelay = 0
private var rippleScale = 0f
private var rippleType = 0
private var paint: Paint? = null
var isRippleAnimationRunning: Boolean = false
private set
private var animatorSet: AnimatorSet? = null
private var animatorList: ArrayList? = null
private var rippleParams: LayoutParams? = null
private val rippleViewList = ArrayList()
constructor(context: Context?) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init(context, attrs)
}
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
) {
init(context, attrs)
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
private fun init(context: Context, attrs: AttributeSet) {
if (isInEditMode) return
requireNotNull(attrs) { "Attributes should be provided to this view," }
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.RippleBackground)
rippleColor = typedArray.getColor(
R.styleable.RippleBackground_rb_color,
resources.getColor(android.R.color.holo_red_light)
)
rippleStrokeWidth = typedArray.getDimension(R.styleable.RippleBackground_rb_strokeWidth, 4f)
rippleRadius = typedArray.getDimension(R.styleable.RippleBackground_rb_radius, 4f)
rippleDurationTime =
typedArray.getInt(R.styleable.RippleBackground_rb_duration, DEFAULT_DURATION_TIME)
rippleAmount =
typedArray.getInt(R.styleable.RippleBackground_rb_rippleAmount, DEFAULT_RIPPLE_COUNT)
rippleScale = typedArray.getFloat(R.styleable.RippleBackground_rb_scale, DEFAULT_SCALE)
rippleType = typedArray.getInt(R.styleable.RippleBackground_rb_type, DEFAULT_FILL_TYPE)
typedArray.recycle()
rippleDelay = rippleDurationTime / rippleAmount
paint = Paint()
paint!!.isAntiAlias = true
if (rippleType == DEFAULT_FILL_TYPE) {
rippleStrokeWidth = 0f
paint!!.style = Paint.Style.FILL
} else paint!!.style = Paint.Style.STROKE
paint!!.color = rippleColor
rippleParams = LayoutParams(
(2 * (rippleRadius + rippleStrokeWidth)).toInt(),
(2 * (rippleRadius + rippleStrokeWidth)).toInt()
)
rippleParams!!.addRule(CENTER_IN_PARENT, TRUE)
animatorSet = AnimatorSet()
animatorSet!!.interpolator = AccelerateDecelerateInterpolator()
animatorList = ArrayList()
for (i in 0 until rippleAmount) {
val rippleView = RippleView(getContext())
addView(rippleView, rippleParams)
rippleViewList.add(rippleView)
val scaleXAnimator = ObjectAnimator.ofFloat(rippleView, "ScaleX", 1.0f, rippleScale)
scaleXAnimator.repeatCount = ObjectAnimator.INFINITE
scaleXAnimator.repeatMode = ObjectAnimator.RESTART
scaleXAnimator.startDelay = (i * rippleDelay).toLong()
scaleXAnimator.setDuration(rippleDurationTime.toLong())
animatorList!!.add(scaleXAnimator)
val scaleYAnimator = ObjectAnimator.ofFloat(rippleView, "ScaleY", 1.0f, rippleScale)
scaleYAnimator.repeatCount = ObjectAnimator.INFINITE
scaleYAnimator.repeatMode = ObjectAnimator.RESTART
scaleYAnimator.startDelay = (i * rippleDelay).toLong()
scaleYAnimator.setDuration(rippleDurationTime.toLong())
animatorList!!.add(scaleYAnimator)
val alphaAnimator = ObjectAnimator.ofFloat(rippleView, "Alpha", 1.0f, 0f)
alphaAnimator.repeatCount = ObjectAnimator.INFINITE
alphaAnimator.repeatMode = ObjectAnimator.RESTART
alphaAnimator.startDelay = (i * rippleDelay).toLong()
alphaAnimator.setDuration(rippleDurationTime.toLong())
animatorList!!.add(alphaAnimator)
}
animatorSet!!.playTogether(animatorList)
}
private inner class RippleView(context: Context?) : View(context) {
init {
this.visibility = INVISIBLE
}
override fun onDraw(canvas: Canvas) {
val radius = ((min(
width.toDouble(),
height.toDouble()
)) / 2).toInt()
canvas.drawCircle(
radius.toFloat(), radius.toFloat(), radius - rippleStrokeWidth,
paint!!
)
}
}
fun startRippleAnimation() {
if (!isRippleAnimationRunning) {
for (rippleView in rippleViewList) {
rippleView.visibility = VISIBLE
}
animatorSet!!.start()
isRippleAnimationRunning = true
}
}
fun stopRippleAnimation() {
if (isRippleAnimationRunning) {
animatorSet!!.end()
isRippleAnimationRunning = false
}
}
companion object {
private const val DEFAULT_RIPPLE_COUNT = 6
private const val DEFAULT_DURATION_TIME = 3000
private const val DEFAULT_SCALE = 6.0f
private const val DEFAULT_FILL_TYPE = 0
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/showcaseview/ShowcaseViewBuilder.kt
================================================
package rocks.poopjournal.todont.showcaseview
import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.Rect
import android.graphics.RectF
import android.graphics.drawable.Drawable
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.Log
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.View.OnTouchListener
import android.view.ViewGroup
import android.view.ViewTreeObserver.OnGlobalLayoutListener
import android.widget.LinearLayout
class ShowcaseViewBuilder : View, OnTouchListener {
private var mActivity: Activity? = null
private var mTargetView: View? = null
private val mCustomView: MutableList = ArrayList()
private val mCustomViewLeftMargins: MutableList = ArrayList()
private val mCustomViewTopMargins: MutableList = ArrayList()
private val mCustomViewRightMargins: MutableList = ArrayList()
private val mCustomViewBottomMargins: MutableList = ArrayList()
private val mCustomViewGravity: MutableList = ArrayList()
private var mCenterX = 0f
private var mCenterY = 0f
private var mRadius = 0f
private var mMarkerDrawable: Drawable? = null
private var mMarkerDrawableGravity = 0
private var ringColor = 0
private var backgroundOverlayColor = 0
private var mCustomViewMargin = 0
private var mShape = SHAPE_CIRCLE
private var mBgOverlayShape = FULL_SCREEN
private var mRoundRectCorner = 0
private val idsRectMap = HashMap()
private val idsClickListenerMap = HashMap()
private var mHideOnTouchOutside = false
private var mRingWidth = 10f
private var mShowcaseMargin = 12f
private var mRoundRectOffset = 170f
private var mMarkerDrawableLeftMargin = 0f
private var mMarkerDrawableRightMargin = 0f
private var mMarkerDrawableTopMargin = 0f
private var mMarkerDrawableBottomMargin = 0f
private var tempCanvas: Canvas? = null
private var backgroundPaint: Paint? = null
private var transparentPaint: Paint? = null
private var ringPaint: Paint? = null
private var mTargetViewGlobalRect: Rect? = null
private constructor(context: Context) : super(context)
private constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
fun setTargetView(view: View?): ShowcaseViewBuilder {
mTargetView = view
return this
}
private fun calculateRadiusAndCenter() {
val width = mTargetView!!.measuredWidth
val height = mTargetView!!.measuredHeight
val xy = intArrayOf(0, 0)
mTargetView!!.getLocationInWindow(xy)
mCenterX = (xy[0] + (width / 2)).toFloat()
mCenterY = (xy[1] + (height / 2)).toFloat()
mRadius = if (width > height) {
(7 * (width) / 12).toFloat()
} else {
(7 * (height) / 12).toFloat()
}
}
fun setHideOnTouchOutside(value: Boolean): ShowcaseViewBuilder {
this.mHideOnTouchOutside = value
return this
}
fun setMarkerDrawable(drawable: Drawable?, gravity: Int): ShowcaseViewBuilder {
this.mMarkerDrawable = drawable
this.mMarkerDrawableGravity = gravity
return this
}
fun setDrawableLeftMargin(margin: Float): ShowcaseViewBuilder {
this.mMarkerDrawableLeftMargin = margin
return this
}
fun setRoundRectOffset(roundRectOffset: Float): ShowcaseViewBuilder {
this.mRoundRectOffset = roundRectOffset
return this
}
fun setDrawableRightMargin(margin: Float): ShowcaseViewBuilder {
this.mMarkerDrawableRightMargin = margin
return this
}
fun setDrawableTopMargin(margin: Float): ShowcaseViewBuilder {
this.mMarkerDrawableTopMargin = margin
return this
}
fun setDrawableBottomMargin(margin: Float): ShowcaseViewBuilder {
this.mMarkerDrawableBottomMargin = margin
return this
}
fun setShowcaseShape(shape: Int): ShowcaseViewBuilder {
this.mShape = shape
return this
}
fun setBgOverlayShape(bgOverlayShape: Int): ShowcaseViewBuilder {
this.mBgOverlayShape = bgOverlayShape
return this
}
fun setRoundRectCornerDirection(roundRectCornerDirection: Int): ShowcaseViewBuilder {
this.mRoundRectCorner = roundRectCornerDirection
return this
}
fun addCustomView(layoutId: Int, gravity: Int): ShowcaseViewBuilder {
val view = LayoutInflater.from(mActivity).inflate(layoutId, null)
val linearLayout = LinearLayout(mActivity)
linearLayout.addView(view)
linearLayout.gravity = Gravity.CENTER
val metrics = DisplayMetrics()
mActivity!!.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
rect[0, 0, metrics.widthPixels] = metrics.heightPixels
val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), MeasureSpec.EXACTLY)
val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), MeasureSpec.EXACTLY)
linearLayout.measure(widthSpec, heightSpec)
mCustomView.add(linearLayout)
mCustomViewGravity.add(gravity)
mCustomViewLeftMargins.add(0f)
mCustomViewTopMargins.add(0f)
mCustomViewRightMargins.add(0f)
mCustomViewBottomMargins.add(0f)
return this
}
fun addCustomView(view: View?, gravity: Int): ShowcaseViewBuilder {
val linearLayout = LinearLayout(mActivity)
linearLayout.addView(view)
linearLayout.gravity = Gravity.CENTER
val metrics = DisplayMetrics()
mActivity!!.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
rect[0, 0, metrics.widthPixels] = metrics.heightPixels
val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), MeasureSpec.EXACTLY)
val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), MeasureSpec.EXACTLY)
linearLayout.measure(widthSpec, heightSpec)
mCustomView.add(linearLayout)
mCustomViewGravity.add(gravity)
mCustomViewLeftMargins.add(0f)
mCustomViewTopMargins.add(0f)
mCustomViewRightMargins.add(0f)
mCustomViewBottomMargins.add(0f)
return this
}
fun addCustomView(
layoutId: Int,
gravity: Int,
leftMargin: Float,
topMargin: Float,
rightMargin: Float,
bottomMargin: Float
): ShowcaseViewBuilder {
val view = LayoutInflater.from(mActivity).inflate(layoutId, null)
val linearLayout = LinearLayout(mActivity)
linearLayout.addView(view)
linearLayout.gravity = Gravity.CENTER
val metrics = DisplayMetrics()
mActivity!!.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
rect[0, 0, metrics.widthPixels] = metrics.heightPixels
val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), MeasureSpec.EXACTLY)
val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), MeasureSpec.EXACTLY)
linearLayout.measure(widthSpec, heightSpec)
mCustomView.add(linearLayout)
mCustomViewGravity.add(gravity)
mCustomViewLeftMargins.add(leftMargin)
mCustomViewTopMargins.add(topMargin)
mCustomViewRightMargins.add(rightMargin)
mCustomViewBottomMargins.add(bottomMargin)
return this
}
fun addCustomView(
view: View?,
gravity: Int,
leftMargin: Float,
topMargin: Float,
rightMargin: Float,
bottomMargin: Float
): ShowcaseViewBuilder {
val linearLayout = LinearLayout(mActivity)
linearLayout.addView(view)
linearLayout.gravity = Gravity.CENTER
val metrics = DisplayMetrics()
mActivity!!.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
rect[0, 0, metrics.widthPixels] = metrics.heightPixels
val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), MeasureSpec.EXACTLY)
val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), MeasureSpec.EXACTLY)
linearLayout.measure(widthSpec, heightSpec)
mCustomView.add(linearLayout)
mCustomViewGravity.add(gravity)
mCustomViewLeftMargins.add(leftMargin)
mCustomViewTopMargins.add(topMargin)
mCustomViewRightMargins.add(rightMargin)
mCustomViewBottomMargins.add(bottomMargin)
return this
}
fun addCustomView(view: View): ShowcaseViewBuilder {
val metrics = DisplayMetrics()
mActivity!!.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
rect[0, 0, metrics.widthPixels] = metrics.heightPixels
val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), MeasureSpec.EXACTLY)
val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), MeasureSpec.EXACTLY)
view.measure(widthSpec, heightSpec)
mCustomView.add(view)
mCustomViewGravity.add(0)
mCustomViewLeftMargins.add(0f)
mCustomViewTopMargins.add(0f)
mCustomViewRightMargins.add(0f)
mCustomViewBottomMargins.add(0f)
return this
}
fun addCustomView(layoutId: Int): ShowcaseViewBuilder {
val view = LayoutInflater.from(mActivity).inflate(layoutId, null)
val metrics = DisplayMetrics()
mActivity!!.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
rect[0, 0, metrics.widthPixels] = metrics.heightPixels
val widthSpec = MeasureSpec.makeMeasureSpec(rect.width(), MeasureSpec.EXACTLY)
val heightSpec = MeasureSpec.makeMeasureSpec(rect.height(), MeasureSpec.EXACTLY)
view.measure(widthSpec, heightSpec)
mCustomView.add(view)
mCustomViewGravity.add(0)
mCustomViewLeftMargins.add(0f)
mCustomViewTopMargins.add(0f)
mCustomViewRightMargins.add(0f)
mCustomViewBottomMargins.add(0f)
return this
}
/**
* Deprecated. Use @addCustomView(int layoutId, int gravity, int leftMargin, int topMargin, int rightMargin, int bottomMargin) instead
*
* @param margin
* @return
*/
fun setCustomViewMargin(margin: Int): ShowcaseViewBuilder {
this.mCustomViewMargin = margin
return this
}
fun setRingColor(color: Int): ShowcaseViewBuilder {
this.ringColor = color
return this
}
fun setRingWidth(ringWidth: Float): ShowcaseViewBuilder {
this.mRingWidth = ringWidth
return this
}
fun setShowcaseMargin(showcaseMargin: Float): ShowcaseViewBuilder {
this.mShowcaseMargin = showcaseMargin
return this
}
fun setBackgroundOverlayColor(color: Int): ShowcaseViewBuilder {
this.backgroundOverlayColor = color
return this
}
fun show() {
transparentPaint = Paint()
ringPaint = Paint()
backgroundPaint = Paint()
if (mTargetView != null) {
if (mTargetView!!.width == 0 || mTargetView!!.height == 0) {
mTargetView!!.viewTreeObserver.addOnGlobalLayoutListener(object :
OnGlobalLayoutListener {
override fun onGlobalLayout() {
invalidate()
addShowcaseView()
mTargetView!!.viewTreeObserver.removeGlobalOnLayoutListener(this)
}
})
} else {
invalidate()
addShowcaseView()
}
}
setOnTouchListener(this)
}
private fun addShowcaseView() {
(mActivity!!.window.decorView as ViewGroup).addView(this)
}
fun hide() {
mCustomView.clear()
mCustomViewGravity.clear()
mCustomViewLeftMargins.clear()
mCustomViewRightMargins.clear()
mCustomViewTopMargins.clear()
mCustomViewBottomMargins.clear()
idsClickListenerMap.clear()
idsRectMap.clear()
mHideOnTouchOutside = false
(mActivity!!.window.decorView as ViewGroup).removeView(this)
}
override fun onDraw(canvas: Canvas) {
if (mTargetView != null) {
setShowcase(canvas)
drawMarkerDrawable(canvas)
addCustomView(canvas)
}
super.onDraw(canvas)
}
private fun drawMarkerDrawable(canvas: Canvas) {
if (mMarkerDrawable != null) {
when (mMarkerDrawableGravity) {
Gravity.LEFT, Gravity.START -> mMarkerDrawable!!.setBounds(
(mCenterX + mMarkerDrawableLeftMargin - mRadius - mMarkerDrawable!!.minimumWidth - mRingWidth - 10).toInt(),
(mCenterY + mMarkerDrawableTopMargin - mMarkerDrawable!!.minimumHeight).toInt(),
(mCenterX + mMarkerDrawableLeftMargin - mRadius - mRingWidth - 10).toInt(),
(mCenterY + mMarkerDrawableTopMargin).toInt()
)
Gravity.TOP -> mMarkerDrawable!!.setBounds(
(mCenterX + mMarkerDrawableLeftMargin - mMarkerDrawable!!.minimumWidth).toInt(),
(mCenterY + mMarkerDrawableTopMargin - mRadius - mMarkerDrawable!!.minimumHeight - mRingWidth - 10).toInt(),
(mCenterX + mMarkerDrawableLeftMargin).toInt(),
(mCenterY + mMarkerDrawableTopMargin - mRadius - mRingWidth - 10).toInt()
)
Gravity.RIGHT, Gravity.END -> mMarkerDrawable!!.setBounds(
(mCenterX + mMarkerDrawableLeftMargin + mRadius + mRingWidth + 10).toInt(),
(mCenterY + mMarkerDrawableTopMargin - mMarkerDrawable!!.minimumHeight).toInt(),
(mCenterX + mMarkerDrawableLeftMargin + mRadius + mMarkerDrawable!!.minimumWidth + mRingWidth + 10).toInt(),
(mCenterY + mMarkerDrawableTopMargin).toInt()
)
Gravity.BOTTOM -> mMarkerDrawable!!.setBounds(
(mCenterX + mMarkerDrawableLeftMargin - mMarkerDrawable!!.minimumWidth).toInt(),
(mCenterY + mMarkerDrawableTopMargin + mRadius + mRingWidth + 10).toInt(),
(mCenterX + mMarkerDrawableLeftMargin).toInt(),
(mCenterY + mMarkerDrawableTopMargin + mRadius + mMarkerDrawable!!.minimumHeight + mRingWidth + 10).toInt()
)
}
mMarkerDrawable!!.draw(canvas)
} else {
Log.d(TAG, "No marker drawable defined")
}
}
private fun addCustomView(canvas: Canvas) {
if (mCustomView.size != 0) {
for (i in mCustomView.indices) {
val cy = (mCustomView[i].measuredHeight / 2).toFloat()
val cx = (mCustomView[i].measuredWidth / 2).toFloat()
var diffY: Float
var diffX: Float
val marginTop = mCustomViewTopMargins[i]
val marginLeft = mCustomViewLeftMargins[i]
val marginRight = mCustomViewRightMargins[i]
val marginBottom = mCustomViewBottomMargins[i]
mTargetViewGlobalRect = Rect()
mTargetView!!.getGlobalVisibleRect(mTargetViewGlobalRect)
val view = mCustomView[i]
when (mCustomViewGravity[i]) {
Gravity.START, Gravity.LEFT -> {
diffY = mCenterY - cy
diffX = mCenterX - cx
if (diffX < 0) {
view.layout(
0, 0, (mCenterX - view.measuredWidth - 2 * marginRight).toInt(),
(mCustomView[i].measuredHeight + 2 * (diffY + marginTop)).toInt()
)
} else {
view.layout(
diffX.toInt(),
0,
(view.measuredWidth - diffX - 2 * marginRight).toInt(),
(mCustomView[i].measuredHeight + 2 * (diffY + marginTop)).toInt()
)
}
}
Gravity.TOP -> {
diffY = mCenterY - cy - 2 * mTargetView!!.measuredHeight
view.layout(
(-marginLeft).toInt(), 0, (view.measuredWidth + marginLeft).toInt(),
(mCustomView[i].measuredHeight + 2 * (diffY + marginTop)).toInt()
)
}
Gravity.END, Gravity.RIGHT -> {
diffY = mCenterY - cy
view.layout(
-2 * mTargetViewGlobalRect!!.right,
0,
(view.measuredWidth + 4 * marginLeft).toInt(),
(mCustomView[i].measuredHeight + 2 * (diffY + marginTop)).toInt()
)
}
Gravity.BOTTOM -> {
diffY = mCenterY - cy + 2 * mTargetView!!.measuredHeight
view.layout(
(-marginLeft).toInt(), 0, (view.measuredWidth + marginLeft).toInt(),
(mCustomView[i].measuredHeight + 2 * (diffY + marginTop)).toInt()
)
}
else -> mCustomView[i].layout(
0,
0,
mCustomView[i].measuredWidth,
mCustomView[i].measuredHeight
)
}
mCustomView[i].draw(canvas)
}
} else {
Log.d(TAG, "No Custom View defined")
}
}
private fun getAllChildren(v: View): ArrayList {
if (v !is ViewGroup) {
val viewArrayList = ArrayList()
viewArrayList.add(v)
return viewArrayList
}
val result = ArrayList()
val viewGroup = v
for (i in 0 until viewGroup.childCount) {
val child = viewGroup.getChildAt(i)
val viewArrayList = ArrayList()
viewArrayList.add(v)
viewArrayList.addAll(getAllChildren(child))
result.addAll(viewArrayList)
}
return result
}
private fun setShowcase(canvas: Canvas) {
calculateRadiusAndCenter()
val bitmap = Bitmap.createBitmap(canvas.width, canvas.height, Bitmap.Config.ARGB_8888)
tempCanvas = Canvas(bitmap)
backgroundPaint!!.color = backgroundOverlayColor
backgroundPaint!!.isAntiAlias = true
transparentPaint!!.color = resources.getColor(android.R.color.transparent)
transparentPaint!!.setXfermode(PorterDuffXfermode(PorterDuff.Mode.CLEAR))
transparentPaint!!.isAntiAlias = true
ringPaint!!.color = ringColor
ringPaint!!.setXfermode(PorterDuffXfermode(PorterDuff.Mode.ADD))
ringPaint!!.isAntiAlias = true
if (mBgOverlayShape == ROUND_RECT) {
val oval = RectF()
when (mRoundRectCorner) {
BOTTOM_LEFT -> {
oval[-mRoundRectOffset, -tempCanvas!!.height.toFloat(), 2 * tempCanvas!!.width + mRoundRectOffset] =
tempCanvas!!.height.toFloat()
tempCanvas!!.drawArc(oval, 90f, 90f, true, backgroundPaint!!)
}
BOTTOM_RIGHT -> {
oval[-tempCanvas!!.width - mRoundRectOffset, -tempCanvas!!.height.toFloat(), tempCanvas!!.width + mRoundRectOffset] =
tempCanvas!!.height.toFloat()
tempCanvas!!.drawArc(oval, 360f, 90f, true, backgroundPaint!!)
}
TOP_LEFT -> {
oval[-mRoundRectOffset, 0f, 2 * tempCanvas!!.width + mRoundRectOffset] =
(2 * tempCanvas!!.height).toFloat()
tempCanvas!!.drawArc(oval, 180f, 90f, true, backgroundPaint!!)
}
TOP_RIGHT -> {
oval[-tempCanvas!!.width - mRoundRectOffset, 0f, tempCanvas!!.width + mRoundRectOffset] =
(2 * tempCanvas!!.height).toFloat()
tempCanvas!!.drawArc(oval, 270f, 90f, true, backgroundPaint!!)
}
else -> {
oval[-mRoundRectOffset, -tempCanvas!!.height.toFloat(), 2 * tempCanvas!!.width + mRoundRectOffset] =
tempCanvas!!.height.toFloat()
tempCanvas!!.drawArc(oval, 90f, 90f, true, backgroundPaint!!)
}
}
} else {
tempCanvas!!.drawRect(
0f, 0f, tempCanvas!!.width.toFloat(), tempCanvas!!.height.toFloat(),
backgroundPaint!!
)
}
if (mShape == SHAPE_SKEW) {
val r = Rect()
val ring = Rect()
mTargetView!!.getGlobalVisibleRect(r)
mTargetView!!.getGlobalVisibleRect(ring)
//Showcase rect
r.top = (r.top - mShowcaseMargin).toInt()
r.left = (r.left - mShowcaseMargin).toInt()
r.right = (r.right + mShowcaseMargin).toInt()
r.bottom = (r.bottom + mShowcaseMargin).toInt()
//Showcase ring rect
ring.top = (ring.top - (mShowcaseMargin + mRingWidth)).toInt()
ring.left = (ring.left - (mShowcaseMargin + mRingWidth)).toInt()
ring.right = (ring.right + (mShowcaseMargin + mRingWidth)).toInt()
ring.bottom = (ring.bottom + (mShowcaseMargin + mRingWidth)).toInt()
tempCanvas!!.drawRect(ring, ringPaint!!)
tempCanvas!!.drawRect(r, transparentPaint!!)
} else {
tempCanvas!!.drawCircle(mCenterX, mCenterY, mRadius + mRingWidth, ringPaint!!)
tempCanvas!!.drawCircle(mCenterX, mCenterY, mRadius, transparentPaint!!)
}
canvas.drawBitmap(bitmap, 0f, 0f, Paint())
}
fun setClickListenerOnView(id: Int, clickListener: OnClickListener?) {
idsClickListenerMap[id] = clickListener
}
private fun getAbsoluteLeft(myView: View?): Int {
if (myView == null) {
return 0
}
return if (myView.parent === myView.rootView) myView.left
else myView.left + getAbsoluteLeft(myView.parent as View)
}
private fun getAbsoluteTop(myView: View?): Int {
if (myView == null) {
return 0
}
return if (myView.parent === myView.rootView) myView.top
else myView.top + getAbsoluteTop(myView.parent as View)
}
override fun onTouch(v: View, event: MotionEvent): Boolean {
if (idsRectMap.isEmpty()) {
for (parentView in mCustomView) {
val childrenViews: List = getAllChildren(parentView)
for (view in childrenViews) {
val rect = Rect()
rect[getAbsoluteLeft(view), getAbsoluteTop(view), getAbsoluteLeft(view) + view.measuredWidth] =
getAbsoluteTop(view) + view.measuredHeight
if (view.id > 0) {
idsRectMap[rect] = view.id
}
}
}
}
if (event.action == MotionEvent.ACTION_UP) {
val X = event.x
val Y = event.y
val keys: Array = idsRectMap.keys.toTypedArray()
for (i in 0 until idsRectMap.size) {
val r = keys[i] as Rect
if (r.contains(X.toInt(), Y.toInt())) {
val id = idsRectMap[r]!!
if (idsClickListenerMap[id] != null) {
idsClickListenerMap[id]!!.onClick(v)
return true
}
}
}
if (mHideOnTouchOutside) {
hide()
return true
}
}
return false
}
companion object {
private const val TAG = "SHOWCASE_VIEW"
//Showcase Shapes constants
const val SHAPE_CIRCLE: Int = 0 //Default Shape
const val SHAPE_SKEW: Int = 1
//Bg Overlay Shapes constants
const val FULL_SCREEN: Int = 2 //Default Shape
const val ROUND_RECT: Int = 3
//Round rect corner direction constants
const val BOTTOM_LEFT: Int = 4
const val BOTTOM_RIGHT: Int = 5
const val TOP_LEFT: Int = 6
const val TOP_RIGHT: Int = 7
@JvmStatic
fun init(activity: Activity): ShowcaseViewBuilder {
val showcaseViewBuilder = ShowcaseViewBuilder(activity)
showcaseViewBuilder.mActivity = activity
showcaseViewBuilder.isClickable = true
return showcaseViewBuilder
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/Constants.kt
================================================
package rocks.poopjournal.todont.utils;
import android.content.Context
import rocks.poopjournal.todont.R
public class Constants {
companion object {
val ADD_NEW_HABIT="ADD_NEW_HABIT"
val FILES_DIRECTORY="Cover_Images"
const val DATE_FORMAT = "yyyy-MM-dd"
const val DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm"
const val INITIAL_DATE_KEY = "InitialDate"
const val NO = "no"
const val YES = "yes"
const val APP_THEME_PRIMARY_COLOR = "app_theme_clr"
const val APP_THEME_SECONDARY_COLOR = "app_theme_clr2"
const val APP_DISABLE_PRIMARY_COLOR = "app_disable_clr"
const val APP_DISABLE_SECONDARY_COLOR = "app_disable_clr2"
const val APP_TAG_LINE = "app_tag_line"
const val DEFAULT_APP_COLOR = "#08a27b"
const val DEFAULT_APP_COLOR2 = "#26bf62"
const val DEFAULT_APP_DISABLE_COLOR = "#DCDCDC"
const val DEFAULT_APP_DISABLE_COLOR2 = "#FFFFFF"
// const val NOTIFICATION_TIME_FORMAT=context.getString(R.string.time)"Time: %02d:%02d, Frequency: %s"
var IS_OK=false
var CURRENT_THEME:String=""
fun getNotificationTimeText(context: Context, hour: Int, minute: Int, frequency: String): String {
val timeLabel = context.getString(R.string.time)
val frequencyLabel = context.getString(R.string.frequncy)
val format = "%s: %02d:%02d, %s: %s"
return String.format(format, timeLabel, hour, minute, frequencyLabel, frequency)
}
}
}
enum class ThemeMode(var value:String){
LIGHT_MODE ("1"),
DARK_MODE ("2"),
FOLLOW_SYS ("3"),
DRACULA ("4"),
DRACULA_PRO("5"),
DRACULA_PRO_ALUCARD("6"),
DRACULA_PRO_BUFFY("7"),
DRACULA_PRO_BLADE("9"),
}
enum class HabitStatus(var value: String){
AVOIDED("Avoided"),DONE("Done")
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/DatabaseUtils.kt
================================================
package rocks.poopjournal.todont.utils
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.widget.Toast
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.model.Alarm
import rocks.poopjournal.todont.model.Label
import rocks.poopjournal.todont.model.HabitRecord
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import java.io.OutputStream
import java.util.*
import kotlin.collections.ArrayList
class DatabaseUtils(val context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(CREATE_TABLE_ALARM)
db.execSQL(CREATE_TABLE_HABIT)
db.execSQL(CREATE_TABLE_LABEL)
db.execSQL(CREATE_TABLE_RECORD)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL("DROP TABLE IF EXISTS $TABLE_ALARM")
db.execSQL("DROP TABLE IF EXISTS $TABLE_HABIT")
db.execSQL("DROP TABLE IF EXISTS $TABLE_LABEL")
db.execSQL("DROP TABLE IF EXISTS $TABLE_RECORD")
onCreate(db)
}
fun insertHabit(habit: Habit): Long {
val db = writableDatabase
val values = ContentValues().apply {
put(COLUMN_DATE, habit.date)
put(COLUMN_HABIT, habit.name)
put(COLUMN_DESCRIPTION, habit.description)
put(COLUMN_COUNT_AVOIDED, habit.countAvoided)
put(COLUMN_COUNT_DONE, habit.countDone)
put(COLUMN_LABEL_ID, habit.labelId)
put(COLUMN_COVER_IMAGE_URI, habit.coverImageUri) // Add this line
}
var count=0L
try {
count=db.insert(TABLE_HABIT, null, values)
}catch (ex:Exception){
ex.printStackTrace()
}
return count
}
fun closeDatabase(){
val db = writableDatabase
db.close()
}
fun getAllHabits(): ArrayList {
val habitsList = ArrayList()
val db = readableDatabase
var cursor: Cursor? = null
try {
// Query to fetch all habits
cursor = db.query(TABLE_HABIT, null, null, null, null, null, null)
if (cursor != null && cursor.moveToFirst()) {
do {
// Extract habit data
val id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID))
val date = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DATE))
val habit = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HABIT))
val description = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DESCRIPTION))
val countAvoided = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_AVOIDED))
val countDone = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_DONE))
val labelId = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_LABEL_ID))
val coverImageUri = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_COVER_IMAGE_URI))
// Create a habit object
val habitObj = Habit(
id = id,
date = date,
name = habit,
description = description,
countAvoided = countAvoided,
countDone = countDone,
labelId = labelId,
coverImageUri = coverImageUri
)
// Fetch the associated label and set it
habitObj.label = getLabelById(labelId)
habitsList.add(habitObj)
} while (cursor.moveToNext())
}
} catch (e: Exception) {
e.printStackTrace() // Log the exception for debugging
} finally {
cursor?.close() // Close the cursor
db.close() // Close the database
}
return habitsList
}
// Helper function to fetch a label by its ID
private fun getLabelById(labelId: Int): Label? {
val db = readableDatabase
var label: Label? = null
var cursor: Cursor? = null
try {
// Query to fetch the label by ID
val selection = "$COLUMN_ID = ?"
val selectionArgs = arrayOf(labelId.toString())
cursor = db.query(TABLE_LABEL, null, selection, selectionArgs, null, null, null)
if (cursor != null && cursor.moveToFirst()) {
// Extract label data
val id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID))
val name = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_NAME))
label = Label(
labelId = id,
name = name
)
}
} catch (e: Exception) {
e.printStackTrace() // Log the exception for debugging
} finally {
cursor?.close() // Close the cursor
db.close() // Close the database
}
return label
}
private fun countHabitsRelatedToLabel(labelId: Int?): Int {
if (labelId == null) return 0 // If the label ID is null, return 0
var count = 0
val db = this.readableDatabase
val query = "SELECT COUNT(*) FROM $TABLE_HABIT WHERE $COLUMN_LABEL_ID = ?"
val cursor = db.rawQuery(query, arrayOf(labelId.toString()))
if (cursor.moveToFirst()) {
count = cursor.getInt(0)
}
cursor.close()
db.close()
return count
}
// READ OPERATIONS
fun getAllAlarms(): List {
val alarms = mutableListOf()
val db = readableDatabase
val cursor = db.query(TABLE_ALARM, null, null, null, null, null, null)
with(cursor) {
while (moveToNext()) {
alarms.add(
Alarm(
getInt(getColumnIndexOrThrow(COLUMN_HABIT_ID)),
getLong(getColumnIndexOrThrow(COLUMN_ALARM_TIME)),
getString(getColumnIndexOrThrow(COLUMN_FREQUENCY)),
)
)
}
}
cursor.close()
return alarms
}
fun getHabitById(id: Int): Habit? {
val db = readableDatabase
val cursor = db.query(TABLE_HABIT, null, "$COLUMN_ID = ?", arrayOf(id.toString()), null, null, null)
return if (cursor.moveToFirst()) {
Habit(
cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID)),
cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DATE)),
cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HABIT)),
cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DESCRIPTION)),
cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_AVOIDED)),
cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_DONE)),
cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_LABEL_ID))
)
} else null
}
fun getAllLabels(): ArrayList {
val labels = ArrayList()
val db = readableDatabase
val cursor = db.query(TABLE_LABEL, null, null, null, null, null, null)
with(cursor) {
while (moveToNext()) {
val label=Label(
getInt(getColumnIndexOrThrow(COLUMN_ID)),
getString(getColumnIndexOrThrow(COLUMN_NAME))
)
label.habitCount=countHabitsRelatedToLabel(label.labelId)
labels.add(
label
)
}
}
cursor.close()
return labels
}
// UPDATE OPERATIONS
fun updateAlarm(alarm: Alarm): Int {
val db = writableDatabase
val values = ContentValues().apply {
put(COLUMN_ALARM_TIME, alarm.alarmTime)
put(COLUMN_FREQUENCY, alarm.frequency)
put(COLUMN_HABIT_ID, alarm.habitId)
}
return db.update(TABLE_ALARM, values, "$COLUMN_HABIT_ID = ?", arrayOf(alarm.habitId.toString()))
}
fun updateHabit(habit: Habit): Int {
val db = writableDatabase
val values = ContentValues().apply {
put(COLUMN_DATE, habit.date)
put(COLUMN_HABIT, habit.name)
put(COLUMN_DESCRIPTION, habit.description)
put(COLUMN_COUNT_AVOIDED, habit.countAvoided)
put(COLUMN_COUNT_DONE, habit.countDone)
put(COLUMN_LABEL_ID, habit.labelId)
}
return db.update(TABLE_HABIT, values, "$COLUMN_ID = ?", arrayOf(habit.id.toString()))
}
fun incrementCount(habitId: Int, isAvoided: Boolean): Int {
val db = writableDatabase
val columnToUpdate = if (isAvoided) COLUMN_COUNT_AVOIDED else COLUMN_COUNT_DONE
val query = "UPDATE $TABLE_HABIT SET $columnToUpdate = $columnToUpdate + 1 WHERE $COLUMN_ID = ?"
return db.compileStatement(query).apply {
bindString(1, habitId.toString())
}.executeUpdateDelete()
}
// DELETE OPERATIONS
/* fun deleteAlarm(habitId: Int): Int {
val db = writableDatabase
return db.delete(TABLE_ALARM, "$COLUMN_HABIT_ID = ?", arrayOf(habitId.toString()))
}*/
fun deleteAlarm(habitId: Int): Int {
val db = writableDatabase
return db.delete(TABLE_ALARM, "$COLUMN_HABIT_ID = ?", arrayOf(habitId.toString()))
}
fun deleteHabit(id: Int?): Int {
val db = writableDatabase
return db.delete(TABLE_HABIT, "$COLUMN_ID = ?", arrayOf(id.toString()))
}
fun deleteHabitRecordWithStatus(habitId: Int?, status: String): Int {
val db = writableDatabase
val selection = "$COLUMN_HABIT_ID = ? AND $COLUMN_STATUS = ?"
val selectionArgs = arrayOf(habitId.toString(), status)
return db.delete(TABLE_RECORD, selection, selectionArgs)
}
fun deleteLabel(id: Int?):Int {
val db = writableDatabase
return db.delete(TABLE_LABEL, "$COLUMN_ID = ?", arrayOf(id.toString()))
}
fun deleteAllHabitRecords(id: Int?):Int {
if (id == null) return -1// If the habit ID is null, return immediately
val db = writableDatabase
var rowsDeleted=-1
try {
// Delete all records related to the provided habit ID
rowsDeleted = db.delete(TABLE_RECORD, "$COLUMN_HABIT_ID = ?", arrayOf(id.toString()))
} catch (e: Exception) {
e.printStackTrace() // Log the exception for debugging
} finally {
db.close() // Ensure database is closed
}
return rowsDeleted;
}
fun getAlarmById(habitId: Int?): Alarm? {
if (habitId == null) return null // Return null if the habitId is null
val db = readableDatabase
var alarm: Alarm? = null
val cursor = db.query(
TABLE_ALARM, // The table to query
null, // All columns
"$COLUMN_HABIT_ID = ?", // The WHERE clause
arrayOf(habitId.toString()), // The values for the WHERE clause
null, // GROUP BY
null, // HAVING
null // ORDER BY
)
if (cursor != null && cursor.moveToFirst()) {
// Assuming Alarm class has a constructor or method to map data from cursor
alarm = Alarm(
habitId = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_HABIT_ID)),
frequency = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_FREQUENCY)),
alarmTime = cursor.getLong(cursor.getColumnIndexOrThrow(COLUMN_ALARM_TIME)),
)
}
cursor.close() // Always close the cursor when done
return alarm // Return the alarm object or null if no match was found
}
fun getAvoidedHabits(): ArrayList {
return getHabits(COLUMN_COUNT_AVOIDED)
}
fun getDoneHabits(): ArrayList {
return getHabits(COLUMN_COUNT_DONE)
}
private fun getHabits(column:String):ArrayList{
val habitsList = ArrayList()
val db = readableDatabase
var cursor: Cursor? = null
try {
// Query to fetch all habits where countDone is greater than 0
val selection = "$column > ?"
val selectionArgs = arrayOf("0")
cursor = db.query(
TABLE_HABIT,
null,
selection,
selectionArgs,
null,
null,
null
)
if (cursor != null && cursor.moveToFirst()) {
do {
// Extract habit data
val id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID))
val date = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DATE))
val habit = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HABIT))
val description = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DESCRIPTION))
val countAvoided = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_AVOIDED))
val countDone = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_DONE))
val labelId = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_LABEL_ID))
// Create a habit object
val habitObj = Habit(
id = id,
date = date,
name = habit,
description = description,
countAvoided = countAvoided,
countDone = countDone,
labelId = labelId
)
// Fetch the associated label and set it
habitObj.label = getLabelById(labelId)
habitsList.add(habitObj)
} while (cursor.moveToNext())
}
} catch (e: Exception) {
e.printStackTrace() // Log the exception for debugging
} finally {
cursor?.close() // Close the cursor
db.close() // Close the database
}
return habitsList
}
fun getHabitsCount(): Int {
val db = this.readableDatabase
val query = "SELECT COUNT(*) FROM $TABLE_HABIT"
db.use {
val cursor = db.rawQuery(query, null)
cursor.use {
if (cursor.moveToFirst()) {
return cursor.getInt(0)
}
}
}
return 0
}
// CREATE OPERATIONS
fun insertOrUpdateAlarm(alarm: Alarm): Long {
val db = writableDatabase
val values = ContentValues().apply {
put(COLUMN_ALARM_TIME, alarm.alarmTime)
put(COLUMN_FREQUENCY, alarm.frequency)
put(COLUMN_HABIT_ID, alarm.habitId)
}
return db.replace(TABLE_ALARM, null, values)
}
fun getDatabaseFile(): File {
return context.getDatabasePath(DATABASE_NAME)
}
fun getLabelsCount(): Int {
var count = 0
val db = readableDatabase
val cursor: Cursor? = null
try {
val query = "SELECT COUNT(*) FROM $TABLE_LABEL"
val cursor = db.rawQuery(query, null)
if (cursor.moveToFirst()) {
count = cursor.getInt(0) // Get the count from the first column
}
} catch (e: Exception) {
e.printStackTrace() // Log exception if any
} finally {
cursor?.close() // Ensure cursor is closed
db.close() // Ensure database is closed
}
return count
}
fun getRecordsByDateAndStatus(date: String, status: String):ArrayList {
val records = ArrayList()
val db = this.readableDatabase
val query = "SELECT $COLUMN_HABIT_ID FROM Record WHERE date = ? AND status = ?"
db.use {
val cursor = db.rawQuery(query, arrayOf(date, status))
cursor.use {
if (cursor.moveToFirst()) {
do {
val id = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HABIT_ID))
// Create and add the record object to the list
if(!records.contains(id)){
records.add(id)
}
} while (cursor.moveToNext())
}
}
}
return records
}
private fun getMostFrequentDataInRange(status: String, startDate: String, endDate: String): String {
val dataList = ArrayList()
val db = this.readableDatabase
val query = "SELECT $COLUMN_HABIT_ID FROM $TABLE_RECORD WHERE date BETWEEN ? AND ? AND status = ?"
db.use {
val cursor = db.rawQuery(query, arrayOf(startDate, endDate,status))
cursor.use {
while (cursor.moveToNext()) {
dataList.add(cursor.getString(cursor.getColumnIndexOrThrow("$COLUMN_HABIT_ID")))
}
}
}
// Find the most frequent item
val frequencyMap = dataList.groupingBy { it }.eachCount()
val mostFrequentData = frequencyMap.maxByOrNull { it.value }?.key
return mostFrequentData ?: ""
}
private fun getDataInRange(status: String, startDate: String, endDate: String): ArrayList {
val dataList = ArrayList()
val db = this.readableDatabase
val query = "SELECT $COLUMN_HABIT_ID, $COLUMN_DATE FROM $TABLE_RECORD WHERE date BETWEEN ? AND ? AND status = ?"
db.use {
val cursor = db.rawQuery(query, arrayOf(startDate, endDate,status))
cursor.use {
while (cursor.moveToNext()) {
val id=cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HABIT_ID))
val date=cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DATE))
val habit=Habit(id.toInt(),date,"","",0,0,0)
if(!dataList.contains(habit)){
dataList.add(habit)
}
}
}
}
return dataList
}
// Wrapper methods for each specific use case
fun getWeeklyDoneRecord(startDate: String, endDate: String): String {
return getMostFrequentDataInRange(HabitStatus.DONE.value, startDate, endDate)
}
fun getWeeklyDoneRecordList(startDate: String, endDate: String):ArrayList{
return getDataInRange(HabitStatus.DONE.value, startDate, endDate)
}
fun getWeeklyAvoidedRecord(startDate: String, endDate: String): String {
return getMostFrequentDataInRange(HabitStatus.AVOIDED.value, startDate, endDate)
}
fun getWeeklyAvoidedRecordList(startDate: String, endDate: String): ArrayList {
return getDataInRange(HabitStatus.AVOIDED.value, startDate, endDate)
}
fun getMonthlyDoneData(startDate: String, endDate: String): String {
return getMostFrequentDataInRange(HabitStatus.DONE.value, startDate, endDate)
}
fun getMonthlyDoneDataList(startDate: String, endDate: String): ArrayList {
return getDataInRange(HabitStatus.DONE.value, startDate, endDate)
}
fun getMonthlyAvoidedData(startDate: String, endDate: String): String {
return getMostFrequentDataInRange(HabitStatus.AVOIDED.value, startDate, endDate)
}
fun getMonthlyAvoidedDataList(startDate: String, endDate: String): ArrayList {
return getDataInRange(HabitStatus.AVOIDED.value, startDate, endDate)
}
fun getYearlyDoneData(startDate: String, endDate: String): String {
return getMostFrequentDataInRange(HabitStatus.DONE.value, startDate, endDate)
}
fun getYearlyDoneDataList(startDate: String, endDate: String): ArrayList {
return getDataInRange(HabitStatus.DONE.value, startDate, endDate)
}
fun getYearlyAvoidedData(startDate: String, endDate: String): String {
return getMostFrequentDataInRange(HabitStatus.AVOIDED.value, startDate, endDate)
}
fun getYearlyAvoidedDataList(startDate: String, endDate: String): ArrayList {
return getDataInRange(HabitStatus.AVOIDED.value, startDate, endDate)
}
fun deleteCurrentDatabase():Boolean {
return try {
context.deleteDatabase(DATABASE_NAME)
} catch (e: Exception) {
e.printStackTrace()
false
}
}
fun getHabitsWithLabelId(labelId: Int?): ArrayList {
var habitsList = ArrayList ()
val db = this.readableDatabase
val query = "SELECT * FROM $TABLE_HABIT WHERE $COLUMN_LABEL_ID = ?"
val cursor = db.rawQuery(query, arrayOf(labelId.toString()))
if (cursor.moveToFirst()) {
do{
// Extract habit data
val id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID))
val date = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DATE))
val habit = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_HABIT))
val description = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_DESCRIPTION))
val countAvoided = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_AVOIDED))
val countDone = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_COUNT_DONE))
val labelId = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_LABEL_ID))
// Create a habit object
val habitObj = Habit(
id = id,
date = date,
name = habit,
description = description,
countAvoided = countAvoided,
countDone = countDone,
labelId = labelId
)
habitsList.add(habitObj)
}while (cursor.moveToNext())
}
cursor.close()
db.close()
return habitsList
}
fun insertLabel(label: Label): Long {
val db = writableDatabase
val values = ContentValues().apply {
put(COLUMN_NAME, label.name)
}
return db.insert(TABLE_LABEL, null, values)
}
fun insertRecord(record: HabitRecord): Long {
val db = writableDatabase
val values = ContentValues().apply {
put(COLUMN_DATE, record.date)
put(COLUMN_STATUS, record.status)
put(COLUMN_HABIT_ID, record.habitId)
}
return db.insert(TABLE_RECORD, null, values)
}
companion object {
const val DATABASE_NAME = "todont.sqlite"
const val DATABASE_VERSION = 2
const val TABLE_ALARM = "Alarm"
const val TABLE_HABIT = "Habit"
const val TABLE_LABEL = "Label"
const val TABLE_RECORD = "Record"
const val COLUMN_ID = "id"
const val COLUMN_ALARM_TIME = "alarm_time"
const val COLUMN_FREQUENCY = "frequency"
const val COLUMN_HABIT_ID = "habit_id"
// Add new column constant
const val COLUMN_COVER_IMAGE_URI = "cover_image_uri"
const val COLUMN_DATE = "date"
const val COLUMN_HABIT = "habit"
const val COLUMN_DESCRIPTION = "description"
const val COLUMN_COUNT_AVOIDED = "count_avoided"
const val COLUMN_COUNT_DONE = "count_done"
const val COLUMN_LABEL_ID = "label_id"
const val COLUMN_NAME = "name"
const val COLUMN_STATUS = "status"
const val CREATE_TABLE_ALARM = "CREATE TABLE $TABLE_ALARM ($COLUMN_HABIT_ID INTEGER PRIMARY KEY, $COLUMN_ALARM_TIME INTEGER, $COLUMN_FREQUENCY TEXT)"
// Update CREATE_TABLE_HABIT
const val CREATE_TABLE_HABIT = "CREATE TABLE $TABLE_HABIT ($COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"$COLUMN_DATE TEXT, $COLUMN_HABIT TEXT, $COLUMN_DESCRIPTION TEXT, " +
"$COLUMN_COUNT_AVOIDED INTEGER, $COLUMN_COUNT_DONE INTEGER, " +
"$COLUMN_LABEL_ID INTEGER, $COLUMN_COVER_IMAGE_URI TEXT)"
const val CREATE_TABLE_LABEL = "CREATE TABLE $TABLE_LABEL ($COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COLUMN_NAME TEXT)"
const val CREATE_TABLE_RECORD = "CREATE TABLE $TABLE_RECORD ($COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COLUMN_DATE TEXT, $COLUMN_STATUS TEXT, $COLUMN_HABIT_ID INTEGER)"
const val TAG="TO_DON'T"
fun copyDatabaseToDownloads(context: Context, dbName: String?) {
try {
// Get the database file from the app's private directory
val dbFile = context.getDatabasePath(dbName)
// For Android 10 (API 29) and above, use the MediaStore API to write to Downloads folder
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
saveFileToDownloadsUsingMediaStore(context, dbFile)
} else {
// For Android 9 (API 28) and below, use traditional file writing with WRITE_EXTERNAL_STORAGE permission
val downloadsDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
val destFile = File(downloadsDir, dbFile.name)
copyFile(dbFile, destFile)
Toast.makeText(
context,
"Database copied to: " + destFile.absolutePath,
Toast.LENGTH_LONG
).show()
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(context, "Failed to copy database: " + e.message, Toast.LENGTH_LONG)
.show()
}
}
// Method for copying the file for Android 10 and above using MediaStore API
private fun saveFileToDownloadsUsingMediaStore(context: Context, sourceFile: File) {
val contentResolver = context.contentResolver
val values = ContentValues()
// Set up the details for the file in MediaStore
values.put(MediaStore.MediaColumns.DISPLAY_NAME, sourceFile.name)
values.put(MediaStore.MediaColumns.MIME_TYPE, "application/octet-stream")
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS)
// Insert the file details to MediaStore, getting the URI
val fileUri = contentResolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values)
if (fileUri != null) {
try {
contentResolver.openOutputStream(fileUri).use { outputStream ->
FileInputStream(sourceFile).use { inputStream ->
// Copy the data from the source file to the destination stream
val buffer = ByteArray(1024)
var length: Int
while ((inputStream.read(buffer).also { length = it }) > 0) {
outputStream!!.write(buffer, 0, length)
}
Toast.makeText(
context,
"Database copied to Downloads folder",
Toast.LENGTH_LONG
).show()
}
}
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(context, "Failed to save file: " + e.message, Toast.LENGTH_LONG)
.show()
}
}
}
// Method for copying the file in older Android versions
@Throws(Exception::class)
private fun copyFile(sourceFile: File, destFile: File) {
var inputStream: FileInputStream? = null
var outputStream: OutputStream? = null
try {
inputStream = FileInputStream(sourceFile)
outputStream = FileOutputStream(destFile)
val buffer = ByteArray(1024)
var length: Int
while ((inputStream.read(buffer).also { length = it }) > 0) {
outputStream.write(buffer, 0, length)
}
} finally {
outputStream?.flush()
inputStream?.close()
outputStream?.close()
}
}
fun deleteCurrentDatabase(context: Context) {
// Get the path of the current database
val currentDatabase = context.getDatabasePath(DATABASE_NAME)
// Check if the current database exists
if (currentDatabase.exists()) {
// Delete the existing database
if (currentDatabase.delete()) {
Log.d(TAG, "Existing database deleted successfully.")
} else {
Log.e(TAG, "Failed to delete existing database.")
return // Exit if unable to delete
}
}
}
fun restoreDatabase(context: Context) {
val currentDatabase = context.getDatabasePath(DATABASE_NAME)
deleteCurrentDatabase(context)
// Now proceed to restore the new database from the backup file
val backupFile = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
DATABASE_NAME
)
if (!backupFile.exists()) {
Log.e(TAG, "Backup file does not exist.")
return // Exit if backup file is not found
}
// Copy the backup file to the database location
try {
copyFile(backupFile, currentDatabase)
Log.d(TAG, "Database restored successfully.")
} catch (e: IOException) {
Log.e(TAG, "Failed to restore database: " + e.message)
}
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/HabitsBottomSheetDialog.kt
================================================
package rocks.poopjournal.todont.utils
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.app.AlarmManager
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.TimePickerDialog
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.content.ContextCompat
import com.bumptech.glide.Glide
import com.bumptech.glide.load.MultiTransformation
import com.bumptech.glide.request.RequestOptions
import com.google.android.material.bottomsheet.BottomSheetDialog
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.databinding.LayoutHabitBottomSheetBinding
import rocks.poopjournal.todont.model.Alarm
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.model.HabitRecord
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
import jp.wasabeef.glide.transformations.BlurTransformation
import rocks.poopjournal.todont.utils.Constants.Companion.getNotificationTimeText
import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
class HabitsBottomSheetDialog(
var context: Context, var habit: Habit,
var position: Int,
var dbHelper: DatabaseUtils,
val listener: HabitSheetListener
) {
val bottomSheet: BottomSheetDialog = BottomSheetDialog(context, R.style.BottomSheetDialogTheme)
var binding: LayoutHabitBottomSheetBinding = LayoutHabitBottomSheetBinding.inflate(
LayoutInflater.from(context)
)
init {
bottomSheet.setContentView(binding.root)
binding.tvHabitName.text = habit.name
binding.tvHabitDescription.text = habit.description
binding.tvLabel.text = habit.label?.name
binding.tvAvoidedCount.text = habit.countAvoided.toString()
binding.tvDoneCount.text = habit.countDone.toString()
habit.coverImageUri?.let { loadImageWithBlur(it) }
val alarm=dbHelper.getAlarmById(habit.id)
alarm?.let {
val freq= if(it.frequency=="0"){
context.getString(R.string.once)
}else if(it.frequency=="1"){
context.getString(R.string.daily)
}else{
context.getString(R.string.weekly)
}
val calendar= Calendar.getInstance()
calendar.timeInMillis=it.alarmTime
/* binding.tvNotification.text=String.format(
Constants.NOTIFICATION_TIME_FORMAT,
calendar[Calendar.HOUR_OF_DAY],
calendar[Calendar.MINUTE],
freq
)*/
binding.tvNotification.text = getNotificationTimeText(
context,
calendar[Calendar.HOUR_OF_DAY],
calendar[Calendar.MINUTE],
freq
)
}
binding.btnIncrAvoidedCount.setOnClickListener {
habit.countAvoided++
dbHelper.updateHabit(habit)
dbHelper.insertRecord(
HabitRecord(
date = getTodayDate(),
status = HabitStatus.AVOIDED.value,
habitId = habit.id
)
)
listener.updateCount(habit, position)
binding.tvAvoidedCount.text = habit.countAvoided.toString()
}
binding.btnDecAvoidedCount.setOnClickListener {
if (habit.countAvoided > 0) {
habit.countAvoided--
dbHelper.updateHabit(habit)
//delete the last row where status is avoided
dbHelper.deleteHabitRecordWithStatus(habit.id, HabitStatus.AVOIDED.value)
listener.updateCount(habit, position)
binding.tvAvoidedCount.text = habit.countAvoided.toString()
}
}
binding.btnIncDoneCount.setOnClickListener()
{
habit.countDone++
dbHelper.updateHabit(habit)
dbHelper.insertRecord(
HabitRecord(
date = getTodayDate(),
status = HabitStatus.DONE.value,
habitId = habit.id
)
)
listener.updateCount(habit, position)
binding.tvDoneCount.text = habit.countDone.toString()
}
binding.btnDecDoneCount.setOnClickListener()
{
if (habit.countDone > 0) {
habit.countDone--
dbHelper.updateHabit(habit)
//delete the last row where status is avoided
dbHelper.deleteHabitRecordWithStatus(habit.id, HabitStatus.DONE.value)
listener.updateCount(habit, position)
binding.tvDoneCount.text = habit.countDone.toString()
}
}
binding.tvNotification.setOnClickListener {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (!notificationManager.areNotificationsEnabled()) {
// Request notification permission for Android 13+
if (ContextCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
context as Activity, // Ensure the context is an Activity
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
1001
)
} else {
showTimePickerDialog()
}
} else {
showTimePickerDialog()
}
} else {
showTimePickerDialog()
}
}
binding.btnDelete.setOnClickListener(){
habit.id?.let { it1 -> deleteAlarm(it1) }
habit.coverImageUri?.let { it1 -> deleteImageFromInternalStorage(it1) }
dbHelper.deleteHabit(habit.id)
dbHelper.deleteAllHabitRecords(habit.id)
listener.deleted(habit,position)
bottomSheet.dismiss()
}
bottomSheet.setOnDismissListener {
listener.dismissed()
}
}
private fun showTimePickerDialog() {
// Get current time
val calendar = Calendar.getInstance()
val hour = calendar[Calendar.HOUR_OF_DAY]
val minute = calendar[Calendar.MINUTE]
// Create and show TimePickerDialog
val timePickerDialog = TimePickerDialog(
context,
{ _, hourOfDay, minute -> // Update the calendar with the selected time
calendar[Calendar.HOUR_OF_DAY] = hourOfDay
calendar[Calendar.MINUTE] = minute
// After selecting time, show dialog for repetition frequency
showFrequencyDialog(calendar, hourOfDay, minute)
},
hour,
minute,
true // Use 24-hour format
)
timePickerDialog.show()
}
// Function to load image with blur effect
private fun loadImageWithBlur(imageUri: String) {
// Show both ImageViews
try {
val bitmap = readImageFromInternalStorage(imageUri)
if(bitmap!=null){
// Load blurred image into background ImageView
Glide.with(context)
.load(bitmap)
.apply(RequestOptions.bitmapTransform(BlurTransformation(25, 3))) // Adjust blur radius and sampling
.into(binding.ivBlurredBackground)
// Load normal image into foreground ImageView
Glide.with(context)
.load(bitmap)
.into(binding.ivSelectedImage)
binding.frameSelectedImage.visibility= View.VISIBLE
}
} catch (e: FileNotFoundException) {
e.printStackTrace()
binding.frameSelectedImage.visibility= View.GONE
}
}
private fun deleteImageFromInternalStorage(uriString: String): Boolean {
val uri = Uri.parse(uriString)
return try {
// Convert the URI to a File object
val file = File(uri.path)
// Check if the file exists and delete it
if (file.exists()) {
file.delete()
} else {
false // File does not exist
}
} catch (e: Exception) {
e.printStackTrace()
false
}
}
private fun readImageFromInternalStorage(uriString: String): Bitmap? {
return try {
// Parse the URI string into a Uri object
val uri = Uri.parse(uriString)
// Open an input stream from the saved URI
val inputStream = FileInputStream(uri.path)
inputStream.use { stream ->
// Decode the input stream into a Bitmap
BitmapFactory.decodeStream(stream)
}
} catch (e: Exception) {
e.printStackTrace()
null
}
}
private fun showFrequencyDialog(calendar: Calendar, hourOfDay: Int, minute: Int) {
// Options for repetition frequency
val frequencies = arrayOf(
context.getString(R.string.once),
context.getString(R.string.daily),
context.getString(R.string.weekly)
)
val mapFreq = mapOf(
context.getString(R.string.once) to "0",
context.getString(R.string.daily) to "1",
context.getString(R.string.weekly) to "7"
)
// Show an AlertDialog to select frequency
val builder = AlertDialog.Builder(context)
builder.setTitle(context.getString(R.string.select_repetition_frequency))
builder.setItems(
frequencies
) { _, which ->
val frequency = frequencies[which]
// Update tvNotification with selected time and frequency
/* val notificationText = String.format(
Constants.NOTIFICATION_TIME_FORMAT,
hourOfDay,
minute,
frequency
)*/
val notificationText = getNotificationTimeText(context, hourOfDay, minute, frequency)
binding.tvNotification.text = notificationText
// Schedule notification based on selected time and frequency
scheduleNotification(
habit.id,
calendar,
frequency,
mapFreq[frequency] ?:""
)
}
builder.show()
}
@SuppressLint("StringFormatInvalid")
private fun scheduleNotification(
habitId: Int?,
calendar: Calendar,
frequency: String,
mapFreq: String
) {
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val delete: Boolean = mapFreq == "0";
val intent = Intent(context, NotificationReceiver::class.java)
intent.putExtra("task_id", habitId) // Pass task ID in intent
intent.putExtra("delete", delete)
intent.putExtra(
"task",
habit.name
)
val pendingIntent = habitId?.let {
PendingIntent.getBroadcast(
context,
it,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
}
val triggerTime = calendar.timeInMillis
var interval: Long = 0
// Determine repetition interval based on frequency
if (mapFreq == "1") {
interval = AlarmManager.INTERVAL_DAY
} else if (mapFreq=="7") {
interval = AlarmManager.INTERVAL_DAY * 7
}
// Store alarm details in database
dbHelper.insertOrUpdateAlarm(Alarm(habitId, triggerTime, mapFreq))
// Set the alarm
pendingIntent?.let {
if (interval > 0) {
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
triggerTime,
interval,
pendingIntent
)
} else {
alarmManager.set(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
) // For "Once" frequency
}
}
/* Toast.makeText(
context,
"Notification scheduled: $frequency",
Toast.LENGTH_SHORT
).show()
}*/
Toast.makeText(
context,
context.getString(R.string.Notification_scheduled, frequency),
Toast.LENGTH_SHORT
).show()
}
private fun deleteAlarm(habitId: Int) {
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Cancel alarm with habitId
val intent = Intent(context, NotificationReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
context,
habitId,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,
)
alarmManager.cancel(pendingIntent)
// Remove alarm from the database
dbHelper.deleteAlarm(habitId)
//Toast.makeText(context, "Notification cancelled", Toast.LENGTH_SHORT).show()
}
// private fun updateAlarm(
// habitId: Int,
// newCalendar: Calendar,
// newFrequency: String
// ) {
// // First, cancel the existing alarm
// deleteAlarm(habitId)
// // Then, set a new alarm with updated time and frequency
// scheduleNotification(habitId, newCalendar, newFrequency, mapFreq.get(frequency))
// }
private fun getTodayDate(): String {
var date: Date = Calendar.getInstance().time
val dateFormat: SimpleDateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
var formattedDate: String = dateFormat.format(date)
//Calendar.getInstance().timeInMillis.toString()
return formattedDate
}
fun show() {
bottomSheet.show()
}
interface HabitSheetListener {
fun updateCount(_habit: Habit, _position: Int)
fun deleted(_habit: Habit,_position: Int)
fun dismissed()
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/NotificationActionReceiver.kt
================================================
package rocks.poopjournal.todont.utils
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.core.content.ContextCompat
import rocks.poopjournal.todont.model.HabitRecord
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class NotificationActionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val id:Int=intent.getIntExtra("id",-1)
val dbHelper = DatabaseUtils(context)
val notificationId = 1 // Same ID as used in NotificationReceiver
// Get NotificationManager
val notificationManager =
ContextCompat.getSystemService(context, NotificationManager::class.java)
when (intent.action) {
"ACTION_AVOIDED" -> {
dbHelper.incrementCount(id,true)
dbHelper.insertRecord(
HabitRecord(
date = getTodayDate(),
status = HabitStatus.AVOIDED.value,
habitId = id
)
)
}
"ACTION_DONE" -> {
dbHelper.incrementCount(id,false)
dbHelper.insertRecord(
HabitRecord(
date = getTodayDate(),
status = HabitStatus.DONE.value,
habitId = id
)
)
}
}
notificationManager?.cancel(notificationId)
}
private fun getTodayDate(): String {
var date: Date = Calendar.getInstance().time
val dateFormat: SimpleDateFormat = SimpleDateFormat(Constants.DATE_FORMAT, Locale.getDefault())
var formattedDate: String = dateFormat.format(date)
//Calendar.getInstance().timeInMillis.toString()
return formattedDate
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/NotificationReceiver.kt
================================================
package rocks.poopjournal.todont.utils
import android.Manifest
import android.app.ActivityManager
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import rocks.poopjournal.todont.MainActivity
import rocks.poopjournal.todont.R
class NotificationReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val channel =
NotificationChannel("Tasks", "Tasks Reminder", NotificationManager.IMPORTANCE_HIGH)
val manager = ContextCompat.getSystemService(
context,
NotificationManager::class.java
)
manager?.createNotificationChannel(channel)
val task = intent.getStringExtra("task") ?: "Your task"
val id = intent.getIntExtra("task_id", -1)
val deleteAlarm=intent.getBooleanExtra("delete",false)
// Check if MainActivity is already running
val isMainActivityRunning = isAppInForeground(context)
if(deleteAlarm){
val databaseHelper = DatabaseUtils(context)
databaseHelper.deleteAlarm(id)
}
// Intent to open the app when clicking the notification
val openAppIntent = Intent(context, MainActivity::class.java).apply {
putExtra("openLog", true)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
}
val openAppPendingIntent=if(isMainActivityRunning){
PendingIntent.getActivity(
context,
0,
openAppIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
}else{
null;
}
// Intent for "Avoided" action
val avoidedIntent = Intent(context, NotificationActionReceiver::class.java).apply {
action = "ACTION_AVOIDED"
putExtra("id", id)
}
val avoidedPendingIntent = PendingIntent.getBroadcast(
context,
1,
avoidedIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// Intent for "Done" action
val doneIntent = Intent(context, NotificationActionReceiver::class.java).apply {
action = "ACTION_DONE"
putExtra("id", id)
}
val donePendingIntent = PendingIntent.getBroadcast(
context,
2,
doneIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val largeIcon = BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher)
// Build the notification
val builder = NotificationCompat.Builder(context, "Tasks")
.setSmallIcon(R.drawable.notification_logo)
.setLargeIcon(largeIcon)
.setContentTitle(context.getString(R.string.todon_t_reminder))
.setContentText(task)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setContentIntent(openAppPendingIntent) // Opens the app
.addAction(0, "Avoided", avoidedPendingIntent) // "Avoided" button
.addAction(0, "Done", donePendingIntent) // "Done" button
// Show the notification
val notificationManager = NotificationManagerCompat.from(context)
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
return
}
notificationManager.notify(1, builder.build())
}
private fun isAppInForeground(context: Context): Boolean {
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningAppProcessInfo = activityManager.runningAppProcesses
for (appProcess in runningAppProcessInfo) {
if (appProcess.processName == context.packageName) {
return appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
}
}
return false
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/SharedPrefUtils.kt
================================================
package rocks.poopjournal.todont.utils
import android.content.Context
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatDelegate
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.utils.SharedPrefUtils.Companion.KEY_NIGHT_MODE
import rocks.poopjournal.todont.utils.SharedPrefUtils.Companion.PREF_NAME
class SharedPrefUtils(private val context: Context) {
private val sharedPreferences: SharedPreferences =
context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
fun save(key: String?, name: String?) {
val editor = sharedPreferences.edit()
editor.putString(key, name)
editor.apply()
}
fun get(key: String?): String? {
return sharedPreferences.getString(key, null)
}
fun setBool(key: String?, name: Boolean) {
val editor = sharedPreferences.edit()
editor.putBoolean(key, name)
editor.apply()
}
fun getBool(key: String?): Boolean {
return sharedPreferences.getBoolean(key, false)
}
fun getString(key: String, defaultValue: String): String {
return sharedPreferences.getString(key, defaultValue) ?: defaultValue
}
fun putString(key: String, value: String) {
sharedPreferences.edit().putString(key, value).apply()
}
fun getBoolean(key: String, defaultValue: Boolean): Boolean {
return sharedPreferences.getBoolean(key, defaultValue)
}
fun putBoolean(key: String, value: Boolean) {
sharedPreferences.edit().putBoolean(key, value).apply()
}
fun getInt(key: String, defaultValue: Int): Int {
return sharedPreferences.getInt(key, defaultValue)
}
fun putInt(key: String, value: Int) {
sharedPreferences.edit().putInt(key, value).apply()
}
fun getLong(key: String, defaultValue: Long): Long {
return sharedPreferences.getLong(key, defaultValue)
}
fun putLong(key: String, value: Long) {
sharedPreferences.edit().putLong(key, value).apply()
}
fun getThemeMode():String{
return sharedPreferences.getString(KEY_NIGHT_MODE,"1").toString()
}
fun setThemeMode(mode:String){
sharedPreferences.edit().putString(KEY_NIGHT_MODE,mode).apply()
}
fun setMonitorEnabled(enabled: Boolean) {
sharedPreferences.edit().putBoolean(KEY_MONITOR_MODE, enabled).apply()
}
fun isMonitorEnabled(): Boolean {
return sharedPreferences.getBoolean(KEY_MONITOR_MODE, false)
}
companion object {
const val PREF_NAME = "MyPrefs"
const val KEY_ADD_OR_AVOIDED: String = "AddOrAvoided"
const val KEY_LOG: String = "Log"
const val KEY_CONTRIBUTION_VIEW: String = "CONTRIBUTION_VIEW"
const val KEY_APPEAR_VIEW: String = "APPEAR_VIEW"
const val KEY_FIRST_TIME = "FirstTime"
const val KEY_NIGHT_MODE = "NightMode"
const val KEY_MONITOR_MODE = "MonitorMode"
}
}
fun Context.getAppTheme():String{
val sharedPreferences: SharedPreferences =
this.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
return sharedPreferences.getString(KEY_NIGHT_MODE,"1").toString()
}
fun setAppTheme(context:Context) {
// Usage in when block
when (context.getAppTheme()) {
ThemeMode.FOLLOW_SYS.value -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
ThemeMode.LIGHT_MODE.value-> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
context.setTheme(R.style.Theme_Todon_Light)
}
ThemeMode.DARK_MODE.value -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
context.setTheme(R.style.Theme_Todon_Dark)
}
ThemeMode.DRACULA.value -> {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
context.setTheme(R.style.Theme_Todon_Dracula)
}
ThemeMode.DRACULA_PRO.value ->{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
context.setTheme(R.style.Theme_Todon_Dracula_Pro)
}
ThemeMode.DRACULA_PRO_ALUCARD.value ->{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
context.setTheme(R.style.Theme_Todon_Dracula_Alucard)
}
ThemeMode.DRACULA_PRO_BUFFY.value ->{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
context.setTheme(R.style.Theme_Todon_DraculaBlade_Buffy)
}
ThemeMode.DRACULA_PRO_BLADE.value ->{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
context.setTheme(R.style.Theme_Todon_DraculaBlade)
}
else ->{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/utils/Utils.kt
================================================
package rocks.poopjournal.todont.utils
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import androidx.appcompat.content.res.AppCompatResources
import androidx.core.graphics.drawable.DrawableCompat
import java.io.File
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
object Utils {
const val TOKEN: String = "c2VudGluZWwyMDE2"
const val REQUEST: String = "ios"
var tempFile: File? = null
fun getThemeColor(context: Context): String? {
val prefUtils = SharedPrefUtils(context)
return prefUtils.getString(Constants.APP_THEME_PRIMARY_COLOR, Constants.DEFAULT_APP_COLOR)
}
fun getThemeColor2(context: Context): String? {
val prefUtils = SharedPrefUtils(context)
return prefUtils.getString(
Constants.APP_THEME_SECONDARY_COLOR,
Constants.DEFAULT_APP_COLOR2
)
}
fun getDisableThemeColor(context: Context): String? {
val prefUtils = SharedPrefUtils(context)
return prefUtils.getString(
Constants.APP_DISABLE_PRIMARY_COLOR,
Constants.DEFAULT_APP_DISABLE_COLOR
)
}
fun getDisableTheme2Color(context: Context): String? {
val prefUtils = SharedPrefUtils(context)
return prefUtils.getString(
Constants.APP_DISABLE_SECONDARY_COLOR,
Constants.DEFAULT_APP_DISABLE_COLOR2
)
}
fun getGradient(
Color1: String?,
Color2: String?,
radius: Float,
orientation: GradientDrawable.Orientation?,
gradientType: Int,
strokeWidth: Int,
strokeClr: String?
): GradientDrawable {
val colors = intArrayOf(Color.parseColor(Color1), Color.parseColor(Color2))
val gd = GradientDrawable(
orientation,
colors
) //orientation GradientDrawable.Orientation.TOP_BOTTOM
gd.setStroke(strokeWidth, Color.parseColor(strokeClr))
gd.gradientType = gradientType //gradientType = GradientDrawable.LINEAR_GRADIENT;
gd.cornerRadius = radius
return gd
}
fun changeDateFormate(
inputPattern: String?,
outputPattern: String?,
stringDate: String
): String {
val inputFormat = SimpleDateFormat(inputPattern)
val outputFormat = SimpleDateFormat(outputPattern)
var time = ""
var date: Date? = null
try {
date = inputFormat.parse(stringDate)
} catch (e: ParseException) {
e.printStackTrace()
}
if (date != null) {
time = outputFormat.format(date)
}
return time
}
fun getDate(sdf: String?, dateInString: String): Date? {
val format = SimpleDateFormat(sdf, Locale.ENGLISH)
var dt: Date? = null
try {
dt = format.parse(dateInString)
} catch (e: ParseException) {
e.printStackTrace()
}
return dt
}
fun getStringDate(format: String?, date: Date): String {
val sdf = SimpleDateFormat(format, Locale.ENGLISH)
return sdf.format(date)
}
fun changeDrawableColor(mContext: Context, drawable: Int, color: Int): Drawable {
val unwrappedDrawable = checkNotNull(AppCompatResources.getDrawable(mContext, drawable))
val wrappedDrawable = DrawableCompat.wrap(
unwrappedDrawable
)
DrawableCompat.setTint(wrappedDrawable, color)
return unwrappedDrawable
}
fun changeTrackColor(context: Context, drawableId: Int): Drawable {
val changeClr1 = changeDrawableColor(
context, drawableId, Color.parseColor(
getThemeColor(context)
)
)
return changeClr1
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/widgets/MyAppNoButtonsWidgetProvider.kt
================================================
package rocks.poopjournal.todont.widgets
import android.app.PendingIntent
import android.app.TaskStackBuilder
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.widget.RemoteViews
import rocks.poopjournal.todont.MainActivity
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
class MyAppNoButtonsWidgetProvider : AppWidgetProvider() {
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
for (appWidgetId in appWidgetIds) {
val views = RemoteViews(context.packageName, R.layout.widget_layout_no_buttons)
// Set up the Add Icon click
val intent = Intent(context, MainActivity::class.java)
intent.putExtra(Constants.ADD_NEW_HABIT,true)
val pendingIntent = TaskStackBuilder.create(context).run {
addNextIntentWithParentStack(intent)
getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
}
views.setOnClickPendingIntent(R.id.add_icon, pendingIntent)
// Set up the ListView adapter
val svcIntent = Intent(context, NoButtonsWidgetService::class.java)
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
views.setRemoteAdapter(R.id.widget_list_view, svcIntent)
// Set up the PendingIntent template for list items
val clickIntent = Intent(context, MyAppSmallWidgetProvider::class.java)
val clickPendingIntent = PendingIntent.getBroadcast(
context,
0,
clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
)
views.setPendingIntentTemplate(R.id.widget_list_view, clickPendingIntent)
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
override fun onReceive(context: Context, intent: Intent) {
val appWidgetManager = AppWidgetManager.getInstance(context)
val appWidgetId = appWidgetManager.getAppWidgetIds(ComponentName(context, MyAppSmallWidgetProvider::class.java))
val action = intent.action
val widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
val habitId = intent.getIntExtra("HABIT_ID", -1)
if (widgetId != -1 && habitId != -1) {
when (action) {
"rocks.poopjournal.todont.INCREMENT_DONE_ACTION" -> {
DatabaseUtils(context).incrementCount(habitId, false)
}
"rocks.poopjournal.todont.INCREMENT_AVOIDED_ACTION" -> {
DatabaseUtils(context).incrementCount(habitId, true)
}
}
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_list_view)
}
super.onReceive(context, intent)
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/widgets/MyAppSmallWidgetProvider.kt
================================================
package rocks.poopjournal.todont.widgets
import android.app.PendingIntent
import android.app.TaskStackBuilder
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.widget.RemoteViews
import rocks.poopjournal.todont.MainActivity
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.utils.Constants
import rocks.poopjournal.todont.utils.DatabaseUtils
class MyAppSmallWidgetProvider : AppWidgetProvider() {
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
for (appWidgetId in appWidgetIds) {
val views = RemoteViews(context.packageName, R.layout.widget_layout)
// Set up the Add Icon click
val intent = Intent(context, MainActivity::class.java)
intent.putExtra(Constants.ADD_NEW_HABIT,true)
val pendingIntent = TaskStackBuilder.create(context).run {
addNextIntentWithParentStack(intent)
getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
}
views.setOnClickPendingIntent(R.id.add_icon, pendingIntent)
// Set up the ListView adapter
val svcIntent = Intent(context, WidgetService::class.java)
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
views.setRemoteAdapter(R.id.widget_list_view, svcIntent)
// Set up the PendingIntent template for list items
val clickIntent = Intent(context, MyAppSmallWidgetProvider::class.java)
val clickPendingIntent = PendingIntent.getBroadcast(
context,
0,
clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
)
views.setPendingIntentTemplate(R.id.widget_list_view, clickPendingIntent)
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
override fun onReceive(context: Context, intent: Intent) {
val appWidgetManager = AppWidgetManager.getInstance(context)
val appWidgetId = appWidgetManager.getAppWidgetIds(ComponentName(context, MyAppSmallWidgetProvider::class.java))
val action = intent.action
val widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
val habitId = intent.getIntExtra("HABIT_ID", -1)
if (widgetId != -1 && habitId != -1) {
when (action) {
"rocks.poopjournal.todont.INCREMENT_DONE_ACTION" -> {
DatabaseUtils(context).incrementCount(habitId, false)
}
"rocks.poopjournal.todont.INCREMENT_AVOIDED_ACTION" -> {
DatabaseUtils(context).incrementCount(habitId, true)
}
}
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_list_view)
}
super.onReceive(context, intent)
}
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/widgets/NobuttonsWidgetService.kt
================================================
package rocks.poopjournal.todont.widgets
import android.content.Intent
import android.widget.RemoteViewsService
import android.appwidget.AppWidgetManager
import android.content.Context
import android.widget.RemoteViews
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
class NoButtonsWidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory {
return NoButtonsWidgetItemFactory(applicationContext)
}
}
class NoButtonsWidgetItemFactory(private val context: Context) : RemoteViewsService.RemoteViewsFactory {
private val habitList = mutableListOf()
override fun onCreate() {}
override fun onDataSetChanged() {
habitList.clear()
habitList.addAll(DatabaseUtils(context).getAllHabits())
}
override fun onDestroy() {
habitList.clear()
}
override fun getCount(): Int = habitList.size
override fun getViewAt(position: Int): RemoteViews {
val habit = habitList[position]
val views = RemoteViews(context.packageName, R.layout.widget_item_no_buttons)
// Set text for the habit name, description, and counts
views.setTextViewText(R.id.tvHabitName, habit.name)
views.setTextViewText(R.id.tvLabelOfHabit, habit.description)
views.setTextViewText(R.id.tvDone, habit.countDone.toString())
views.setTextViewText(R.id.tvAvoided, habit.countAvoided.toString())
return views
}
override fun getLoadingView(): RemoteViews? = null
override fun getViewTypeCount(): Int = 1
override fun getItemId(position: Int): Long = position.toLong()
override fun hasStableIds(): Boolean = true
}
================================================
FILE: app/src/main/java/rocks/poopjournal/todont/widgets/WidgetService.kt
================================================
package rocks.poopjournal.todont.widgets
import android.content.Intent
import android.widget.RemoteViewsService
import android.appwidget.AppWidgetManager
import android.content.Context
import android.widget.RemoteViews
import rocks.poopjournal.todont.R
import rocks.poopjournal.todont.model.Habit
import rocks.poopjournal.todont.utils.DatabaseUtils
class WidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory {
return WidgetItemFactory(applicationContext)
}
}
class WidgetItemFactory(private val context: Context) : RemoteViewsService.RemoteViewsFactory {
private val habitList = mutableListOf()
override fun onCreate() {}
override fun onDataSetChanged() {
habitList.clear()
habitList.addAll(DatabaseUtils(context).getAllHabits())
}
override fun onDestroy() {
habitList.clear()
}
override fun getCount(): Int = habitList.size
override fun getViewAt(position: Int): RemoteViews {
val habit = habitList[position]
val views = RemoteViews(context.packageName, R.layout.widget_item)
// Set text for the habit name, description, and counts
views.setTextViewText(R.id.tvHabitName, habit.name)
views.setTextViewText(R.id.tvLabelOfHabit, habit.description)
views.setTextViewText(R.id.tvDone, habit.countDone.toString())
views.setTextViewText(R.id.tvAvoided, habit.countAvoided.toString())
// Set up the Done button click using setOnClickFillInIntent
val incrementDoneIntent = Intent().apply {
action = "rocks.poopjournal.todont.INCREMENT_DONE_ACTION"
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, position)
putExtra("HABIT_ID", habit.id)
}
views.setOnClickFillInIntent(R.id.btnAddToDone, incrementDoneIntent)
// Set up the Avoided button click using setOnClickFillInIntent
val incrementAvoidedIntent = Intent().apply {
action = "rocks.poopjournal.todont.INCREMENT_AVOIDED_ACTION"
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, position)
putExtra("HABIT_ID", habit.id)
}
views.setOnClickFillInIntent(R.id.btnAddToAvoided, incrementAvoidedIntent)
return views
}
override fun getLoadingView(): RemoteViews? = null
override fun getViewTypeCount(): Int = 1
override fun getItemId(position: Int): Long = position.toLong()
override fun hasStableIds(): Boolean = true
}
================================================
FILE: app/src/main/res/anim/fade_in.xml
================================================
================================================
FILE: app/src/main/res/anim/fade_out.xml
================================================
================================================
FILE: app/src/main/res/drawable/_cross.xml
================================================
================================================
FILE: app/src/main/res/drawable/_tick.xml
================================================
================================================
FILE: app/src/main/res/drawable/about.xml
================================================
================================================
FILE: app/src/main/res/drawable/backgorundinner.xml
================================================
================================================
FILE: app/src/main/res/drawable/bell.xml
================================================
================================================
FILE: app/src/main/res/drawable/bottom_nav_color.xml
================================================
================================================
FILE: app/src/main/res/drawable/bottom_sheet.xml
================================================
================================================
FILE: app/src/main/res/drawable/continuebutton2.xml
================================================
================================================
FILE: app/src/main/res/drawable/continuebuttontrans.xml
================================================
================================================
FILE: app/src/main/res/drawable/dis.xml
================================================
================================================
FILE: app/src/main/res/drawable/email.xml
================================================
================================================
FILE: app/src/main/res/drawable/fix_cross.xml
================================================
================================================
FILE: app/src/main/res/drawable/fix_fab.xml
================================================
-
-
-
================================================
FILE: app/src/main/res/drawable/fix_rounded_rectangle.xml
================================================
================================================
FILE: app/src/main/res/drawable/fix_tick.xml
================================================
================================================
FILE: app/src/main/res/drawable/frame__4_.xml
================================================
================================================
FILE: app/src/main/res/drawable/frame__5_.xml
================================================
================================================
FILE: app/src/main/res/drawable/frame__6_.xml
================================================
================================================
FILE: app/src/main/res/drawable/git.xml
================================================
================================================
FILE: app/src/main/res/drawable/grad_tab_back.xml
================================================
================================================
FILE: app/src/main/res/drawable/grad_window_backgrond.xml
================================================
================================================
FILE: app/src/main/res/drawable/gradient_background.xml
================================================
================================================
FILE: app/src/main/res/drawable/gradient_fab.xml
================================================
-
-
-
================================================
FILE: app/src/main/res/drawable/habitlogcheck.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_about.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_add.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_appearance.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_avoided.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_back.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_backarrow.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_backarrowpressed.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_background.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_cross.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_delete.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_done.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_downarrow.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_facebook.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_foreground.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_habitscircle.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_label_light.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_log.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_menu.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_monochrome.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_nextarrow.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_nextpressed.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_sad.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_spinner.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_today.xml
================================================
================================================
FILE: app/src/main/res/drawable/info.xml
================================================
================================================
FILE: app/src/main/res/drawable/log_frag_selected.xml
================================================
================================================
FILE: app/src/main/res/drawable/monitor.xml
================================================
================================================
FILE: app/src/main/res/drawable/mygradient.xml
================================================
================================================
FILE: app/src/main/res/drawable/mygradient1.xml
================================================
================================================
FILE: app/src/main/res/drawable/myinnergradient.xml
================================================
================================================
FILE: app/src/main/res/drawable/myinnergradientlog.xml
================================================
================================================
FILE: app/src/main/res/drawable/myinnergradientlogs.xml
================================================
================================================
FILE: app/src/main/res/drawable/notification_logo.xml
================================================
================================================
FILE: app/src/main/res/drawable/onboard.xml
================================================
================================================
FILE: app/src/main/res/drawable/reportproblem.xml
================================================
================================================
FILE: app/src/main/res/drawable/roundbutton.xml
================================================
================================================
FILE: app/src/main/res/drawable/rounded_button.xml
================================================
================================================
FILE: app/src/main/res/drawable/rounded_corners.xml
================================================
================================================
FILE: app/src/main/res/drawable/rounded_dialog_bg.xml
================================================
================================================
FILE: app/src/main/res/drawable/selectedround.xml
================================================
================================================
FILE: app/src/main/res/drawable/spinner_background.xml
================================================
-
================================================
FILE: app/src/main/res/drawable/tabcolor.xml
================================================
================================================
FILE: app/src/main/res/drawable/translate.xml
================================================
================================================
FILE: app/src/main/res/drawable/trash.xml
================================================
================================================
FILE: app/src/main/res/drawable/twitter.xml
================================================
================================================
FILE: app/src/main/res/drawable/viewsrc.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_about.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_labels.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_main.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_on_boarding.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_settings.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_splash__screen.xml
================================================
================================================
FILE: app/src/main/res/layout/dialog_info.xml
================================================
================================================
FILE: app/src/main/res/layout/dialogbox.xml
================================================
================================================
FILE: app/src/main/res/layout/dialogbox_add_new_habit.xml
================================================
================================================
FILE: app/src/main/res/layout/dialogbox_labels.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_avoided.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_daily.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_done.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_habits.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_log2.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_log_habits.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_monthly.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_today2.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_weekly.xml
================================================
================================================
FILE: app/src/main/res/layout/fragment_yearly.xml
================================================
================================================
FILE: app/src/main/res/layout/initial_no_buttons_widget_view.xml
================================================
================================================
FILE: app/src/main/res/layout/initial_widget_view.xml
================================================
================================================
FILE: app/src/main/res/layout/labels_recyclerview_layout.xml
================================================
================================================
FILE: app/src/main/res/layout/layout_habit_bottom_sheet.xml
================================================
"/>
================================================
FILE: app/src/main/res/layout/menu_fragment.xml
================================================
================================================
FILE: app/src/main/res/layout/no_buttons_widget_preview.xml
================================================
================================================
FILE: app/src/main/res/layout/recyclerview_layout.xml
================================================
================================================
FILE: app/src/main/res/layout/recyclerview_layout_habits.xml
================================================
================================================
FILE: app/src/main/res/layout/recyclerview_layout_log_habits.xml
================================================
================================================
FILE: app/src/main/res/layout/widget_item.xml
================================================
================================================
FILE: app/src/main/res/layout/widget_item_no_buttons.xml
================================================
================================================
FILE: app/src/main/res/layout/widget_layout.xml
================================================
================================================
FILE: app/src/main/res/layout/widget_layout_no_buttons.xml
================================================
================================================
FILE: app/src/main/res/layout/widget_preview.xml
================================================
================================================
FILE: app/src/main/res/menu/navigation.xml
================================================
================================================
FILE: app/src/main/res/menu/topmenu.xml
================================================
================================================
FILE: app/src/main/res/resources.properties
================================================
unqualifiedResLocale=en-US
================================================
FILE: app/src/main/res/values/attrs.xml
================================================
================================================
FILE: app/src/main/res/values/colors.xml
================================================
#FFFFFF
#000000
#676979
#CFD1DD
#E7E8EE
#000000
#FFFFFF
#FFFFFF
#000000
#676979
#CFD1DD
#FF6701
#FFFFFF
#FFD500
#FFAA00
#000000
#FFAA00
#000000
#FFFFFF
#FFD500
#FFAA00
#000000
#FF8F01
#FFC001
#FF0000
#FFFFFF
#000000
#FFFFFF
#868898
#4B4D59
#26262C
#FFFFFF
#42434D
#26272C
#FFFFFF
#B2B3BD
#555763
#FFBF00
#000000
#26272C
#26272C
#FFFFFF
#131316
#FFFFFF
#2F3037
#FFCC00
#FFB200
#000000
#131316
#131316
#282A36
#FFFFFF
#7E83A0
#46495E
#383B4C
#FFFFFF
#52576F
#44475A
#FFFFFF
#ADB0C2
#6F7495
#BC94F8
#282A36
#44475A
#44475A
#FFFFFF
#323443
#FFFFFF
#44475A
#BC94F8
#BC94F8
#282A36
#323443
#323443
#66F859
#000000
#F859A8
#FFFFFF
#9580FF
#FFFFFF
#F5F5F5
#000000
#707070
#CCCCCC
#E0E0E0
#000000
#F5F5F5
#F5F5F5
#000000
#707070
#CCCCCC
#644AC9
#FFFFFF
#E6E6E6
#E6E6E6
#000000
#D1D1D1
#000000
#E6E6E6
#644AC9
#644AC9
#FFFFFF
#D1D1D1
#D1D1D1
#FFFFFF
#000000
#FFD500
#FFAA00
#676979
#CFD1DD
================================================
FILE: app/src/main/res/values/dimen.xml
================================================
24dp
================================================
FILE: app/src/main/res/values/ids.xml
================================================
================================================
FILE: app/src/main/res/values/strings.xml
================================================
To Don\'t
- Select Language
- Czech
- Danish
- German
- English
- Spanish
- Italian
- French
- January
- February
- March
- April
- May
- June
- July
- August
- September
- October
- November
- December
Are you sure you want to delete this habit?
To Don\'t
The reverse to-do list
Jot down your bad habits. Every day, cross
out those you gave in to. And the next
morning start off with the fresh list.
Continue
Avoided
Done
Habits
Today
Log
About
Labels
New Labels
Time
Frequency
Settings
Most avoided:
Least avoided:
Please add a label first
Add new label
Enter Bad Habit
Description
Save
To start off, put down a bad habit
Habits will show up here
Apache License 2.0
Developer
Contribute
Translate
Report a problem
View source
Open-source licences
Appearance
Monitor errors
Use Sentry to auto-report issues for faster bug fixes and improved stability. Only essential technical data is collected.
Dark
Light
Update
Feather Icons
MIT License
MaterialSpinner
Follow System
Eclipse Public License 1.0
GNU General Public License CE
D
Notification scheduled
W
M
Y
" out of "
" habits are avoided"
" habits are avoided, way to go!"
Avoided
Habits
Do you really want to delete this?
No
Do you really want to delete this?
Yes
Please Add a Label First
Do you really want to delete this?
January
February
March
April
May
June
July
August
September
October
November
December
Mark as done or avoided.
Help make \"To Don\'t\" better.
ToDon\'t Reminder
"Mark your ToDon't task "
To Start Off, put down a bad habit.
View your stats.
Add Label.
Permission Required
This app requires access to your external storage to restore the database. Please enable this permission in the app settings.
Open Settings
Select Repetition Frequency
Once
Daily
Weekly
Do you really want to delete this?\nThis will also delete all habits related to this label.
Data
Add daily notification
Back up
Restore
- Social
- Foods And Drinks
- Studies
# Toasts
To Don\'t now follows your system.
To Don\'t is on the light side now.
To Don\'t is on the dark side now.
# Here are the non-translateable strings
Crazy Marvin
Code Acquaria
Link Hello blank fragment
ShowCaseView
https://github.com/mreram/ShowCaseView?
NoboButton
CircleImageView
MPAndroidChart
JUnit
Android Jetpack
Kotlin
Java
Dracula
Dracula PRO Blade
Dracula PRO Buffy
Dracula Pro Alucard
Dracula Pro
# Here are the contentDescription strings (for impaired users) starting with
"contentDescription_"
Add new To Don\'t item
================================================
FILE: app/src/main/res/values/styles.xml
================================================
================================================
FILE: app/src/main/res/values-ar/strings.xml
================================================
- حدد اللغة
- التشيكية
- دانماركي
- الألمانية
- إنجليزي
- الأسبانية
- إيطالي
- فرنسي
- يناير
- فبراير
- يمشي
- أبريل
- يمكن
- يونيو
- يوليو
- أغسطس
- سبتمبر
- أكتوبر
- نوفمبر
- ديسمبر
هل أنت متأكد من أنك تريد حذف هذه العادة؟
إلى لا
قائمة المهام العكسية
تدوين عاداتك السيئة.كل يوم ، عبور
من أولئك الذين استسلمتهم ل.واليسبته
يبدأ الصباح مع القائمة الجديدة.
يكمل
تجنب
منتهي
العادات
اليوم
سجل
عن
تسميات
تسمية جديدة
الوقت
التكرار
إعدادات
تجنبها الأكثر:
على الأقل تجنب:
الرجاء إضافة ملصق أولا
أضف تسمية جديدة
أدخل عادة سيئة
وصف
يحفظ
لتبدأ ، وضع عادة سيئة
ستظهر العادات هنا
ترخيص Apache 2.0
المطور
يساهم
يترجم
الإبلاغ عن مشكلة
عرض المصدر
تراخيص مفتوحة المصدر
مظهر
مظلم
ضوء
تحديث
أيقونات الريش
رخصة معهد ماساتشوستس للتكنولوجيا
Android Jetpack
Materialspinner
اتبع النظام
نوبوتون
Circleimageview
Mpandroidchart
JUnit
Eclipse Public License 1.0
كوتلين
جافا
رخصة Gnu العامة Ce
- اجتماعي
- الأطعمة والمشروبات
- دراسات
# Toasts
To Don\\\'t يستخدم الآن سمة %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
أضف جديدًا إلى عنصر Don \'T
د
تمت جدولة الإشعار
ث
م
ذ
"خارج"
"العادات يتم تجنبها"
"العادات يتم تجنبها ، وسيلة للذهاب!"
تجنب
العادات
هل تريد حقا حذف هذا؟
لا
هل تريد حقا حذف هذا؟
نعم
الرجاء إضافة ملصق أولا
هل تريد حقا حذف هذا؟
يناير
فبراير
يمشي
أبريل
يمكن
يونيو
يوليو
أغسطس
سبتمبر
أكتوبر
نوفمبر
ديسمبر
علامة كما فعلت أو تجنب.
ساعد في جعل \ "للاضطراب أفضل.
تذكير Toodon
"حدد مهمة Todon الخاصة بك"
للبدء ، وضع عادة سيئة.
عرض إحصائياتك.
إضافة التسمية.
إذن مطلوب
يتطلب هذا التطبيق الوصول إلى التخزين الخارجي الخاص بك لاستعادة قاعدة البيانات.يرجى تمكين هذا الإذن في إعدادات التطبيق.
فتح الإعدادات
حدد تردد التكرار
مرة واحدة
يوميًا
أسبوعي
هل تريد حقًا حذف هذا؟ \ Nthis ستحذف أيضًا جميع العادات المتعلقة بهذه التسمية.
بيانات
أضف إشعارًا يوميًا
احتياطي
يعيد
Dracula
================================================
FILE: app/src/main/res/values-az/strings.xml
================================================
- Dil Seçin
- Çex
- Danimarka
- Almanca
- İngilisləşdirmək
- İspan Dili
- İtalyan
- Fransız
- Yanvar
- Fevral
- Mart
- Aprel
- Maya
- İyun
- İyul
- Avqust
- Sentyabr
- Oktyabr
- Noyabr
- Dekabr
Bu Vərdişi Silmək Istədiyinizə Əminsiniz?
Don \'T
Tərsin Siyahısı Siyahısı
Pis Vərdişlərinizi Aşağı Salın.Hər Gün Xaç
Verdiyiniz Insanlardan.Və Sonrakı
Səhər Təzə Siyahı Ilə Başlayın.
Davam Etmək
Əlindənhayabənzər
Tamamlandı
Vərdişlər
Bu Gün
Lax
Haqqında
Efirlik
Parametrlər
Ən Çox Qaçdı:
Ən Azından Çəkindi:
Zəhmət Olmasa Əvvəlcə Bir Etiket Əlavə Edin
Yeni Etiket Əlavə Edin
Pis Vərdiş Daxil Etmək
Təsvir
Qurtarmaq
Başlamaq Üçün Pis Bir Vərdiş Qoyun
Vərdişlər Burada Göstərəcək
Apache Lisenziyası 2.0
Tərtibatçı
Töhfə Vermək
Tərcümə Etmək
Bir Problem Barədə Məlumat Verin
Mənbəyinə Baxın
Açıq Mənbə Lisenziyaları
Görünüş
Qaranlıq
İşıq
Aktuallaşdırmaq
Lələk Nişanları
Mit Lisenziyası
Android Jetpack
Materialpinner
Sistemi Izləyin
Nobert
Circeimageview
Mpadroidchart
İlkin
Eclipse Ictimai Lisenziyası 1.0
Kotlin
Java
Gnu Ümumi İctimai Lisenziyası
- İctimai
- Yemək Və Içkilər
- İş
# Toasts
To Don\\\'t indi %s mövzusundan istifadə edir.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Don-Un Elementinə Yeni Əlavə Edin
D
W
M
Y
"Çıxmaq"
"Vərdişlər Qarşısı Alınır"
"Vərdişlər, Yola Çıxdı, Getmə Yolu!"
Əlindənhayabənzər
Vərdişlər
Həqiqətən Bunu Silmək Istəyirsən?
Yox
Həqiqətən Bunu Silmək Istəyirsən?
Bəli
Zəhmət Olmasa Əvvəlcə Bir Etiket Əlavə Edin
Həqiqətən Bunu Silmək Istəyirsən?
Yanvar
Fevral
Mart
Aprel
Maya
İyun
İyul
Avqust
Sentyabr
Oktyabr
Noyabr
Dekabr
Etdikdə Və Ya Qarşısı Alındı.
Kömək Etmək \ "\" Daha Yaxşı.
Todon \'T Xatırlatması
"Todon Tapşırığınızı Qeyd Edin"
Başlamaq Üçün Pis Bir Vərdiş Qoyun.
Statistikalarınıza Baxın.
Etiket Əlavə Edin.
İcazə Tələb Olunur
Bu Proqramlar Verilənlər Bazasını Bərpa Etmək Üçün Xarici Yaddaşınıza Giriş Tələb Edir.Zəhmət Olmasa, Bu Icazəni Tətbiq Parametrlərində Aktivləşdirin.
Parametrləri Açın
Təkrarlama Tezliyini Seçin
Bir Dəfə
Gündəlik
Həftəlik
Həqiqətən Bu Silmək Istəyirsən? \ Nthis Bu Etiketlə Əlaqəli Bütün Vərdişləri Də Siləcəkdir.
Məlumat
Gündəlik Bildiriş Əlavə Edin
Yedək
Bərpa Etmək
Dracula
================================================
FILE: app/src/main/res/values-b+art/strings.xml
================================================
================================================
FILE: app/src/main/res/values-be/strings.xml
================================================
- Выберыце Мову
- Чэш
- Дацкі
- Нямецкі
- Англійская
- Іспанскі
- Італьянскі
- Француз
- Студзень
- Люты
- Маршыраваць
- Красавік
- Травень
- Чэрвень
- Ліпень
- Жнівень
- Верасень
- October
- Лістапад
- Снежань
Вы Ўпэўнены, Што Хочаце Выдаліць Гэтую Звычку?
Каб Не
Спіс Зваротнага Спраў
Запішыце Свае Дрэнныя Звычкі.Кожны Дзень, Крыж
З Тых, Каго Вы Паддаліся.І Наступнае
Раніца Пачніце Са Свежага Спісу.
Працягваць
Пазбягаў
Зроблены
Звычкі
Сёння
Бервяно
Пра
Ярлыкі
Налады
Найбольш Пазбегнуць:
Найменш Пазбягае:
Калі Ласка, Дадайце Этыкетку Спачатку
Дадайце Новы Этыкетка
Увядзіце Дрэнную Звычку
Апісанне
Ашчаджаць
Для Пачатку Адкладзеце Дрэнную Звычку
Звычкі З\'Явяцца Тут
Ліцэнзія Apache 2.0
Забудоўшчык
Спрыяць
Перакладаць
Паведаміць Пра Праблему
Крыніца Прагляду
Ліцэнзіі З Адкрытым Зыходным Кодам
Знешнасць
Цёмны
Святло
Абнаўленне
Іконы Пяра
Ліцэнзія Mit
Android Jetpack
Materialspinner
Выконвайце Сістэму
Nobobutton
Circlemageview
Mpandroidchart
Чэрвет
Зацьменне Публічная Ліцэнзія 1.0
Котлін
Ява
Gnu Агульная Публічная Ліцэнзія Ce
- Грамадскі
- Прадукты І Напоі
- Даследаванні
# Toasts
To Don\\\'t зараз выкарыстоўвае тэму %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Дадайце Новы Ў Элемент Don \'T
D
W
M
Y
"З"
"Звычкі Пазбягаюць"
"Звычкі Пазбягаюць, Шлях!"
Пазбягаў
Звычкі
Вы Сапраўды Хочаце Выдаліць Гэта?
Ніякі
Вы Сапраўды Хочаце Выдаліць Гэта?
Так
Калі Ласка, Дадайце Этыкетку Спачатку
Вы Сапраўды Хочаце Выдаліць Гэта?
Студзень
Люты
Маршыраваць
Красавік
Травень
Чэрвень
Ліпень
Жнівень
Верасень
Кастрычнік
Лістапад
Снежань
Адзначыць, Як Зроблена Альбо Пазбягае.
Дапамажыце Зрабіць \ ", Каб Не Было \'T \" Лепш.
Todon \'T Напамін
"Адзначце Сваю Задачу" Не ""
Для Пачатку Адкладзеце Дрэнную Звычку.
Праглядзіце Вашу Статыстыку.
Дадайце Этыкетку.
Патрабуецца Дазвол
Гэта Дадатак Патрабуе Доступу Да Вашага Знешняга Сховішча Для Аднаўлення Базы Дадзеных.Калі Ласка, Уключыце Гэты Дазвол У Наладах Прыкладання.
Адкрытыя Налады
Выберыце Частата Паўтарэння
Раз
Штодзённы
Штотыднёвы
Вы Сапраўды Хочаце Выдаліць Гэта? \ Nthis Таксама Выдаліць Усе Звычкі, Звязаныя З Гэтай Этыкеткай.
Дадзеныя
Дадайце Штодзённае Апавяшчэнне
Назад
Аднаўляць
Dracula
================================================
FILE: app/src/main/res/values-bg/strings.xml
================================================
- Изберете Език
- Чех
- Датски
- Немски
- Английски
- Испански
- Италиански
- Френски
- Януари
- Февруари
- Март
- Април
- Може
- Юни
- Юли
- Август
- Септември
- Октомври
- Ноември
- Декември
Сигурни Ли Сте, Че Искате Да Изтриете Този Навик?
Да Не \'T
Списъкът С Обратни Задачи
Запишете Лошите Си Навици.Всеки Ден, Кръст
От Тези, На Които Сте Се Отказали.И Следващия
Сутрин Започнете С Списъка Fresh.
Продължете
Избягва Се
Готово
Навици
Днес
Log
Около
Етикети
Настройки
Повечето Избягват:
Най -Малко Избягва:
Моля, Първо Добавете Етикет
Добавете Нов Етикет
Въведете Лош Навик
Описание
Запазете
За Да Започнете, Оставете Лош Навик
Тук Ще Се Появят Навици
Апач Лиценз 2.0
Разработчик
Допринасяйте
Превод
Докладвайте За Проблем
Преглед На Източника
Лицензи С Отворен Код
Външен Вид
Тъмно
Светлина
Актуализация
Feather Icons
MIT License
Android Jetpack
Materialspinner
Следвайте Системата
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Public License 1.0
Котлин
Ява
Gnu Обща Публична Лицензия Ce
- Социални
- Храни И Напитки
- Изследвания
# Toasts
To Don\\\'t вече използва темата %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Добавете Нов Към Елемента Don \'T
Г
W
M
Y
"Извън"
"Навиците Се Избягват"
"Навиците Се Избягват, Начин Да Тръгнем!"
Избягва Се
Навици
Наистина Ли Искате Да Изтриете Това?
Не
Наистина Ли Искате Да Изтриете Това?
Да
Моля, Първо Добавете Етикет
Наистина Ли Искате Да Изтриете Това?
Януари
Февруари
Март
Април
Може
Юни
Юли
Август
Септември
Октомври
Ноември
Декември
Маркирайте, Както Е Направено Или Избягвано.
Помогнете Да Направите \ "Да Не \'T \" По -Добре.
Тодон \'Не Напомняне
"Маркирайте Вашата Задача" Не Е На Todon "
За Да Започнете, Оставете Лош Навик.
Вижте Статистиката Си.
Добавете Етикета.
Необходимо Е Разрешение
Това Приложение Изисква Достъп До Външното Ви Съхранение, За Да Възстановите Базата Данни.Моля, Активирайте Това Разрешение В Настройките На Приложението.
Отворени Настройки
Изберете Честота На Повторение
Веднъж
Ежедневно
Седмично
Наистина Ли Искате Да Изтриете Това? \ Nthis Също Ще Изтриете Всички Навици, Свързани С Този Етикет.
Данни
Добавете Ежедневно Известие
Резервно Копие
Възстановяване
Dracula
================================================
FILE: app/src/main/res/values-bs/strings.xml
================================================
- Odaberite Jezik
- Češki
- Danski
- Njemački
- Engleski
- Španski
- Italijanski
- Francuski
- Januar
- Februar
- Mart
- April
- Maja
- Juni
- Juli
- Avgust
- Septembar
- Oktobar
- Novembar
- Decembar
Jeste Li Sigurni Da Želite Izbrisati Ovu Naviku?
Da Ne Donesi
Popis Obrnutog Obaveza
Jot Spuštajte Svoje Loše Navike.Svakog Dana, Križ
Onima Koje Ste Dali.I Sledeće
Jutro Započnite Sa Svježim Popisom.
Nastaviti
Izbegnut
Gotov
Navike
Danas
Zapisnik
O
Etikete
Postavke
Najviše Se Izbjegava:
Najmanje Izbjegavati:
Prvo Dodajte Etiketu
Dodajte Novu Etiketu
Unesite Lošu Naviku
Opis
Sačuvati
Za Početak, Odloži Lošu Naviku
Navike Će Se Pojaviti Ovdje
Apache Licence 2.0
Programer
Doprinos
Prevesti
Prijavite Problem
Pogledajte Izvor
Licence Otvorenog Koda
Izgled
Mrak
Svjetlost
Ažurirati
Perje Ikone
Mit Licenca
Android Jetpack
Materialspinner
Pratite Sistem
Nobobutton
Circimageview
Mpandroidcart
Junit
Javna Licenca Eclipse 1.0
Kotlin
Java
Gnu General Public Licenc Ce
- Društveni
- Hrana I Piće
- Studije
# Toasts
To Don\\\'t sada koristi %s temu.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Dodajte Novi Za Nekom Stavku
D
W
M
Y
"Izvan"
"Navikati Se Izbjegavaju"
"Navike Se Izbjegavaju, Na Putu Da Ide!"
Izbegnut
Navike
Da Li Stvarno Želite Ovo Izbrisati?
Ne
Da Li Stvarno Želite Ovo Izbrisati?
Da
Prvo Dodajte Etiketu
Da Li Stvarno Želite Ovo Izbrisati?
Januar
Februar
Mart
April
Maja
Juni
Juli
Avgust
Septembar
Oktobar
Novembar
Decembar
Označiti Kao Učinjeno Ili Izbjegavanje.
Pomozite Učiniti \ "Da Ne Bude" Bolje.
Todon \'T Podsjetnik
"Označite Svoj Zadatak"
Da Se Pokrene, Odloži Lošu Naviku.
Pogledajte Svoje Statistike.
Dodajte Naljepnicu.
Potrebna Dozvola
Ova Aplikacija Zahtijeva Pristup Vašem Vanjskom Prostoru Za Obnovu Baze Podataka.Omogućite Ovo Odobrenje U Postavkama Aplikacija.
Otvorite Postavke
Odaberite Frekvenciju Ponavljanja
Jednom
Svakodnevno
Tjedan
Da Li Zaista Želite Da Izbrišete Ovo? \ Nth Će Izbrisati I Sve Navike Povezane Sa Ovom Etiketom.
Podaci
Dodajte Dnevnu Obavijest
Sigurnosno Kopirati
Vratiti
Dracula
================================================
FILE: app/src/main/res/values-ca/strings.xml
================================================
- Seleccioneu El Llenguatge
- Txec
- Danès
- Alemany
- Anglès
- Espanyol
- Italià
- Francès
- Gener
- Febrer
- Marxar
- Abril
- Maig
- Juny
- Juliol
- Agost
- Setembre
- Octubre
- Novembre
- Desembre
Esteu Segur Que Voleu Suprimir Aquest Hàbit?
Per Donar \'T
La Llista Inversa De Tasques
Anoteu Els Vostres Mals Hàbits.Cada Dia, Creu
Fora Dels Que Vau Cedir.I El Següent
Comença Al Matí Amb La Llista Fresca.
Continuar
Evitat
Fer
Hàbits
Avui
Tronc
Al Voltant De
Etiquetes
Configuració
Més Evitat:
Menys Evitat:
Afegiu Primer Una Etiqueta
Afegiu Una Nova Etiqueta
Entra Al Mal Hàbit
Descripció
Estalviar
Per Començar, Poseu Un Mal Hàbit
Els Hàbits Apareixeran Aquí
Llicència Apache 2.0
Desenvolupador
Contribuir
Traduir
Informeu D’Un Problema
Veure Font
Llicències De Codi Obert
Appearance
Fosc
Llum
Actualitzar
Icones De Ploma
Llicència Mit
Android Jetpack
Materials
Segueix El Sistema
Nobobutton
Circleimageview
Mpandroidchart
Juny
Llicència Pública Eclipse 1.0
Kotlin
Java
Llicència Pública General Gnu Ce
- Social
- Aliments I Begudes
- Estudis
# Toasts
To Don\\\'t està utilitzant el tema %s ara.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Afegiu Nou A L\'Article De Don \'T
D
W
M
I
"Fora"
"S'Eviten Els Hàbits"
"S'Eviten Els Hàbits, Camí A Seguir!"
Evitat
Hàbits
De Debò Voleu Suprimir -Ho?
No
De Debò Voleu Suprimir -Ho?
Sí
Afegiu Primer Una Etiqueta
De Debò Voleu Suprimir -Ho?
Gener
Febrer
Marxar
Abril
Maig
Juny
Juliol
Agost
Setembre
Octubre
Novembre
Desembre
Marca Com Es Fa O S’Evita.
Ajudeu A Fer \ "A Donar \'T \" Millor.
Recordatori Todon \'T
"Marca La Teva Tasca Todon'T"
Per Començar, Poseu Un Mal Hàbit.
Consulteu Les Vostres Estadístiques.
Afegiu Una Etiqueta.
Permís Necessari
Aquesta Aplicació Requereix Accés Al Vostre Emmagatzematge Extern Per Restaurar La Base De Dades.Activeu Aquest Permís A La Configuració De L\'Aplicació.
Configuració Oberta
Seleccioneu La Freqüència De Repetició
Avans
Cada Dia
Semanalment
De Debò Voleu Suprimir -Ho?
Dades
Afegiu Una Notificació Diària
De Nou
Retornar
Dracula
================================================
FILE: app/src/main/res/values-cs/strings.xml
================================================
- Vyberte jazyk
- Čeština
- Dánština
- Němčina
- Angličtina
- Španělština
- Italština
- Francouzština
- Leden
- Únor
- Březen
- Duben
- Květen
- Červen
- Červenec
- Srpen
- Září
- Říjen
- Listopad
- Prosinec
Opravu chcete smazat tuto návyk?
To Don\'t
Obrácený seznam úkolů
Zapište své špatné návyky. Každý den je přeškrtněte
a další ráno začněte s novým seznamem.
Pokračujte
Continue
Vyhnuto
Hotovo
Návyky
Dnes
Záznam
O aplikaci
Štítky
Nastavení
Nejvíce vyhnuto:
Nejméně vyhnuto:
Nejprve přidejte štítek
Přidat nový štítek
Zadejte špatný návyk
Popis
Uložit
Začněte tím, že si zapíšete špatný návyk
Návyky se zde zobrazí
Licence Apache 2.0
Vývojář
Přispět
Přeložit
Nahlásit problém
Zobrazit zdroj
Open-source licence
Vzhled
Tmavý
Světlo
Aktualizace
Feather Icons
MIT Licence
Android Jetpack
MaterialSpinner
Sledovat systém
NoboButton
CircleImageView
MPAndroidChart
JUnit
Eclipse Public Licence 1.0
Kotlin
Java
GNU General Public License CE
- Sociální
- Jídlo a nápoje
- Studium
To Don\\\'t nyní používá téma %s.
Přidat nový To Don\'t úkol
D
W
M
Y
" z "
" návyky jsou vyhnuty"
" návyky jsou vyhnuty, výborně!"
Vyhnuto
Návyky
Opravdu chcete tuto položku smazat?
Ne
Opravdu chcete tuto položku smazat?
Ano
Nejprve přidejte štítek
Opravdu chcete tuto položku smazat?
Leden
Únor
Březen
Duben
Květen
Červen
Červenec
Srpen
Září
Říjen
Listopad
Prosinec
Označte jako hotové nebo vyhnuté.
Pomozte vylepšit "To Don\'t".
ToDon\'t připomínka
"Označte svůj úkol ToDon\'t "
Začněte tím, že si zapíšete špatný návyk.
Zobrazit své statistiky.
Přidat štítek.
Vyžaduje se povolení
Tato aplikace vyžaduje přístup k vašemu externímu úložišti pro obnovení databáze. Prosím povolte toto oprávnění v nastavení aplikace.
Otevřít nastavení
Vyberte frekvenci opakování
Jednou
Denně
Týdně
Opravdu chcete tuto položku smazat?\nToto také smaže všechny návyky spojené s tímto štítkem.
Data
Přidat denní notifikaci
Zálohování
Obnovit
Dracula
================================================
FILE: app/src/main/res/values-da/strings.xml
================================================
- Vælg Sprog
- Tjekkisk
- Dansk
- Tysk
- Engelsk
- Spansk
- Italiensk
- Fransk
- Januar
- Februar
- Marts
- April
- Maj
- Juni
- Juli
- August
- September
- Oktober
- November
- December
Er du sikker på, at du vil slette denne vane?
To Don\'t
Den omvendte to-do liste
Skriv dine dårlige vaner ned. Kryds dem af
ud, dem du gav efter for. Og den næste
morgen starter du med den friske liste.
Fortsæt
Undgået
Udført
Vaner
I dag
Log
Om
Etiketter
Indstillinger
Mest undgået:
Mindst undgået:
Tilføj etiket først
Tilføj ny etiket
Indtast dårlig vane
Beskrivelse
Gem
For at starte, skriv en dårlig vane ned
Vaner vil vises her
Apache License 2.0
Udvikler
Bidrag
Oversæt
Rapporter et problem
Vis kilde
Open-source licenser
Udseende
Mørk
Lys
Opdater
Feather Icons
MIT License
Android Jetpack
MaterialSpinner
Følg systemet
NoboButton
CircleImageView
MPAndroidChart
JUnit
Eclipse Public License 1.0
Kotlin
Java
GNU General Public License CE
- Social
- Mad og drikke
- Studier
To Don\\\'t bruger nu %s-temaet.
Tilføj ny To Don\'t opgave
D
W
M
Y
" ud af "
" vaner er undgået"
" vaner er undgået, godt klaret!"
Undgået
Vaner
Vil du virkelig slette dette?
Nej
Vil du virkelig slette dette?
Ja
Tilføj venligst en etiket først
Vil du virkelig slette dette?
Januar
Februar
Marts
April
Maj
Juni
Juli
August
September
Oktober
November
December
Marker som udført eller undgået.
Hjælp med at gøre "To Don\'t" bedre.
ToDon\'t Påmindelse
"Marker din ToDon\'t opgave "
For at starte, skriv en dårlig vane ned.
Se dine statistikker.
Tilføj etiket.
Tilladelse kræves
Denne app kræver adgang til din eksterne opbevaring for at gendanne databasen. Aktiver venligst denne tilladelse i appens indstillinger.
Åbn indstillinger
Vælg gentagelsesfrekvens
Én gang
Dagligt
Ugentligt
Vil du virkelig slette dette?\nDette vil også slette alle vaner relateret til denne etiket.
Data
Tilføj daglig notifikation
Backup
Gendan
Dracula
================================================
FILE: app/src/main/res/values-de/strings.xml
================================================
- Sprache auswählen
- Tschechisch
- Dänisch
- Deutsch
- Englisch
- Spanisch
- Italienisch
- Französisch
- Januar
- Februar
- März
- April
- Mai
- Juni
- Juli
- August
- September
- Oktober
- November
- Dezember
Möchten Sie diese Gewohnheit wirklich löschen?
To Don\'t
Die To-Do-Liste umkehren
Schreiben Sie Ihre schlechten Gewohnheiten auf. Haken Sie sie ab
die schlechten Gewohnheiten, denen Sie nachgegeben haben. Und am nächsten Tag
beginnen Sie mit einer neuen Liste.
Fortfahren
Vermeidet
Fertig
Gewohnheiten
Heute
Protokoll
Über
Labels
Neues Etikett
Zeit
Frequenz
Einstellungen
Am meisten vermieden:
Am wenigsten vermieden:
Fügen Sie zuerst ein Label hinzu
Neues Label hinzufügen
Schreiben Sie eine schlechte Gewohnheit auf
Notiz
Speichern
Um zu beginnen, schreiben Sie eine schlechte Gewohnheit auf
Die Gewohnheiten erscheinen hier
Apache Lizenz 2.0
Entwickler
Beitragen
Übersetzen
Fehler melden
Quellcode anzeigen
Open-Source-Lizenzen
Erscheinungsbild
Dunkel
Hell
Aktualisieren
Feather Icons
MIT Lizenz
Android Jetpack
MaterialSpinner
System folgen
NoboButton
CircleImageView
MPAndroidChart
JUnit
Eclipse Public License 1.0
Kotlin
Java
GNU General Public License
- Sozial
- Essen und Trinken
- Studium
To Don\\\'t verwendet jetzt das %s -Design.
Neue To Don\'t-Aufgabe hinzufügen
D
Benachrichtigung geplant
W
M
J
" von "
" Gewohnheiten vermieden"
" Gewohnheiten vermieden, gut gemacht!"
Vermieden
Gewohnheiten
Möchten Sie dies wirklich löschen?
Nein
Möchten Sie dies wirklich löschen?
Ja
Bitte fügen Sie zuerst ein Label hinzu
Möchten Sie dies wirklich löschen?
Januar
Februar
März
April
Mai
Juni
Juli
August
September
Oktober
November
Dezember
Als erledigt oder vermieden markieren.
Helfen Sie, "To Don\'t" besser zu machen.
ToDon\'t Erinnerung
Markiere deine ToDon\'t-Aufgabe
Um zu beginnen, schreiben Sie eine schlechte Gewohnheit auf.
Sehen Sie Ihre Statistiken an.
Label hinzufügen.
Berechtigung erforderlich
Diese App benötigt Zugriff auf Ihren externen Speicher, um die Datenbank wiederherzustellen. Bitte aktivieren Sie diese Berechtigung in den App-Einstellungen.
Einstellungen öffnen
Wiederholungsfrequenz auswählen
Einmal
Täglich
Wöchentlich
Möchten Sie dies wirklich löschen?\nDies wird auch alle Gewohnheiten im Zusammenhang mit diesem Label löschen.
Daten
Tägliche Benachrichtigung hinzufügen
Sicherung
Wiederherstellen
Dracula
Fehler überwachen
Verwendet Sentry, um Probleme automatisch zu melden, damit Fehler schneller behoben werden und die Stabilität verbessert wird. Es werden nur wichtige technische Daten erfasst.
================================================
FILE: app/src/main/res/values-dum/strings.xml
================================================
================================================
FILE: app/src/main/res/values-el/strings.xml
================================================
- Επιλέξτε Τη Γλώσσα
- Τσέχος
- Δανικός
- Γερμανός
- Αγγλικός
- Ισπανικά
- Ιταλικά
- Γάλλος
- Ιανουάριος
- Φεβρουάριος
- Πορεία
- Απρίλιος
- Μάιος
- Ιούνιος
- Ιούλιος
- Αύγουστος
- Σεπτέμβριος
- Οκτώβριος
- Νοέμβριος
- Δεκέμβριος
Είστε Βέβαιοι Ότι Θέλετε Να Διαγράψετε Αυτήν Τη Συνήθεια;
Για Να Μην \'T
Την Αντίστροφη Λίστα Υποχρεώσεων
Σημειώστε Τις Κακές Σας Συνήθειες.Κάθε Μέρα, Σταυρό
Από Εκείνους Που Δώσατε.Και Το Επόμενο
Το Πρωί Ξεκινήστε Με Τη Φρέσκια Λίστα.
Συνεχίζω
Avoided
Done
Συνήθειες
Σήμερα
Κούτσουρο
Για
Ετικέτες
Ρυθμίσεις
Οι Περισσότεροι Αποφεύγονται:
Λιγότερο Αποφεύγεται:
Προσθέστε Πρώτα Μια Ετικέτα
Προσθήκη Νέας Ετικέτας
Εισάγετε Κακή Συνήθεια
Περιγραφή
Εκτός
Για Να Ξεκινήσετε, Βάλτε Μια Κακή Συνήθεια
Οι Συνήθειες Θα Εμφανιστούν Εδώ
Άδεια Apache 2.0
Προγραμματιστής
Συνεισφέρω
Μεταφράζω
Αναφέρετε Ένα Πρόβλημα
Προβολή Προβολής
Άδειες Ανοικτού Κώδικα
Εμφάνιση
Σκοτάδι
Φως
Εκσυγχρονίζω
Εικονίδια Με Φτερό
Άδεια Mit
Android Jetpack
Κτηνοτρόφος
Ακολουθήστε Το Σύστημα
Nobobutton
Κύκλος Του Κύκλου
Mpandroidchart
Junit
Eclipse Public License 1.0
Κάλρινος
Ιάβα
Gnu General Public License Ce
- Κοινωνικός
- Τρόφιμα Και Ποτά
- Σπουδές
# Toasts
Το To Don\\\'t χρησιμοποιεί τώρα το θέμα %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Προσθέστε Νέο Στοιχείο Don \'T
Ρε
W
M
Y
"Out Of"
"Οι Συνήθειες Αποφεύγονται"
"Οι Συνήθειες Αποφεύγονται, Τρόπος Να Πάμε!"
Απογοητευμένος
Συνήθειες
Θέλετε Πραγματικά Να Το Διαγράψετε;
Οχι
Θέλετε Πραγματικά Να Το Διαγράψετε;
Ναί
Προσθέστε Πρώτα Μια Ετικέτα
Θέλετε Πραγματικά Να Το Διαγράψετε;
Ιανουάριος
Φεβρουάριος
Πορεία
Απρίλιος
Μάιος
Ιούνιος
Ιούλιος
Αύγουστος
Σεπτέμβριος
Οκτώβριος
Νοέμβριος
Δεκέμβριος
Σημειώστε Όπως Έγινε Ή Αποφεύγεται.
Βοηθήστε Να Κάνετε \ "Να Μην Κάνετε" Καλύτερα.
Todon \'T Υπενθύμιση
"Σημειώστε Την Εργασία Σας"
Για Να Ξεκινήσετε, Βάλτε Μια Κακή Συνήθεια.
Δείτε Τα Στατιστικά Σας.
Προσθήκη Ετικέτας.
Απαιτείται Άδεια
Αυτή Η Εφαρμογή Απαιτεί Πρόσβαση Στην Εξωτερική Αποθήκευση Σας Για Την Αποκατάσταση Της Βάσης Δεδομένων.Ενεργοποιήστε Αυτήν Την Άδεια Στις Ρυθμίσεις Της Εφαρμογής.
Ανοίξτε Τις Ρυθμίσεις
Επιλέξτε Συχνότητα Επανάληψης
Μια Φορά
Καθημερινά
Εβδομαδιαίος
Θέλετε Πραγματικά Να Διαγράψετε Αυτό;
Δεδομένα
Προσθέστε Καθημερινή Ειδοποίηση
Υποβοηθώ
Επαναφέρω
Dracula
================================================
FILE: app/src/main/res/values-eo/strings.xml
================================================
================================================
FILE: app/src/main/res/values-es/strings.xml
================================================
- Seleccionar idioma
- Checo
- Danés
- Alemán
- Inglés
- Español
- Italiano
- Francés
- Enero
- Febrero
- Marzo
- Abril
- Mayo
- Junio
- Julio
- Agosto
- Septiembre
- Octubre
- Noviembre
- Diciembre
¿Estás seguro de que quieres eliminar este hábito?
To Don\'t
Invertir la lista To Do
Escribe tus malos hábitos. Márcalos.
Los malos hábitos que cediste. Y al día siguiente
empieza una nueva lista.
Continuar
Evitar
Hecho
Hábitos
Hoy
Registro
Acerca de
Etiquetas
Configuración
Más evitado:
Menos evitado:
Primero agrega una etiqueta
Agregar nueva etiqueta
Escribe un mal hábito
Nota
Guardar
Para empezar, escribe un mal hábito
Los hábitos aparecerán aquí
Licencia Apache 2.0
Desarrollador
Contribuir
Traducir
Reportar un error
Ver código fuente
Licencias de código abierto
Apariencia
Oscuro
Claro
Actualizar
Feather Icons
Licencia MIT
Android Jetpack
MaterialSpinner
Seguir sistema
NoboButton
CircleImageView
MPAndroidChart
JUnit
Licencia pública Eclipse 1.0
Kotlin
Java
Licencia pública general GNU
- Social
- Comida y Bebidas
- Estudio
To Don\\\'t está usando el tema %s ahora.
Agregar nueva actividad To Don\'t
D
W
M
G
" de "
" Hábitos evitados"
" ¡Hábitos evitados, bien hecho!"
Evitar
Hábitos
¿Estás seguro de que quieres eliminar esto?
No
¿Estás seguro de que quieres eliminar esto?
Sí
Por favor agrega una etiqueta primero
¿Estás seguro de que quieres eliminar esto?
Enero
Febrero
Marzo
Abril
Mayo
Junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre
Marca como hecho o evitado.
Ayuda a hacer "To Don\'t" mejor.
Recordatorio ToDon\'t
Marca tu tarea ToDon\'t
Para comenzar, escribe un mal hábito.
Ver tus estadísticas.
Agregar etiqueta.
Permiso requerido
Esta app requiere acceso a tu almacenamiento externo para restaurar la base de datos. Habilita este permiso en la configuración de la app.
Abrir configuración
Selecciona la frecuencia de repetición
Una vez
Diario
Semanal
¿Estás seguro de que quieres eliminar esto?\nEsto también eliminará todos los hábitos relacionados con esta etiqueta.
Datos
Agregar notificación diaria
Respaldo
Restaurar
Dracula
================================================
FILE: app/src/main/res/values-et/strings.xml
================================================
- Vali Keel
- Tšehhi Keel
- Taani
- Sakslane
- Inglise Keel
- Hispaania
- Itaallane
- Prantsuse
- Jaanuar
- Veebruar
- Marssima
- Aprill
- Mai
- Juuni
- Juuli
- August
- September
- Oktoober
- November
- Detsember
Kas Olete Kindel, Et Soovite Selle Harjumuse Kustutada?
Mitte
Vastupidine Ülesandeloend
Pange Oma Halvad Harjumused Maha.Iga Päev, Rist
Välja Need, Millele Te Järele Andsite.Ja Järgmine
Hommikul Alustage Värske Nimekirjaga.
Jätkuma
Vältinud
Tehtud
Harjumused
Täna
Logi
Ümber
Sildid
Sätted
Kõige Enam Välditud:
Vähemalt Välditud:
Palun Lisage Kõigepealt Silt
Lisage Uus Silt
Sisestama Halba Harjumust
Kirjeldus
Kokkuhoid
Alustuseks Pange Halb Harjumus Maha
Harjutused Ilmuvad Siin
Apache Litsents 2.0
Arendaja
Panustama
Tõlkima
Probleem Teatama
Vaateallikas
Avatud Lähtekoodiga Litsentsid
Välimus
Tume
Hele
Värskendama
Sulgede Ikoonid
Mit -Litsents
Android Jetpack
Materjalidepinner
Jälgi Süsteemi
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Avalik Litsents 1.0
Kotlin
Java
Gnu Üldine Litsents Ce
- Ühiskondlik
- Toidud Ja Joogid
- Uuringud
# Toasts
To Don\\\'t kasutab nüüd %s teemat.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Lisage Üksus Uus
D
W
M
Y
"Välja"
"Harjutusi Välditakse"
"Harjutatakse Harjumusi, Viis Minna!"
Vältinud
Harjumused
Kas Soovite Selle Tõesti Kustutada?
Mitte
Kas Soovite Selle Tõesti Kustutada?
Jah
Palun Lisage Kõigepealt Silt
Kas Soovite Selle Tõesti Kustutada?
Jaanuar
Veebruar
Marssima
Aprill
Mai
Juuni
Juuli
August
September
Oktoober
November
Detsember
Märkige Nagu Tehtud Või Välditud.
Aidake Muuta "" T \ "Paremaks.
Todon Ei Mäletata
"Märkige Oma Ülesanne"
Alustuseks Pange Halb Harjumus Maha.
Vaadake Oma Statistikat.
Lisage Silt.
Vajalik Luba
See Rakendus Nõuab Andmebaasi Taastamiseks Juurdepääsu Teie Välisele Salvestusruumile.Luba See Luba Rakenduse Seadetes.
Avatud Sätted
Valige Korduse Sagedus
Kord
Iga Päev
Iganädalane
Kas Soovite Selle Tõesti Kustutada? \ Nthis Kustutab Ka Kõik Selle Sildiga Seotud Harjumused.
Andmed
Lisage Igapäevane Teatis
Varundama
Taastama
Dracula
================================================
FILE: app/src/main/res/values-fa/strings.xml
================================================
- زبان را انتخاب کنید
- وابسته به چک
- وابسته به دانمارکی
- آلمانی
- انگلیسی
- اسپانیایی
- ایتالیایی
- فرانسوی
- ژانویه
- فوریه
- راهپیمایی
- ماه آوریل
- ماه مه
- ژوئن
- ژوئیه
- اوت
- سپتامبر
- اکتبر
- ماه نوامبر
- دسامبر
آیا مطمئن هستید که می خواهید این عادت را حذف کنید؟
به
لیست معکوس به انجام کارهای
عادت های بد خود را پایین بیاورید.هر روز ، صلیب
از کسانی که به آنها وارد شده اید.و بعدی
صبح با لیست تازه شروع کنید.
ادامه دادن
اجتناب شده
انجام شده
عادات
امروز
ورود به سیستم
در مورد
برچسب
تنظیمات
بیشترین اجتناب از آن:
حداقل اجتناب شده:
لطفاً ابتدا یک برچسب اضافه کنید
برچسب جدید اضافه کنید
وارد عادت بد شوید
شرح
پس انداز کردن
برای شروع ، یک عادت بد را کنار بگذارید
عادت ها در اینجا نشان داده می شوند
مجوز آپاچی 2.0
توسعه دهنده
مشارکت کردن
ترجمه کردن
گزارش یک مشکل
منبع مشاهده
مجوزهای منبع باز
ظاهر
تاریک
سبک
بروزرسانی
نمادهای پر
مجوز Mit
جت پک اندرویدی
سرپرست
سیستم را دنبال کنید
غول
Circleimageview
مباحث
جنجال
مجوز عمومی Eclipse 1.0
کلاتلین
جاوا
مجوز عمومی عمومی Gnu
- وابسته به اجتماعی
- غذاها و نوشیدنی ها
- مطالعه
# Toasts
To Don\\\'t اکنون از تم %s استفاده میکند.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
مورد جدید را به مورد اضافه کنید
د
حرف
مگس
حرف
"خارج از"
"از عادت ها جلوگیری می شود"
"از عادت ها جلوگیری می شود ، راهی برای رفتن!"
اجتناب شده
عادات
آیا واقعاً می خواهید این را حذف کنید؟
هیچ
آیا واقعاً می خواهید این را حذف کنید؟
بله
لطفاً ابتدا یک برچسب اضافه کنید
آیا واقعاً می خواهید این را حذف کنید؟
ژانویه
فوریه
راهپیمایی
ماه آوریل
ماه مه
ژوئن
ژوئیه
اوت
سپتامبر
اکتبر
ماه نوامبر
دسامبر
علامت گذاری شده را انجام دهید یا اجتناب کنید.
به بهتر کردن \ "برای بهتر کردن" کمک کنید.
یادآوری تودون
"وظیفه خود را علامت گذاری نکنید"
برای شروع ، یک عادت بد را کنار بگذارید.
آمار خود را مشاهده کنید
برچسب اضافه کنید.
مجوز لازم است
این برنامه برای بازگرداندن بانک اطلاعاتی نیاز به دسترسی به فضای خارجی شما دارد.لطفاً این مجوز را در تنظیمات برنامه فعال کنید.
تنظیمات باز
فرکانس تکرار را انتخاب کنید
یک بار
روزمره
هفتگی
آیا واقعاً می خواهید این را حذف کنید؟ \ Nthis همچنین تمام عادت های مربوط به این برچسب را حذف می کند.
داده
اعلان روزانه را اضافه کنید
از پس دادن
بازگرداندن
Dracula
================================================
FILE: app/src/main/res/values-fi/strings.xml
================================================
- Valitse Kieli
- Tšekin
- Tanskalainen
- Saksalainen
- Englanti
- Espanjalainen
- Italialainen
- Ranskalainen
- Tammikuu
- Helmikuu
- Maaliskuu
- Huhtikuu
- Toukokuu
- Kesäkuu
- Heinäkuu
- Elokuu
- Syyskuu
- Lokakuu
- Marraskuu
- Joulukuu
Haluatko Varmasti Poistaa Tämän Tavan?
Don \'T
Käänteinen Tehtäväluettelo
Kirjoita Huonot Tottumuksesi.Joka Päivä, Ristiä
Ulkona Ne, Joihin Annoit.Ja Seuraava
Aamu Alkaa Tuoreella Luettelolla.
Jatkaa
Vältti
Tehty
Tottumukset
Tänään
Loki
Noin
Merkinnät
Asetukset
Eniten Vältetty:
Vähiten Vältetty:
Lisää Ensin Etiketti
Lisää Uusi Tarra
Syötä Huono Tapa
Kuvaus
Tallentaa
To start off, put down a bad habit
Tapautus Ilmestyy Täällä
Apache -Lisenssi 2.0
Kehittäjä
Osallistua
Kääntää
Ilmoita Ongelma
Katsella Lähdettä
Avoimen Lähdekoodin Lisenssit
Esiintyminen
Tumma
Valaistus
Päivittää
Höyhenkuvakkeet
Mit -Lisenssi
Android Jetpack
Materiaali
Seurata Järjestelmää
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Public Licence 1.0
Kotlin
Java
Gnu: N Julkinen Lisenssi Ce
- Sosiaalinen
- Ruokia Ja Juomia
- Opinnot
# Toasts
To Don\\\'t käyttää nyt %s-teemaa.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Lisää Uusi Don \'T -Kohde
D -D
W -W -
M
Y
"Out"
"Tapautukset Vältetään"
"Tapautukset Vältetään, Tapa Edetä!"
Vältti
Tottumukset
Haluatko Todella Poistaa Tämän?
Ei
Haluatko Todella Poistaa Tämän?
Kyllä
Lisää Ensin Etiketti
Haluatko Todella Poistaa Tämän?
Tammikuu
Helmikuu
Maaliskuu
Huhtikuu
Toukokuu
Kesäkuu
Heinäkuu
Elokuu
Syyskuu
Lokakuu
Marraskuu
Joulukuu
Merkitse Tehty Tai Vältetty.
Auta Tekemään \ "Don \'T \" Parempaa.
Todon -Muistutus
"Merkitse Todon -Tehtävä"
Aloittamalla Laita Huono Tapa.
Katso Tilastot.
Lisää Etiketti.
Vaaditaan Lupa
Tämä Sovellus Vaatii Pääsyn Ulkoiseen Tallennustilaan Tietokannan Palauttamiseksi.Ota Tämä Lupa Käyttöön Sovellusasetuksissa.
Avaa Asetukset
Valitse Toistotaajuus
Kerran
Päivittäin
Viikoittain
Haluatko Todella Poistaa Tämän? \ Nthis Poistaa Myös Kaikki Tähän Etikettiin Liittyvät Tavat.
Tiedot
Lisää Päivittäinen Ilmoitus
Tutustua
Palauttaa
Dracula
================================================
FILE: app/src/main/res/values-fil/strings.xml
================================================
- Select Language
- Czech
- Danish
- German
- English
- Spanish
- Italian
- French
- January
- February
- March
- April
- May
- June
- July
- August
- September
- October
- November
- December
Are you sure you want to delete this habit?
To Don\'t
The reverse to-do list
Jot down your bad habits. Every day, cross
out those you gave in to. And the next
morning start off with the fresh list.
Continue
Avoided
Done
Habits
Today
Log
About
Labels
Settings
Most avoided:
Least avoided:
Please add a label first
Add new label
Enter Bad Habit
Description
Save
To start off, put down a bad habit
Habits will show up here
Apache License 2.0
Developer
Contribute
Translate
Report a problem
View source
Open-source licences
Appearance
Dark
Light
Update
Feather Icons
MIT License
Android Jetpack
MaterialSpinner
Follow System
NoboButton
CircleImageView
MPAndroidChart
JUnit
Eclipse Public License 1.0
Kotlin
Java
GNU General Public License CE
- Social
- Foods And Drinks
- Studies
# Toasts
Gamit na ngayon ng To Don\\\'t ang %s na tema.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Add new To Don\'t item
D
W
M
Y
" out of "
" habits are avoided"
" habits are avoided, way to go!"
Avoided
Habits
Do you really want to delete this?
No
Do you really want to delete this?
Yes
Please Add a Label First
Do you really want to delete this?
January
February
March
April
May
June
July
August
September
October
November
December
Mark as done or avoided.
Help make \"To Don\'t\" better.
ToDon\'t Reminder
"Mark your ToDon't task "
To Start Off, put down a bad habit.
View your stats.
Add Label.
Permission Required
This app requires access to your external storage to restore the database. Please enable this permission in the app settings.
Open Settings
Select Repetition Frequency
Once
Daily
Weekly
Do you really want to delete this?\nThis will also delete all habits related to this label.
Data
Add daily notification
Back up
Restore
Dracula
================================================
FILE: app/src/main/res/values-fr/strings.xml
================================================
- Sélectionner la langue
- Tchèque
- Danois
- Allemand
- Anglais
- Espagnol
- Italien
- Français
- Janvier
- Février
- Mars
- Avril
- Mai
- Juin
- Juillet
- Août
- Septembre
- Octobre
- Novembre
- Décembre
Êtes-vous sûr de vouloir supprimer cette habitude ?
To Don\'t
La liste de choses à ne pas faire inversée
Écrivez vos mauvaises habitudes. Cochez-les
les mauvaises habitudes auxquelles vous avez cédé. Et le lendemain
vous recommencez avec une liste fraîche.
Continuer
Évité
Fait
Habitudes
Aujourd\'hui
Journal
À propos
Étiquettes
Nouvelle étiquette
Temps
Fréquence
Paramètres
Le plus évité :
Le moins évité :
Ajoutez une étiquette d\'abord
Ajouter une nouvelle étiquette
Entrez une mauvaise habitude
Description
Sauvegarder
Pour commencer, écrivez une mauvaise habitude
Les habitudes apparaîtront ici
Licence Apache 2.0
Développeur
Contribuer
Traduire
Signaler un problème
Voir la source
Licences open-source
Apparence
Sombre
Clair
Mettre à jour
Icônes Feather
Licence MIT
Android Jetpack
MaterialSpinner
Suivre le système
NoboButton
CircleImageView
MPAndroidChart
JUnit
Licence publique Eclipse 1.0
Kotlin
Java
Licence publique générale GNU
- Social
- Nourriture et Boissons
- Études
To Don\\\'t utilise maintenant le thème %s.
Ajouter une nouvelle tâche To Don\'t
D
Notification programmée
W
M
A
" sur "
" habitudes évitées"
" habitudes évitées, bien joué !"
Évité
Habitudes
Voulez-vous vraiment supprimer ceci ?
Non
Voulez-vous vraiment supprimer ceci ?
Oui
Veuillez ajouter une étiquette d\'abord
Voulez-vous vraiment supprimer ceci ?
Janvier
Février
Mars
Avril
Mai
Juin
Juillet
Août
Septembre
Octobre
Novembre
Décembre
Marquez comme fait ou évité.
Aidez à améliorer "To Don\'t".
Rappel ToDon\'t
Marquez votre tâche ToDon\'t
Pour commencer, écrivez une mauvaise habitude.
Voir vos statistiques.
Ajouter une étiquette.
Permission requise
Cette application nécessite un accès à votre stockage externe pour restaurer la base de données. Veuillez activer cette permission dans les paramètres de l\'application.
Ouvrir les paramètres
Sélectionnez la fréquence de répétition
Une fois
Quotidiennement
Hebdomadaire
Voulez-vous vraiment supprimer ceci ?\nCela supprimera également toutes les habitudes liées à cette étiquette.
Données
Ajouter une notification quotidienne
Sauvegarde
Restaurer
Dracula
================================================
FILE: app/src/main/res/values-ga/strings.xml
================================================
- Roghnaigh Teanga
- (De Chuid) Na Seice
- (De Chuid) Na Danmhairge
- Gearmáinis
- Béarla
- Spáinnise
- (De Chuid) Na Hiodáile
- (De Chuid) Na Fraince
- Mí Eanáir
- Mí Feabhra
- Mí An Mhárta
- Aibreán
- Ar Mhiste Leat?
- Mí An Mheithimh
- Mí Iúil
- Mí Lúnasa
- Mí Mheán Fómhair
- Deireadh Fómhair
- Mí Na Samhna
- Mí Na Nollag
An Bhfuil Tú Cinnte Gur Mhaith Leat An Nós Seo A Scriosadh?
A Don\'T
An Liosta Droim Ar Ais Le Déanamh
Scríobh Síos Do Dhroch -Nósanna.Gach Lá, Cros
Amach Iad Siúd A Thug Tú Isteach Iontu.Agus An Chéad Cheann Eile
Tosaigh Ar Maidin Leis An Liosta Úr.
Lean Ort
Seachnaithe
Ar Siúl
Nósanna
Inniu
Logáil
Thart Ar
Lipéad
Socruithe
Seachnaíodh An Chuid Is Mó:
Seachain Ar A Laghad:
Cuir Lipéad Ar Dtús Le Do Thoil
Cuir Lipéad Nua Leis
Iontráil Droch -Nós
Saghas
Spáráil
Chun Tús A Chur Leis, Cuir Droch -Nós Síos
Taispeánfaidh Nósanna Suas Anseo
Ceadúnas Apache 2.0
Forbróir
Cuir Le
Aistrigh
Fadhb A Thuairisciú
Féach Ar An Bhfoinse
Ceadúnais Foinse Oscailte
Dealramh
Dorcha
Léas
An T -Ó Nuashonrú A Dhéanamh Ar
Deilbhíní Cleite
Ceadúnas Mit
Scairdphaca Android
Spinneoir Ábhar
Lean An Córas
Nobobutton
Ciorcailídview
Mpandroidchart
Junit
Ceadúnas Poiblí Eclipse 1.0
Céatach
Iva
Ceadúnas Poiblí Ginearálta GNU CE
- Sóisialta
- Bianna Agus Deochanna
- Staidéar
# Toasts
Leanann To Don\'t do chóras anois.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Cuir Nua Le Mír Don
D
Thiar
M
Y
" amach as "
" seachnaítear nósanna"
" seachnaítear nósanna, maith thú!"
Seachnaithe
Nósanna
An bhfuil tú cinnte gur mhaith leat é seo a scriosadh?
Ar Bith
An bhfuil tú cinnte gur mhaith leat é seo a scriosadh?
Tá
Cuir Lipéad Ar Dtús Le Do Thoil
An bhfuil tú cinnte gur mhaith leat é seo a scriosadh?
Mí Eanáir
Mí Feabhra
Mí An Mhárta
Aibreán
Bealtaine
Mí An Mheithimh
Mí Iúil
Mí Lúnasa
Mí Mheán Fómhair
Deireadh Fómhair
Mí Na Samhna
Mí Na Nollag
Marc Mar A Dhéantar Nó A Sheachnaítear.
Cabhair A Dhéanamh "A Dhéanamh Níos Fearr.
Meabhrúchán Todon
"Marcáil Do Tasc Toddon" "
Chun Tús A Chur Leis, Cuir Droch -Nós Síos.
Féach Ar Do Stats.
Cuir Lipéad Leis.
Cead Atá Ag Teastáil
Éilíonn An Feidhmchlár Seo Rochtain Ar Do Stóráil Sheachtrach Chun An Bunachar Sonraí A Athchóiriú.Cumasaigh An Cead Seo Le Do Thoil Sna Socruithe App.
Socruithe Oscailte
Roghnaigh Minicíocht Athrá
Aon Bhabhta Amháin
Óga
Seachtainiúil
An bhfuil tú cinnte gur mhaith leat é seo a scriosadh? \nScriosfaidh sé seo gach nós a bhaineann leis an lipéad seo freisin.
Sonraí
Cuir Fógra Laethúil Leis
Cúlíop
Cuir Ar An Eolas
Dracula
Ná Déan
Lipéid Nua
Am
Minicíocht
Fógra sceidealaithe
Tá Ná Déan ar an taobh éadrom anois.
Tá Ná Déan ar an taobh dorcha anois.
# Here are the non-translateable strings
Earráidí monatóireachta
Bain úsáid as Sentry chun fadhbanna a thuairisciú go huathoibríoch le haghaidh ceartúcháin fabhtanna níos tapúla agus cobhsaíocht fheabhsaithe. Ní bhailítear ach sonraí teicniúla riachtanacha.
================================================
FILE: app/src/main/res/values-he/strings.xml
================================================
- בחר שפה
- צ\'כיה
- דַנִי
- גֶרמָנִיָת
- אַנגְלִית
- סְפָרַדִית
- אִיטַלְקִית
- צָרְפָתִית
- יָנוּאָר
- פֶבּרוּאָר
- מַרס
- אַפּרִיל
- מַאִי
- יוּנִי
- יוּלִי
- אוֹגוּסט
- סֶפּטֶמבֶּר
- אוֹקְטוֹבֶּר
- נוֹבֶמבֶּר
- דֵצֶמבֶּר
האם אתה בטוח שאתה רוצה למחוק את ההרגל הזה?
לדון
רשימת המטלות ההפוכה
רשום את ההרגלים הרעים שלך.כל יום, צלב
מחוץ לאלה שנמסרת אליהם.והעקבות הבא
בוקר התחל עם הרשימה הטרייה.
לְהַמשִׁיך
נמנע
נַעֲשָׂה
הרגלים
הַיוֹם
עֵץ
אוֹדוֹת
תוויות
הגדרות
הכי נמנע:
הכי פחות נמנע:
אנא הוסף תחילה תווית
הוסף תווית חדשה
הזן הרגל רע
תֵאוּר
לְהַצִיל
כדי להתחיל, הניח הרגל רע
הרגלים יופיעו כאן
רישיון Apache 2.0
מפתח
לִתְרוֹם
לְתַרְגֵם
דווח על בעיה
צפה במקור
רישיונות קוד פתוח
הוֹפָעָה
כֵּהֶה
אוֹר
לְעַדְכֵּן
אייקוני נוצה
רישיון Mit
Android Jetpack
Satiencespinner
עקוב אחר מערכת
נובובוטטון
Culceimageview
Mpandroidchart
יוניט
רישיון ציבורי של Eclipse 1.0
קוטלין
ג\'אווה
רישיון ציבורי כללי של Gnu Ce
- חֶברָתִי
- אוכלים ומשקאות
- מחקרים
# Toasts
To Don\'t נצמד להגדרת המערכת שלך.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
הוספת פריט חדש ל־To Don\'t
ד
W
מ \'
Y
"מתוך"
"נמנעים מהרגלים"
"נמנעים מהרגלים, דרך ללכת!"
נמנע
הרגלים
האם אתה באמת רוצה למחוק את זה?
לֹא
האם אתה באמת רוצה למחוק את זה?
כֵּן
אנא הוסף תחילה תווית
האם אתה באמת רוצה למחוק את זה?
יָנוּאָר
פֶבּרוּאָר
מַרס
אַפּרִיל
מַאִי
יוּנִי
יוּלִי
אוֹגוּסט
סֶפּטֶמבֶּר
אוֹקְטוֹבֶּר
נוֹבֶמבֶּר
דֵצֶמבֶּר
סמן כפי שנעשה או נמנע.
עזור לעשות \ "לדון \'T \" טוב יותר.
תזכורת טודון
"סמן את המשימה שלך לא"
כדי להתחיל, הניח הרגל רע.
צפה בסטטיסטיקה שלך.
הוסף תווית.
הרשאה נדרשת
אפליקציה זו דורשת גישה לאחסון החיצוני שלך כדי לשחזר את בסיס הנתונים.אנא הפעל אישור זה בהגדרות האפליקציה.
הגדרות פתוחות
בחר תדר חזרה
פַּעַם
יוֹמִי
שְׁבוּעִי
האם אתה באמת רוצה למחוק את זה? \ N זה גם ימחק את כל ההרגלים הקשורים לתווית זו.
נְתוּנִים
הוסף הודעה יומית
לְגַבּוֹת
לְשַׁחְזֵר
Dracula
To Don\'t חבר לצד הבהיר כעת.
To Don\'t חבר לצד האפל כעת.
# Here are the non-translateable strings
תוויות חדשות
שעה
תדירות
תוזמנה התראה
================================================
FILE: app/src/main/res/values-hi/strings.xml
================================================
- भाषा चुने
- चेक
- डेनिश
- जर्मन
- अंग्रेज़ी
- स्पैनिश
- इतालवी
- फ्रांसीसी
- जनवरी
- फ़रवरी
- मार्च
- अप्रैल
- मई
- जून
- जुलाई
- अगस्त
- सितम्बर
- अक्टूबर
- नवंबर
- दिसंबर
क्या आप सुनिश्चित हैं कि आप इस आदत को हटाना चाहते हैं?
करने के लिए
रिवर्स टू-डू सूची
अपनी बुरी आदतों को कम करें।हर दिन, क्रॉस
उन लोगों को जो आपने दिया था।और अगला
सुबह की शुरुआत ताजा सूची से हुई।
जारी रखना
बचा
हो गया
आदतें
आज
लकड़ी का लट्ठा
के बारे में
लेबल
सेटिंग
सबसे अधिक टाल दिया:
कम से कम परहेज:
कृपया पहले एक लेबल जोड़ें
नया लेबल जोड़ें
बुरी आदत दर्ज करें
विवरण
बचाना
शुरू करने के लिए, एक बुरी आदत डालें
आदतें यहाँ दिखाई देंगी
अपाचे लाइसेंस 2.0
डेवलपर
योगदान देना
अनुवाद
एक समस्या का आख्या
स्रोत देखें
ओपन-सोर्स लाइसेंस
उपस्थिति
अँधेरा
रोशनी
अद्यतन
पंखों का प्रतीक
एमआईटी लाइसेंस
एंड्रॉइड जेटपैक
Materalspinner
प्रणाली का पालन करें
नोबोबटन
सर्किलिमेजव्यू
Mpandroidchart
Junit
ग्रहण सार्वजनिक लाइसेंस 1.0
Kotlin
जावा
Gnu सामान्य सार्वजनिक लाइसेंस सी।
- सामाजिक
- खाद्य पदार्थ और पेय
- अध्ययन करते हैं
# Toasts
To Don\\\'t अब %s थीम का उपयोग कर रहा है।
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
नए में नए जोड़ें टी आइटम
डी
W
एम
Y
"से बाहर"
"आदतों से बचा जाता है"
"आदतों से बचा जाता है, जाने का रास्ता!"
बचा
आदतें
क्या आप वास्तव में इसे हटाना चाहते हैं?
नहीं
क्या आप वास्तव में इसे हटाना चाहते हैं?
हाँ
कृपया पहले एक लेबल जोड़ें
क्या आप वास्तव में इसे हटाना चाहते हैं?
जनवरी
फ़रवरी
मार्च
अप्रैल
मई
जून
जुलाई
अगस्त
सितम्बर
अक्टूबर
नवंबर
दिसंबर
के रूप में किया गया या परहेज किया गया।
बेहतर बनाने में मदद करें \ "To'T \" बेहतर है।
Todon \'T अनुस्मारक
"अपने काम को चिह्नित नहीं करते हैं"
शुरू करने के लिए, एक बुरी आदत डाल दी।
अपने आँकड़े देखें।
लेबल जोड़ें।
अनुमति आवश्यक है
इस ऐप को डेटाबेस को पुनर्स्थापित करने के लिए आपके बाहरी संग्रहण तक पहुंच की आवश्यकता होती है।कृपया ऐप सेटिंग्स में इस अनुमति को सक्षम करें।
खुली सेटिंग
पुनरावृत्ति आवृत्ति का चयन करें
एक बार
दैनिक
साप्ताहिक
क्या आप वास्तव में इसे हटाना चाहते हैं? \ Nthis भी इस लेबल से संबंधित सभी आदतों को हटा देगा।
डेटा
दैनिक अधिसूचना जोड़ें
वापस करना
पुनर्स्थापित करना
Dracula
================================================
FILE: app/src/main/res/values-hr/strings.xml
================================================
- Odaberite Jezik
- Češki
- Danski
- Njemački
- Engleski
- Španjolski
- Talijanski
- Francuski
- Siječanj
- Veljača
- Ožujak
- Travanj
- Svibanj
- Lipanj
- Srpanj
- Kolovoz
- Rujan
- Listopad
- Studeni
- Prosinac
Jeste Li Sigurni Da Želite Izbrisati Ovu Naviku?
Ne Doneti
Popis Obrnutog Obveza
Zapišite Svoje Loše Navike.Svaki Dan, Prekriži
Van Onih Kojima Ste Se Predali.I Sljedeće
Jutro Započnite Sa Svježim Popisom.
Nastaviti
Izbjegavan
Završen
Navike
Danas
Zapisnik
Oko
Etikete
Postavke
Najviše Se Izbjegava:
Najmanje Izbjegano:
Molimo Prvo Dodajte Naljepnicu
Dodajte Novu Oznaku
Unesite Lošu Naviku
Opis
Uštedjeti
Za Početak, Stavite Lošu Naviku
Ovdje Će Se Pojaviti Navike
Apache Licenca 2.0
Programer
Doprinijeti
Prevesti
Prijaviti Problem
Pogledajte Izvor
Licence S Otvorenim Kodom
Izgled
Tamna
Svjetlo
Ažurirati
Ikone Pera
Mit Licenca
Android Jetpack
Materijal
Slijedite Sustav
Nobobutton
Circleimageview
Mpandordchart
Junit
Pomračenje Javne Licence 1.0
Kotlin
Java
Gnu Opća Javna Licenca Ce
- Društveni
- Hrana I Piće
- Studije
# Toasts
To Don\\\'t sada koristi %s temu.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Dodajte Novo U Don \'T Stavku
D
W
M
Y
"Izvan"
"Navike Se Izbjegavaju"
"Navike Se Izbjegavaju, Put!"
Izbjegavan
Navike
Želite Li To Zaista Izbrisati?
Ne
Želite Li To Zaista Izbrisati?
Da
Molimo Prvo Dodajte Naljepnicu
Želite Li To Zaista Izbrisati?
Siječanj
Veljača
Ožujak
Travanj
Svibanj
Lipanj
Srpanj
Kolovoz
Rujan
Listopad
Studeni
Prosinac
Oznaka Kao Što Je Učinjeno Ili Izbjeglo.
Pomozite Da Učinite "Da Donesete \'T \" Bolje.
Todon \ T Podsjetnik
"Označi Svoj Zadatak"
Za Početak, Stavite Lošu Naviku.
Pogledajte Svoju Statistiku.
Dodajte Naljepnicu.
Potrebno Dopuštenje
Ova Aplikacija Zahtijeva Pristup Vašoj Vanjskoj Pohrani Za Vraćanje Baze Podataka.Omogućite Ovo Dopuštenje U Postavkama Aplikacije.
Otvorene Postavke
Odaberite Frekvenciju Ponavljanja
Jednom
Dnevno
Tjedni
Želite Li To Zaista Izbrisati?
Podaci
Dodajte Svakodnevnu Obavijest
Sigurnosno Kopirati
Vratiti
Dracula
================================================
FILE: app/src/main/res/values-hu/strings.xml
================================================
- Válassza Ki A Nyelvet
- Cseh
- Dán
- Német
- Angol
- Spanyol
- Olasz
- Francia
- Január
- Február
- Március
- Április
- Május
- Június
- Július
- Augusztus
- Szeptember
- Október
- November
- December
Biztos Benne, Hogy Törölni Akarja Ezt A Szokást?
Hogy Ne Adjunk
A Fordított To-Listát
Írja Le A Rossz Szokásait.Minden Nap, Kereszt
Kitöltse Azokat, Akiknek Adtál.És A Következő
Reggel Kezdje El A Friss Listával.
Folytatódik
Elkerült
Kész
Szokások
Ma
Fatörzs
Körülbelül
Címkék
Beállítások
A Legtöbbet Elkerülik:
A Legkevésbé Kerüljük El:
Kérjük, Először Adjon Hozzá Egy Címkét
Új Címkét Adjon Hozzá
Lépjen Be A Rossz Szokásba
Leírás
Megtakarítás
Az Induláshoz Tegyen Egy Rossz Szokást
A Szokások Itt Jelennek Meg
Apache Licenc 2.0
Fejlesztő
Hozzájárul
Lefordít
Jelentést Tesz Egy Problémáról
Forrás Megtekintése
Nyílt Forráskódú Engedélyek
Megjelenés
Sötét
Fény
Frissít
Tollas Ikonok
MIT License
Android Jetpack
MaterialSpinner
Kövesse A Rendszert
Nobobutton
Körcörbén
Mpandroidchart
Junit
Eclipse Nyilvános Engedély 1.0
Kotlin
Jáva
Gnu Általános Nyilvános Engedély Ce
- Szociális
- Ételek És Italok
- Studies
# Toasts
A To Don\\\'t most a %s témát használja.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Adjon Hozzá Újat A Nem Tételhez
D
W
M
Y
"Kifelé"
"A Szokások Elkerülhetők"
"A Szokások Elkerülhetők, Módja Annak, Hogy Menjenek!"
Avoided
Szokások
Tényleg Meg Akarja Törölni Ezt?
Nem
Tényleg Meg Akarja Törölni Ezt?
Yes
Please Add a Label First
Tényleg Meg Akarja Törölni Ezt?
January
Február
Március
Április
Május
Június
Július
Augusztus
Szeptember
Október
November
December
Jelölje Meg, Ha Kész Vagy Kerülje El.
Segítsen Jobbá Tenni A \ "To \'T \" -T.
Todon Nem Emlékeztető
"Jelölje Meg A Todon -Feladatot"
Az Induláshoz Tegyen Egy Rossz Szokást.
Tekintse Meg Statisztikáját.
Hozzáadja A Címkét.
Szükséges Engedély
Ehhez Az Alkalmazáshoz Az Adatbázis Visszaállításához Hozzáférést Igényel A Külső Tárolóhoz.Kérjük, Engedélyezze Ezt Az Engedélyt Az Alkalmazásbeállításokban.
Nyissa Meg A Beállításokat
Válassza Az Ismétlődés Frekvencia Lehetőséget
Egyszer
Napi
Heti
Tényleg Ezt Törölni Szeretné?
Adat
Adja Hozzá A Napi Értesítést
Visszaállít
Visszaállít
Dracula
================================================
FILE: app/src/main/res/values-hy/strings.xml
================================================
- Ընտրեք Լեզուն
- Չեխ
- Դանիերեն
- Գերմաներեն
- Անգլերեն
- Իսպաներեն
- Իտալերեն
- Ֆրանսիական
- Հունվար
- Փետրվար
- Մարտ
- Ապրիլ
- Մայիս
- Հունիս
- Հուլիս
- Օգոստոս
- Սեպտեմբեր
- Հոկտեմբեր
- Նոյեմբեր
- Դեկտեմբեր
Համոզված Եք, Որ Ցանկանում Եք Ջնջել Այս Սովորությունը:
Չի
Հակադարձ Անելիքների Ցուցակը
Ջարդել Ձեր Վատ Սովորությունները:Ամեն Օր, Խաչ
Դուրս Նրանք, Ում Դուք Տվել Եք:Եւ Մյուսը
Առավոտը Սկսվում Է Թարմ Ցուցակից:
Շարունակել
Խուսափել Է
Արված
Սովորություններ
Այսօր
Լամպ
Մոտավորապես
Պիտակներ
Կարգավորումներ
Առավել Խուսափել.
Ամենաքիչը Խուսափելուց.
Խնդրում Ենք Նախ Ավելացնել Պիտակը
Ավելացնել Նոր Պիտակ
Մուտքագրեք Վատ Սովորություն
Նկարագրություն
Խնայել
Սկսելու Համար Վատ Սովորություն Դրեց
Այստեղ Կներկայացվեն Սովորությունները
Apache Լիցենզիա 2.0
Մշակող
Ներդրագրել
Թարգմանել
Հաղորդել Խնդրի Մասին
Դիտեք Աղբյուրը
Բաց Կոդով Լիցենզիաներ
Արտաքին Տեսք
Մութ
Լապտեր
Թարմացնել
Փետուր Սրբապատկերներ
Mit Լիցենզիա
Android Jetpack
Նյութ
Հետեւեք Համակարգին
Nobobutton
Circlemimageview
Mpandroidchart
Junit
Eclipse Հասարակական Լիցենզիա 1.0
Կուլլլ
Ավա
Gnu Ընդհանուր Հանրային Լիցենզիա Եխ
- Հասարակական
- Սնունդ Եւ Խմիչքներ
- Ուսումնասիրություններ
# Toasts
To Don\\\'t-ը այժմ օգտագործում է %s թեման
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Նյութը Ավելացրեք Նորը
Հանկարծ
Վ
Մ
Յ
«Դեմ»
«Սովորական Է Սովորությունները»
«Սովորական Են Սովորությունները, Գնալու Ճանապարհ»:
Խուսափել Է
Սովորություններ
Դուք Իսկապես Ուզում Եք Ջնջել Դա:
Ոչ
Դուք Իսկապես Ուզում Եք Ջնջել Դա:
Այո
Խնդրում Ենք Նախ Ավելացնել Պիտակը
Դուք Իսկապես Ուզում Եք Ջնջել Դա:
Հունվար
Փետրվար
Մարտ
Ապրիլ
Մայիս
Հունիս
Հուլիս
Օգոստոս
Սեպտեմբեր
Հոկտեմբեր
Նոյեմբեր
Դեկտեմբեր
Նշեք Ինչպես Արված Կամ Խուսափելուց:
Օգնեք Կատարել \ "Ավելի Լավը Չանել:
Todon\'T Հիշեցում
«Նշեք Ձեր Todon\'T Առաջադրանքը»
Սկսելու Համար Վատ Սովորություն Դրեց:
Դիտեք Ձեր Վիճակագրությունը:
Ավելացնել Պիտակը:
Պահանջվում Է Թույլտվություն
Այս Ծրագիրը Պահանջում Է Մուտք Գործել Ձեր Արտաքին Պահեստարան `Տվյալների Բազան Վերականգնելու Համար:Խնդրում Ենք Միացնել Այս Թույլտվությունը Հավելվածի Պարամետրերում:
Բաց Պարամետրեր
Ընտրեք Կրկնության Հաճախականությունը
Մի Անգամ
Օրական
Շաբաթական
Դուք Իսկապես Ցանկանում Եք Ջնջել Դա: \ Nthis Կջնջի Նաեւ Այս Պիտակի Հետ Կապված Բոլոր Սովորությունները:
Տվյալներ
Ավելացնել Ամենօրյա Ծանուցում
Կրկնօրինակում
Վերականգնել
Dracula
================================================
FILE: app/src/main/res/values-ia/strings.xml
================================================
================================================
FILE: app/src/main/res/values-id/strings.xml
================================================
- Pilih Bahasa
- Ceko
- Denmark
- Jerman
- Bahasa Inggris
- Spanyol
- Italia
- Perancis
- Januari
- Februari
- Berbaris
- April
- Mungkin
- Juni
- Juli
- Agustus
- September
- Oktober
- November
- Desember
Apakah Anda yakin ingin menghapus kebiasaan ini?
To Don\'t
Daftar to-do terbalik
Catat kebiasaan buruk Anda. Setiap hari, coret
yang Anda turuti. Dan keesokan
paginya mulailah dengan daftar yang segar.
Lanjutkan
Dihindari
Selesai
Kebiasaan
Hari ini
Catatan
Tentang
Label
Pengaturan
Paling sering dihindari:
Paling jarang dihindari:
Harap tambahkan label terlebih dahulu
Tambah label baru
Masukkan Kebiasaan Buruk
Deskripsi
Simpan
Untuk memulai, catat sebuah kebiasaan buruk
Kebiasaan akan muncul di sini
Apache License 2.0
Pengembang
Berkontribusi
Terjemahkan
Laporkan masalah
Lihat sumber
Lisensi sumber terbuka
Tampilan
Gelap
Terang
Perbarui
Feather Icons
MIT License
Android Jetpack
MaterialSpinner
Ikuti Sistem
Nobobutton
Circlemageview
Mpandroidchart
Junit
Eclipse Public License 1.0
Kotlin
Jawa
GNU General Public License CE
- Sosial
- Makanan Dan Minuman
- Studi
# Toasts
To Don\'t kini mengikuti sistem Anda.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Tambah item To Don\'t baru
H
M
B
T
" dari "
" kebiasaan berhasil dihindari"
" kebiasaan berhasil dihindari, pertahankan!"
Dihindari
Kebiasaan
Apakah Anda benar-benar ingin menghapus ini?
Tidak
Apakah Anda benar-benar ingin menghapus ini?
Ya
Harap Tambahkan Label Terlebih Dahulu
Apakah Anda benar-benar ingin menghapus ini?
Januari
Februari
Maret
April
Mei
Juni
Juli
Agustus
September
Oktober
November
Desember
Tandai sebagai selesai atau dihindari.
Bantu jadikan \"To Don\'t\" lebih baik.
Pengingat ToDon\'t
"Tandai tugas ToDon\'t Anda "
Untuk memulai, catat sebuah kebiasaan buruk.
Lihat statistik Anda.
Tambah Label.
Izin Diperlukan
Aplikasi ini memerlukan akses ke penyimpanan eksternal Anda untuk memulihkan basis data. Harap aktifkan izin ini di pengaturan aplikasi.
Buka Pengaturan
Pilih Frekuensi Pengulangan
Sekali
Harian
Mingguan
Apakah Anda benar-benar ingin menghapus ini?\nIni juga akan menghapus semua kebiasaan yang terkait dengan label ini.
Data
Tambah notifikasi harian
Cadangkan
Pulihkan
Dracula
To Don\'t
Label Baru
Waktu
Frekuensi
Pantau kesalahan
Gunakan Sentry untuk melaporkan masalah secara otomatis demi perbaikan bug yang lebih cepat dan stabilitas yang lebih baik. Hanya data teknis penting yang dikumpulkan.
Notifikasi dijadwalkan
To Don\'t kini berada di sisi terang.
To Don\'t kini berada di sisi gelap.
# Here are the non-translateable strings
================================================
FILE: app/src/main/res/values-is/strings.xml
================================================
- Veldu Tungumál
- Czech
- Danska
- Þýska
- Enska
- Spanish
- Ítalska
- Franska
- Janúar
- Febrúar
- Mars
- Apríl
- Maí
- Júní
- Júlí
- Ágúst
- September
- Október
- Nóvember
- Desember
Ertu Viss Um Að Þú Viljir Eyða Þessum Vana?
Að Ekki
Öfugt Verkefnalistinn
Skelltu Niður Slæmu Venjum Þínum.Á Hverjum Degi, Kross
Út Þeim Sem Þú Gafst Eftir.Og Það Næsta
Byrjaðu Morguninn Með Ferskum Listanum.
Haltu Áfram
Forðast
Gert
Venjur
Í Dag
Log
Um
Merkimiðar
Stillingar
Flestir Forðast:
Síst Forðast:
Vinsamlegast Bættu Við Merkimiða Fyrst
Bættu Við Nýjum Merkimiða
Sláðu Inn Slæman Vana
Lýsing
Vista
Settu Niður Slæman Vana Til Að Byrja
Venja Birtist Hér
Apache Leyfi 2.0
Hönnuður
Leggja Sitt Af Mörkum
Þýða
Tilkynna Vandamál
Skoða Heimild
Opna Heimild
Frama
Dimmt
Ljós
Update
Feather Tákn
Mit Leyfi
Android Jetpack
Materialspinner
Fylgdu Kerfinu
Nobobutton
Circlemageview
Mpandroidchart
Junit
Eclipse Public License 1.0
Kotlin
Java
Gnu General Public License Ce
- Félagslegt
- Matur Og Drykkir
- Rannsóknir
# Toasts
To Don\\\'t er nú að nota %s þemað.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Bættu Við Nýju Við Hlutinn
D.
W.
M.
Y
"Út Úr"
„Venjur Er Forðast“
"Forðast Er Venja, Leið!"
Forðast
Venjur
Viltu Virkilega Eyða Þessu?
Nei
Viltu Virkilega Eyða Þessu?
Já
Vinsamlegast Bættu Við Merkimiða Fyrst
Viltu Virkilega Eyða Þessu?
Janúar
Febrúar
Mars
Apríl
Maí
Júní
Júlí
Ágúst
September
Október
Nóvember
Desember
Merkja Eins Og Gert Er Eða Forðast.
Hjálpaðu Til Við Að Gera \ "Til Að Gera Það Ekki Betur.
Todon \'T To Áminning
„Merktu Þig Todon\'T Verkefni“
Til Að Byrja Með Skaltu Setja Slæman Vana.
Skoðaðu Tölfræði Þína.
Bættu Við Merkimiða.
Leyfi Krafist
Þetta Forrit Krefst Aðgangs Að Ytri Geymslu Þinni Til Að Endurheimta Gagnagrunninn.Vinsamlegast Virkjaðu Þetta Leyfi Í Forritastillingunum.
Opnar Stillingar
Veldu Endurtekningartíðni
Einu Sinni
Daglega
Vikulega
Viltu Virkilega Eyða Þessu? \ Nthis Mun Einnig Eyða Öllum Venjum Sem Tengjast Þessum Merkimiða.
Gögn
Bættu Við Daglegri Tilkynningu
Afrit Af
Endurheimta
Dracula
================================================
FILE: app/src/main/res/values-it/strings.xml
================================================
- Scegli la lingua
- Ceco
- Danish
- Deutsch
- Inglese
- Spagnolo
- Italiano
- Francese
- Gennaio
- Febbraio
- Marzo
- Aprile
- Maggio
- Giugno
- Luglio
- Agosto
- Settembre
- Ottobre
- Novembre
- Dicembre
Sei sicuro di voler eliminare questa abitudine?
To Don\'t
Inverti la lista To Do
Scrivi le tue cattive abitudini. Segnatele.
Le cattive abitudini a cui hai ceduto. E il giorno dopo
inizia una nuova lista.
Continua
Evitate
Fatto
Abitudini
Oggi
Registro
Informazioni
Etichette
Nuova etichetta
Tempo
Frequenza
Impostazioni
Più evitato:
Meno evitato:
Aggiungi prima un\'etichetta
Aggiungi una nuova etichetta
Scrivi una cattiva abitudine
Nota
Salva
Per iniziare, scrivi una cattiva abitudine
Le abitudini appariranno qui
Licenza Apache 2.0
Sviluppatore
Contribuire
Tradurre
Segnala un bug
Visualizza il codice sorgente
Licenze Open Source
Aspetto
Scuro
Chiaro
Aggiornare
Feather Icons
Licenza MIT
Android Jetpack
MaterialSpinner
Segui il sistema
NoboButton
CircleImageView
MPAndroidChart
JUnit
Licenza Pubblica Eclipse 1.0
Kotlin
Java
Licenza Pubblica Generale GNU
- Sociale
- Cibo e Bevande
- Studio
To Don\\\'t sta utilizzando il tema %s ora.
Aggiungi nuova attività To Don\'t
D
Notifica programmata
W
M
G
" di "
" Abitudini evitate"
" Abitudini evitate, buon lavoro!"
Evitate
Abitudini
Sei sicuro di voler eliminare questo?
No
Sei sicuro di voler eliminare?
Sì
Per favore aggiungi prima un\'etichetta
Sei sicuro di voler eliminare questo?
Gennaio
Febbraio
Marzo
Aprile
Maggio
Giugno
Luglio
Agosto
Settembre
Ottobre
Novembre
Dicembre
Segna come fatto o evitato.
Aiuta a rendere "To Don\'t" migliore.
Promemoria ToDon\'t
Segna la tua attività ToDon\'t
Per iniziare, scrivi una cattiva abitudine.
Visualizza le tue statistiche.
Aggiungi etichetta.
Permesso richiesto
Questa app richiede l\'accesso al tuo archivio esterno per ripristinare il database. Abilita questo permesso nelle impostazioni dell\'app.
Apri le impostazioni
Seleziona la frequenza di ripetizione
Una volta
Giornaliero
Settimanale
Sei sicuro di voler eliminare questo?\nEliminerà anche tutte le abitudini correlate a questa etichetta.
Dati
Aggiungi notifica giornaliera
Backup
Ripristina
Dracula
================================================
FILE: app/src/main/res/values-ja/strings.xml
================================================
- 言語を選択します
- チェコ
- デンマーク語
- ドイツ語
- 英語
- スペイン語
- イタリア語
- フランス語
- 1月
- 2月
- 行進
- 4月
- 5月
- 6月
- 7月
- 8月
- 9月
- 10月
- 11月
- 12月
この習慣を削除したいですか?
Don \'Tに
逆To-Doリスト
あなたの悪い習慣を書き留めてください。毎日、十字架
あなたが与えたものを出してください。そして次の
朝は新鮮なリストから始めます。
続く
避けた
終わり
習慣
今日
ログ
について
ラベル
設定
ほとんど避けられた:
少なくとも回避:
最初にラベルを追加してください
新しいラベルを追加します
悪い習慣を入力してください
説明
保存
まず、悪い習慣を置いてください
習慣はここに現れます
Apacheライセンス2.0
開発者
貢献する
翻訳する
問題を報告します
ソースを表示します
オープンソースライセンス
外観
暗い
ライト
アップデート
フェザーアイコン
Mitライセンス
Android Jetpack
Materialspinner
システムをフォローします
Nobobutton
Circlemageview
Mpandroidchart
ジュニット
Eclipse Public License 1.0
コトリン
Java
Gnu一般公開ライセンスCe
- 社交
- 食べ物と飲み物
- 研究
# Toasts
To Don\\\'t は現在 %s テーマを使用しています。
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Don \'Tアイテムに新規を追加します
D
W
M
Y
"Out Of"
「習慣は避けられます」
「習慣は避けられます、行く方法!」
避けた
習慣
本当にこれを削除したいですか?
いいえ
本当にこれを削除したいですか?
はい
最初にラベルを追加してください
本当にこれを削除したいですか?
1月
2月
行進
4月
5月
6月
7月
8月
9月
10月
11月
12月
完了または回避されたとマークします。
\「T \」をより良くするのを手伝ってください。
Todon \'Tリマインダー
「あなたの服をマークしないタスク」
まず、悪い習慣を置いてください。
統計を表示します。
ラベルを追加します。
許可が必要です
このアプリでは、データベースを復元するために外部ストレージにアクセスする必要があります。アプリの設定でこの許可を有効にしてください。
設定を開く
繰り返し頻度を選択します
一度
毎日
毎週
これを本当に削除したいですか?\ N Thisは、このラベルに関連するすべての習慣も削除します。
データ
毎日の通知を追加します
バックアップ
復元する
Dracula
================================================
FILE: app/src/main/res/values-ka/strings.xml
================================================
- შეარჩიეთ ენა
- ჩეხური
- დანიური
- გერმანული
- ინგლისური
- ესპანური
- იტალიური
- ფრანგული
- იანვარი
- თებერვალი
- მარტი
- აპრილი
- მაისი
- ივნისი
- ივლისი
- აგვისტო
- September
- October
- November
- დეკემბერი
დარწმუნებული ხართ, რომ გსურთ ამ ჩვევის წაშლა?
არ
საპირისპირო სამუშაოების სია
ჩამოაგდე შენი ცუდი ჩვევები.ყოველდღე, ჯვარი
ის, ვინც თქვენ მიეცით.და შემდეგი
დილის დაწყება ახალი სიით.
გაგრძელება
თავიდან აცილება
გაკეთებული
ჩვევები
დღეს
ჟურნალი
გარშემო
ეტიკეტები
პარამეტრები
ყველაზე მეტად თავიდან აიცილეს:
ნაკლებად თავიდან აიცილეს:
პირველ რიგში დაამატეთ ეტიკეტი
დაამატეთ ახალი ეტიკეტი
შეიყვანეთ ცუდი ჩვევა
აღწერილობა
გადარჩენა
დასაწყებად, ცუდი ჩვევა ჩამოაგდე
ჩვევები აქ გამოჩნდება
Apache ლიცენზია 2.0
დეველოპერი ქალი
დახმარება
თარგმნა
შეატყობინეთ პრობლემას
იხილეთ წყარო
ღია კოდის ლიცენზიები
გარეგნობა
ბნელი
სინათლე
განახლება
ბუმბულის ხატები
Mit ლიცენზია
Android Jetpack
მასალები
მიჰყევით სისტემას
ნობობუტტონი
Circistimageview
Mpandroidchart
ჯუნიტი
Eclipse საზოგადოებრივი ლიცენზია 1.0
კოტლინი
ჯავა
Gnu ზოგადი საჯარო ლიცენზია Ce
- სოციალური
- საკვები და სასმელები
- კვლევები
# Toasts
To Don\\\'t ახლა იყენებს %s თემას.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
დაამატეთ ახალი არ
დ
W
მ
Y
"გარეთ"
"ჩვევების თავიდან აცილებაა"
"ჩვევები თავიდან აიცილეთ, გასავლელი გზა!"
თავიდან აცილება
ჩვევები
ნამდვილად გინდა ამის წაშლა?
არა
ნამდვილად გინდა ამის წაშლა?
დიახ
პირველ რიგში დაამატეთ ეტიკეტი
ნამდვილად გინდა ამის წაშლა?
იანვარი
თებერვალი
მარტი
აპრილი
მაისი
ივნისი
ივლისი
აგვისტო
სექტემბერი
ოქტომბერი
ნოემბერი
დეკემბერი
მონიშნეთ, როგორც გაკეთებულია ან თავიდან აიცილეთ.
დაეხმარეთ გააკეთოთ \ "Don \'T \" უკეთესი.
Todon \'T შეხსენება
"მონიშნე შენი Todon არ დავალება"
დასაწყებად, ცუდი ჩვევა ჩამოაგდეს.
ნახეთ თქვენი სტატისტიკა.
ეტიკეტის დამატება.
საჭიროა ნებართვა
ეს აპლიკაცია მოითხოვს თქვენს გარე საცავში წვდომას მონაცემთა ბაზის აღსადგენად.გთხოვთ, ჩართოთ ეს ნებართვა პროგრამის პარამეტრებში.
ღია პარამეტრები
აირჩიეთ განმეორების სიხშირე
ერთხელ
ყოველდღიური
ყოველკვირეული
ნამდვილად გსურთ ამის წაშლა? \ Nthis ასევე წაშლის ამ ეტიკეტთან დაკავშირებულ ყველა ჩვევას.
მონაცემი
ყოველდღიური შეტყობინების დამატება
სარეზერვო ასვლა
აღდგენა
Dracula
================================================
FILE: app/src/main/res/values-kk/strings.xml
================================================
- Тілді Таңдаңыз
- Чех
- Дат
- Неміс
- Ағылшынша
- Испан
- Итальяндық
- Француз
- Қаңтар
- Ақпан
- Сапта Жүру
- Сәуір
- Мамыр
- Маусым
- Шілде
- Тамыз
- Қыркүйек
- Қазан
- Қараша
- Желтоқсан
Сіз Осы Әдетті Жойғыңыз Келе Ме?
To Don \'T
Кері Істер Тізімі
Сіздің Жаман Әдеттеріңізді Төмендетіңіз.Күн Сайын, Крест
Сіз Бергендеріңізді Шығарыңыз.Және Келесі
Таңертең Жаңа Тізімнен Бастаңыз.
Жалғастыру
Аулау
Жасалды
Әдеттер
Бүгін
Журнал
Жөнінде
Жапсырмалар
Параметрлер
Ең Аулақ Болу:
Кем Дегенде Аулақ Болу:
Алдымен Жапсырма Қосыңыз
Жаңа Затбелгіні Қосыңыз
Жаман Әдетті Енгізіңіз
Түсіндірме
Жинау
Бастау Үшін, Жаман Әдетті Қойыңыз
Әдеттер Осында Көрінеді
Apache Лицензиясы 2.0
Салушы
Беру
Аудару
Мәселе Туралы Хабарлаңыз
Қайнар Көзін Қарау
Ашық Бастапқы Көздер
Көрінос
Қараңғы
Жарық
Жаңарту
Қауырсын Белгішелері
Mit Лицензиясы
Android Jetpack
Материалдарpinner
Жүйені Қадағалаңыз
Нобобуттон
Cheiryimageview
Mpandroidchart
Жасты
Eclipse Халыққа Лицензия 1.0
Котлин
Java
Gnu Жалпы Лицензиясы Ce Жалпы Лицензиясы
- Қоғамдық
- Азық-Түлік Пен Сусындар
- Зерттеулер
# Toasts
To Don\\\'t қазір %s тақырыбын пайдаланып жатыр.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Жаңаға Жаңа Қосу
Д
Дүние
М
У
«Жоқ»
«Әдеттерден Аулақ Болу»
«Бәрінен Аулақ Болыңыз, Баруға Болады!»
Аулау
Әдеттер
Сіз Мұны Шынымен Жойғыңыз Келе Ме?
Жоқ
Сіз Мұны Шынымен Жойғыңыз Келе Ме?
Иә
Алдымен Жапсырма Қосыңыз
Сіз Мұны Шынымен Жойғыңыз Келе Ме?
Қаңтар
Ақпан
Сапта Жүру
Сәуір
Мамыр
Маусым
Шілде
Тамыз
Қыркүйек
Қазан
Қараша
Желтоқсан
Орындалған Немесе Аулақ Болған Деп Белгілеңіз.
Көмектесіңіздер \ «Жақсы Емес.
Todon \'T Еске Салу
«Тапсырманы Белгілеңіз»
Бастау Үшін, Жаман Әдетті Қойыңыз.
Статистиканы Қараңыз.
Жапсырманы Қосыңыз.
Рұқсат Қажет
Бұл Бағдарлама Дерекқорды Қалпына Келтіру Үшін Сыртқы Сақтауға Кіруді Қажет Етеді.Қолданба Параметрлерінде Осы Рұқсатты Қосыңыз.
Ашық Параметрлер
Қайталау Жиілігін Таңдаңыз
Бір Рет
Күн Сайын
Жұма Сайын
Сіз Мұны Шынымен Жойғыңыз Келе Ме? \ Nбұл Осы Затбелгіге Қатысты Барлық Дағдыларды Жояды.
Мәліметтер
Күнделікті Хабарлама Қосыңыз
Сақтық Көшірме
Қалпына Келтіру
Dracula
================================================
FILE: app/src/main/res/values-ko/strings.xml
================================================
- 언어를 선택하십시오
- 체코 사람
- 덴마크 말
- 독일 사람
- 영어
- 스페인 사람
- 이탈리아 사람
- 프랑스 국민
- 1월
- 2월
- 3월
- 4월
- 5월
- 6월
- 칠월
- 팔월
- 구월
- 십월
- 십일월
- 12월
이 습관을 삭제 하시겠습니까?
Don \'T
반대 할 일 목록
당신의 나쁜 습관을 내려 놓으십시오.매일, 십자가
당신이 주신 사람들.그리고 다음
아침은 새로운 목록으로 시작합니다.
계속하다
피해
완료
버릇
오늘
통나무
에 대한
라벨
설정
가장 피하는 :
최소한 피하기 :
먼저 레이블을 추가하십시오
새 레이블을 추가하십시오
나쁜 습관을 입력하십시오
설명
구하다
시작하려면 나쁜 습관을 내려 놓으십시오
습관이 여기에 나타날 것입니다
아파치 라이센스 2.0
개발자
기여하다
번역하다
문제를보고하십시오
소스를 봅니다
오픈 소스 라이센스
모습
어두운
빛
업데이트
깃털 아이콘
Mit 라이센스
안드로이드 제트 팩
재료 스핀너
시스템을 따르십시오
노보 부트 턴
Circleimageview
Mpandroidchart
주니트
일식 공개 라이센스 1.0
코 틀린
자바
Gnu 일반 공공 라이센스 Ce
- 사회의
- 음식과 음료
- 연구
# Toasts
To Don\\\'t은(는) 이제 %s 테마를 사용하고 있습니다.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Don \'T 항목에 새로 추가하십시오
디
W
중
와이
"Out"
"습관은 피해요"
"습관을 피하고,가는 길!"
피해
버릇
정말로 이것을 삭제하고 싶습니까?
아니요
정말로 이것을 삭제하고 싶습니까?
예
먼저 레이블을 추가하십시오
정말로 이것을 삭제하고 싶습니까?
1월
2월
3월
4월
5월
6월
칠월
팔월
구월
십월
십일월
12월
완료되거나 피하는대로 표시하십시오.
"\'T \"를 더 잘하지 않도록 도와주세요.
Todon \'T 알림
"당신의 Todon N'T Task 표시"
시작하려면 나쁜 습관을 내려 놓으십시오.
통계를보십시오.
레이블을 추가하십시오.
권한이 필요합니다
이 앱은 데이터베이스를 복원하려면 외부 스토리지에 액세스해야합니다.앱 설정 에서이 권한을 활성화하십시오.
열기 설정
반복 주파수를 선택하십시오
한 번
일일
주간
정말로 이것을 삭제하고 싶습니까? \ N이 레이블과 관련된 모든 습관도 삭제합니다.
데이터
매일 알림을 추가하십시오
백업
복원하다
Dracula
================================================
FILE: app/src/main/res/values-la/strings.xml
================================================
- Lego Language
- Bohemica
- Daniculus
- Germanus
- Anglicus
- Spanish
- Italiae
- Gallus
- January
- Februarii
- Appellum
- Aprilis
- Ut
- Junio
- July
- Augusto
- September
- Octobris
- November
- Deceptio
Tu Es Certus Vis Delere Hoc Habitum?
Ut Don \'T
Et Converso Ad-Do List
Jot In Vestri Mala Habitum.Quotidie Crucem
Et Dedisti In.Et Altera
Mane Satus Off Cum Recens Album.
Permaneo
Advenus
Factum
Habitum
Hodie
Logus
De
Labels
Occasus
Maxime Avoided:
Certe Vitandum:
Please Add A Pittacium Primo
Addere Novi Label
Intra Mali Habitus
Descriptio
Salve
Satus Off, Imposuit Malus Habitus
Habitus Et Ostendam Usque Huc
Apache License 2.0
Developer
Confero
Transfero
Report A Forsit
Source
Aperto-Fonte Licenciis
Species
Tenebrosus
Lentus
Renovatio
Pluma Icons
Mit License
Android Jetpack
Materialsspinner
Sequitur Systema
Nobobutton
Circus Circulum
Mpandroidchart
Junit
Eclipse Public License 1.0
Kotlin
Java
Gnu General Public License Ce
- Socialis
- Victus Et Bibit
- Studiis
# Toasts
o Don\\\'t nunc thema %s utitur..
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Addere Novi Ad Don \ T Item
D
W
M
Y
"De"
"Habitum Vitandum"
"Habitum Vitanda, Ita Ut"
Advenus
Habitum
Tu Vere Volo Ut Delere Hoc?
Non
Tu Vere Volo Ut Delere Hoc?
Sic
Please Add A Pittacium Primo
Tu Vere Volo Ut Delere Hoc?
January
Februarii
Appellum
Aprilis
Ut
Junio
July
Augusto
September
Octobris
November
Deceptio
Marcam Fit Vel Vitandum.
Auxilium Faciunt \ "Ad Don \'T \" Melius.
Todon \'T Monitum
"Mark Vestri Todon'T Negotium"
Satus Off, Imposuit Malus Habitus.
View Your Civitas.
Addere Label.
Requiratur Permission
Hoc App Postulat Obvius Ad Externum Repono Ut Restituat Database.Placere Enable Hoc Permission In App Occasus.
Aperta Occasus
Eligere Repetitio Frequency
Semel
Cottidie
Septimanis
Tu Vere Volo Delere Hoc? \ Nthis Etiam Delere Omnes Habitus Ad Hunc Label.
Notitia
Addere Daily Notification
Tergum Sursum
Restituo
Dracula
================================================
FILE: app/src/main/res/values-lb/strings.xml
================================================
- Wielt D\'Sprooch
- Tschechesch
- Dänesch
- Däitsch
- Englesch
- Spuenesch
- Italienesch
- Franséisch
- Januar
- Februar
- Mäerz
- Abrëll
- Mee
- Juni
- Juli
- August
- September
- Oktober
- November
- Dezember
Sidd Dir Sécher, Datt Dir Dës Gewunnecht Läsche Wëllt?
Ze Maachen Net
Der Ëmgedréint Fir Lëscht
Jotéiert Är Schlecht Gewunnechten Erof.All Dag, Kräiz
Eraus Deen Dir Opginn Hutt.An Déi Nächst
De Moien Fänkt Mat Der Frëscher Lëscht Un.
Weidergitt
Vermeit
Verdataktioun
Gewunnecht
Haut
Aloggenloggen
Iwwer
Etebrauch
Astellunge
Meescht Vermeit:
Mannst Vermeit:
Füügt W.E.G. E Label
Füügt Neie Label
Gitt Schlecht Gewunnecht
Broessdatsch
Spuerwäit
Fir Unzefänken, Setzt Eng Schlecht Gewunnecht Un
Gewunnechten Weisen Hei
Apache Lizenz 2.0
Entwéckler
Bäidroen
Iwwersetzen
Bericht E Problem
View Quell
Open-Quell Lizenzen
Ergesetzung
Donkidn
Liicht
Olaangs
Fieder Symboler
Mit Lizenz
Android Jetpack
Materialpinner
Followsystem
Nobobutton
Crossallimare
Mpandroidchart
Mee Junit
Sonnendäischtert Ëffentlech Lizenz 1.0
Kotlin
Java
Gnu General Ëffentlech Lizenz Ce
- Sozias
- Liewensmëttel A Gedrénks
- Studien Sin
# Toasts
To Don\\\'t benotzt elo den %s Thema.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Füügt Nei Zu Don \'T Artikel
D
W-W
M
Y
" Aus "
"Gewunnechten Vermeit"
"Gewunnechten Vermeit, Wee Fir Ze Goen!"
Vermeit
Gewunnecht
Wëllt Dir Wierklech Dëst Läschen?
Nee
Wëllt Dir Wierklech Dëst Läschen?
Jo
Füügt W.E.G. E Label
Wëllt Dir Wierklech Dëst Läschen?
Januar
Februar
Mäerz
Abrëll
Mee
Juni
Juli
August
September
Oktober
November
Dezember
Markéiert Wéi Gemaach Oder Vermeit Ginn.
Hëlleft Et Ze Maachen \ "Bis Don \" Besser.
Todon \'T Erënnerung
"Markéiert Är Todon Net Aufgab"
Unzefänken, Setzt Eng Schlecht Gewunnecht Erof.
Gesinn Är Statistiken.
Füügt Label.
Zougrëffs-
Dës App Brauch Zougang Zu Ärem Externen Späichere Fir D\'Datebank Ze Restauréieren.Aktivéiert Dës Erlaabnis Dës Erlaabnis An Den App Astellungen.
Oppen Astellungen
Wielt Widderhuelung Frequenz
Eemol
Am Dag
Wëherspicht
Wëllt Dir Heizoullbaren Dëst Läschen? ~ Ntts Dur Och All Gewunnecht Déi Mat Dësem Kader Läscht.
Donnéeën
Füügt Deeglech Notifikatioun
Zréckkomm
Erëmzekréien
Dracula
================================================
FILE: app/src/main/res/values-lt/strings.xml
================================================
================================================
FILE: app/src/main/res/values-mk/strings.xml
================================================
- Изберете Јазик
- Чешки
- Дански
- Германски
- Англиски
- Шпански
- Италијански
- Француски
- Јануари
- Февруари
- Март
- Април
- Мај
- Јуни
- Јули
- Август
- Септември
- Октомври
- Ноември
- Декември
Дали Сте Сигурни Дека Сакате Да Ја Избришете Оваа Навика?
Да Не
Списокот За Обратни За Да Направам
Спуштете Ги Лошите Навики.Секој Ден, Крст
Надвор Од Оние На Кои Им Се Предадовте.И Следниот
Утрото Започнете Со Свежата Листа.
Продолжете
Избегна
Готово
Навики
Денес
Дневник
За
Етикети
Поставки
Најмногу Избегнуваат:
Најмалку Избегнати:
Ве Молиме, Најпрво Додадете Етикета
Додадете Нова Етикета
Внесете Лоша Навика
Опис
Зачувај
Да Започне, Спушти Лоша Навика
Навиките Ќе Се Појават Тука
Лиценца За Apache 2.0
Развивач
Придонесуваат
Преведете
Пријавете Проблем
Преглед На Извор
Лиценци Со Отворен Извор
Изглед
Темно
Светлина
Ажурирање
Икони Со Пердуви
Лиценца За Мит
Андроид Jetpack
Materialspinner
Следете Го Системот
Нобботон
Circleimageview
Mpandroidchart
Јунит
Затегнување На Јавна Лиценца 1.0
Котлин
Јава
Gnu Општа Јавна Лиценца Ce
- Социјална
- Храна И Пијалоци
- Студии
# Toasts
To Don\\\'t сега ја користи темата %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Додадете Ново Во Ставката За Не
Д.
W
М
Y
"Надвор Од"
„Навиките Се Избегнуваат“
„Навиките Се Избегнуваат, Начин Да Се Оди!“
Избегна
Навики
Дали Навистина Сакате Да Го Избришете Ова?
Не
Дали Навистина Сакате Да Го Избришете Ова?
Да
Ве Молиме, Најпрво Додадете Етикета
Дали Навистина Сакате Да Го Избришете Ова?
Јануари
Февруари
Март
Април
Мај
Јуни
Јули
Август
Септември
Октомври
Ноември
Декември
Означете Како Што Е Направено Или Избегнување.
Помогнете Да Го Направите \ "Да Донирате Подобро.
Потсетник За Тодон
„Означете Ја Вашата Задача За Тодон“
За Да Започнете, Спуштете Лоша Навика.
Погледнете Ја Статистиката.
Додадете Етикета.
Потребна Дозвола
Оваа Апликација Бара Пристап До Вашето Надворешно Складирање За Да Ја Вратите Базата На Податоци.Ве Молиме, Овозможете Ја Оваа Дозвола Во Поставките На Апликацијата.
Отворете Ги Поставките
Изберете Фреквенција На Повторување
Еднаш
Дневно
Неделно
Дали Навистина Сакате Да Го Избришете Ова?
Податоци
Додадете Дневно Известување
Назад
Врати
Dracula
================================================
FILE: app/src/main/res/values-ms/strings.xml
================================================
- Pilih Bahasa
- Czech
- Denmark
- Jerman
- Bahasa Inggeris
- Sepanyol
- Bahasa Itali
- Perancis
- Januari
- Februari
- Mac
- April
- Mei
- Jun
- Julai
- Ogos
- September
- Oktober
- November
- Disember
Adakah Anda Pasti Mahu Memadamkan Tabiat Ini?
Untuk Tidak
Senarai Tugasan Terbalik
Tuliskan Tabiat Buruk Anda.Setiap Hari, Salib
Keluar Dari Yang Anda Berikan Kepada.Dan Seterusnya
Pagi Bermula Dengan Senarai Segar.
Teruskan
Dielakkan
Selesai
Tabiat
Hari Ini
Log
Mengenai
Label
Tetapan
Kebanyakan Dielakkan:
Paling Tidak Dielakkan:
Sila Tambahkan Label Terlebih Dahulu
Tambah Label Baru
Masukkan Kebiasaan Buruk
Penerangan
Simpan
Untuk Memulakan, Meletakkan Tabiat Buruk
Tabiat Akan Muncul Di Sini
Lesen Apache 2.0
Pemaju
Menyumbang
Terjemahkan
Laporkan Masalah
Lihat Sumber
Lesen Sumber Terbuka
Penampilan
Gelap
Cahaya
Kemas Kini
Ikon Bulu
Lesen Mit
Android Jetpack
Bahanspinner
Ikuti Sistem
Nobobutton
Circlemageview
Mpandroidchart
Junit
Lesen Awam Eclipse 1.0
Kotlin
Jawa
Lesen Awam Umum Gnu Ce
- Sosial
- Makanan Dan Minuman
- Kajian
# Toasts
To Don\\\'t kini menggunakan tema %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Tambahkan Baru Ke Item Don \'T
D
W
M
Y
"Keluar Dari"
"Tabiat Dielakkan"
"Tabiat Dielakkan, Cara Untuk Pergi!"
Dielakkan
Tabiat
Adakah Anda Benar -Benar Mahu Memadamkannya?
Tidak
Adakah Anda Benar -Benar Mahu Memadamkannya?
Ya
Sila Tambahkan Label Terlebih Dahulu
Adakah Anda Benar -Benar Mahu Memadamkannya?
Januari
Februari
Mac
April
Mei
Jun
Julai
Ogos
September
Oktober
November
Disember
Tandakan Seperti Yang Dilakukan Atau Dielakkan.
Bantu Membuat \ "Untuk Tidak Lebih Baik.
Peringatan Todon \'T
"Tandakan Tugas Anda"
Untuk Memulakan, Letakkan Tabiat Yang Buruk.
Lihat Statistik Anda.
Tambah Label.
Kebenaran Diperlukan
Aplikasi Ini Memerlukan Akses Ke Storan Luaran Anda Untuk Memulihkan Pangkalan Data.Sila Aktifkan Kebenaran Ini Dalam Tetapan Aplikasi.
Buka Tetapan
Pilih Kekerapan Pengulangan
Sekali
Setiap Hari
Mingguan
Adakah Anda Benar -Benar Mahu Memadam Ini? \ Nthis Juga Akan Memadam Semua Tabiat Yang Berkaitan Dengan Label Ini.
Data
Tambah Pemberitahuan Harian
Kembali
Pulihkan
Dracula
================================================
FILE: app/src/main/res/values-mt/strings.xml
================================================
- Agħżel Lingwa
- Ċek
- Daniż
- Ġermaniż
- Ingliż
- Spanjol
- Taljan
- Franċiż
- Jannar
- Frar
- Marzu
- April
- Mejju
- Ġunju
- Lulju
- Awwissu
- Settembru
- Ottubru
- Novembru
- Diċembru
Int Żgur Li Trid Tħassar Din Il-Vizzju?
Biex Ma \'T
Il-Lista Ta \'Wara Li Tagħmel
Jot L-Isfel Tad-Drawwiet Ħżiena Tiegħek.Kuljum, Salib
Minn Dawk Li Ċedew Għalihom.U Dak Li Jmiss
Filgħodu Ibda Bil-Lista Friska.
Kompli
Evitat
Magħmul
Drawwiet
Illum
Log
Madwar
Tikketti
Settings
Ħafna Evitati:
L-Inqas Evitat:
Jekk Jogħġbok Żid Tikketta L-Ewwel
Żid Tikketta Ġdida
Daħħal Il-Vizzju Ħażin
Deskrizzjoni
Ħlief
Biex Tibda, Poġġi Drawwa Ħażina
Id-Drawwiet Se Jidhru Hawn
Liċenzja Apache 2.0
Żviluppatur
Tikkontribwixxi
Tittraduċi
Irrapporta Problema
View Sors
Liċenzji Ta \'Sors Miftuħ
Dehra
Dlam
Dawl
Aġġornament
Ikoni Tar-Rix
Liċenzja Mit
Jetpack Android
Materialspinner
Segwi S-Sistema
NoboButton
Circleimageview
Mpandroidchart
Junit
Eclipse Public License 1.0
Kotlin
Java
Gnu Liċenzja Pubblika Ġenerali Ce
- Soċjali
- Ikel U Xorb
- Studji
# Toasts
To Don\\\'t qed juża t-tema %s issa.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Żid Ġodda Ma \'L-Oġġett
D
W
M
Y
"Barra"
"Id-Drawwiet Huma Evitati"
"Id-Drawwiet Huma Evitati, Mod Kif Tmur!"
Evitat
Drawwiet
Int Verament Trid Tħassar Dan?
Le
Int Verament Trid Tħassar Dan?
Iva
Jekk Jogħġbok Żid Tikketta L-Ewwel
Int Verament Trid Tħassar Dan?
Jannar
Frar
Marzu
April
Mejju
Ġunju
Lulju
Awwissu
Settembru
Ottubru
Novembru
Diċembru
Marka Kif Sar Jew Evitat.
Tgħin Tagħmel \ "Biex Ma \'T \" Aħjar.
Todon \'T Tfakkira
"Immarka L-Kompitu Tiegħek"
Biex Tibda, Poġġi Drawwa Ħażina.
Ara L-Istatistiċi Tiegħek.
Żid It-Tikketta.
Permess Meħtieġ
Din L-App Teħtieġ Aċċess Għall-Ħażna Esterna Tiegħek Biex Terġa\'Tinkiseb Id-Database.Jekk Jogħġbok Ħalli Dan Il-Permess Fl-Issettjar Tal-App.
Settings Miftuħa
Agħżel Il-Frekwenza Tar-Ripetizzjoni
Darba
Kuljum
Kull Ġimgħa
Int Verament Trid Tħassar Dan? Nthis Se Tħassar Ukoll Id-Drawwiet Kollha Relatati Ma \'Din It-Tikketta.
Data
Żid Notifika Ta \'Kuljum
Back Up
Irrestawra
Dracula
================================================
FILE: app/src/main/res/values-nb-rNO/strings.xml
================================================
To Don\'t
- Velg språk
- Tjekkisk
- Dansk
- Tysk
- Engelsk
- Spansk
- Italiensk
- Fransk
- Januar
- Februar
- Mars
- April
- Mai
- Juni
- Juli
- August
- September
- Oktober
- November
- Desember
Er du sikker på at du vil slette denne vanen?
To Don\'t
Den omvendte gjøremålslisten
Noter ned dine dårlige vaner. Hver dag, kryss
ut de du ga etter for. Og neste
morgen start med en fersk liste.
Fortsett
Unngått
Ferdig
Vaner
I dag
Logg
Om
Etiketter
Innstillinger
Mest unngått:
Minst unngått:
Vennligst legg til en etikett først
Legg til ny etikett
Skriv inn dårlig vane
Beskrivelse
Lagre
For å starte, skriv ned en dårlig vane
Vaner vil vises her
Apache-lisens 2.0
Utvikler
Bidra
Oversett
Rapporter et problem
Vis kilde
Åpen kildekode-lisenser
Utseende
Mørk
Lys
Oppdater
Feather Ikoner
MIT-lisens
Android Jetpack
MaterialSpinner
Følg system
NoboButton
CircleImageView
MPAndroidChart
JUnit
Eclipse Public License 1.0
Kotlin
Java
GNU General Public License CE
- Sosialt
- Mat og drikke
- Studier
To Don\\\'t bruker nå %s-temaet.
Crazy Marvin
Code Acquaria
Link Hei blank fragment
Legg til ny To Don\'t-gjenstand
D
U
M
Å
" av "
" vaner er unngått"
" vaner er unngått, godt jobba!"
Unngått
Vaner
Vil du virkelig slette dette?
Nei
Vil du virkelig slette dette?
Ja
Vennligst legg til en etikett først
Vil du virkelig slette dette?
Januar
Februar
Mars
April
Mai
Juni
Juli
August
September
Oktober
November
Desember
Merk som ferdig eller unngått.
Hjelp med å gjøre \"To Don\'t\" bedre.
To Don\'t-påminnelse
"Merk din To Don\'t-oppgave "
For å starte, skriv ned en dårlig vane.
Vis dine statistikker.
Legg til etikett.
Tillatelse kreves
Denne appen krever tilgang til din eksterne lagring for å gjenopprette databasen. Vennligst aktiver denne tillatelsen i appens innstillinger.
Åpne innstillinger
Velg repetisjonsfrekvens
Én gang
Daglig
Ukentlig
Vil du virkelig slette dette?\nDette vil også slette alle vaner knyttet til denne etiketten.
Data
Legg til daglig varsling
Sikkerhetskopier
Gjenopprett
Dracula
================================================
FILE: app/src/main/res/values-ne/strings.xml
================================================
- भाषा चयन गर्नुहोस्
- चेक
- मर्मत
- जर्मन
- अंग्रेजी
- स्पेनिश
- इटालियन
- फ्रेन्च
- जनवरी
- फरवरी
- मार्च
- अप्रिल
- मे
- जून
- जुलाई
- अगस्त महिना
- सेप्टेम्बर
- अक्टोबर
- नभेम्बर
- दिसम्बर
के तपाईं पक्का यो बानी मेट्न निश्चित हुनुहुन्छ?
गर्न सक्दैन
उल्टो सूची
तपाईंको खराब बानीहरू तल झुकाउनुहोस्।हरेक दिन, क्रस
तपाईंले दिएकाहरू बाहिर।र अर्को
बिहान ताजा सूचीको साथ सुरू गर्नुहोस्।
जारी राख्नु
बेवास्ता
पूरा
बानी
आज
मुडो
प्राय
लेबलहरु
बतंग
धेरैले बेवास्ता गरे:
कमसेकम वेवास्ता गरियो:
कृपया पहिले लेबल थप्नुहोस्
नयाँ लेबल थप्नुहोस्
खराब बानी प्रविष्ट गर्नुहोस्
वर्णन
बचाउनु
सुरु गर्न सुरू गर्न, खराब बानी तल राख्नुहोस्
बानीले यहाँ देखा पर्नेछ
अपाचे इजाजत पत्र 2.0
विकासकर्ता
चन्दा दिनु
अनुवाद गर्नु
एउटा समस्या रिपोर्ट गर्नुहोस्
स्रोत हेर्नुहोस्
खुला स्रोत इजाजतपत्रहरू
प्रकटन
अध्यारो
हलुका
अद्यावधिक गर्नुहोस्
फेदर आइकन
Mit इजाजत पत्र
एन्ड्रोइड जेटप्याक
भौतिक भाग्नर
प्रणाली अनुसरण गर्नुहोस्
Nobobutton
चट्टेमलाइज दृश्य
Mpandroidchabt
जन्की
Excipipse सार्वजनिक इजाजतपत्र 1.0
कोटलिन
जावास
Gnu सामान्य सार्वजनिक इन्सेक सी।
- सामाजिक
- खाना र पेय पदार्थहरू
- अध्ययन
# Toasts
To Don\\\'t अहिले %s थिम प्रयोग गर्दैछ।
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
No Itet मा नयाँ थप्नुहोस्
D
ड हुनुहुन्छ
M
Y
"बाहिर"
"बानीहरूलाई वेवास्ता गरियो"
"बानीहरूबाट बच्न सकिन्छ, जाने बाटो!"
बेवास्ता
बानी
के तपाईं वास्तवमै यसलाई मेट्न चाहानुहुन्छ?
छैन
के तपाईं वास्तवमै यसलाई मेट्न चाहानुहुन्छ?
हुन्छ
कृपया पहिले लेबल थप्नुहोस्
के तपाईं वास्तवमै यसलाई मेट्न चाहानुहुन्छ?
जनवरी
फरवरी
मार्च
अप्रिल
मे
जून
जुलाई
अगस्त महिना
सेप्टेम्बर
अक्टोबर
नभेम्बर
दिसम्बर
मार्कको रूपमा मार्क गर्नुहोस् वा बेवास्ता गरियो।
मद्दत मद्दत गर्न मद्दत गर्न मद्दत गर्न मद्दत गर्नुहोस्। "
तोडन \'T रिमाइन्डर
"तपाईंको फोटेटेन काम चिन्ह लगाउनुहोस्"
सुरु गर्न, खराब बानी तल राख्नुहोस्।
तपाईंको तथ्या .्कहरू हेर्नुहोस्।
लेबल थप्नुहोस्।
अनुमति आवश्यक छ
यस अनुप्रयोगलाई डाटाबेस पुन: भण्डारण गर्न तपाईंको बाह्य स्टोरमा पहुँच आवश्यक पर्दछ।कृपया अनुप्रयोग सेटिंग्समा यो अनुमति सक्षम गर्नुहोस्।
खुला सेटिंग्स
दोहोर्याउने आवृत्ति चयन गर्नुहोस्
एक पल्ट
दैनिक
साप्ताहिक
के तपाईं वास्तवमै यो मेट्न चाहानुहुन्छ? \ Nthis पनि यो लेबल सम्बन्धित सबै बानीहरू मेटाउनेछ।
तथ्याड़क
दैनिक सूचना थप्नुहोस्
पूर्ति
मरम्मत गर्नु
Dracula
================================================
FILE: app/src/main/res/values-night/colors.xml
================================================
#FFFFFF
#000000
#676979
#CFD1DD
#E7E8EE
#000000
#FFFFFF
#FFFFFF
#000000
#676979
#CFD1DD
#FF6701
#FFFFFF
#FFD500
#FFAA00
#000000
#FFAA00
#000000
#FFFFFF
#FFD500
#FFAA00
#000000
#FF8F01
#FFC001
#FF0000
#FFFFFF
#000000
#FFFFFF
#868898
#4B4D59
#26262C
#FFFFFF
#42434D
#26272C
#FFFFFF
#B2B3BD
#555763
#FFBF00
#000000
#26272C
#26272C
#FFFFFF
#131316
#FFFFFF
#2F3037
#FFCC00
#FFB200
#000000
#131316
#131316
#282A36
#FFFFFF
#7E83A0
#46495E
#383B4C
#FFFFFF
#52576F
#44475A
#FFFFFF
#ADB0C2
#6F7495
#BC94F8
#282A36
#44475A
#44475A
#FFFFFF
#323443
#FFFFFF
#44475A
#BC94F8
#BC94F8
#282A36
#323443
#323443
#66F859
#000000
#F859A8
#FFFFFF
#9580FF
#FFFFFF
#F5F5F5
#000000
#707070
#CCCCCC
#E0E0E0
#000000
#F5F5F5
#F5F5F5
#000000
#707070
#CCCCCC
#644AC9
#FFFFFF
#E6E6E6
#E6E6E6
#000000
#D1D1D1
#000000
#E6E6E6
#644AC9
#644AC9
#FFFFFF
#D1D1D1
#D1D1D1
#000000
#FFFFFF
#26272C
#26272C
#42434D
#CFD1DD
================================================
FILE: app/src/main/res/values-night/strings.xml
================================================
- Select Language
- Czech
- Danish
- German
- English
- Spanish
- Italian
- French
- January
- February
- March
- April
- May
- June
- July
- August
- September
- October
- November
- December
Are you sure you want to delete this habit?
To Don\'t
The reverse to-do list
Jot down your bad habits. Every day, cross
out those you gave in to. And the next
morning start off with the fresh list.
Continue
Avoided
Done
Habits
Today
Log
About
Labels
Settings
Most avoided:
Least avoided:
Please add a label first
Add new label
Enter Bad Habit
Description
Save
To start off, put down a bad habit
Habits will show up here
Apache License 2.0
Developer
Contribute
Translate
Report a problem
View source
Open-source licences
Appearance
Dark
Light
Update
Feather Icons
MIT License
Android Jetpack
MaterialSpinner
Follow System
NoboButton
CircleImageView
MPAndroidChart
JUnit
Eclipse Public License 1.0
Kotlin
Java
GNU General Public License CE
- Social
- Foods And Drinks
- Studies
# Toasts
To Don\'t is using the %s theme now
GNU General Public License CE
https://github.com/mreram/ShowCaseView?
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Add new To Don\'t item
D
W
M
Y
" out of "
" habits are avoided"
" habits are avoided, way to go!"
Avoided
Habits
Do you really want to delete this?
No
Do you really want to delete this?
Yes
Please Add a Label First
Do you really want to delete this?
January
February
March
April
May
June
July
August
September
October
November
December
Mark as done or avoided.
Help make \"To Don\'t\" better.
ToDon\'t Reminder
"Mark your ToDon't task "
To Start Off, put down a bad habit.
View your stats.
Add Label.
Permission Required
This app requires access to your external storage to restore the database. Please enable this permission in the app settings.
Open Settings
Select Repetition Frequency
Once
Daily
Weekly
Do you really want to delete this?\nThis will also delete all habits related to this label.
Data
Add daily notification
Back up
Restore
Dracula
================================================
FILE: app/src/main/res/values-night/styles.xml
================================================
================================================
FILE: app/src/main/res/values-night-v35/styles.xml
================================================
================================================
FILE: app/src/main/res/values-nl/strings.xml
================================================
- Selecteer Taal
- Tsjechisch
- Deens
- Duits
- Engels
- Spaans
- Italiaans
- Frans
- Januari
- Februari
- Maart
- April
- Kunnen
- Juni
- Juli
- Augustus
- September
- Oktober
- November
- December
Weet Je Zeker Dat Je Deze Gewoonte Wilt Verwijderen?
Om Niet Te Doen
De Omgekeerde Takenlijst
Noteer Je Slechte Gewoonten.Kruis Elke Dag
Uit Degenen Waaraan U Heeft Gegeven.En De Volgende
De Ochtend Begint Met De Nieuwe Lijst.
Doorgaan
Vermeden
Klaar
Gebruiken
Vandaag
Aanroepen
Over
Labels
Instellingen
Meest Vermeden:
Minst Vermeden:
Voeg Eerst Een Label Toe
Voeg Een Nieuw Label Toe
Betreed Een Slechte Gewoonte
Beschrijving
Redden
Om Te Beginnen, Leg Je Een Slechte Gewoonte Neer
Gewoonten Zullen Hier Verschijnen
Apache License 2.0
Ontwikkelaar
Bijdragen
Vertalen
Meld Een Probleem
Bekijk Bron
Open-Source Licenties
Verschijning
Donker
Licht
Update
Veerpictogrammen
Mit -Licentie
Android Jetpack
Materiaalspinner
Volg Het Systeem
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Public License 1.0
Kotlin
Java
Gnu General Public License Ce
- Sociaal
- Voedsel En Drankjes
- Bestuderen
# Toasts
To Don\\\'t gebruikt nu het %s-thema..
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Voeg Nieuw Toe Aan Don \'T -Item
D
W
M
Y
"Uit"
"Gewoonten Worden Vermeden"
"Gewoonten Worden Vermeden, Manier Om Te Gaan!"
Vermeden
Gebruiken
Wil Je Dit Echt Verwijderen?
Nee
Wil Je Dit Echt Verwijderen?
Ja
Voeg Eerst Een Label Toe
Wil Je Dit Echt Verwijderen?
Januari
Februari
Maart
April
Kunnen
Juni
Juli
Augustus
September
Oktober
November
December
Markeer Zoals Gedaan Of Vermeden.
Help \ "Om Niet Beter Te Maken.
Todon \'T Herinnering
"Markeer Je Taak Niet"
Om Te Beginnen, Leg Je Een Slechte Gewoonte Neer.
Bekijk Uw Statistieken.
Label Toevoegen.
Toestemming Vereist
Deze App Vereist Toegang Tot Uw Externe Opslag Om De Database Te Herstellen.Schakel Deze Toestemming In De App -Instellingen In.
Open Instellingen
Selecteer Herhalingsfrequentie
Eenmaal
Dagelijks
Wekelijks
Wil Je Dit Echt Verwijderen? \ Ndis Zal Ook Alle Gewoonten Die Verband Houden Met Dit Label Verwijderen.
Gegevens
Voeg Dagelijkse Melding Toe
Back -Up
Herstellen
Dracula
================================================
FILE: app/src/main/res/values-pl/strings.xml
================================================
- Wybierz Język
- Czeski
- Duński
- Niemiecki
- Angielski
- Hiszpański
- Włoski
- Francuski
- Styczeń
- Luty
- Marzec
- Kwiecień
- Móc
- Czerwiec
- Lipiec
- Sierpień
- Wrzesień
- Październik
- Listopad
- Grudzień
Czy Na Pewno Chcesz Usunąć Ten Nawyk?
Don \'T
Lista Rzeczy Do Odwrotnej
Zmaruj Swoje Złe Nawyki.Codziennie, Krzyż
Osoby, Które Się Poddałeś.I Następny
Poranek Zacznij Od Nowej Listy.
Kontynuować
Uniknąć
Zrobione
Nawyki
Dzisiaj
Dziennik
O
Etykiety
Ustawienia
Najbardziej Unikał:
Najmniej Uniknięty:
Najpierw Dodaj Etykietę
Dodaj Nową Etykietę
Wprowadź Zły Nawyk
Opis
Ratować
Na Początek, Odłóż Zły Nawyk
Nawyki Pojawią Się Tutaj
Licencja Apache 2.0
Wywoływacz
Brać W Czymś Udział
Tłumaczyć
Zgłosić Problem
Zobacz Źródło
Licencje Na Otwartym Poziomie
Wygląd
Ciemny
Światło
Aktualizacja
Ikony Piór
Licencja Mit
Android Jetpack
Materialspinner
Śledź System
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Public Licens 1.0
Kotlin
Jawa
Gnu Generalna Licencja Publiczna Ce
- Społeczny
- Pokarm I Napoje
- Studia
# Toasts
To Don\\\'t używa teraz motywu %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Dodaj Nowy Do Pozycji
D
W
M
Y
„Out”
„Unika Się Nawyków”
„Unika Się Nawyków, Droga!”
Uniknąć
Nawyki
Czy Naprawdę Chcesz To Usunąć?
Nie
Czy Naprawdę Chcesz To Usunąć?
Tak
Najpierw Dodaj Etykietę
Czy Naprawdę Chcesz To Usunąć?
Styczeń
Luty
Marzec
Kwiecień
Móc
Czerwiec
Lipiec
Sierpień
Wrzesień
Październik
Listopad
Grudzień
Zaznacz Tak, Jak Zrobiono Lub Unikano.
Pomóż Uczynić \ "To Lepiej.
Todon \'T Przypomnienie
„Oznacz Swoje Zadanie”
Na Początek Odłóż Zły Nawyk.
Zobacz Swoje Statystyki.
Dodaj Etykietę.
Wymagane Pozwolenie
Ta Aplikacja Wymaga Dostępu Do Zewnętrznej Pamięci W Celu Przywrócenia Bazy Danych.Włącz To Pozwolenie W Ustawieniach Aplikacji.
Otwórz Ustawienia
Wybierz Częstotliwość Powtarzania
Raz
Codziennie
Tygodnik
Czy Naprawdę Chcesz To Usunąć?
Dane
Dodaj Codzienne Powiadomienie
Kopia Zapasowa
Przywrócić
Dracula
================================================
FILE: app/src/main/res/values-pt/strings.xml
================================================
- Selecione O Idioma
- Czech
- Dinamarquês
- German
- Inglês
- Spanish
- Italian
- French
- Janeiro
- Fevereiro
- Marchar
- Abril
- Poderia
- Junho
- Julho
- Agosto
- Setembro
- Outubro
- Novembro
- Dezembro
Tem Certeza De Que Deseja Excluir Esse Hábito?
Para Não Fazer
A Lista De Tarefas Reversas
Anote Seus Maus Hábitos.Todos Os Dias, Cruze
Fora Daqueles Que Você Deu.E O Próximo
Manhã Começa Com A Nova Lista.
Continuar
Avoided
Done
Hábitos
Hoje
Registro
Sobre
Rótulos
Configurações
Mais Evitado:
Menos Evitado:
Por Favor, Adicione Um Rótulo Primeiro
Adicione Nova Etiqueta
Entre No Mau Hábito
Descrição
Salvar
Para Começar, Abaixe Um Mau Hábito
Os Hábitos Aparecerão Aqui
Licença Apache 2.0
Developer
Contribuir
Traduzir
Relatar Um Problema
Exibir Fonte
Licenças De Código Aberto
Aparência
Dark
Luz
Atualizar
Ícones De Penas
Mit Licença
Android Jetpack
Materialspinner
Siga O Sistema
Nobobutton
Circleimageview
Mpandroidchart
Junit
Licença Pública Eclipse 1.0
Kotlin
Java
Gnu Licença Pública Geral Ce
- Social
- Alimentos E Bebidas
- Estudos
# Toasts
O To Don\\\'t está usando o tema %s agora.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Adicione Novo Ao Item Não
D
C
M
Y
" Fora De "
"Hábitos São Evitados"
"Os Hábitos São Evitados, Caminho A Percorrer!"
Avoided
Hábitos
Você Realmente Quer Excluir Isso?
Não
Você Realmente Quer Excluir Isso?
Sim
Por Favor, Adicione Um Rótulo Primeiro
Você Realmente Quer Excluir Isso?
Janeiro
Fevereiro
Marchar
Abril
Poderia
Junho
Julho
Agosto
Setembro
Outubro
Novembro
Dezembro
Mark Como Feito Ou Evitado.
Ajude A Melhorar "A Não Ser Melhor.
Todon \'T Lembrando
"Marque Sua Tarefa Para Não Ter"
Para Começar, Abaixe Um Mau Hábito.
Veja Suas Estatísticas.
Adicionar Rótulo.
Permissão Necessária
Este Aplicativo Requer Acesso Ao Seu Armazenamento Externo Para Restaurar O Banco De Dados.Ative Esta Permissão Nas Configurações Do Aplicativo.
Abra As Configurações
Selecione A Frequência De Repetição
Uma Vez
Daily
Semanalmente
Você Realmente Deseja Excluir Isso? \ Neste Também Excluirá Todos Os Hábitos Relacionados A Esse Rótulo.
Data
Adicione Notificação Diária
Backup
Restaurar
Dracula
================================================
FILE: app/src/main/res/values-pt-rBR/strings.xml
================================================
To Don\'t
- Selecionar Idioma
- Tcheco
- Dinamarquês
- Alemão
- Inglês
- Espanhol
- Italiano
- Francês
- Janeiro
- Fevereiro
- Março
- Abril
- Maio
- Junho
- Julho
- Agosto
- Setembro
- Outubro
- Novembro
- Dezembro
Você tem certeza que deseja excluir este hábito?
To Don\'t
A lista de tarefas ao contrário
Anote seus maus hábitos. Todo dia, risque
aqueles em que você cedeu. E na próxima
manhã comece com uma nova lista.
Continuar
Evitado
Feito
Hábitos
Hoje
Registro
Sobre
Etiquetas
Nova etiqueta
Tempo
Frequência
Configurações
Mais evitado:
Menos evitado:
Por favor, adicione uma etiqueta primeiro
Adicionar nova etiqueta
Insira um mau hábito
Descrição
Salvar
Para começar, registre um mau hábito
Os hábitos aparecerão aqui
Licença Apache 2.0
Desenvolvedor
Contribuir
Traduzir
Relatar um problema
Ver fonte
Licenças de código aberto
Aparência
Escuro
Claro
Atualizar
Ícones Feather
Licença MIT
Android Jetpack
MaterialSpinner
Seguir o Sistema
NoboButton
CircleImageView
MPAndroidChart
JUnit
Licença Pública Eclipse 1.0
Kotlin
Java
Licença Pública Geral GNU CE
- Social
- Comidas e Bebidas
- Estudos
To Don\'t agora segue o sistema.
To Don\'t está no modo claro agora.
To Don\'t está no modo escuro agora.
Crazy Marvin
Code Acquaria
Link Olá fragmento em branco
Adicionar novo item ao To Don\'t
D
Notificação agendada
S
M
A
" de "
" hábitos foram evitados"
" hábitos foram evitados, bom trabalho!"
Evitado
Hábitos
Você realmente deseja excluir isso?
Não
Você realmente deseja excluir isso?
Sim
Por favor, adicione uma etiqueta primeiro
Você realmente deseja excluir isso?
Janeiro
Fevereiro
Março
Abril
Maio
Junho
Julho
Agosto
Setembro
Outubro
Novembro
Dezembro
Marcar como feito ou evitado.
Ajude a melhorar o "To Don\'t".
Lembrete do To Don\'t
"Marque sua tarefa do To Don\'t "
Para começar, registre um mau hábito.
Veja suas estatísticas.
Adicionar Etiqueta.
Permissão Necessária
Este aplicativo requer acesso ao seu armazenamento externo para restaurar o banco de dados. Por favor, habilite essa permissão nas configurações do aplicativo.
Abrir Configurações
Selecione a Frequência de Repetição
Uma vez
Diariamente
Semanalmente
Você realmente deseja excluir isso?\nIsso também excluirá todos os hábitos relacionados a essa etiqueta.
Dados
Adicionar notificação diária
Fazer Backup
Restaurar
Drácula
================================================
FILE: app/src/main/res/values-ro/strings.xml
================================================
- Selectați Limba
- Ceh
- Danez
- German
- Engleză
- Spaniolă
- Italian
- Franceză
- Ianuarie
- Februarie
- Martie
- Aprilie
- Mai
- Iunie
- Iulie
- August
- Septembrie
- Octombrie
- Noiembrie
- Decembrie
Ești Sigur Că Vrei Să Ștergi Acest Obicei?
A Nu \'T
Lista Inversă De A Face
Notează -Ți Obiceiurile Proaste.În Fiecare Zi, Încrucișat
În Afară De Cei Pe Care I -Ai Cedat.Și Următorul
Dimineața Începe Cu Lista Proaspătă.
Continua
Evitat
Făcut
Obiceiuri
Astăzi
Jurnal
Despre
Etichete
Setări
Cel Mai Evitat:
Cel Mai Puțin Evitat:
Vă Rugăm Să Adăugați Mai Întâi O Etichetă
Adăugați O Nouă Etichetă
Intră Prost Obicei
Descriere
Salva
Pentru A Începe, Puneți Un Obicei Prost
Obiceiurile Vor Apărea Aici
Licență Apache 2.0
Dezvoltator
Contribui
Traduce
Raportați O Problemă
Vizualizați Sursa
Licențe Open-Source
Aspect
Întuneric
Aprinde
Actualizare
Pictograme De Pene
Licență Mit
Android Jetpack
Materialspinner
Urmați Sistemul
Nobobutton
Circlemageview
Mpandroidchart
Junit
Licență Publică Eclipse 1.0
Kotlin
Java
Licență Publică Generală Gnu Ce
- Social
- Alimente Și Băuturi
- Studii
# Toasts
To Don\\\'t folosește acum tema %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Adăugați Nou La Elementul Don \'T
D.
W
M
Y.
"Din"
„Obiceiurile Sunt Evitate”
"Obiceiurile Sunt Evitate, Calea De Urmat!"
Evitat
Obiceiuri
Chiar Vrei Să Ștergi Asta?
Nu
Chiar Vrei Să Ștergi Asta?
Da
Vă Rugăm Să Adăugați Mai Întâi O Etichetă
Chiar Vrei Să Ștergi Asta?
Ianuarie
Februarie
Martie
Aprilie
Mai
Iunie
Iulie
August
Septembrie
Octombrie
Noiembrie
Decembrie
Marcați Ca Fiind Făcut Sau Evitat.
Ajutați Să Faceți Mai Bine \ "A Nu \'T \".
Todon \'T Memento
„Marcați -Vă Sarcina Nu Este”
Pentru A Începe, Puneți Un Obicei Prost.
Vizualizați Statisticile.
Adăugați Etichetă.
Permisiunea Necesară
Această Aplicație Necesită Acces La Stocarea Dvs. Externă Pentru A Restabili Baza De Date.Vă Rugăm Să Activați Această Permisiune În Setările Aplicației.
Setări Deschise
Selectați Frecvența De Repetare
Dată
Zilnic
Săptămânal
Chiar Doriți Să Ștergeți Acest Lucru?
Date
Adăugați Notificări Zilnice
Înapoi
Restabili
Dracula
================================================
FILE: app/src/main/res/values-ru/strings.xml
================================================
- Выберите Язык
- Чешский
- Датский
- Немецкий
- Английский
- Испанский
- Итальянский
- Французский
- Январь
- Февраль
- Маршировать
- Апрель
- Может
- Июнь
- Июль
- Август
- Сентябрь
- Октябрь
- Ноябрь
- Декабрь
Вы уверены, что хотите удалить эту привычку?
Без дел
Обратный список дел
Запишите свои вредные привычки. Каждый день вычеркивайте
те, которым вы поддались. А следующим
утром начинайте с чистого листа.
Начать
Избежал(а)
Сделал
Привычки
Сегодня
Журнал
О приложении
Метки
Новые метки
Время
Частота
Настройки
Больше всего избежал:
Меньше всего избежал:
Сначала добавьте метку
Добавить новую метку
Введите вредную привычку
Описание
Сохранить
Для начала запишите вредную привычку
Здесь появятся ваши привычки
Apache License 2.0
Разработчик
Внести вклад
Перевести
Сообщить о проблеме
Исходный код
Лицензии Open-source
Оформление
Тёмная
Светлая
Обновить
Feather Icons
MIT License
Android Jetpack
MaterialSpinner
Как в системе
Нобобтон
Circleimageview
Mpandroidchart
Юнит
Eclipse Public License 1.0
Котлин
Ява
GNU General Public License CE
- Социальная
- Еда И Напитки
- Исследования
# Toasts
Без дел теперь использует системную тему.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Добавить новый пункт в Без дел
Д
Уведомление запланировано
Н
М
Г
" из "
" привычек избежано"
" привычек избежано, так держать!"
Избежал(а)
Привычки
Вы действительно хотите удалить это?
Нет
Вы действительно хотите удалить это?
Да
Пожалуйста, сначала добавьте метку
Вы действительно хотите удалить это?
Январь
Февраль
Март
Апрель
Май
Июнь
Июль
Август
Сентябрь
Октябрь
Ноябрь
Декабрь
Отметьте как «Сделано» или «Избежал».
Помогите сделать \"Без дел\" лучше.
Напоминание Без дел
"Отметьте задачу в Без дел "
Для начала запишите вредную привычку.
Посмотреть статистику.
Добавить метку.
Требуется разрешение
Этому приложению требуется доступ к внешнему хранилищу для восстановления базы данных. Пожалуйста, включите это разрешение в настройках приложения.
Открыть настройки
Выберите частоту повторения
Один раз
Ежедневно
Еженедельно
Вы действительно хотите удалить это?\nЭто также удалит все привычки, связанные с этой меткой.
Данные
Добавить ежедневное уведомление
Резервное копирование
Восстановить
Dracula
Отслеживание ошибок
Используйте Sentry для автоматической отправки отчетов об ошибках — это ускорит исправление багов и повысит стабильность. Сбор идет только важных технических данных.
Без дел перешел на светлую сторону.
Без дел перешел на темную сторону.
# Here are the non-translateable strings
Без дел
================================================
FILE: app/src/main/res/values-sk/strings.xml
================================================
- Vyberte Jazyk
- Český
- Dánsky
- Nemecký
- Angličtina
- Španielsky
- Taliansky
- Francúzsky
- Január
- Február
- Pochod
- Apríl
- May
- Jún
- Júl
- August
- September
- Október
- November
- December
Ste Si Istí, Že Chcete Tento Zvyk Odstrániť?
Don \'T
Zoznam Úloh Úloh
Zapíšte Si Svoje Zlé Návyky.Každý Deň, Kríž
Z Tých, Ktorých Ste Sa Dali.A Ďalší
Ráno Začína S Čerstvým Zoznamom.
Pokračovať
Vyhýbať Sa
Vykonaný
Návyky
Dnes
Protokol
O
Štítky
Nastavenia
Väčšina Sa Vyhýba:
Najmenej Sa Vyhnúť:
Najskôr Pridajte Štítok
Pridajte Nový Štítok
Zadajte Zlý Zvyk
Opis
Uložiť
Ak Chcete Začať, Odložte Zlý Zvyk
Zobrazia Sa Tu
Licencia Apache 2.0
Vývojár
Prispieť
Preložiť
Nahlásiť Problém
Zobraziť Zdroj
Licencie S Otvoreným Zdrojom
Vzhľad
Tmavý
Osvetlenie
Aktualizácia
Perie Ikony
Licencia
Android Jetpack
Materiál
Sledujte Systém
Nobobutton
Circleimageview
Mpandroidchart
Chmúrny
Verejná Licencia Zatmenia 1.0
Kokot
Java
Gnu General Public License Ce
- Spoločenský
- Jedlá A Nápoje
- Štúdie
# Toasts
To Don\\\'t teraz používa tému %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Pridať Novú Do Položky Don\'t
D
W
M
Y
„Z“
„Návodov Sa Vyhýba“
„Zvyčajné Zvyky Sa Vyhýbajú, Spôsob, Ako Ísť!“
Vyhýbať Sa
Návyky
Naozaj To Chcete Vymazať?
Nie
Naozaj To Chcete Vymazať?
Áno
Najskôr Pridajte Štítok
Naozaj To Chcete Vymazať?
Január
Február
Pochod
Apríl
Mája
Jún
Júl
August
September
Október
November
December
Označte Tak, Ako Sa To Urobí Alebo Sa Vyhýba.
Pomôžte Vylepšiť \ "Don \'T \".
Pripomienka
„Označte Svoju Úlohu Todon\'T“
Ak Chcete Začať, Odložte Zlý Zvyk.
Zobraziť Svoje Štatistiky.
Pridajte Štítok.
Požadované Povolenie
Táto Aplikácia Vyžaduje Prístup K Externému Úložisku Na Obnovenie Databázy.Povoľte Toto Povolenie V Nastaveniach Aplikácie.
Otvorte Nastavenia
Vyberte Frekvenciu Opakovania
Raz
Denný
Týždenný
Naozaj To Chcete Odstrániť?
Údaje
Pridajte Denné Oznámenie
Zálohovať
Obnoviť
Dracula
================================================
FILE: app/src/main/res/values-sl/strings.xml
================================================
- Izberite Jezik
- Češki
- Dansko
- Nemško
- Angleščina
- Španščina
- Italijan
- Francoz
- Januar
- Februar
- Pohod
- April
- Maj
- Junij
- Julij
- Avgust
- September
- Oktober
- November
- December
Ali Ste Prepričani, Da Želite Izbrisati To Navado?
Da Ne Bi
Seznam Obratnega Opravila
Zapišite Svoje Slabe Navade.Vsak Dan, Križa
Zunaj Tistih, Ki Ste Jih Dali.In Naslednje
Jutro Začnite S Svežem Seznamu.
Nadaljujte
Izognjeno
Končano
Navade
Danes
Dnevnik
Približno
Nalepke
Nastavitve
Najbolj Se Izognemo:
Najmanj Izognjeno:
Najprej Dodajte Nalepko
Dodajte Novo Etiketo
Vnesite Slabo Navado
Opis
Shrani
Za Začetek Odložite Slabo Navado
Tu Se Bodo Prikazale Navade
Apache Licenca 2.0
Razvijalec
Prispevati
Prevajanje
Prijavite Težavo
Vir Vir
Open-Source Licence
Videz
Temno
Svetloba
Posodobitev
Ikone Perja
Licenca Mit
Android Jetpack
Materialspinner
Sledite Sistemu
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Javna Licenca 1.0
Kotlin
Java
Gnu Splošna Javna Licenca Ce
- Socialni
- Hrana In Pijača
- Študije
# Toasts
To Don\\\'t zdaj uporablja temo %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Dodajte Novo V Element Don \'T
D
W
M
Y
"Izven"
"Navadam Se Izogibajo"
"Navadam Se Izogibamo, Pot!"
Izognjeno
Navade
Ali Res Želite To Izbrisati?
Ne
Ali Res Želite To Izbrisati?
Da
Najprej Dodajte Nalepko
Ali Res Želite To Izbrisati?
Januar
Februar
Pohod
April
Maj
Junij
Julij
Avgust
September
Oktober
November
December
Označite, Kot Je Bilo Storjeno Ali Se Izognemo.
Pomagajte Narediti \ ", Da Ne Bi Izboljšali.
Todon \'T Opomnik
"Označite Svojo Nalogo"
Za Začetek Odložite Slabo Navado.
Oglejte Si Svojo Statistiko.
Dodaj Nalepko.
Dovoljenje
Ta Aplikacija Zahteva Dostop Do Vašega Zunanjega Pomnilnika, Da Obnovite Bazo Podatkov.Prosimo, Omogočite To Dovoljenje V Nastavitvah Aplikacije.
Odprite Nastavitve
Izberite Frekvenco Ponovitve
Enkrat
Vsak Dan
Tedensko
Ali Res Želite To Izbrisati? \ Nto Boste Tudi Izbrisali Vse Navade, Povezane S To Etiketo.
Podatki
Dodajte Dnevno Obvestilo
Varnostno Kopiranje
Obnoviti
Dracula
================================================
FILE: app/src/main/res/values-sr/strings.xml
================================================
- Изаберите Језик
- Чешки
- Дански
- Немачки
- Енглески
- Шпански
- Италијански
- Француски
- Јануар
- Фебруар
- Март
- Април
- Маја
- Јуни
- Јул
- Август
- Септембар
- Октобар
- Новембар
- Децембар
Јесте Ли Сигурни Да Желите Да Избришете Ову Навику?
Да Не Доне
Реверсе Листа Обавеза
Спустите Своје Лоше Навике.Сваког Дана, Крст
Оне Које Сте Дали.И Следећи
Ујутро Започните Са Свежим Списком.
Настављати
Избјећи
Доношен
Навике
Данас
Дневник
О Томе
Налепница
Подешавања
Највише Избегава:
Најмање Избегавати:
Прво Додајте Налепницу
Додајте Нову Налепницу
Унесите Лошу Навику
Опис
Сачувати
Да Започнете, Одложите Лошу Навику
Навике Ће Се Појавити Овде
Апацхе Лиценсе 2.0
Разводнички
Допринети
Превести
Пријавите Проблем
Преглед Извора
Лиценце Отворених Кода
Изглед
Мрак
Светло
Ажурирање
Иконе Од Перја
Мит Лиценца
Андроид Јетпацк
Материалспиннер
Слиједите Систем
Нобобуттон
Цирцлеимагевиев
Мпандроидцхарт
Јунит
Ацлипсе Јавна Лиценца 1.0
Котлин
Јава
Гну Генерал Публиц Лиценсе Це
- Друштвени
- Храна И Пиће
- Студије
# Toasts
To Don\\\'t sada koristi %s temu.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Додајте Ново За Дон \'Т
Д
Ви
М
И
"Ван"
"Навике Се Избегавају"
"Избегавају Се Навике, На Начин Да Кренете!"
Избјећи
Навике
Да Ли Заиста Желите Да Избришете Ово?
Не
Да Ли Заиста Желите Да Избришете Ово?
Да
Прво Додајте Налепницу
Да Ли Заиста Желите Да Избришете Ово?
Јануар
Фебруар
Март
Април
Маја
Јуни
Јул
Август
Септембар
Октобар
Новембар
Децембар
Марка Како Је Урађено Или Избегава.
Помозите Да Будете Боље.
Тодон \'Т Подсетник
"Означи Своје Тодон Није Задатак"
Да Бисте Започели, Одложите Лошу Навику.
Погледајте Своју Статистику.
Додајте Налепницу.
Потребна Дозвола
Ова Апликација Захтева Приступ Вашем Спољном Складишту За Враћање Базе Података.Омогућите Ову Дозволу У Подешавањима Апликација.
Отвори Подешавања
Изаберите Фреквенцију Понављања
Једном
Свакодневно
Недељни
Да Ли Заиста Желите Да Избришете Ово? \ Нтхи Ће Такође Обрисати Све Навике Повезане Са Овом Етикетом.
Подаци
Додајте Дневно Обавештење
Резерват
Враћање
Dracula
================================================
FILE: app/src/main/res/values-sv/strings.xml
================================================
- Välj Språk
- Tjeckisk
- Dansk
- Tysk
- Engelska
- Spansk
- Italienare
- Franska
- Januari
- Februari
- Marsch
- April
- Kan
- Juni
- Juli
- Augusti
- September
- Oktober
- November
- December
Är Du Säker På Att Du Vill Ta Bort Den Här Vanan?
Till Don \'T
Den Omvända Att Göra-Listan
Skriv Ner Dina Dåliga Vanor.Varje Dag, Korsa
Ut De Du Gav Efter.Och Nästa
Morgon Börjar Med Den Nya Listan.
Fortsätta
Undvikande
Gjort
Vanor
I Dag
Logga
Om
Etiketter
Inställningar
Mest Undvikande:
Minst Undviks:
Lägg Till En Etikett Först
Lägg Till En Ny Etikett
Ange Dålig Vana
Beskrivning
Spara
För Att Börja, Lägg Ner En Dålig Vana
Vanor Kommer Att Dyka Upp Här
Apache -Licens 2.0
Framkallare
Medverka
Översätta
Rapportera Ett Problem
Visa Källa
Open Source-Licenser
Utseende
Mörk
Ljus
Uppdatera
Fjäderikoner
Mit -Licens
Android Jetpack
Materialspinnare
Följ Systemet
Nobobutton
Circlemagageview
Mpandroidchart
Borger
Eclipse Public License 1.0
Kotlin
Java
Gnu General Public License Ce
- Social
- Mat Och Dryck
- Studier
# Toasts
o Don\\\'t använder nu temat %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Lägg Till Nytt Till Don \'T -Objektet
D
W
M
Y
"Ur"
"Vanor Undviks"
"Vanor Undviks, Vägen Att Gå!"
Undvikande
Vanor
Vill Du Verkligen Ta Bort Det Här?
Inga
Vill Du Verkligen Ta Bort Det Här?
Ja
Lägg Till En Etikett Först
Vill Du Verkligen Ta Bort Det Här?
Januari
Februari
Marsch
April
Kan
Juni
Juli
Augusti
September
Oktober
November
December
Markera Som Gjort Eller Undviks.
Hjälp Till Att Göra \ "Att Don \'T \" Bättre.
Todon \'T Påminnelse
"Markera Din Todon'T -Uppgift"
För Att Börja, Lägg Ner En Dålig Vana.
Visa Din Statistik.
Lägg Till Etikett.
Tillstånd Krävs
Den Här Appen Kräver Åtkomst Till Din Externa Lagring För Att Återställa Databasen.Vänligen Aktivera Detta Tillstånd I Appinställningarna.
Öppna Inställningar
Välj Repetitionsfrekvens
En Gång
Dagligen
Varje Vecka
Vill Du Verkligen Ta Bort Detta? \ Det Här Kommer Också Att Ta Bort Alla Vanor Relaterade Till Den Här Etiketten.
Data
Lägg Till Daglig Anmälan
Backa Upp
Återställa
Dracula
================================================
FILE: app/src/main/res/values-ta/strings.xml
================================================
இல்லை
இதை நீக்க விரும்புகிறீர்களா?
சி-வைகாசி
இந்தப் பயன்பாட்டிற்கு தரவுத்தளத்தை மீட்டெடுக்க உங்கள் வெளிப்புற சேமிப்பகத்திற்கான அணுகல் தேவைப்படுகிறது. பயன்பாட்டு அமைப்புகளில் இந்த அனுமதியை இயக்கவும்.
வாராந்தோறும்
இந்தப் பழக்கத்தை நீக்க விரும்புகிறீர்களா?
செய்யக்கூடாதவை
தலைகீழ் செய்ய வேண்டிய பட்டியல்
உங்கள் கெட்ட பழக்கங்களைக் குறிக்கவும். ஒவ்வொரு நாளும், குறுக்கு
நீங்கள் விட்டதை அடித்துவிடுங்கள். அடுத்தது
புதிய பட்டியலுடன் காலைத் தொடங்குங்கள்.
தொடர்
தவிர்க்கப்பட்டது
முடிந்தது
பழக்கங்கள்
இன்று
பதிவு
பற்றி
சிட்டைகள்
அமைப்புகள்
மிகவும் தவிர்க்கப்பட்டது:
குறைந்தது தவிர்க்கப்பட்டது:
புதிய சிட்டையைச் சேர்
முதலில் ஒரு சிட்டையைச் சேர்
கெட்ட பழக்கத்தை உள்ளிடவும்
விவரம்
சேமி
தொடங்க, ஒரு கெட்ட பழக்கத்தைக் கீழே இடு
பழக்கவழக்கங்கள் இங்கே காண்பிக்கப்படும்
அப்பாச்சி உரிமம் 2.0
உருவாக்குநர்
பங்களிப்பு
மொழிபெயர்த்திடு
ஒரு சிக்கலைப் புகாரளி
மூலத்தைக் காண்க
திறந்த மூல உரிமங்கள்
தோற்றம்
இருண்ட
ஒளி
புதுப்பிப்பு
இறகுச் சின்னங்கள்
எம்ஐடி உரிமம்
ஆண்ட்ராய்டு செட்பேக்
பொருள்சுழற்றுபவர்
கணினி பின்தொடர்
இல்போபொத்தான்
வட்டப்படபார்வை
எம்பிஆண்ட்ராய்டுவிளக்கப்படம்
சேஅலகு
இடைத் தடுப்பு பொது உரிமம் 1.0
கோட்லின்
சாவா
குனு பொது பொதுமக்கள் உரிமம் பொப
வேண்டாம் என்பது இப்போது உங்கள் கணினியைப் பின்பற்றுகிறது.
# Here are the non-translateable strings
உருப்படிக்குப் புதியதைச் சேர்
நா
வா
தி
ஆ
" வெளியே "
" பழக்கங்கள் தவிர்க்கப்படுகின்றன"
" பழக்கங்கள் தவிர்க்கப்படுகின்றன, செல்லச் சிறந்த வழி!"
தவிர்க்கப்பட்டது
பழக்கங்கள்
இதை நீக்க விரும்புகிறீர்களா?
ஆம்
முதலில் ஒரு சிட்டையைச் சேர்
இதை நீக்க விரும்புகிறீர்களா?
மா-தை
தை-மாசி
மா-பங்குனி
ப-சித்திரை
வை-ஆனி
ஆ-ஆடி
ஆ-ஆவணி
ஆ-புரட்டாசி
பு-ஐப்பசி
ஐ-கார்த்திகை
கா-மார்கழி
செய்த அல்லது தவிர்க்கப்பட்டபடி குறிக்கவும்.
\"செய்ய வேண்டாம்\" செய்ய உதவுங்கள்.
செய்யக்கூடாதவை நினைவூட்டல்
"உங்கள் செய்யக்கூடாதவையின் பணியைக் குறிக்கவும் "
தொடங்க, ஒரு கெட்ட பழக்கத்தைக் கீழே இடு.
உங்கள் புள்ளிவிவரங்களைக் காண்க.
சிட்டையைச் சேர்.
இசைவு தேவை
அமைப்புகள் திற
மறுநிகழ்வு அதிர்வெண்ணைத் தேர்ந்தெடு
ஒருமுறை
நாள்தோறும்
இதை நீக்க விரும்புகிறீர்களா?\n இந்தச் சிட்டை தொடர்பான அனைத்து பழக்கங்களையும் இது நீக்கும்.
தகவல்கள்
நாள்தோறும் அறிவிப்பைச் சேர்
காப்புப்பிரதி
மீட்டமை
டிராகுலா
தவிர்
புதிய சிட்டைகள்
நேரம்
அலைவரிசை
அறிவிப்பு திட்டமிடப்பட்டுள்ளது
தவிர் இப்போது ஒளி பக்கத்தில் உள்ளது.
தவிர் இப்போது இருள் பக்கத்தில் உள்ளது.
# Here are the non-translateable strings
================================================
FILE: app/src/main/res/values-th/strings.xml
================================================
- เลือกภาษา
- ภาษาเช็ก
- เกี่ยวกับเดนมาร์ก
- ชาวเยอรมัน
- ภาษาอังกฤษ
- เกี่ยวกับภาษาสเปน
- อิตาลี
- ภาษาฝรั่งเศส
- มกราคม
- กุมภาพันธ์
- มีนาคม
- เมษายน
- อาจ
- มิถุนายน
- กรกฎาคม
- สิงหาคม
- กันยายน
- ตุลาคม
- พฤศจิกายน
- ธันวาคม
แน่ใจหรือว่าต้องการลบนิสัยนี้?
เพื่อไม่ \'T
รายการสิ่งที่ต้องทำย้อนกลับ
จดนิสัยที่ไม่ดีของคุณลงทุกวันข้าม
สิ่งที่คุณมอบให้และต่อไป
เริ่มตอนเช้าด้วยรายการใหม่
ดำเนินการต่อ
หลีกเลี่ยง
เสร็จแล้ว
นิสัย
วันนี้
บันทึก
เกี่ยวกับ
ฉลาก
การตั้งค่า
หลีกเลี่ยงมากที่สุด:
หลีกเลี่ยงน้อยที่สุด:
กรุณาเพิ่มฉลากก่อน
เพิ่มฉลากใหม่
เข้าสู่นิสัยที่ไม่ดี
คำอธิบาย
บันทึก
ในการเริ่มต้นให้วางนิสัยที่ไม่ดี
นิสัยจะปรากฏขึ้นที่นี่
ใบอนุญาต Apache 2.0
ผู้พัฒนา
มีส่วนช่วย
แปล
รายงานปัญหา
ดูแหล่งที่มา
ใบอนุญาตโอเพนซอร์ซ
รูปร่าง
มืด
แสงสว่าง
อัปเดต
ไอคอนขนนก
ใบอนุญาต Mit
Android Jetpack
Materialspinner
ติดตามระบบ
ชาวนอโบโบทตัน
Circleimageview
Mpandroidchart
จูท
ใบอนุญาตสาธารณะ Eclipse 1.0
Kotlin
ชวา
Gnu ทั่วไปใบอนุญาตสาธารณะ Ce
- ทางสังคม
- อาหารและเครื่องดื่ม
- การศึกษา
# Toasts
To Don\\\'t กำลังใช้ธีม %s อยู่ตอนนี้
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
เพิ่มใหม่ลงในรายการ Don \'t
D
W
ม.
Y
"ออกจาก"
"หลีกเลี่ยงนิสัย"
"หลีกเลี่ยงนิสัยทางไป!"
หลีกเลี่ยง
นิสัย
คุณต้องการลบสิ่งนี้หรือไม่?
เลขที่
คุณต้องการลบสิ่งนี้หรือไม่?
ใช่
กรุณาเพิ่มฉลากก่อน
คุณต้องการลบสิ่งนี้หรือไม่?
มกราคม
กุมภาพันธ์
มีนาคม
เมษายน
อาจ
มิถุนายน
กรกฎาคม
สิงหาคม
กันยายน
ตุลาคม
พฤศจิกายน
ธันวาคม
ทำเครื่องหมายว่าทำหรือหลีกเลี่ยง
ช่วยทำให้ \ "เพื่อไม่ \'T \" ดีขึ้น
การเตือนความจำ
"ทำเครื่องหมายงานของคุณไม่ได้"
ในการเริ่มต้นให้วางนิสัยที่ไม่ดี
ดูสถิติของคุณ
เพิ่มฉลาก
ต้องได้รับอนุญาต
แอพนี้ต้องการการเข้าถึงที่เก็บข้อมูลภายนอกของคุณเพื่อกู้คืนฐานข้อมูลโปรดเปิดใช้งานการอนุญาตนี้ในการตั้งค่าแอป
เปิดการตั้งค่า
เลือกความถี่การทำซ้ำ
ครั้งหนึ่ง
รายวัน
รายสัปดาห์
คุณต้องการลบสิ่งนี้จริงหรือไม่ \ N ซึ่งจะลบนิสัยทั้งหมดที่เกี่ยวข้องกับฉลากนี้
ข้อมูล
เพิ่มการแจ้งเตือนรายวัน
สำรอง
คืนค่า
Dracula
================================================
FILE: app/src/main/res/values-tl/strings.xml
================================================
- Piliin Ang Wika
- Czech
- Danish
- Aleman
- English
- Espanyol
- Italyano
- Pranses
- Enero
- Pebrero
- Marso
- Abril
- Mayo
- Hunyo
- Hulyo
- Agosto
- Setyembre
- Oktubre
- Nobyembre
- Disyembre
Sigurado Ka Bang Nais Mong Tanggalin Ang Ugali Na Ito?
Upang Hindi
Ang Reverse-Do List
Jot Down Ang Iyong Masamang Gawi.Araw -Araw, Tumawid
Out Ang Mga Ibinigay Mo Sa.At Ang Susunod
Magsimula Ang Umaga Sa Sariwang Listahan.
Magpatuloy
Iwasan
Tapos Na
Mga Gawi
Ngayon
Mag -Log
Tungkol Sa
Mga Label
Mga Setting
Pinaka Iwasan:
Hindi Bababa Sa Naiwasan:
Mangyaring Magdagdag Ng Isang Label Muna
Magdagdag Ng Bagong Label
Ipasok Ang Masamang Ugali
Paglalarawan
I -Save
Upang Magsimula, Maglagay Ng Isang Masamang Ugali
Ang Mga Gawi Ay Lalabas Dito
Apache Lisensya 2.0
Developer
Mag -Ambag
Isalin
Mag -Ulat Ng Isang Problema
Tingnan Ang Pinagmulan
Open-Source Lisensya
Hitsura
Madilim
Ilaw
I -Update
Mga Icon Ng Feather
Lisensya Ng Mit
Android Jetpack
Materialspinner
Sundin Ang System
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Public Lisensya 1.0
Kotlin
Java
Gnu General Public Lisensya Ce
- Panlipunan
- Pagkain At Inumin
- Pag -Aaral
# Toasts
Gamit na ngayon ng To Don\\\'t ang %s na tema.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Magdagdag Ng Bago Sa Item Na Hindi
D
W
M
Y
"Out Of"
"Ang Mga Gawi Ay Maiiwasan"
"Ang Mga Gawi Ay Maiiwasan, Paraan Upang Pumunta!"
Iwasan
Mga Gawi
Nais Mo Bang Tanggalin Ito?
Hindi
Nais Mo Bang Tanggalin Ito?
Oo
Mangyaring Magdagdag Ng Isang Label Muna
Nais Mo Bang Tanggalin Ito?
Enero
Pebrero
Marso
Abril
Mayo
Hunyo
Hulyo
Agosto
Setyembre
Oktubre
Nobyembre
Disyembre
Markahan Tulad Ng Tapos O Maiiwasan.
Tulungan Na Gumawa Ng \ "Upang Hindi Mas Mahusay.
Paalala Ni Todon
"Markahan Ang Iyong Todon'T Task"
Upang Magsimula, Maglagay Ng Isang Masamang Ugali.
Tingnan Ang Iyong Mga Istatistika.
Magdagdag Ng Label.
Kinakailangan Ng Pahintulot
Ang App Na Ito Ay Nangangailangan Ng Pag -Access Sa Iyong Panlabas Na Imbakan Upang Maibalik Ang Database.Mangyaring Paganahin Ang Pahintulot Na Ito Sa Mga Setting Ng App.
Buksan Ang Mga Setting
Piliin Ang Dalas Ng Pag -Uulit
Minsan
Araw -Araw
Lingguhan
Nais Mo Bang Tanggalin Ito?
Data
Magdagdag Ng Pang -Araw -Araw Na Abiso
I -Back Up
Ibalik
Dracula
================================================
FILE: app/src/main/res/values-tr/strings.xml
================================================
- Dili Seçin
- Çek
- Danimarkalı
- Almanca
- İngilizce
- İspanyol
- İtalyan
- Fransızca
- Ocak
- Şubat
- Mart
- Nisan
- Mayıs
- Haziran
- Temmuz
- Ağustos
- Eylül
- Ekim
- Kasım
- Aralık
Bu Alışkanlığı Silmek Istediğinden Emin Misiniz?
Doğrulmak
Ters Yapılacaklar Listesi
Kötü Alışkanlıklarınızı Not Edin.Her Gün Çapraz
Verdiğin Kişilerden.Ve Bir Sonraki
Sabah Yeni Listeyle Başlayın.
Devam Etmek
Kaçınılmış
Tamamlamak
Alışkanlıklar
Bugün
Kayıt
Hakkında
Etiketler
Ayarlar
En Çok Kaçınıldı:
En Az Kaçınıldı:
Lütfen Önce Bir Etiket Ekleyin
Yeni Etiket Ekle
Kötü Alışkanlık Girin
Tanım
Kaydetmek
Başlamak Için Kötü Bir Alışkanlık
Alışkanlıklar Burada Görünecek
Apache Lisans 2.0
Geliştirici
Katkı Yapmak
Tercüme Etmek
Bir Sorun Bildirin
Görünüm Kaynağı
Açık Kaynaklı Lisanslar
Dış Görünüş
Karanlık
Işık
Güncelleme
Tüy Simgeleri
Mit Lisansı
Android Jetpack
Malzeme
Sistemi Takip Edin
Nobobutton
Circleimageview
Mpandroidchart
Junit
Eclipse Halka Açık Lisans 1.0
Kotlin
Java
Gnu Genel Kamu Lisansı Ce
- Sosyal
- Yiyecekler Ve İçecekler
- Çalışmalar
# Toasts
To Don\\\'t şu anda sistem temasını kullanıyor.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Donm \'T Öğesine Yeni Ekle
D
W
M
Y
"Out"
"Alışkanlıklardan Kaçınılır"
"Alışkanlıklardan Kaçınılıyor, Gitmek Için!"
Kaçınılmış
Alışkanlıklar
Bunu Gerçekten Silmek Istiyor Musunuz?
Hayir
Bunu Gerçekten Silmek Istiyor Musunuz?
Evet
Lütfen Önce Bir Etiket Ekleyin
Bunu Gerçekten Silmek Istiyor Musunuz?
Ocak
Şubat
March
Nisan
Mayıs
Haziran
Temmuz
Ağustos
Eylül
Ekim
Kasım
Aralık
Yapıldığı Veya Kaçınıldığı Gibi Işaretleyin.
Daha Iyi Yapmaya Yardım Edin \'T \ "Daha Iyi.
Todon \'T Hatırlatma
"Todon'T Görevini Işaretleyin"
Başlamak Için Kötü Bir Alışkanlık Bırakın.
İstatistiklerinizi Görüntüleyin.
Etiket Ekleyin.
İzin Gerekli
Bu Uygulama, Veritabanını Geri Yüklemek Için Harici Depolamanıza Erişim Gerektirir.Lütfen Bu Izni Uygulama Ayarlarında Etkinleştirin.
Ayarlar Aç
Tekrarlama Frekansını Seçin
Bir Kere
Günlük
Haftalık
Bunu Gerçekten Silmek Istiyor Musunuz?
Veri
Günlük Bildirim Ekle
Yedeklemek
Eski Haline Getirmek
Dracula
Yeni Etiketler
Zaman
Sıklık
To Don\\\'t şu anda aydınlık temayı kullanıyor.
To Don\\\'t şu anda karanlık temayı kullanıyor.
# Here are the non-translateable strings
Bildirimler zamanlandı
================================================
FILE: app/src/main/res/values-uk/strings.xml
================================================
- Виберіть Мову
- Чеський
- Датський
- Німецький
- Англійська Мова
- Іспанська Мова
- Італійський
- Французький
- Січень
- Лютий
- Марш
- Квітень
- Травень
- Червень
- Липень
- Серпень
- Вересень
- Жовтень
- Листопад
- Грудень
Ви Впевнені, Що Хочете Видалити Цю Звичку?
Щоб Не
Зворотний Список Справ
Jot down your bad habits. Every day, cross
З Тих, Кого Ви Поступилися.А Наступний
Ранок Почніть Із Свіжого Списку.
Продовжувати
Avoided
Зроблений
Звички
Сьогодні
Журнал
Про
Етикетки
Налаштування
Найбільш Уникати:
Найменше Уникати:
Будь Ласка, Спочатку Додайте Етикетку
Додайте Нову Етикетку
Введіть Погану Звичку
Опис
Заощадити
Для Початку Відкладіть Погану Звичку
Звички З’Являться Тут
Ліцензія Apache 2.0
Розробник
Сприяти
Перекладати
Повідомте Про Проблему
Переглянути Джерело
Ліцензії На Відкрите Код
Зовнішність
Темний
Світлий
Оновити
Перо Ікони
Ліцензія Mit
Android Jetpack
Матеріал
Дотримуйтесь Системи
Нобобіттон
Circuimeview
Mpandroidchart
Junit
Публічна Ліцензія Eclipse 1.0
Котлін
Ява
Gnu Загальна Публічна Ліцензія Ce
- Соціальний
- Їжа Та Напої
- Вивчення
# Toasts
To Don\\\'t зараз використовує тему %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Додайте Нове До Не Дочірки
Р.
Ш
М
У
"Поза"
"Звички Уникають"
"Звички Уникають, Шлях!"
Уникнути
Звички
Ви Справді Хочете Видалити Це?
Ні
Ви Справді Хочете Видалити Це?
Так
Будь Ласка, Спочатку Додайте Етикетку
Ви Справді Хочете Видалити Це?
Січень
Лютий
Марш
Квітень
Травень
Червень
Липень
Серпень
Вересень
Жовтень
Листопад
Грудень
Позначте, Як Це Робиться Або Уникнути.
Допоможіть Зробити \ "Для Того, Щоб Краще \'T \".
Todon \'T Нагадування
"Позначте Своє Завдання Не Завдання"
Щоб Почати, Відкладіть Погану Звичку.
Перегляньте Свою Статистику.
Додати Мітку.
Необхідний Дозвіл
Цей Додаток Вимагає Доступу До Вашого Зовнішнього Сховища Для Відновлення Бази Даних.Увімкніть Цей Дозвіл У Налаштуваннях Програми.
Відкриті Налаштування
Виберіть Частоту Повторення
Раз
Щоденний
Щотижня
Ви Дійсно Хочете Видалити Це?
Дані
Додайте Щоденне Повідомлення
Резервувати
Відновити
Dracula
================================================
FILE: app/src/main/res/values-ur/strings.xml
================================================
- زبان منتخب کریں
- چیک
- ڈینش
- جرمن
- انگریزی
- ہسپانوی
- Italian
- فرانسیسی
- جنوری
- فروری
- مارچ
- اپریل
- مئی
- جون
- جولائی
- اگست
- ستمبر
- اکتوبر
- نومبر
- دسمبر
کیا آپ واقعی اس عادت کو حذف کرنا چاہتے ہیں؟
To Don \'T
ریورس ٹو ڈو لسٹ
اپنی بری عادتوں کو لکھ دیں۔ہر دن ، کراس
ان لوگوں سے باہر جو آپ نے دیا تھا۔اور اگلا
صبح کی تازہ فہرست کے ساتھ شروع کریں۔
جاری رکھیں
گریز کیا
کیا
عادات
آج
لاگ
کے بارے میں
لیبل
ترتیبات
Most avoided:
کم از کم گریز:
براہ کرم پہلے ایک لیبل شامل کریں
Add new label
Enter Bad Habit
تفصیل
بچت کریں
شروع کرنے کے لئے ، بری عادت ڈالیں
عادات یہاں ظاہر ہوں گی
اپاچی لائسنس 2.0
ڈویلپر
شراکت کریں
ترجمہ کریں
کسی مسئلے کی اطلاع دیں
ماخذ دیکھیں
اوپن سورس لائسنس
ظاہری شکل
تاریک
روشنی
تازہ کاری
پنکھ کی شبیہیں
ایم آئی ٹی لائسنس
اینڈروئیڈ جیٹ پیک
میٹریل اسپنر
سسٹم پر عمل کریں
نوبوٹن
سرکل میج ویو
Mpandroidchart
جونیٹ
چاند گرہن پبلک لائسنس 1.0
کوٹلن
جاوا
Gnu جنرل پبلک لائسنس عیسوی
- معاشرتی
- کھانے پینے اور مشروبات
- مطالعات
# Toasts
To Don\\\'t اب s% تھیم استعمال کر رہا ہے۔
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
ڈان \'ٹی آئٹم میں نیا شامل کریں
ڈی
ڈبلیو
م
Y
"باہر"
"عادات سے گریز کیا جاتا ہے"
"عادات سے گریز کیا جاتا ہے ، جانے کا راستہ!"
گریز کیا
عادات
کیا آپ واقعی اس کو حذف کرنا چاہتے ہیں؟
نہیں
کیا آپ واقعی اس کو حذف کرنا چاہتے ہیں؟
ہاں
براہ کرم پہلے ایک لیبل شامل کریں
کیا آپ واقعی اس کو حذف کرنا چاہتے ہیں؟
جنوری
فروری
مارچ
اپریل
مئی
جون
جولائی
اگست
ستمبر
اکتوبر
نومبر
دسمبر
جیسا کہ کیا گیا ہے یا سے گریز کیا ہے۔
بہتر بنانے میں مدد کریں \ "ڈان \'T \" بہتر بنائیں۔
ٹوڈن \'ٹی یاد دہانی
"اپنے ٹڈون ٹاسک کو نشان زد کریں"
شروع کرنے کے لئے ، بری عادت ڈالیں۔
اپنے اعدادوشمار دیکھیں۔
لیبل شامل کریں۔
اجازت درکار ہے
اس ایپ کو ڈیٹا بیس کو بحال کرنے کے لئے آپ کے بیرونی اسٹوریج تک رسائی کی ضرورت ہے۔براہ کرم ایپ کی ترتیبات میں اس اجازت کو قابل بنائیں۔
کھلی ترتیبات
تکرار کی فریکوئنسی منتخب کریں
ایک بار
روزانہ
ہفتہ وار
کیا آپ واقعی اس کو حذف کرنا چاہتے ہیں؟ \ N اس لیبل سے متعلق تمام عادات کو بھی حذف کردے گا۔
ڈیٹا
روزانہ نوٹیفکیشن شامل کریں
بیک اپ
بحال کریں
Dracula
================================================
FILE: app/src/main/res/values-uz/strings.xml
================================================
- Tilni Tanlang
- Chex Tili
- Daniya
- Nemis
- English
- Spanish
- Italyan
- Fransuz
- Yanvar
- Fevral
- Mart Oyi
- Aprel
- Mayl
- Iyun
- Iyul
- Avgust
- Sentyabr
- Oktyabr
- Noyabr
- Dekabr
Haqiqatan Ham Ushbu Odatni Yo\'Q Qilmoqchimisiz?
Don \'T
Teskari Toishma Ro\'Yxati
Yomon Odatlaringizdan Voz Keching.Har Kuni Xoch
Siz Berganlar.Va Keyingi
Ertalab Yangi Ro\'Yxat Bilan Boshlanadi.
Davom Eting
Qochib Qolgan
Bajarildi
Odatlar
Bugun
Jurnal
Haqida
Yorliq
Sozlash
Eng Qochish:
Hech Bo\'Lmaganda Qochish:
Iltimos, Avval Yorliq Qo\'Shing
Yangi Yorliq Qo\'Shing
Yomon Odatni Kiriting
Tavsif
Tejash
Boshlash Uchun, Yomon Odatni Qo\'Ying
Odatlar Bu Erda Paydo Bo\'Ladi
Apache Litsenziyasi 2.0
Ishlab Chiqaruvchi
Hissa Qo\'Shmoq
Tarjima Qilmoq
Muammo Haqida Xabar Bering
Manbani Ko\'Rish
Ochiq Manbali Litsenziyalar
Tashqi Ko\'Rinish
Qorong\'I
Yorug\'Lik
Yangilamoq
Tuz Piktogrammalari
Mit Litsenziyasi
Android Jetpack
Veterpinner
Tizimga Amal Qiling
Xiyobon
Aylana
Mpandroidchart
Junit
Eclipse Jamoat Litsenziyasi 1.0
Kotlin
Java
Gnu General Ommaviy Litsenziya
- Ijtimoiy
- Oziq-Ovqat Va Ichimliklar
- Izlamoq
# Toasts
To Don\\\'t hozir %s mavzusidan foydalanmoqda..
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Don \'Ga Yangi Qo\'Shing
Dum
Shilmoq
Shodlik
Shilmoq
"Tashqarida"
"Odatlar Oldini Olish"
"Odatlar Qochish Uchun Yo\'Ldan Qochishadi!"
Qochib Qolgan
Odatlar
Haqiqatan Ham Buni Yo\'Q Qilmoqchimisiz?
Yo\'Q
Haqiqatan Ham Buni Yo\'Q Qilmoqchimisiz?
Ha
Iltimos, Avval Yorliq Qo\'Shing
Haqiqatan Ham Buni Yo\'Q Qilmoqchimisiz?
Yanvar
Fevral
Mart Oyi
Aprel
Mayl
Iyun
Iyul
Avgust
Sentyabr
Oktyabr
Noyabr
Dekabr
Belgilangan Yoki Oldini Olish Uchun Belgi.
"T" "Ni Yaxshilash Uchun Yordam Bering.
Todon \'T Eslatma
"Vazifangizni Belgilang"
O\'Chirish Uchun Yomon Odat Qo\'Ying.
Statistikangizni Ko\'Ring.
Yorliq Qo\'Shish.
Ruxsat Talab Qilinishi Kerak
Ushbu Ilova Ma\'Lumotlar Bazasini Tiklash Uchun Tashqi Saqlashingizga Kirish Huquqini Talab Qiladi.Iltimos, Ushbu Ruxsatni Ilova Sozlamalarida Yoqing.
Ochiq Sozlamalar
Takrorlash Chastotasini Tanlang
Bir Marta
Har Kuni
Haftalik
Siz Buni Haqiqatan Ham Yo\'Q Qilmoqchimisiz? \ Nbsa Shuningdek Ushbu Yorliq Bilan Bog\'Liq Barcha Odatlarni Yo\'Q Qiladi.
Ma\'Lumotlar
Kundalik Xabar Qo\'Shish
Zaxirada
Tiklamoq
Dracula
================================================
FILE: app/src/main/res/values-v35/styles.xml
================================================
================================================
FILE: app/src/main/res/values-vi/strings.xml
================================================
- Chọn Ngôn Ngữ
- Séc
- Đan Mạch
- Đức
- Tiếng Anh
- Tiếng Tây Ban Nha
- Ý
- Tiếng Pháp
- Tháng Một
- Tháng Hai
- Bước Đều
- Tháng Tư
- Có Thể
- Tháng Sáu
- Tháng Bảy
- Tháng Tám
- Tháng 9
- Tháng Mười
- Tháng Mười Một
- Tháng 12
Bạn Có Chắc Là Bạn Muốn Xóa Thói Quen Này?
Để Don \'T
Danh Sách Việc Cần Làm Ngược Lại
Ghi Lại Những Thói Quen Xấu Của Bạn.Mỗi Ngày, Chéo
Ra Những Người Bạn Đã Đưa Ra.Và Tiếp Theo
Buổi Sáng Bắt Đầu Với Danh Sách Mới.
Tiếp Tục
Tránh
Xong
Thói Quen
Hôm Nay
Đăng Nhập
Về
Nhãn
Cài Đặt
Tránh Nhất:
Ít Tránh Nhất:
Vui Lòng Thêm Nhãn Trước
Thêm Nhãn Mới
Nhập Thói Quen Xấu
Sự Miêu Tả
Cứu
Để Bắt Đầu, Hãy Đặt Một Thói Quen Xấu
Thói Quen Sẽ Xuất Hiện Ở Đây
Giấy Phép Apache 2.0
Nhà Phát Triển
Đóng Góp
Dịch
Báo Cáo Một Vấn Đề
Xem Nguồn
Giấy Phép Nguồn Mở
Vẻ Bề Ngoài
Tối Tăm
Ánh Sáng
Cập Nhật
Biểu Tượng Lông Vũ
Giấy Phép Mit
Máy Bay Phản Lực Android
Vật Liệuspinner
Theo Hệ Thống
Nobobutton
Circleimageview
Mpandroidchart
Junit
Giấy Phép Công Cộng Eclipse 1.0
Kotlin
Java
Gnu General Public Giấy Phép Ce
- Xã Hội
- Thực Phẩm Và Đồ Uống
- Nghiên Cứu
# Toasts
To Don\\\'t hiện đang sử dụng chủ đề %s.
# Here are the non-translateable strings
# Here are the contentDescription strings (for impaired users) starting with "contentDescription_"
Thêm Mới Vào Mục Không
D
W
M
Y
"Ra Khỏi"
"Thói Quen Được Tránh"
"Thói Quen Được Tránh, Cách Để Đi!"
Tránh
Thói Quen
Bạn Có Thực Sự Muốn Xóa Cái Này?
Không
Bạn Có Thực Sự Muốn Xóa Cái Này?
Đúng
Vui Lòng Thêm Nhãn Trước
Bạn Có Thực Sự Muốn Xóa Cái Này?
Tháng Một
Tháng Hai
Bước Đều
Tháng Tư
Có Thể
Tháng Sáu
Tháng Bảy
Tháng Tám
Tháng 9
Tháng Mười
Tháng Mười Một
Tháng 12
Đánh Dấu Như Đã Làm Hoặc Tránh.
Giúp Làm Cho \ "Để Don \'T \" Tốt Hơn.
Todon \'T Nhắc Nhở
"Đánh Dấu Nhiệm Vụ Todon'T Của Bạn"
Để Bắt Đầu, Đặt Một Thói Quen Xấu.
Xem Số Liệu Thống Kê Của Bạn.
Thêm Nhãn.
Cần Có Sự Cho Phép
Ứng Dụng Này Yêu Cầu Truy Cập Vào Bộ Nhớ Ngoài Của Bạn Để Khôi Phục Cơ Sở Dữ Liệu.Vui Lòng Cho Phép Quyền Này Trong Cài Đặt Ứng Dụng.
Mở Cài Đặt
Chọn Tần Số Lặp Lại
Một Lần
Hằng Ngày
Hàng Tuần
Bạn Có Thực Sự Muốn Xóa Điều Này Không? \ Nthis Cũng Sẽ Xóa Tất Cả Các Thói Quen Liên Quan Đến Nhãn Này.
Dữ Liệu
Thêm Thông Báo Hàng Ngày
Hỗ Trợ
Khôi Phục
Dracula
================================================
FILE: app/src/main/res/values-zh-rCN/strings.xml
================================================
To Don\'t
您确定要删除此习惯吗?
To Don\'t
反向待办事项列表
记下你的坏习惯,每天都划掉
记下你的坏习惯。每天把那些你没能克制住的坏习惯划掉。然后第二天继续重复这一过程
然后第二天早上,从一份新列好的清单开始。
继续
避免
完成
习惯
今天
记录
关于
标签
新标签
时间
频率
设置
最避免的:
最不应该:
请先添加一个标签
添加新标签
写下坏习惯
描述
保存
首先,改掉坏习惯
习惯会显示在这里
Apache 许可证 2.0
开发者
贡献
翻译
报告问题
查看源代码
开源许可证
外观设置
深色模式
浅色模式
更新
MIT许可证
MaterialSpinner
跟随系统
Eclipse公共许可证1.0
GNU通用公共许可证
日
周
月
年
" 习惯避免"
" 习惯是避免的,干得好!"
避免
习惯
您真的要删除它吗?
取消
您真的要删除它吗?
确定
请先添加一个标签
您真的要删除它吗?
一月
二月
三月
四月
五月
六月
七月
八月
九月
十月
十一月
十二月
标记为完成或避免。
让 To Don\'t 变得更好。
To Don \'t 提醒
"标记你的待办任务 "
首先,改掉一个坏习惯。
查看您的统计数据。
添加标签。
需要许可
此应用需要访问您的外部存储权限来恢复数据。请在设置中开启此权限。
打开设置
选择重复频率
一次
每天
每周
您真的要删除它吗?\n这将删除所有与此标签相关的习惯。
数据
添加每日通知
备份数据
恢复数据
Feather Icons
已设定提醒
To Don\'t 现在跟随您系统的主题设置。
To Don\'t 现在使用浅色模式。
To Don\'t 现在使用深色模式。
# Here are the non-translateable strings
向 To Don\'t 项目添加新内容
" 退出 "
================================================
FILE: app/src/main/res/values-zh-rTW/strings.xml
================================================
您确定要删除此习惯吗?
反向待办事项列表
To Don\'t
然后第二天早上,从一份新列好的清单开始。
继续
避免
习惯
今天
完成
记录
關於
标签
设置
最避免的:
最不应该:
请先添加一个标签
添加新标签
写下坏习惯
描述
保存
首先,改掉坏习惯
开发者
翻译
报告问题
查看源代码
开源许可证
外观设置
深色模式
浅色模式
更新
跟随系统
Feather Icons
Android Jetpack
MaterialSpinner
NoboButton
贡献
CircleImageView
MPAndroidChart
MIT许可证
Apache许可证2.0
习惯会显示在这里
JUnit
已将主题模式设置为 %s 。
# Here are the non-translateable strings
Kotlin
Java
GNU通用公共许可证
Eclipse公共许可证1.0
取消
" 习惯避免"
" 习惯是避免的,干得好!"
习惯
向“不要”项目添加新内容
日
周
月
年
" 从…出去 "
避免
您真的要删除它吗?
确定
请先添加一个标签
您真的要删除它吗?
您真的要删除它吗?
一月
二月
五月
六月
七月
八月
标记为完成或避免。
九月
十月
十一月
十二月
添加标签。
首先,改掉一个坏习惯。
让 To Don\'t 变得更好。
To Don \'t 提醒
"标记你的待办任务 "
查看您的统计数据。
需要许可
此应用需要访问您的外部存储权限来恢复数据。请在设置中开启此权限。
打开设置
选择重复频率
一次
数据
备份数据
恢复数据
您真的要删除它吗?\n这将删除所有与此标签相关的习惯。
每天
每周
添加每日通知
记下你的坏习惯,每天都划掉
四月
记下你的坏习惯。每天把那些你没能克制住的坏习惯划掉。然后第二天继续重复这一过程
三月
德拉库拉
不待辦事項
使用 Sentry 來自動回報問題,以加快修復 Bug 的速度並提升穩定性。系統僅會收集必要的技術資料。
================================================
FILE: app/src/main/res/xml/backup_rules.xml
================================================
================================================
FILE: app/src/main/res/xml/data_extraction_rules.xml
================================================
================================================
FILE: app/src/main/res/xml/locales_config.xml
================================================
================================================
FILE: app/src/main/res/xml/no_buttons_widget_info.xml
================================================
================================================
FILE: app/src/main/res/xml/widget_info.xml
================================================
================================================
FILE: app/src/main/res/xml-v31/no_buttons_widget_info.xml
================================================
================================================
FILE: app/src/main/res/xml-v31/widget_info.xml
================================================
================================================
FILE: app/src/main/test/java/rocks/poopjournal/todont/ExampleUnitTest.kt
================================================
package rocks.poopjournal.todont
import org.junit.Test
import org.junit.Assert.*
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "2.3.20"
repositories {
jcenter()
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.9.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20"
// classpath 'com.google.gms:google-services:4.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
mavenCentral()
maven{url 'https://jitpack.io'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: fastlane/metadata/android/cs/changelogs/1.txt
================================================
První vydání
================================================
FILE: fastlane/metadata/android/cs/changelogs/2.txt
================================================
- Odebrán návrhář z obrazovky Informace
- Přesunuté pevně kódované řetězce z rozložení do řetězce.xml pro snazší překlad
- Aktualizujte sekci Použité licence o všechny použité závislosti (díky všem!)
- Přidejte další gesta přejetí prstem
- Malá vylepšení pod kapotou
================================================
FILE: fastlane/metadata/android/cs/changelogs/3.txt
================================================
Malé vylepšení pod kapotou
Opravte nastavení fastlane
================================================
FILE: fastlane/metadata/android/cs/full_description.txt
================================================
Dobrý pohled na špatné návyky. Zapište si své neřesti do klepnutí, přímo z domovské stránky. Použijte Poznámky k přidání podrobností - jako zdravá alternativa k té čokoládové tyčince, které nemůžete odolat. A organizujte svůj vstup pomocí štítků.
Rychleji, než můžete popadnout pero. Najděte své špatné návyky na domovské stránce a přeškrtněte ty, kterým dáte přednost. Přesunou se na den do Hotovo. Druhý den ráno začněte znovu s úplným seznamem věcí, kterým se musíte vyhnout.
Mějte přehled o svém pokroku. Protokol vám poskytuje přehled o vašich celkových úspěšnostech a určuje, ke kterému zlozvyku jste se nejvíce uchýlili - za týden, měsíc nebo rok. Takže se můžete snadno dopracovat k lepšímu.
Webová stránka: https://www.crazymarvin.com/todont
Přeložit do: https://hosted.weblate.org/engage/todont/
Zdroj na GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/cs/short_description.txt
================================================
Zpětný seznam úkolů.
================================================
FILE: fastlane/metadata/android/de-DE/changelogs/1.txt
================================================
Erstveröffentlichung
================================================
FILE: fastlane/metadata/android/de-DE/changelogs/2.txt
================================================
- Designer aus dem Info-Bildschirm entfernt
- Hart kodierte Zeichenketten aus dem Layout in die strings.xml verschoben, um die Übersetzung zu erleichtern
- Aktualisierung der Seite "Verwendete Lizenzen" mit allen verwendeten Abhängigkeiten (vielen Dank an alle!)
- Weitere Wischgesten hinzugefügt
- Kleine Verbesserungen unter der Haube
================================================
FILE: fastlane/metadata/android/de-DE/full_description.txt
================================================
Ein guter Blick auf schlechte Gewohnheiten. Notieren Sie Ihre Laster mit einem Fingertipp direkt von der Startseite aus. Verwenden Sie Notizen, um Details hinzuzufügen - wie eine gesunde Alternative zu dieser Tafel Schokolade, der Sie nicht widerstehen können. Und organisieren Sie Ihre Eingabe mit Labels.
Schneller als Sie einen Stift greifen können. Finden Sie Ihre schlechten Gewohnheiten auf der Startseite und markieren Sie die Einträge, denen Sie nachgegeben haben. Diese werden für den Tag nach Getan verschoben. Beginnen Sie am nächsten Morgen mit einer vollständigen Liste von Dingen, die Sie vermeiden sollten.
Bleiben Sie auf dem Laufenden. Das Protokoll gibt Ihnen einen Einblick über Ihre Gesamterfolgsraten und zeigt auf, mit welcher schlechten Angewohnheit Sie am meisten verbunden waren - über eine Woche, einen Monat oder ein Jahr. So können Sie leicht auf ein besseres Ich hinarbeiten.
Webseite: https://www.crazymarvin.com/todont
Übersetzte To Don’t: https://hosted.weblate.org/engage/todont/
Quelltext auf GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/de-DE/short_description.txt
================================================
Die umgedrehte To-Do-Liste.
================================================
FILE: fastlane/metadata/android/de-DE/title.txt
================================================
Lass es!
================================================
FILE: fastlane/metadata/android/en-US/changelogs/1.txt
================================================
Initial Release
================================================
FILE: fastlane/metadata/android/en-US/changelogs/10.txt
================================================
- 🐛 Prevent users from creating bad habits without a label to prevent app crashes (#187)
================================================
FILE: fastlane/metadata/android/en-US/changelogs/2.txt
================================================
- Removed designer from About screen
- Moved hard-coded strings from the layout into the strings.xml for easier translation
- Update Used Licenses section with all used dependencies (thanks to all of them!)
- Add more swipe gestures
- Little improvements under the hood
================================================
FILE: fastlane/metadata/android/en-US/changelogs/210.txt
================================================
- Target Android 14 🤖
- Support Per-app Language Preferences 🗺
- Make strings from external library translateable 🗺
- Translation Updates 🗺
- Refine UI 🎨
A huge thank you to all contributors and translators. 😘
Feel welcome to report issues and submit fixes on https://github.com/Crazy-Marvin/ToDont/ or translations on https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/en-US/changelogs/3.txt
================================================
Little improvements under the hood
Fix fastlane setup
================================================
FILE: fastlane/metadata/android/en-US/changelogs/300.txt
================================================
Enhanced:
- Extended Tutorial 🦮
- Android 15 Support 🤖
- Translation Updates 🗺️
- Refined UX 🎨
New features:
- Multiple avoids & dones per day 🪬
- Notifications 🛎️
- Local Backup & Restore 🛟
A huge thank you to all contributors and translators. 😘
Feel welcome to report issues and submit fixes on https://github.com/Crazy-Marvin/ToDont/ or translations on https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/en-US/changelogs/4.txt
================================================
- Translation updates 🗺️
- Please stay tuned for bug fixes 🦟
================================================
FILE: fastlane/metadata/android/en-US/changelogs/400.txt
================================================
Rewrite of To Don't in Kotlin to enhance maintainablity, performance, efficiency, UX and security 💣
================================================
FILE: fastlane/metadata/android/en-US/changelogs/410.txt
================================================
- New feature: add a cover image for entries 🖼️
- New feature: homescreen widget 🏡
- New feature: Dracula themes 🧛
- Translation updates 🗺️
- Bug fixes 🤢
- Updated dependencies 🔩
- Housekeeping 🧹
A huge thank you to all contributors and translators, especially @theftzoku. 😘
Feel welcome to report issues and submit fixes on https://github.com/Crazy-Marvin/ToDont/ or translations on https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/en-US/changelogs/420.txt
================================================
- Target Android 16 🤖
- UX improvements 🎨
- Translation updates 🗺️
- Bug fixes 🤢
- Updated dependencies 🔩
- Housekeeping 🧹
A huge thank you to all contributors and translators, especially @theftzoku. 😘
Feel welcome to report issues and submit fixes on https://github.com/Crazy-Marvin/ToDont/ or translations on https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/en-US/changelogs/430.txt
================================================
- UX improvements 🎨
- Translation updates 🗺️
- Bug fixes 🤢
- Updated dependencies 🔩
- Housekeeping 🧹
A huge thank you to all contributors and translators, especially @theftzoku. 😘
Feel welcome to report issues and submit fixes on https://github.com/Crazy-Marvin/ToDont/ or translations on https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/en-US/changelogs/5.txt
================================================
- Updated dependencies 🔩
================================================
FILE: fastlane/metadata/android/en-US/changelogs/6.txt
================================================
- Translations updates 🗺️
Feel welcome to send feedback by e-mail, open issues on GitHub or help translating. 💓
================================================
FILE: fastlane/metadata/android/en-US/changelogs/7.txt
================================================
- UX improvements 🦋
- Small bugfixes 🐛
- Translations updates 🗺️
Feel welcome to send feedback by e-mail, open issues on GitHub or help translating. 💓
================================================
FILE: fastlane/metadata/android/en-US/changelogs/8.txt
================================================
- Fix linting issues 🐛
================================================
FILE: fastlane/metadata/android/en-US/changelogs/9.txt
================================================
- Many Bugs Fixed Thanks To subeep 🐛
- Switch To Vector Graphics For A Sharper View Thanks To karthikayya 🎨
- Dependency Updates ⚙️
- Translation Updates 🗺️
================================================
FILE: fastlane/metadata/android/en-US/full_description.txt
================================================
A good look at bad habits. Jot down your vices in a tap, right from the home page. Use Notes to add details — like a healthy alternative to that chocolate bar you cannot resist. And organise your input with Labels.
Faster than you can grab a pen. Find your bad habits on the home page, and cross out the ones you give into. These will move to Done for the day. The next morning, start off fresh with a full list of things to avoid.
Stay on top of your progress. The Log gives you insight into your overall success rates and pinpoints what bad habit you have been most attached to — over a week, a month, or a year. So you can easily work toward a better you.
Webpage: https://www.crazymarvin.com/todont
Translate To Don’t: https://hosted.weblate.org/engage/todont/
Source on GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/en-US/short_description.txt
================================================
The reverse to-do list.
================================================
FILE: fastlane/metadata/android/en-US/title.txt
================================================
To Don't
================================================
FILE: fastlane/metadata/android/en-US/video.txt
================================================
https://youtu.be/_UStlpEMVro
================================================
FILE: fastlane/metadata/android/eo/changelogs/1.txt
================================================
Unua versio
================================================
FILE: fastlane/metadata/android/eo/changelogs/2.txt
================================================
- Forigis dezajniston for de la ekrano «Pri»
- Movis enkodigitajn signoĉenojn el la aranĝo en la dosieron strings.xml por pli facila tradukado
- Ĝisdatigis sekcion de Uzitaj Permesiloj laŭ ĉiuj uzataj dependaĵoj (dankon al ĉiuj!)
- Aldonis pli da ŝovumaj gestoj
- Malgrandaj plibonigoj
================================================
FILE: fastlane/metadata/android/eo/changelogs/3.txt
================================================
Malgrandaj plibonigoj
Ripari agordojn por fastlane
================================================
FILE: fastlane/metadata/android/eo/full_description.txt
================================================
Bona rigardo al malbonaj kutimoj. Notu viajn malvirtojn per frapeto, rekte de la ĉefpaĝo. Uzu Notojn por aldoni detalojn — ekzemple, sanan alternativon al ĉokolado, kiun vi ne povas rezisti. Kaj organizu vian kontribuon per Etikedoj.
Pli rapide ol kiel vi prenas plumon. Trovu viajn malbonajn kutimojn sur la ĉefpaĝo, kaj forstreku tiujn, al kiuj vi emas cedi. Ĉi tiuj moviĝos al «Finita» nur por la tago. La sekvan matenon, komencu freŝe per plena listo de evitindaĵoj.
Spuru vian progreson. La Protokolo donas al vi sciojn pri viaj ĝeneralaj sukcesfrekvencoj kaj indikas, kiajn malbonajn kutimojn vi plej kutimis — dum semajno, monato aŭ jaro. Tiel vi povas facile klopodi por plibonigi vin.
Retpaĝo: https://www.crazymarvin.com/todont
Traduki la programon en aliajn lingvojn: https://hosted.weblate.org/engage/todont/
Fontkodo ĉe GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/eo/short_description.txt
================================================
La maltasko-listo.
================================================
FILE: fastlane/metadata/android/es/changelogs/1.txt
================================================
Versión inicial
================================================
FILE: fastlane/metadata/android/es/changelogs/10.txt
================================================
- 🐛 Evite que los usuarios creen malos hábitos sin una etiqueta para evitar bloqueos de aplicaciones (#187)
================================================
FILE: fastlane/metadata/android/es/changelogs/2.txt
================================================
- Eliminado el diseñador de la pantalla Acerca de
- Se movieron cadenas codificadas de forma rígida del diseño a strings.xml para facilitar la traducción
- Actualizada la sección Licencias usadas con todas las dependencias usadas (¡gracias a todos ellos!)
- Agregados más gestos de deslizamiento
- Pequeñas mejoras debajo del telón
================================================
FILE: fastlane/metadata/android/es/changelogs/210.txt
================================================
- Objetivo Android 14 🤖
- Soporte de preferencias de idioma por aplicación 🗺
- Hacer traducibles las cadenas de una librería externa 🗺
- Actualizaciones de traducción 🗺
- Refinar la interfaz de usuario 🎨
Un enorme agradecimiento a todos los colaboradores y traductores. 😘
Siéntase bienvenido a reportar problemas y enviar correcciones en https://github.com/Crazy-Marvin/ToDont/ o traducciones en https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/es/changelogs/3.txt
================================================
Pequeñas mejoras debajo del telón
Arreglar la configuración de fastlane
================================================
FILE: fastlane/metadata/android/es/changelogs/30.txt
================================================
- Objetivo Android 13
================================================
FILE: fastlane/metadata/android/es/changelogs/4.txt
================================================
- Actualizaciones de traducciones 🗺️
- Manténgase al tanto para corrección de errores 🦟
================================================
FILE: fastlane/metadata/android/es/changelogs/5.txt
================================================
- Dependencias actualizadas 🔩
================================================
FILE: fastlane/metadata/android/es/changelogs/6.txt
================================================
- Traducciones actualizadas 🗺️
Te damos la bienvenida a enviar opiniones por e-mail, comparte tus problemas en GitHub o ayuda traduciendo. 💓
================================================
FILE: fastlane/metadata/android/es/changelogs/7.txt
================================================
- Mejoras a la interfaz de usuario (UX) 🦋
- Pequeñas soluciones de errores 🐛
- Traducciones actualizadas 🗺️
Te damos la bienvenida a enviar opiniones por e-mail, comparte tus problemas en GitHub o ayuda traduciendo. 💓
================================================
FILE: fastlane/metadata/android/es/changelogs/8.txt
================================================
- Corregidos problemas de código (linting) 🐛
================================================
FILE: fastlane/metadata/android/es/changelogs/9.txt
================================================
- Muchos errores fueron corregidos gracias a subeep 🐛
- Cambio a gráficos vectoriales para una vista más nítida gracias a karthikayya 🎨
- Actualizaciones de las dependencias ⚙️
- Actualizaciones de la traducción 🗺️
================================================
FILE: fastlane/metadata/android/es/full_description.txt
================================================
Una buena mirada a los malos hábitos. Anota tus vicios con un toque, directamente desde la página de inicio. Use las Notas para agregar detalles, como una alternativa saludable a esa barra de chocolate que no puede resistir. Y organice su entrada con Etiquetas.
Más rápido de lo que puedes agarrar un bolígrafo. Encuentra tus malos hábitos en la página de inicio y tacha los que no lograste. Estos se moverán a Listo para el día. A la mañana siguiente, comience de nuevo con una lista completa de cosas que debe evitar.
Manténgase al tanto de su progreso. El Registro le brinda información sobre sus índices generales de éxito y señala a qué mal hábito ha estado más apegado, durante una semana, un mes o un año. Para que puedas trabajar fácilmente hacia una mejor versión de ti mismo.
Página web: https://www.crazymarvin.com/todont
Traducir To Don’t: https://hosted.weblate.org/engage/todont/
Código Fuente en GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/es/short_description.txt
================================================
La lista de tareas al revés.
================================================
FILE: fastlane/metadata/android/es/title.txt
================================================
Para no hacer
================================================
FILE: fastlane/metadata/android/fi/changelogs/410.txt
================================================
Uusi ominaisuus: lisää kansikuva kirjoituksiin 🖼️
Uusi ominaisuus: aloitusnäyttö-vimpain 🏡
Käännöspäivitykset 🗺️
Virheenkorjauksia 🤢
Päivitetyt riippuvuudet 🔩
Siivous 🧹
Suuri kiitos kaikille avustajille ja kääntäjille, erityisesti @theftzoku. 😘
Voit ilmoittaa ongelmista ja lähettää korjauksia osoitteessa https://github.com/Crazy-Marvin/ToDont/ tai käännöksiä osoitteessa https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/fr/changelogs/1.txt
================================================
Version initiale
================================================
FILE: fastlane/metadata/android/fr/changelogs/2.txt
================================================
- Suppression du concepteur de l'écran À propos
- Déplacement des chaînes codées en dur de la disposition vers le fichier strings.xml pour une traduction plus facile
- Mise à jour de la section Licences utilisées avec toutes les dépendances utilisées (merci à tous !)
- Ajout de nouveaux gestes de glissement
- Petites améliorations sous le capot
================================================
FILE: fastlane/metadata/android/fr/changelogs/3.txt
================================================
Petites améliorations sous le capot
Correction de la configuration
================================================
FILE: fastlane/metadata/android/fr/full_description.txt
================================================
Un bon regard sur les mauvaises habitudes Notez vos vices en un clin d'œil, directement depuis la page d'accueil. Utilisez les notes pour ajouter des détails, comme une alternative saine à cette barre de chocolat à laquelle vous ne pouvez pas résister. Et organisez vos entrées avec les Étiquettes.
Plus rapide que de prendre un stylo Retrouvez vos mauvaises habitudes sur la page d'accueil, et rayez celles auxquelles vous cédez. Elles passeront dans la catégorie Fait pour la journée. Le lendemain matin, repartez de zéro avec une liste complète de choses à éviter.
Retracez vos progrès.
Le journal vous donne un aperçu de votre taux de réussite global et indique la mauvaise habitude à laquelle vous étiez le plus attaché·e, sur une semaine, un mois ou une année. Vous pouvez donc facilement travailler à vous améliorer.
Page Web : https://www.crazymarvin.com/todont
Traduire À pas faire : https://hosted.weblate.org/engage/todont/
Source sur GitHub : https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/fr/short_description.txt
================================================
La liste de choses à faire inversée.
================================================
FILE: fastlane/metadata/android/fr/title.txt
================================================
À pas faire
================================================
FILE: fastlane/metadata/android/ga/changelogs/1.txt
================================================
Scaoileadh Tosaigh
================================================
FILE: fastlane/metadata/android/ga/changelogs/10.txt
================================================
- 🐛 Cosc a chur ar úsáideoirí droch-nósanna a chruthú gan lipéad chun tuairteanna aipeanna a chosc (#187)
================================================
FILE: fastlane/metadata/android/ga/changelogs/2.txt
================================================
- Baineadh an dearthóir ón scáileán Maidir Linn
- Bogadh teaghráin chrua-chódaithe ón leagan amach isteach sa strings.xml le haghaidh aistriúcháin níos éasca
- Nuashonraíodh an chuid Ceadúnais Úsáidte leis na spleáchais uile a úsáideadh (buíochas leo go léir!)
- Cuirtear níos mó gothaí svaidhpe leis
- Feabhsuithe beaga faoin gcochall
================================================
FILE: fastlane/metadata/android/ga/changelogs/210.txt
================================================
- Sprioc Android 14 🤖
- Tacaíocht do Roghanna Teanga In aghaidh an Aip 🗺
- Teaghráin ó leabharlann sheachtrach a dhéanamh inaistrithe 🗺
- Nuashonruithe Aistriúcháin 🗺
- Comhéadan Úsáideora a Mhionchoigeartú 🎨
Buíochas mór leis na rannpháirtithe agus na haistritheoirí go léir. 😘
Fáilte romhat fadhbanna a thuairisciú agus réitigh a chur isteach ar https://github.com/Crazy-Marvin/ToDont/ nó aistriúcháin ar https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ga/changelogs/3.txt
================================================
Feabhsuithe beaga faoin gcochall
Deisigh socrú lána tapa
================================================
FILE: fastlane/metadata/android/ga/changelogs/300.txt
================================================
Feabhsaithe:
- Ranganna Teagaisc Leathnaithe 🦮
- Tacaíocht Android 15 🤖
- Nuashonruithe Aistriúcháin 🗺️
- UX Scagtha 🎨
Gnéithe nua:
- Il-sheachaint & chríochnaithe in aghaidh an lae 🪬
- Fógraí 🛎️
- Cúltaca & Athchóiriú Áitiúil 🛟
Buíochas mór leis na rannpháirtithe agus na haistritheoirí go léir. 😘
Fáilte romhat fadhbanna a thuairisciú agus socruithe a chur isteach ar https://github.com/Crazy-Marvin/ToDont/ nó aistriúcháin ar https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ga/changelogs/4.txt
================================================
- Nuashonruithe aistriúcháin 🗺️
- Fan tiúnta le haghaidh ceartúcháin fabht 🦟
================================================
FILE: fastlane/metadata/android/ga/changelogs/400.txt
================================================
Athscríobh "Ná Déan" i Kotlin chun feabhas a chur ar chothabháil, ar fheidhmíocht, ar éifeachtúlacht, ar UX agus ar shlándáil 💣
================================================
FILE: fastlane/metadata/android/ga/changelogs/410.txt
================================================
- Gné nua: cuir íomhá chlúdaigh le haghaidh iontrálacha 🖼️
- Gné nua: giuirléid scáileáin bhaile 🏡
- Gné nua: Téamaí Dracula 🧛
- Nuashonruithe aistriúcháin 🗺️
- Ceartúcháin fabhtanna 🤢
- Spleáchais nuashonraithe 🔩
- Coimeád Tí 🧹
Buíochas mór leis na rannpháirtithe agus na haistritheoirí go léir, go háirithe @theftzoku. 😘
Fáilte romhat fadhbanna a thuairisciú agus ceartúcháin a chur isteach ar https://github.com/Crazy-Marvin/ToDont/ nó aistriúcháin ar https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ga/changelogs/420.txt
================================================
- Sprioc Android 16 🤖
- Feabhsuithe UX 🎨
- Nuashonruithe aistriúcháin 🗺️
- Ceartúcháin fabhtanna 🤢
- Spleáchais nuashonraithe 🔩
- Glanadh Tí 🧹
Buíochas mór leis na rannpháirtithe agus na haistritheoirí go léir, go háirithe @theftzoku. 😘
Fáilte romhat fadhbanna a thuairisciú agus ceartúcháin a chur isteach ar https://github.com/Crazy-Marvin/ToDont/ nó aistriúcháin ar https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ga/changelogs/430.txt
================================================
- Feabhsuithe UX 🎨
- Nuashonruithe aistriúcháin 🗺️
- Ceartúcháin fabhtanna 🤢
- Spleáchais nuashonraithe 🔩
- Glanadh Tí 🧹
Buíochas mór leis na rannpháirtithe agus na haistritheoirí go léir, go háirithe @theftzoku. 😘
Fáilte romhat fadhbanna a thuairisciú agus ceartúcháin a chur isteach ar https://github.com/Crazy-Marvin/ToDont/ nó aistriúcháin ar https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ga/changelogs/5.txt
================================================
- Spleáchais nuashonraithe 🔩
================================================
FILE: fastlane/metadata/android/ga/changelogs/6.txt
================================================
- Nuashonruithe aistriúcháin 🗺️
Fáilte romhat aiseolas a sheoladh trí ríomhphost, saincheisteanna a oscailt ar GitHub nó cabhrú le haistriúchán. 💓
================================================
FILE: fastlane/metadata/android/ga/changelogs/7.txt
================================================
- Feabhsuithe UX 🦋
- Ceartúcháin bheaga ar fhabhtanna 🐛
- Nuashonruithe aistriúcháin 🗺️
Fáilte romhat aiseolas a sheoladh trí ríomhphost, saincheisteanna a oscailt ar GitHub nó cabhrú le haistriúchán. 💓
================================================
FILE: fastlane/metadata/android/ga/changelogs/8.txt
================================================
- Fadhbanna línte a shocrú 🐛
================================================
FILE: fastlane/metadata/android/ga/changelogs/9.txt
================================================
- Go leor fabhtanna socraithe a bhuíochas le subeep 🐛
- Athraigh go grafaicí veicteora le haghaidh radharc níos géire a bhuíochas le karthikayya 🎨
- Nuashonruithe spleáchais ⚙️
- Nuashonruithe aistriúcháin 🗺️
================================================
FILE: fastlane/metadata/android/ga/full_description.txt
================================================
Léargas maith ar dhroch-nósanna. Scríobh síos do lochtanna le sconna amháin, díreach ón leathanach baile. Bain úsáid as Nótaí chun sonraí a chur leis — cosúil le rogha shláintiúil in ionad an bharra seacláide sin nach féidir leat a sheasamh. Agus eagraigh do chuid ionchuir le Lipéid.
Níos tapúla ná mar is féidir leat peann a ghabháil. Aimsigh do dhroch-nósanna ar an leathanach baile, agus scrios amach na cinn a dtugann tú faoi. Bogfar iad seo go dtí Críochnaithe don lá. An mhaidin dár gcionn, tosaigh as an nua le liosta iomlán de rudaí le seachaint.
Fan ar bharr do dhul chun cinn. Tugann an Log léargas duit ar do rátaí rathúlachta foriomlána agus aithníonn sé cén droch-nós is mó a raibh tú ceangailte leis — thar sheachtain, mí, nó bliain. Mar sin is féidir leat oibriú go héasca i dtreo tú féin níos fearr.
Leathanach Gréasáin: https://www.crazymarvin.com/todont
Aistrigh go Ná Déan: https://hosted.weblate.org/engage/todont/
Foinse ar GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/ga/short_description.txt
================================================
An liosta le déanamh droim ar ais.
================================================
FILE: fastlane/metadata/android/ga/title.txt
================================================
Chun Ná
================================================
FILE: fastlane/metadata/android/he/changelogs/1.txt
================================================
מהדורה ראשונית
================================================
FILE: fastlane/metadata/android/he/changelogs/10.txt
================================================
- 🐛 מניעת יצירת הרגלים רעים בקרב משתמשים ללא תווית כדי למנוע את קריסת היישומון (#187)
================================================
FILE: fastlane/metadata/android/he/changelogs/2.txt
================================================
- שם המעצב הוסר ממסך על אודות
- הוסרו מחרוזות קשיחות בקוד מהפריסה לתוך strings.xml להקלה על התרגום
- סעיף הרישיונות בהם נעשה שימוש עודכן על כל התלויות (תודה לכל אלה!)
- נוספו עוד מחוות החלקה
- שיפורים קטנים מתחת למכסה המנוע
================================================
FILE: fastlane/metadata/android/he/changelogs/3.txt
================================================
שיפורים משניים מתחת למכסה המנוע
תוקנה הקמת fastlane
================================================
FILE: fastlane/metadata/android/he/changelogs/30.txt
================================================
- יעד של Android 13
================================================
FILE: fastlane/metadata/android/he/changelogs/4.txt
================================================
- התרגומים עודכנו 🗺️
- כדאי להתעדכן מולנו על תיקוני תקלות 🦟
================================================
FILE: fastlane/metadata/android/he/changelogs/5.txt
================================================
- התלויות עודכנו 🔩
================================================
FILE: fastlane/metadata/android/he/changelogs/6.txt
================================================
- עדכוני תרגומים 🗺️
אפשר לשלוח משוב בדוא״ל, לפתוח תקלות ב־GitHub או לסייע בתרגום. 💓
================================================
FILE: fastlane/metadata/android/he/changelogs/7.txt
================================================
- שיפורי חוויית משתמש 🦋
- תיקונים של תקלות מזעריות 🐛
- עדכוני תרגומים 🗺️
אפשר לשלוח משוב בדוא״ל, לפתוח תקלות ב־GitHub או לסייע בתרגום. 💓
================================================
FILE: fastlane/metadata/android/he/changelogs/8.txt
================================================
- תוקנה בעיית עיצוב 🐛
================================================
FILE: fastlane/metadata/android/he/changelogs/9.txt
================================================
- המון תקלות תוקנו בזכות subeep 🐛
- המרה לגרפיקת וקטורים לתצוגה חדה יותר בזכות karthikayya 🎨
- התלויות עודכנו ⚙️
- התרגומים עודכנו 🗺️
================================================
FILE: fastlane/metadata/android/he/full_description.txt
================================================
מבט ביקורתי על הרגלים רעים. תיעוד ההרגלים מתבצע בלחיצה הישר ממסך הבית שלך. ניתן להשתמש בפתקיות כדי להוסיף פרטים - כגון חלופה בריאה לחטיף השוקולד ששובר לך את הדיאטה כל פעם מחדש. את הקלט ניתן לארגן עם תוויות.
יותר מהיר מחיפוש עט. ההרגלים הרעים שלך מופיעים ישירות במסך הבית שלך כדי להעניק לך אפשרות לסמן את אלו שנכנעת אליהם. המשימה תועבר למצב „סיום” להיום. בבוקר שלמחרת, מתחילים מחדש עם רשימה מלאה של דברים שמומלץ להימנע מהם.
תהליך מפוקח. היומן מעניק לך תובנות על מדדי ההצלחה שלך ואפשרות לגעת בהרגלים הרעים שהכי אימצת - במהלך שבוע, חודש או שנה. כדי שאלו יאפשרו לך להתפתח לצורה טובה יותר של עצמך.
אתר הבית: https://www.crazymarvin.com/todont
תרגום רשימת מכשלות: https://hosted.weblate.org/engage/todont/
קוד המקור ב־GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/he/short_description.txt
================================================
כמו רשימת מטלות אבל הפוך.
================================================
FILE: fastlane/metadata/android/he/title.txt
================================================
רשימת מכשלות
================================================
FILE: fastlane/metadata/android/hy/changelogs/1.txt
================================================
Նախնական թողարկում
================================================
FILE: fastlane/metadata/android/hy/changelogs/2.txt
================================================
- Հեռացված է ձևավորիչը Մասին էկրանից
- Կոշտ կոդավորված տողերը դասավորությունից տեղափոխվել են strings.xml՝ ավելի դյուրին թարգմանության համար:
- Օգտագործված արտոնագրերի բաժինը թարմացվել է օգտագործվող բոլոր կախվածություններով (շնորհակալություն նրանց բոլորին)
- Ավելացվել են սահեցման այլ ժեստեր
- Այլ փոքր կատարելագործումներ
================================================
FILE: fastlane/metadata/android/hy/changelogs/3.txt
================================================
Այլ փոքր կատարելագործումներ
Ուղղվել է fastlane-ի տեղակայումը
================================================
FILE: fastlane/metadata/android/hy/full_description.txt
================================================
Լավ հայացք վատ սովորություններին Նշեք ձեր արատները մեկ հպմամբ, անմիջապես տնային էջից: Օգտագործեք Նշումներ՝ մանրամասները հավելելու համար, ինչպես օրինակ՝ առողջ այլընտրանք շոկոլադե սալիկին, որին չեք կարողանում դիմադրել: Եվ կազմակերպեք ձեր ներածումը պիտակներով:
Ավելի արագ, քան կարողեք գրիչ վերցնել: Գտեք ձեր վատ սովորությունները տնային էջում և ընդգծեք նրանք, որոնցում դուք զիջում եք: Դրանք կտեղափոխվեն «Կատարված» օրվա համար: Հաջորդ օրը սկսեք դատարկ էջից՝ իրերի ամբողջական ցանկով, որոնցից պետք է խուսափել:
Տեղեկացված եղեք ձեր առաջընթացից: Մատյանը ձեզ հնարավորություն է տալիս պատկերացում կազմել ձեր ընդհանուր հաջողության տեմպերի մասին և հստակեցնել, թե որ վատ սովորությանն եք առավել շատ կապված եղել՝ մեկ շաբաթից, մեկ ամսից կամ մեկ տարուց ավելի: Այսպիսով, դուք հեշտությամբ կարող եք աշխատել ինքներդ ձեր վրա:
Կայքը՝ https://www.crazymarvin.com/todont
Թարգմանել To Don’t-ը՝ https://hosted.weblate.org/engage/todont/
Աղբյուրը GitHub-ում՝ https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/hy/short_description.txt
================================================
Անելիքների հակառակ ցուցակը:
================================================
FILE: fastlane/metadata/android/id/changelogs/1.txt
================================================
Rilis Awal
================================================
FILE: fastlane/metadata/android/id/changelogs/10.txt
================================================
- 🐛 Mencegah pengguna membuat kebiasaan buruk tanpa label untuk mencegah aplikasi macet (#187)
================================================
FILE: fastlane/metadata/android/id/changelogs/2.txt
================================================
- Menghapus desainer dari layar Tentang
- Memindahkan string hard-code dari layout ke strings.xml untuk terjemahan yang lebih mudah
- Perbarui bagian pengunaan lisensi dengan semua dependensi yang digunakan (terima kasih untuk semuanya!)
- Menambahkan swipe gesture lainnya
- Perbaikan lainnya
================================================
FILE: fastlane/metadata/android/id/changelogs/3.txt
================================================
Sedikit perbaikan
Perbaiki penyiapan fastlane
================================================
FILE: fastlane/metadata/android/id/changelogs/30.txt
================================================
- Dukungan Android 13
================================================
FILE: fastlane/metadata/android/id/changelogs/4.txt
================================================
- Pembaruan terjemahan 🗺️
- Perbaikan bug 🦟
================================================
FILE: fastlane/metadata/android/id/changelogs/5.txt
================================================
- Pembaruan dependencies 🔩
================================================
FILE: fastlane/metadata/android/id/changelogs/6.txt
================================================
- Pembaruan terjemahan 🗺️
Silakan mengirimkan umpan balik melalui email, masalah terbuka di GitHub, atau membantu menerjemahkan. 💓
================================================
FILE: fastlane/metadata/android/id/changelogs/7.txt
================================================
- Perbaikan UX 🦋
- Perbaikan bug kecil 🐛
- Pembaruan terjemahan 🗺️
Silakan kirimkan umpan balik melalui email, buka issue di GitHub, atau bantu menerjemahkan. 💓
================================================
FILE: fastlane/metadata/android/id/changelogs/8.txt
================================================
- Memperbaiki masalah linting🐛
================================================
FILE: fastlane/metadata/android/id/changelogs/9.txt
================================================
- Banyak Bug Diperbaiki Berkat subeep 🐛
- Beralih ke Grafik Vektor Untuk Tampilan yang Lebih Tajam Berkat karthikayya 🎨
- Pembaruan Dependency ⚙️
- Pembaruan Terjemahan 🗺️
================================================
FILE: fastlane/metadata/android/id/full_description.txt
================================================
Perhatian bagus pada kebiasaan yang buruk. Tulis sifat buruk Anda dengan beberapa ketukan, langsung dari halaman beranda. Gunakan Catatan untuk menambahkan keterangan — seperti alternatif sehat dari batang coklat yang tidak dapat ditolak. Dan rapikan apa yang Anda tulis dengan Label.
Lebih cepat dari Anda mengambil sebuah pena. Cari kebiasaan buruk Anda di halaman beranda, dan coret kebiasaan yang Anda lakukan. Ini akan dipindahkan ke Selesai sampai hari Anda berakhir. Pagi berikutnya, Anda akan mulai dengan daftar yang penuh akan sesuatu yang Anda perlu jauhi.
Pantau kemajuan Anda. Log memberi Anda pengetahuan tentang tingkat keberhasilan Anda secara keseluruhan dan menunjukkan dengan tepat kebiasaan buruk apa yang paling Anda sukai — lebih dari seminggu, sebulan, atau setahun.
Halaman web:https://www.crazymarvin.com/todont
Terjemahkan To Don't:https://hosted.weblate.org/engage/todont/
Sumber di GitHub:https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/id/short_description.txt
================================================
Kebalikan dari daftar to-do.
================================================
FILE: fastlane/metadata/android/id/title.txt
================================================
Jangan Lakukan
================================================
FILE: fastlane/metadata/android/it/changelogs/1.txt
================================================
Versione iniziale
================================================
FILE: fastlane/metadata/android/it/changelogs/2.txt
================================================
- Rimosso il designer dalla schermata "Informazioni".
- Spostate le stringhe dal codice del layout in strings.xml per una più facile traduzione.
- Aggiornata la sezione Licenze Usate con tutte le dipendenze usate (grazie!).
- Aggiunge più gestures.
- Piccoli miglioramenti dietro le quinte
================================================
FILE: fastlane/metadata/android/it/changelogs/3.txt
================================================
Piccoli miglioramenti
Risolta configurazione fastlane
================================================
FILE: fastlane/metadata/android/it/changelogs/4.txt
================================================
- Aggiornamenti delle traduzioni 🗺️
- Restate sintonizzati per le correzioni di bug 🦟
================================================
FILE: fastlane/metadata/android/it/changelogs/5.txt
================================================
- Aggiornate dipendenze 🔩
================================================
FILE: fastlane/metadata/android/it/changelogs/6.txt
================================================
- Aggiornamenti delle traduzioni 🗺️
Sentiti il benvenuto per inviare feedback via e-mail, aprire issue su GitHub o aiutare a tradurre. 💓
================================================
FILE: fastlane/metadata/android/it/changelogs/7.txt
================================================
- Miglioramenti UX 🦋
- Piccole correzioni di bug 🐛
- Aggiornamento delle traduzioni 🗺️
Sentiti il benvenuto per inviare feedback via e-mail, aprire issue su GitHub o aiutare a tradurre. 💓
================================================
FILE: fastlane/metadata/android/it/changelogs/8.txt
================================================
- Risolti i problemi di linting 🐛
================================================
FILE: fastlane/metadata/android/it/changelogs/9.txt
================================================
- Molti bug risolti grazie a subeep 🐛
- Passare alla grafica vettoriale per una visione più nitida grazie a karthikayya 🎨
- Aggiornamenti delle dipendenze ⚙️
- Aggiornamenti delle traduzioni 🗺️
================================================
FILE: fastlane/metadata/android/it/full_description.txt
================================================
Una buona occhiata alle cattive abitudini. Annota i tuoi vizi in un tap, direttamente dalla pagina principale. Usa Note per aggiungere dettagli — come un'alternativa sana a quella barretta di cioccolato a cui non puoi resistere. E organizza i tuoi input con Etichette.
Più veloce di quanto tu possa prendere una penna Trova le tue cattive abitudini sulla pagina principale, e cancella quelle a cui ti abbandoni. Queste si sposteranno in Fatto per oggi. La mattina dopo, ricomincia da capo con una lista completa di cose da evitare.
Tieni d'occhio i tuoi progressi Il Diario ti dà un'idea delle tue percentuali complessive di successo e individua la cattiva abitudine a cui sei stato più legato — nel corso di una settimana, un mese o un anno. Così puoi facilmente lavorare per migliorare la tua persona.
Pagina web: https://www.crazymarvin.com/todont
Traduci To Don't: https://hosted.weblate.org/engage/todont/
Fonte su GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/it/short_description.txt
================================================
L'elenco delle cose da fare inverso.
================================================
FILE: fastlane/metadata/android/it/title.txt
================================================
Da non fare
================================================
FILE: fastlane/metadata/android/ko/short_description.txt
================================================
반대로하는 할일 목록이에요.
================================================
FILE: fastlane/metadata/android/ko/title.txt
================================================
안 할일
================================================
FILE: fastlane/metadata/android/nb-NO/changelogs/1.txt
================================================
Første utgivelse
================================================
FILE: fastlane/metadata/android/nb-NO/changelogs/2.txt
================================================
- Fjernet designer fra «Om»-skjerm
- Flyttet hardkodede strenger fra oppsettet til strings.xml for enklere oversetting
- Oppdaterte «Brukte lisenser» med alle brukte avhengigheter (takk til alle prosjektene)
- La til flere håndvendinger
- Små usynlige forbedringer
================================================
FILE: fastlane/metadata/android/nb-NO/changelogs/3.txt
================================================
Små usynlige forbedringer
Fastlane-oppsett
================================================
FILE: fastlane/metadata/android/nb-NO/changelogs/4.txt
================================================
- Nye oversettelser 🗺️
- Det kommer noen feilfikser 🦟
================================================
FILE: fastlane/metadata/android/nb-NO/full_description.txt
================================================
Et godt innblikk i dårlige vaner. Skriv ned dine laster med ett trykk, direkte fra hjemmesiden. Bruk notater for å legge til detaljer, som sunt alternativ til den sjokoladen du ikke kan motstå. Organiser alt med etiketter.
Raskere enn en penn er for hånden. Finn dine dårlige vaner fra hjemmesiden, og kryss ut de du faller for. Disse vil bli flyttet til gjort for dagen. Neste morgen starter med en tom liste over ting å unngå.
Hold øye med framdriften. Loggen gir deg innsikt i din generelle framdrift og peker klart ut de dårlige vanene du oftest foretar deg; i løpet av en uke, måned, eller år. Slik kan du enkelt jobbe mot en bedre versjon av deg selv.
Nettside: https://www.crazymarvin.com/todont
Oversett To Don’t: https://hosted.weblate.org/engage/todont/
Kildekode på GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/nb-NO/short_description.txt
================================================
Den omvendte gjøremålslisten.
================================================
FILE: fastlane/metadata/android/nb-NO/title.txt
================================================
La det
================================================
FILE: fastlane/metadata/android/nl/changelogs/1.txt
================================================
Eerste uitgave
================================================
FILE: fastlane/metadata/android/nl/changelogs/2.txt
================================================
- Ontwerper verwijderd uit Over-scherm
- Hard-coded strings van de layout naar de strings.xml verplaatst voor eenvoudigere vertaling
- Gebruikte licenties sectie bijgewerkt met alle gebruikte afhankelijkheden (dank aan allen!)
- Meer swipe-bewegingen toegevoegd
- Kleine verbeteringen achter de schermen
================================================
FILE: fastlane/metadata/android/nl/changelogs/3.txt
================================================
Kleine verbeteringen achter de schermen
Snelle installatie repareren
================================================
FILE: fastlane/metadata/android/nl/full_description.txt
================================================
Een blik op slechte gewoontes. Noteer je slechte gewoontes met één tikje, rechtstreeks vanaf de startpagina. Gebruik Notities om details toe te voegen - zoals een gezond alternatief voor die chocoladereep waar je niet aan kan weerstaan. En organiseer je invoer met Labels.
Sneller dan je een pen kan pakken. Vind je slechte gewoontes op de startpagina, en doorstreep degene waar je aan toegeeft. Deze worden verplaatst naar Gedaan voor die dag. De volgende ochtend begint je opnieuw met een volledige lijst van dingen die je moet vermijden.
Blijf op de hoogte van je vorderingen. Het Logboek geeft je inzicht in je algemene successen en toont aan welke slechte gewoonte je het meest hebt vastgehouden - over een week, een maand of een jaar. Zo kan je gemakkelijk werken aan een betere jij.
Webpagina: https://www.crazymarvin.com/todont
Vertaal naar Don't: https://hosted.weblate.org/engage/todont/
Bron op GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/nl/short_description.txt
================================================
De omgekeerde to-do lijst.
================================================
FILE: fastlane/metadata/android/nl/title.txt
================================================
Wat je niet moet doen
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/1.txt
================================================
Pierwsze wydanie
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/10.txt
================================================
- 🐛 Powstrzymuje użytkowników przed tworzeniem złych nawyków bez etykiety, by uniknąć crashy (#187)
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/2.txt
================================================
- Usunięto twórcę z menu „o aplikacji”
- Przeniesiono „sztywne” linie kodu z layoutu do strings.xml dla łatwiejszego tłumaczenia
- Zaktualizowano Licencje Użytkownika ze wszystkimi zależnościami (dzięki im wszystkim!)
- Dodano więcej gestów przesunięciem
- Drobne poprawki "pod maską"
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/3.txt
================================================
Małe poprawki „pod maską”
Naprawiono wprowadzenie fastlane
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/4.txt
================================================
- Aktualizacje tłumaczeń 🗺️
- Zostańcie z nami, zajmujemy się bugami 🦟
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/5.txt
================================================
- Zaktualizowane zależności 🔩
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/6.txt
================================================
- Zaktualizowano tłumaczenia 🗺️
Śmiało dzielcie się opiniami przez e-mail, „open issues" na GitHubie lub pomóżcie w tłumaczeniach. 💓
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/7.txt
================================================
- Usprawnienia UX (doświadczeń użytkownika) 🦋
- Poprawki drobnych bugów 🐛
- Aktualizacje tłumaczeń 🗺️
Śmiało dzielcie się opiniami przez e-mail, „open issues" na GitHubie lub pomóżcie w tłumaczeniach. 💓
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/8.txt
================================================
- Rozwiązano problemy z lintingiem 🐛
================================================
FILE: fastlane/metadata/android/pl-PL/changelogs/9.txt
================================================
- Sporo bugów rozwiązynch dzięki subeep 🐛
- Przejście na grafiki wektorowe dla ostrzejszego wyglądu dzięki karthikayya 🎨
- Aktualizacje zależności ⚙️
- Aktualizacje tłumaczeń 🗺️
================================================
FILE: fastlane/metadata/android/pl-PL/full_description.txt
================================================
Dobre spojrzenie na złe nawyki. Notuj złe nawyki jednym dotknięciem, prosto ze strony głównej. Używaj Notatek, by dodawać szczegóły – na przykład zdrową alternatywę dla czekoladowego batonika, któremu nie możesz się oprzeć. I porządkuj wpisy dzięki Etykietom.
Szybciej niż zdążysz sięgnąć po długopis. Znajduj swoje złe nawyki na stronie głównej i przekreślaj te, którym ulegasz. Zostaną one przeniesione do kategorii Zrobione na resztę dnia. Następnego ranka, zacznij od nowa z pełną listą rzeczy do uniknięcia.
Bądź na bieżąco ze swymi postępami. Dziennik wyświetla ogólny sukces i wskazuje, do jakiego złego nawyku jesteś najbardziej przywiązany – na przestrzeni tygodnia, miesiąca czy roku. Tak łatwiej się doskonalić.
Strona internetowa: https://www.crazymarvin.com/todont
Tłumacz Do Niezrobienia: https://crowdin.com/project/ToDont
Źródło na GitHubie: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/pl-PL/short_description.txt
================================================
Przeciwieństwo listy zadań.
================================================
FILE: fastlane/metadata/android/pl-PL/title.txt
================================================
Do Niezrobienia
================================================
FILE: fastlane/metadata/android/pt/changelogs/1.txt
================================================
Lançamento inicial
================================================
FILE: fastlane/metadata/android/pt/changelogs/10.txt
================================================
- 🐛 Impedir que os utilizadores criem maus hábitos sem um rótulo para evitar falhas de apps (#187)
================================================
FILE: fastlane/metadata/android/pt/changelogs/4.txt
================================================
- Atualizações nas traduções 🗺️
- Fique atento para correções 🦟
================================================
FILE: fastlane/metadata/android/pt/changelogs/5.txt
================================================
- Dependências atualizadas 🔩
================================================
FILE: fastlane/metadata/android/pt/changelogs/6.txt
================================================
- Atualizações de traduções 🗺️
Sinta-se à vontade a enviar comentário por e-mail, abrir problemas no GitHub ou ajudar na tradução. 💓
================================================
FILE: fastlane/metadata/android/pt/changelogs/7.txt
================================================
- Melhorias na experiência do utilizador 🦋
- Pequenas correções de bugs 🐛
- Atualizações de traduções 🗺️
Sinta-se à vontade a enviar comentário por e-mail, abrir problemas no GitHub ou ajudar na tradução. 💓
================================================
FILE: fastlane/metadata/android/pt/short_description.txt
================================================
A lista inversa de afazeres.
================================================
FILE: fastlane/metadata/android/pt/title.txt
================================================
To Don't
================================================
FILE: fastlane/metadata/android/pt-BR/changelogs/1.txt
================================================
Lançamento inicial
================================================
FILE: fastlane/metadata/android/pt-BR/changelogs/2.txt
================================================
- Removido designer da tela Sobre
- Strings codificadas permanentemente do layout para strings.xml para facilitar a tradução
- Atualizar seção de licenças usadas com todas as dependências usadas (graças a todos eles!)
- Adicione mais gestos de deslizar
- Pequenas melhorias sob o capô
================================================
FILE: fastlane/metadata/android/pt-BR/changelogs/3.txt
================================================
Pequenas melhorias sob o capô
Corrigir configuração do fastlane
================================================
FILE: fastlane/metadata/android/pt-BR/full_description.txt
================================================
Uma boa olhada nos maus hábitos. Anote seus vícios com um toque, direto da página inicial. Use notas para adicionar detalhes - como uma alternativa saudável para aquela barra de chocolate que você não pode resistir. E organize sua entrada com rótulos.
Mais rápido do que você pode pegar uma caneta. Encontre seus hábitos ruins na página inicial e risque aqueles que você adotar. Estes serão movidos para Concluído para o dia. Na manhã seguinte, comece do zero com uma lista completa de coisas a evitar.
Fique por dentro do seu progresso. O registro fornece uma visão geral das taxas de sucesso e indica a qual mau hábito você se apegou mais - mais de uma semana, um mês ou um ano. Assim, você pode facilmente trabalhar para ser melhor.
Página da web:https://www.crazymarvin.com/todont
Traduza To Don’t:https://hosted.weblate.org/engage/todont/
Código Fonte no GitHub:https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/pt-BR/short_description.txt
================================================
A lista reversa de tarefas pendentes.
================================================
FILE: fastlane/metadata/android/pt-BR/title.txt
================================================
Não fazer
================================================
FILE: fastlane/metadata/android/ro/changelogs/1.txt
================================================
Lansarea inițială
================================================
FILE: fastlane/metadata/android/ro/changelogs/2.txt
================================================
Mici îmbunătățiri sub capotă
================================================
FILE: fastlane/metadata/android/ro/changelogs/3.txt
================================================
Mici îmbunătățiri sub capotă
Sistemată configurarea fastlane
================================================
FILE: fastlane/metadata/android/ro/full_description.txt
================================================
O privire bună asupra obiceiurilor proaste. Notează-ți viciile într-o singură atingere, direct de pe pagina principală. Folosiți Note pentru a adăuga detalii — cum ar fi o alternativă sănătoasă la acel baton de ciocolată căruia nu-i puteți rezista. Și organizați-vă informațiile cu ajutorul etichetelor.
Mai repede decât poți apuca un pix. Găsește-ți obiceiurile rele pe pagina principală și bifează-le pe cele la care cedezi. Acestea se vor muta la Făcute pentru azi. În dimineața următoare, începeți din nou cu o listă completă de lucruri de evitat.
Fiți la curent cu progresele dvs. Jurnalul vă oferă o perspectivă asupra ratelor dvs. generale de succes și vă indică de ce obiceiuri proaste ați fost cel mai atașat - pe parcursul unei săptămâni, al unei luni sau al unui an. Astfel, puteți lucra cu ușurință pentru a vă îmbunătăți.
Pagina web: https://www.crazymarvin.com/todont
Translate To Don't: https://hosted.weblate.org/engage/todont/
Sursa pe GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/ro/short_description.txt
================================================
Lista inversă de lucruri de făcut.
================================================
FILE: fastlane/metadata/android/ru/changelogs/1.txt
================================================
Исходная версия
================================================
FILE: fastlane/metadata/android/ru/changelogs/10.txt
================================================
- 🐛 Запретить пользователям создавать вредные привычки без метки, чтобы избежать сбоев приложения (#187)
================================================
FILE: fastlane/metadata/android/ru/changelogs/2.txt
================================================
- Удалили функцию конструктора из раздела О нас
- Переместили жестко закодированные строки из макета в strings.xml для более удобного перевода
- Обновили раздел Использованные лицензии со всеми зависимостями (спасибо всем!)
- Добавили больше жестов прокрутки
- Сделали небольшие улучшения внутри программы
================================================
FILE: fastlane/metadata/android/ru/changelogs/210.txt
================================================
- Нацелено на Android 14 🤖
- Поддержка языковых предпочтений для каждого приложения 🗺
- Сделать строки из внешних библиотек переводимыми 🗺
- Обновления переводов 🗺
- Улучшение интерфейса 🎨
Огромное спасибо всем участникам и переводчикам! 😘
Приветствуются сообщения об ошибках и предложения исправлений на [GitHub](https://github.com/Crazy-Marvin/ToDont/), а также помощь с переводами на [Weblate](https://hosted.weblate.org/engage/todont/). 🚀
================================================
FILE: fastlane/metadata/android/ru/changelogs/3.txt
================================================
Сделали небольшие улучшения внутри программы
Исправили настройки fastlane
================================================
FILE: fastlane/metadata/android/ru/changelogs/300.txt
================================================
Улучшения:
- Расширенный туториал 🎓
- Поддержка Android 15 🤖
- Обновления переводов 🗺️
- Доработанный UX 🎨
Новые функции:
- Множественные отметки избегания/выполнения в день 📈
- Уведомления 🛎️
- Локальное резервное копирование и восстановление ⛑️
Огромное спасибо всем контрибьюторам и переводчикам. 😘
Приветствуем сообщения об ошибках и исправления на https://github.com/Crazy-Marvin/ToDont/ или переводы на https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ru/changelogs/4.txt
================================================
- Обновления переводов 🗺️
- Следите за исправлениями ошибок 🦟
================================================
FILE: fastlane/metadata/android/ru/changelogs/400.txt
================================================
Переписка «Без дел» на Kotlin для улучшения поддерживаемости, производительности, эффективности, UX и безопасности 💣
================================================
FILE: fastlane/metadata/android/ru/changelogs/410.txt
================================================
- Новая функция: добавление обложки для записей 🖼️
- Новая функция: виджет для главного экрана 🏡
- Новая функция: темы Dracula 🧛
- Обновления переводов 🗺️
- Исправление ошибок 🤢
- Обновление зависимостей 🔩
- Техническое обслуживание 🧹
Огромное спасибо всем участникам и переводчикам, особенно @theftzoku. 😘
Присоединяйтесь, сообщайте об ошибках и предлагайте исправления на https://github.com/Crazy-Marvin/ToDont/ или помогайте с переводами на https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ru/changelogs/420.txt
================================================
- Поддержка Android 16 🤖
- Улучшения пользовательского опыта 🎨
- Обновления переводов 🗺️
- Исправление ошибок 🤢
- Обновление зависимостей 🔩
- Техническое обслуживание 🧹
Огромное спасибо всем участникам и переводчикам, особенно @theftzoku. 😘
Присоединяйтесь, сообщайте об ошибках и предлагайте исправления на https://github.com/Crazy-Marvin/ToDont/ или помогайте с переводами на https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ru/changelogs/430.txt
================================================
- Улучшения пользовательского интерфейса 🎨
- Обновления переводов 🗺️
- Исправление ошибок 🤢
- Обновление зависимостей 🔩
- Техническое обслуживание 🧹
Огромное спасибо всем участникам и переводчикам, особенно @theftzoku. 😘
Приглашаем сообщать об ошибках и предлагать исправления на https://github.com/Crazy-Marvin/ToDont/ или помогать с переводами на https://hosted.weblate.org/engage/todont/. 🚀
================================================
FILE: fastlane/metadata/android/ru/changelogs/5.txt
================================================
- Обновлены зависимости 🔩
================================================
FILE: fastlane/metadata/android/ru/changelogs/6.txt
================================================
- Обновлены переводы 🗺️
Не стесняйтесь делиться впечатлениями от использования, писать на электронную почту, сообщать о проблемах на GitHub и помогать с переводом. 💓
================================================
FILE: fastlane/metadata/android/ru/changelogs/7.txt
================================================
- Улучшения в части пользовательского опыта 🦋
- Пачка исправлений небольших ошибок 🐛
- Обновлены переводы 🗺️
Не стесняйтесь делиться впечатлениями от использования, писать на электронную почту, сообщать о проблемах на GitHub и помогать с переводом. 💓
================================================
FILE: fastlane/metadata/android/ru/changelogs/8.txt
================================================
- Исправлены проблемы с подсветкой 🐛
================================================
FILE: fastlane/metadata/android/ru/changelogs/9.txt
================================================
- Исправлено множество ошибок благодаря subeep 🐛
- Переход на векторную графику для более четкого изображения Благодаря karthikayya 🎨
- Обновления зависимостей ⚙️
- Обновления перевода 🗺️"
================================================
FILE: fastlane/metadata/android/ru/full_description.txt
================================================
Посмотрите по-новому на вредные привычки. Отметьте свои вредные привычки одним касанием прямо на главной странице. Используйте Заметки, чтобы добавить подробную информацию - например, здоровую альтернативу шоколадке, перед которой вы не можете устоять. И систематизируйте свои данные с помощью Ярлыков.
Быстрее, чем вы могли себе представить. Найдите вредные привычки на главной странице и вычеркните те, которые вам свойственны. Они переместятся в раздел "Дела на сегодня". На следующее утро начните с чистого листа с полным списком того, чего следует избегать.
Отслеживайте свои успехи. Журнал прогресса позволит вам проследить общий уровень успеха и определить, к какой вредной привычке вы привязались больше всего - за неделю, месяц или год. Таким образом, вы сможете более эффективно работать над собой.
Веб-страница: https://www.crazymarvin.com/todont
Переведите приложение Прекрати это: https://hosted.weblate.org/engage/todont/
Источник на GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/ru/short_description.txt
================================================
Обратный список дел.
================================================
FILE: fastlane/metadata/android/ru/title.txt
================================================
Без дел
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/1.txt
================================================
தொடக்க வெளியீடு
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/10.txt
================================================
- பயன்பாடு பயன்பாட்டு செயலிழப்புகளைத் தடுக்க சிட்டை இல்லாமல் பயனர்கள் கெட்ட பழக்கங்களை உருவாக்குவதைத் தடுக்கவும் (#187)
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/2.txt
================================================
- திரையில் இருந்து வடிவமைப்பாளர் அகற்றப்பட்டார்
.
- பயன்படுத்தப்பட்ட அனைத்து சார்புகளுடனும் பயன்படுத்தப்பட்ட உரிமப் பிரிவைப் புதுப்பிக்கவும் (அவை அனைத்திற்கும் நன்றி!)
- மேலும் ச்வைப் சைகைகளைச் சேர்க்கவும்
- ஊட்டின் கீழ் சிறிய மேம்பாடுகள்
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/210.txt
================================================
- இலக்கு ஆண்ட்ராய்டு 14 🤖
- பயன்பாட்டிற்கு உதவி மொழி விருப்பங்களை ஆதரிக்கவும் 🗺
- வெளிப்புற நூலகத்திலிருந்து சரங்களை மொழிபெயர்க்கக்கூடியது 🗺
- மொழிபெயர்ப்பு புதுப்பிப்புகள் 🗺
- இடைமுகத்தைச் செம்மைப்படுத்து 🎨
அனைத்து பங்களிப்பாளர்களுக்கும் மொழிபெயர்ப்பாளர்களுக்கும் ஒரு பெரிய நன்றி. 😘
சிக்கல்களைப் புகாரளிப்பதற்கும், திருத்தங்களை https://github.com/Crazy-Marvin/ToDont/ அல்லது https://hosted.weblate.org/engage/todont/ இல் மொழிபெயர்ப்புகளுக்கும் வரவேற்கிறேன். 🚀
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/3.txt
================================================
ஊட்டின் கீழ் சிறிய மேம்பாடுகள்
ஃபாச்ட்லேன் அமைப்பை சரிசெய்யவும்
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/300.txt
================================================
மேம்படுத்தப்பட்டது:
- விரிவாக்கப்பட்ட பயிற்சி🦮
- ஆண்ட்ராய்டு 15 உதவி 🤖
- மொழிபெயர்ப்பு புதுப்பிப்புகள்🗺️
- சுத்திகரிக்கப்பட்ட பஅ🎨
புதிய பண்புகூறுகள்:
- ஒரு நாளைக்கு பல தவிர்க்கும்& டூன்ச்🪬
- அறிவிப்புகள்🛎️
- உள்ளக காப்புப்பிரதி & மீட்டமை🛟
அனைத்து பங்களிப்பாளர்களுக்கும் மொழிபெயர்ப்பாளர்களுக்கும் ஒரு பெரிய நன்றி. 😘
சிக்கல்களைப் புகாரளிக்கவும், திருத்தங்களை https://github.com/Crazy-Marvin/ToDont/ அல்லது https://hosted.weblate.org/engage/todont/ இல் மொழிபெயர்ப்புகளைச் சமர்ப்பிக்கவும். 🚀
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/4.txt
================================================
- மொழிபெயர்ப்பு புதுப்பிப்புகள்
- பிழை திருத்தங்களுக்காக காத்திருங்கள்
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/400.txt
================================================
பராமரிப்பு, செயல்திறன், செயல்திறன்வீதம், பஅ மற்றும் பாதுகாப்பை மேம்படுத்தக் கோட்லினில் இல்லை என்று மீண்டும் எழுதவும்💣
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/410.txt
================================================
- புதிய அம்சம்: உள்ளீடுகளுக்கு ஒரு கவர் படத்தைச் சேர்க்கவும்🖼️
- புதிய அம்சம்: ஓம்ச்கிரீன் விட்செட்🏡
- புதிய அம்சம்: டிராகுலா தீம்கள்🧛
- மொழிபெயர்ப்பு புதுப்பிப்புகள்🗺️
- பிழை திருத்தங்கள் 🤢
- புதுப்பிக்கப்பட்ட சார்புகள்🔩
- வீட்டு பராமரிப்பு🧹
அனைத்து பங்களிப்பாளர்களுக்கும் மொழிபெயர்ப்பாளர்களுக்கும் ஒரு பெரிய நன்றி, குறிப்பாக @theftzoku. .
சிக்கல்களைப் புகாரளிப்பதற்கும், திருத்தங்களை https://github.com/Crazy-Marvin/ToDont/ அல்லது https://hosted.weblate.org/engage/todont/ இல் மொழிபெயர்ப்புகளுக்கும் வரவேற்கிறேன்.🚀
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/420.txt
================================================
- இலக்கு ஆண்ட்ராய்டு 16 🤖
- பஅ மேம்பாடுகள்🎨
- மொழிபெயர்ப்பு புதுப்பிப்புகள்🗺️
- பிழை திருத்தங்கள் 🤢
- புதுப்பிக்கப்பட்ட சார்புகள் 🔩
- வீட்டு பராமரிப்பு🧹
அனைத்து பங்களிப்பாளர்களுக்கும் மொழிபெயர்ப்பாளர்களுக்கும் ஒரு பெரிய நன்றி, குறிப்பாக @theftzoku. 😘
சிக்கல்களைப் புகாரளிக்கவும், திருத்தங்களை https://github.com/Crazy-Marvin/ToDont/ அல்லது https://hosted.weblate.org/engage/todont/ இல் மொழிபெயர்ப்புகளைச் சமர்ப்பிக்கவும். 🚀
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/430.txt
================================================
- பஅ மேம்பாடுகள்🎨
- மொழிபெயர்ப்பு புதுப்பிப்புகள்🗺️
- பிழை திருத்தங்கள் 🤢
- புதுப்பிக்கப்பட்ட சார்புகள் 🔩
- வீட்டு பராமரிப்பு🧹
அனைத்து பங்களிப்பாளர்களுக்கும் மொழிபெயர்ப்பாளர்களுக்கும் ஒரு பெரிய நன்றி, குறிப்பாக @theftzoku. 😘
சிக்கல்களைப் புகாரளிக்கவும், திருத்தங்களை https://github.com/Crazy-Marvin/ToDont/ அல்லது https://hosted.weblate.org/engage/todont/ இல் மொழிபெயர்ப்புகளைச் சமர்ப்பிக்கவும். 🚀
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/5.txt
================================================
- புதுப்பிக்கப்பட்ட சார்புகள்
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/6.txt
================================================
- மொழிபெயர்ப்பு புதுப்பிப்புகள்🗺️
மின்னஞ்சல்மூலம் கருத்துக்களை அனுப்ப வரவேற்பு, கிட்அப்பில் திறந்த சிக்கல்கள் அல்லது மொழிபெயர்க்க உதவுதல். 💓
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/7.txt
================================================
- யுஎக்ச் மேம்பாடுகள்🦋
- சிறிய பிழைத்திருத்தங்கள்🐛
- மொழிபெயர்ப்பு புதுப்பிப்புகள்🗺️
மின்னஞ்சல்மூலம் கருத்துக்களை அனுப்ப வரவேற்பு, கிட்அப்பில் திறந்த சிக்கல்கள் அல்லது மொழிபெயர்க்க உதவுதல். 💓
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/8.txt
================================================
- லின்டிங் சிக்கல்களை சரிசெய்யவும்
================================================
FILE: fastlane/metadata/android/ta-IN/changelogs/9.txt
================================================
- பல பிழைகள் சபீப்பிற்கு நன்றி சரி செய்தன
- கார்த்திகாயாவுக்கு நன்றி தெரிவிக்க வெக்டர் கிராபிக்ச் மாறவும்
- சார்பு புதுப்பிப்புகள்
- மொழிபெயர்ப்பு புதுப்பிப்புகள்
================================================
FILE: fastlane/metadata/android/ta-IN/full_description.txt
================================================
கெட்ட பழக்கங்களை நன்றாகப் பாருங்கள். முகப்பு பக்கத்திலிருந்து, உங்கள் தீமைகளை ஒரு குழாயில் குறிப்பிடவும். விவரங்களைச் சேர்க்க குறிப்புகளைப் பயன்படுத்தவும் - அந்தச் சாக்லேட் பட்டியில் ஆரோக்கியமான மாற்றாக நீங்கள் எதிர்க்க முடியாது. உங்கள் உள்ளீட்டை லேபிள்களுடன் ஒழுங்கமைக்கவும்.
நீங்கள் ஒரு பேனாவைப் பிடிக்க முடியும் என்பதை விட வேகமாக. முகப்பு பக்கத்தில் உங்கள் கெட்ட பழக்கங்களைக் கண்டுபிடித்து, நீங்கள் கொடுக்கும்வற்றைக் கடக்கவும். இவை நாள் செய்ய நகரும். மறுநாள் காலையில், தவிர்க்க வேண்டிய விசயங்களின் முழு பட்டியலுடன் புதிதாகத் தொடங்குங்கள்.
உங்கள் முன்னேற்றத்தின் மேல் இருங்கள். பதிவு உங்கள் ஒட்டுமொத்த செய் விகிதங்களைப் பற்றிய நுண்ணறிவை வழங்குகிறது மற்றும் ஒரு வாரம், ஒரு மாதம் அல்லது ஒரு வருடம்வரை - நீங்கள் என்ன மோசமான பழக்கமாக இருந்தீர்கள் என்பதை சுட்டிக்காட்டுகிறது. எனவே நீங்கள் ஒரு சிறந்த உங்களை நோக்கி எளிதாக வேலை செய்யலாம்.
வலைப்பக்கம்: https://www.crazymarvin.com/tondaton
வேண்டாம் என்று மொழிபெயர்க்கவும்: https://github.com/craze-marvin/toddont
அறிவிலிமையத்தில் மூலம்: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/ta-IN/short_description.txt
================================================
தலைகீழ் செய்ய வேண்டிய பட்டியல்.
================================================
FILE: fastlane/metadata/android/ta-IN/title.txt
================================================
செய்ய வேண்டாம்
================================================
FILE: fastlane/metadata/android/tr/changelogs/1.txt
================================================
İlk Sürüm
================================================
FILE: fastlane/metadata/android/tr/changelogs/10.txt
================================================
- 🐛 Uygulama çökmelerini önlemek için kullanıcıların etiket olmadan kötü alışkanlıklar oluşturmasını önle (#187)
================================================
FILE: fastlane/metadata/android/tr/changelogs/2.txt
================================================
- Hakkında ekranından tasarımcı kaldırıldı
- Daha kolay çeviri yapılması için gömülü kodlanmış dizgeler string.xml dosyasına taşındı
- Kullanılan Lisanslar bölümü kullanılan tüm destek dosyalarıyla güncellendi (hepsine teşekkürler!)
- Daha fazla kaydırma hareketi eklendi
- Perde arkasındaki küçük iyileştirmeler
================================================
FILE: fastlane/metadata/android/tr/changelogs/210.txt
================================================
- Android 14 hedeflendi 🤖
- Uygulama Başına Dil Tercihleri Desteği 🗺
- Harici kütüphanedeki dizgeler çevrilebilir hale getirildi 🗺
- Çeviri Güncellemeleri 🗺
- Kullanıcı Arayüzü İyileştirmesi 🎨
Katkıda bulunan herkese ve çevirenlere çok teşekkür ederiz. 😘
Sorunları bildirmekten ve https://github.com/Crazy-Marvin/ToDont/ adresinde düzeltmeler veya https://hosted.weblate.org/engage/todont/ adresinde çeviriler göndermekten çekinmeyin. 🚀
================================================
FILE: fastlane/metadata/android/tr/changelogs/3.txt
================================================
Perde arkasındaki küçük iyileştirmeler
Fastlane kurulumu düzeltildi
================================================
FILE: fastlane/metadata/android/tr/changelogs/30.txt
================================================
-Hedef Android 13
================================================
FILE: fastlane/metadata/android/tr/changelogs/4.txt
================================================
- Çeviri güncellemeleri 🗺️
- Hata düzeltmeleri için lütfen bizi takip etmeye devam edin 🦟
================================================
FILE: fastlane/metadata/android/tr/changelogs/5.txt
================================================
- Bağımlılıklar güncellendi 🔩
================================================
FILE: fastlane/metadata/android/tr/changelogs/6.txt
================================================
- Çeviri güncellemeleri 🗺️
E-posta ile geri bildirim gönderebilir, GitHub'da sorun açabilir veya çeviriye yardımcı olabilirsiniz. 💓
================================================
FILE: fastlane/metadata/android/tr/changelogs/7.txt
================================================
- UX iyileştirmeleri 🦋
- Küçük hata düzeltmeleri 🐛
- Çeviri güncellemeleri 🗺️
E-posta ile geri bildirim göndermekten, GitHub'da sorunları açmaktan veya çeviriye yardımcı olmaktan memnuniyet duyarız. 💓
================================================
FILE: fastlane/metadata/android/tr/changelogs/8.txt
================================================
- Linting sorunlari çözüldü 🐛
================================================
FILE: fastlane/metadata/android/tr/changelogs/9.txt
================================================
- Birçok hata düzeltildi, teşekkürler subeep 🐛
- Daha keskin bir görünüm için vektör grafiklerine geçildi, teşekkürler karthikayya 🎨
- Bağımlılıklar güncellendi ⚙️
- Çeviriler güncellendi 🗺️
================================================
FILE: fastlane/metadata/android/tr/full_description.txt
================================================
Kötü alışkanlıklara yeni bir bakış açısı. Ana sayfadan tek bir dokunuşla bir kötü alışkanlık oluşturun. Oluşturduğunuz alışkanlıklara ayrıntılar eklemek için Notlar sekmesini kullanın; örneğin karşı koyamadağınız o çikolata yerine sağlıklı bir alternatif tüketmek gibi. Son olarak alışkanlıklarınızı Etiketler ile derli toplu hâle getirin.
Kalemden daha hızlı. Ana sayfada kötü alışkanlıklarınızı bulun ve başarılı bir şekilde uzak duramadıklarınıza çarpı atın. Bunlar o gün için Yapıldı bölümüne taşınır. Ertesi gün başarılı bir şekilde uzak durnayı deneyerek yeniden başlayın.
Gelişiminizi en üst seviyeye çıkarın. Günlük sekmesi size genel başarı oranlarınız hakkında fikir verir ve bir hafta, bir ay veya bir yıl boyunca en çok hangi kötü alışkanlıkları yenmekte zorlandığınızı gösterir, böylece gelişim yolculuğundaki engelleri kolayca görebilirsin.
Web sayfası: https://www.crazymarvin.com/todont
Yerelleştirme: https://hosted.weblate.org/engage/todont/
Kaynak kodu: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/tr/short_description.txt
================================================
Yapılacaklar listesinin tersi.
================================================
FILE: fastlane/metadata/android/tr/title.txt
================================================
Yapılmayacaklar Listesi
================================================
FILE: fastlane/metadata/android/uk/changelogs/1.txt
================================================
Вихідна версія
================================================
FILE: fastlane/metadata/android/uk/changelogs/10.txt
================================================
- 🐛 Не дозволяємо користувачам створювати шкідливі звички без мітки, щоб запобігти збоям у роботі застосунку (#187)
================================================
FILE: fastlane/metadata/android/uk/changelogs/2.txt
================================================
- Видалили функцію конструктора з розділу Про нас
- Перемістили жорстко закодовані рядки з макету в strings.xml для більш зручного перекладу
- Оновили розділ Використані ліцензії з усіма залежностями (дякуємо всім!)
- Додали більше жестів прокрутки
- Зробили невеликі покращення всередині програми
================================================
FILE: fastlane/metadata/android/uk/changelogs/3.txt
================================================
Зробили невеликі покращення всередині програми
Змінили налаштування fastlane
================================================
FILE: fastlane/metadata/android/uk/changelogs/30.txt
================================================
- Цільова збірка для Android 13
================================================
FILE: fastlane/metadata/android/uk/changelogs/4.txt
================================================
- Оновлення перекладів 🗺️
- Будь ласка, слідкуйте за оновленнями помилок 🦟
================================================
FILE: fastlane/metadata/android/uk/changelogs/5.txt
================================================
- Оновлені залежності 🔩
================================================
FILE: fastlane/metadata/android/uk/changelogs/6.txt
================================================
- Покращення перекладу 🗺️
Не соромтеся надсилати відгуки електронною поштою, зазначати помилки на GitHub або допомагати в перекладі. 💓
================================================
FILE: fastlane/metadata/android/uk/changelogs/7.txt
================================================
- Покращення UX 🦋
- Дрібні виправлення помилок 🐛
- Оновлення перекладів 🗺️
Не соромтеся надсилати відгуки електронною поштою, відкривати проблеми на GitHub або допомагати з перекладом. 💓
================================================
FILE: fastlane/metadata/android/uk/changelogs/8.txt
================================================
- Виправлені проблеми з підказок лінтера 🐛
================================================
FILE: fastlane/metadata/android/uk/changelogs/9.txt
================================================
- Виправлено багато помилок дякуючи subeep 🐛
- Перехід на векторну графіку для чіткішого вигляду дякуючи karthikayya 🎨
- Оновлення залежностей ⚙️
- Оновлення перекладу 🗺️
================================================
FILE: fastlane/metadata/android/uk/full_description.txt
================================================
Погляньте на шкідливі звички по-новому. Позначте свої шкідливі звички за допомогою одного дотику на головній сторінці. Використовуйте Примітки, щоб додати детальну інформацію, наприклад, корисну альтернативу шоколадці, перед якою ви не можете встояти. І систематизуйте свої дані за допомогою Ярликів.
Швидше, ніж ви могли собі уявити. Знайдіть шкідливі звички на головній сторінці і викресліть ті, що вам притаманні. Вони будуть переміщені у розділ "Справи на сьогодні". Наступного ранку почніть з чистого аркуша з повним списком справ, яких варто уникати.
Відслідковуйте свої досягнення. Журнал прогресу дозволить вам відстежити загальний рівень успіху і визначити, до якої звички ви були схильні більше всього - за тиждень, місяць чи рік. Таким чином, ви зможете ефективніше працювати над собою.
Вебсторінка: https://www.crazymarvin.com/todont
Перекладіть Припини це : https://hosted.weblate.org/engage/todont/
Джерело на GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/uk/short_description.txt
================================================
Список справ навпаки.
================================================
FILE: fastlane/metadata/android/uk/title.txt
================================================
Припини це
================================================
FILE: fastlane/metadata/android/ur/changelogs/1.txt
================================================
ابتدائی رہائی
================================================
FILE: fastlane/metadata/android/ur/changelogs/2.txt
================================================
تھوڑی بہتری کی طرف
================================================
FILE: fastlane/metadata/android/ur/changelogs/3.txt
================================================
تھوڑی بہتری کی طرف
فاسٹ لین سیٹ اپ
================================================
FILE: fastlane/metadata/android/ur/full_description.txt
================================================
بری عادات پر ایک اچھی نظر۔ ہوم پیج سے ایک نل پر اپنے خاکوں کو نیچے رکھیں۔ تفصیلات شامل کرنے کے لئے نوٹس کا استعمال کریں - جیسے کہ چاکلیٹ بار کا صحت مند متبادل جس کی آپ مزاحمت نہیں کرسکتے ہیں۔ اور اپنے ان پٹ کو لیبل کے ساتھ ترتیب دیں۔
[२२4] اس سے بھی زیادہ کہ آپ قلم پکڑ سکتے ہو۔ ہوم پیج پر اپنی بری عادتیں ڈھونڈیں ، اور جن چیزوں میں آپ دیتے ہیں اسے باہر نکالیں۔ یہ دن کے لئے مکمل ہوجائیں گے۔ اگلی صبح ، چیزوں کی مکمل فہرست سے بچنے کے ل fresh تازہ آغاز کریں۔
اپنی ترقی میں سب سے اوپر رہیں۔ لاگ آپ کو کامیابی کی مجموعی شرح اور اس بات کی نشاندہی کرتا ہے کہ آپ کو کس بری عادت سے سب سے زیادہ وابستہ کیا گیا ہے - ایک ہفتہ ، ایک مہینے یا ایک سال کے دوران۔ لہذا آپ آسانی سے اپنے لئے بہتر کام کرسکتے ہیں۔
ویب صفحہ: https://www.crazymarvin.com/todont
نہ کریں ترجمہ: https://hosted.weblate.org/enage/todont/
گٹ ہب پر ماخذ: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/ur/short_description.txt
================================================
الٹا کرنے کے لئے فہرست.
================================================
FILE: fastlane/metadata/android/ur/title.txt
================================================
نہ کریں
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/1.txt
================================================
初始版本
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/10.txt
================================================
- 🐛 防止用户在未添加标签时创建坏习惯导致应用程序崩溃(#187)
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/2.txt
================================================
- 从“关于”界面移除了设计师相关内容
- 为了便于翻译,将布局中的硬编码字符串移至 strings.xml 文件
- 更新“使用许可”部分,纳入所有依赖项(感谢他们!)
- 添加更多滑动手势
- 在底层进行了一些小优化
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/210.txt
================================================
- 适配 Android 14 🤖
- 支持应用内语言偏好设置 🗺
- 使外部库中的字符串可翻译 🗺
- 更新了翻译内容 🗺
- 优化了用户界面 🎨
非常感谢所有贡献者和翻译人员 😘
欢迎在 https://github.com/Crazy-Marvin/ToDont/ 上报告问题或提交修复,或者在 https://hosted.weblate.org/engage/todont/ 上参与翻译 🚀
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/3.txt
================================================
在底层进行了一些小优化
修复了 Fastlane 的设置问题
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/300.txt
================================================
优化:
- 扩展了应用教程 🦮
- 适配 Android 15 🤖
- 更新了翻译内容 🗺️
- 优化用户体验 🎨
新增功能:
- 每日可记录多个“避免事项”和“已做事项” 🪬
- 新增通知功能 🛎️
- 支持本地备份与恢复功能 🛟
非常感谢所有贡献者和翻译人员 😘
欢迎在 https://github.com/Crazy-Marvin/ToDont/ 上报告问题或提交修复,或者在 https://hosted.weblate.org/engage/todont/ 上参与翻译 🚀
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/4.txt
================================================
- 更新了翻译内容 🗺️
- 敬请期待漏洞修复更新 🦟️
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/400.txt
================================================
使用 Kotlin 重写 To Don't,提升了可维护性、性能、效率、用户体验及安全性 💣
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/410.txt
================================================
- 新功能:为记入事项添加封面图像 🖼️
- 新功能:主屏幕小部件 🏡
- 新功能:暗黑主题 🧛
- 更新了翻译内容 🗺️
- 修复了已知漏洞 🤢
- 更新了依赖项 🔩
- 进行了常规维护 🧹
非常感谢所有贡献者和翻译人员,特别感谢 @theftzoku 😘
欢迎在 https://github.com/Crazy-Marvin/ToDont/ 上报告问题或提交修复,或者在 https://hosted.weblate.org/engage/todont/ 上参与翻译 🚀
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/420.txt
================================================
- 适配 Android 16 🤖
- 优化了用户体验 🎨
- 更新了翻译内容 🗺️
- 修复了已知漏洞 🤢
- 更新了依赖项 🔩
- 进行了常规维护 🧹
非常感谢所有贡献者和翻译人员,尤其是@theftzoku 😘
欢迎在 https://github.com/Crazy-Marvin/ToDont/ 报告问题或提交修复,或者在 https://hosted.weblate.org/engage/todont/ 参与翻译 🚀
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/430.txt
================================================
- 用户体验优化 🎨
- 更新了翻译内容 🗺️
- 修复了已知漏洞 🤢
- 更新了依赖项 🔩
- 进行了常规维护 🧹
非常感谢所有贡献者和翻译人员,特别感谢 @theftzoku 😘
欢迎在 https://github.com/Crazy-Marvin/ToDont/ 上报告问题或提交修复,或者在 https://hosted.weblate.org/engage/todont/ 上参与翻译 🚀
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/5.txt
================================================
- 更新了依赖项 🔩
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/6.txt
================================================
- 更新了翻译内容 🗺️
欢迎通过电子邮件发送反馈,在 GitHub 上提交问题,或者协助进行翻译工作 💓
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/7.txt
================================================
- 优化了用户体验 🦋
- 修复了一些小漏洞 🐛
- 更新了翻译内容 🗺️
欢迎通过电子邮件发送反馈,在 GitHub 上提交问题,或者协助进行翻译工作 💓
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/8.txt
================================================
- 修复发现的问题 🐛
================================================
FILE: fastlane/metadata/android/zh-CN/changelogs/9.txt
================================================
- 修复了许多漏洞,感谢 subeep 🐛
- 改用矢量图形使显示效果更清晰,感谢karthikayya 🎨
- 更新了依赖项 ⚙️
- 更新了翻译内容 🗺️
================================================
FILE: fastlane/metadata/android/zh-CN/full_description.txt
================================================
审视不良习惯的好帮手。 轻触屏幕,就能在主页记下你的不良习惯。用“备注”功能添加详细信息——比如你抗拒不了的巧克力棒,就可以写上健康替代品。还能通过“标签”整理你记录内容。
比拿笔记录还快。 在主页找到你的坏习惯,划掉那些你没能忍住做了的事。它们会移至“今日已做”列表。第二天早上,又会有一整列需要避免的事情,让你重新开始。
随时掌握自己的进步情况。 “日志”功能让你了解自己的整体成功率,还能指出你在一周、一个月或一年里最难以改掉的坏习惯。助你轻松迈向更优秀的自己。
官方网址:https://www.crazymarvin.com/todont
为 To Don't 添加翻译:https://hosted.weblate.org/engage/todont/
GitHub 源码:https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/zh-CN/short_description.txt
================================================
反向的待办事项清单。
================================================
FILE: fastlane/metadata/android/zh-CN/title.txt
================================================
To Don't
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/1.txt
================================================
初始版本
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/10.txt
================================================
- 🐛 阻止使用者建立沒有標題的壞習慣,以防止應用程式崩潰 (#187)
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/2.txt
================================================
- 將設計者從關於畫面移除
- 將寫死的字串從佈局檔移動到 strings.xml 來幫助翻譯
- 更新「依賴關係授權條款」區塊中列出的依賴套件(感謝它們的存在!)
- 新增更多滑動手勢
- 一些底層的小改進
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/3.txt
================================================
一些底層的小改進
修正 fastlane 設定
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/30.txt
================================================
- 以 Android 13 為目標
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/4.txt
================================================
- 翻譯更新 🗺️
- 敬請期待錯誤更新 🦟
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/5.txt
================================================
- 更新依賴套件 🔩
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/6.txt
================================================
- 翻譯更新 🗺️
歡迎透過電子郵件傳送回饋、在 GitHub 上發起 issue 或是幫忙翻譯。💓
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/7.txt
================================================
- 改善使用者體驗 🦋
- 一些小修正 🐛
- 翻譯更新 🗺️
歡迎透過電子郵件傳送回饋、在 GitHub 上發起 issue 或是幫忙翻譯。💓
================================================
FILE: fastlane/metadata/android/zh-TW/changelogs/9.txt
================================================
- 修正許多錯誤,感謝 subeep 🐛
- 改用向量圖來減少模糊的情況,感謝 karthikayya 🎨
- 依賴套件更新 ⚙️
- 翻譯更新 🗺️
================================================
FILE: fastlane/metadata/android/zh-TW/full_description.txt
================================================
正式你的壞習慣。
在首頁輕鬆地將你的壞習慣記錄下來。用Notes添加詳細資訊 -- 例如那根讓你無法抗拒的巧克力棒的健康替代品 -- 並利用標籤來整理你的輸入內容。
記錄,就在彈指之間。
在首頁就能一眼看到你的壞習慣清單,隨手一滑就能完成記錄。清單會於隔天重置,讓你繼續遠離惡習。
進度成效,一目了然。
透過日誌分析,你可以掌握整體的達成率,並鎖定糾纏最久的惡習,協助你一步步成就更好的自己。
Webpage: https://www.crazymarvin.com/todont
Translate To Don’t: https://hosted.weblate.org/engage/todont/
Source on GitHub: https://github.com/Crazy-Marvin/ToDont
================================================
FILE: fastlane/metadata/android/zh-TW/short_description.txt
================================================
意思反轉的待辦事項。
================================================
FILE: fastlane/metadata/android/zh-TW/title.txt
================================================
不該辦事項
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
android.nonFinalResIds=false
================================================
FILE: gradlew
================================================
#!/bin/sh
#
# Copyright © 2015 the original authors.
#
# 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
#
# https://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.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
================================================
FILE: gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: sentry-wizard
================================================
[File too large to display: 63.0 MB]
================================================
FILE: settings.gradle
================================================
rootProject.name = "todont"
include ':app'