[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Additional context**\nAdd any other context about the problem here.\n\n**Debug log**\nAttach a debug log (see Settings -> Enable debug logging) that is captured while reproducing the issue.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/publish_training.md",
    "content": "---\nname: Publish training\nabout: Publish your training on GitHub to share it with the community\ntitle: ''\nlabels: ''\nassignees: ''\n---\n\n**Summary**\n\nPlease include a summary of your training\n\n**Declaration**\n\n* [ ] I herbey declare that all included training material are free to use and share within openWorkout\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "# This is a basic workflow to help you get started with Actions\n\nname: CI\n\n# Controls when the workflow will run\non:\n  # Triggers the workflow on push or pull request events but only for the master branch\n  push:\n    branches: [master]\n\n  # Allows you to run this workflow manually from the Actions tab\n  workflow_dispatch:\n\n# A workflow run is made up of one or more jobs that can run sequentially or in parallel\njobs:\n  # This workflow contains a single job called \"build\"\n  build:\n    # The type of runner that the job will run on\n    runs-on: ubuntu-latest\n\n    # Steps represent a sequence of tasks that will be executed as part of the job\n    steps:\n      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n      - name: Checkout\n        uses: actions/checkout@v3\n      - name: Setup JDK\n        uses: actions/setup-java@v3\n        with:\n          distribution: \"zulu\" # See 'Supported distributions' for available options\n          java-version: \"21\"\n      - name: Build APK\n        run: ./gradlew assembleFdroidDebug\n      - uses: \"marvinpinto/action-automatic-releases@latest\"\n        with:\n          repo_token: \"${{ secrets.GITHUB_TOKEN }}\"\n          automatic_release_tag: \"dev-build\"\n          prerelease: true\n          title: \"openWorkout development build\"\n          files: |\n            app/build/outputs/apk/fdroid/debug/openWorkout-debug.apk\n"
  },
  {
    "path": ".gitignore",
    "content": "# Built application files\n*.apk\n*.aar\n*.ap_\n*.aab\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nout/\n#  Uncomment the following line in case you need and you don't have the release build type files in your app\n# release/\n\n# Gradle files\n.gradle/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio Navigation editor temp files\n.navigation/\n\n# Android Studio captures folder\ncaptures/\n\n# IntelliJ\n*.iml\n.idea/workspace.xml\n.idea/tasks.xml\n.idea/gradle.xml\n.idea/assetWizardSettings.xml\n.idea/dictionaries\n.idea/libraries\n# Android Studio 3 in .gitignore file.\n.idea/caches\n.idea/modules.xml\n# Comment next line if keeping position of elements in Navigation Editor is relevant for you\n.idea/navEditor.xml\n\n# Keystore files\n# Uncomment the following lines if you do not want to check your keystore files in.\n*.jks\n*.keystore\n/app/src/main/res/values/apikeys.xml\n/app/src/playStore/res/values/apikeys.xml\n/keystore.properties\n/fastlane_secrect_keys.json\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n.cxx/\n\n# Google Services (e.g. APIs or Firebase)\n# google-services.json\n\n# Freeline\nfreeline.py\nfreeline/\nfreeline_project_description.json\n\n# fastlane\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\nfastlane/readme.md\nfastlane/README.md\n\n# Version control\nvcs.xml\n\n# lint\nlint/intermediates/\nlint/generated/\nlint/outputs/\nlint/tmp/\n# lint/reports/\n\n/app/release/output.json\n/.idea/.name\n/.idea/\n"
  },
  {
    "path": "CREDITS",
    "content": "openWorkout uses open source components. You can find the source code of their open source projects along with license information below.\nI acknowledge and I am grateful to these developers for their contributions to open source.\n\nProject: CustomActivityOnCrash\nCopyright 2014-2017 Eduard Ereza Martínez\nApache License, Version 2.0\nLicense: https://www.apache.org/licenses/LICENSE-2.0\nWebsite: https://github.com/Ereza/CustomActivityOnCrash\n\nProject: Timber\nCopyright 2013 Jake Wharton\nApache License, Version 2.0\nLicense: https://www.apache.org/licenses/LICENSE-2.0\nWebsite: https://github.com/JakeWharton/timber\n\nProject: Android Debug Database\nCopyright (C) 2019 Amit Shekhar\nApache License, Version 2.0\nLicense: https://www.apache.org/licenses/LICENSE-2.0\nWebsite: https://github.com/amitshekhariitbhu/Android-Debug-Database\n\nUsed icons are by flaticon.com (http://www.flaticon.com)\nAttribution 3.0 Unported (CC BY 3.0)\nLicense: http://creativecommons.org/licenses/by/3.0/\n* iconixar (https://www.flaticon.com/authors/iconixar)\n* Google (https://www.flaticon.com/authors/google)\n* Freepik (http://www.freepik.com)\n* Roundicons (https://www.flaticon.com/authors/roundicons)\n* DinosoftLabs (https://www.flaticon.com/authors/dinosoftlabs)\n\nUsed sound effects by zapsplat.com (https://www.zapsplat.com)\nLicense: Royalty free\n\nContributors to openScale are listed on:\nhttps://github.com/oliexdev/openWorkout/graphs/contributors\n"
  },
  {
    "path": "Gemfile",
    "content": "# Autogenerated by fastlane\n#\n# Ensure this file is checked in to source control!\n\nsource \"https://rubygems.org\"\n\ngem 'fastlane'\n\nplugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')\neval_gemfile(plugins_path) if File.exist?(plugins_path)\n"
  },
  {
    "path": "LICENSE",
    "content": "GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {one line to give the program's name and a brief idea of what it does.}\n    Copyright (C) {year}  {name of author}\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    {project}  Copyright (C) {year}  {fullname}\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n"
  },
  {
    "path": "README.md",
    "content": "<img align=\"left\" src=\"https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/icon.png\" alt=\"openWorkout logo\" width=\"64\" height=\"64\"> openWorkout\n=========\n\nSimple workout trainer that puts your privacy first \n\n> [!IMPORTANT]\n> This project is no longer actively maintained.<br>\n> I’ve decided to stop further development of openWorkout.<br>\n> Feel free to fork and continue if you’d like.\n\n# Features\n\n* Pre configured 7 minutes workout plan and beginners training plan\n* Animated selectable female and male character\n* Detailed information for each exercise\n* Integrated workout reminder function\n* Doesn't require you to create an account,\n* Respects your privacy \n* Add your own individual training plan and workout items\n* Full configuable workout items\n* Optional dark theme selectable\n\n# Privacy\n\nPlease read the full privacy policy of the openScale sync app [here](https://github.com/oliexdev/openWorkout/wiki/openWorkout-Privacy-Policy).\n\n# Screenshots\n\n<table>\n  <tr>\n    <th>\n        <a href=\"https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-GB.png\" target=\"_blank\">\n        <img src='https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-GB.png' width='200px' alt='image missing' /> </a>\n    </th>\n    <th>\n        <a href=\"https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-GB.png\" target=\"_blank\">\n        <img src='https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-GB.png' width='200px' alt='image missing' /> </a>\n    </th>\n    <th>\n        <a href=\"https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-GB.png\" target=\"_blank\">\n        <img src='https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-GB.png' width='200px' alt='image missing' /> </a>\n    </th>\n    <th>\n        <a href=\"https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-GB.png\" target=\"_blank\">\n        <img src='https://github.com/oliexdev/openWorkout/blob/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-GB.png' width='200px' alt='image missing' /> </a>\n    </th>\n  </tr>\n</table>\n\n# License\n\n    Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\napply plugin: 'com.android.application'\napply plugin: \"androidx.navigation.safeargs\"\n\nandroid {\n    compileSdk 34\n\n    defaultConfig {\n        applicationId \"com.health.openworkout\"\n        minSdkVersion 21\n        targetSdkVersion 34\n        versionCode 15\n        versionName \"1.3.2\"\n        archivesBaseName = \"openWorkout-$versionName\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n\n        buildFeatures {\n            buildConfig = true\n        }\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments = [\"room.schemaLocation\": \"$projectDir/schemas\".toString()]\n            }\n        }\n    }\n\n\n    signingConfigs {\n        release {\n            def keystorePropertiesFile = rootProject.file(\"../openWorkout.keystore\")\n            def keystoreProperties = new Properties()\n            try {\n                keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n            } catch(FileNotFoundException ex) {\n                keystoreProperties = null;\n            }\n\n            if (keystoreProperties != null) {\n                storeFile file(rootDir.getCanonicalPath() + '/' + keystoreProperties['releaseKeyStore'])\n                keyAlias keystoreProperties['releaseKeyAlias']\n                keyPassword keystoreProperties['releaseKeyPassword']\n                storePassword keystoreProperties['releaseStorePassword']\n            }\n        }\n\n        playStore {\n            def keystorePlayStorePropertiesFile = rootProject.file(\"../openWorkout_playstore.keystore\")\n            def keystorePlayStoreProperties = new Properties()\n            try {\n                keystorePlayStoreProperties.load(new FileInputStream(keystorePlayStorePropertiesFile))\n            } catch(FileNotFoundException ex) {\n                keystorePlayStoreProperties = null;\n            }\n\n            if (keystorePlayStoreProperties != null) {\n                storeFile file(rootDir.getCanonicalPath() + '/' + keystorePlayStoreProperties['releaseKeyStore'])\n                keyAlias keystorePlayStoreProperties['releaseKeyAlias']\n                keyPassword keystorePlayStoreProperties['releaseKeyPassword']\n                storePassword keystorePlayStoreProperties['releaseStorePassword']\n            }\n        }\n    }\n\n    buildTypes {\n        release {\n            debuggable false\n            shrinkResources true\n            minifyEnabled true\n           // proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n\n        debug {\n            debuggable true\n            // don't include version number into the apk filename for debug build type so GitHub CI can find it\n            applicationVariants.all { variant ->\n                variant.outputs.all { output ->\n                    if (variant.buildType.name == \"debug\") {\n                        outputFileName = \"openWorkout-debug.apk\"\n                    }\n                }\n            }\n        }\n    }\n\n    flavorDimensions \"default\"\n\n    productFlavors {\n        fdroid {\n            dimension \"default\"\n            signingConfig signingConfigs.release\n        }\n\n        playStore {\n            dimension \"default\"\n            signingConfig signingConfigs.playStore\n        }\n    }\n\n    namespace 'com.health.openworkout'\n    lint {\n        abortOnError false\n        checkReleaseBuilds false\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    // Google libraries\n    implementation 'androidx.appcompat:appcompat:1.7.0'\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    implementation 'androidx.preference:preference:1.2.1'\n    implementation 'com.google.android.material:material:1.12.0'\n    implementation 'androidx.constraintlayout:constraintlayout:2.2.0'\n    implementation 'androidx.navigation:navigation-fragment:2.8.4'\n    implementation 'androidx.navigation:navigation-ui:2.8.4'\n    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'\n\n    // Retrofit2\n    implementation 'com.squareup.retrofit2:retrofit:2.8.1'\n    implementation 'com.squareup.retrofit2:converter-gson:2.8.1'\n\n    // GSon\n    implementation 'com.google.code.gson:gson:2.10.1'\n\n    // CustomActivityOnCrash\n    implementation 'cat.ereza:customactivityoncrash:2.3.0'\n\n    // Timber log library\n    implementation 'com.jakewharton.timber:timber:5.0.1'\n\n    // Room library\n    implementation 'androidx.room:room-runtime:2.6.1'\n\n    // Test environment\n    annotationProcessor 'androidx.room:room-compiler:2.6.1'\n    testImplementation 'junit:junit:4.13.2'\n    androidTestImplementation 'androidx.test.ext:junit:1.2.1'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'\n\n    // Debug SQL DB use adb forward tcp:8080 tcp:8080 --> localhost:8080\n    //debugImplementation 'com.amitshekhar.android:debug-db:1.0.7'\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n-keep class * extends androidx.fragment.app.Fragment{}"
  },
  {
    "path": "app/schemas/com.health.openworkout.core.database.AppDatabase/1.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 1,\n    \"identityHash\": \"452b47f7dbfdc7a2311dc46aa5f95066\",\n    \"entities\": [\n      {\n        \"tableName\": \"User\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `trainingsPlanId` INTEGER NOT NULL, `isMale` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"trainingsPlanId\",\n            \"columnName\": \"trainingsPlanId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMale\",\n            \"columnName\": \"isMale\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TrainingPlan\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`trainingPlanId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `orderNr` INTEGER NOT NULL, `name` TEXT, `imagePath` TEXT, `isImagePathExternal` INTEGER NOT NULL, `countFinishedTraining` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"trainingPlanId\",\n            \"columnName\": \"trainingPlanId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderNr\",\n            \"columnName\": \"orderNr\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imagePath\",\n            \"columnName\": \"imagePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isImagePathExternal\",\n            \"columnName\": \"isImagePathExternal\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"countFinishedTraining\",\n            \"columnName\": \"countFinishedTraining\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"trainingPlanId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"WorkoutSession\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`workoutSessionId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `trainingPlanId` INTEGER NOT NULL, `orderNr` INTEGER NOT NULL, `name` TEXT, `finished` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"workoutSessionId\",\n            \"columnName\": \"workoutSessionId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"trainingPlanId\",\n            \"columnName\": \"trainingPlanId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderNr\",\n            \"columnName\": \"orderNr\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"finished\",\n            \"columnName\": \"finished\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"workoutSessionId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"WorkoutItem\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`workoutItemId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `workoutSessionId` INTEGER NOT NULL, `orderNr` INTEGER NOT NULL, `name` TEXT, `description` TEXT, `elapsedTime` INTEGER NOT NULL, `imagePath` TEXT, `isImagePathExternal` INTEGER NOT NULL, `videoPath` TEXT, `isVideoPathExternal` INTEGER NOT NULL, `prepTime` INTEGER NOT NULL, `workoutTime` INTEGER NOT NULL, `breakTime` INTEGER NOT NULL, `repetitionCount` INTEGER NOT NULL, `isTimeMode` INTEGER NOT NULL, `finished` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"workoutItemId\",\n            \"columnName\": \"workoutItemId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"workoutSessionId\",\n            \"columnName\": \"workoutSessionId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderNr\",\n            \"columnName\": \"orderNr\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"elapsedTime\",\n            \"columnName\": \"elapsedTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"imagePath\",\n            \"columnName\": \"imagePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isImagePathExternal\",\n            \"columnName\": \"isImagePathExternal\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"videoPath\",\n            \"columnName\": \"videoPath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isVideoPathExternal\",\n            \"columnName\": \"isVideoPathExternal\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"prepTime\",\n            \"columnName\": \"prepTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"workoutTime\",\n            \"columnName\": \"workoutTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"breakTime\",\n            \"columnName\": \"breakTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repetitionCount\",\n            \"columnName\": \"repetitionCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isTimeMode\",\n            \"columnName\": \"isTimeMode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"finished\",\n            \"columnName\": \"finished\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"workoutItemId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '452b47f7dbfdc7a2311dc46aa5f95066')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/com.health.openworkout.core.database.AppDatabase/2.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 2,\n    \"identityHash\": \"007a41b5201e4b1e5a62195c5ba4415c\",\n    \"entities\": [\n      {\n        \"tableName\": \"User\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `trainingsPlanId` INTEGER NOT NULL, `isMale` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"trainingsPlanId\",\n            \"columnName\": \"trainingsPlanId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMale\",\n            \"columnName\": \"isMale\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"TrainingPlan\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`trainingPlanId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `orderNr` INTEGER NOT NULL, `name` TEXT, `imagePath` TEXT, `isImagePathExternal` INTEGER NOT NULL, `countFinishedTraining` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"trainingPlanId\",\n            \"columnName\": \"trainingPlanId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderNr\",\n            \"columnName\": \"orderNr\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"imagePath\",\n            \"columnName\": \"imagePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isImagePathExternal\",\n            \"columnName\": \"isImagePathExternal\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"countFinishedTraining\",\n            \"columnName\": \"countFinishedTraining\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"trainingPlanId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"WorkoutSession\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`workoutSessionId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `trainingPlanId` INTEGER NOT NULL, `orderNr` INTEGER NOT NULL, `name` TEXT, `finished` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"workoutSessionId\",\n            \"columnName\": \"workoutSessionId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"trainingPlanId\",\n            \"columnName\": \"trainingPlanId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderNr\",\n            \"columnName\": \"orderNr\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"finished\",\n            \"columnName\": \"finished\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"workoutSessionId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"WorkoutItem\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`workoutItemId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `workoutSessionId` INTEGER NOT NULL, `orderNr` INTEGER NOT NULL, `name` TEXT, `description` TEXT, `elapsedTime` INTEGER NOT NULL, `imagePath` TEXT, `isImagePathExternal` INTEGER NOT NULL, `isVideoMode` INTEGER NOT NULL, `videoPath` TEXT, `isVideoPathExternal` INTEGER NOT NULL, `prepTime` INTEGER NOT NULL, `workoutTime` INTEGER NOT NULL, `breakTime` INTEGER NOT NULL, `repetitionCount` INTEGER NOT NULL, `isTimeMode` INTEGER NOT NULL, `finished` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"workoutItemId\",\n            \"columnName\": \"workoutItemId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"workoutSessionId\",\n            \"columnName\": \"workoutSessionId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderNr\",\n            \"columnName\": \"orderNr\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"elapsedTime\",\n            \"columnName\": \"elapsedTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"imagePath\",\n            \"columnName\": \"imagePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isImagePathExternal\",\n            \"columnName\": \"isImagePathExternal\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVideoMode\",\n            \"columnName\": \"isVideoMode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"videoPath\",\n            \"columnName\": \"videoPath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isVideoPathExternal\",\n            \"columnName\": \"isVideoPathExternal\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"prepTime\",\n            \"columnName\": \"prepTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"workoutTime\",\n            \"columnName\": \"workoutTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"breakTime\",\n            \"columnName\": \"breakTime\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repetitionCount\",\n            \"columnName\": \"repetitionCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isTimeMode\",\n            \"columnName\": \"isTimeMode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"finished\",\n            \"columnName\": \"finished\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"workoutItemId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '007a41b5201e4b1e5a62195c5ba4415c')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/src/fdroid/java/com/health/openworkout/core/utils/PlayStoreUtils.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.view.View;\n\npublic class PlayStoreUtils {\n    private static PlayStoreUtils instance;\n\n    private PlayStoreUtils(Context aContext) {\n        // empty\n    }\n\n    public static void createInstance(Context aContext) {\n        if (instance != null) {\n            return;\n        }\n\n        instance = new PlayStoreUtils(aContext);\n    }\n\n    public static PlayStoreUtils getInstance() {\n        if (instance == null) {\n            throw new RuntimeException(\"No PlayStoreUtils instance created\");\n        }\n\n        return instance;\n    }\n\n    public void initMobileAds(Activity activity) {\n        // empty\n    }\n\n    public View getAdView(Context aContext) {\n        return null;\n    }\n\n\n    public boolean isAdRemovalPaid() {\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_openworkout\"\n        android:label=\"@string/app_name\"\n        android:name=\".core.Application\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"@string/app_name\"\n            android:exported=\"true\"\n            android:configChanges=\"orientation|screenSize\"\n            android:theme=\"@style/AppTheme.NoActionBar\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <provider\n            android:name=\".gui.utils.VideoProvider\"\n            android:authorities=\"com.health.openworkout.videoprovider\"\n            android:exported=\"false\" />\n\n        <receiver android:name=\".core.alarm.ReminderBootReceiver\" android:enabled=\"false\" android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\"/>\n            </intent-filter>\n        </receiver>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/MainActivity.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout;\n\nimport android.app.AlertDialog;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.text.SpannableString;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.WindowManager;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.core.view.GravityCompat;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport androidx.navigation.NavController;\nimport androidx.navigation.Navigation;\nimport androidx.navigation.ui.AppBarConfiguration;\nimport androidx.navigation.ui.NavigationUI;\n\nimport com.google.android.material.navigation.NavigationView;\nimport com.health.openworkout.core.OpenWorkout;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private AppBarConfiguration mAppBarConfiguration;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        OpenWorkout.getInstance().initTrainingPlans();\n\n        setContentView(R.layout.activity_main);\n        Toolbar toolbar = findViewById(R.id.toolbar);\n        setSupportActionBar(toolbar);\n\n        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n\n        final DrawerLayout drawer = findViewById(R.id.drawer_layout);\n        final NavigationView navigationView = findViewById(R.id.nav_view);\n        // Passing each menu ID as a set of Ids because each\n        // menu should be considered as top level destinations.\n        mAppBarConfiguration = new AppBarConfiguration.Builder(\n                R.id.nav_home, R.id.nav_main_preferences, R.id.nav_trainings)\n                .setDrawerLayout(drawer)\n                .build();\n        final NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);\n        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);\n        NavigationUI.setupWithNavController(navigationView, navController);\n\n        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {\n            @Override\n            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {\n                switch (menuItem.getItemId()) {\n                    case R.id.nav_help:\n                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(\"https://github.com/oliexdev/openWorkout\")));\n                        break;\n                    case R.id.nav_about:\n                        showAboutDialog();\n                        break;\n                }\n\n                NavigationUI.onNavDestinationSelected(menuItem, navController);\n                drawer.closeDrawer(GravityCompat.START);\n\n                return true;\n            }\n        });\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        //getMenuInflater().inflate(R.menu.main, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onSupportNavigateUp() {\n        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);\n        return NavigationUI.navigateUp(navController, mAppBarConfiguration)\n                || super.onSupportNavigateUp();\n    }\n\n    private void showAboutDialog() {\n        final SpannableString abouotMsg = new SpannableString(getResources().getString(R.string.label_about_info));\n\n        AlertDialog dialog = new AlertDialog.Builder(this)\n                .setTitle(getResources().getString(R.string.app_name) + \" \" + String.format(\"v%s (%d)\", BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE))\n                .setMessage(abouotMsg)\n                .setIcon(R.drawable.ic_openworkout)\n                .setPositiveButton(getResources().getString(R.string.label_ok), null)\n                .create();\n\n        dialog.show();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/Application.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core;\n\nimport android.content.SharedPreferences;\n\nimport androidx.appcompat.app.AppCompatDelegate;\nimport androidx.preference.PreferenceManager;\n\nimport com.health.openworkout.BuildConfig;\n\nimport timber.log.Timber;\n\npublic class Application extends android.app.Application {\n    OpenWorkout openWorkout;\n\n    private class TimberLogAdapter extends Timber.DebugTree {\n        @Override\n        protected boolean isLoggable(String tag, int priority) {\n            if (BuildConfig.DEBUG || OpenWorkout.DEBUG_MODE) {\n                return super.isLoggable(tag, priority);\n            }\n            return false;\n        }\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        Timber.plant(new TimberLogAdapter());\n\n        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);\n        boolean isDarkMode = sharedPreferences.getBoolean(\"darkTheme\", false);\n\n        if (isDarkMode) {\n            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);\n        }\n\n        // Create openWorkout instance\n        OpenWorkout.createInstance(getApplicationContext());\n\n        // Hold on to the instance for as long as the application exists\n        openWorkout = OpenWorkout.getInstance();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/OpenWorkout.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core;\n\nimport android.content.Context;\n\nimport androidx.room.Room;\nimport androidx.room.RoomDatabase;\nimport androidx.sqlite.db.SupportSQLiteDatabase;\n\nimport com.health.openworkout.core.database.AppDatabase;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.User;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.core.training.AbdominalMuscleTraining;\nimport com.health.openworkout.core.training.BeginnersTraining;\nimport com.health.openworkout.core.training.SevenMinutesTraining;\nimport com.health.openworkout.core.workout.WorkoutFactory;\nimport com.health.openworkout.gui.utils.SoundUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport timber.log.Timber;\n\npublic class OpenWorkout {\n    public static boolean DEBUG_MODE = false;\n    private static final String DATABASE_NAME = \"openWorkout.db\";\n\n    private static OpenWorkout instance;\n    private final Context context;\n\n    private AppDatabase appDB;\n    private User user;\n\n    private SoundUtils soundUtils;\n\n    private OpenWorkout(Context aContext) {\n        context = aContext;\n        soundUtils = new SoundUtils(aContext);\n\n        openDB();\n    }\n\n    public static void createInstance(Context aContext) {\n        if (instance != null) {\n            return;\n        }\n\n        instance = new OpenWorkout(aContext);\n    }\n\n    public static OpenWorkout getInstance() {\n        if (instance == null) {\n            throw new RuntimeException(\"No openWorkout instance created\");\n        }\n\n        return instance;\n    }\n\n    public final Context getContext() {\n        return context;\n    }\n\n    private void openDB() {\n        appDB = Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME)\n                .allowMainThreadQueries()\n                .addCallback(new RoomDatabase.Callback() {\n                    @Override\n                    public void onOpen(SupportSQLiteDatabase db) {\n                        super.onOpen(db);\n                        db.setForeignKeyConstraintsEnabled(true);\n                    }\n                })\n                .addMigrations(AppDatabase.MIGRATION_1_2)\n                .build();\n    }\n\n    public void initTrainingPlans() {\n        List<TrainingPlan> trainingPlanList = appDB.trainingPlanDAO().getAll();\n\n        if (trainingPlanList.isEmpty()) {\n            appDB.workoutItemDAO().clear();\n\n            long trainingPlanId = insertTrainingPlan(new SevenMinutesTraining());\n            insertTrainingPlan(new BeginnersTraining());\n            insertTrainingPlan(new AbdominalMuscleTraining());\n\n            WorkoutFactory workoutFactory = new WorkoutFactory();\n            appDB.workoutItemDAO().insertAll(workoutFactory.getAllWorkoutItems());\n\n            user = new User();\n            user.setTrainingsPlanId(trainingPlanId);\n            appDB.userDAO().insert(user);\n        }\n\n        user = appDB.userDAO().getAll().get(0);\n    }\n\n    public User getCurrentUser() {\n        return user;\n    }\n\n    public void printTrainingPlans() {\n        Timber.d(\"################ TRAINING PLAN PRINTOUT #####################\");\n        List<TrainingPlan> trainingPlanList = appDB.trainingPlanDAO().getAll();\n\n        for (TrainingPlan singleTrainingPlan : trainingPlanList) {\n            Timber.d(\"- Training Plan \" + singleTrainingPlan.getName() + \" Id \" + singleTrainingPlan.getTrainingPlanId());\n            List<WorkoutSession> workoutSessionList = appDB.workoutSessionDAO().getAll(singleTrainingPlan.getTrainingPlanId());\n\n            for (WorkoutSession singleWorkoutSession : workoutSessionList) {\n                Timber.d(\"-- WorkoutSession \" + singleWorkoutSession.getName() + \" Id \" + singleWorkoutSession.getWorkoutSessionId());\n                List<WorkoutItem> workoutItemList = appDB.workoutItemDAO().getAll(singleWorkoutSession.getWorkoutSessionId());\n\n                for (WorkoutItem singleWorkItem : workoutItemList) {\n                    Timber.d(\"---- WorkoutItem \" + singleWorkItem.getName() + \" Id \" + singleWorkItem.getWorkoutItemId());\n                }\n            }\n        }\n    }\n\n    public List<TrainingPlan> getTrainingPlans() {\n        List<TrainingPlan> trainingPlanList = new ArrayList<>();\n\n        List<TrainingPlan> dbTrainingPlanList = appDB.trainingPlanDAO().getAll();\n        for (TrainingPlan dbTrainingPlan : dbTrainingPlanList) {\n            trainingPlanList.add(getTrainingPlan(dbTrainingPlan.getTrainingPlanId()));\n        }\n\n        return trainingPlanList;\n    }\n\n    public TrainingPlan getTrainingPlan(long trainingPlanId) {\n        TrainingPlan singleTrainingPlan = appDB.trainingPlanDAO().get(trainingPlanId);\n\n        if (singleTrainingPlan != null) {\n            List<WorkoutSession> workoutSessionList = appDB.workoutSessionDAO().getAll(singleTrainingPlan.getTrainingPlanId());\n            singleTrainingPlan.setWorkoutSessions(workoutSessionList);\n\n            for (WorkoutSession singleWorkoutSession : workoutSessionList) {\n                List<WorkoutItem> workoutItemList = appDB.workoutItemDAO().getAll(singleWorkoutSession.getWorkoutSessionId());\n                singleWorkoutSession.setWorkoutItems(workoutItemList);\n            }\n        }\n\n        return singleTrainingPlan;\n    }\n\n    public WorkoutSession getWorkoutSession(long workoutSessionId) {\n        WorkoutSession singleWorkoutSession = appDB.workoutSessionDAO().get(workoutSessionId);\n\n        List<WorkoutItem> workoutItemList = appDB.workoutItemDAO().getAll(singleWorkoutSession.getWorkoutSessionId());\n        singleWorkoutSession.setWorkoutItems(workoutItemList);\n\n        return singleWorkoutSession;\n    }\n\n    public WorkoutItem getWorkoutItem(long workoutItemId) {\n        return appDB.workoutItemDAO().get(workoutItemId);\n    }\n\n    public List<WorkoutItem> getAllUniqueWorkoutItems() {\n        return appDB.workoutItemDAO().getAllUnique();\n    }\n\n    public long insertTrainingPlan(TrainingPlan trainingPlan) {\n        long trainingPlanId = appDB.trainingPlanDAO().insert(trainingPlan);\n        for (WorkoutSession workoutSession : trainingPlan.getWorkoutSessions()) {\n            workoutSession.setTrainingPlanId(trainingPlanId);\n            long workoutSessionId = appDB.workoutSessionDAO().insert(workoutSession);\n\n            for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                workoutItem.setWorkoutSessionId(workoutSessionId);\n                appDB.workoutItemDAO().insert(workoutItem);\n            }\n        }\n\n        return trainingPlanId;\n    }\n\n    public long insertWorkoutSession(WorkoutSession workoutSession) {\n        long workoutSessionId = appDB.workoutSessionDAO().insert(workoutSession);\n\n        for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n            workoutItem.setWorkoutSessionId(workoutSessionId);\n            appDB.workoutItemDAO().insert(workoutItem);\n        }\n\n        return workoutSessionId;\n    }\n\n    public long insertWorkoutItem(WorkoutItem workoutItem) {\n        long workoutItemId = appDB.workoutItemDAO().insert(workoutItem);\n\n        return workoutItemId;\n    }\n\n    public void deleteTrainingPlan(TrainingPlan trainingPlan) {\n        for (WorkoutSession workoutSession : trainingPlan.getWorkoutSessions()) {\n            appDB.workoutItemDAO().deleteAll(workoutSession.getWorkoutSessionId());\n        }\n\n        appDB.workoutSessionDAO().deleteAll(trainingPlan.getTrainingPlanId());\n        appDB.trainingPlanDAO().delete(trainingPlan);\n    }\n\n    public void deleteWorkoutSession(WorkoutSession workoutSession) {\n        appDB.workoutItemDAO().deleteAll(workoutSession.getWorkoutSessionId());\n\n        appDB.workoutSessionDAO().delete(workoutSession);\n    }\n\n    public void deleteWorkoutItem(WorkoutItem workoutItem) {\n        appDB.workoutItemDAO().delete(workoutItem);\n    }\n\n    public void updateWorkoutItem(WorkoutItem workoutItem) {\n        appDB.workoutItemDAO().update(workoutItem);\n    }\n\n    public void updateWorkoutSession(WorkoutSession workoutSession) {\n        appDB.workoutSessionDAO().update(workoutSession);\n    }\n\n    public void updateTrainingPlan(TrainingPlan trainingPlan) {\n        appDB.trainingPlanDAO().update(trainingPlan);\n    }\n\n    public void updateUser(User user) {\n        appDB.userDAO().update(user);\n    }\n\n    public SoundUtils getSoundUtils() {\n        return soundUtils;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/alarm/AlarmEntry.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\npackage com.health.openworkout.core.alarm;\n\nimport java.util.Calendar;\n\npublic class AlarmEntry implements Comparable<AlarmEntry> {\n    private final int dayOfWeek;\n    private final long timeInMillis;\n\n    public AlarmEntry(int dayOfWeek, long timeInMillis)\n    {\n        this.dayOfWeek = dayOfWeek;\n        this.timeInMillis = timeInMillis;\n    }\n\n    public int getDayOfWeek()\n    {\n        return dayOfWeek;\n    }\n\n    private long getTimeInMillis()\n    {\n        return timeInMillis;\n    }\n\n    public Calendar getNextTimestamp()\n    {\n        // We just want the time *not* the date\n        Calendar nextAlarmTimestamp = Calendar.getInstance();\n        nextAlarmTimestamp.setTimeInMillis(getTimeInMillis());\n\n        Calendar alarmCal = Calendar.getInstance();\n        alarmCal.set(Calendar.HOUR_OF_DAY, nextAlarmTimestamp.get(Calendar.HOUR_OF_DAY));\n        alarmCal.set(Calendar.MINUTE, nextAlarmTimestamp.get(Calendar.MINUTE));\n        alarmCal.set(Calendar.SECOND, 0);\n        alarmCal.set(Calendar.DAY_OF_WEEK, getDayOfWeek());\n\n        // Check we aren't setting it in the past which would trigger it to fire instantly\n        if (alarmCal.before(Calendar.getInstance())) {\n            alarmCal.add(Calendar.DAY_OF_YEAR, 7);\n        }\n\n        return alarmCal;\n    }\n\n    @Override\n    public boolean equals(Object o)\n    {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n\n        AlarmEntry that = (AlarmEntry) o;\n\n        if (dayOfWeek != that.dayOfWeek) return false;\n        return timeInMillis == that.timeInMillis;\n    }\n\n    @Override\n    public int hashCode()\n    {\n        int result = dayOfWeek;\n        result = 31 * result + (int) (timeInMillis ^ (timeInMillis >>> 32));\n        return result;\n    }\n\n    @Override\n    public int compareTo(AlarmEntry o)\n    {\n        int rc = compare(dayOfWeek, o.dayOfWeek);\n        if (rc == 0) rc = compare(timeInMillis, o.timeInMillis);\n        return rc;\n    }\n\n    private int compare(long x, long y)\n    {\n        return (x < y) ? -1 : ((x == y) ? 0 : 1);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/alarm/AlarmEntryReader.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\npackage com.health.openworkout.core.alarm;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.preference.PreferenceManager;\n\nimport com.health.openworkout.R;\n\nimport java.util.Calendar;\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.TreeSet;\n\npublic class AlarmEntryReader {\n    private Set<AlarmEntry> alarmEntries;\n    private String alarmNotificationText;\n\n    private AlarmEntryReader(Set<AlarmEntry> alarmEntries, String alarmNotificationText) {\n        this.alarmEntries = alarmEntries;\n        this.alarmNotificationText = alarmNotificationText;\n    }\n\n    public Set<AlarmEntry> getEntries()\n    {\n        return alarmEntries;\n    }\n\n    public String getNotificationText()\n    {\n        return alarmNotificationText;\n    }\n\n    public static AlarmEntryReader construct(Context context) {\n        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n\n        Set<String> reminderDays = prefs.getStringSet(\"reminderDays\", new HashSet<String>());\n        Long reminderTimeInMillis = prefs.getLong(\"reminderTime\", System.currentTimeMillis());\n        String notifyText = prefs.getString(\"reminderNotifyText\", context.getResources().getString(R.string.preference_reminder_default_text));\n\n        Set<AlarmEntry> alarms = new TreeSet<>();\n\n        for (String dayOfWeek : reminderDays) {\n            AlarmEntry alarm = getAlarmEntry(dayOfWeek, reminderTimeInMillis);\n            alarms.add(alarm);\n        }\n\n        return new AlarmEntryReader(alarms, notifyText);\n    }\n\n    private static AlarmEntry getAlarmEntry(String dayOfWeek, Long reminderTimeInMillis) {\n        AlarmEntry alarmEntry;\n\n        switch (dayOfWeek) {\n            case \"Monday\":\n                alarmEntry = new AlarmEntry(Calendar.MONDAY, reminderTimeInMillis);\n                break;\n            case \"Tuesday\":\n                alarmEntry = new AlarmEntry(Calendar.TUESDAY, reminderTimeInMillis);\n                break;\n            case \"Wednesday\":\n                alarmEntry = new AlarmEntry(Calendar.WEDNESDAY, reminderTimeInMillis);\n                break;\n            case \"Thursday\":\n                alarmEntry = new AlarmEntry(Calendar.THURSDAY, reminderTimeInMillis);\n                break;\n            case \"Friday\":\n                alarmEntry = new AlarmEntry(Calendar.FRIDAY, reminderTimeInMillis);\n                break;\n            case \"Saturday\":\n                alarmEntry = new AlarmEntry(Calendar.SATURDAY, reminderTimeInMillis);\n                break;\n            default:\n            case \"Sunday\":\n                alarmEntry = new AlarmEntry(Calendar.SUNDAY, reminderTimeInMillis);\n                break;\n        }\n        return alarmEntry;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/alarm/AlarmHandler.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\npackage com.health.openworkout.core.alarm;\n\nimport android.app.AlarmManager;\nimport android.app.Notification;\nimport android.app.NotificationChannel;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\n\nimport androidx.core.app.NotificationCompat;\n\nimport com.health.openworkout.MainActivity;\nimport com.health.openworkout.R;\n\nimport java.util.Calendar;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Set;\n\nimport timber.log.Timber;\n\nimport static android.content.Context.NOTIFICATION_SERVICE;\n\npublic class AlarmHandler {\n    public static final String INTENT_EXTRA_ALARM = \"alarmIntent\";\n    private static final int ALARM_NOTIFICATION_ID = 0x01;\n\n    public void scheduleAlarms(Context context) {\n        AlarmEntryReader reader = AlarmEntryReader.construct(context);\n        Set<AlarmEntry> alarmEntries = reader.getEntries();\n\n        disableAllAlarms(context);\n        enableAlarms(context, alarmEntries);\n    }\n\n    private void enableAlarms(Context context, Set<AlarmEntry> alarmEntries) {\n        for (AlarmEntry alarmEntry : alarmEntries) {\n            enableAlarm(context, alarmEntry);\n        }\n    }\n\n    private void enableAlarm(Context context, AlarmEntry alarmEntry) {\n        int dayOfWeek = alarmEntry.getDayOfWeek();\n        Calendar nextAlarmTimestamp = alarmEntry.getNextTimestamp();\n\n        setRepeatingAlarm(context, dayOfWeek, nextAlarmTimestamp);\n    }\n\n    private void setRepeatingAlarm(Context context, int dayOfWeek, Calendar nextAlarmTimestamp) {\n        Timber.d(\"Set repeating alarm for %s\", nextAlarmTimestamp.getTime());\n        PendingIntent alarmPendingIntent = getPendingAlarmIntent(context, dayOfWeek);\n        AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\n        alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, nextAlarmTimestamp.getTimeInMillis(),\n                AlarmManager.INTERVAL_DAY * 7, alarmPendingIntent);\n    }\n\n    private List<PendingIntent> getWeekdaysPendingAlarmIntent(Context context) {\n        final int[] dayOfWeeks = {Calendar.MONDAY, Calendar.TUESDAY,\n                Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY,\n                Calendar.SATURDAY, Calendar.SUNDAY};\n\n        List<PendingIntent> pendingIntents = new LinkedList<>();\n\n        for (int dayOfWeek : dayOfWeeks) {\n            pendingIntents.add(getPendingAlarmIntent(context, dayOfWeek));\n        }\n\n        return pendingIntents;\n    }\n\n    private PendingIntent getPendingAlarmIntent(Context context, int dayOfWeek) {\n        Intent alarmIntent = new Intent(context, ReminderBootReceiver.class);\n        alarmIntent.putExtra(INTENT_EXTRA_ALARM, true);\n\n        return PendingIntent.getBroadcast(context, dayOfWeek, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);\n    }\n\n    public void disableAllAlarms(Context context) {\n        Timber.d(\"Disable all alarm handlers\");\n        AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);\n        List<PendingIntent> pendingIntents = getWeekdaysPendingAlarmIntent(context);\n\n        for (PendingIntent pendingIntent : pendingIntents) {\n            alarmMgr.cancel(pendingIntent);\n        }\n    }\n\n    public void showAlarmNotification(Context context) {\n        AlarmEntryReader reader = AlarmEntryReader.construct(context);\n        String notifyText = reader.getNotificationText();\n\n        Intent notifyIntent = new Intent(context, MainActivity.class);\n\n        PendingIntent notifyPendingIntent =\n                PendingIntent.getActivity(context, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);\n\n        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, \"openWorkout_notify\");\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);\n            NotificationChannel channel = new NotificationChannel(\n                    \"openWorkout_notify\",\n                    \"openWorkout notification\",\n                    NotificationManager.IMPORTANCE_DEFAULT);\n            notificationManager.createNotificationChannel(channel);\n        }\n\n        Notification notification = mBuilder.setSmallIcon(R.drawable.ic_openworkout)\n                                            .setContentTitle(context.getString(R.string.app_name))\n                                            .setContentText(notifyText)\n                                            .setAutoCancel(true)\n                                            .setContentIntent(notifyPendingIntent)\n                                            .build();\n\n        NotificationManager mNotifyMgr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);\n        mNotifyMgr.notify(ALARM_NOTIFICATION_ID, notification);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/alarm/ReminderBootReceiver.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.alarm;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\n\npublic class ReminderBootReceiver extends BroadcastReceiver {\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        if (intent.hasExtra(AlarmHandler.INTENT_EXTRA_ALARM)) {\n            handleAlarm(context);\n        }\n\n        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {\n            scheduleAlarms(context);\n        }\n    }\n\n    private void handleAlarm(Context context) {\n        AlarmHandler alarmHandler = new AlarmHandler();\n        alarmHandler.showAlarmNotification(context);\n    }\n\n    private void scheduleAlarms(Context context) {\n        AlarmHandler alarmHandler = new AlarmHandler();\n\n        alarmHandler.scheduleAlarms(context);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/database/AppDatabase.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.database;\n\nimport androidx.room.Database;\nimport androidx.room.RoomDatabase;\nimport androidx.room.migration.Migration;\nimport androidx.sqlite.db.SupportSQLiteDatabase;\n\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.User;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\n\n@Database(entities = {User.class, TrainingPlan.class, WorkoutSession.class, WorkoutItem.class}, version = 2)\npublic abstract class AppDatabase extends RoomDatabase {\n    public abstract UserDAO userDAO();\n    public abstract TrainingPlanDAO trainingPlanDAO();\n    public abstract WorkoutSessionDAO workoutSessionDAO();\n    public abstract WorkoutItemDAO workoutItemDAO();\n\n    public static final Migration MIGRATION_1_2 = new Migration(1, 2) {\n        @Override\n        public void migrate(SupportSQLiteDatabase database) {\n            database.beginTransaction();\n            try {\n                // Add isVideoMode\n                database.execSQL(\"ALTER TABLE workoutItem ADD isVideoMode INTEGER NOT NULL default 1\");\n\n                database.setTransactionSuccessful();\n            }\n            finally {\n                database.endTransaction();\n            }\n        }\n    };\n}"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/database/TrainingPlanDAO.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.database;\n\nimport androidx.room.Dao;\nimport androidx.room.Delete;\nimport androidx.room.Insert;\nimport androidx.room.Query;\nimport androidx.room.Update;\n\nimport com.health.openworkout.core.datatypes.TrainingPlan;\n\nimport java.util.List;\n\n@Dao\npublic interface TrainingPlanDAO {\n    @Insert\n    long insert(TrainingPlan trainingPlan);\n\n    @Update\n    void update(TrainingPlan trainingPlan);\n\n    @Delete\n    void delete(TrainingPlan trainingPlan);\n\n    @Query(\"SELECT * FROM TrainingPlan WHERE trainingPlanId=:trainingPlanId\")\n    TrainingPlan get(long trainingPlanId);\n\n    @Query(\"SELECT * FROM TrainingPlan ORDER BY orderNr\")\n    List<TrainingPlan> getAll();\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/database/UserDAO.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.database;\n\nimport androidx.room.Dao;\nimport androidx.room.Delete;\nimport androidx.room.Insert;\nimport androidx.room.Query;\nimport androidx.room.Update;\n\nimport com.health.openworkout.core.datatypes.User;\n\nimport java.util.List;\n\n@Dao\npublic interface UserDAO {\n    @Insert\n    long insert(User user);\n\n    @Update\n    void update(User user);\n\n    @Delete\n    void delete(User user);\n\n    @Query(\"SELECT * FROM User WHERE userId=:userId\")\n    User get(long userId);\n\n    @Query(\"SELECT * FROM User\")\n    List<User> getAll();\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/database/WorkoutItemDAO.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.database;\n\nimport androidx.room.Dao;\nimport androidx.room.Delete;\nimport androidx.room.Insert;\nimport androidx.room.Query;\nimport androidx.room.Update;\n\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\nimport java.util.List;\n\n@Dao\npublic interface WorkoutItemDAO {\n    @Insert\n    long insert(WorkoutItem workoutItem);\n\n    @Insert\n    void insertAll(List<WorkoutItem> workoutItemList);\n\n    @Update\n    void update(WorkoutItem workoutItem);\n\n    @Delete\n    void delete(WorkoutItem workoutItem);\n\n    @Query(\"DELETE FROM WorkoutItem\")\n    void clear();\n\n    @Query(\"DELETE FROM WorkoutItem WHERE workoutSessionId = :workoutSessionId\")\n    void deleteAll(long workoutSessionId);\n\n    @Query(\"SELECT * FROM WorkoutItem WHERE workoutItemId=:workoutItemId\")\n    WorkoutItem get(long workoutItemId);\n\n    @Query(\"SELECT * FROM WorkoutItem WHERE workoutSessionId = :workoutSessionId ORDER BY orderNr\")\n    List<WorkoutItem> getAll(long workoutSessionId);\n\n    @Query(\"SELECT * FROM WorkoutItem GROUP BY name\")\n    List<WorkoutItem> getAllUnique();\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/database/WorkoutSessionDAO.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.database;\n\nimport androidx.room.Dao;\nimport androidx.room.Delete;\nimport androidx.room.Insert;\nimport androidx.room.Query;\nimport androidx.room.Update;\n\nimport com.health.openworkout.core.datatypes.WorkoutSession;\n\nimport java.util.List;\n\n@Dao\npublic interface WorkoutSessionDAO {\n    @Insert\n    long insert(WorkoutSession workoutSession);\n\n    @Update\n    void update(WorkoutSession workoutSession);\n\n    @Delete\n    void delete(WorkoutSession workoutSession);\n\n    @Query(\"DELETE FROM WorkoutSession WHERE trainingPlanId = :trainingPlanId\")\n    void deleteAll(long trainingPlanId);\n\n    @Query(\"SELECT * FROM WorkoutSession WHERE workoutSessionId=:workoutSessionId\")\n    WorkoutSession get(long workoutSessionId);\n\n    @Query(\"SELECT * FROM WorkoutSession WHERE trainingPlanId = :trainingPlanId ORDER BY orderNr\")\n    List<WorkoutSession> getAll(long trainingPlanId);\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/datatypes/GitHubFile.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.datatypes;\n\nimport androidx.annotation.Keep;\n\nimport com.google.gson.annotations.SerializedName;\n\nimport java.util.List;\n\n@Keep\npublic class GitHubFile {\n    @SerializedName(\"type\")\n    private String type;\n\n    @SerializedName(\"size\")\n    private long size;\n\n    @SerializedName(\"name\")\n    private String name;\n\n    @SerializedName(\"path\")\n    private String path;\n\n    @SerializedName(\"sha\")\n    private String sha;\n\n    @SerializedName(\"url\")\n    private String url;\n\n    @SerializedName(\"git_url\")\n    private String gitURL;\n\n    @SerializedName(\"html_url\")\n    private String htmlURL;\n\n    @SerializedName(\"download_url\")\n    private String downloadURL;\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public long getSize() {\n        return size;\n    }\n\n    public void setSize(long size) {\n        this.size = size;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getPath() {\n        return path;\n    }\n\n    public void setPath(String path) {\n        this.path = path;\n    }\n\n    public String getSha() {\n        return sha;\n    }\n\n    public void setSha(String sha) {\n        this.sha = sha;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public String getGitURL() {\n        return gitURL;\n    }\n\n    public void setGitURL(String gitURL) {\n        this.gitURL = gitURL;\n    }\n\n    public String getHtmlURL() {\n        return htmlURL;\n    }\n\n    public void setHtmlURL(String htmlURL) {\n        this.htmlURL = htmlURL;\n    }\n\n    public String getDownloadURL() {\n        return downloadURL;\n    }\n\n    public void setDownloadURL(String downloadURL) {\n        this.downloadURL = downloadURL;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/datatypes/TrainingPlan.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.datatypes;\n\nimport android.content.Context;\n\nimport androidx.annotation.Keep;\nimport androidx.room.ColumnInfo;\nimport androidx.room.Entity;\nimport androidx.room.Ignore;\nimport androidx.room.PrimaryKey;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Keep\n@Entity\npublic class TrainingPlan implements Comparable<TrainingPlan>, Cloneable {\n    @PrimaryKey(autoGenerate = true)\n    private long trainingPlanId;\n\n    @ColumnInfo\n    private long orderNr;\n    @ColumnInfo\n    private String name;\n    @ColumnInfo\n    private String imagePath;\n    @ColumnInfo\n    private boolean isImagePathExternal;\n    @ColumnInfo\n    private int countFinishedTraining;\n    @Ignore\n    private List<WorkoutSession> workoutSessions;\n    @Ignore\n    private transient final Context context;\n\n    public TrainingPlan() {\n        context = OpenWorkout.getInstance().getContext();\n\n        orderNr = -1L;\n        countFinishedTraining = 0;\n        workoutSessions = new ArrayList<>();\n        isImagePathExternal = false;\n        name = \"<\" + context.getString(R.string.label_new_training_plan) + \">\";\n        imagePath = \"defaultTraining.png\";\n    }\n\n    @Override\n    public TrainingPlan clone() {\n        TrainingPlan clone;\n        try {\n            clone = (TrainingPlan) super.clone();\n        }\n        catch (CloneNotSupportedException e) {\n            throw new RuntimeException(\"failed to clone TrainingPlan\", e);\n        }\n\n        for (WorkoutSession workoutSession : clone.workoutSessions) {\n            workoutSession.setWorkoutSessionId(0);\n\n            for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                workoutItem.setWorkoutItemId(0);\n            }\n        }\n\n        return clone;\n    }\n\n    public long getOrderNr() {\n        return orderNr;\n    }\n\n    public void setOrderNr(long orderNr) {\n        this.orderNr = orderNr;\n    }\n\n    public Context getContext() {\n        return context;\n    }\n\n    public void addWorkoutSession(WorkoutSession workoutSession) {\n        workoutSessions.add(workoutSession);\n    }\n\n    public void setWorkoutSessions(List<WorkoutSession> workoutSessions) {\n        this.workoutSessions = workoutSessions;\n    }\n\n    public List<WorkoutSession> getWorkoutSessions() {\n        return workoutSessions;\n    }\n\n    public WorkoutSession getNextWorkoutSession() {\n        for (WorkoutSession workoutSession : workoutSessions) {\n            if (!workoutSession.isFinished()) {\n                return workoutSession;\n            }\n        }\n\n        return null;\n    }\n\n    public int finishedSessionSize() {\n        int finishedSize = 0;\n\n        for (WorkoutSession workoutSession : workoutSessions) {\n            if (workoutSession.isFinished()) {\n                finishedSize++;\n            }\n        }\n\n        return finishedSize;\n    }\n\n    public int getWorkoutSessionSize() {\n        return workoutSessions.size();\n    }\n\n    public void setTrainingPlanId(long trainingPlanId) {\n        this.trainingPlanId = trainingPlanId;\n    }\n\n    public long getTrainingPlanId() {\n        return trainingPlanId;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getImagePath() {\n        return imagePath;\n    }\n\n    public void setImagePath(String imagePath) {\n        this.imagePath = imagePath;\n    }\n\n    public boolean isImagePathExternal() {\n        return isImagePathExternal;\n    }\n\n    public void setImagePathExternal(boolean imagePathExternal) {\n        isImagePathExternal = imagePathExternal;\n    }\n\n    public int getCountFinishedTraining() {\n        return countFinishedTraining;\n    }\n\n    public void setCountFinishedTraining(int countFinishedTraining) {\n        this.countFinishedTraining = countFinishedTraining;\n    }\n\n    @Override\n    public String toString() {\n        return name;\n    }\n\n    @Override\n    public int compareTo(TrainingPlan o) {\n        if (this.orderNr == -1L || o.orderNr == -1L) {\n            return (int)(this.trainingPlanId - o.trainingPlanId);\n        }\n\n        return (int)(this.orderNr - o.orderNr);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/datatypes/User.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.datatypes;\n\nimport androidx.annotation.Keep;\nimport androidx.room.ColumnInfo;\nimport androidx.room.Entity;\nimport androidx.room.PrimaryKey;\n\n@Keep\n@Entity\npublic class User {\n    @PrimaryKey(autoGenerate = true)\n    private long userId;\n    @ColumnInfo\n    private long trainingsPlanId;\n    @ColumnInfo\n    private boolean isMale;\n\n    public User() {\n        isMale = true;\n    }\n\n    public long getUserId() {\n        return userId;\n    }\n\n    public void setUserId(long userId) {\n        this.userId = userId;\n    }\n\n    public long getTrainingsPlanId() {\n        return trainingsPlanId;\n    }\n\n    public void setTrainingsPlanId(long trainingsPlanId) {\n        this.trainingsPlanId = trainingsPlanId;\n    }\n\n    public boolean isMale() {\n        return isMale;\n    }\n\n    public void setMale(boolean male) {\n        isMale = male;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/datatypes/WorkoutItem.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.datatypes;\n\nimport android.content.Context;\n\nimport androidx.annotation.Keep;\nimport androidx.room.ColumnInfo;\nimport androidx.room.Entity;\nimport androidx.room.Ignore;\nimport androidx.room.PrimaryKey;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\n\n@Keep\n@Entity\npublic class WorkoutItem implements Comparable<WorkoutItem>, Cloneable {\n    @PrimaryKey(autoGenerate = true)\n    private long workoutItemId;\n\n    @ColumnInfo\n    private long workoutSessionId;\n    @ColumnInfo\n    private long orderNr;\n    @ColumnInfo\n    private String name;\n    @ColumnInfo\n    private String description;\n    @ColumnInfo\n    private long elapsedTime; // in sec\n    @ColumnInfo\n    private String imagePath;\n    @ColumnInfo\n    private boolean isImagePathExternal;\n    @ColumnInfo\n    private boolean isVideoMode;\n    @ColumnInfo\n    private String videoPath;\n    @ColumnInfo\n    private boolean isVideoPathExternal;\n    @ColumnInfo\n    private int prepTime; // in sec\n    @ColumnInfo\n    private int workoutTime; // in sec\n    @ColumnInfo\n    private int breakTime; // in sec\n    @ColumnInfo\n    private int repetitionCount;\n    @ColumnInfo\n    private boolean isTimeMode;\n    @ColumnInfo\n    private boolean finished;\n\n    @Ignore\n    private transient final Context context;\n\n    public WorkoutItem() {\n        context = OpenWorkout.getInstance().getContext();\n        name = \"<\" + context.getString(R.string.label_new_workout_item) + \">\";\n        description = \"<\" + context.getString(R.string.label_new_workout_item) + \">\";\n        orderNr = -1L;\n        prepTime = 5;\n        workoutTime = 30;\n        breakTime = 30;\n        repetitionCount = 5;\n        isTimeMode = true;\n        finished = false;\n        isVideoMode = true;\n        isVideoPathExternal = false;\n        videoPath = \"idle.mp4\";\n        isImagePathExternal = false;\n        imagePath = \"idle.png\";\n    }\n\n    @Override\n    public WorkoutItem clone() {\n        WorkoutItem clone;\n        try {\n            clone = (WorkoutItem) super.clone();\n        }\n        catch (CloneNotSupportedException e) {\n            throw new RuntimeException(\"failed to clone WorkoutItem\", e);\n        }\n\n        return clone;\n    }\n\n    public final Context getContext() {\n        return context;\n    }\n\n    public void setWorkoutItemId(long workoutItemId) {\n        this.workoutItemId = workoutItemId;\n    }\n\n    public long getWorkoutItemId() {\n        return workoutItemId;\n    }\n\n    public void setWorkoutSessionId(long workoutSessionId) {\n        this.workoutSessionId = workoutSessionId;\n    }\n\n    public long getWorkoutSessionId() {\n        return workoutSessionId;\n    }\n\n    public long getOrderNr() {\n        return orderNr;\n    }\n\n    public void setOrderNr(long orderNr) {\n        this.orderNr = orderNr;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public long getElapsedTime() {\n        return elapsedTime;\n    }\n\n    public void setElapsedTime(long elapsedTime) {\n        this.elapsedTime = elapsedTime;\n    }\n\n    public String getImagePath() {\n        return imagePath;\n    }\n\n    public void setImagePath(String imagePath) {\n        this.imagePath = imagePath;\n    }\n\n    public void setImagePath(int resId) {\n        imagePath = context.getResources().getResourceEntryName(resId);\n    }\n\n    public boolean isImagePathExternal() {\n        return isImagePathExternal;\n    }\n\n    public void setImagePathExternal(boolean imagePathExternal) {\n        isImagePathExternal = imagePathExternal;\n    }\n\n    public boolean isVideoMode() {\n        return isVideoMode;\n    }\n\n    public void setVideoMode(boolean videoMode) {\n        isVideoMode = videoMode;\n    }\n\n    public String getVideoPath() {\n        return videoPath;\n    }\n\n    public void setVideoPath(String videoPath) {\n        this.videoPath = videoPath;\n    }\n\n    public boolean isVideoPathExternal() {\n        return isVideoPathExternal;\n    }\n\n    public void setVideoPathExternal(boolean videoPathExternal) {\n        isVideoPathExternal = videoPathExternal;\n    }\n\n    public int getPrepTime() {\n        return prepTime;\n    }\n\n    public void setPrepTime(int prepTime) {\n        this.prepTime = prepTime;\n    }\n\n    public int getWorkoutTime() {\n        return workoutTime;\n    }\n\n    public void setWorkoutTime(int workoutTime) {\n        this.workoutTime = workoutTime;\n    }\n\n    public int getBreakTime() {\n        return breakTime;\n    }\n\n    public void setBreakTime(int breakTime) {\n        this.breakTime = breakTime;\n    }\n\n    public int getRepetitionCount() {\n        return repetitionCount;\n    }\n\n    public void setRepetitionCount(int repetitionCount) {\n        this.repetitionCount = repetitionCount;\n    }\n\n    public boolean isTimeMode() {\n        return isTimeMode;\n    }\n\n    public void setTimeMode(boolean timeMode) {\n        isTimeMode = timeMode;\n    }\n\n    public boolean isFinished() {\n        return finished;\n    }\n\n    public void setFinished(boolean finished) {\n        this.finished = finished;\n\n        if (!finished) {\n            elapsedTime = 0L;\n        }\n    }\n\n    @Override\n    public int compareTo(WorkoutItem o) {\n        if (this.orderNr == -1L || o.orderNr == -1L) {\n            return (int)(this.workoutItemId - o.workoutItemId);\n        }\n\n        return (int)(this.orderNr - o.orderNr);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/datatypes/WorkoutSession.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.datatypes;\n\nimport androidx.annotation.Keep;\nimport androidx.room.ColumnInfo;\nimport androidx.room.Entity;\nimport androidx.room.Ignore;\nimport androidx.room.PrimaryKey;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Keep\n@Entity\npublic class WorkoutSession implements Comparable<WorkoutSession>, Cloneable {\n    @PrimaryKey(autoGenerate = true)\n    private long workoutSessionId;\n\n    @ColumnInfo\n    private long trainingPlanId;\n    @ColumnInfo\n    private long orderNr;\n    @ColumnInfo\n    public String name;\n    @ColumnInfo\n    private boolean finished;\n    @Ignore\n    private List<WorkoutItem> workoutItems;\n\n    public WorkoutSession() {\n        orderNr = -1L;\n        workoutItems = new ArrayList<>();\n        finished = false;\n    }\n\n    @Override\n    public WorkoutSession clone() {\n        WorkoutSession clone;\n        try {\n            clone = (WorkoutSession) super.clone();\n        }\n        catch (CloneNotSupportedException e) {\n            throw new RuntimeException(\"failed to clone WorkoutSession\", e);\n        }\n\n        for (WorkoutItem workoutItem : clone.workoutItems) {\n            workoutItem.setWorkoutItemId(0);\n        }\n\n        return clone;\n    }\n\n    public void setWorkoutSessionId(long workoutSessionId) {\n        this.workoutSessionId = workoutSessionId;\n    }\n\n    public long getWorkoutSessionId() {\n        return workoutSessionId;\n    }\n\n    public void setTrainingPlanId(long trainingPlanId) {\n        this.trainingPlanId = trainingPlanId;\n    }\n\n    public long getTrainingPlanId() {\n        return trainingPlanId;\n    }\n\n    public long getOrderNr() {\n        return orderNr;\n    }\n\n    public void setOrderNr(long orderNr) {\n        this.orderNr = orderNr;\n    }\n\n    public WorkoutItem addWorkout(WorkoutItem workoutItem) {\n        workoutItems.add(workoutItem);\n\n        return workoutItem;\n    }\n\n    public void setWorkoutItems(List<WorkoutItem> workoutItems) {\n        this.workoutItems = workoutItems;\n    }\n\n    public List<WorkoutItem> getWorkoutItems() {\n        return workoutItems;\n    }\n\n    public WorkoutItem getNextWorkoutItem(long workoutItemOrderNr) {\n        // Run two iterations. In the first one check only future workoutItems. In the second one, check also workoutItems at the beginning.\n        for (WorkoutItem workoutItem : workoutItems) {\n            if (!workoutItem.isFinished() && workoutItem.getOrderNr() >= workoutItemOrderNr) {\n                return workoutItem;\n            }\n        }\n        for (WorkoutItem workoutItem : workoutItems) {\n            if (!workoutItem.isFinished()) {\n                return workoutItem;\n            }\n        }\n\n        return null;\n    }\n\n    public long getElapsedSessionTime() {\n        long elapsedSessionTime = 0;\n\n        for (WorkoutItem workoutItem : workoutItems) {\n            elapsedSessionTime += workoutItem.getElapsedTime();\n        }\n\n        return elapsedSessionTime;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public boolean isFinished() {\n        return finished;\n    }\n\n    public void setFinished(boolean finished) {\n        this.finished = finished;\n    }\n\n    @Override\n    public int compareTo(WorkoutSession o) {\n        if (this.orderNr == -1L || o.orderNr == -1L) {\n            return (int)(this.workoutSessionId - o.workoutSessionId);\n        }\n\n        return (int)(this.orderNr - o.orderNr);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/session/AbdominalMuscleSession.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.session;\n\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.core.workout.AbdominalCrunch;\nimport com.health.openworkout.core.workout.BicycleCrunch;\nimport com.health.openworkout.core.workout.Burpee;\nimport com.health.openworkout.core.workout.CircleCrunch;\nimport com.health.openworkout.core.workout.CrossJumps;\nimport com.health.openworkout.core.workout.HighKnees;\nimport com.health.openworkout.core.workout.JumpingJack;\nimport com.health.openworkout.core.workout.Lunge;\nimport com.health.openworkout.core.workout.PikeWalk;\nimport com.health.openworkout.core.workout.Plank;\nimport com.health.openworkout.core.workout.PushUpRotation;\nimport com.health.openworkout.core.workout.QuickSteps;\nimport com.health.openworkout.core.workout.SidePlank;\nimport com.health.openworkout.core.workout.Squat;\nimport com.health.openworkout.core.workout.WallSit;\n\npublic class AbdominalMuscleSession extends WorkoutSession {\n\n    private float stressFac;\n\n    public AbdominalMuscleSession(int dayNr, float stressFac) {\n        this.stressFac = stressFac;\n\n        switch (dayNr) {\n            case 0:\n                addWorkoutTime(new JumpingJack(), 15);\n                addWorkoutRep(new CircleCrunch(), 5);\n                addWorkoutRep(new PikeWalk(), 2);\n                addWorkoutTime(new SidePlank(), 5);\n                addWorkoutRep(new AbdominalCrunch(), 5);\n                addWorkoutTime(new Plank(), 5);\n                break;\n            case 1:\n                addWorkoutTime(new JumpingJack(), 15);\n                addWorkoutRep(new AbdominalCrunch(), 10);\n                addWorkoutTime(new SidePlank(), 5);\n                addWorkoutTime(new HighKnees(), 15);\n                addWorkoutRep(new CircleCrunch(), 10);\n                addWorkoutTime(new Plank(), 10);\n                break;\n            case 2:\n                addWorkoutTime(new JumpingJack(), 18);\n                addWorkoutRep(new Burpee(), 4);\n                addWorkoutTime(new SidePlank(), 10);\n                addWorkoutRep(new PushUpRotation(), 10);\n                addWorkoutRep(new AbdominalCrunch(), 10);\n                addWorkoutTime(new Plank(), 15);\n                break;\n            case 3:\n                addWorkoutTime(new JumpingJack(), 22);\n                addWorkoutRep(new BicycleCrunch(), 10);\n                addWorkoutRep(new Lunge(), 12);\n                addWorkoutRep(new PikeWalk(), 4);\n                addWorkoutTime(new Plank(), 15);\n                break;\n            case 4:\n                addWorkoutTime(new JumpingJack(), 25);\n                addWorkoutTime(new CrossJumps(), 20);\n                addWorkoutTime(new SidePlank(), 20);\n                addWorkoutRep(new AbdominalCrunch(), 12);\n                addWorkoutRep(new Squat(), 12);\n                addWorkoutTime(new Plank(), 18);\n                break;\n            case 5:\n                addWorkoutTime(new HighKnees(), 30);\n                addWorkoutRep(new AbdominalCrunch(), 15);\n                addWorkoutRep(new PikeWalk(), 15);\n                addWorkoutTime(new QuickSteps(), 15);\n                addWorkoutRep(new CircleCrunch(), 15);\n                addWorkoutTime(new Plank(), 20);\n                break;\n            case 6:\n                addWorkoutTime(new JumpingJack(), 30);\n                addWorkoutRep(new Burpee(), 5);\n                addWorkoutTime(new WallSit(), 20);\n                addWorkoutRep(new AbdominalCrunch(), 16);\n                addWorkoutTime(new Plank(), 22);\n                break;\n            case 7:\n                addWorkoutTime(new JumpingJack(), 35);\n                addWorkoutRep(new AbdominalCrunch(), 16);\n                addWorkoutTime(new HighKnees(), 15);\n                addWorkoutRep(new CircleCrunch(), 15);\n                addWorkoutTime(new SidePlank(), 20);\n                addWorkoutTime(new Plank(), 25);\n                break;\n        }\n    }\n\n    private void addWorkoutTime(WorkoutItem workoutItem, int time) {\n        workoutItem.setWorkoutTime(Math.round(time * stressFac));\n        addWorkout(workoutItem);\n    }\n\n    private void addWorkoutRep(WorkoutItem workoutItem, int rep) {\n        workoutItem.setTimeMode(false);\n        workoutItem.setRepetitionCount(Math.round(rep * stressFac));\n        addWorkout(workoutItem);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/session/BeginnersSession.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.session;\n\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.core.workout.AbdominalCrunch;\nimport com.health.openworkout.core.workout.HighKnees;\nimport com.health.openworkout.core.workout.JumpingJack;\nimport com.health.openworkout.core.workout.Lunge;\nimport com.health.openworkout.core.workout.Plank;\nimport com.health.openworkout.core.workout.PushUpRotation;\nimport com.health.openworkout.core.workout.PushUps;\nimport com.health.openworkout.core.workout.Squat;\nimport com.health.openworkout.core.workout.StepUp;\nimport com.health.openworkout.core.workout.TricepsDip;\n\npublic class BeginnersSession extends WorkoutSession {\n\n    private float stressFac;\n\n    public BeginnersSession(int dayNr, float stressFac) {\n        this.stressFac = stressFac;\n\n        switch (dayNr) {\n            case 0:\n                addWorkoutTime(new JumpingJack(), 15);\n                addWorkoutRep(new StepUp(), 5);\n                addWorkoutRep(new PushUps(), 2);\n                addWorkoutRep(new AbdominalCrunch(), 5);\n                addWorkoutTime(new Plank(), 5);\n                break;\n            case 1:\n                addWorkoutTime(new JumpingJack(), 15);\n                addWorkoutRep(new StepUp(), 10);\n                addWorkoutRep(new PushUps(), 3);\n                addWorkoutRep(new AbdominalCrunch(), 10);\n                addWorkoutTime(new Plank(), 10);\n                break;\n            case 2:\n                addWorkoutTime(new JumpingJack(), 18);\n                addWorkoutRep(new TricepsDip(), 4);\n                addWorkoutRep(new Squat(), 10);\n                addWorkoutRep(new AbdominalCrunch(), 10);\n                addWorkoutTime(new Plank(), 15);\n                break;\n            case 3:\n                addWorkoutTime(new JumpingJack(), 22);\n                addWorkoutTime(new HighKnees(), 10);\n                addWorkoutRep(new Lunge(), 12);\n                addWorkoutRep(new PushUpRotation(), 4);\n                addWorkoutTime(new Plank(), 15);\n                break;\n            case 4:\n                addWorkoutTime(new JumpingJack(), 25);\n                addWorkoutRep(new PushUps(), 4);\n                addWorkoutRep(new AbdominalCrunch(), 12);\n                addWorkoutRep(new Squat(), 12);\n                addWorkoutTime(new Plank(), 18);\n                break;\n            case 5:\n                addWorkoutRep(new PushUps(), 4);\n                addWorkoutRep(new AbdominalCrunch(), 15);\n                addWorkoutRep(new Squat(), 15);\n                addWorkoutTime(new HighKnees(), 15);\n                addWorkoutTime(new Plank(), 20);\n                break;\n            case 6:\n                addWorkoutTime(new JumpingJack(), 30);\n                addWorkoutRep(new TricepsDip(), 5);\n                addWorkoutRep(new Lunge(), 16);\n                addWorkoutRep(new AbdominalCrunch(), 16);\n                addWorkoutTime(new Plank(), 22);\n                break;\n            case 7:\n                addWorkoutTime(new JumpingJack(), 35);\n                addWorkoutRep(new StepUp(), 16);\n                addWorkoutTime(new HighKnees(), 15);\n                addWorkoutRep(new PushUpRotation(), 6);\n                addWorkoutTime(new Plank(), 25);\n                break;\n        }\n    }\n\n    private void addWorkoutTime(WorkoutItem workoutItem, int time) {\n        workoutItem.setWorkoutTime(Math.round(time * stressFac));\n        addWorkout(workoutItem);\n    }\n\n    private void addWorkoutRep(WorkoutItem workoutItem, int rep) {\n        workoutItem.setTimeMode(false);\n        workoutItem.setRepetitionCount(Math.round(rep * stressFac));\n        addWorkout(workoutItem);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/session/SevenMinutesSession.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.session;\n\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.core.workout.AbdominalCrunch;\nimport com.health.openworkout.core.workout.HighKnees;\nimport com.health.openworkout.core.workout.JumpingJack;\nimport com.health.openworkout.core.workout.Lunge;\nimport com.health.openworkout.core.workout.Plank;\nimport com.health.openworkout.core.workout.PushUpRotation;\nimport com.health.openworkout.core.workout.PushUps;\nimport com.health.openworkout.core.workout.SidePlank;\nimport com.health.openworkout.core.workout.Squat;\nimport com.health.openworkout.core.workout.StepUp;\nimport com.health.openworkout.core.workout.TricepsDip;\nimport com.health.openworkout.core.workout.WallSit;\n\npublic class SevenMinutesSession extends WorkoutSession {\n\n    public SevenMinutesSession() {\n        addWorkout(new JumpingJack());\n        addWorkout(new WallSit());\n        addWorkout(new PushUps());\n        addWorkout(new AbdominalCrunch());\n        addWorkout(new StepUp());\n        addWorkout(new Squat());\n        addWorkout(new TricepsDip());\n        addWorkout(new Plank());\n        addWorkout(new HighKnees());\n        addWorkout(new Lunge());\n        addWorkout(new PushUpRotation());\n        addWorkout(new SidePlank());\n        for (WorkoutItem w : this.getWorkoutItems()){\n            w.setBreakTime(10);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/training/AbdominalMuscleTraining.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.training;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.session.AbdominalMuscleSession;\n\npublic class AbdominalMuscleTraining extends TrainingPlan {\n    public AbdominalMuscleTraining() {\n        super();\n\n        setName(getContext().getString(R.string.training_abdominal_muscle_training));\n        setImagePath(\"abdominalMuscleTraining.png\");\n\n        float stressFac = 1.0f;\n\n        for (int i=0; i<=21; i++) {\n            // on every week increase the stress factor\n            if (i % 8 == 7) {\n                stressFac += 0.2f;\n            }\n\n            AbdominalMuscleSession session = new AbdominalMuscleSession(i % 8, stressFac);\n\n            session.setName(String.format(getContext().getString(R.string.day_unit), i+1));\n            addWorkoutSession(session);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/training/BeginnersTraining.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.training;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.session.BeginnersSession;\n\npublic class BeginnersTraining extends TrainingPlan {\n    public BeginnersTraining() {\n        super();\n\n        setName(getContext().getString(R.string.training_beginners_training));\n        setImagePath(\"beginnersTraining.png\");\n\n        float stressFac = 1.0f;\n\n        for (int i=0; i<=27; i++) {\n            // on every week increase the stress factor\n            if (i % 8 == 7) {\n                stressFac += 0.2f;\n            }\n\n            BeginnersSession session = new BeginnersSession(i % 8, stressFac);\n\n            session.setName(String.format(getContext().getString(R.string.day_unit), i+1));\n            addWorkoutSession(session);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/training/SevenMinutesTraining.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.training;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.session.SevenMinutesSession;\n\npublic class SevenMinutesTraining extends TrainingPlan {\n    public SevenMinutesTraining() {\n        super();\n\n        setName(getContext().getString(R.string.training_seven_minutes_workout_training));\n        setImagePath(\"sevenMinutesTraining.png\");\n\n        for (int i=1; i<=7; i++) {\n            SevenMinutesSession session = new SevenMinutesSession();\n\n            session.setName(String.format(getContext().getString(R.string.day_unit), i));\n            addWorkoutSession(session);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/utils/PackageUtils.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.utils;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.provider.MediaStore;\nimport android.widget.Toast;\n\nimport com.google.gson.Gson;\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.GitHubFile;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedOutputStream;\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.util.List;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\nimport java.util.zip.ZipOutputStream;\n\nimport okhttp3.ResponseBody;\nimport retrofit2.Call;\nimport retrofit2.Callback;\nimport retrofit2.Response;\nimport retrofit2.Retrofit;\nimport retrofit2.converter.gson.GsonConverterFactory;\nimport retrofit2.http.GET;\nimport retrofit2.http.Streaming;\nimport retrofit2.http.Url;\nimport timber.log.Timber;\n\npublic class PackageUtils {\n    private Context context;\n    private Gson gson;\n    private File trainingDir;\n    private File trainingImageDir;\n    private File trainingVideoDir;\n    private Retrofit retrofit;\n    private GitHubApi gitHubApi;\n    private OnGitHubCallbackListener onGitHubCallbackListener;\n\n    public PackageUtils(Context context) {\n        this.context = context;\n        gson = new Gson();\n\n        retrofit = new Retrofit.Builder()\n                .baseUrl(\"https://api.github.com/\")\n                .addConverterFactory(GsonConverterFactory.create())\n                .build();\n\n        gitHubApi = retrofit.create(GitHubApi.class);\n    }\n\n    public TrainingPlan importTrainingPlan(File zipFile) {\n        String displayName = getDisplayName(zipFile);\n\n        return importTrainingPlan(Uri.fromFile(zipFile), displayName);\n    }\n\n    public TrainingPlan importTrainingPlan(Uri zipFileUri) {\n        String displayName = getDisplayName(zipFileUri);\n\n        return importTrainingPlan(zipFileUri, displayName);\n    }\n\n    private TrainingPlan importTrainingPlan(Uri zipFileUri, String filename) {\n        Timber.d(\"Import training plan \" + filename);\n\n        try {\n            unzipFile(zipFileUri, filename);\n\n            File trainingDatabase = new File(context.getFilesDir(), filename + \"/database.json\");\n\n            StringBuilder result;\n            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(trainingDatabase)));\n            result = new StringBuilder();\n            String line;\n            while ((line = reader.readLine()) != null) {\n                result.append(line);\n            }\n\n            reader.close();\n\n            TrainingPlan gsonTrainingPlan = gson.fromJson(result.toString(), TrainingPlan.class);\n            Timber.d(\"Read training database \" + gsonTrainingPlan.getName());\n            OpenWorkout.getInstance().insertTrainingPlan(gsonTrainingPlan);\n\n            Toast.makeText(context, String.format(context.getString(R.string.label_info_imported), gsonTrainingPlan.getName(), filename), Toast.LENGTH_LONG).show();\n\n            return gsonTrainingPlan;\n        } catch (IOException ex) {\n            Toast.makeText(context, String.format(context.getString(R.string.error_no_valid_training_package), filename + \".zip\"), Toast.LENGTH_LONG).show();\n            Timber.e(ex);\n        } finally {\n            File zipFile = new File(context.getFilesDir(), filename + \".zip\");\n            if (zipFile.exists()) {\n                Timber.d(\"Delete unzipped local zip file \" + zipFile);\n                zipFile.delete();\n            }\n        }\n\n        return null;\n    }\n\n    public void exportTrainingPlan(TrainingPlan trainingPlan, Uri zipFileUri) {\n        Timber.d(\"Export training plan \" + trainingPlan.getName());\n\n        try {\n            String zipFileDisplayName = getDisplayName(zipFileUri);\n\n            trainingDir = new File(context.getFilesDir(), trainingPlan.getName());\n            trainingImageDir = new File(context.getFilesDir(), trainingPlan.getName()+\"/image\");\n            trainingVideoDir = new File(context.getFilesDir(), trainingPlan.getName()+ \"/video\");\n\n            if (trainingDir.exists()) {\n                deleteDirectory(trainingDir);\n            }\n\n            trainingDir.mkdir();\n            trainingImageDir.mkdir();\n            trainingVideoDir.mkdir();\n\n            trainingPlan.setTrainingPlanId(0);\n\n            if (trainingPlan.isImagePathExternal()) {\n                trainingPlan.setImagePath(copyImageToInternalStorage(trainingPlan.getImagePath()));\n            }\n\n            for (WorkoutSession workoutSession : trainingPlan.getWorkoutSessions()) {\n                workoutSession.setWorkoutSessionId(0);\n\n                for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                    workoutItem.setWorkoutItemId(0);\n\n                   if (workoutItem.isImagePathExternal()) {\n                       workoutItem.setImagePath(copyImageToInternalStorage(workoutItem.getImagePath()));\n                   }\n\n                   if (workoutItem.isVideoPathExternal()) {\n                       workoutItem.setVideoPath(copyVideoToInternalStorage(workoutItem.getVideoPath()));\n                   }\n                }\n            }\n\n            String jsonString = gson.toJson(trainingPlan);\n            File trainingDatabase = new File(trainingDir, \"database.json\");\n            FileOutputStream jsonOut = new FileOutputStream(trainingDatabase);\n            jsonOut.write(jsonString.getBytes());\n            jsonOut.close();\n            Timber.d(\"Written database.json\");\n\n            zipDirectory(trainingDir, zipFileUri);\n            Timber.d(\"Zipped \" + trainingPlan.getName());\n            deleteDirectory(trainingDir);\n            Toast.makeText(context, String.format(context.getString(R.string.label_info_exported), trainingPlan.getName(), zipFileDisplayName), Toast.LENGTH_LONG).show();\n        }catch (IOException ex) {\n            Toast.makeText(context, ex.getLocalizedMessage(), Toast.LENGTH_LONG).show();\n\n            Timber.e(ex);\n        }\n    }\n\n    private String copyImageToInternalStorage(String imagePath) throws IOException {\n        Uri fileUri = Uri.parse(imagePath);\n        String displayName = getDisplayName(fileUri);\n        File trainingImg = new File(trainingImageDir, displayName);\n\n        if (!trainingImg.exists()) {\n            InputStream in = context.getContentResolver().openInputStream(fileUri);\n            FileOutputStream out = new FileOutputStream(trainingImg);\n\n            copyFile(in, out);\n\n            Timber.d(\"Copied file \" + displayName + \" to internal storage\");\n        }\n\n        return Uri.fromFile(trainingImg).toString();\n    }\n\n    private String copyVideoToInternalStorage(String videoPath) throws IOException {\n        Uri fileUri = Uri.parse(videoPath);\n        String displayName = getDisplayName(fileUri);\n        File trainingVideo = new File(trainingVideoDir, displayName);\n\n        if (!trainingVideo.exists()) {\n            InputStream in = context.getContentResolver().openInputStream(fileUri);\n            FileOutputStream out = new FileOutputStream(trainingVideo);\n\n            copyFile(in, out);\n\n            Timber.d(\"Copied file \" + displayName + \" to internal storage\");\n        }\n\n        return Uri.fromFile(trainingVideo).toString();\n    }\n\n    private void copyFile(InputStream in, OutputStream out) throws IOException {\n        byte[] buffer = new byte[1024];\n        int read;\n        while ((read = in.read(buffer)) != -1) {\n            out.write(buffer, 0, read);\n        }\n\n        in.close();\n        out.flush();\n        out.close();\n    }\n\n    private String getDisplayName(File file) {\n        String displayName = file.getName();\n\n        if (displayName.endsWith(\".zip\")) {\n            displayName = displayName.substring(0, displayName.length() - 4);\n        }\n\n        return displayName;\n    }\n\n    private String getDisplayName(Uri uri) {\n        String displayName = new String();\n        String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME};\n\n        Cursor metaCursor = context.getContentResolver().query(uri, projection, null, null, null);\n        if (metaCursor != null) {\n            try {\n                if (metaCursor.moveToFirst()) {\n                    displayName = metaCursor.getString(0);\n                }\n            } finally {\n                metaCursor.close();\n            }\n        }\n\n        if (displayName.endsWith(\".zip\")) {\n            displayName = displayName.substring(0, displayName.length() - 4);\n        }\n\n        return displayName;\n    }\n\n    private void zipDirectory(File directoryToCompress, Uri outputFile) throws IOException {\n        OutputStream dest = context.getContentResolver().openOutputStream(outputFile);\n        ZipOutputStream zipOutputStream = new ZipOutputStream(dest);\n\n        compressDirectory(directoryToCompress, directoryToCompress, zipOutputStream);\n        zipOutputStream.close();\n    }\n\n    private void compressDirectory(File rootDirectory, File currentDirectory, ZipOutputStream out) throws IOException {\n        byte[] data = new byte[2048];\n\n        File[] files = currentDirectory.listFiles();\n\n        if (files != null) {\n            for (File file : files) {\n                if (file.isDirectory()) {\n                    compressDirectory(rootDirectory, file, out);\n                } else {\n                    FileInputStream fi = new FileInputStream(file);\n                    // creating structure and avoiding duplicate file names\n                    String name = file.getAbsolutePath().replace(rootDirectory.getAbsolutePath(), \"\");\n\n                    ZipEntry entry = new ZipEntry(name);\n                    out.putNextEntry(entry);\n                    int count;\n                    BufferedInputStream origin = new BufferedInputStream(fi, 2048);\n                    while ((count = origin.read(data, 0, 2048)) != -1) {\n                        out.write(data, 0, count);\n                    }\n                    origin.close();\n                }\n            }\n        }\n    }\n\n    private void unzipFile(Uri zipFileUri, String filename) throws IOException {\n        InputStream in = context.getContentResolver().openInputStream(zipFileUri);\n        ZipInputStream zipIn = new ZipInputStream(in);\n\n        File rootDir = new File(context.getFilesDir(),  filename);\n        rootDir.mkdir();\n\n        ZipEntry entry = zipIn.getNextEntry();\n        // iterates over entries in the zip file\n        while (entry != null) {\n            File zipOut = new File(context.getFilesDir(),  filename + \"/\" + entry.getName());\n\n            if (!entry.isDirectory()) {\n                zipOut.getParentFile().mkdir();\n                // if the entry is a file, extracts it\n                extractFile(zipIn, zipOut);\n                Timber.d(\"Extract file \" + entry.getName());\n            } else {\n                zipOut.mkdir();\n                Timber.d(\"Extract folder \" + entry.getName());\n            }\n            zipIn.closeEntry();\n\n            entry = zipIn.getNextEntry();\n        }\n        zipIn.close();\n    }\n\n    private void extractFile(ZipInputStream zipIn, File fileOutput) throws IOException {\n        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileOutput));\n        byte[] bytesIn = new byte[2048];\n        int read = 0;\n        while ((read = zipIn.read(bytesIn)) != -1) {\n            bos.write(bytesIn, 0, read);\n        }\n        bos.flush();\n        bos.close();\n    }\n\n    private void deleteDirectory(File fileOrDirectory) {\n        if (fileOrDirectory.isDirectory())\n            for (File child : fileOrDirectory.listFiles())\n                deleteDirectory(child);\n\n        fileOrDirectory.delete();\n    }\n\n    public void getGitHubFiles() {\n        Call<List<GitHubFile>> gitHubFileList = gitHubApi.getFileList();\n\n        gitHubFileList.enqueue(new Callback<List<GitHubFile>>() {\n            @Override\n            public void onResponse(Call<List<GitHubFile>> call, Response<List<GitHubFile>> response) {\n                if (response.isSuccessful()) {\n                    Timber.d(\"Successful file list from GitHub received\");\n\n                    if (onGitHubCallbackListener != null) {\n                        onGitHubCallbackListener.onGitHubFileList(response.body());\n                    }\n                } else {\n                    Timber.e(\"Get GitHub file list error\");\n                }\n            }\n\n            @Override\n            public void onFailure(Call<List<GitHubFile>> call, Throwable t) {\n                onGitHubCallbackListener.onGitHubFailure(new Exception(context.getString(R.string.error_no_github_connection)));\n                Timber.e(\"GitHub call failed \" + t.getMessage());\n            }\n        });\n    }\n\n    public void downloadFile(GitHubFile gitHubFile) {\n        Call<ResponseBody> downloadFile = gitHubApi.downloadFile(gitHubFile.getDownloadURL());\n\n        downloadFile.enqueue(new Callback<ResponseBody>() {\n            @Override\n            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {\n                if (response.isSuccessful()) {\n                    new AsyncTask<Void, Void, Void>() {\n                        @Override\n                        protected Void doInBackground(Void... voids) {\n                            boolean writtenToDisk = writeResponseBodyToDisk(gitHubFile.getName(), gitHubFile.getSize(), response.body());\n\n                            if (writtenToDisk) {\n                                if (onGitHubCallbackListener != null) {\n                                    Timber.d(\"Successful \" + gitHubFile.getName() + \" file downloaded from \" + gitHubFile.getDownloadURL());\n                                    onGitHubCallbackListener.onGitHubDownloadFile(new File(context.getFilesDir(), gitHubFile.getName()));\n                                }\n                            }\n                            return null;\n                        }\n                    }.execute();\n                } else {\n                    Timber.e(\"Download failed for URL \" + gitHubFile.getDownloadURL());\n                }\n            }\n\n            @Override\n            public void onFailure(Call<ResponseBody> call, Throwable t) {\n                onGitHubCallbackListener.onGitHubFailure(new Exception(context.getString(R.string.error_no_github_download) + \"(\" + t.getMessage() + \")\"));\n                Timber.e(\"Download failed \" + t.getMessage());\n            }\n        });\n    }\n\n    private boolean writeResponseBodyToDisk(final String filename, final long fileSize, final ResponseBody body) {\n        try {\n            File zipFile = new File(context.getFilesDir(), filename);\n\n            InputStream inputStream = null;\n            OutputStream outputStream = null;\n\n            try {\n                byte[] fileReader = new byte[4096];\n\n                long fileSizeDownloaded = 0;\n\n                inputStream = body.byteStream();\n                outputStream = new FileOutputStream(zipFile);\n\n                while (true) {\n                    int read = inputStream.read(fileReader);\n\n                    if (read == -1) {\n                        break;\n                    }\n\n                    outputStream.write(fileReader, 0, read);\n\n                    fileSizeDownloaded += read;\n\n                    if (onGitHubCallbackListener != null) {\n                        onGitHubCallbackListener.onGitHubDownloadProgressUpdate(fileSizeDownloaded, fileSize);\n                    }\n                }\n\n                outputStream.flush();\n\n                if (onGitHubCallbackListener != null) {\n                    onGitHubCallbackListener.onGitHubDownloadProgressUpdate(fileSizeDownloaded, fileSize);\n                }\n\n                return true;\n            } catch (IOException e) {\n                Timber.e(\"Error writing to disk \" + e);\n                return false;\n            } finally {\n                if (inputStream != null) {\n                    inputStream.close();\n                }\n\n                if (outputStream != null) {\n                    outputStream.close();\n                }\n            }\n        } catch (IOException e) {\n            Timber.e(\"Error writing to disk \" + e);\n            return false;\n        }\n    }\n\n    public void setOnGitHubCallbackListener(OnGitHubCallbackListener onGitHubCallbackListener) {\n        this.onGitHubCallbackListener = onGitHubCallbackListener;\n    }\n\n    public interface OnGitHubCallbackListener {\n        void onGitHubFileList(List<GitHubFile> gitHubFileList);\n        void onGitHubDownloadFile(File uriFilename);\n        void onGitHubDownloadProgressUpdate(long bytesDownloaded, long bytesTotal);\n        void onGitHubFailure(Exception ex);\n    }\n\n    private interface GitHubApi {\n        @GET(\"repos/oliexdev/openWorkout/contents/pkg\")\n        Call<List<GitHubFile>> getFileList();\n        @Streaming\n        @GET\n        Call<ResponseBody> downloadFile(@Url String fileUrl);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/AbdominalCrunch.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class AbdominalCrunch extends WorkoutItem {\n    public AbdominalCrunch() {\n        super();\n        setName(getContext().getString(R.string.workout_name_abdominal_crunch));\n        setDescription(getContext().getString(R.string.workout_description_abdominal_crunch));\n        setImagePath(\"abdonminal_crunch.png\");\n        setVideoPath(\"abdonminal_crunch.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/AirSquatBentArms.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class AirSquatBentArms extends WorkoutItem {\n    public AirSquatBentArms() {\n        super();\n        setName(getContext().getString(R.string.workout_name_air_squad_bent_arms));\n        setDescription(getContext().getString(R.string.workout_description_air_squad_bent_arms));\n        setImagePath(\"air_squad_bent_arms.png\");\n        setVideoPath(\"air_squad_bent_arms.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/BicycleCrunch.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class BicycleCrunch extends WorkoutItem {\n    public BicycleCrunch() {\n        super();\n        setName(getContext().getString(R.string.workout_name_bicycle_crunch));\n        setDescription(getContext().getString(R.string.workout_description_bicycle_crunch));\n        setImagePath(\"bicycle_crunch.png\");\n        setVideoPath(\"bicycle_crunch.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/BoxJump.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class BoxJump extends WorkoutItem {\n    public BoxJump() {\n        super();\n        setName(getContext().getString(R.string.workout_name_box_jump));\n        setDescription(getContext().getString(R.string.workout_description_box_jump));\n        setImagePath(\"box_jump.png\");\n        setVideoPath(\"box_jump.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/Burpee.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class Burpee extends WorkoutItem {\n    public Burpee() {\n        super();\n        setName(getContext().getString(R.string.workout_name_burpee));\n        setDescription(getContext().getString(R.string.workout_description_burpee));\n        setImagePath(\"burpee.png\");\n        setVideoPath(\"burpee.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/CircleCrunch.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class CircleCrunch extends WorkoutItem {\n    public CircleCrunch() {\n        super();\n        setName(getContext().getString(R.string.workout_name_circle_crunch));\n        setDescription(getContext().getString(R.string.workout_description_circle_crunch));\n        setImagePath(\"circle_crunch.png\");\n        setVideoPath(\"circle_crunch.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/CrossJumps.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class CrossJumps extends WorkoutItem {\n    public CrossJumps() {\n        super();\n        setName(getContext().getString(R.string.workout_name_cross_jump));\n        setDescription(getContext().getString(R.string.workout_description_cross_jump));\n        setImagePath(\"cross_jump.png\");\n        setVideoPath(\"cross_jump.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/CrossJumpsRotation.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class CrossJumpsRotation extends WorkoutItem {\n    public CrossJumpsRotation() {\n        super();\n        setName(getContext().getString(R.string.workout_name_cross_jump_rotation));\n        setDescription(getContext().getString(R.string.workout_description_cross_jump_rotation));\n        setImagePath(\"cross_jump_rotation.png\");\n        setVideoPath(\"cross_jump_rotation.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/DonkeyKick.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class DonkeyKick extends WorkoutItem {\n    public DonkeyKick() {\n        super();\n        setName(getContext().getString(R.string.workout_name_donkey_kick));\n        setDescription(getContext().getString(R.string.workout_description_donkey_kick));\n        setImagePath(\"donkey_kick.png\");\n        setVideoPath(\"donkey_kick.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/HighKnees.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class HighKnees extends WorkoutItem {\n    public HighKnees() {\n        super();\n        setName(getContext().getString(R.string.workout_name_high_knees));\n        setDescription(getContext().getString(R.string.workout_description_high_knees));\n        setImagePath(\"high_knees.png\");\n        setVideoPath(\"high_knees.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/JumpPushUps.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class JumpPushUps extends WorkoutItem {\n    public JumpPushUps() {\n        super();\n        setName(getContext().getString(R.string.workout_name_jump_push_ups));\n        setDescription(getContext().getString(R.string.workout_description_jump_push_ups));\n        setImagePath(\"jump_push_ups.png\");\n        setVideoPath(\"jump_push_ups.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/JumpingJack.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class JumpingJack extends WorkoutItem {\n    public JumpingJack() {\n        super();\n        setName(getContext().getString(R.string.workout_name_jumping_jack));\n        setDescription(getContext().getString(R.string.workout_description_jumping_jack));\n        setImagePath(\"jumping_jack.png\");\n        setVideoPath(\"jumping_jack.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/Lunge.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class Lunge extends WorkoutItem {\n    public Lunge() {\n        super();\n        setName(getContext().getString(R.string.workout_name_lunge));\n        setDescription(getContext().getString(R.string.workout_description_lunge));\n        setImagePath(\"lunge.png\");\n        setVideoPath(\"lunge.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/LungeKick.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class LungeKick extends WorkoutItem {\n    public LungeKick() {\n        super();\n        setName(getContext().getString(R.string.workout_name_lunge_kick));\n        setDescription(getContext().getString(R.string.workout_description_lunge_kick));\n        setImagePath(\"lunge_kick.png\");\n        setVideoPath(\"lunge_kick.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/MountainClimbers.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class MountainClimbers extends WorkoutItem {\n    public MountainClimbers() {\n        super();\n        setName(getContext().getString(R.string.workout_name_mountain_climbers));\n        setDescription(getContext().getString(R.string.workout_description_mountain_climbers));\n        setImagePath(\"mountain_climbers.png\");\n        setVideoPath(\"mountain_climbers.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/PikeWalk.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class PikeWalk extends WorkoutItem {\n    public PikeWalk() {\n        super();\n        setName(getContext().getString(R.string.workout_name_pike_walk));\n        setDescription(getContext().getString(R.string.workout_description_pike_walk));\n        setImagePath(\"pike_walk.png\");\n        setVideoPath(\"pike_walk.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/Plank.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class Plank extends WorkoutItem {\n    public Plank() {\n        super();\n        setName(getContext().getString(R.string.workout_name_plank));\n        setDescription(getContext().getString(R.string.workout_description_plank));\n        setImagePath(\"plank.png\");\n        setVideoPath(\"plank.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/PushUpRotation.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class PushUpRotation extends WorkoutItem {\n    public PushUpRotation() {\n        super();\n        setName(getContext().getString(R.string.workout_name_push_up_rotation));\n        setDescription(getContext().getString(R.string.workout_description_push_up_rotation));\n        setImagePath(\"push_up_rotation.png\");\n        setVideoPath(\"push_up_rotation.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/PushUps.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class PushUps extends WorkoutItem {\n    public PushUps() {\n        super();\n        setName(getContext().getString(R.string.workout_name_push_ups));\n        setDescription(getContext().getString(R.string.workout_description_push_ups));\n        setImagePath(\"push_ups.png\");\n        setVideoPath(\"push_ups.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/QuickSteps.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class QuickSteps extends WorkoutItem {\n    public QuickSteps() {\n        super();\n        setName(getContext().getString(R.string.workout_name_quick_steps));\n        setDescription(getContext().getString(R.string.workout_description_quick_steps));\n        setImagePath(\"quick_steps.png\");\n        setVideoPath(\"quick_steps.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/RussianTwist.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class RussianTwist extends WorkoutItem {\n    public RussianTwist() {\n        super();\n        setName(getContext().getString(R.string.workout_name_russian_twist));\n        setDescription(getContext().getString(R.string.workout_description_russian_twist));\n        setImagePath(\"russian_twist.png\");\n        setVideoPath(\"russian_twist.mp4\");\n        setTimeMode(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/SidePlank.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class SidePlank extends WorkoutItem {\n    public SidePlank() {\n        super();\n        setName(getContext().getString(R.string.workout_name_side_plank));\n        setDescription(getContext().getString(R.string.workout_description_side_plank));\n        setImagePath(\"side_plank.png\");\n        setVideoPath(\"side_plank.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/Squat.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class Squat extends WorkoutItem {\n    public Squat() {\n        super();\n        setName(getContext().getString(R.string.workout_name_squat));\n        setDescription(getContext().getString(R.string.workout_description_squat));\n        setImagePath(\"squad.png\");\n        setVideoPath(\"squad.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/StepUp.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class StepUp extends WorkoutItem {\n    public StepUp() {\n        super();\n        setName(getContext().getString(R.string.workout_name_step_up));\n        setDescription(getContext().getString(R.string.workout_description_step_up));\n        setImagePath(\"step_up.png\");\n        setVideoPath(\"step_up.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/TricepsDip.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class TricepsDip extends WorkoutItem {\n    public TricepsDip() {\n        super();\n        setName(getContext().getString(R.string.workout_name_triceps_dip));\n        setDescription(getContext().getString(R.string.workout_description_triceps_dip));\n        setImagePath(\"tricep_dips.png\");\n        setVideoPath(\"tricep_dips.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/WallSit.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\npublic class WallSit extends WorkoutItem {\n    public WallSit() {\n        super();\n        setName(getContext().getString(R.string.workout_name_wall_sit));\n        setDescription(getContext().getString(R.string.workout_description_wall_sit));\n        setImagePath(\"wall_sit.png\");\n        setVideoPath(\"wall_sit.mp4\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/core/workout/WorkoutFactory.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.core.workout;\n\nimport com.health.openworkout.core.datatypes.WorkoutItem;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class WorkoutFactory {\n    public List<WorkoutItem> getAllWorkoutItems() {\n        List<WorkoutItem> workoutItemList = new ArrayList<>();\n\n        workoutItemList.add(new AbdominalCrunch());\n        workoutItemList.add(new AirSquatBentArms());\n        workoutItemList.add(new BicycleCrunch());\n        workoutItemList.add(new BoxJump());\n        workoutItemList.add(new Burpee());\n        workoutItemList.add(new CircleCrunch());\n        workoutItemList.add(new CrossJumps());\n        workoutItemList.add(new CrossJumpsRotation());\n        workoutItemList.add(new HighKnees());\n        workoutItemList.add(new JumpingJack());\n        workoutItemList.add(new JumpPushUps());\n        workoutItemList.add(new Lunge());\n        workoutItemList.add(new PikeWalk());\n        workoutItemList.add(new Plank());\n        workoutItemList.add(new PushUpRotation());\n        workoutItemList.add(new PushUps());\n        workoutItemList.add(new QuickSteps());\n        workoutItemList.add(new SidePlank());\n        workoutItemList.add(new Squat());\n        workoutItemList.add(new StepUp());\n        workoutItemList.add(new TricepsDip());\n        workoutItemList.add(new WallSit());\n        workoutItemList.add(new DonkeyKick());\n        workoutItemList.add(new LungeKick());\n        workoutItemList.add(new MountainClimbers());\n        workoutItemList.add(new RussianTwist());\n\n        return workoutItemList;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/datatypes/GenericAdapter.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.datatypes;\n\nimport android.content.Context;\nimport android.view.MenuItem;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.PopupMenu;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.health.openworkout.R;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\n\nimport timber.log.Timber;\n\npublic abstract class GenericAdapter<VH extends GenericAdapter.ViewHolder> extends RecyclerView.Adapter<VH> {\n    private GenericFragment.FRAGMENT_MODE mode;\n    private Context context;\n    private static OnGenericClickListener onDefaultClickListener;\n    private static OnGenericClickListener onEditClickListener;\n    private static OnGenericClickListener onDeleteClickListener;\n    private static OnGenericClickListener onReorderClickListener;\n    private static OnGenericClickListener onDuplicateClickListener;\n    private static OnGenericClickListener onPublishClickListener;\n    private static OnGenericClickListener onExportClickListener;\n\n    public GenericAdapter(Context aContext) {\n        this.mode = GenericFragment.FRAGMENT_MODE.VIEW;\n        this.context = aContext;\n    }\n\n    public void setMode(GenericFragment.FRAGMENT_MODE mode) {\n        this.mode = mode;\n    }\n\n    public GenericFragment.FRAGMENT_MODE getMode() {\n        return mode;\n    }\n\n    public abstract VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType);\n    abstract public long getItemId(int position);\n    abstract public int getItemCount();\n\n    @Override\n    public void onBindViewHolder(@NonNull VH holder, int position) {\n        switch (mode) {\n            case VIEW:\n                holder.reorderView.setVisibility(View.GONE);\n                holder.optionView.setVisibility(View.GONE);\n                holder.editView.setVisibility(View.GONE);\n                break;\n            case EDIT:\n                holder.reorderView.setVisibility(View.VISIBLE);\n                holder.optionView.setVisibility(View.VISIBLE);\n                holder.editView.setVisibility(View.VISIBLE);\n                break;\n        }\n    }\n\n    public void setOnItemClickListener(OnGenericClickListener onWorkoutClickListener) {\n        this.onDefaultClickListener = onWorkoutClickListener;\n    }\n\n    public void setOnItemEditClickListener(OnGenericClickListener onEditClickListener) {\n        this.onEditClickListener = onEditClickListener;\n    }\n\n    public void setOnItemDeleteClickListener(OnGenericClickListener onDeleteClickListener) {\n        this.onDeleteClickListener = onDeleteClickListener;\n    }\n\n    public void setOnItemReorderClickListener(OnGenericClickListener onReorderClickListener) {\n        this.onReorderClickListener = onReorderClickListener;\n    }\n\n    public void setOnItemDuplicateClickListener(OnGenericClickListener onDuplicateClickListener) {\n        this.onDuplicateClickListener = onDuplicateClickListener;\n    }\n\n    public void setOnItemPublishClickListener(OnGenericClickListener onPublishClickListener) {\n        this.onPublishClickListener = onPublishClickListener;\n    }\n\n    public void setOnItemExportClickListener(OnGenericClickListener onExportClickListener) {\n        this.onExportClickListener = onExportClickListener;\n    }\n\n    public static class ViewHolder extends RecyclerView.ViewHolder implements PopupMenu.OnMenuItemClickListener {\n        ImageView reorderView;\n        ImageView optionView;\n        ImageView editView;\n        PopupMenu popupMenu;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            reorderView = itemView.findViewById(R.id.reorderView);\n            optionView = itemView.findViewById(R.id.optionView);\n            editView = itemView.findViewById(R.id.editView);\n\n            popupMenu = new PopupMenu(itemView.getContext(), optionView);\n            showForcePopupMenuIcons(popupMenu);\n            popupMenu.setOnMenuItemClickListener(this);\n            popupMenu.getMenuInflater().inflate(R.menu.item_menu, popupMenu.getMenu());\n\n            itemView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    if (onDefaultClickListener != null) {\n                        onDefaultClickListener.onItemClick(getAdapterPosition(), v);\n                    }\n                }\n            });\n\n            optionView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    popupMenu.show();\n                }\n            });\n\n            editView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    if (onEditClickListener != null) {\n                        onEditClickListener.onItemClick(getAdapterPosition(), v);\n                    }\n                }\n            });\n\n            reorderView.setOnTouchListener(new View.OnTouchListener() {\n                @Override\n                public boolean onTouch(View v, MotionEvent event) {\n                    if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                        if (onReorderClickListener != null) {\n                            onReorderClickListener.onItemClick(getAdapterPosition(), v);\n                        }\n                    }\n                    return false;\n                }\n            });\n        }\n\n        public void setPublishVisible(boolean isVisible) {\n            popupMenu.getMenu().findItem(R.id.publish).setVisible(isVisible);\n        }\n\n        public void setExportVisible(boolean isVisible) {\n            popupMenu.getMenu().findItem(R.id.export).setVisible(isVisible);\n        }\n\n        @Override\n        public boolean onMenuItemClick(MenuItem item) {\n            switch (item.getItemId()) {\n                case R.id.delete:\n                    if (onDeleteClickListener != null) {\n                        onDeleteClickListener.onItemClick(getAdapterPosition(), null);\n                    }\n                    return true;\n                case R.id.duplicate:\n                    if (onDuplicateClickListener != null) {\n                        onDuplicateClickListener.onItemClick(getAdapterPosition(), null);\n                    }\n                    return true;\n                case R.id.publish:\n                    if (onPublishClickListener != null) {\n                        onPublishClickListener.onItemClick(getAdapterPosition(), null);\n                    }\n                    return true;\n                case R.id.export:\n                    if (onExportClickListener != null) {\n                        onExportClickListener.onItemClick(getAdapterPosition(), null);\n                    }\n                    return true;\n            }\n\n\n            return false;\n        }\n    }\n\n    public interface OnGenericClickListener {\n        public void onItemClick(int position, View v);\n    }\n\n    private static void showForcePopupMenuIcons(PopupMenu popupMenu) {\n        try {\n            Field[] fields = popupMenu.getClass().getDeclaredFields();\n            for (Field field : fields) {\n                if (\"mPopup\".equals(field.getName())) {\n                    field.setAccessible(true);\n                    Object menuPopupHelper = field.get(popupMenu);\n                    Class<?> classPopupHelper = Class.forName(menuPopupHelper\n                            .getClass().getName());\n                    Method setForceIcons = classPopupHelper.getMethod(\n                            \"setForceShowIcon\", boolean.class);\n                    setForceIcons.invoke(menuPopupHelper, true);\n                    break;\n                }\n            }\n        } catch (Exception ex) {\n            Timber.e(ex);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/datatypes/GenericFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.datatypes;\n\nimport android.content.DialogInterface;\nimport android.os.AsyncTask;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.ProgressBar;\nimport android.widget.Toast;\n\nimport androidx.annotation.Keep;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.health.openworkout.R;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic abstract class GenericFragment extends Fragment {\n    @Keep\n    public enum FRAGMENT_MODE {VIEW, EDIT}\n\n    private FRAGMENT_MODE mode = FRAGMENT_MODE.VIEW;\n\n    private ItemTouchHelper touchHelper;\n\n    private MenuItem saveMenu;\n    private MenuItem editMenu;\n\n    public GenericFragment() {\n        setHasOptionsMenu(true);\n\n        touchHelper = new ItemTouchHelper(new ItemTouchHelper\n                .SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT, ItemTouchHelper.ACTION_STATE_IDLE) {\n\n            @Override\n            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {\n                int from = viewHolder.getAdapterPosition();\n                int to = target.getAdapterPosition();\n\n                Collections.swap(getItemList(), from, to);\n                getAdapter().notifyItemMoved(from, to);\n                return true;\n            }\n\n            @Override\n            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {\n            }\n\n            @Override\n            public boolean isLongPressDragEnabled() {\n                return false;\n            }\n        });\n    }\n\n    public FRAGMENT_MODE getMode() {\n        return mode;\n    }\n\n    protected abstract String getTitle();\n    protected abstract void loadFromDatabase();\n    protected abstract void saveToDatabase();\n    protected abstract GenericAdapter getAdapter();\n    protected abstract RecyclerView getRecyclerView();\n    protected abstract List getItemList();\n    protected abstract void onSelectCallback(int position);\n    protected abstract void onEditCallback(int position);\n    protected abstract void onDuplicateCallback(int position);\n    protected abstract void onDeleteCallback(int position);\n    protected abstract void onResetClick();\n    protected void onPublishClick(int position) {};\n    protected void onExportClick(int position) {};\n\n    private ProgressBar getProgressBar() {\n        if (getView() != null) {\n            return getView().findViewById(R.id.progressBar);\n        }\n\n        return null;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n    }\n\n    @Override\n    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {\n        inflater.inflate(R.menu.fragment_menu, menu);\n\n        saveMenu = menu.findItem(R.id.save);\n        editMenu = menu.findItem(R.id.edit);\n\n        refreshMenuVisibility();\n\n        super.onCreateOptionsMenu(menu, inflater);\n    }\n\n    private void refreshMenuVisibility() {\n        switch (mode) {\n            case VIEW:\n                saveMenu.setVisible(false);\n                editMenu.setVisible(true);\n                break;\n            case EDIT:\n                saveMenu.setVisible(true);\n                editMenu.setVisible(false);\n                break;\n        }\n\n        if (mode == GenericFragment.FRAGMENT_MODE.VIEW) {\n            touchHelper.attachToRecyclerView(null);\n\n            getAdapter().setOnItemClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(int position, View v) {\n                    if (position != -1) {\n                        onSelectCallback(position);\n                    }\n                }\n            });\n        }\n\n        if (mode == GenericFragment.FRAGMENT_MODE.EDIT) {\n            getAdapter().setOnItemClickListener(null);\n\n            touchHelper.attachToRecyclerView(getRecyclerView());\n\n            getAdapter().setOnItemEditClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(int position, View v) {\n                    if (position != -1) {\n                        onEditCallback(position);\n                    }\n                }\n            });\n\n            getAdapter().setOnItemDuplicateClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(final int position, View v) {\n                    if (position != -1) {\n                        getProgressBar().setVisibility(View.VISIBLE);\n                        getAdapter().notifyItemInserted(position+1);\n                        new AsyncTask<Void, Void, Void>() {\n                            @Override\n                            protected Void doInBackground(Void ... params) {\n                                onDuplicateCallback(position);\n                                return null;\n                            }\n\n                            @Override\n                            protected void onPostExecute(Void o) {\n                                if (getProgressBar() != null) {\n                                    getProgressBar().setVisibility(View.GONE);\n                                }\n                            }\n                        }.execute();\n                    }\n                }\n            });\n\n            getAdapter().setOnItemDeleteClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(int position, View v) {\n                    if (position != -1) {\n                        getAdapter().notifyItemRemoved(position);\n\n                        onDeleteCallback(position);\n                    }\n                }\n            });\n\n            getAdapter().setOnItemReorderClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(int position, View v) {\n                    if (position != -1) {\n                        touchHelper.startDrag(getRecyclerView().findViewHolderForLayoutPosition(position));\n                    }\n                }\n            });\n\n            getAdapter().setOnItemPublishClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(int position, View v) {\n                    if (position != -1) {\n                        onPublishClick(position);\n                    }\n                }\n            });\n\n            getAdapter().setOnItemExportClickListener(new GenericAdapter.OnGenericClickListener() {\n                @Override\n                public void onItemClick(int position, View v) {\n                    if (position != -1) {\n                        onExportClick(position);\n                    }\n                }\n            });\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.edit:\n                mode = GenericFragment.FRAGMENT_MODE.EDIT;\n                getAdapter().setMode(mode);\n                refreshMenuVisibility();\n                loadFromDatabase();\n                return true;\n            case R.id.save:\n                mode = GenericFragment.FRAGMENT_MODE.VIEW;\n                getAdapter().setMode(mode);\n                refreshMenuVisibility();\n                saveToDatabase();\n                loadFromDatabase();\n                Toast.makeText(getContext(), String.format(getString(R.string.label_save_toast), getTitle()), Toast.LENGTH_SHORT).show();\n                return true;\n            case R.id.reset:\n                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());\n\n                DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        switch (which){\n                            case DialogInterface.BUTTON_POSITIVE:\n                                getProgressBar().setVisibility(View.VISIBLE);\n                                new AsyncTask<Void, Void, Void>() {\n                                    @Override\n                                    protected Void doInBackground(Void ... params) {\n                                        onResetClick();\n                                        return null;\n                                    }\n\n                                    @Override\n                                    protected void onPostExecute(Void o) {\n                                        if (getProgressBar() != null) {\n                                            getProgressBar().setVisibility(View.GONE);\n                                        }\n                                        loadFromDatabase();\n\n                                        Toast.makeText(getActivity(), String.format(getString(R.string.label_reset_toast), getTitle()), Toast.LENGTH_SHORT).show();\n                                    }\n                                }.execute();\n                                break;\n                            case DialogInterface.BUTTON_NEGATIVE:\n                                //No button clicked\n                                break;\n                        }\n                    }\n                };\n\n                builder.setMessage(getString(R.string.label_really_reset_dialog)).setPositiveButton(getString(R.string.label_ok), dialogClickListener)\n                        .setNegativeButton(getString(R.string.label_cancel), dialogClickListener).show();\n\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/datatypes/GenericSettingsFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.datatypes;\n\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.Toast;\n\nimport androidx.annotation.Keep;\nimport androidx.fragment.app.Fragment;\nimport androidx.navigation.Navigation;\n\nimport com.health.openworkout.R;\n\nimport static android.content.Context.INPUT_METHOD_SERVICE;\n\npublic abstract class GenericSettingsFragment extends Fragment {\n    @Keep\n    public enum SETTING_MODE {EDIT, ADD}\n\n    private SETTING_MODE mode = SETTING_MODE.EDIT;\n\n    public GenericSettingsFragment() {\n        setHasOptionsMenu(true);\n    }\n\n    protected abstract String getTitle();\n    protected abstract void loadFromDatabase(SETTING_MODE mode);\n    protected abstract boolean saveToDatabase(SETTING_MODE mode);\n\n    protected void setMode(SETTING_MODE mode) {\n        this.mode = mode;\n        loadFromDatabase(mode);\n    }\n\n    protected SETTING_MODE getMode() {\n        return mode;\n    }\n\n    @Override\n    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {\n        inflater.inflate(R.menu.fragment_menu, menu);\n\n        MenuItem editMenu = menu.findItem(R.id.edit);\n        editMenu.setVisible(false);\n\n        super.onCreateOptionsMenu(menu, inflater);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // close keyboard\n        if (getActivity().getCurrentFocus() != null) {\n            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(INPUT_METHOD_SERVICE);\n            imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);\n        }\n\n        switch (item.getItemId()) {\n            case R.id.save:\n                if (saveToDatabase(mode)) {\n                    Toast.makeText(getContext(), String.format(getString(R.string.label_save_toast), getTitle()), Toast.LENGTH_SHORT).show();\n                    Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigateUp();\n                }\n                return true;\n            case R.id.reset:\n                Toast.makeText(getContext(), String.format(getString(R.string.label_reset_toast), getTitle()), Toast.LENGTH_SHORT).show();\n                loadFromDatabase(mode);\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/datatypes/TrophyFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.datatypes;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.navigation.Navigation;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.utils.SoundUtils;\n\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.TimeZone;\n\npublic class TrophyFragment extends Fragment {\n\n    private TextView elapsedTimeView;\n    private Button okView;\n    private SoundUtils soundUtils;\n\n    private WorkoutSession workoutSession;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_trophy, container, false);\n\n        elapsedTimeView = root.findViewById(R.id.elapsedTimeView);\n        okView = root.findViewById(R.id.okView);\n\n        long workoutSessionId = TrophyFragmentArgs.fromBundle(getArguments()).getSessionWorkoutId();\n\n        workoutSession = OpenWorkout.getInstance().getWorkoutSession(workoutSessionId);\n\n        Calendar elapsedCalendar = Calendar.getInstance();\n\n        elapsedCalendar.setTimeInMillis(workoutSession.getElapsedSessionTime() * 1000);\n\n        DateFormat dateFormatter= SimpleDateFormat.getTimeInstance();\n        dateFormatter.setTimeZone(TimeZone.getTimeZone(\"UTC\"));\n\n        elapsedTimeView.setText(dateFormatter.format(elapsedCalendar.getTime()));\n\n        soundUtils = OpenWorkout.getInstance().getSoundUtils();\n        soundUtils.playSound(SoundUtils.SOUND.SESSION_COMPLETED);\n\n        okView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigateUp();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigateUp();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigateUp();\n            }\n        });\n\n        return root;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/home/HomeFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.home;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RadioGroup;\nimport android.widget.Spinner;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.navigation.NavDirections;\nimport androidx.navigation.Navigation;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.User;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\n\npublic class HomeFragment extends Fragment {\n    private ImageView startView;\n    private ImageView detailTrainingView;\n    private Spinner trainingNameView;\n    private ProgressBar sessionProgressBar;\n    private TextView sessionView;\n    private RadioGroup avatarGroup;\n\n    private OpenWorkout openWorkout;\n    private User user;\n    private TrainingPlan userTrainingPlan;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_home, container, false);\n\n        openWorkout = OpenWorkout.getInstance();\n\n        startView = root.findViewById(R.id.startView);\n\n        startView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                userTrainingPlan = openWorkout.getTrainingPlan(user.getTrainingsPlanId());\n\n                if (userTrainingPlan != null) {\n                    WorkoutSession nextUserWorkoutSession = userTrainingPlan.getNextWorkoutSession();\n                    if (nextUserWorkoutSession != null) {\n                        if (!nextUserWorkoutSession.getWorkoutItems().isEmpty()) {\n                            HomeFragmentDirections.ActionHomeFragmentToWorkoutFragmentSlide action = HomeFragmentDirections.actionHomeFragmentToWorkoutFragmentSlide();\n                            action.setTitle(nextUserWorkoutSession.getName());\n                            action.setSessionWorkoutId(nextUserWorkoutSession.getWorkoutSessionId());\n                            Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n                        } else {\n                            Toast.makeText(getContext(), String.format(getString(R.string.error_no_workout_items), nextUserWorkoutSession.getName()), Toast.LENGTH_SHORT).show();\n                        }\n                    } else {\n                        Toast.makeText(getContext(), String.format(getString(R.string.error_no_sessions), userTrainingPlan.getName()), Toast.LENGTH_SHORT).show();\n                    }\n                } else {\n                    Toast.makeText(getContext(), R.string.error_no_trainings, Toast.LENGTH_SHORT).show();\n                }\n            }\n        });\n\n        detailTrainingView = root.findViewById(R.id.detailTrainingView);\n        sessionProgressBar = root.findViewById(R.id.sessionProgressBar);\n        sessionView = root.findViewById(R.id.sessionView);\n        trainingNameView = root.findViewById(R.id.trainingNameView);\n\n        user = openWorkout.getCurrentUser();\n        userTrainingPlan = openWorkout.getTrainingPlan(user.getTrainingsPlanId());\n\n        //  if user training plan was deleted\n        if (userTrainingPlan == null) {\n            // abort if all training plans were deleted\n            if (openWorkout.getTrainingPlans().isEmpty()) {\n                return root;\n            } else {\n                // get the first one in training plan list and update user training plan id if exist\n                userTrainingPlan = openWorkout.getTrainingPlans().get(0);\n                user.setTrainingsPlanId(userTrainingPlan.getTrainingPlanId());\n                openWorkout.updateUser(user);\n            }\n        }\n\n        final ArrayAdapter<TrainingPlan> spinnerArrayAdapter = new ArrayAdapter<>(getActivity(), R.layout.support_simple_spinner_dropdown_item, openWorkout.getTrainingPlans());\n\n        spinnerArrayAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);\n        trainingNameView.setAdapter(spinnerArrayAdapter);\n        trainingNameView.setSelection(0,false);\n\n        trainingNameView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                TrainingPlan selectedTrainingPlan = spinnerArrayAdapter.getItem(position);\n\n                user.setTrainingsPlanId(selectedTrainingPlan.getTrainingPlanId());\n                openWorkout.updateUser(user);\n                updateProgressBar(selectedTrainingPlan);\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n\n        for (int i=0; i<spinnerArrayAdapter.getCount(); i++) {\n            if (userTrainingPlan.getTrainingPlanId() == spinnerArrayAdapter.getItem(i).getTrainingPlanId()) {\n                trainingNameView.setSelection(i);\n            }\n        }\n\n        avatarGroup = root.findViewById(R.id.avatarGroup);\n\n        if (user.isMale()) {\n            avatarGroup.check(R.id.radioMale);\n        } else {\n            avatarGroup.check(R.id.radioFemale);\n        }\n\n        avatarGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {\n            @Override\n            public void onCheckedChanged(RadioGroup group, int checkedId) {\n                int checkedRadioId = group.getCheckedRadioButtonId();\n\n                switch (checkedRadioId) {\n                    case R.id.radioMale:\n                        user.setMale(true);\n                        break;\n                    case R.id.radioFemale:\n                        user.setMale(false);\n                        break;\n                }\n\n                openWorkout.updateUser(user);\n            }\n        });\n\n        detailTrainingView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                NavDirections action = HomeFragmentDirections.actionHomeFragmentToTrainingFragment();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n            }\n        });\n\n        updateProgressBar(userTrainingPlan);\n\n        return root;\n    }\n\n    private void updateProgressBar(TrainingPlan trainingPlan) {\n        sessionView.setText(\"(\" + Integer.toString(trainingPlan.finishedSessionSize()) + \"/\" + trainingPlan.getWorkoutSessionSize()+\")\");\n        sessionProgressBar.setMax(trainingPlan.getWorkoutSessionSize());\n        sessionProgressBar.post(new Runnable() {\n            @Override\n            public void run() {\n                sessionProgressBar.setProgress(trainingPlan.finishedSessionSize());\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/preference/MainPreferences.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.preference;\n\nimport android.content.Intent;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.util.TypedValue;\n\nimport androidx.appcompat.app.AppCompatDelegate;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.graphics.drawable.DrawableCompat;\nimport androidx.navigation.NavDirections;\nimport androidx.navigation.Navigation;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceFragmentCompat;\nimport androidx.preference.PreferenceGroup;\nimport androidx.preference.SwitchPreferenceCompat;\n\nimport com.health.openworkout.BuildConfig;\nimport com.health.openworkout.R;\nimport com.health.openworkout.gui.utils.FileDialogHelper;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.PrintWriter;\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\nimport timber.log.Timber;\n\npublic class MainPreferences extends PreferenceFragmentCompat {\n    private FileDialogHelper fileDialogHelper;\n\n    @Override\n    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {\n        setPreferencesFromResource(R.xml.main_preferences, rootKey);\n\n        TypedValue typedValue = new TypedValue();\n        getContext().getTheme().resolveAttribute(R.attr.colorControlNormal, typedValue, true);\n        int color = ContextCompat.getColor(getContext(), typedValue.resourceId);\n\n        tintIcons(getPreferenceScreen(), color);\n\n        fileDialogHelper = new FileDialogHelper(this);\n\n        final SwitchPreferenceCompat prefDarkTheme = findPreference(\"darkTheme\");\n        prefDarkTheme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object newValue) {\n                if (!prefDarkTheme.isChecked()) {\n                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);\n                } else {\n                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);\n                }\n                return true;\n            }\n        });\n\n        final Preference prefReminder = findPreference(\"reminder\");\n        prefReminder.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                NavDirections action = MainPreferencesDirections.actionMainPreferencesFragmentToReminderPreferencesFragment();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n                return true;\n            }\n        });\n\n        final Preference prefSound= findPreference(\"sound\");\n        prefSound.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                NavDirections action = MainPreferencesDirections.actionMainPreferencesFragmentToSoundPreferencesFragment();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n                return true;\n            }\n        });\n\n        final SwitchPreferenceCompat prefDebugLogging = findPreference(\"debugLogging\");\n        prefDebugLogging.setChecked(getEnabledFileDebugTree() != null);\n        prefDebugLogging.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n            @Override\n            public boolean onPreferenceChange(Preference preference, Object newValue) {\n                if (!prefDebugLogging.isChecked()) {\n                    DateFormat format = new SimpleDateFormat(\"yyyy-MM-dd_HH-mm\");\n                    String fileName = String.format(\"openWorkout_%s.txt\", format.format(new Date()));\n\n                    fileDialogHelper.openDebugFileDialog(fileName);\n                } else {\n                    FileDebugTree tree = getEnabledFileDebugTree();\n                    if (tree != null) {\n                        Timber.d(\"Debug log disabled\");\n                        Timber.uproot(tree);\n                        tree.close();\n                    }\n                }\n\n                return true;\n            }\n        });\n\n        final Preference prefRemoveAd = findPreference(\"removeAd\");\n        prefRemoveAd.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {\n            @Override\n            public boolean onPreferenceClick(Preference preference) {\n                NavDirections action = MainPreferencesDirections.actionMainPreferencesFragmentToBillingFragment();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n                return true;\n            }\n        });\n\n        if (BuildConfig.FLAVOR == \"fdroid\") {\n            prefRemoveAd.setVisible(false);\n        } else {\n            prefRemoveAd.setVisible(true);\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        fileDialogHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);\n    }\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (fileDialogHelper.onActivityResult(requestCode, resultCode, data)) {\n            Uri uri = data.getData();\n\n            startLogTo(uri);\n        }\n    }\n\n    private void startLogTo(Uri uri) {\n        try {\n            OutputStream output = getActivity().getContentResolver().openOutputStream(uri);\n            Timber.plant(new FileDebugTree(output));\n            Timber.d(\"Debug log enabled, %s v%s (%d), SDK %d, %s %s\",\n                    getResources().getString(R.string.app_name),\n                    BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE,\n                    Build.VERSION.SDK_INT, Build.MANUFACTURER, Build.MODEL);\n        }\n        catch (IOException ex) {\n            Timber.e(ex, \"Failed to open debug log %s\", uri.toString());\n        }\n    }\n\n    private FileDebugTree getEnabledFileDebugTree() {\n        for (Timber.Tree tree : Timber.forest()) {\n            if (tree instanceof FileDebugTree) {\n                return (FileDebugTree) tree;\n            }\n        }\n        return null;\n    }\n\n    class FileDebugTree extends Timber.DebugTree {\n        PrintWriter writer;\n        DateFormat format;\n\n        FileDebugTree(OutputStream output) {\n            writer = new PrintWriter(output, true);\n            format = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss.SSS\");\n        }\n\n        void close() {\n            writer.close();\n        }\n\n        private String priorityToString(int priority) {\n            switch (priority) {\n                case Log.ASSERT:\n                    return \"Assert\";\n                case Log.ERROR:\n                    return \"Error\";\n                case Log.WARN:\n                    return \"Warning\";\n                case Log.INFO:\n                    return \"Info\";\n                case Log.DEBUG:\n                    return \"Debug\";\n                case Log.VERBOSE:\n                    return \"Verbose\";\n            }\n            return String.format(\"Unknown (%d)\", priority);\n        }\n\n        @Override\n        protected synchronized void log(int priority, String tag, String message, Throwable t) {\n            final long id = Thread.currentThread().getId();\n            writer.printf(\"%s %s [%d] %s: %s\\r\\n\",\n                    format.format(new Date()), priorityToString(priority), id, tag, message);\n        }\n    }\n\n    private static void tintIcons(Preference preference, int color) {\n        if (preference instanceof PreferenceGroup) {\n            PreferenceGroup group = ((PreferenceGroup) preference);\n            for (int i = 0; i < group.getPreferenceCount(); i++) {\n                tintIcons(group.getPreference(i), color);\n            }\n        } else {\n            Drawable icon = preference.getIcon();\n            if (icon != null) {\n                DrawableCompat.setTint(icon, color);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/preference/ReminderPreferences.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.preference;\n\nimport android.content.ComponentName;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageManager;\nimport android.os.Bundle;\n\nimport androidx.fragment.app.DialogFragment;\nimport androidx.preference.MultiSelectListPreference;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceFragmentCompat;\nimport androidx.preference.SwitchPreferenceCompat;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.alarm.AlarmHandler;\nimport com.health.openworkout.core.alarm.ReminderBootReceiver;\n\npublic class ReminderPreferences extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {\n    private SwitchPreferenceCompat reminderEnable;\n\n    @Override\n    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {\n        setPreferencesFromResource(R.xml.reminder_preferences, rootKey);\n\n        final MultiSelectListPreference prefDays = findPreference(\"reminderDays\");\n\n        prefDays.setSummaryProvider(new Preference.SummaryProvider<MultiSelectListPreference>() {\n            @Override\n            public CharSequence provideSummary(MultiSelectListPreference preference) {\n                return preference.getValues().toString();\n            }\n        });\n\n\n        reminderEnable = findPreference(\"reminderEnable\");\n    }\n\n    @Override\n    public void onDisplayPreferenceDialog(Preference preference) {\n        DialogFragment dialogFragment = null;\n\n        if (preference instanceof TimePreference) {\n            dialogFragment = TimePreferenceDialog.newInstance(preference.getKey());\n        }\n\n        if (dialogFragment != null) {\n            dialogFragment.setTargetFragment(this, 0);\n            dialogFragment.show(getParentFragmentManager(), \"timePreferenceDialog\");\n        } else {\n            super.onDisplayPreferenceDialog(preference);\n        }\n    }\n\n    @Override\n    public void onResume()\n    {\n        super.onResume();\n        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);\n    }\n\n    @Override\n    public void onPause()\n    {\n        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);\n        super.onPause();\n    }\n\n    @Override\n    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {\n        updateAlarmPreferences();\n    }\n\n    private void updateAlarmPreferences()\n    {\n        ComponentName receiver = new ComponentName(getActivity().getApplicationContext(), ReminderBootReceiver.class);\n        PackageManager pm = getActivity().getApplicationContext().getPackageManager();\n\n        AlarmHandler alarmHandler = new AlarmHandler();\n\n        if (reminderEnable.isChecked()) {\n            alarmHandler.scheduleAlarms(getActivity());\n\n            pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,\n                    PackageManager.DONT_KILL_APP);\n        }\n        else {\n            alarmHandler.disableAllAlarms(getActivity());\n\n            pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,\n                    PackageManager.DONT_KILL_APP);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/preference/SoundPreferences.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.preference;\n\nimport android.os.Bundle;\n\nimport androidx.preference.PreferenceFragmentCompat;\n\nimport com.health.openworkout.R;\n\npublic class SoundPreferences extends PreferenceFragmentCompat {\n\n    @Override\n    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {\n        setPreferencesFromResource(R.xml.sound_preferences, rootKey);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/preference/TimePreference.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\npackage com.health.openworkout.gui.preference;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.text.format.DateFormat;\nimport android.util.AttributeSet;\n\nimport androidx.preference.DialogPreference;\n\nimport com.health.openworkout.R;\n\nimport java.util.Calendar;\n\npublic class TimePreference extends DialogPreference {\n\n    private long timeInMillis;\n\n    public TimePreference(Context context) {\n        this(context, null);\n    }\n\n    public TimePreference(Context context, AttributeSet attrs) {\n        this(context, attrs, R.attr.preferenceStyle);\n    }\n\n    public TimePreference(Context context, AttributeSet attrs, int defStyleAttr) {\n        this(context, attrs, defStyleAttr, defStyleAttr);\n    }\n\n    public TimePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n\n    }\n\n    public long getTimeInMillis() {\n        return timeInMillis;\n    }\n\n    public void setTimeInMillis(long timeInMillis) {\n        this.timeInMillis = timeInMillis;\n\n        persistLong(this.timeInMillis);\n    }\n\n    @Override\n    protected Object onGetDefaultValue(TypedArray a, int index) {\n        Calendar defaultTime = Calendar.getInstance();\n        defaultTime.set(Calendar.HOUR_OF_DAY, 16);\n        defaultTime.set(Calendar.MINUTE, 0);\n\n        return defaultTime.getTimeInMillis();\n    }\n\n    @Override\n    public int getDialogLayoutResource() {\n        return R.layout.preference_timepicker;\n    }\n\n\n    @Override\n    protected void onSetInitialValue(boolean restore, Object defaultValue) {\n        setTimeInMillis(restore ? getPersistedLong(timeInMillis) : (long) defaultValue);\n    }\n\n    @Override\n    public CharSequence getSummary() {\n        Calendar calendar = Calendar.getInstance();\n        calendar.setTimeInMillis(timeInMillis);\n\n        return (DateFormat.getTimeFormat(getContext()).format(calendar.getTime()));\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/preference/TimePreferenceDialog.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.preference;\n\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.text.format.DateFormat;\nimport android.view.View;\nimport android.widget.TimePicker;\n\nimport androidx.preference.DialogPreference;\nimport androidx.preference.PreferenceDialogFragmentCompat;\n\nimport com.health.openworkout.R;\n\nimport java.util.Calendar;\n\npublic class TimePreferenceDialog extends PreferenceDialogFragmentCompat {\n    private Calendar calendar;\n    private TimePicker timePicker;\n\n    public static TimePreferenceDialog newInstance(String key) {\n        final TimePreferenceDialog fragment = new TimePreferenceDialog();\n        final Bundle b = new Bundle(1);\n        b.putString(ARG_KEY, key);\n        fragment.setArguments(b);\n\n        return fragment;\n    }\n\n    @Override\n    protected void onBindDialogView(View view) {\n        super.onBindDialogView(view);\n\n        timePicker = view.findViewById(R.id.timePicker);\n        calendar = Calendar.getInstance();\n\n        Long timeInMillis = null;\n        DialogPreference preference = getPreference();\n\n        if (preference instanceof TimePreference) {\n            TimePreference timePreference = (TimePreference) preference;\n            timeInMillis = timePreference.getTimeInMillis();\n        }\n\n        if (timeInMillis != null) {\n            calendar.setTimeInMillis(timeInMillis);\n            boolean is24hour = DateFormat.is24HourFormat(getContext());\n\n            timePicker.setIs24HourView(is24hour);\n            timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));\n            timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));\n        }\n    }\n\n    @Override\n    public void onDialogClosed(boolean positiveResult) {\n        if (positiveResult) {\n            int hours;\n            int minutes;\n\n            if (Build.VERSION.SDK_INT >= 23) {\n                hours = timePicker.getHour();\n                minutes = timePicker.getMinute();\n            } else {\n                hours = timePicker.getCurrentHour();\n                minutes = timePicker.getCurrentMinute();\n            }\n\n            calendar.set(Calendar.HOUR_OF_DAY, hours);\n            calendar.set(Calendar.MINUTE, minutes);\n\n            long timeInMillis = calendar.getTimeInMillis();\n\n            DialogPreference preference = getPreference();\n            if (preference instanceof TimePreference) {\n                TimePreference timePreference = ((TimePreference) preference);\n                if (timePreference.callChangeListener(timeInMillis)) {\n                    timePreference.setTimeInMillis(timeInMillis);\n                    timePreference.setSummary(DateFormat.getTimeFormat(getContext()).format(calendar.getTime()));\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/session/SessionFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.session;\n\nimport android.app.AlertDialog;\nimport android.content.DialogInterface;\nimport android.content.res.Configuration;\nimport android.os.Bundle;\nimport android.text.InputType;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.navigation.Navigation;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\nimport com.health.openworkout.gui.datatypes.GenericFragment;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\n\nimport java.util.List;\n\npublic class SessionFragment extends GenericFragment {\n    private RecyclerView sessionsView;\n\n    private TrainingPlan trainingPlan;\n    private List<WorkoutSession> workoutSessionList;\n\n    private FloatingActionButton expandableButton;\n    private FloatingActionButton addButton;\n    private LinearLayout addLayout;\n    private Animation animFabOpen, animFabClose, animFabClock, animFabAntiClock;\n    private boolean isExpandable;\n\n    private SessionsAdapter sessionsAdapter;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_session, container, false);\n\n        sessionsView = root.findViewById(R.id.sessionsView);\n\n        sessionsView.setHasFixedSize(true);\n        sessionsView.setLayoutManager(new GridLayoutManager(getContext(), getNumberOfColumns()));\n\n        isExpandable = false;\n\n        expandableButton = root.findViewById(R.id.expandableButton);\n        addButton = root.findViewById(R.id.addButton);\n        addLayout = root.findViewById(R.id.addLayout);\n\n        animFabClose = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close);\n        animFabOpen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open);\n        animFabClock = AnimationUtils.loadAnimation(getContext(), R.anim.fab_rotate_clock);\n        animFabAntiClock = AnimationUtils.loadAnimation(getContext(), R.anim.fab_rotate_anticlock);\n\n        expandableButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (isExpandable) {\n                    addLayout.setVisibility(View.GONE);\n                    addLayout.startAnimation(animFabClose);\n                    expandableButton.startAnimation(animFabAntiClock);\n                    isExpandable = false;\n                } else {\n                    addLayout.setVisibility(View.VISIBLE);\n                    addLayout.startAnimation(animFabOpen);\n                    expandableButton.startAnimation(animFabClock);\n                    isExpandable = true;\n                }\n            }\n        });\n\n        addButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                AlertDialog.Builder alert = new AlertDialog.Builder(getContext());\n                alert.setTitle(getString(R.string.label_input_create_days));\n                final EditText input = new EditText(getContext());\n                input.setText(\"3\", TextView.BufferType.EDITABLE);\n                input.setInputType(InputType.TYPE_CLASS_NUMBER);\n                input.setRawInputType(Configuration.KEYBOARD_12KEY);\n                alert.setView(input);\n                alert.setPositiveButton(getString(R.string.label_ok), new DialogInterface.OnClickListener() {\n                    public void onClick(DialogInterface dialog, int whichButton) {\n                        if (!input.getText().toString().isEmpty()) {\n                            int startNr = trainingPlan.getWorkoutSessions().size() + 1;\n                            int offsetNr = Integer.valueOf(input.getText().toString());\n\n                            for (int nr=startNr; nr < (startNr + offsetNr); nr++) {\n                                WorkoutSession workoutSession = new WorkoutSession();\n                                workoutSession.setName(String.format(getString(R.string.day_unit), nr));\n                                workoutSession.setTrainingPlanId(trainingPlan.getTrainingPlanId());\n                                workoutSession.setOrderNr(nr);\n                                trainingPlan.addWorkoutSession(workoutSession);\n                                OpenWorkout.getInstance().insertWorkoutSession(workoutSession);\n                                getAdapter().notifyItemInserted(nr);\n                                sessionsView.scrollToPosition(startNr);\n                            }\n\n                            loadFromDatabase();\n                        }\n                    }\n                });\n                alert.setNegativeButton(getString(R.string.label_cancel), new DialogInterface.OnClickListener() {\n                    public void onClick(DialogInterface dialog, int whichButton) {\n                        // empty\n                    }\n                });\n                alert.show();\n            }\n        });\n\n        loadFromDatabase();\n\n        return root;\n    }\n\n    @Override\n    protected String getTitle() {\n        return trainingPlan.getName();\n    }\n\n    @Override\n    protected GenericAdapter getAdapter() {\n        return sessionsAdapter;\n    }\n\n    @Override\n    protected RecyclerView getRecyclerView() {\n        return sessionsView;\n    }\n\n    @Override\n    protected List getItemList() {\n        return workoutSessionList;\n    }\n\n    @Override\n    protected void onSelectCallback(int position) {\n        WorkoutSession workoutSession = workoutSessionList.get(position);\n\n        SessionFragmentDirections.ActionSessionFragmentToWorkoutFragment action = SessionFragmentDirections.actionSessionFragmentToWorkoutFragment();\n        action.setTitle(workoutSession.getName());\n        action.setSessionWorkoutId(workoutSession.getWorkoutSessionId());\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n    @Override\n    protected void onEditCallback(int position) {\n        WorkoutSession workoutSession = workoutSessionList.get(position);\n\n        SessionFragmentDirections.ActionSessionsFragmentToSessionSettingsFragment action = SessionFragmentDirections.actionSessionsFragmentToSessionSettingsFragment();\n        action.setWorkoutSessionId(workoutSession.getWorkoutSessionId());\n        action.setMode(GenericSettingsFragment.SETTING_MODE.EDIT);\n        action.setTitle(getString(R.string.label_edit));\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n    @Override\n    protected void onDeleteCallback(int position) {\n        OpenWorkout.getInstance().deleteWorkoutSession(workoutSessionList.get(position));\n        Toast.makeText(getContext(), String.format(getString(R.string.label_delete_toast), workoutSessionList.get(position).getName()), Toast.LENGTH_SHORT).show();\n        getItemList().remove(position);\n    }\n\n    @Override\n    protected void onDuplicateCallback(int position) {\n        WorkoutSession origWorkoutSession = workoutSessionList.get(position);\n        WorkoutSession duplicateWorkoutSession = origWorkoutSession.clone();\n\n        duplicateWorkoutSession.setWorkoutSessionId(0);\n        workoutSessionList.add(position, duplicateWorkoutSession);\n        saveToDatabase();\n\n        long workoutSessionId = OpenWorkout.getInstance().insertWorkoutSession(duplicateWorkoutSession);\n        duplicateWorkoutSession.setWorkoutSessionId(workoutSessionId);\n    }\n\n    @Override\n    protected void onResetClick() {\n        for (WorkoutSession workoutSession : workoutSessionList) {\n            workoutSession.setFinished(false);\n\n            for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                workoutItem.setFinished(false);\n                OpenWorkout.getInstance().updateWorkoutItem(workoutItem);\n            }\n\n            OpenWorkout.getInstance().updateWorkoutSession(workoutSession);\n        }\n    }\n\n    @Override\n    protected void loadFromDatabase() {\n        long trainingPlanId = SessionFragmentArgs.fromBundle(getArguments()).getTrainingPlanId();\n        trainingPlan = OpenWorkout.getInstance().getTrainingPlan(trainingPlanId);\n\n        workoutSessionList = trainingPlan.getWorkoutSessions();\n\n        sessionsAdapter = new SessionsAdapter(getContext(), workoutSessionList);\n        sessionsAdapter.setMode(getMode());\n        sessionsView.setAdapter(sessionsAdapter);\n    }\n\n    @Override\n    protected void saveToDatabase() {\n        for (int i=0; i<workoutSessionList.size(); i++) {\n            workoutSessionList.get(i).setOrderNr(i);\n            OpenWorkout.getInstance().updateWorkoutSession(workoutSessionList.get(i));\n        }\n    }\n\n    private int getNumberOfColumns() {\n        View view = View.inflate(getContext(), R.layout.item_session, null);\n        view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);\n        int width = view.getMeasuredWidth();\n        int count = (getResources().getDisplayMetrics().widthPixels - sessionsView.getPaddingLeft() - sessionsView.getPaddingRight()) / width;\n        int remaining = (getResources().getDisplayMetrics().widthPixels - sessionsView.getPaddingLeft() - sessionsView.getPaddingRight()) - width * count;\n        if (remaining > width - 15)\n            count++;\n        return count;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/session/SessionSettingsFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.session;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\n\npublic class SessionSettingsFragment extends GenericSettingsFragment {\n    private WorkoutSession workoutSession;\n\n    private ImageView imgView;\n    private TextView nameView;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             final ViewGroup container, Bundle savedInstanceState) {\n\n        View root = inflater.inflate(R.layout.fragment_sessionsettings, container, false);\n\n        imgView = root.findViewById(R.id.imgView);\n        nameView = root.findViewById(R.id.nameView);\n\n        setMode(SessionSettingsFragmentArgs.fromBundle(getArguments()).getMode());\n\n        return root;\n    }\n\n    @Override\n    protected String getTitle() {\n        return workoutSession.getName();\n    }\n\n    @Override\n    protected void loadFromDatabase(SETTING_MODE mode) {\n        switch (mode) {\n            case ADD:\n                workoutSession = new WorkoutSession();\n                break;\n            case EDIT:\n                long workoutSessionId = SessionSettingsFragmentArgs.fromBundle(getArguments()).getWorkoutSessionId();\n                workoutSession = OpenWorkout.getInstance().getWorkoutSession(workoutSessionId);\n                break;\n        }\n\n        if (workoutSession.isFinished()) {\n            imgView.setImageResource(R.drawable.ic_session_done);\n        } else {\n            imgView.setImageResource(R.drawable.ic_session_undone);\n        }\n\n        nameView.setText(workoutSession.getName());\n    }\n\n    @Override\n    protected boolean saveToDatabase(SETTING_MODE mode) {\n        workoutSession.setName(nameView.getText().toString());\n\n        switch (mode) {\n            case ADD:\n                long trainingPlanId = SessionSettingsFragmentArgs.fromBundle(getArguments()).getTrainingPlanId();\n\n                workoutSession.setTrainingPlanId(trainingPlanId);\n                OpenWorkout.getInstance().insertWorkoutSession(workoutSession);\n                break;\n            case EDIT:\n                OpenWorkout.getInstance().updateWorkoutSession(workoutSession);\n                break;\n        }\n\n        return true;\n    }\n\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/session/SessionsAdapter.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.session;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\n\nimport java.util.List;\n\npublic class SessionsAdapter extends GenericAdapter<SessionsAdapter.ViewHolder> {\n    private List<WorkoutSession> workoutSessionList;\n    private Context context;\n\n    public SessionsAdapter(Context aContext, List<WorkoutSession> workoutSessionList) {\n        super(aContext);\n        this.context = aContext;\n        this.workoutSessionList = workoutSessionList;\n    }\n\n    @Override\n    public SessionsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_session, parent, false);\n\n        ViewHolder viewHolder = new ViewHolder(view);\n\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull SessionsAdapter.ViewHolder holder, int position) {\n        super.onBindViewHolder(holder, position);\n        WorkoutSession workoutSession = workoutSessionList.get(position);\n        holder.nameView.setText(workoutSession.getName());\n\n        if (workoutSession.isFinished()) {\n            holder.imgView.setImageResource(R.drawable.ic_session_done);\n        } else {\n            holder.imgView.setImageResource(R.drawable.ic_session_undone);\n        }\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return workoutSessionList.get(position).getWorkoutSessionId();\n    }\n\n    @Override\n    public int getItemCount() {\n        return workoutSessionList.size();\n    }\n\n    static class ViewHolder extends GenericAdapter.ViewHolder {\n        ImageView imgView;\n        TextView nameView;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            imgView = itemView.findViewById(R.id.imgView);\n            nameView = itemView.findViewById(R.id.nameView);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/training/TrainingDatabaseAdapter.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.training;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.GitHubFile;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.text.DecimalFormat;\nimport java.util.List;\n\nimport timber.log.Timber;\n\npublic class TrainingDatabaseAdapter extends RecyclerView.Adapter<TrainingDatabaseAdapter.ViewHolder> {\n    private List<GitHubFile> gitHubFileList;\n    private ViewHolder holder;\n    private Context context;\n    private static GenericAdapter.OnGenericClickListener onItemClickListener;\n\n    public TrainingDatabaseAdapter(Context aContext, List<GitHubFile> gitHubFileList) {\n        this.context = aContext;\n        this.gitHubFileList = gitHubFileList;\n    }\n\n    public void setOnItemClickListener(GenericAdapter.OnGenericClickListener onItemClickListener) {\n        this.onItemClickListener = onItemClickListener;\n    }\n\n    @Override\n    public TrainingDatabaseAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_trainingdatabase, parent, false);\n\n        ViewHolder viewHolder = new ViewHolder(view);\n\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {\n        this.holder = holder;\n        GitHubFile gitHubFile = gitHubFileList.get(position);\n\n        holder.nameView.setText(gitHubFile.getName().substring(0, gitHubFile.getName().length() - 4));\n        DecimalFormat sizeFormat = new DecimalFormat(\"##0.00\");\n        double fileSize = (gitHubFile.getSize() / 1000000.0f);\n\n        if (fileSize >= 1.0f) {\n            holder.detailedView.setText(String.format(context.getString(R.string.label_package_size_mbytes), sizeFormat.format(fileSize)));\n        } else {\n            fileSize = fileSize * 1000.0f;\n            holder.detailedView.setText(String.format(context.getString(R.string.label_package_size_kbytes), sizeFormat.format(fileSize)));\n        }\n\n        String displayName = gitHubFile.getName().substring(0, gitHubFile.getName().length() -4);\n        File packageDir = new File(context.getFilesDir(),  displayName);\n\n        if (packageDir.exists()) {\n            List<TrainingPlan> trainingPlanList = OpenWorkout.getInstance().getTrainingPlans();\n\n            for (TrainingPlan trainingPlan : trainingPlanList) {\n                if (trainingPlan.getName().equals(displayName)) {\n                    downloadCompleted(trainingPlan);\n                }\n            }\n        }\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return gitHubFileList.indexOf(gitHubFileList.get(position));\n    }\n\n    @Override\n    public int getItemCount() {\n        return gitHubFileList.size();\n    }\n\n    public void updateProgressBar(long bytes, long totalBytes) {\n        int percent = (int)(bytes / (double)totalBytes * 100.0);\n        holder.progressBar.setProgress(percent);\n    }\n\n    public void downloadCompleted(TrainingPlan trainingPlan) {\n        holder.progressBar.setProgress(100);\n        try {\n            if (trainingPlan.isImagePathExternal()) {\n                holder.imgView.setImageURI(Uri.parse(trainingPlan.getImagePath()));\n            } else {\n                InputStream ims = context.getAssets().open(\"image/\" + trainingPlan.getImagePath());\n                holder.imgView.setImageDrawable(Drawable.createFromStream(ims, null));\n                ims.close();\n            }\n        } catch (IOException ex) {\n            Timber.e(ex);\n        } catch (SecurityException ex) {\n            holder.imgView.setImageResource(R.drawable.ic_no_file);\n            Toast.makeText(context, context.getString(R.string.error_no_access_to_file) + \" \" + trainingPlan.getImagePath(), Toast.LENGTH_SHORT).show();\n            Timber.e(ex);\n        }\n\n        holder.downloadView.setImageResource(R.drawable.ic_download_finished);\n        holder.nameView.setEnabled(true);\n        holder.detailedView.setEnabled(true);\n        holder.itemView.setOnClickListener(null);\n    }\n\n    static class ViewHolder extends RecyclerView.ViewHolder {\n        ImageView imgView;\n        TextView nameView;\n        TextView detailedView;\n        ImageView downloadView;\n        ProgressBar progressBar;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            imgView = itemView.findViewById(R.id.imgView);\n            nameView = itemView.findViewById(R.id.nameView);\n            detailedView = itemView.findViewById(R.id.detailedView);\n            downloadView = itemView.findViewById(R.id.downloadView);\n            progressBar = itemView.findViewById(R.id.progressBar);\n\n            progressBar.setMax(100);\n\n            itemView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    onItemClickListener.onItemClick(getAdapterPosition(), v);\n                }\n            });\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/training/TrainingFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.training;\n\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.text.Html;\nimport android.text.method.LinkMovementMethod;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.navigation.NavDirections;\nimport androidx.navigation.Navigation;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.User;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.core.utils.PackageUtils;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\nimport com.health.openworkout.gui.datatypes.GenericFragment;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\nimport com.health.openworkout.gui.utils.FileDialogHelper;\n\nimport java.util.List;\n\npublic class TrainingFragment extends GenericFragment {\n    private RecyclerView trainingsView;\n    private FloatingActionButton expandableButton;\n    private FloatingActionButton addButton;\n    private FloatingActionButton cloudImportButton;\n    private FloatingActionButton localImportButton;\n    private LinearLayout addLayout, localImportLayout, cloudImportLayout;\n    private Animation animFabOpen, animFabClose, animFabClock, animFabAntiClock;\n    private boolean isExpandable;\n    private List<TrainingPlan> trainingPlanList;\n    private TrainingPlan exportTrainingPlan;\n\n    private TrainingsAdapter trainingsAdapter;\n    private FileDialogHelper fileDialogHelper;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_training, container, false);\n\n        fileDialogHelper = new FileDialogHelper(this);\n\n        trainingsView = root.findViewById(R.id.trainingsView);\n\n        trainingsView.setHasFixedSize(true);\n        trainingsView.setLayoutManager(new LinearLayoutManager(getContext()));\n\n        isExpandable = false;\n\n        expandableButton = root.findViewById(R.id.expandableButton);\n        addButton = root.findViewById(R.id.addButton);\n        addLayout = root.findViewById(R.id.addLayout);\n        cloudImportButton = root.findViewById(R.id.cloudlImportButton);\n        cloudImportLayout = root.findViewById(R.id.cloudImportLayout);\n        localImportButton = root.findViewById(R.id.locallImportButton);\n        localImportLayout = root.findViewById(R.id.localImportLayout);\n\n        animFabClose = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close);\n        animFabOpen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open);\n        animFabClock = AnimationUtils.loadAnimation(getContext(), R.anim.fab_rotate_clock);\n        animFabAntiClock = AnimationUtils.loadAnimation(getContext(), R.anim.fab_rotate_anticlock);\n\n        expandableButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (isExpandable) {\n                    addLayout.setVisibility(View.GONE);\n                    cloudImportLayout.setVisibility(View.GONE);\n                    localImportLayout.setVisibility(View.GONE);\n                    addLayout.startAnimation(animFabClose);\n                    cloudImportLayout.startAnimation(animFabClose);\n                    localImportLayout.startAnimation(animFabClose);\n                    expandableButton.startAnimation(animFabAntiClock);\n                    isExpandable = false;\n                } else {\n                    addLayout.setVisibility(View.VISIBLE);\n                    cloudImportLayout.setVisibility(View.VISIBLE);\n                    localImportLayout.setVisibility(View.VISIBLE);\n                    addLayout.startAnimation(animFabOpen);\n                    cloudImportLayout.startAnimation(animFabOpen);\n                    localImportLayout.startAnimation(animFabOpen);\n                    expandableButton.startAnimation(animFabClock);\n                    isExpandable = true;\n                }\n            }\n        });\n\n        addButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                TrainingFragmentDirections.ActionTrainingFragmentToTrainingSettingsFragment action = TrainingFragmentDirections.actionTrainingFragmentToTrainingSettingsFragment();\n                action.setMode(GenericSettingsFragment.SETTING_MODE.ADD);\n                action.setTitle(getString(R.string.label_add));\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n            }\n        });\n\n        cloudImportButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                NavDirections action = TrainingFragmentDirections.actionNavTrainingsFragmentToNavTrainingsDatabaseFragment();\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n            }\n        });\n\n        localImportButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                fileDialogHelper.openImportFileDialog();\n            }\n        });\n\n        loadFromDatabase();\n\n        return root;\n    }\n\n    @Override\n    protected String getTitle() {\n        return getString(R.string.label_training_plans);\n    }\n\n    @Override\n    protected void loadFromDatabase() {\n        trainingPlanList = OpenWorkout.getInstance().getTrainingPlans();\n\n        trainingsAdapter = new TrainingsAdapter(getContext(), trainingPlanList);\n        trainingsAdapter.setMode(getMode());\n        trainingsView.setAdapter(trainingsAdapter);\n    }\n\n    @Override\n    protected void saveToDatabase() {\n        for (int i=0; i<trainingPlanList.size(); i++) {\n            trainingPlanList.get(i).setOrderNr(i);\n            OpenWorkout.getInstance().updateTrainingPlan(trainingPlanList.get(i));\n        }\n    }\n\n    @Override\n    protected GenericAdapter getAdapter() {\n        return trainingsAdapter;\n    }\n\n    @Override\n    protected RecyclerView getRecyclerView() {\n        return trainingsView;\n    }\n\n    @Override\n    protected List getItemList() {\n        return trainingPlanList;\n    }\n\n    @Override\n    protected void onSelectCallback(int position) {\n        TrainingPlan trainingPlan = trainingPlanList.get(position);\n\n        TrainingFragmentDirections.ActionTrainingFragmentToSessionFragment action = TrainingFragmentDirections.actionTrainingFragmentToSessionFragment();\n        action.setTitle(trainingPlan.getName());\n        action.setTrainingPlanId(trainingPlan.getTrainingPlanId());\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n    @Override\n    protected void onEditCallback(int position) {\n        TrainingPlan trainingPlan = trainingPlanList.get(position);\n\n        TrainingFragmentDirections.ActionTrainingFragmentToTrainingSettingsFragment action = TrainingFragmentDirections.actionTrainingFragmentToTrainingSettingsFragment();\n        action.setTrainingPlanId(trainingPlan.getTrainingPlanId());\n        action.setMode(GenericSettingsFragment.SETTING_MODE.EDIT);\n        action.setTitle(getString(R.string.label_edit));\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n    @Override\n    protected void onDeleteCallback(int position) {\n        User user = OpenWorkout.getInstance().getCurrentUser();\n        long userTrainingPlanId = user.getTrainingsPlanId();\n        TrainingPlan trainingPlanToBeDelete = trainingPlanList.get(position);\n\n        if (userTrainingPlanId == trainingPlanToBeDelete.getTrainingPlanId()) {\n            user.setTrainingsPlanId(-1);\n            OpenWorkout.getInstance().updateUser(user);\n        }\n\n        Toast.makeText(getContext(), String.format(getString(R.string.label_delete_toast), trainingPlanToBeDelete.getName()), Toast.LENGTH_SHORT).show();\n        OpenWorkout.getInstance().deleteTrainingPlan(trainingPlanList.get(position));\n        trainingPlanList.remove(position);\n    }\n\n    @Override\n    protected void onDuplicateCallback(int position) {\n        TrainingPlan origTrainingPlan = trainingPlanList.get(position);\n        TrainingPlan duplicateTrainingPlan = origTrainingPlan.clone();\n\n        duplicateTrainingPlan.setTrainingPlanId(0);\n        trainingPlanList.add(position, duplicateTrainingPlan);\n        saveToDatabase();\n\n        long trainingPlanId = OpenWorkout.getInstance().insertTrainingPlan(duplicateTrainingPlan);\n        duplicateTrainingPlan.setTrainingPlanId(trainingPlanId);\n    }\n\n    @Override\n    protected void onResetClick() {\n        for (TrainingPlan trainingPlan : trainingPlanList) {\n            trainingPlan.setCountFinishedTraining(0);\n\n            for (WorkoutSession workoutSession : trainingPlan.getWorkoutSessions()) {\n                workoutSession.setFinished(false);\n\n                for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                    workoutItem.setFinished(false);\n                    OpenWorkout.getInstance().updateWorkoutItem(workoutItem);\n                }\n\n                OpenWorkout.getInstance().updateWorkoutSession(workoutSession);\n            }\n\n            OpenWorkout.getInstance().updateTrainingPlan(trainingPlan);\n        }\n    }\n\n    @Override\n    protected void onPublishClick(int position) {\n        exportTrainingPlan = trainingPlanList.get(position);\n\n        final AlertDialog infoDialog = new AlertDialog.Builder(getContext())\n                .setIcon(R.drawable.ic_export)\n                .setTitle(getString(R.string.label_publish) + \" \" + exportTrainingPlan.getName())\n                .setMessage(Html.fromHtml(getString(R.string.label_publish_message)))\n                //.setMessage(publishMessage)\n                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {\n                    @Override\n                    public void onClick(DialogInterface dialog, int which) {\n                        fileDialogHelper.openExportFileDialog(exportTrainingPlan.getName());\n                    }\n                })\n                .create();\n        infoDialog.show();\n\n        ((TextView)infoDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());\n    }\n\n    @Override\n    protected void onExportClick(int position) {\n        exportTrainingPlan = trainingPlanList.get(position);\n        fileDialogHelper.openExportFileDialog(exportTrainingPlan.getName());\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        fileDialogHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);\n    }\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (fileDialogHelper.onActivityResult(requestCode, resultCode, data)) {\n            Uri uri = data.getData();\n            PackageUtils packageUtils = new PackageUtils(getContext());\n\n            switch (requestCode) {\n                case FileDialogHelper.REQUEST_IMPORT_FILE_DIALOG:\n                    packageUtils.importTrainingPlan(uri);\n                    break;\n                case FileDialogHelper.REQUEST_EXPORT_FILE_DIALOG:\n                    packageUtils.exportTrainingPlan(exportTrainingPlan, uri);\n                    break;\n\n            }\n\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/training/TrainingSettingsFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.training;\n\nimport android.content.Intent;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\nimport com.health.openworkout.gui.utils.FileDialogHelper;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport timber.log.Timber;\n\npublic class TrainingSettingsFragment extends GenericSettingsFragment {\n    private TrainingPlan trainingPlan;\n\n    private ImageView imgView;\n    private TextView nameView;\n\n    private FileDialogHelper fileDialogHelper;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             final ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_trainingsettings, container, false);\n\n        imgView = root.findViewById(R.id.imgView);\n        nameView = root.findViewById(R.id.nameView);\n\n        fileDialogHelper = new FileDialogHelper(this);\n\n        imgView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                fileDialogHelper.openImageFileDialog();\n            }\n        });\n\n        setMode(TrainingSettingsFragmentArgs.fromBundle(getArguments()).getMode());\n\n        return root;\n    }\n\n    @Override\n    protected String getTitle() {\n        return trainingPlan.getName();\n    }\n\n    @Override\n    protected void loadFromDatabase(SETTING_MODE mode) {\n        switch (mode) {\n            case ADD:\n                trainingPlan = new TrainingPlan();\n                break;\n            case EDIT:\n                long trainingPlanId = TrainingSettingsFragmentArgs.fromBundle(getArguments()).getTrainingPlanId();\n\n                trainingPlan = OpenWorkout.getInstance().getTrainingPlan(trainingPlanId);\n                break;\n        }\n\n        try {\n            if (trainingPlan.isImagePathExternal()) {\n                Uri imgUri = Uri.parse(trainingPlan.getImagePath());\n                imgView.setImageURI(imgUri);\n            } else {\n                InputStream ims = getContext().getAssets().open(\"image/\" + trainingPlan.getImagePath());\n                imgView.setImageDrawable(Drawable.createFromStream(ims, null));\n\n                ims.close();\n            }\n        } catch (IOException ex) {\n            Timber.e(ex);\n        }\n          catch (SecurityException ex) {\n            imgView.setImageResource(R.drawable.ic_no_file);\n            Toast.makeText(getContext(), getContext().getString(R.string.error_no_access_to_file) + \" \" + trainingPlan.getImagePath(), Toast.LENGTH_SHORT).show();\n            Timber.e(ex);\n        }\n\n        nameView.setText(trainingPlan.getName());\n    }\n\n    @Override\n    protected boolean saveToDatabase(SETTING_MODE mode) {\n        trainingPlan.setName(nameView.getText().toString());\n\n        switch (mode) {\n            case ADD:\n                OpenWorkout.getInstance().insertTrainingPlan(trainingPlan);\n                break;\n            case EDIT:\n                OpenWorkout.getInstance().updateTrainingPlan(trainingPlan);\n                break;\n        }\n\n        return true;\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        fileDialogHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);\n    }\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (fileDialogHelper.onActivityResult(requestCode, resultCode, data)) {\n            Uri uri = data.getData();\n            String imgPath = uri.toString();\n            imgView.setImageURI(uri);\n            trainingPlan.setImagePath(imgPath);\n            trainingPlan.setImagePathExternal(true);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/training/TrainingsAdapter.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.training;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\n\nimport timber.log.Timber;\n\npublic class TrainingsAdapter extends GenericAdapter<TrainingsAdapter.ViewHolder> {\n    private List<TrainingPlan> trainingPlanList;\n    private Context context;\n\n    public TrainingsAdapter(Context aContext, List<TrainingPlan> trainingPlanList) {\n        super(aContext);\n        this.context = aContext;\n        this.trainingPlanList = trainingPlanList;\n    }\n\n    @Override\n    public TrainingsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_training, parent, false);\n\n        ViewHolder viewHolder = new ViewHolder(view);\n\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {\n        super.onBindViewHolder(holder, position);\n        TrainingPlan trainingPlan = trainingPlanList.get(position);\n        holder.nameView.setText(trainingPlan.getName());\n\n        try {\n            if (trainingPlan.isImagePathExternal()) {\n                Uri imgUri = Uri.parse(trainingPlan.getImagePath());\n                holder.imgView.setImageURI(imgUri);\n            } else {\n                    InputStream ims = context.getAssets().open(\"image/\" + trainingPlan.getImagePath());\n                    holder.imgView.setImageDrawable(Drawable.createFromStream(ims, null));\n                    ims.close();\n            }\n            } catch (IOException ex) {\n                Timber.e(ex);\n            } catch (SecurityException ex) {\n                holder.imgView.setImageResource(R.drawable.ic_no_file);\n                Toast.makeText(context, context.getString(R.string.error_no_access_to_file) + \" \" + trainingPlan.getImagePath(), Toast.LENGTH_SHORT).show();\n                Timber.e(ex);\n            }\n\n        if (!trainingPlan.getWorkoutSessions().isEmpty() &&\n                trainingPlan.getWorkoutSessionSize() == trainingPlan.finishedSessionSize()) {\n\n            trainingPlan.setCountFinishedTraining(trainingPlan.getCountFinishedTraining() + 1);\n\n            for (WorkoutSession workoutSession : trainingPlan.getWorkoutSessions()) {\n                workoutSession.setFinished(false);\n\n                for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                    workoutItem.setFinished(false);\n                    OpenWorkout.getInstance().updateWorkoutItem(workoutItem);\n                }\n\n                OpenWorkout.getInstance().updateWorkoutSession(workoutSession);\n            }\n        }\n\n        if (trainingPlan.getCountFinishedTraining() == 0) {\n            holder.trophyView.setBackgroundResource(R.drawable.ic_trophy_disabled);\n        } else {\n            holder.trophyView.setBackgroundResource(R.drawable.ic_trophy_enabled);\n            holder.trophyView.setText(Integer.toString(trainingPlan.getCountFinishedTraining()));\n        }\n\n        holder.detailedView.setText(String.format(context.getString(R.string.label_session_size_completed), trainingPlan.finishedSessionSize(), trainingPlan.getWorkoutSessionSize()));\n\n        switch (getMode()) {\n            case VIEW:\n                holder.trophyView.setVisibility(View.VISIBLE);\n                break;\n            case EDIT:\n                holder.trophyView.setVisibility(View.GONE);\n                break;\n        }\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return trainingPlanList.get(position).getTrainingPlanId();\n    }\n\n    @Override\n    public int getItemCount() {\n        return trainingPlanList.size();\n    }\n\n    static class ViewHolder extends GenericAdapter.ViewHolder {\n        ImageView imgView;\n        TextView nameView;\n        TextView detailedView;\n        TextView trophyView;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            imgView = itemView.findViewById(R.id.imgView);\n            nameView = itemView.findViewById(R.id.nameView);\n            detailedView = itemView.findViewById(R.id.detailedView);\n            trophyView = itemView.findViewById(R.id.trophyView);\n\n            setExportVisible(true);\n            setPublishVisible(true);\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/training/TrainingsDatabaseFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.training;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.ProgressBar;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.datatypes.GitHubFile;\nimport com.health.openworkout.core.datatypes.TrainingPlan;\nimport com.health.openworkout.core.utils.PackageUtils;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\n\nimport java.io.File;\nimport java.util.List;\n\npublic class TrainingsDatabaseFragment extends Fragment {\n    private RecyclerView trainingsView;\n    private ProgressBar progressBar;\n    private Button buttonView;\n\n    private List<GitHubFile> gitHubFileList;\n    private TrainingDatabaseAdapter trainingDatabaseAdapter;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_trainingdatabase, container, false);\n\n        trainingsView = root.findViewById(R.id.trainingsView);\n        progressBar = root.findViewById(R.id.progressBar);\n\n        progressBar.setVisibility(View.VISIBLE);\n\n        trainingsView.setHasFixedSize(true);\n        trainingsView.setLayoutManager(new LinearLayoutManager(getContext()));\n\n        loadFromDatabase();\n\n        return root;\n    }\n\n    protected void loadFromDatabase() {\n        PackageUtils packageUtils = new PackageUtils(getContext());\n\n        packageUtils.setOnGitHubCallbackListener(new PackageUtils.OnGitHubCallbackListener() {\n            @Override\n            public void onGitHubFileList(List<GitHubFile> receivedGitHubFileList) {\n                gitHubFileList = receivedGitHubFileList;\n                trainingDatabaseAdapter = new TrainingDatabaseAdapter(getContext(), gitHubFileList);\n\n                trainingDatabaseAdapter.setOnItemClickListener(new GenericAdapter.OnGenericClickListener() {\n                    @Override\n                    public void onItemClick(int position, View v) {\n                        GitHubFile gitHubFile = gitHubFileList.get(position);\n                        packageUtils.downloadFile(gitHubFile);\n                        trainingDatabaseAdapter.notifyItemChanged(position);\n                    }\n                });\n\n                trainingsView.setAdapter(trainingDatabaseAdapter);\n                progressBar.setVisibility(View.GONE);\n            }\n\n            @Override\n            public void onGitHubDownloadFile(File filename) {\n                getActivity().runOnUiThread(new Runnable() {\n                    @Override\n                    public void run() {\n                        TrainingPlan trainingPlan = packageUtils.importTrainingPlan(filename);\n\n                        trainingDatabaseAdapter.downloadCompleted(trainingPlan);\n                    }\n                });\n            }\n\n            @Override\n            public void onGitHubDownloadProgressUpdate(long bytesDownloaded, long bytesTotal) {\n                trainingDatabaseAdapter.updateProgressBar(bytesDownloaded, bytesTotal);\n            }\n\n            @Override\n            public void onGitHubFailure(Exception ex) {\n                Toast.makeText(getContext(), ex.getMessage(), Toast.LENGTH_LONG).show();\n                progressBar.setVisibility(View.GONE);\n            }\n        });\n\n        packageUtils.getGitHubFiles();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/utils/FileDialogHelper.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.utils;\n\nimport android.Manifest;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\n\nimport androidx.fragment.app.Fragment;\n\nimport com.health.openworkout.R;\n\nimport timber.log.Timber;\n\nimport static android.app.Activity.RESULT_OK;\n\npublic class FileDialogHelper {\n\n    private final static int READ_EXTERNAL_STORAGE_PERMISSION_IMPORT = 1;\n    private final static int WRITE_EXTERNAL_STORAGE_PERMISSION_EXPORT = 2;\n    private final static int READ_EXTERNAL_STORAGE_PERMISSION_OPEN_IMAGE = 3;\n    private final static int READ_EXTERNAL_STORAGE_PERMISSION_OPEN_VIDEO = 4;\n    public final static int REQUEST_OPEN_IMAGE_DIALOG = 10;\n    public final static int REQUEST_OPEN_VIDEO_DIALOG = 20;\n    public final static int REQUEST_EXPORT_FILE_DIALOG = 30;\n    public final static int REQUEST_IMPORT_FILE_DIALOG = 40;\n    public final static int REQUEST_DEBUG_FILE_DIALOG = 50;\n\n    private Fragment fragment;\n\n    private String defaultFilename;\n\n    public FileDialogHelper(Fragment fragment) {\n        this.fragment = fragment;\n    }\n\n    public void openImportFileDialog() {\n        if (checkPermissionForReadExternalStorage()) {\n            Intent intent = new Intent()\n                    .setType(\"application/zip\")\n                    .setAction(Intent.ACTION_OPEN_DOCUMENT);\n\n            fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.label_select_import_file)), REQUEST_IMPORT_FILE_DIALOG);\n        } else {\n            requestPermissionForReadExternalStorage(READ_EXTERNAL_STORAGE_PERMISSION_IMPORT);\n        }\n    }\n\n    public void openDebugFileDialog(String defaultFilename) {\n        if (checkPermissionForWriteExternalStorage()) {\n            Intent intent = new Intent()\n                    .setType(\"text/plain\")\n                    .putExtra(Intent.EXTRA_TITLE, defaultFilename)\n                    .setAction(Intent.ACTION_CREATE_DOCUMENT);\n\n            fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.label_select_debug_file)), REQUEST_DEBUG_FILE_DIALOG);\n        } else {\n            requestPermissionForWriteExternalStorage(WRITE_EXTERNAL_STORAGE_PERMISSION_EXPORT);\n        }\n    }\n\n    public void openExportFileDialog() {\n        if (checkPermissionForWriteExternalStorage()) {\n            Intent intent = new Intent()\n                    .setType(\"application/zip\")\n                    .putExtra(Intent.EXTRA_TITLE, defaultFilename)\n                    .setAction(Intent.ACTION_CREATE_DOCUMENT);\n\n            fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.label_select_export_file)), REQUEST_EXPORT_FILE_DIALOG);\n        } else {\n            requestPermissionForWriteExternalStorage(WRITE_EXTERNAL_STORAGE_PERMISSION_EXPORT);\n        }\n    }\n\n    public void openExportFileDialog(String defaultFilename) {\n        this.defaultFilename = defaultFilename;\n        openExportFileDialog();\n    }\n\n    public void openImageFileDialog() {\n        if (checkPermissionForReadExternalStorage()) {\n            Intent intent = new Intent()\n                    .setType(\"image/*\")\n                    .setAction(Intent.ACTION_OPEN_DOCUMENT);\n\n            fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.label_select_image_file)), REQUEST_OPEN_IMAGE_DIALOG);\n        } else {\n            requestPermissionForReadExternalStorage(READ_EXTERNAL_STORAGE_PERMISSION_OPEN_IMAGE);\n        }\n    }\n\n    public void openVideoFileDialog() {\n        if (checkPermissionForReadExternalStorage()) {\n            Intent intent = new Intent()\n                    .setType(\"video/*\")\n                    .setAction(Intent.ACTION_OPEN_DOCUMENT);\n\n            fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.label_select_video_file)), REQUEST_OPEN_VIDEO_DIALOG);\n        } else {\n            requestPermissionForReadExternalStorage(READ_EXTERNAL_STORAGE_PERMISSION_OPEN_VIDEO);\n        }\n    }\n\n    private boolean checkPermissionForReadExternalStorage() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            int result = fragment.getContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);\n            return result == PackageManager.PERMISSION_GRANTED;\n        }\n        return false;\n    }\n\n\n    private void requestPermissionForReadExternalStorage(int requestCode) {\n        try {\n            fragment.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},\n                    requestCode);\n        } catch (Exception ex) {\n            Timber.e(ex);\n        }\n    }\n\n\n    private boolean checkPermissionForWriteExternalStorage() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            int result = fragment.getContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);\n            return result == PackageManager.PERMISSION_GRANTED;\n        }\n        return false;\n    }\n\n    private void requestPermissionForWriteExternalStorage(int requestCode) {\n        try {\n            fragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},\n                    requestCode);\n        } catch (Exception ex) {\n            Timber.e(ex);\n        }\n    }\n\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            switch (requestCode) {\n                case READ_EXTERNAL_STORAGE_PERMISSION_IMPORT:\n                    openImportFileDialog();\n                    break;\n                case WRITE_EXTERNAL_STORAGE_PERMISSION_EXPORT:\n                    openExportFileDialog();\n                    break;\n                case READ_EXTERNAL_STORAGE_PERMISSION_OPEN_IMAGE:\n                    openImageFileDialog();\n                    break;\n                case READ_EXTERNAL_STORAGE_PERMISSION_OPEN_VIDEO:\n                    openVideoFileDialog();\n                    break;\n            }\n        }\n    }\n\n    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {\n        if (resultCode == RESULT_OK) {\n            if (requestCode == REQUEST_IMPORT_FILE_DIALOG ||\n                    requestCode == REQUEST_EXPORT_FILE_DIALOG ||\n                    requestCode == REQUEST_OPEN_IMAGE_DIALOG ||\n                    requestCode == REQUEST_OPEN_VIDEO_DIALOG ||\n                    requestCode == REQUEST_DEBUG_FILE_DIALOG) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/utils/SoundUtils.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.utils;\n\n\nimport android.content.Context;\nimport android.content.res.AssetFileDescriptor;\nimport android.content.res.AssetManager;\nimport android.media.SoundPool;\nimport android.speech.tts.TextToSpeech;\n\nimport java.io.IOException;\nimport java.util.Locale;\n\nimport timber.log.Timber;\n\npublic class SoundUtils {\n    public enum SOUND {WORKOUT_COUNT_BEFORE_START, WORKOUT_START, WORKOUT_STOP, SESSION_COMPLETED}\n\n    private final int NUMBER_OF_SIMULTANEOUS_SOUNDS = 4;\n    private final float LEFT_VOLUME_VALUE = 1.0f;\n    private final float RIGHT_VOLUME_VALUE = 1.0f;\n    private final int MUSIC_LOOP = 0;\n    private final int SOUND_PLAY_PRIORITY = 1;\n    private final float PLAY_RATE= 1.0f;\n\n    private SoundPool soundPool;\n    private TextToSpeech ttS;\n    private boolean ttsInit;\n\n    private int soundIdBeforeStart, soundIdWorkoutStart, soundIdWorkoutStop, soundIdSessionCompleted;\n\n    private AssetManager assetManager;\n\n    public SoundUtils(Context context) {\n        soundPool = new SoundPool.Builder()\n                .setMaxStreams(NUMBER_OF_SIMULTANEOUS_SOUNDS)\n                .build();\n        assetManager = context.getAssets();\n        ttsInit = false;\n\n        ttS = new TextToSpeech(context, new TextToSpeech.OnInitListener() {\n            @Override\n            public void onInit(int status) {\n\n                if (status == TextToSpeech.ERROR) {\n                    Timber.e(\"Can't initialize text to speech\");\n                }\n\n                if (status == TextToSpeech.SUCCESS) {\n                    ttS.setLanguage(Locale.ENGLISH);\n                    ttsInit = true;\n                }\n            }\n        });\n\n        loadSounds();\n    }\n\n    private void loadSounds() {\n        try {\n            AssetFileDescriptor afd;\n\n            afd = assetManager.openFd(\"sound/workout.mp3\");\n            soundIdBeforeStart = soundPool.load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(),1);\n            afd = assetManager.openFd(\"sound/workout_start.mp3\");\n            soundIdWorkoutStart = soundPool.load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(),1);\n            afd = assetManager.openFd(\"sound/workout_stop.mp3\");\n            soundIdWorkoutStop = soundPool.load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(),1);\n            afd = assetManager.openFd(\"sound/session_completed.mp3\");\n            soundIdSessionCompleted = soundPool.load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(),1);\n        } catch (IOException ex) {\n            Timber.e(ex);\n        }\n    }\n\n    public void playSound(SOUND sound) {\n        switch (sound) {\n            case WORKOUT_COUNT_BEFORE_START:\n                soundPool.play(soundIdBeforeStart, LEFT_VOLUME_VALUE , RIGHT_VOLUME_VALUE, SOUND_PLAY_PRIORITY , MUSIC_LOOP ,PLAY_RATE);\n                break;\n            case WORKOUT_START:\n                soundPool.play(soundIdWorkoutStart, LEFT_VOLUME_VALUE , RIGHT_VOLUME_VALUE, SOUND_PLAY_PRIORITY , MUSIC_LOOP ,PLAY_RATE);\n                break;\n            case WORKOUT_STOP:\n                soundPool.play(soundIdWorkoutStop, LEFT_VOLUME_VALUE , RIGHT_VOLUME_VALUE, SOUND_PLAY_PRIORITY , MUSIC_LOOP ,PLAY_RATE);\n                break;\n            case SESSION_COMPLETED:\n                soundPool.play(soundIdSessionCompleted, LEFT_VOLUME_VALUE , RIGHT_VOLUME_VALUE, SOUND_PLAY_PRIORITY , MUSIC_LOOP ,PLAY_RATE);\n                break;\n        }\n    }\n\n    public void textToSpeech(final String speech) {\n        if (ttsInit) {\n            ttS.speak(speech, TextToSpeech.QUEUE_ADD, null, \"textToSpeech\");\n        }\n    }\n\n    public void textToSpeechNoInterrupt(final String speech) {\n        if (ttsInit) {\n            if (!ttS.isSpeaking()) {\n                ttS.speak(speech, TextToSpeech.QUEUE_ADD, null, \"textToSpeech\");\n            }\n        }\n    }\n\n    public void flush() {\n        if (ttsInit) {\n            ttS.stop();\n        }\n    }\n\n    public void release() {\n        soundPool.release();\n        ttS.shutdown();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/utils/VideoProvider.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.utils;\n\nimport android.content.ContentProvider;\nimport android.content.ContentValues;\nimport android.content.res.AssetFileDescriptor;\nimport android.content.res.AssetManager;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.CancellationSignal;\n\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\n\nimport timber.log.Timber;\n\npublic class VideoProvider extends ContentProvider {\n\n    @Override\n    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {\n        AssetManager am = getContext().getAssets();\n        String file_name = uri.getPath().substring(1);\n\n        if(file_name == null)\n            throw new FileNotFoundException();\n\n        AssetFileDescriptor afd = null;\n\n        try {\n            afd = am.openFd(file_name);\n        } catch (IOException ex) {\n            Timber.e(ex);\n        }\n\n        return afd;\n    }\n\n    @Override\n    public String getType( Uri p1 )\n    {\n        return null;\n    }\n\n    @Override\n    public int delete( Uri p1, String p2, String[] p3 )\n    {\n        return 0;\n    }\n\n    @Override\n    public Cursor query(Uri p1, String[] p2, String p3, String[] p4, String p5 )\n    {\n        return null;\n    }\n\n    @Override\n    public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )\n    {\n        return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );\n    }\n\n    @Override\n    public Uri insert( Uri p1, ContentValues p2 )\n    {\n        return null;\n    }\n\n    @Override\n    public boolean onCreate( )\n    {\n        return false;\n    }\n\n    @Override\n    public int update(Uri p1, ContentValues p2, String p3, String[] p4 )\n    {\n        return 0;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/workout/WorkoutDatabaseFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.workout;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.navigation.Navigation;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\n\nimport java.util.List;\n\npublic class WorkoutDatabaseFragment extends Fragment {\n    private RecyclerView workoutsView;\n    private List<WorkoutItem> workoutItemList;\n\n    private WorkoutsDatabaseAdapter workoutsDatabaseAdapter;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             final ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_workoutdatabase, container, false);\n\n        workoutsView = root.findViewById(R.id.workoutsView);\n\n        workoutsView.setHasFixedSize(true);\n        workoutsView.setLayoutManager(new LinearLayoutManager(getContext()));\n\n        loadFromDatabase();\n\n        return root;\n    }\n\n    protected void loadFromDatabase() {\n        workoutItemList = OpenWorkout.getInstance().getAllUniqueWorkoutItems();\n\n        workoutsDatabaseAdapter = new WorkoutsDatabaseAdapter(getContext(), workoutItemList);\n\n        workoutsDatabaseAdapter.setOnItemClickListener(new GenericAdapter.OnGenericClickListener() {\n            @Override\n            public void onItemClick(int position, View v) {\n                final long workoutSessionId = WorkoutFragmentArgs.fromBundle(getArguments()).getSessionWorkoutId();\n\n                WorkoutDatabaseFragmentDirections.ActionWorkoutDatabaseFragmentToWorkoutSettingsFragment action = WorkoutDatabaseFragmentDirections.actionWorkoutDatabaseFragmentToWorkoutSettingsFragment();\n                action.setMode(GenericSettingsFragment.SETTING_MODE.ADD);\n                action.setTitle(getString(R.string.label_add));\n                action.setSessionWorkoutId(workoutSessionId);\n                action.setWorkoutItemId(workoutItemList.get(position).getWorkoutItemId());\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n            }\n        });\n\n        workoutsView.setAdapter(workoutsDatabaseAdapter);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/workout/WorkoutFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.workout;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.LinearLayout;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.navigation.Navigation;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\nimport com.health.openworkout.gui.datatypes.GenericFragment;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\n\nimport java.util.List;\n\npublic class WorkoutFragment extends GenericFragment {\n    private RecyclerView workoutsView;\n    private WorkoutSession workoutSession;\n    private List<WorkoutItem> workoutItemList;\n\n    private FloatingActionButton expandableButton;\n    private FloatingActionButton addButton;\n    private FloatingActionButton addFromDatabaseButton;\n    private LinearLayout addLayout, addFromDatabaseLayout;\n    private Animation animFabOpen, animFabClose, animFabClock, animFabAntiClock;\n    private boolean isExpandable;\n\n    private WorkoutsAdapter workoutsAdapter;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             final ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_workout, container, false);\n\n        workoutsView = root.findViewById(R.id.workoutsView);\n\n        workoutsView.setHasFixedSize(true);\n        workoutsView.setLayoutManager(new LinearLayoutManager(getContext()));\n\n        isExpandable = false;\n\n        expandableButton = root.findViewById(R.id.expandableButton);\n        addButton = root.findViewById(R.id.addButton);\n        addLayout = root.findViewById(R.id.addLayout);\n        addFromDatabaseButton = root.findViewById(R.id.addFromDatabaseButton);\n        addFromDatabaseLayout = root.findViewById(R.id.addFromDatabaseLayout);\n\n        animFabClose = AnimationUtils.loadAnimation(getContext(), R.anim.fab_close);\n        animFabOpen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open);\n        animFabClock = AnimationUtils.loadAnimation(getContext(), R.anim.fab_rotate_clock);\n        animFabAntiClock = AnimationUtils.loadAnimation(getContext(), R.anim.fab_rotate_anticlock);\n\n        expandableButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (isExpandable) {\n                    addLayout.setVisibility(View.GONE);\n                    addLayout.startAnimation(animFabClose);\n                    addFromDatabaseLayout.setVisibility(View.GONE);\n                    addFromDatabaseLayout.startAnimation(animFabClose);\n                    expandableButton.startAnimation(animFabAntiClock);\n                    isExpandable = false;\n                } else {\n                    addLayout.setVisibility(View.VISIBLE);\n                    addLayout.startAnimation(animFabOpen);\n                    addFromDatabaseLayout.setVisibility(View.VISIBLE);\n                    addFromDatabaseLayout.startAnimation(animFabOpen);\n                    expandableButton.startAnimation(animFabClock);\n                    isExpandable = true;\n                }\n            }\n        });\n\n        addButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                final long workoutSessionId = WorkoutFragmentArgs.fromBundle(getArguments()).getSessionWorkoutId();\n\n                WorkoutFragmentDirections.ActionWorkoutFramgentToWorkoutSettingsFragment action = WorkoutFragmentDirections.actionWorkoutFramgentToWorkoutSettingsFragment();\n                action.setMode(GenericSettingsFragment.SETTING_MODE.ADD);\n                action.setTitle(getString(R.string.label_add));\n                action.setSessionWorkoutId(workoutSessionId);\n                action.setWorkoutItemId(-1);\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n            }\n        });\n\n        addFromDatabaseButton.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                WorkoutFragmentDirections.ActionWorkoutFragmentToWorkoutDatabaseFragment action = WorkoutFragmentDirections.actionWorkoutFragmentToWorkoutDatabaseFragment();\n                action.setSessionWorkoutId(workoutSession.getWorkoutSessionId());\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n            }\n        });\n\n        loadFromDatabase();\n\n        return root;\n    }\n\n    @Override\n    protected String getTitle() {\n        return workoutSession.getName();\n    }\n\n    @Override\n    protected void loadFromDatabase() {\n        final long workoutSessionId = WorkoutFragmentArgs.fromBundle(getArguments()).getSessionWorkoutId();\n        workoutSession = OpenWorkout.getInstance().getWorkoutSession(workoutSessionId);\n\n        workoutItemList = workoutSession.getWorkoutItems();\n\n        workoutsAdapter = new WorkoutsAdapter(getContext(), workoutItemList);\n        workoutsAdapter.setMode(getMode());\n        workoutsView.setAdapter(workoutsAdapter);\n    }\n\n    @Override\n    protected void saveToDatabase() {\n        for (int i=0; i<workoutItemList.size(); i++) {\n            workoutItemList.get(i).setOrderNr(i);\n            OpenWorkout.getInstance().updateWorkoutItem(workoutItemList.get(i));\n        }\n    }\n\n    @Override\n    protected GenericAdapter getAdapter() {\n        return workoutsAdapter;\n    }\n\n    @Override\n    protected RecyclerView getRecyclerView() {\n        return workoutsView;\n    }\n\n    @Override\n    protected List getItemList() {\n        return workoutItemList;\n    }\n\n    @Override\n    protected void onSelectCallback(int position) {\n        WorkoutItem workoutItem = workoutItemList.get(position);\n\n        WorkoutFragmentDirections.ActionWorkoutFragmentToWorkoutSlideFragment action = WorkoutFragmentDirections.actionWorkoutFragmentToWorkoutSlideFragment();\n        action.setTitle(workoutSession.getName());\n        action.setSessionWorkoutId(workoutSession.getWorkoutSessionId());\n        action.setWorkoutItemId(workoutItem.getWorkoutItemId());\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n    @Override\n    protected void onEditCallback(int position) {\n        WorkoutItem workoutItem = workoutItemList.get(position);\n\n        WorkoutFragmentDirections.ActionWorkoutFramgentToWorkoutSettingsFragment action = WorkoutFragmentDirections.actionWorkoutFramgentToWorkoutSettingsFragment();\n        action.setSessionWorkoutId(workoutSession.getWorkoutSessionId());\n        action.setWorkoutItemId(workoutItem.getWorkoutItemId());\n        action.setMode(GenericSettingsFragment.SETTING_MODE.EDIT);\n        action.setTitle(getString(R.string.label_edit));\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n    @Override\n    protected void onDeleteCallback(int position) {\n        Toast.makeText(getContext(), String.format(getString(R.string.label_delete_toast), workoutItemList.get(position).getName()), Toast.LENGTH_SHORT).show();\n        OpenWorkout.getInstance().deleteWorkoutItem(workoutItemList.get(position));\n        workoutItemList.remove(position);\n    }\n\n    @Override\n    protected void onDuplicateCallback(int position) {\n        WorkoutItem origWorkoutItem = workoutItemList.get(position);\n        WorkoutItem duplicatedWorkoutItem = origWorkoutItem.clone();\n\n        duplicatedWorkoutItem.setWorkoutItemId(0);\n        workoutItemList.add(position, duplicatedWorkoutItem);\n        saveToDatabase();\n\n        long workoutItemId = OpenWorkout.getInstance().insertWorkoutItem(duplicatedWorkoutItem);\n        duplicatedWorkoutItem.setWorkoutItemId(workoutItemId);\n    }\n\n    @Override\n    protected void onResetClick() {\n        for (WorkoutItem workoutItem : workoutItemList) {\n            workoutItem.setFinished(false);\n            OpenWorkout.getInstance().updateWorkoutItem(workoutItem);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/workout/WorkoutSettingsFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.workout;\n\nimport android.content.Intent;\nimport android.graphics.drawable.Drawable;\nimport android.media.MediaPlayer;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.CompoundButton;\nimport android.widget.ImageView;\nimport android.widget.Switch;\nimport android.widget.TableRow;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport android.widget.VideoView;\n\nimport androidx.annotation.NonNull;\nimport androidx.cardview.widget.CardView;\nimport androidx.navigation.Navigation;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.gui.datatypes.GenericSettingsFragment;\nimport com.health.openworkout.gui.utils.FileDialogHelper;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport timber.log.Timber;\n\npublic class WorkoutSettingsFragment extends GenericSettingsFragment {\n    private WorkoutItem workoutItem;\n\n    private ImageView imgView;\n    private TextView nameView;\n    private TextView descriptionView;\n    private TextView prepTimeView;\n    private TextView workoutTimeView;\n    private TextView breakTimeView;\n    private TextView repetitionCountView;\n    private Switch timeModeView;\n    private TableRow workoutTimeRow;\n    private TableRow repetitionCountRow;\n    private Switch videoModeView;\n    private TableRow videoCardRow;\n    private CardView videoCardView;\n    private VideoView videoView;\n\n    private FileDialogHelper fileDialogHelper;\n    private boolean isImageDialogRequest;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             final ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_workoutsettings, container, false);\n\n        fileDialogHelper = new FileDialogHelper(this);\n\n        imgView = root.findViewById(R.id.imgView);\n        nameView = root.findViewById(R.id.nameView);\n        descriptionView = root.findViewById(R.id.descriptionView);\n        prepTimeView = root.findViewById(R.id.prepTimeView);\n        workoutTimeView = root.findViewById(R.id.workoutTimeView);\n        breakTimeView = root.findViewById(R.id.breakTimeView);\n        repetitionCountView = root.findViewById(R.id.repetitionCountView);\n        timeModeView = root.findViewById(R.id.timeModeView);\n        workoutTimeRow = root.findViewById(R.id.workoutTimeRow);\n        repetitionCountRow = root.findViewById(R.id.repetitionCountRow);\n        videoModeView = root.findViewById(R.id.videoModeView);\n        videoCardRow = root.findViewById(R.id.videoCardRow);\n        videoCardView = root.findViewById(R.id.videoCardView);\n        videoView = root.findViewById(R.id.videoView);\n\n        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {\n            @Override\n            public void onPrepared(MediaPlayer mp) {\n                mp.setLooping(true);\n            }\n        });\n\n        timeModeView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n            @Override\n            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n                workoutItem.setTimeMode(isChecked);\n                refreshTimeModeState();\n            }\n        });\n\n        videoModeView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n            @Override\n            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {\n                workoutItem.setVideoMode(isChecked);\n                refreshVideoModeState();\n            }\n        });\n\n        imgView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                isImageDialogRequest = true;\n                fileDialogHelper.openImageFileDialog();\n            }\n        });\n\n        // support for SDK version <= 23 videoView onClickListener is not called\n        videoCardView.setOnClickListener(new View.OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        isImageDialogRequest = false;\n                        fileDialogHelper.openVideoFileDialog();\n                    }\n                });\n\n        videoView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                isImageDialogRequest = false;\n                fileDialogHelper.openVideoFileDialog();\n            }\n        });\n\n        setMode(WorkoutSettingsFragmentArgs.fromBundle(getArguments()).getMode());\n\n        return root;\n    }\n\n    @Override\n    protected String getTitle() {\n        return workoutItem.getName();\n    }\n\n    @Override\n    protected void loadFromDatabase(SETTING_MODE mode) {\n        long workoutItemId = WorkoutSettingsFragmentArgs.fromBundle(getArguments()).getWorkoutItemId();\n\n        switch (mode) {\n            case ADD:\n                if (workoutItemId != -1L) {\n                    workoutItem = OpenWorkout.getInstance().getWorkoutItem(workoutItemId).clone();\n                    workoutItem.setWorkoutItemId(0);\n                } else {\n                    workoutItem = new WorkoutItem();\n                }\n                break;\n            case EDIT:\n                workoutItem = OpenWorkout.getInstance().getWorkoutItem(workoutItemId);\n                break;\n        }\n\n        try {\n            if (workoutItem.isImagePathExternal()) {\n                imgView.setImageURI(Uri.parse(workoutItem.getImagePath()));\n            } else {\n                String subFolder;\n                if (OpenWorkout.getInstance().getCurrentUser().isMale()) {\n                    subFolder = \"male\";\n                } else {\n                    subFolder = \"female\";\n                }\n\n                InputStream ims = getContext().getAssets().open(\"image/\" + subFolder + \"/\" + workoutItem.getImagePath());\n                imgView.setImageDrawable(Drawable.createFromStream(ims, null));\n\n                ims.close();\n            }\n        } catch (IOException ex) {\n            Timber.e(ex);\n        } catch (SecurityException ex) {\n            imgView.setImageResource(R.drawable.ic_no_file);\n            Toast.makeText(getContext(), getContext().getString(R.string.error_no_access_to_file) + \" \" + workoutItem.getImagePath(), Toast.LENGTH_SHORT).show();\n            Timber.e(ex);\n        }\n\n        try {\n            if (workoutItem.isVideoPathExternal()) {\n                videoView.setVideoURI(Uri.parse(workoutItem.getVideoPath()));\n            } else {\n                if (OpenWorkout.getInstance().getCurrentUser().isMale()) {\n                    videoView.setVideoPath(\"content://com.health.openworkout.videoprovider/video/male/\" + workoutItem.getVideoPath());\n                } else {\n                    videoView.setVideoPath(\"content://com.health.openworkout.videoprovider/video/female/\" + workoutItem.getVideoPath());\n                }\n            }\n        } catch (SecurityException ex) {\n            videoView.setVideoURI(null);\n            Toast.makeText(getContext(), getContext().getString(R.string.error_no_access_to_file) + \" \" + workoutItem.getVideoPath(), Toast.LENGTH_SHORT).show();\n            Timber.e(ex);\n        }\n\n        videoView.start();\n\n        nameView.setText(workoutItem.getName());\n        descriptionView.setText(workoutItem.getDescription());\n        prepTimeView.setText(Integer.toString(workoutItem.getPrepTime()));\n        workoutTimeView.setText(Integer.toString(workoutItem.getWorkoutTime()));\n        breakTimeView.setText(Integer.toString(workoutItem.getBreakTime()));\n        repetitionCountView.setText(Integer.toString(workoutItem.getRepetitionCount()));\n        videoModeView.setChecked(workoutItem.isVideoMode());\n        timeModeView.setChecked(workoutItem.isTimeMode());\n\n        refreshTimeModeState();\n        refreshVideoModeState();\n    }\n\n    private void refreshTimeModeState() {\n        if (workoutItem.isTimeMode()) {\n            workoutTimeRow.setVisibility(View.VISIBLE);\n            repetitionCountRow.setVisibility(View.GONE);\n        } else {\n            workoutTimeRow.setVisibility(View.GONE);\n            repetitionCountRow.setVisibility(View.VISIBLE);\n        }\n    }\n\n    private void refreshVideoModeState() {\n        if (workoutItem.isVideoMode()) {\n            videoCardRow.setVisibility(View.VISIBLE);\n        } else {\n            videoCardRow.setVisibility(View.GONE);\n        }\n    }\n\n    @Override\n    protected boolean saveToDatabase(SETTING_MODE mode) {\n        boolean checkFormat = true;\n\n        workoutItem.setName(nameView.getText().toString());\n        workoutItem.setDescription(descriptionView.getText().toString());\n        if (prepTimeView.getText().toString().isEmpty()) {\n            prepTimeView.setError(getString(R.string.error_empty_text));\n            checkFormat = false;\n        } else {\n            workoutItem.setPrepTime(Integer.valueOf(prepTimeView.getText().toString()));\n        }\n        if (workoutTimeView.getText().toString().isEmpty()) {\n            workoutTimeView.setError(getString(R.string.error_empty_text));\n            checkFormat = false;\n        } else {\n            workoutItem.setWorkoutTime(Integer.valueOf(workoutTimeView.getText().toString()));\n        }\n        if (breakTimeView.getText().toString().isEmpty()) {\n            breakTimeView.setError(getString(R.string.error_empty_text));\n            checkFormat = false;\n        } else {\n            workoutItem.setBreakTime(Integer.valueOf(breakTimeView.getText().toString()));\n        }\n        if (repetitionCountView.getText().toString().isEmpty()) {\n            repetitionCountView.setError(getString(R.string.error_empty_text));\n            checkFormat = false;\n        } else {\n            workoutItem.setRepetitionCount(Integer.valueOf(repetitionCountView.getText().toString()));\n        }\n\n        workoutItem.setTimeMode(timeModeView.isChecked());\n        workoutItem.setVideoMode(videoModeView.isChecked());\n\n        switch (mode) {\n            case ADD:\n                long workoutSessionId = WorkoutSettingsFragmentArgs.fromBundle(getArguments()).getSessionWorkoutId();\n\n                workoutItem.setWorkoutSessionId(workoutSessionId);\n                workoutItem.setOrderNr(OpenWorkout.getInstance().getWorkoutSession(workoutSessionId).getWorkoutItems().size()+1);\n                OpenWorkout.getInstance().insertWorkoutItem(workoutItem);\n                Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigateUp();\n                break;\n            case EDIT:\n                OpenWorkout.getInstance().updateWorkoutItem(workoutItem);\n                break;\n        }\n\n        return checkFormat;\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {\n        fileDialogHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);\n    }\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (fileDialogHelper.onActivityResult(requestCode, resultCode, data)) {\n            Uri uri = data.getData();\n\n            if (isImageDialogRequest) {\n                imgView.setImageURI(uri);\n                workoutItem.setImagePath(uri.toString());\n                workoutItem.setImagePathExternal(true);\n            } else {\n                videoView.setVideoURI(uri);\n                videoView.start();\n                workoutItem.setVideoPath(uri.toString());\n                workoutItem.setVideoPathExternal(true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/workout/WorkoutSlideFragment.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.workout;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.ColorStateList;\nimport android.content.res.Configuration;\nimport android.graphics.Typeface;\nimport android.graphics.drawable.Drawable;\nimport android.media.MediaPlayer;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.CountDownTimer;\nimport android.os.Handler;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.ScrollView;\nimport android.widget.TableLayout;\nimport android.widget.TableRow;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport android.widget.VideoView;\n\nimport androidx.annotation.NonNull;\nimport androidx.cardview.widget.CardView;\nimport androidx.constraintlayout.widget.ConstraintLayout;\nimport androidx.fragment.app.Fragment;\nimport androidx.navigation.Navigation;\nimport androidx.preference.PreferenceManager;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.core.datatypes.WorkoutSession;\nimport com.health.openworkout.gui.utils.SoundUtils;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Calendar;\n\nimport timber.log.Timber;\n\npublic class WorkoutSlideFragment extends Fragment {\n    private enum WORKOUT_STATE {INIT, PREPARE, START, BREAK, FINISH};\n    private ConstraintLayout constraintLayout;\n    private TextView nameView;\n    private CardView videoCardView;\n    private VideoView videoView;\n    private ImageView videoImageView;\n    private ImageView infoView;\n    private TextView descriptionView;\n    private TextView stateInfoView;\n    private TextView stateInfoDetailView;\n    private ImageView playResumeView;\n    private ScrollView scrollView;\n    private TableLayout workoutOverviewView;\n    private TextView countdownView;\n    private ProgressBar progressView;\n    private FloatingActionButton nextWorkoutStepView;\n\n    private CountDownTimer countDownTimer;\n    private boolean isCountdownTimerStopped;\n    private Calendar startTime;\n    private int remainingSec;\n    private int halftimeSec;\n    private SoundUtils soundUtils;\n    private boolean isSpeechCountdown;\n    private boolean isSpeechWorkoutState;\n\n    private WorkoutSession workoutSession;\n    private long workoutItemOrderNr;\n    private WorkoutItem nextWorkoutItem;\n    private WORKOUT_STATE workoutState;\n    private long workoutItemIdFromFragment;\n\n    public View onCreateView(@NonNull LayoutInflater inflater,\n                             final ViewGroup container, Bundle savedInstanceState) {\n        View root = inflater.inflate(R.layout.fragment_workoutslide, container, false);\n\n        constraintLayout = root.findViewById(R.id.constraintLayout);\n        nameView = root.findViewById(R.id.nameView);\n        videoCardView = root.findViewById(R.id.videoCardView);\n        videoView = root.findViewById(R.id.videoView);\n        videoImageView = root.findViewById(R.id.videoImageView);\n        infoView = root.findViewById(R.id.infoView);\n        descriptionView = root.findViewById(R.id.descriptionView);\n        stateInfoView = root.findViewById(R.id.stateInfoView);\n        stateInfoDetailView = root.findViewById(R.id.stateInfoDetailView);\n        playResumeView = root.findViewById(R.id.playPauseView);\n        scrollView = root.findViewById(R.id.scrollView);\n        workoutOverviewView = root.findViewById(R.id.workoutOverviewView);\n        countdownView = root.findViewById(R.id.countdownView);\n        progressView = root.findViewById(R.id.progressView);\n        nextWorkoutStepView = root.findViewById(R.id.nextWorkoutStepView);\n\n        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());\n        isSpeechCountdown = sharedPreferences.getBoolean(\"speechCountdown\", false);\n        isSpeechWorkoutState = sharedPreferences.getBoolean(\"speechWorkoutState\", false);\n\n        int orientation = this.getResources().getConfiguration().orientation;\n        if (orientation == Configuration.ORIENTATION_PORTRAIT) {\n            ViewGroup.LayoutParams layoutParams = videoCardView.getLayoutParams();\n            layoutParams.width = 0;\n            layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;\n            videoCardView.setLayoutParams(layoutParams);\n        } else {\n            ViewGroup.LayoutParams layoutParams = videoCardView.getLayoutParams();\n            layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;\n            layoutParams.height = 0;\n            videoCardView.setLayoutParams(layoutParams);\n        }\n\n        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {\n            @Override\n            public void onPrepared(MediaPlayer mp) {\n                mp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);\n                mp.setLooping(true);\n            }\n        });\n\n        infoView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (descriptionView.getVisibility() == View.GONE) {\n                    descriptionView.setVisibility(View.VISIBLE);\n                } else {\n                    descriptionView.setVisibility(View.GONE);\n                }\n            }\n        });\n\n        nextWorkoutStepView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                nextWorkoutState();\n            }\n        });\n\n        playResumeView.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                // if rep mode and in running workout state then ignore any clicks\n                if (!nextWorkoutItem.isTimeMode() && workoutState == WORKOUT_STATE.START) {\n                    return;\n                }\n\n                if (countDownTimer != null) {\n                    if (isCountdownTimerStopped) {\n                        resumeCountdownTimer();\n                    } else {\n                        pauseCountdownTimer();\n                    }\n                }\n            }\n        });\n\n        soundUtils = OpenWorkout.getInstance().getSoundUtils();\n        initWorkout();\n\n        return root;\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        if (countDownTimer != null) {\n            countDownTimer.cancel();\n        }\n    }\n\n    private void initWorkout() {\n        isCountdownTimerStopped = false;\n        long workoutSessionId = WorkoutSlideFragmentArgs.fromBundle(getArguments()).getSessionWorkoutId();\n        workoutItemIdFromFragment = WorkoutSlideFragmentArgs.fromBundle(getArguments()).getWorkoutItemId();\n        workoutSession = OpenWorkout.getInstance().getWorkoutSession(workoutSessionId);\n\n        workoutState = WORKOUT_STATE.INIT;\n        nextWorkoutState();\n    }\n\n    private void nextWorkoutState() {\n        isCountdownTimerStopped = false;\n        playResumeView.setImageResource(R.drawable.ic_play);\n        soundUtils.flush();\n\n        switch (workoutState) {\n            case INIT:\n                nextWorkout();\n                prepareWorkout();\n                break;\n            case PREPARE:\n                startWorkout();\n                break;\n            case START:\n                onFinishWorkoutItem();\n                breakWorkout();\n                nextWorkout();\n                showWorkoutOverview();\n                break;\n            case BREAK:\n                prepareWorkout();\n                break;\n            case FINISH:\n                break;\n        }\n    }\n\n    private void nextWorkout() {\n        // if no workout item was selected use the next not finished workout item in the session list\n        if (workoutItemIdFromFragment == -1L) {\n            // Get current orderNr before updating to nextWorkoutItem\n            if (nextWorkoutItem == null) {\n                workoutItemOrderNr = 0;\n            } else {\n                workoutItemOrderNr = nextWorkoutItem.getOrderNr();\n            }\n            if (workoutSession.getNextWorkoutItem(workoutItemOrderNr) == null) {\n                onFinishSession();\n                return;\n            }\n\n            nextWorkoutItem = workoutSession.getNextWorkoutItem(workoutItemOrderNr);\n        } else {\n            // otherwise use the workout item as a starting point which was selected in the workout fragment\n            for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n                if (workoutItem.getWorkoutItemId() == workoutItemIdFromFragment) {\n                    nextWorkoutItem = workoutItem;\n                    workoutItemIdFromFragment = -1L;\n                    break;\n                }\n            }\n        }\n\n        int workoutItemPos = workoutSession.getWorkoutItems().indexOf(nextWorkoutItem) + 1;\n        startTime = Calendar.getInstance();\n\n        nameView.setText(nextWorkoutItem.getName() + \" (\" + workoutItemPos + \"/\" + workoutSession.getWorkoutItems().size() + \")\");\n\n        if (isSpeechWorkoutState && workoutState != WORKOUT_STATE.INIT) {\n            soundUtils.textToSpeech(getContext().getString(R.string.speak_next_workout) + \" \" + nextWorkoutItem.getName());\n        }\n\n        if (nextWorkoutItem.isVideoMode()) {\n            videoView.setVisibility(View.VISIBLE);\n            videoImageView.setVisibility(View.GONE);\n\n            try {\n                if (nextWorkoutItem.isVideoPathExternal()) {\n                    videoView.setVideoURI(Uri.parse(nextWorkoutItem.getVideoPath()));\n                } else {\n                    if (OpenWorkout.getInstance().getCurrentUser().isMale()) {\n                        videoView.setVideoPath(\"content://com.health.openworkout.videoprovider/video/male/\" + nextWorkoutItem.getVideoPath());\n                    } else {\n                        videoView.setVideoPath(\"content://com.health.openworkout.videoprovider/video/female/\" + nextWorkoutItem.getVideoPath());\n                    }\n                }\n            } catch (SecurityException ex) {\n                videoView.setVideoURI(null);\n                Toast.makeText(getContext(), getContext().getString(R.string.error_no_access_to_file) + \" \" + nextWorkoutItem.getVideoPath(), Toast.LENGTH_SHORT).show();\n                Timber.e(ex);\n            }\n\n            videoCardView.animate().alpha(1.0f);\n            videoView.seekTo(100);\n        } else {\n            videoView.setVisibility(View.GONE);\n            videoImageView.setVisibility(View.VISIBLE);\n\n            try {\n                if (nextWorkoutItem.isImagePathExternal()) {\n                    videoImageView.setImageURI(Uri.parse(nextWorkoutItem.getImagePath()));\n                } else {\n                    String subFolder;\n                    if (OpenWorkout.getInstance().getCurrentUser().isMale()) {\n                        subFolder = \"male\";\n                    } else {\n                        subFolder = \"female\";\n                    }\n\n                    InputStream ims = getContext().getAssets().open(\"image/\" + subFolder + \"/\" + nextWorkoutItem.getImagePath());\n                    videoImageView.setImageDrawable(Drawable.createFromStream(ims, null));\n\n                    ims.close();\n                }\n            } catch (IOException ex) {\n                Timber.e(ex);\n            } catch (SecurityException ex) {\n                videoImageView.setImageResource(R.drawable.ic_no_file);\n                Toast.makeText(getContext(), getContext().getString(R.string.error_no_access_to_file) + \" \" + nextWorkoutItem.getImagePath(), Toast.LENGTH_SHORT).show();\n                Timber.e(ex);\n            }\n        }\n\n        descriptionView.setText(nextWorkoutItem.getDescription());\n    }\n\n    private void prepareWorkout() {\n        workoutState = WORKOUT_STATE.PREPARE;\n        hideWorkoutOverview();\n\n        stateInfoView.setText(R.string.label_prepare);\n        stateInfoView.setTextColor(getContext().getResources().getColor(R.color.colorRed));\n            if (nextWorkoutItem.isTimeMode()) {\n                stateInfoDetailView.setText(nextWorkoutItem.getName() + \" (\" + nextWorkoutItem.getWorkoutTime() + getContext().getString(R.string.seconds_unit) + \")\");\n            } else {\n                stateInfoDetailView.setText(nextWorkoutItem.getName() + \" (\" + Integer.toString(nextWorkoutItem.getRepetitionCount()) + \"x\" + \")\");\n            }\n        stateInfoDetailView.setTextColor(getContext().getResources().getColor(R.color.colorRed));\n        countdownView.setTextColor(getContext().getResources().getColor(R.color.colorRed));\n        progressView.setProgressTintList(ColorStateList.valueOf(getContext().getResources().getColor(R.color.colorRed)));\n        nextWorkoutStepView.setBackgroundTintList(ColorStateList.valueOf(getContext().getResources().getColor(R.color.colorRed)));\n        playResumeView.setColorFilter(getContext().getResources().getColor(R.color.colorRed));\n\n        if (isSpeechWorkoutState) {\n            soundUtils.textToSpeech(getContext().getString(R.string.label_prepare) + \" \" + nextWorkoutItem.getName());\n        }\n\n        prepareCountdownTimer(nextWorkoutItem.getPrepTime());\n        activateCountdownTimer(nextWorkoutItem.getPrepTime());\n    }\n\n    private void startWorkout() {\n        workoutState = WORKOUT_STATE.START;\n\n        stateInfoView.setText(R.string.label_workout);\n        stateInfoView.setTextColor(getContext().getResources().getColor(R.color.colorLightBlue));\n        stateInfoDetailView.setTextColor(getContext().getResources().getColor(R.color.colorLightBlue));\n        countdownView.setTextColor(getContext().getResources().getColor(R.color.colorLightBlue));\n        progressView.setProgressTintList(ColorStateList.valueOf(getContext().getResources().getColor(R.color.colorLightBlue)));\n        nextWorkoutStepView.setBackgroundTintList(ColorStateList.valueOf(getContext().getResources().getColor(R.color.colorLightBlue)));\n        playResumeView.setColorFilter(getContext().getResources().getColor(R.color.colorLightBlue));\n\n        videoView.start();\n\n        if (isSpeechWorkoutState) {\n            soundUtils.textToSpeech(getContext().getString(R.string.label_workout) + \" \" + nextWorkoutItem.getName());\n        }\n\n        if (nextWorkoutItem.isTimeMode()) {\n            prepareCountdownTimer(nextWorkoutItem.getWorkoutTime());\n            activateCountdownTimer(nextWorkoutItem.getWorkoutTime());\n        } else {\n            pauseCountdownTimer();\n            countdownView.setText(\"\");\n            //countdownView.setText(String.format(getString(R.string.label_repetition_info), nextWorkoutItem.getRepetitionCount(), nextWorkoutItem.getName()));\n            progressView.setVisibility(View.INVISIBLE);\n        }\n    }\n\n    private void breakWorkout() {\n        workoutState = WORKOUT_STATE.BREAK;\n\n        stateInfoView.setText(\"\");\n        stateInfoView.setTextColor(getContext().getResources().getColor(R.color.colorGreen));\n        stateInfoView.setTextColor(getContext().getResources().getColor(R.color.colorGreen));\n        stateInfoDetailView.setText(R.string.label_break);\n        stateInfoDetailView.setTextColor(getContext().getResources().getColor(R.color.colorGreen));\n        countdownView.setTextColor(getContext().getResources().getColor(R.color.colorGreen));\n        progressView.setProgressTintList(ColorStateList.valueOf(getContext().getResources().getColor(R.color.colorGreen)));\n        nextWorkoutStepView.setBackgroundTintList(ColorStateList.valueOf(getContext().getResources().getColor(R.color.colorGreen)));\n        playResumeView.setColorFilter(getContext().getResources().getColor(R.color.colorGreen));\n\n        if (isSpeechWorkoutState) {\n            soundUtils.textToSpeech(getContext().getString(R.string.label_break));\n        }\n\n        prepareCountdownTimer(nextWorkoutItem.getBreakTime());\n        activateCountdownTimer(nextWorkoutItem.getBreakTime());\n    }\n\n    private void onFinishWorkoutItem() {\n        Calendar stopTime = Calendar.getInstance();\n\n        long diffTimeInSec = (stopTime.getTimeInMillis() - startTime.getTimeInMillis()) / 1000L;\n        nextWorkoutItem.setElapsedTime(diffTimeInSec);\n\n        nextWorkoutItem.setFinished(true);\n        OpenWorkout.getInstance().updateWorkoutItem(nextWorkoutItem);\n    }\n\n    private void onFinishSession() {\n        workoutSession.setFinished(true);\n        OpenWorkout.getInstance().updateWorkoutSession(workoutSession);\n\n        WorkoutSlideFragmentDirections.ActionNavWorkoutSlideFragmentToTrophyFragment action = WorkoutSlideFragmentDirections.actionNavWorkoutSlideFragmentToTrophyFragment();\n        action.setSessionWorkoutId(workoutSession.getWorkoutSessionId());\n        Navigation.findNavController(getActivity(), R.id.nav_host_fragment).navigate(action);\n    }\n\n\n    private void showWorkoutOverview() {\n        descriptionView.setVisibility(View.GONE);\n        workoutOverviewView.setVisibility(View.VISIBLE);\n\n        workoutOverviewView.removeAllViews();\n\n        for (WorkoutItem workoutItem : workoutSession.getWorkoutItems()) {\n            final OverviewWorkoutItemEntry overviewWorkoutItemEntry = new OverviewWorkoutItemEntry(getContext(), workoutItem);\n            workoutOverviewView.addView(overviewWorkoutItemEntry);\n\n            if (workoutItem.getWorkoutItemId() == nextWorkoutItem.getWorkoutItemId()) {\n                overviewWorkoutItemEntry.setHighlight();\n                new Handler().post(new Runnable() {\n                    @Override\n                    public void run() {\n                        scrollView.smoothScrollTo(0, overviewWorkoutItemEntry.getTop()-50);\n                    }\n                });\n            }\n        }\n    }\n\n    private void hideWorkoutOverview() {\n        descriptionView.setVisibility(View.GONE);\n        workoutOverviewView.setVisibility(View.GONE);\n    }\n\n    private class OverviewWorkoutItemEntry extends TableRow {\n        private ImageView status;\n        private TextView reps;\n        private TextView name;\n\n        public OverviewWorkoutItemEntry(Context context, WorkoutItem workoutItem) {\n            super(context);\n\n            status = new ImageView(context);\n            reps = new TextView(context);\n            name = new TextView(context);\n\n            name.setText(workoutItem.getName());\n\n            if (workoutItem.isTimeMode()) {\n                reps.setText(workoutItem.getWorkoutTime() + context.getString(R.string.seconds_unit));\n            } else {\n                reps.setText(Integer.toString(workoutItem.getRepetitionCount()) + \"x\");\n            }\n            status.setPadding(0, 0, 20, 0);\n            reps.setPadding(0, 0, 20, 0);\n\n            if (workoutItem.isFinished()) {\n                status.setImageResource(R.drawable.ic_workout_done);\n            }\n\n            addView(status);\n            addView(reps);\n            addView(name);\n\n            setPadding(10, 10, 10, 10);\n        }\n\n        public void setHighlight() {\n            name.setTypeface(null, Typeface.BOLD);\n            status.setImageResource(R.drawable.ic_workout_select);\n        }\n    }\n\n    private void prepareCountdownTimer(int sec) {\n        remainingSec = sec;\n        progressView.setMax(remainingSec);\n        progressView.setProgress(remainingSec);\n        progressView.setVisibility(View.VISIBLE);\n        countdownView.setText(remainingSec + getString(R.string.seconds_unit));\n\n        halftimeSec = remainingSec / 2;\n    }\n\n    private void pauseCountdownTimer() {\n        if (countDownTimer != null) {\n            countDownTimer.cancel();\n        }\n\n        isCountdownTimerStopped = true;\n        playResumeView.setImageResource(R.drawable.ic_pause);\n    }\n\n    private void resumeCountdownTimer() {\n        isCountdownTimerStopped = false;\n        activateCountdownTimer(remainingSec);\n        playResumeView.setImageResource(R.drawable.ic_play);\n    }\n\n    private void activateCountdownTimer(int sec) {\n        if (countDownTimer != null) {\n            countDownTimer.cancel();\n        }\n\n        countDownTimer = new CountDownTimer(remainingSec * 1000, 1000) {\n\n            public void onTick(long millisUntilFinished) {\n                remainingSec = (int)(millisUntilFinished / 1000);\n                countdownView.setText(remainingSec + getString(R.string.seconds_unit));\n                progressView.setProgress(remainingSec);\n\n                switch (workoutState) {\n                    case PREPARE:\n                        if (isSpeechCountdown) {\n                            switch (remainingSec) {\n                                case 5:\n                                    soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_five));\n                                    break;\n                                case 4:\n                                    soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_four));\n                                    break;\n                                case 3:\n                                    soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_three));\n                                    break;\n                                case 2:\n                                    soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_two));\n                                    break;\n                                case 1:\n                                    soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_one));\n                                    break;\n                            }\n                        } else {\n                            if ((remainingSec == 3) || (remainingSec == 2) || (remainingSec == 1)) {\n                                soundUtils.playSound(SoundUtils.SOUND.WORKOUT_COUNT_BEFORE_START);\n                            }\n                        }\n                        break;\n                    case START:\n                        if (remainingSec == halftimeSec) {\n                            soundUtils.textToSpeech(getContext().getString(R.string.speak_halftime));\n                        } else if (isSpeechCountdown) {\n                                switch (remainingSec) {\n                                    case 5:\n                                        soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_five));\n                                        break;\n                                    case 4:\n                                        soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_four));\n                                        break;\n                                    case 3:\n                                        soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_three));\n                                        break;\n                                    case 2:\n                                        soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_two));\n                                        break;\n                                    case 1:\n                                        soundUtils.textToSpeechNoInterrupt(getContext().getString(R.string.speak_one));\n                                        break;\n                                }\n                            } else {\n                                if ((remainingSec == 3) || (remainingSec == 2) || (remainingSec == 1))\n                                    soundUtils.playSound(SoundUtils.SOUND.WORKOUT_COUNT_BEFORE_START);\n                            }\n                        break;\n                }\n            }\n\n            public void onFinish() {\n                switch (workoutState) {\n                    case PREPARE:\n                        soundUtils.playSound(SoundUtils.SOUND.WORKOUT_START);\n                        break;\n                    case START:\n                        soundUtils.playSound(SoundUtils.SOUND.WORKOUT_STOP);\n                        break;\n                }\n\n                nextWorkoutState();\n            }\n        };\n\n        getActivity().runOnUiThread(new Runnable() {\n            @Override\n            public void run() {\n                countDownTimer.start();\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/workout/WorkoutsAdapter.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.workout;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\n\nimport timber.log.Timber;\n\npublic class WorkoutsAdapter extends GenericAdapter<WorkoutsAdapter.ViewHolder> {\n    private final List<WorkoutItem> workoutItemList;\n    private Context context;\n\n    public WorkoutsAdapter(Context aContext, List<WorkoutItem> workoutItemList) {\n        super(aContext);\n        this.context = aContext;\n        this.workoutItemList = workoutItemList;\n    }\n\n    @Override\n    public WorkoutsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_workout, parent, false);\n\n        ViewHolder viewHolder = new ViewHolder(view);\n\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {\n        super.onBindViewHolder(holder, position);\n        WorkoutItem workoutItem = workoutItemList.get(position);\n        holder.nameView.setText(workoutItem.getName());\n\n        if (workoutItem.isFinished()) {\n            holder.doneView.setVisibility(View.VISIBLE);\n        } else {\n            holder.doneView.setVisibility(View.INVISIBLE);\n        }\n\n        if (workoutItem.isTimeMode()) {\n            holder.detailedView.setText(String.format(context.getString(R.string.label_work_duration_item_info), workoutItem.getWorkoutTime()));\n        } else {\n            holder.detailedView.setText(String.format(context.getString(R.string.label_repetition_item_info), workoutItem.getRepetitionCount()));\n        }\n\n        holder.prepView.setText(String.format(context.getString(R.string.label_prep_duration_item_info), workoutItem.getPrepTime()));\n        holder.breakView.setText(String.format(context.getString(R.string.label_break_duration_item_info), workoutItem.getBreakTime()));\n\n        try {\n            if (workoutItem.isImagePathExternal()) {\n                holder.imgView.setImageURI(Uri.parse(workoutItem.getImagePath()));\n            } else {\n                String subFolder;\n                if (OpenWorkout.getInstance().getCurrentUser().isMale()) {\n                    subFolder = \"male\";\n                } else {\n                    subFolder = \"female\";\n                }\n\n                InputStream ims = context.getAssets().open(\"image/\" + subFolder + \"/\" + workoutItem.getImagePath());\n                holder.imgView.setImageDrawable(Drawable.createFromStream(ims, null));\n\n                ims.close();\n            }\n        } catch (IOException ex) {\n            holder.imgView.setImageResource(R.drawable.ic_no_file);\n            Timber.e(ex);\n        } catch (SecurityException ex) {\n            holder.imgView.setImageResource(R.drawable.ic_no_file);\n            Toast.makeText(context, context.getString(R.string.error_no_access_to_file) + \" \" + workoutItem.getImagePath(), Toast.LENGTH_SHORT).show();\n            Timber.e(ex);\n        }\n\n        switch (getMode()) {\n            case VIEW:\n                break;\n            case EDIT:\n                holder.doneView.setVisibility(View.GONE);\n                break;\n        }\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return workoutItemList.get(position).getWorkoutItemId();\n    }\n\n    @Override\n    public int getItemCount() {\n        return workoutItemList.size();\n    }\n\n    static class ViewHolder extends GenericAdapter.ViewHolder {\n        TextView prepView;\n        ImageView imgView;\n        TextView nameView;\n        TextView detailedView;\n        ImageView doneView;\n        TextView breakView;\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            prepView = itemView.findViewById(R.id.prepView);\n            imgView = itemView.findViewById(R.id.imgView);\n            nameView = itemView.findViewById(R.id.nameView);\n            detailedView = itemView.findViewById(R.id.detailedView);\n            doneView = itemView.findViewById(R.id.doneView);\n            breakView = itemView.findViewById(R.id.breakView);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/health/openworkout/gui/workout/WorkoutsDatabaseAdapter.java",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\npackage com.health.openworkout.gui.workout;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.health.openworkout.R;\nimport com.health.openworkout.core.OpenWorkout;\nimport com.health.openworkout.core.datatypes.WorkoutItem;\nimport com.health.openworkout.gui.datatypes.GenericAdapter;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.List;\n\nimport timber.log.Timber;\n\npublic class WorkoutsDatabaseAdapter extends RecyclerView.Adapter<WorkoutsDatabaseAdapter.ViewHolder> {\n    private final List<WorkoutItem> workoutItemList;\n    private Context context;\n    private static GenericAdapter.OnGenericClickListener onItemClickListener;\n\n    public WorkoutsDatabaseAdapter(Context aContext, List<WorkoutItem> workoutItemList) {\n        this.context = aContext;\n        this.workoutItemList = workoutItemList;\n    }\n\n    public void setOnItemClickListener(GenericAdapter.OnGenericClickListener onItemClickListener) {\n        this.onItemClickListener = onItemClickListener;\n    }\n\n    @Override\n    public WorkoutsDatabaseAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_workoutdatabase, parent, false);\n\n        ViewHolder viewHolder = new ViewHolder(view);\n\n        return viewHolder;\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {\n        WorkoutItem workoutItem = workoutItemList.get(position);\n        holder.nameView.setText(workoutItem.getName());\n        holder.detailedView.setText(workoutItem.getDescription());\n\n        try {\n            if (workoutItem.isImagePathExternal()) {\n                holder.imgView.setImageURI(Uri.parse(workoutItem.getImagePath()));\n            } else {\n\n                String subFolder;\n                if (OpenWorkout.getInstance().getCurrentUser().isMale()) {\n                    subFolder = \"male\";\n                } else {\n                    subFolder = \"female\";\n                }\n\n                InputStream ims = context.getAssets().open(\"image/\" + subFolder + \"/\" + workoutItem.getImagePath());\n                holder.imgView.setImageDrawable(Drawable.createFromStream(ims, null));\n\n                ims.close();\n            }\n        } catch (IOException ex) {\n            holder.imgView.setImageResource(R.drawable.ic_no_file);\n            Timber.e(ex);\n        } catch (SecurityException ex) {\n            holder.imgView.setImageResource(R.drawable.ic_no_file);\n            Toast.makeText(context, context.getString(R.string.error_no_access_to_file) + \" \" + workoutItem.getImagePath(), Toast.LENGTH_SHORT).show();\n            Timber.e(ex);\n        }\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return workoutItemList.get(position).getWorkoutItemId();\n    }\n\n    @Override\n    public int getItemCount() {\n        return workoutItemList.size();\n    }\n\n    static class ViewHolder extends RecyclerView.ViewHolder {\n        ImageView imgView;\n        TextView nameView;\n        TextView detailedView;\n\n\n        public ViewHolder(@NonNull View itemView) {\n            super(itemView);\n\n            imgView = itemView.findViewById(R.id.imgView);\n            nameView = itemView.findViewById(R.id.nameView);\n            detailedView = itemView.findViewById(R.id.detailedView);\n\n            itemView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    onItemClickListener.onItemClick(getAdapterPosition(), v);\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/anim/fab_close.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fillAfter=\"true\">\n    <translate\n        android:fromXDelta=\"0%\"\n        android:toXDelta=\"0%\"\n        android:fromYDelta=\"0%\"\n        android:toYDelta=\"+100%\"\n        android:duration=\"300\"/>\n\n    <alpha\n        android:fromAlpha=\"1.0\"\n        android:toAlpha=\"0.0\"\n        android:duration=\"300\"\n        android:interpolator=\"@android:anim/accelerate_interpolator\">\n    </alpha>\n</set>"
  },
  {
    "path": "app/src/main/res/anim/fab_open.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:fillAfter=\"true\">\n    <translate\n        android:fromXDelta=\"0%\"\n        android:toXDelta=\"0%\"\n        android:fromYDelta=\"+100%\"\n        android:toYDelta=\"0%\"\n        android:duration=\"300\"/>\n\n    <alpha\n        android:duration=\"300\"\n        android:fromAlpha=\"0.0\"\n        android:interpolator=\"@android:anim/accelerate_interpolator\"\n        android:toAlpha=\"1.0\">\n    </alpha>\n</set>"
  },
  {
    "path": "app/src/main/res/anim/fab_rotate_anticlock.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fillAfter=\"true\">\n    <rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:fromDegrees=\"45\"\n        android:toDegrees=\"0\"\n        android:interpolator=\"@android:anim/linear_interpolator\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n        android:duration=\"300\" >\n    </rotate>\n</set>"
  },
  {
    "path": "app/src/main/res/anim/fab_rotate_clock.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fillAfter=\"true\">\n    <rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:fromDegrees=\"0\"\n        android:toDegrees=\"45\"\n        android:interpolator=\"@android:anim/linear_interpolator\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n        android:duration=\"300\" >\n    </rotate>\n</set>"
  },
  {
    "path": "app/src/main/res/drawable/button_flat_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\" android:drawable=\"@drawable/rect_pressed\"/>\n    <item android:state_enabled=\"false\" android:drawable=\"@drawable/rect_disabled\" />\n    <item android:drawable=\"@drawable/rect_normal\"/>\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#33B6EA\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_avatar.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"511.999dp\"\n    android:height=\"511.999dp\"\n    android:viewportWidth=\"511.999\"\n    android:viewportHeight=\"511.999\">\n  <path\n      android:pathData=\"M229.921,493.219l-26.095,-191.359c-1.62,-11.88 6.697,-22.824 18.578,-24.445c11.879,-1.615 22.824,6.697 24.445,18.578l26.095,191.359c1.62,11.88 -6.697,22.824 -18.578,24.445C242.383,513.428 231.528,505.003 229.921,493.219z\"\n      android:fillColor=\"#FFB69E\"/>\n  <path\n      android:pathData=\"M213.976,376.289h43.824l-10.95,-80.295c-1.62,-11.881 -12.566,-20.194 -24.445,-18.578c-11.881,1.62 -20.198,12.565 -18.578,24.445L213.976,376.289z\"\n      android:fillColor=\"#3C5A73\"/>\n  <path\n      android:pathData=\"M357.478,251.907l-28.942,-56.281c-4.61,-8.965 -11.728,-16.395 -20.487,-21.386l-50.222,-28.617l0.379,-70.74l57.327,-45.888c7.021,-5.619 8.156,-15.867 2.536,-22.888c-5.619,-7.02 -15.866,-8.157 -22.888,-2.536l-63.392,50.744c-3.836,3.071 -6.081,7.711 -6.108,12.624l-0.478,89.387l-72.536,127.302l0.334,206.658c0,11.99 9.72,21.71 21.71,21.71s21.71,-9.72 21.71,-21.71V308.559l52.283,1.036l9.86,-17.304l87.558,-16.862C356.812,273.37 362.519,261.569 357.478,251.907zM279.79,255.039l22.233,-39.018l16.469,31.564L279.79,255.039z\"\n      android:fillColor=\"#FFB69E\"/>\n  <path\n      android:pathData=\"M328.535,195.656c-4.61,-8.983 -11.736,-16.429 -20.509,-21.428l-11.461,-6.531c-3.293,5.572 -9.608,9.442 -16.12,9.442c-10.349,0 -18.012,-8.458 -18.46,-18.46c-0.15,-3.346 0.811,-6.516 2.495,-9.264l-6.655,-3.792l0.24,-44.83h-32.567l-0.297,55.534l-72.536,127.302l43.755,24.931l52.283,1.036c0,0 50.554,-88.724 53.317,-93.574l10.987,21.057l30.033,-13.151L328.535,195.656z\"\n      android:fillColor=\"#FFA50A\"/>\n  <path\n      android:pathData=\"M244.144,261.904c-8.831,1.701 -14.61,10.237 -12.909,19.068c1.696,8.803 10.209,14.614 19.068,12.909l8.26,-1.591c6.847,-12.016 14.375,-25.228 21.226,-37.252L244.144,261.904z\"\n      android:fillColor=\"#FFB69E\"/>\n  <path\n      android:pathData=\"M305.353,112.911m-37.68,0a37.68,37.68 0,1 1,75.36 0a37.68,37.68 0,1 1,-75.36 0\"\n      android:fillColor=\"#FFB69E\"/>\n  <path\n      android:pathData=\"M196.421,377.293l0,-68.734l-43.755,-24.931l0.152,93.665z\"\n      android:fillColor=\"#3C5A73\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_billing.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_dark_mode.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18V6c3.31,0 6,2.69 6,6s-2.69,6 -6,6z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_database.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_debug_logging.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M5,16c0,3.87 3.13,7 7,7s7,-3.13 7,-7v-4L5,12v4zM16.12,4.37l2.1,-2.1 -0.82,-0.83 -2.3,2.31C14.16,3.28 13.12,3 12,3s-2.16,0.28 -3.09,0.75L6.6,1.44l-0.82,0.83 2.1,2.1C6.14,5.64 5,7.68 5,10v1h14v-1c0,-2.32 -1.14,-4.36 -2.88,-5.63zM9,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM15,9c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_delete.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#FF4444\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_download.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#33B6EA\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_download_finished.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#1EFAA0\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM10,17l-3.5,-3.5 1.41,-1.41L10,14.17 15.18,9l1.41,1.41L10,17z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_duplicate.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_edit.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#1EFAA0\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_export.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#33B6EA\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_goal.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"496.8dp\"\n    android:height=\"496.8dp\"\n    android:viewportWidth=\"496.8\"\n    android:viewportHeight=\"496.8\">\n  <path\n      android:pathData=\"M491.6,484.8l-138.4,12l-137.6,-12l137.6,-271.2z\"\n      android:fillColor=\"#1589AD\"/>\n  <path\n      android:pathData=\"M353.2,213.6l138.4,271.2l-138.4,12\"\n      android:fillColor=\"#035670\"/>\n  <path\n      android:pathData=\"M353.2,448l79.2,-79.2l-44.8,-87.2l-34.4,-34.4l-34.4,34.4l-44,87.2z\"\n      android:fillColor=\"#1EA4C4\"/>\n  <path\n      android:pathData=\"M353.2,448l79.2,-79.2l-44.8,-87.2l-34.4,-34.4\"\n      android:fillColor=\"#066B93\"/>\n  <path\n      android:pathData=\"M412.4,479.2l-203.2,17.6l-205.6,-13.6l205.6,-403.2z\"\n      android:fillColor=\"#1589AD\"/>\n  <path\n      android:pathData=\"M209.2,80l205.6,403.2l-205.6,13.6\"\n      android:fillColor=\"#057091\"/>\n  <path\n      android:pathData=\"M209.2,424.8l116,-116.8l-65.6,-128.8l-50.4,-50.4l-51.2,50.4l-65.6,128.8z\"\n      android:fillColor=\"#1EA4C4\"/>\n  <path\n      android:pathData=\"M209.2,424.8l116,-116.8l-65.6,-128.8l-50.4,-50.4\"\n      android:fillColor=\"#1290AD\"/>\n  <path\n      android:pathData=\"M242,278.4l32.8,32.8l34.4,-33.6l-100,-197.6l-100.8,197.6l34.4,33.6l32.8,-32.8l33.6,32.8z\"\n      android:fillColor=\"#9ADFEF\"/>\n  <path\n      android:pathData=\"M209.2,311.2l32.8,-32.8l32.8,32.8l34.4,-33.6l-100,-197.6\"\n      android:fillColor=\"#7DD4E2\"/>\n  <path\n      android:pathData=\"M209.2,11.2m-11.2,0a11.2,11.2 0,1 1,22.4 0a11.2,11.2 0,1 1,-22.4 0\"\n      android:fillColor=\"#C92B00\"/>\n  <path\n      android:pathData=\"M208.4,28.8c-2.4,0 -2.4,0 -8,-1.6v74.4c0,3.2 4.8,5.6 8,5.6s8,-2.4 8,-5.6V27.2C216.4,30.4 210.8,28.8 208.4,28.8z\"\n      android:fillColor=\"#1EA4C4\"/>\n  <path\n      android:pathData=\"M208.4,107.2c3.2,0 8,-2.4 8,-5.6V27.2c-4,1.6 -5.6,1.6 -8,1.6\"\n      android:fillColor=\"#087799\"/>\n  <path\n      android:pathData=\"M216.4,4c4.8,4 4.8,11.2 0,16s-11.2,4.8 -16,0\"\n      android:fillColor=\"#9E1600\"/>\n  <path\n      android:pathData=\"M205.361,6.483a1.6,4.8 45.016,1 0,-2.262 -2.263a1.6,4.8 45.016,1 0,2.262 2.263z\"\n      android:fillColor=\"#E28133\"/>\n  <path\n      android:pathData=\"M324.4,64.8l14.4,-16l-90.4,0l0,32l90.4,0z\"\n      android:fillColor=\"#9E1600\"/>\n  <path\n      android:pathData=\"M338.8,80.8l-14.4,-16l14.4,-16l-90.4,0\"\n      android:fillColor=\"#770B00\"/>\n  <path\n      android:pathData=\"M216.4,32.8h64v24h-64z\"\n      android:fillColor=\"#C92B00\"/>\n  <path\n      android:pathData=\"M216.4,32.8l64,0l0,24\"\n      android:fillColor=\"#9E1600\"/>\n  <path\n      android:pathData=\"M0.4,480.8h496v16h-496z\"\n      android:fillColor=\"#057091\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_help.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,18h2v-2h-2v2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5 0,-2.21 -1.79,-4 -4,-4z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_home.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"468.293dp\"\n    android:height=\"468.293dp\"\n    android:viewportWidth=\"468.293\"\n    android:viewportHeight=\"468.293\">\n  <path\n      android:pathData=\"M364.275,140.489l32.721,-32.721c2.676,-2.676 2.676,-7.016 0,-9.692l-14.978,-14.978c-2.676,-2.676 -7.016,-2.677 -9.692,0l-32.721,32.721L364.275,140.489z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M364.275,140.489l32.721,-32.721c2.676,-2.676 2.676,-7.016 0,-9.692l-6.688,-6.688l-37.567,37.567L364.275,140.489z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M104.018,140.489l-32.721,-32.721c-2.676,-2.676 -2.676,-7.016 0,-9.692l14.978,-14.978c2.676,-2.676 7.016,-2.677 9.692,0l32.721,32.721L104.018,140.489z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M104.018,140.489l-32.721,-32.721c-2.676,-2.676 -2.676,-7.016 0,-9.692l6.688,-6.688l37.567,37.567L104.018,140.489z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M211.106,33.08h46.13v66.835h-46.13z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M234.146,72.729A197.782,197.782 0,0 0,36.363 270.512A197.782,197.782 0,0 0,234.146 468.293A197.782,197.782 0,0 0,431.928 270.512A197.782,197.782 0,0 0,234.146 72.729zM234.146,115.318A155.192,155.192 0,0 1,389.338 270.512A155.192,155.192 0,0 1,234.146 425.703A155.192,155.192 0,0 1,78.953 270.512A155.192,155.192 0,0 1,234.146 115.318z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M184.87,9.855v29.905c0,5.443 4.412,9.855 9.855,9.855h78.842c5.443,0 9.855,-4.412 9.855,-9.855V9.855c0,-5.443 -4.412,-9.855 -9.855,-9.855h-78.842C189.283,0 184.87,4.412 184.87,9.855z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M273.567,0h-37.608v49.616h37.608c5.443,0 9.855,-4.413 9.855,-9.855V9.855C283.422,4.412 279.01,0 273.567,0z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M245.361,257.595V164.14c0,-6.194 -5.021,-11.215 -11.215,-11.215c-6.194,0 -11.215,5.021 -11.215,11.215v93.455H245.361z\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:pathData=\"M234.146,270.511m-29.646,0a29.646,29.646 0,1 1,59.292 0a29.646,29.646 0,1 1,-59.292 0\"\n      android:fillColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_import.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_info.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_local_export.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M19,12v7L5,19v-7L3,12v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2zM13,12.67l2.59,-2.58L17,11.5l-5,5 -5,-5 1.41,-1.41L11,12.67L11,3h2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_local_import.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_next.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_no_file.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M10.94,8.12L7.48,4.66L9,3h6l1.83,2H20c1.1,0 2,0.9 2,2v12c0,0.05 -0.01,0.1 -0.02,0.16l-5.1,-5.1C16.96,13.71 17,13.36 17,13c0,-2.76 -2.24,-5 -5,-5C11.64,8 11.29,8.04 10.94,8.12zM20.49,23.31L18.17,21H4c-1.1,0 -2,-0.9 -2,-2V7c0,-0.59 0.27,-1.12 0.68,-1.49l-2,-2L2.1,2.1l19.8,19.8L20.49,23.31zM14.49,17.32l-1.5,-1.5C12.67,15.92 12.35,16 12,16c-1.66,0 -3,-1.34 -3,-3c0,-0.35 0.08,-0.67 0.19,-0.98l-1.5,-1.5C7.25,11.24 7,12.09 7,13c0,2.76 2.24,5 5,5C12.91,18 13.76,17.75 14.49,17.32z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_openworkout.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"80dp\"\n    android:height=\"80dp\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"80\">\n  <path\n      android:pathData=\"m1.2438,46.6864 l24.0543,23.9206 29.3996,-0.1336 24.1879,-23.6534 -38.8877,-40.4913z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"miter\"\n      android:strokeWidth=\"0.26458332\"\n      android:fillColor=\"#003c91\"\n      android:strokeColor=\"#00000000\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"butt\"/>\n  <path\n      android:pathData=\"m18.8836,63.9253 l-8.9535,-8.5526 29.9342,-31.1369 30.0678,31.1369 -8.419,8.419\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"miter\"\n      android:strokeWidth=\"0.26458332\"\n      android:fillColor=\"#33b6ea\"\n      android:strokeColor=\"#00000000\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"butt\"/>\n  <path\n      android:pathData=\"m18.8836,63.9253 l21.2479,-22.1834 21.3816,22.0497 -6.8154,6.6817 -29.3996,0.1336\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"miter\"\n      android:strokeWidth=\"0.26458332\"\n      android:fillColor=\"#1efaa0\"\n      android:strokeColor=\"#00000000\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"butt\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_option.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_pause.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M9,16h2L11,8L9,8v8zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM13,16h2L15,8h-2v8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_play.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_preview.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"m512,256c0,141.383 -114.617,256 -256,256 -32.465,0 -63.508,-6.039 -92.086,-17.063 -11.578,-4.465 -22.75,-9.75 -33.438,-15.781 -6.813,-3.844 -13.438,-7.98 -19.852,-12.434 -10.16,-7.02 -19.793,-14.754 -28.809,-23.133 -4.777,-4.43 -9.375,-9.039 -13.793,-13.813 -42.227,-45.641 -68.023,-106.695 -68.023,-173.777 0,-141.387 114.613,-256 256,-256 141.383,0 256,114.613 256,256zM512,256\"\n      android:fillColor=\"#898989\"/>\n  <path\n      android:pathData=\"m382.117,449.578v29.246c-37.223,21.117 -80.262,33.176 -126.121,33.176 -27.031,0 -53.07,-4.191 -77.531,-11.953 -17.031,-5.402 -33.301,-12.551 -48.586,-21.223v-29.246c0,-49.914 38.441,-90.863 87.352,-94.813 2.57,-0.211 5.16,-0.316 7.785,-0.316h61.953c7.324,0 14.449,0.816 21.293,2.383 42.297,9.676 73.855,47.535 73.855,92.746zM382.117,449.578\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m382.117,449.578v29.246c-37.223,21.117 -80.262,33.176 -126.121,33.176 -27.031,0 -53.07,-4.191 -77.531,-11.953v-50.469c0,-52.539 42.602,-95.129 95.148,-95.129h13.355c52.555,0 95.148,42.59 95.148,95.129zM382.117,449.578\"\n      android:fillColor=\"#c6c6c6\"/>\n  <path\n      android:pathData=\"m289.938,317.801v41.656c0,15.25 -10.055,28.141 -23.906,32.422 -3.168,0.98 -6.547,1.516 -10.043,1.516 -18.742,0 -33.938,-15.195 -33.938,-33.938v-41.656zM289.938,317.801\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m289.938,356.816v2.641c0,15.25 -10.055,28.141 -23.906,32.422 -12.496,-3.844 -21.891,-14.707 -23.625,-28.004 2.266,0.141 4.547,0.211 6.836,0.211 6.422,0 12.719,-0.512 18.852,-1.516 7.555,-1.215 14.855,-3.16 21.844,-5.754zM289.938,356.816\"\n      android:fillColor=\"#c6c6c6\"/>\n  <path\n      android:pathData=\"m162.883,249.535c0,15.711 -11.477,28.742 -26.508,31.16 -1.641,0.266 -3.332,0.402 -5.055,0.402 -17.438,0 -31.566,-14.125 -31.566,-31.563s14.129,-31.566 31.566,-31.566c1.723,0 3.414,0.137 5.055,0.406 15.031,2.418 26.508,15.445 26.508,31.16zM162.883,249.535\"\n      android:fillColor=\"#c6c6c6\"/>\n  <path\n      android:pathData=\"m162.883,249.535c0,15.711 -11.477,28.742 -26.508,31.16 -2.73,-9.93 -4.188,-20.379 -4.188,-31.16 0,-10.785 1.457,-21.234 4.188,-31.16 15.031,2.418 26.508,15.445 26.508,31.16zM162.883,249.535\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m142.602,249.535c0,6.23 -5.051,11.281 -11.281,11.281 -6.23,0 -11.281,-5.051 -11.281,-11.281 0,-6.23 5.051,-11.285 11.281,-11.285 6.23,0 11.281,5.055 11.281,11.285zM142.602,249.535\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m349.102,249.535c0,15.711 11.477,28.742 26.508,31.16 1.645,0.266 3.332,0.402 5.059,0.402 17.438,0 31.563,-14.125 31.563,-31.563s-14.125,-31.566 -31.563,-31.566c-1.727,0 -3.414,0.137 -5.059,0.406 -15.031,2.418 -26.508,15.445 -26.508,31.16zM349.102,249.535\"\n      android:fillColor=\"#c6c6c6\"/>\n  <path\n      android:pathData=\"m349.102,249.535c0,15.711 11.477,28.742 26.508,31.16 2.73,-9.93 4.191,-20.379 4.191,-31.16 0,-10.785 -1.457,-21.234 -4.191,-31.16 -15.031,2.418 -26.508,15.445 -26.508,31.16zM349.102,249.535\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m373.434,188.039v44.723c0,58.441 -42.691,106.922 -98.594,115.922 -0.188,0.031 -0.387,0.063 -0.574,0.094 -5.945,0.949 -12.051,1.418 -18.277,1.418 -64.855,0 -117.434,-52.578 -117.434,-117.434v-44.723c0,-13.656 2.328,-26.781 6.633,-38.973 16.063,-45.707 59.613,-78.473 110.801,-78.473h0.012c6.215,0 12.328,0.48 18.285,1.422 56.172,8.777 99.148,57.383 99.148,116.023zM373.434,188.039\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m391.949,249.535c0,6.23 -5.051,11.281 -11.281,11.281s-11.281,-5.051 -11.281,-11.281c0,-6.23 5.051,-11.285 11.281,-11.285s11.281,5.055 11.281,11.285zM391.949,249.535\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m373.434,188.039v44.723c0,58.441 -42.691,106.922 -98.594,115.922 -0.188,0.031 -0.387,0.063 -0.574,0.094 -56.176,-8.777 -99.141,-57.387 -99.141,-116.016v-44.723c0,-58.641 42.977,-107.246 99.16,-116.023 56.172,8.777 99.148,57.383 99.148,116.023zM373.434,188.039\"\n      android:fillColor=\"#c6c6c6\"/>\n  <path\n      android:pathData=\"m230.984,225.922c0,7.355 -5.965,13.32 -13.324,13.32s-13.324,-5.965 -13.324,-13.32c0,-7.359 5.965,-13.324 13.324,-13.324s13.324,5.965 13.324,13.324zM230.984,225.922\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m307.652,225.922c0,7.355 -5.965,13.32 -13.324,13.32s-13.32,-5.965 -13.32,-13.32c0,-7.359 5.961,-13.324 13.32,-13.324s13.324,5.965 13.324,13.324zM307.652,225.922\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m228.266,223.57c0,3.152 -2.555,5.707 -5.707,5.707s-5.707,-2.555 -5.707,-5.707c0,-3.152 2.555,-5.707 5.707,-5.707s5.707,2.555 5.707,5.707zM228.266,223.57\"\n      android:fillColor=\"#ffffff\"/>\n  <path\n      android:pathData=\"m305.59,223.57c0,3.152 -2.555,5.707 -5.707,5.707 -3.156,0 -5.711,-2.555 -5.711,-5.707 0,-3.152 2.555,-5.707 5.711,-5.707 3.152,0 5.707,2.555 5.707,5.707zM305.59,223.57\"\n      android:fillColor=\"#ffffff\"/>\n  <path\n      android:pathData=\"m269.316,259.465h-26.645c-3.176,0 -5.746,-2.57 -5.746,-5.746s2.57,-5.746 5.746,-5.746h26.645c3.176,0 5.746,2.57 5.746,5.746 0,3.172 -2.57,5.746 -5.746,5.746zM269.316,259.465\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m255.996,290.602c-9.836,0 -19.668,-2.465 -28.633,-7.395 -2.527,-1.387 -3.453,-4.566 -2.063,-7.094 1.391,-2.527 4.566,-3.449 7.094,-2.063 14.777,8.125 32.422,8.125 47.199,0 2.527,-1.387 5.703,-0.465 7.094,2.063 1.391,2.527 0.469,5.707 -2.063,7.094 -8.961,4.93 -18.797,7.395 -28.629,7.395zM255.996,290.602\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m373.434,116.266h-234.816c-12.184,-25.078 18.137,-80.457 117.402,-80.457 11.129,0 21.391,0.699 30.824,1.977 74.711,10.063 97.406,56.215 86.59,78.48zM373.434,116.266\"\n      android:fillColor=\"#181818\"/>\n  <path\n      android:pathData=\"m256.004,143.258s-0.41,26.621 53.285,35.703c0,0 -35.527,-17.766 -22.988,-43.887\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m266.453,143.258s-0.41,26.621 53.285,35.703c0,0 -35.527,-17.766 -22.988,-43.887\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m373.434,116.266h-173.168c-10.816,-22.266 11.867,-68.418 86.578,-78.48 74.711,10.063 97.406,56.215 86.59,78.48zM373.434,116.266\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m165.094,139.871v59.984l-26.539,17.117v-28.934c0,-13.656 2.328,-26.781 6.633,-38.973zM165.094,139.871\"\n      android:fillColor=\"#181818\"/>\n  <path\n      android:pathData=\"m346.895,139.871v59.984l26.539,17.117v-28.934c0,-13.656 -2.328,-26.781 -6.633,-38.973zM346.895,139.871\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m373.434,116.266v50.156c-53.852,-22.309 -112.473,-28.633 -169.031,-18.977 -5.152,0.879 -10.281,1.879 -15.391,3.031 -17.117,3.824 -33.969,9.141 -50.395,15.945v-50.156c16.426,-6.801 33.277,-12.121 50.395,-15.945 5.109,-1.148 10.238,-2.152 15.391,-3.031 56.559,-9.652 115.18,-3.332 169.031,18.977zM373.434,116.266\"\n      android:fillColor=\"#999999\"/>\n  <path\n      android:pathData=\"m189.012,100.32v50.156c-17.117,3.824 -33.969,9.141 -50.395,15.945v-50.156c16.426,-6.801 33.277,-12.121 50.395,-15.945zM189.012,100.32\"\n      android:fillColor=\"#808080\"/>\n  <path\n      android:pathData=\"m163.914,409.922v85.016c-11.578,-4.465 -22.75,-9.75 -33.438,-15.781 -6.813,-3.844 -13.438,-7.98 -19.852,-12.434v-56.801c0,-14.711 11.93,-26.645 26.645,-26.645 3.508,0 6.852,0.68 9.926,1.914 3.363,1.348 6.395,3.363 8.914,5.891 4.816,4.828 7.805,11.484 7.805,18.84zM163.914,409.922\"\n      android:fillColor=\"#b4b4b4\"/>\n  <path\n      android:pathData=\"m163.914,409.922v85.016c-11.578,-4.465 -22.75,-9.75 -33.438,-15.781v-69.234c0,-11.199 6.918,-20.793 16.719,-24.73 3.363,1.348 6.395,3.363 8.914,5.891 4.816,4.828 7.805,11.484 7.805,18.84zM163.914,409.922\"\n      android:fillColor=\"#c6c6c6\"/>\n  <path\n      android:pathData=\"m110.625,368.355v75.234h-28.809c-4.777,-4.43 -9.375,-9.039 -13.793,-13.813v-61.422zM110.625,368.355\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m110.625,417.227v26.363h-28.809c-4.777,-4.43 -9.375,-9.039 -13.793,-13.813v-12.551zM110.625,417.227\"\n      android:fillColor=\"#181818\"/>\n  <path\n      android:pathData=\"m333.531,363.906v136.117c-1.453,0.473 -2.914,0.922 -4.391,1.359 -6.508,1.945 -13.133,3.637 -19.852,5.047 -2.945,0.625 -5.902,1.203 -8.883,1.715 -0.438,0.07 -0.867,0.156 -1.305,0.219 -14.023,2.391 -28.422,3.637 -43.102,3.637s-29.078,-1.246 -43.102,-3.625c-0.441,-0.074 -0.867,-0.148 -1.309,-0.223 -0.867,-0.145 -1.742,-0.301 -2.609,-0.469 -1.746,-0.313 -3.492,-0.66 -5.227,-1.023 -0.344,-0.074 -0.699,-0.148 -1.043,-0.219 -8.234,-1.746 -16.313,-3.879 -24.242,-6.395v-136.141l24.242,-10.449 3.121,48.051c1.77,27.238 24.379,48.426 51.676,48.426 28.598,0 51.781,-23.188 51.781,-51.785v-44.691zM333.531,363.906\"\n      android:fillColor=\"#999999\"/>\n  <path\n      android:pathData=\"m164.27,368.355h42.598v75.23h-42.598zM164.27,368.355\"\n      android:fillColor=\"#353535\"/>\n  <path\n      android:pathData=\"m164.27,417.23h42.598v26.355h-42.598zM164.27,417.23\"\n      android:fillColor=\"#181818\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reminder.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42zM18,11c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2v-5zM12,22c0.14,0 0.27,-0.01 0.4,-0.04 0.65,-0.14 1.18,-0.58 1.44,-1.18 0.1,-0.24 0.15,-0.5 0.15,-0.78h-4c0.01,1.1 0.9,2 2.01,2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reorder.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,15h18v-2L3,13v2zM3,19h18v-2L3,17v2zM3,11h18L21,9L3,9v2zM3,5v2h18L21,5L3,5z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_reset.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#33B6EA\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_save.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_session.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"M511.693,431.874L447.13,92.113v273.51l-87.53,87.53h133.266C504.783,453.152 513.8,442.962 511.693,431.874z\"\n      android:fillColor=\"#C3C8D1\"/>\n  <path\n      android:pathData=\"M447.13,92.112v273.51l-87.53,87.53h30.231l72.931,-72.931c3.872,-3.872 6.047,-9.124 6.047,-14.6V206.197L447.13,92.112z\"\n      android:fillColor=\"#B0B3B7\"/>\n  <path\n      android:pathData=\"M448.162,365.622V92.113c0,-7.632 -6.187,-13.818 -13.818,-13.818H13.818C6.187,78.294 0,84.481 0,92.113v368.153c0,7.632 6.187,13.818 13.818,13.818h325.883L448.162,365.622z\"\n      android:fillColor=\"#E4EAF8\"/>\n  <path\n      android:pathData=\"M20.646,460.265V92.112c0,-7.632 6.187,-13.818 13.818,-13.818H13.818C6.187,78.294 0,84.481 0,92.112v368.153c0,7.632 6.187,13.818 13.818,13.818h20.646C26.833,474.083 20.646,467.897 20.646,460.265z\"\n      android:fillColor=\"#D8DCE5\"/>\n  <path\n      android:pathData=\"M448.162,365.622h-94.643c-7.632,0 -13.818,6.187 -13.818,13.818v94.643L448.162,365.622z\"\n      android:fillColor=\"#D8DCE5\"/>\n  <path\n      android:pathData=\"M360.347,379.44c0,-7.632 6.186,-13.818 13.818,-13.818h-20.646c-7.632,0 -13.818,6.186 -13.818,13.818v94.643l20.646,-20.646V379.44z\"\n      android:fillColor=\"#C3C8D1\"/>\n  <path\n      android:pathData=\"M434.344,77.262H13.818C6.187,77.262 0,83.449 0,91.08v71.221h448.162V91.08C448.162,83.449 441.975,77.262 434.344,77.262z\"\n      android:fillColor=\"#FF5050\"/>\n  <path\n      android:pathData=\"M20.646,92.112c0,-7.632 6.187,-13.818 13.818,-13.818H13.818C6.187,78.294 0,84.481 0,92.112v70.189h20.646V92.112z\"\n      android:fillColor=\"#ED3A3A\"/>\n  <path\n      android:pathData=\"M89.41,128.556c-4.276,0 -7.742,-3.466 -7.742,-7.742V45.657c0,-4.276 3.466,-7.742 7.742,-7.742c4.276,0 7.742,3.466 7.742,7.742v75.157C97.153,125.09 93.686,128.556 89.41,128.556z\"\n      android:fillColor=\"#E4EAF8\"/>\n  <path\n      android:pathData=\"M156.746,128.556c-4.276,0 -7.742,-3.466 -7.742,-7.742V45.657c0,-4.276 3.466,-7.742 7.742,-7.742s7.742,3.466 7.742,7.742v75.157C164.488,125.09 161.022,128.556 156.746,128.556z\"\n      android:fillColor=\"#E4EAF8\"/>\n  <path\n      android:pathData=\"M224.081,128.556c-4.276,0 -7.742,-3.466 -7.742,-7.742V45.657c0,-4.276 3.466,-7.742 7.742,-7.742s7.742,3.466 7.742,7.742v75.157C231.823,125.09 228.357,128.556 224.081,128.556z\"\n      android:fillColor=\"#E4EAF8\"/>\n  <path\n      android:pathData=\"M291.416,128.556c-4.276,0 -7.742,-3.466 -7.742,-7.742V45.657c0,-4.276 3.466,-7.742 7.742,-7.742s7.742,3.466 7.742,7.742v75.157C299.159,125.09 295.692,128.556 291.416,128.556z\"\n      android:fillColor=\"#E4EAF8\"/>\n  <path\n      android:pathData=\"M358.751,128.556c-4.276,0 -7.742,-3.466 -7.742,-7.742V45.657c0,-4.276 3.466,-7.742 7.742,-7.742s7.742,3.466 7.742,7.742v75.157C366.494,125.09 363.027,128.556 358.751,128.556z\"\n      android:fillColor=\"#E4EAF8\"/>\n  <path\n      android:pathData=\"M182.91,241.949m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M265.25,241.949m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M347.58,241.949m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M182.91,318.979m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M347.58,318.979m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M265.25,318.979m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M265.25,396.019m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M182.91,396.019m-23.837,0a23.837,23.837 0,1 1,47.674 0a23.837,23.837 0,1 1,-47.674 0\"\n      android:fillColor=\"#FFC850\"/>\n  <path\n      android:pathData=\"M179.724,241.95c0,-9.467 5.518,-17.645 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837c0,13.165 10.672,23.837 23.837,23.837c3.698,0 7.2,-0.843 10.323,-2.346C185.242,259.594 179.724,251.416 179.724,241.95z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M262.056,241.95c0,-9.467 5.519,-17.645 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837c0,13.165 10.672,23.837 23.837,23.837c3.698,0 7.2,-0.843 10.323,-2.346C267.575,259.594 262.056,251.416 262.056,241.95z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M344.389,241.95c0,-9.467 5.519,-17.645 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837c0,13.165 10.672,23.837 23.837,23.837c3.698,0 7.2,-0.843 10.323,-2.346C349.907,259.594 344.389,251.416 344.389,241.95z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M179.724,318.982c0,-9.467 5.518,-17.644 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837s10.672,23.837 23.837,23.837c3.698,0 7.2,-0.842 10.323,-2.346C185.242,336.627 179.724,328.449 179.724,318.982z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M344.389,318.982c0,-9.467 5.519,-17.644 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837s10.672,23.837 23.837,23.837c3.698,0 7.2,-0.842 10.323,-2.346C349.907,336.627 344.389,328.449 344.389,318.982z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M262.056,318.982c0,-9.467 5.519,-17.644 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837s10.672,23.837 23.837,23.837c3.698,0 7.2,-0.842 10.323,-2.346C267.575,336.627 262.056,328.449 262.056,318.982z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M262.056,396.015c0,-9.467 5.519,-17.644 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837s10.672,23.838 23.837,23.838c3.698,0 7.2,-0.843 10.323,-2.346C267.575,413.66 262.056,405.482 262.056,396.015z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M179.724,396.015c0,-9.467 5.518,-17.644 13.514,-21.492c-3.124,-1.503 -6.625,-2.345 -10.323,-2.345c-13.165,0 -23.837,10.672 -23.837,23.837s10.672,23.838 23.837,23.838c3.698,0 7.2,-0.843 10.323,-2.346C185.242,413.66 179.724,405.482 179.724,396.015z\"\n      android:fillColor=\"#F9B428\"/>\n  <path\n      android:pathData=\"M111.532,241.95l11.381,-11.381c3.024,-3.024 3.024,-7.926 0,-10.95c-3.023,-3.022 -7.926,-3.022 -10.949,0L100.583,231l-11.381,-11.381c-3.023,-3.022 -7.925,-3.022 -10.949,0c-3.024,3.024 -3.024,7.926 0,10.95l11.381,11.381l-11.381,11.381c-3.024,3.024 -3.024,7.926 0,10.95c1.512,1.511 3.493,2.267 5.475,2.267s3.963,-0.756 5.475,-2.267l11.381,-11.381l11.381,11.381c1.512,1.511 3.493,2.267 5.475,2.267s3.963,-0.756 5.475,-2.267c3.024,-3.024 3.024,-7.926 0,-10.95L111.532,241.95z\"\n      android:fillColor=\"#FF5050\"/>\n  <path\n      android:pathData=\"M122.913,296.652c-3.023,-3.022 -7.926,-3.022 -10.949,0l-11.381,11.381l-11.381,-11.381c-3.023,-3.022 -7.925,-3.022 -10.949,0c-3.024,3.024 -3.024,7.926 0,10.95l11.381,11.381l-11.381,11.381c-3.024,3.024 -3.024,7.926 0,10.95c1.512,1.511 3.493,2.267 5.475,2.267s3.963,-0.756 5.475,-2.267l11.381,-11.381l11.381,11.381c1.512,1.511 3.493,2.267 5.475,2.267s3.963,-0.756 5.475,-2.267c3.024,-3.024 3.024,-7.926 0,-10.95l-11.381,-11.381l11.381,-11.381C125.937,304.577 125.937,299.676 122.913,296.652z\"\n      android:fillColor=\"#FF5050\"/>\n  <path\n      android:pathData=\"M122.913,373.685c-3.023,-3.022 -7.925,-3.022 -10.949,0l-11.381,11.381l-11.381,-11.381c-3.023,-3.022 -7.926,-3.022 -10.949,0c-3.024,3.024 -3.024,7.926 0,10.95l11.381,11.38l-11.381,11.38c-3.024,3.024 -3.024,7.926 0,10.95c1.512,1.511 3.493,2.267 5.475,2.267s3.963,-0.756 5.475,-2.267l11.381,-11.381l11.381,11.381c1.512,1.511 3.493,2.267 5.475,2.267s3.963,-0.756 5.475,-2.267c3.024,-3.024 3.024,-7.926 0,-10.95l-11.381,-11.38l11.381,-11.38C125.937,381.611 125.937,376.709 122.913,373.685z\"\n      android:fillColor=\"#FF5050\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_session_done.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"m40,72h448v416h-448z\"\n      android:fillColor=\"#c3c6c7\"/>\n  <path\n      android:pathData=\"m24,56h432v400h-432z\"\n      android:fillColor=\"#e9eef2\"/>\n  <path\n      android:pathData=\"m240,416a112,112 0,1 1,112 -112,112.127 112.127,0 0,1 -112,112zM240,208a96,96 0,1 0,66.461 26.726,96.108 96.108,0 0,0 -66.461,-26.726z\"\n      android:fillColor=\"#8f9e46\"/>\n  <path\n      android:pathData=\"m24,56h432v96h-432z\"\n      android:fillColor=\"#eb423f\"/>\n  <path\n      android:pathData=\"m112,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m176,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m320,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m384,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m292.438,257.344a8,8 0,0 0,-11.094 2.218l-58.587,87.881 -25.1,-25.1a8,8 0,0 0,-11.314 11.314l32,32a8,8 0,0 0,5.657 2.343c0.261,0 0.525,-0.013 0.788,-0.039a8,8 0,0 0,5.868 -3.523l64,-96a8,8 0,0 0,-2.218 -11.094z\"\n      android:fillColor=\"#8f9e46\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_session_undone.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"m40,72h448v416h-448z\"\n      android:fillColor=\"#c3c6c7\"/>\n  <path\n      android:pathData=\"m24,56h432v400h-432z\"\n      android:fillColor=\"#e9eef2\"/>\n  <path\n      android:pathData=\"m24,56h432v96h-432z\"\n      android:fillColor=\"#eb423f\"/>\n  <path\n      android:pathData=\"m112,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m176,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m320,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"m384,56v-8a8,8 0,0 0,-16 0v32a8.009,8.009 0,0 0,8 8,8 8,0 0,1 0,16 24.028,24.028 0,0 1,-24 -24v-32a24,24 0,0 1,48 0v8z\"\n      android:fillColor=\"#6a7073\"/>\n  <path\n      android:pathData=\"M136,288L344,288A16,16 0,0 1,360 304L360,304A16,16 0,0 1,344 320L136,320A16,16 0,0 1,120 304L120,304A16,16 0,0 1,136 288z\"\n      android:fillColor=\"#2d85cc\"/>\n  <path\n      android:pathData=\"M136,248L136,248A16,16 0,0 1,152 264L152,344A16,16 0,0 1,136 360L136,360A16,16 0,0 1,120 344L120,264A16,16 0,0 1,136 248z\"\n      android:fillColor=\"#2d85cc\"/>\n  <path\n      android:pathData=\"M168,232L168,232A16,16 0,0 1,184 248L184,360A16,16 0,0 1,168 376L168,376A16,16 0,0 1,152 360L152,248A16,16 0,0 1,168 232z\"\n      android:fillColor=\"#54a3e3\"/>\n  <path\n      android:pathData=\"M344,360L344,360A16,16 0,0 1,328 344L328,264A16,16 0,0 1,344 248L344,248A16,16 0,0 1,360 264L360,344A16,16 0,0 1,344 360z\"\n      android:fillColor=\"#2d85cc\"/>\n  <path\n      android:pathData=\"M312,376L312,376A16,16 0,0 1,296 360L296,248A16,16 0,0 1,312 232L312,232A16,16 0,0 1,328 248L328,360A16,16 0,0 1,312 376z\"\n      android:fillColor=\"#54a3e3\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_settings.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_sound.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_swap.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16,17.01V10h-2v7.01h-3L15,21l4,-3.99h-3zM9,3L5,6.99h3V14h2V6.99h3L9,3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_timer.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"468.293dp\"\n    android:height=\"468.293dp\"\n    android:viewportWidth=\"468.293\"\n    android:viewportHeight=\"468.293\">\n  <path\n      android:pathData=\"M364.275,140.489l32.721,-32.721c2.676,-2.676 2.676,-7.016 0,-9.692l-14.978,-14.978c-2.676,-2.676 -7.016,-2.677 -9.692,0l-32.721,32.721L364.275,140.489z\"\n      android:fillColor=\"#64798A\"/>\n  <path\n      android:pathData=\"M364.275,140.489l32.721,-32.721c2.676,-2.676 2.676,-7.016 0,-9.692l-6.688,-6.688l-37.567,37.567L364.275,140.489z\"\n      android:fillColor=\"#3A556A\"/>\n  <path\n      android:pathData=\"M104.018,140.489l-32.721,-32.721c-2.676,-2.676 -2.676,-7.016 0,-9.692l14.978,-14.978c2.676,-2.676 7.016,-2.677 9.692,0l32.721,32.721L104.018,140.489z\"\n      android:fillColor=\"#64798A\"/>\n  <path\n      android:pathData=\"M104.018,140.489l-32.721,-32.721c-2.676,-2.676 -2.676,-7.016 0,-9.692l6.688,-6.688l37.567,37.567L104.018,140.489z\"\n      android:fillColor=\"#3A556A\"/>\n  <path\n      android:pathData=\"M211.106,33.08h46.13v66.835h-46.13z\"\n      android:fillColor=\"#D5D6DB\"/>\n  <path\n      android:pathData=\"M234.146,270.511m-197.782,0a197.782,197.782 0,1 1,395.564 0a197.782,197.782 0,1 1,-395.564 0\"\n      android:fillColor=\"#CE412D\"/>\n  <path\n      android:pathData=\"M234.146,270.511m-155.192,0a155.192,155.192 0,1 1,310.384 0a155.192,155.192 0,1 1,-310.384 0\"\n      android:fillColor=\"#EBF0F3\"/>\n  <path\n      android:pathData=\"M184.87,9.855v29.905c0,5.443 4.412,9.855 9.855,9.855h78.842c5.443,0 9.855,-4.412 9.855,-9.855V9.855c0,-5.443 -4.412,-9.855 -9.855,-9.855h-78.842C189.283,0 184.87,4.412 184.87,9.855z\"\n      android:fillColor=\"#3A556A\"/>\n  <path\n      android:pathData=\"M273.567,0h-37.608v49.616h37.608c5.443,0 9.855,-4.413 9.855,-9.855V9.855C283.422,4.412 279.01,0 273.567,0z\"\n      android:fillColor=\"#2F4859\"/>\n  <path\n      android:pathData=\"M124.409,380.246c60.606,60.606 158.868,60.606 219.474,0s60.606,-158.868 0,-219.474\"\n      android:fillColor=\"#E1E6E9\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_trophy_disabled.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512.001dp\"\n    android:height=\"512.001dp\"\n    android:viewportWidth=\"512.001\"\n    android:viewportHeight=\"512.001\">\n  <path\n      android:pathData=\"M227.117,383.98h-46.308c-16.987,0 -30.758,13.771 -30.758,30.758v34.25h211.906v-34.25c0,-16.987 -13.771,-30.758 -30.758,-30.758h-46.308H227.117z\"\n      android:fillColor=\"#949494\"/>\n  <path\n      android:pathData=\"M491.157,70.23c-15.917,-24.944 -43.818,-38.67 -78.545,-38.67h-0.902H100.3h-0.902c-34.738,0 -62.628,13.725 -78.545,38.67c-17.196,26.947 -17.636,62.691 -1.206,98.089c30.197,65.029 125.456,86.713 129.503,87.604l9.269,2.045h0.01H353.57h0.01l9.279,-2.045c4.037,-0.891 99.306,-22.575 129.493,-87.604C508.783,132.921 508.343,97.177 491.157,70.23zM463.822,155.066c-12.1,26.056 -40.379,43.671 -61.978,53.852c-8.912,4.205 -17.395,7.497 -24.577,9.992l-242.523,0.01h-0.01c-7.193,-2.506 -15.675,-5.798 -24.577,-10.003c-21.589,-10.181 -49.878,-27.796 -61.978,-53.852c-11.817,-25.448 -12.11,-50.203 -0.807,-67.913c9.93,-15.571 28.415,-24.137 52.028,-24.137h0.933h311.348h0.933c23.613,0 42.088,8.566 52.028,24.137C475.933,104.863 475.639,129.618 463.822,155.066z\"\n      android:fillColor=\"#7b7b7b\"/>\n  <path\n      android:pathData=\"M278.024,383.98l-0.047,-30.532c-0.034,-21.96 11.352,-42.511 30.284,-53.637c60.287,-35.43 103.444,-130.412 103.444,-242.04V0H100.297v57.769c0,111.63 43.159,206.615 103.448,242.042c18.931,11.125 30.317,31.675 30.284,53.633l-0.045,30.535l25.164,26.053L278.024,383.98z\"\n      android:fillColor=\"#949494\"/>\n  <path\n      android:pathData=\"M245.486,353.447l-0.021,30.533h-11.481l0.042,-30.533c0.031,-21.956 -11.356,-42.507 -30.281,-53.632c-60.29,-35.43 -103.447,-130.415 -103.447,-242.041V0h81.198v57.774c0,111.626 20.656,206.611 49.501,242.041C240.055,310.939 245.507,331.49 245.486,353.447z\"\n      android:fillColor=\"#7b7b7b\"/>\n  <path\n      android:pathData=\"M247.916,383.98h-20.797H180.81c-16.987,0 -30.758,13.771 -30.758,30.758v34.25h67.105v-34.25C217.157,397.751 230.928,383.98 247.916,383.98z\"\n      android:fillColor=\"#7b7b7b\"/>\n  <path\n      android:pathData=\"M219.114,432.212h-80.945c-9.652,0 -17.476,7.824 -17.476,17.476v62.314h270.624v-62.314c0,-9.652 -7.824,-17.476 -17.476,-17.476h-80.945\"\n      android:fillColor=\"#565656\"/>\n  <path\n      android:pathData=\"M159.138,432.212h-20.97c-9.652,0 -17.476,7.824 -17.476,17.476v62.314h20.97v-62.314C141.664,440.036 149.487,432.212 159.138,432.212z\"\n      android:fillColor=\"#414141\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_trophy_enabled.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512.001dp\"\n    android:height=\"512.001dp\"\n    android:viewportWidth=\"512.001\"\n    android:viewportHeight=\"512.001\">\n  <path\n      android:pathData=\"M227.117,383.98h-46.308c-16.987,0 -30.758,13.771 -30.758,30.758v34.25h211.906v-34.25c0,-16.987 -13.771,-30.758 -30.758,-30.758h-46.308H227.117z\"\n      android:fillColor=\"#F9AC30\"/>\n  <path\n      android:pathData=\"M491.157,70.23c-15.917,-24.944 -43.818,-38.67 -78.545,-38.67h-0.902H100.3h-0.902c-34.738,0 -62.628,13.725 -78.545,38.67c-17.196,26.947 -17.636,62.691 -1.206,98.089c30.197,65.029 125.456,86.713 129.503,87.604l9.269,2.045h0.01H353.57h0.01l9.279,-2.045c4.037,-0.891 99.306,-22.575 129.493,-87.604C508.783,132.921 508.343,97.177 491.157,70.23zM463.822,155.066c-12.1,26.056 -40.379,43.671 -61.978,53.852c-8.912,4.205 -17.395,7.497 -24.577,9.992l-242.523,0.01h-0.01c-7.193,-2.506 -15.675,-5.798 -24.577,-10.003c-21.589,-10.181 -49.878,-27.796 -61.978,-53.852c-11.817,-25.448 -12.11,-50.203 -0.807,-67.913c9.93,-15.571 28.415,-24.137 52.028,-24.137h0.933h311.348h0.933c23.613,0 42.088,8.566 52.028,24.137C475.933,104.863 475.639,129.618 463.822,155.066z\"\n      android:fillColor=\"#DD8D19\"/>\n  <path\n      android:pathData=\"M278.024,383.98l-0.047,-30.532c-0.034,-21.96 11.352,-42.511 30.284,-53.637c60.287,-35.43 103.444,-130.412 103.444,-242.04V0H100.297v57.769c0,111.63 43.159,206.615 103.448,242.042c18.931,11.125 30.317,31.675 30.284,53.633l-0.045,30.535l25.164,26.053L278.024,383.98z\"\n      android:fillColor=\"#F9AC30\"/>\n  <path\n      android:pathData=\"M245.486,353.447l-0.021,30.533h-11.481l0.042,-30.533c0.031,-21.956 -11.356,-42.507 -30.281,-53.632c-60.29,-35.43 -103.447,-130.415 -103.447,-242.041V0h81.198v57.774c0,111.626 20.656,206.611 49.501,242.041C240.055,310.939 245.507,331.49 245.486,353.447z\"\n      android:fillColor=\"#DD8D19\"/>\n  <path\n      android:pathData=\"M247.916,383.98h-20.797H180.81c-16.987,0 -30.758,13.771 -30.758,30.758v34.25h67.105v-34.25C217.157,397.751 230.928,383.98 247.916,383.98z\"\n      android:fillColor=\"#DD8D19\"/>\n  <path\n      android:pathData=\"M219.114,432.212h-80.945c-9.652,0 -17.476,7.824 -17.476,17.476v62.314h270.624v-62.314c0,-9.652 -7.824,-17.476 -17.476,-17.476h-80.945\"\n      android:fillColor=\"#4F5B5E\"/>\n  <path\n      android:pathData=\"M159.138,432.212h-20.97c-9.652,0 -17.476,7.824 -17.476,17.476v62.314h20.97v-62.314C141.664,440.036 149.487,432.212 159.138,432.212z\"\n      android:fillColor=\"#3B4547\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_view.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_workout_done.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#1EFAA0\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_workout_select.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<vector android:height=\"24dp\" android:tint=\"#FF4444\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M12,4l-1.41,1.41L16.17,11H4v2h12.17l-5.58,5.59L12,20l8,-8z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/rect_disabled.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners android:radius=\"4dp\" />\n    <solid android:color=\"#cccc\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/rect_normal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/rect_pressed\" />\n    <item android:bottom=\"2dp\">\n        <shape android:shape=\"rectangle\">\n            <corners android:radius=\"4dp\" />\n            <padding android:left=\"20dp\" />\n            <padding android:right=\"20dp\" />\n            <solid android:color=\"@android:color/holo_blue_light\" />\n        </shape>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/rect_pressed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners android:radius=\"4dp\" />\n    <solid android:color=\"@android:color/holo_blue_dark\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/ripple_timer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"#3a556a\"\n    android:radius=\"200dp\">\n    <item android:id=\"@android:id/mask\"\n        android:drawable=\"@drawable/ic_timer\">\n    </item>\n    </ripple>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.drawerlayout.widget.DrawerLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/drawer_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:openDrawer=\"start\">\n\n    <include\n        layout=\"@layout/app_bar_main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n    <com.google.android.material.navigation.NavigationView\n        android:id=\"@+id/nav_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        android:fitsSystemWindows=\"true\"\n        app:headerLayout=\"@layout/nav_header_main\"\n        app:menu=\"@menu/activity_main_drawer\" />\n\n</androidx.drawerlayout.widget.DrawerLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/app_bar_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/AppTheme.AppBarOverlay\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            app:popupTheme=\"@style/AppTheme.PopupOverlay\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <include layout=\"@layout/content_main\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/content_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    tools:showIn=\"@layout/app_bar_main\">\n\n    <fragment\n        android:id=\"@+id/nav_host_fragment\"\n        android:name=\"androidx.navigation.fragment.NavHostFragment\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:defaultNavHost=\"true\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:navGraph=\"@navigation/mobile_navigation\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.home.HomeFragment\">\n\n    <ImageView\n        android:id=\"@+id/startView\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"200dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"32dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:background=\"@drawable/ic_timer\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:foreground=\"@drawable/ripple_timer\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/startTextView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/label_start\"\n        android:textColor=\"@color/colorPrimary\"\n        android:textSize=\"24sp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/startView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/startView\"\n        app:layout_constraintStart_toStartOf=\"@+id/startView\"\n        app:layout_constraintTop_toTopOf=\"@+id/startView\" />\n\n    <TableLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"32dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:stretchColumns=\"1\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/startView\">\n\n        <TableRow\n            android:id=\"@+id/trainingRow\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <ImageView\n                android:id=\"@+id/imgGoalView\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_margin=\"10dp\"\n                android:src=\"@drawable/ic_goal\" />\n\n            <Spinner\n                android:id=\"@+id/trainingNameView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:text=\"TextView\" />\n\n            <ImageView\n                android:id=\"@+id/detailTrainingView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                app:tint=\"?attr/colorControlNormal\"\n                android:src=\"@drawable/ic_view\" />\n        </TableRow>\n\n        <TableRow\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" >\n\n            <ImageView\n                android:id=\"@+id/imgSessionView\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_margin=\"10dp\"\n                android:src=\"@drawable/ic_session\" />\n\n            <ProgressBar\n                android:id=\"@+id/sessionProgressBar\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\" />\n\n            <TextView\n                android:id=\"@+id/sessionView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_margin=\"10dp\"\n                android:text=\"(1/20)\"\n                android:textSize=\"12sp\" />\n        </TableRow>\n\n        <TableRow\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" >\n\n            <ImageView\n                android:id=\"@+id/imgAvatarView\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_margin=\"10dp\"\n                android:src=\"@drawable/ic_avatar\" />\n\n            <RadioGroup\n                android:id=\"@+id/avatarGroup\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_weight=\"1\"\n                android:orientation=\"horizontal\">\n\n                <RadioButton\n                    android:id=\"@+id/radioMale\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"0.5\"\n                    android:checked=\"true\"\n                    android:text=\"@string/label_male\" />\n\n                <RadioButton\n                    android:id=\"@+id/radioFemale\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"0.5\"\n                    android:text=\"@string/label_female\" />\n            </RadioGroup>\n        </TableRow>\n\n        <TableRow\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n    </TableLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_session.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.session.SessionFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/sessionsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/sessionsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/sessionsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/sessionsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/sessionsView\" />\n\n    <LinearLayout\n        android:id=\"@+id/addLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_session\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_add\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/expandableButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"32dp\"\n        android:layout_marginBottom=\"32dp\"\n        android:clickable=\"true\"\n        android:focusable=\"auto\"\n        android:src=\"@drawable/ic_add\"\n        android:tint=\"#ffff\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_sessionsettings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.session.SessionSettingsFragment\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\" >\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:layout_gravity=\"center\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:clickable=\"true\"\n                    android:foreground=\"?attr/selectableItemBackground\"\n                    android:scaleType=\"centerCrop\" />\n            </androidx.cardview.widget.CardView>\n\n            <TableLayout\n                android:id=\"@+id/tableLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:stretchColumns=\"*\">\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_name\" />\n\n                    <EditText\n                        android:id=\"@+id/nameView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"textPersonName\" />\n                </TableRow>\n\n            </TableLayout>\n\n        </LinearLayout>\n    </ScrollView>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_training.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.training.TrainingFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/trainingsView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/trainingsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/trainingsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/trainingsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/trainingsView\" />\n\n    <LinearLayout\n        android:id=\"@+id/addLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/cloudImportLayout\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_training\"  />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_add\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/cloudImportLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/localImportLayout\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/cloudImportTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_cloud_import\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/cloudlImportButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_download\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/localImportLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/localImportTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_local_import\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/locallImportButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_local_import\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/expandableButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"32dp\"\n        android:layout_marginBottom=\"32dp\"\n        android:clickable=\"true\"\n        android:focusable=\"auto\"\n        android:src=\"@drawable/ic_add\"\n        android:tint=\"#ffff\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_trainingdatabase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.training.TrainingFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/trainingsView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/trainingsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/trainingsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/trainingsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/trainingsView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_trainingsettings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.training.TrainingSettingsFragment\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\" >\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:layout_gravity=\"center\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:clickable=\"true\"\n                    android:foreground=\"?attr/selectableItemBackground\"\n                    android:scaleType=\"centerCrop\" />\n            </androidx.cardview.widget.CardView>\n\n            <TableLayout\n                android:id=\"@+id/tableLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:stretchColumns=\"*\">\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_name\" />\n\n                    <EditText\n                        android:id=\"@+id/nameView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"textPersonName\" />\n                </TableRow>\n\n            </TableLayout>\n\n        </LinearLayout>\n    </ScrollView>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_trophy.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@+id/imageView\"\n        android:layout_width=\"100dp\"\n        android:layout_height=\"100dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"32dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/textView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:srcCompat=\"@drawable/ic_trophy_enabled\" />\n\n    <TextView\n        android:id=\"@+id/textView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/label_congratulation\"\n        android:textSize=\"30sp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/infoView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:text=\"@string/label_info_finished_session\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView\" />\n\n    <Button\n        android:id=\"@+id/okView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"32dp\"\n        android:background=\"@drawable/button_flat_selector\"\n        android:text=\"@string/label_ok\"\n        android:textColor=\"@android:color/white\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/elapsedTimeView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"TextView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/infoView\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_workout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.workout.WorkoutFragment\">\n\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/workoutsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/workoutsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/workoutsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/workoutsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/workoutsView\" />\n\n    <LinearLayout\n        android:id=\"@+id/addLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/addFromDatabaseLayout\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_workout\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_add\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/addFromDatabaseLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addFromDatabaseTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_from_database\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addFromDatabaseButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_database\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/expandableButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"32dp\"\n        android:layout_marginBottom=\"32dp\"\n        android:clickable=\"true\"\n        android:focusable=\"auto\"\n        android:src=\"@drawable/ic_add\"\n        android:tint=\"#ffff\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_workoutdatabase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.workout.WorkoutDatabaseFragment\">\n\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/workoutsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_workoutsettings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.workout.WorkoutSettingsFragment\">\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\" >\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:layout_gravity=\"center\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:clickable=\"true\"\n                    android:foreground=\"?attr/selectableItemBackground\"\n                    android:scaleType=\"centerCrop\" />\n            </androidx.cardview.widget.CardView>\n\n            <TableLayout\n                android:id=\"@+id/tableLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginTop=\"8dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:stretchColumns=\"*\">\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_name\" />\n\n                    <EditText\n                        android:id=\"@+id/nameView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"textPersonName\" />\n                </TableRow>\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_description\" />\n\n                    <EditText\n                        android:id=\"@+id/descriptionView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:gravity=\"start|top\"\n                        android:inputType=\"textMultiLine\" />\n                </TableRow>\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_preparation_time\" />\n\n                    <EditText\n                        android:id=\"@+id/prepTimeView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"numberSigned\" />\n                </TableRow>\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_break_time\" />\n\n                    <EditText\n                        android:id=\"@+id/breakTimeView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"numberSigned\" />\n                </TableRow>\n\n                <TableRow\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_time_mode\" />\n\n                    <Switch\n                        android:id=\"@+id/timeModeView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"start\" />\n                </TableRow>\n\n                <TableRow\n                    android:id=\"@+id/workoutTimeRow\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_workout_time\" />\n\n                    <EditText\n                        android:id=\"@+id/workoutTimeView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"numberSigned\" />\n                </TableRow>\n\n                <TableRow\n                    android:id=\"@+id/repetitionCountRow\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_repetition_count\" />\n\n                    <EditText\n                        android:id=\"@+id/repetitionCountView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:ems=\"10\"\n                        android:inputType=\"numberSigned\" />\n                </TableRow>\n\n                <TableRow\n                    android:id=\"@+id/isVideoModeRow\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_video_mode\" />\n\n                    <Switch\n                        android:id=\"@+id/videoModeView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"start\" />\n                </TableRow>\n\n                <TableRow\n                    android:id=\"@+id/videoCardRow\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                    <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/label_video\" />\n\n                    <androidx.cardview.widget.CardView\n                        android:id=\"@+id/videoCardView\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"10dp\"\n                        android:layout_marginBottom=\"10dp\"\n                        app:cardCornerRadius=\"10dp\">\n\n                    <VideoView\n                        android:id=\"@+id/videoView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"150dp\"\n                        android:clickable=\"true\"\n                        android:focusable=\"true\"/>\n\n                    </androidx.cardview.widget.CardView>\n                </TableRow>\n            </TableLayout>\n\n        </LinearLayout>\n    </ScrollView>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_workoutslide.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/constraintLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.workout.WorkoutSlideFragment\">\n\n    <TextView\n        android:id=\"@+id/nameView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:text=\"TextView\"\n        android:textStyle=\"bold\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.cardview.widget.CardView\n        android:id=\"@+id/videoCardView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        app:cardCornerRadius=\"10dp\"\n        app:layout_constrainedHeight=\"true\"\n        app:layout_constraintBottom_toTopOf=\"@+id/guideline\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/nameView\">\n\n        <VideoView\n            android:id=\"@+id/videoView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n        <ImageView\n            android:id=\"@+id/videoImageView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/ic_no_file\"\n            android:visibility=\"gone\" />\n\n    </androidx.cardview.widget.CardView>\n\n    <ImageView\n        android:id=\"@+id/infoView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:src=\"@drawable/ic_info\"\n        app:tint=\"?attr/colorControlNormal\"\n        android:translationZ=\"2dp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/videoCardView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/videoCardView\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/guideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        app:layout_constraintGuide_percent=\"0.50\" />\n\n    <TextView\n        android:id=\"@+id/countdownView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"24dp\"\n        android:gravity=\"center\"\n        android:text=\"TextView\"\n        app:layout_constraintBottom_toBottomOf=\"@id/progressView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"parent\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/nextWorkoutStepView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"24dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:clickable=\"true\"\n        android:src=\"@drawable/ic_next\"\n        app:backgroundTint=\"@color/colorLightBlue\"\n        app:fabSize=\"mini\"\n        app:layout_constraintBottom_toTopOf=\"@+id/progressView\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:indeterminate=\"false\"\n        android:scaleY=\"4\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/stateInfoView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginBottom=\"8dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/label_prepare\"\n        android:textStyle=\"bold\"\n        app:layout_constraintBottom_toTopOf=\"@id/stateInfoDetailView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/stateInfoDetailView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"24dp\"\n        android:text=\"TextView\"\n        app:layout_constraintBottom_toBottomOf=\"@id/countdownView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/descriptionView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:justificationMode=\"inter_word\"\n        android:singleLine=\"false\"\n        android:text=\"TextView\"\n        android:visibility=\"gone\"\n        app:layout_constraintEnd_toEndOf=\"@id/videoCardView\"\n        app:layout_constraintStart_toStartOf=\"@id/videoCardView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/videoCardView\" />\n\n    <ScrollView\n        android:id=\"@+id/scrollView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        app:layout_constraintBottom_toTopOf=\"@id/stateInfoView\"\n        app:layout_constraintEnd_toEndOf=\"@id/videoCardView\"\n        app:layout_constraintStart_toStartOf=\"@id/videoCardView\"\n        app:layout_constraintTop_toBottomOf=\"@id/descriptionView\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <TableLayout\n                android:id=\"@+id/workoutOverviewView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n        </LinearLayout>\n    </ScrollView>\n\n    <ImageView\n        android:id=\"@+id/playPauseView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:src=\"@drawable/ic_play\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/stateInfoDetailView\"\n        app:layout_constraintEnd_toStartOf=\"@+id/stateInfoDetailView\"\n        app:layout_constraintTop_toTopOf=\"@+id/stateInfoDetailView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_session.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"10dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"80dp\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/nameView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"TextView\"\n                app:layout_constraintEnd_toEndOf=\"@+id/optionView\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <ImageView\n                android:id=\"@+id/imgView\"\n                android:layout_width=\"32dp\"\n                android:layout_height=\"32dp\"\n                android:layout_marginTop=\"8dp\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/nameView\" />\n\n            <ImageView\n                android:id=\"@+id/reorderView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@+id/editView\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                android:tint=\"?attr/colorControlNormal\"\n                app:srcCompat=\"@drawable/ic_reorder\" />\n\n            <ImageView\n                android:id=\"@+id/optionView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"8dp\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/imgView\"\n                android:tint=\"?attr/colorControlNormal\"\n                app:srcCompat=\"@drawable/ic_option\" />\n\n            <ImageView\n                android:id=\"@+id/editView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginEnd=\"8dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@+id/optionView\"\n                app:layout_constraintStart_toEndOf=\"@+id/reorderView\"\n                app:srcCompat=\"@drawable/ic_edit\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.cardview.widget.CardView>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_training.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"20dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <ImageView\n                android:id=\"@+id/reorderView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"0dp\"\n                android:tint=\"?attr/colorControlNormal\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@+id/roundCardView\"\n                app:layout_constraintTop_toTopOf=\"@+id/nameView\"\n                app:srcCompat=\"@drawable/ic_reorder\" />\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:layout_marginStart=\"8dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\"\n                app:layout_constraintStart_toEndOf=\"@id/reorderView\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:scaleType=\"centerCrop\"\n                    app:srcCompat=\"@drawable/ic_info\" />\n\n            </androidx.cardview.widget.CardView>\n\n            <TextView\n                android:id=\"@+id/nameView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:text=\"TextView\"\n                android:textStyle=\"bold\"\n                app:layout_constraintEnd_toStartOf=\"@id/trophyView\"\n                app:layout_constraintStart_toEndOf=\"@+id/roundCardView\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/detailedView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:text=\"TextView\"\n                android:textSize=\"12sp\"\n                app:layout_constraintEnd_toEndOf=\"@+id/nameView\"\n                app:layout_constraintEnd_toStartOf=\"@+id/editView\"\n                app:layout_constraintStart_toEndOf=\"@+id/roundCardView\"\n                app:layout_constraintTop_toBottomOf=\"@+id/nameView\" />\n\n            <TextView\n                android:id=\"@+id/trophyView\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_marginEnd=\"0dp\"\n                android:background=\"@drawable/ic_trophy_enabled\"\n                android:gravity=\"center|top\"\n                android:text=\"0\"\n                android:textStyle=\"bold\"\n                app:layout_constraintBottom_toBottomOf=\"@+id/roundCardView\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"@+id/roundCardView\" />\n\n            <ImageView\n                android:id=\"@+id/editView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"0dp\"\n                android:layout_marginEnd=\"8dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@+id/optionView\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_edit\" />\n\n            <ImageView\n                android:id=\"@+id/optionView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"0dp\"\n                android:tint=\"?attr/colorControlNormal\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_option\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.cardview.widget.CardView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_trainingdatabase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"20dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:layout_marginStart=\"8dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:scaleType=\"centerCrop\"\n                    app:srcCompat=\"@drawable/ic_preview\" />\n\n            </androidx.cardview.widget.CardView>\n\n            <TextView\n                android:id=\"@+id/nameView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:enabled=\"false\"\n                android:text=\"TextView\"\n                android:textStyle=\"bold\"\n                app:layout_constraintEnd_toStartOf=\"@+id/downloadView\"\n                app:layout_constraintStart_toEndOf=\"@+id/roundCardView\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/detailedView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:enabled=\"false\"\n                android:text=\"TextView\"\n                android:textSize=\"12sp\"\n                app:layout_constraintEnd_toStartOf=\"@+id/downloadView\"\n                app:layout_constraintStart_toEndOf=\"@+id/roundCardView\"\n                app:layout_constraintTop_toBottomOf=\"@+id/nameView\" />\n\n            <ProgressBar\n                android:id=\"@+id/progressBar\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"8dp\"\n                app:layout_constraintEnd_toStartOf=\"@+id/downloadView\"\n                app:layout_constraintStart_toStartOf=\"@+id/detailedView\"\n                app:layout_constraintTop_toBottomOf=\"@+id/detailedView\" />\n\n            <ImageView\n                android:id=\"@+id/downloadView\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:clickable=\"true\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_download\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.cardview.widget.CardView>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_workout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/prepView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:gravity=\"center\"\n        android:text=\"TextView\"\n        android:textSize=\"12sp\" />\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"20dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <ImageView\n                android:id=\"@+id/reorderView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"0dp\"\n                android:tint=\"?attr/colorControlNormal\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_reorder\" />\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:layout_marginStart=\"8dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\"\n                app:layout_constraintStart_toEndOf=\"@id/reorderView\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:scaleType=\"centerCrop\" />\n            </androidx.cardview.widget.CardView>\n\n            <TextView\n                android:id=\"@+id/nameView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:text=\"TextView\"\n                android:textStyle=\"bold\"\n                app:layout_constraintEnd_toStartOf=\"@+id/editView\"\n                app:layout_constraintStart_toEndOf=\"@id/roundCardView\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/detailedView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:maxLines=\"3\"\n                android:singleLine=\"false\"\n                android:text=\"TextView\"\n                android:textSize=\"12sp\"\n                app:layout_constraintEnd_toStartOf=\"@+id/editView\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n                app:layout_constraintStart_toStartOf=\"@+id/nameView\"\n                app:layout_constraintTop_toBottomOf=\"@+id/nameView\" />\n\n            <ImageView\n                android:id=\"@+id/doneView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:background=\"@drawable/ic_workout_done\"\n                android:gravity=\"center|top\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <ImageView\n                android:id=\"@+id/editView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"0dp\"\n                android:layout_marginEnd=\"8dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toStartOf=\"@+id/optionView\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_edit\" />\n\n            <ImageView\n                android:id=\"@+id/optionView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"0dp\"\n                android:tint=\"?attr/colorControlNormal\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_option\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.cardview.widget.CardView>\n\n    <TextView\n        android:id=\"@+id/breakView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:gravity=\"center\"\n        android:text=\"TextView\"\n        android:textSize=\"12sp\" />\n\n    <View\n        android:id=\"@+id/divider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:background=\"?android:attr/listDivider\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_workoutdatabase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:foreground=\"?android:attr/selectableItemBackground\"\n        app:cardCornerRadius=\"10dp\"\n        app:contentPadding=\"20dp\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <androidx.cardview.widget.CardView\n                android:id=\"@+id/roundCardView\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:elevation=\"0dp\"\n                app:cardCornerRadius=\"30dp\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                tools:layout_editor_absoluteX=\"32dp\">\n\n                <ImageView\n                    android:id=\"@+id/imgView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:scaleType=\"centerCrop\" />\n            </androidx.cardview.widget.CardView>\n\n            <TextView\n                android:id=\"@+id/nameView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:text=\"TextView\"\n                android:textStyle=\"bold\"\n                app:layout_constraintStart_toEndOf=\"@id/roundCardView\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n            <TextView\n                android:id=\"@+id/detailedView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:maxLines=\"3\"\n                android:singleLine=\"false\"\n                android:text=\"TextView\"\n                android:textSize=\"10sp\"\n                app:layout_constraintStart_toStartOf=\"@+id/nameView\"\n                app:layout_constraintTop_toBottomOf=\"@+id/nameView\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n    </androidx.cardview.widget.CardView>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/nav_header_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@android:color/holo_blue_dark\"\n    android:gravity=\"bottom\"\n    android:orientation=\"horizontal\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:theme=\"@style/ThemeOverlay.AppCompat.Dark\">\n\n    <ImageView\n        android:id=\"@+id/imageView\"\n        android:layout_width=\"60dp\"\n        android:layout_height=\"60dp\"\n        android:layout_gravity=\"center\"\n        android:contentDescription=\"@string/nav_header_desc\"\n        android:paddingTop=\"@dimen/nav_header_vertical_spacing\"\n        app:srcCompat=\"@drawable/ic_openworkout\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginLeft=\"20dp\"\n        android:text=\"@string/app_name\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n        android:textSize=\"20sp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/preference_timepicker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<TimePicker\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/timePicker\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"18dp\"\n    android:paddingTop=\"18dp\"/>"
  },
  {
    "path": "app/src/main/res/layout-sw600dp/fragment_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.home.HomeFragment\">\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/leftGuideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.2\" />\n\n    <ImageView\n        android:id=\"@+id/startView\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"200dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"32dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:background=\"@drawable/ic_timer\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:foreground=\"@drawable/ripple_timer\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/startTextView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"24dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/label_start\"\n        android:textColor=\"@color/colorPrimary\"\n        android:textSize=\"24sp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/startView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/startView\"\n        app:layout_constraintStart_toStartOf=\"@+id/startView\"\n        app:layout_constraintTop_toTopOf=\"@+id/startView\" />\n\n    <TableLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"32dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:stretchColumns=\"1\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@id/rightGuideline\"\n        app:layout_constraintStart_toStartOf=\"@id/leftGuideline\"\n        app:layout_constraintTop_toBottomOf=\"@+id/startView\">\n\n        <TableRow\n            android:id=\"@+id/trainingRow\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <ImageView\n                android:id=\"@+id/imgGoalView\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_margin=\"10dp\"\n                android:src=\"@drawable/ic_goal\" />\n\n            <Spinner\n                android:id=\"@+id/trainingNameView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:text=\"TextView\" />\n\n            <ImageView\n                android:id=\"@+id/detailTrainingView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:src=\"@drawable/ic_view\"\n                app:tint=\"?attr/colorControlNormal\" />\n        </TableRow>\n\n        <TableRow\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <ImageView\n                android:id=\"@+id/imgSessionView\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_margin=\"10dp\"\n                android:src=\"@drawable/ic_session\" />\n\n            <ProgressBar\n                android:id=\"@+id/sessionProgressBar\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\" />\n\n            <TextView\n                android:id=\"@+id/sessionView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_margin=\"10dp\"\n                android:text=\"(1/20)\"\n                android:textSize=\"12sp\" />\n        </TableRow>\n\n        <TableRow\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <ImageView\n                android:id=\"@+id/imgAvatarView\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_margin=\"10dp\"\n                android:src=\"@drawable/ic_avatar\" />\n\n            <RadioGroup\n                android:id=\"@+id/avatarGroup\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_weight=\"1\"\n                android:orientation=\"horizontal\">\n\n                <RadioButton\n                    android:id=\"@+id/radioMale\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"0.5\"\n                    android:checked=\"true\"\n                    android:text=\"@string/label_male\" />\n\n                <RadioButton\n                    android:id=\"@+id/radioFemale\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"0.5\"\n                    android:text=\"@string/label_female\" />\n            </RadioGroup>\n        </TableRow>\n\n        <TableRow\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n    </TableLayout>\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/rightGuideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.8\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout-sw600dp/fragment_session.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.session.SessionFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/sessionsView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:paddingLeft=\"200dp\"\n        android:paddingRight=\"200dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/sessionsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/sessionsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/sessionsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/sessionsView\" />\n\n    <LinearLayout\n        android:id=\"@+id/addLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_session\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_add\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/expandableButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"32dp\"\n        android:layout_marginBottom=\"32dp\"\n        android:clickable=\"true\"\n        android:focusable=\"auto\"\n        android:src=\"@drawable/ic_add\"\n        android:tint=\"#ffff\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout-sw600dp/fragment_training.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.training.TrainingFragment\">\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/leftGuideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.2\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/trainingsView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@id/rightGuidline\"\n        app:layout_constraintStart_toStartOf=\"@id/leftGuideline\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/trainingsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/trainingsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/trainingsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/trainingsView\" />\n\n    <LinearLayout\n        android:id=\"@+id/addLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/cloudImportLayout\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_training\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_add\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/cloudImportLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/cloudImportTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_cloud_import\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/cloudlImportButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_download\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/localImportLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/localImportTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_local_import\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/locallImportButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_local_import\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/expandableButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"32dp\"\n        android:layout_marginBottom=\"32dp\"\n        android:clickable=\"true\"\n        android:focusable=\"auto\"\n        android:src=\"@drawable/ic_add\"\n        android:tint=\"#ffff\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/rightGuidline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.8\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout-sw600dp/fragment_trainingdatabase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.training.TrainingFragment\">\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/leftGuideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.2\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/trainingsView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:scrollbars=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@id/rightGuidline\"\n        app:layout_constraintStart_toStartOf=\"@id/leftGuideline\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/trainingsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/trainingsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/trainingsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/trainingsView\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/rightGuidline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.8\" />\n\n\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout-sw600dp/fragment_workout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".gui.workout.WorkoutFragment\">\n\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/leftGuideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.2\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/workoutsView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"@id/rightGuideline\"\n        app:layout_constraintStart_toStartOf=\"@id/leftGuideline\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:translationZ=\"2dp\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/workoutsView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/workoutsView\"\n        app:layout_constraintStart_toStartOf=\"@+id/workoutsView\"\n        app:layout_constraintTop_toTopOf=\"@+id/workoutsView\" />\n\n    <LinearLayout\n        android:id=\"@+id/addLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/addFromDatabaseLayout\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_workout\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_add\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/addFromDatabaseLayout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\"\n        app:layout_constraintBottom_toTopOf=\"@+id/expandableButton\"\n        app:layout_constraintEnd_toEndOf=\"@+id/expandableButton\">\n\n        <TextView\n            android:id=\"@+id/addFromDatabaseTextView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"16dp\"\n            android:textColor=\"#ffff\"\n            android:background=\"@drawable/button_flat_selector\"\n            android:text=\"@string/label_add_from_database\" />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/addFromDatabaseButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:src=\"@drawable/ic_database\"\n            android:tint=\"#ffff\"\n            app:fabSize=\"mini\" />\n    </LinearLayout>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/expandableButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"32dp\"\n        android:layout_marginBottom=\"32dp\"\n        android:clickable=\"true\"\n        android:focusable=\"auto\"\n        android:src=\"@drawable/ic_add\"\n        android:tint=\"#ffff\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n    <androidx.constraintlayout.widget.Guideline\n        android:id=\"@+id/rightGuideline\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintGuide_percent=\"0.8\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/menu/activity_main_drawer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:showIn=\"navigation_view\">\n\n    <group android:id=\"@+id/menu_top\" android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/nav_home\"\n            android:icon=\"@drawable/ic_home\"\n            android:title=\"@string/menu_home\" />\n        <item\n            android:id=\"@+id/nav_trainings\"\n            android:icon=\"@drawable/ic_goal\"\n            android:title=\"@string/menu_trainings\" />\n        <item\n            android:id=\"@+id/nav_main_preferences\"\n            android:icon=\"@drawable/ic_settings\"\n            android:title=\"@string/menu_settings\" />\n    </group>\n\n    <group android:id=\"@+id/menu_bottom\" android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/nav_help\"\n            android:icon=\"@drawable/ic_help\"\n            android:title=\"@string/label_help\" />\n        <item\n            android:id=\"@+id/nav_about\"\n            android:icon=\"@drawable/ic_info\"\n            android:title=\"@string/label_about\" />\n    </group>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/reset\"\n        android:title=\"@string/label_reset\"\n        android:icon=\"@drawable/ic_reset\"\n        app:showAsAction=\"ifRoom\" />\n    <item\n        android:id=\"@+id/edit\"\n        android:title=\"@string/label_edit\"\n        android:icon=\"@drawable/ic_edit\"\n        app:showAsAction=\"always\" />\n    <item\n        android:id=\"@+id/save\"\n        android:title=\"@string/label_save\"\n        android:icon=\"@drawable/ic_save\"\n        app:showAsAction=\"always\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/item_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/delete\"\n        android:title=\"@string/label_delete\"\n        android:icon=\"@drawable/ic_delete\"\n        app:showAsAction=\"always\" />\n    <item\n        android:id=\"@+id/duplicate\"\n        android:title=\"@string/label_duplicate\"\n        android:icon=\"@drawable/ic_duplicate\"\n        app:showAsAction=\"always\" />\n    <item\n        android:id=\"@+id/publish\"\n        android:title=\"@string/label_publish\"\n        android:icon=\"@drawable/ic_export\"\n        android:visible=\"false\"\n        app:showAsAction=\"always\" />\n    <item\n        android:id=\"@+id/export\"\n        android:title=\"@string/label_export_local\"\n        android:icon=\"@drawable/ic_local_export\"\n        android:visible=\"false\"\n        app:showAsAction=\"always\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"100\"\n        android:title=\"@string/action_settings\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/navigation/mobile_navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/mobile_navigation\"\n    app:startDestination=\"@+id/nav_home\">\n\n    <fragment\n        android:id=\"@+id/nav_home\"\n        android:name=\"com.health.openworkout.gui.home.HomeFragment\"\n        android:label=\"@string/menu_home\"\n        tools:layout=\"@layout/fragment_home\">\n        <action\n            android:id=\"@+id/action_HomeFragment_to_TrainingFragment\"\n            app:destination=\"@id/nav_trainings\" />\n        <action\n            android:id=\"@+id/action_HomeFragment_to_WorkoutFragmentSlide\"\n            app:destination=\"@id/nav_workoutslide\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_main_preferences\"\n        android:name=\"com.health.openworkout.gui.preference.MainPreferences\"\n        android:label=\"@string/menu_settings\">\n        <action\n            android:id=\"@+id/action_MainPreferencesFragment_to_ReminderPreferencesFragment\"\n            app:destination=\"@id/nav_reminder_preferences\" />\n        <action\n            android:id=\"@+id/action_MainPreferencesFragment_to_SoundPreferencesFragment\"\n            app:destination=\"@id/nav_sound_preferences\" />\n        <action\n            android:id=\"@+id/action_MainPreferencesFragment_to_BillingFragment\"\n            app:destination=\"@id/nav_billing_fragment\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_reminder_preferences\"\n        android:name=\"com.health.openworkout.gui.preference.ReminderPreferences\"\n        android:label=\"@string/preference_reminder\">\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_sound_preferences\"\n        android:name=\"com.health.openworkout.gui.preference.SoundPreferences\"\n        android:label=\"@string/preference_sound\">\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_billing_fragment\"\n        android:name=\"com.health.openworkout.gui.datatypes.BillingFragment\"\n        android:label=\"@string/menu_billing\">\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_trainings\"\n        android:name=\"com.health.openworkout.gui.training.TrainingFragment\"\n        android:label=\"@string/menu_trainings\"\n        tools:layout=\"@layout/fragment_training\">\n\n        <action\n            android:id=\"@+id/action_TrainingFragment_to_SessionFragment\"\n            app:destination=\"@id/nav_sessions\" />\n        <action\n            android:id=\"@+id/action_TrainingFragment_to_TrainingSettingsFragment\"\n            app:destination=\"@id/nav_trainingsettings\" />\n        <action\n            android:id=\"@+id/action_navTrainingsFragment_to_navTrainingsDatabaseFragment\"\n            app:destination=\"@id/nav_trainingsdatabase\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_trainingsettings\"\n        android:name=\"com.health.openworkout.gui.training.TrainingSettingsFragment\"\n        android:label=\"{title}\"\n        tools:layout=\"@layout/fragment_trainingsettings\">\n        <argument\n            android:name=\"TrainingPlanId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"Mode\"\n            app:argType=\"com.health.openworkout.gui.datatypes.GenericSettingsFragment$SETTING_MODE\"\n            android:defaultValue=\"EDIT\" />\n        <argument\n            android:name=\"title\"\n            app:argType=\"string\"\n            android:defaultValue=\"training settings\"/>\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_trainingsdatabase\"\n        android:name=\"com.health.openworkout.gui.training.TrainingsDatabaseFragment\"\n        android:label=\"@string/menu_trainingsdatabase\"\n        tools:layout=\"@layout/fragment_trainingdatabase\">\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_sessions\"\n        android:name=\"com.health.openworkout.gui.session.SessionFragment\"\n        android:label=\"{title}\"\n        tools:layout=\"@layout/fragment_session\">\n\n        <action\n            android:id=\"@+id/action_SessionFragment_to_WorkoutFragment\"\n            app:destination=\"@id/nav_workout\" />\n\n        <argument\n            android:name=\"TrainingPlanId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"title\"\n            app:argType=\"string\"\n            android:defaultValue=\"sessions\"/>\n        <action\n            android:id=\"@+id/action_SessionsFragment_to_SessionSettingsFragment\"\n            app:destination=\"@id/nav_sessionsettings\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_sessionsettings\"\n        android:name=\"com.health.openworkout.gui.session.SessionSettingsFragment\"\n        android:label=\"{title}\"\n        tools:layout=\"@layout/fragment_sessionsettings\">\n        <argument\n            android:name=\"TrainingPlanId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"WorkoutSessionId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"Mode\"\n            app:argType=\"com.health.openworkout.gui.datatypes.GenericSettingsFragment$SETTING_MODE\"\n            android:defaultValue=\"EDIT\" />\n        <argument\n            android:name=\"title\"\n            app:argType=\"string\"\n            android:defaultValue=\"session settings\"/>\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_workout\"\n        android:name=\"com.health.openworkout.gui.workout.WorkoutFragment\"\n        android:label=\"{title}\"\n        tools:layout=\"@layout/fragment_workout\">\n        <argument\n            android:name=\"SessionWorkoutId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"title\"\n            app:argType=\"string\"\n            android:defaultValue=\"workout\"/>\n        <action\n            android:id=\"@+id/action_WorkoutFragment_to_WorkoutSlideFragment\"\n            app:destination=\"@id/nav_workoutslide\" />\n        <action\n            android:id=\"@+id/action_WorkoutFramgent_to_WorkoutSettingsFragment\"\n            app:destination=\"@id/nav_workoutsettings\" />\n        <action\n            android:id=\"@+id/action_WorkoutFragment_to_WorkoutDatabaseFragment\"\n            app:destination=\"@id/nav_workoutdatabase\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_workoutdatabase\"\n        android:name=\"com.health.openworkout.gui.workout.WorkoutDatabaseFragment\"\n        android:label=\"@string/menu_workoutdatabase\"\n        tools:layout=\"@layout/fragment_workoutdatabase\">\n        <argument\n            android:name=\"SessionWorkoutId\"\n            android:defaultValue=\"-1L\"\n            app:argType=\"long\" />\n        <argument\n            android:name=\"WorkoutItemId\"\n            android:defaultValue=\"-1L\"\n            app:argType=\"long\" />\n        <action\n            android:id=\"@+id/action_WorkoutDatabaseFragment_to_WorkoutSettingsFragment\"\n            app:destination=\"@id/nav_workoutsettings\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_workoutsettings\"\n        android:name=\"com.health.openworkout.gui.workout.WorkoutSettingsFragment\"\n        android:label=\"{title}\"\n        tools:layout=\"@layout/fragment_workoutsettings\">\n        <argument\n            android:name=\"SessionWorkoutId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"WorkoutItemId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"Mode\"\n            app:argType=\"com.health.openworkout.gui.datatypes.GenericSettingsFragment$SETTING_MODE\"\n            android:defaultValue=\"EDIT\" />\n        <argument\n            android:name=\"title\"\n            app:argType=\"string\"\n            android:defaultValue=\"Workout settings\"/>\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_workoutslide\"\n        android:name=\"com.health.openworkout.gui.workout.WorkoutSlideFragment\"\n        android:label=\"{title}\"\n        tools:layout=\"@layout/fragment_workoutslide\">\n        <argument\n            android:name=\"SessionWorkoutId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"WorkoutItemId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n        <argument\n            android:name=\"title\"\n            app:argType=\"string\"\n            android:defaultValue=\"workout slide\"/>\n        <action\n            android:id=\"@+id/action_nav_WorkoutSlideFragment_to_TrophyFragment\"\n            app:destination=\"@id/nav_trophy\" />\n    </fragment>\n\n    <fragment\n        android:id=\"@+id/nav_trophy\"\n        android:name=\"com.health.openworkout.gui.datatypes.TrophyFragment\"\n        android:label=\"@string/menu_trophy\"\n        tools:layout=\"@layout/fragment_trophy\">\n        <argument\n            android:name=\"SessionWorkoutId\"\n            app:argType=\"long\"\n            android:defaultValue=\"-1L\" />\n    </fragment>\n</navigation>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources>\n    <color name=\"colorPrimary\">#000000</color>\n    <color name=\"colorPrimaryDark\">#000000</color>\n    <color name=\"colorAccent\">@android:color/holo_blue_light</color>\n    <color name=\"colorRed\">#FF4444</color>\n    <color name=\"colorDarkBlue\">#003c91</color>\n    <color name=\"colorLightBlue\">#33b6ea</color>\n    <color name=\"colorGreen\">#1efaa0</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/days.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n    <string-array name=\"days_entries\">\n        <item>@string/Monday</item>\n        <item>@string/Tuesday</item>\n        <item>@string/Wednesday</item>\n        <item>@string/Thursday</item>\n        <item>@string/Friday</item>\n        <item>@string/Saturday</item>\n        <item>@string/Sunday</item>\n    </string-array>\n\n    <string-array name=\"days_values\">\n        <item>Monday</item>\n        <item>Tuesday</item>\n        <item>Wednesday</item>\n        <item>Thursday</item>\n        <item>Friday</item>\n        <item>Saturday</item>\n        <item>Sunday</item>\n    </string-array>\n\n    <string-array name=\"days_default\">\n        <item>Monday</item>\n        <item>Wednesday</item>\n        <item>Friday</item>\n    </string-array>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n    <dimen name=\"nav_header_vertical_spacing\">8dp</dimen>\n    <dimen name=\"nav_header_height\">176dp</dimen>\n    <dimen name=\"fab_margin\">16dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/drawables.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item name=\"ic_menu_camera\" type=\"drawable\">@android:drawable/ic_menu_camera</item>\n    <item name=\"ic_menu_gallery\" type=\"drawable\">@android:drawable/ic_menu_gallery</item>\n    <item name=\"ic_menu_slideshow\" type=\"drawable\">@android:drawable/ic_menu_slideshow</item>\n    <item name=\"ic_menu_manage\" type=\"drawable\">@android:drawable/ic_menu_manage</item>\n    <item name=\"ic_menu_share\" type=\"drawable\">@android:drawable/ic_menu_share</item>\n    <item name=\"ic_menu_send\" type=\"drawable\">@android:drawable/ic_menu_send</item>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources>\n    <string name=\"app_name\" translatable=\"false\">openWorkout</string>\n    <string name=\"navigation_drawer_open\">Open navigation drawer</string>\n    <string name=\"navigation_drawer_close\">Close navigation drawer</string>\n    <string name=\"nav_header_desc\">Navigation header</string>\n    <string name=\"action_settings\">Settings</string>\n\n    <string name=\"menu_home\">Home</string>\n    <string name=\"menu_trainings\">Trainings</string>\n    <string name=\"menu_trainingsdatabase\">Training item database</string>\n    <string name=\"menu_sessions\">Sessions</string>\n    <string name=\"menu_workout\">Workout</string>\n    <string name=\"menu_settings\">Settings</string>\n    <string name=\"menu_trophy\">Trophy</string>\n    <string name=\"menu_workoutslide\">Workout slide</string>\n    <string name=\"menu_workoutsettings\">Workout settings</string>\n    <string name=\"menu_workoutdatabase\">Workout item database</string>\n    <string name=\"menu_billing\">Billing</string>\n\n    <string name=\"preference_reminder_general\">General</string>\n    <string name=\"preference_reminder_title\">Reminder</string>\n    <string name=\"preference_enable_dark_theme\">Dark theme mode</string>\n    <string name=\"preference_reminder\">Reminder</string>\n    <string name=\"preference_reminder_days\">Days</string>\n    <string name=\"preference_reminder_time\">Time</string>\n    <string name=\"preference_reminder_text\">Notification text</string>\n    <string name=\"preference_reminder_default_text\">Time for your workout</string>\n    <string name=\"preference_enable_debug_logging\">Enable debug logging</string>\n    <string name=\"preference_remove_advertisements\">Remove advertisements</string>\n    <string name=\"preference_sound\">Sound</string>\n    <string name=\"preference_speech_countdown\">Speech countdown</string>\n    <string name=\"preference_speech_workout_state\">Speech workout state</string>\n\n\n    <string name=\"label_info_remove_permanently\">Pay once and remove permanently any advertising from openWorkout</string>\n    <string name=\"label_info_purchase_for\">Purchase now for %s</string>\n    <string name=\"label_pending_purchase\">You have a pending purchase, please complete the purchase order %s</string>\n    <string name=\"label_already_purchased\">You already purchased it</string>\n    <string name=\"label_successful_purchased\">Successful purchased</string>\n    <string name=\"label_purchase_canceled\">Purchase canceled</string>\n    <string name=\"label_purchase_unexpected_error\">Unexpected error abort purchasing</string>\n\n    <string name=\"Monday\">Monday</string>\n    <string name=\"Tuesday\">Tuesday</string>\n    <string name=\"Wednesday\">Wednesday</string>\n    <string name=\"Thursday\">Thursday</string>\n    <string name=\"Friday\">Friday</string>\n    <string name=\"Saturday\">Saturday</string>\n    <string name=\"Sunday\">Sunday</string>\n\n    <string name=\"seconds_unit\">s</string>\n    <string name=\"day_unit\">%d. day</string>\n\n    <string name=\"label_session_size_completed\">%d of %d sessions completed</string>\n    <string name=\"label_repetition_info\">%d x %s repetition</string>\n    <string name=\"label_repetition_item_info\">%dx repetition</string>\n    <string name=\"label_work_duration_item_info\">%d s work duration</string>\n    <string name=\"label_break_duration_item_info\">%d s break</string>\n    <string name=\"label_prep_duration_item_info\">%d s preparation</string>\n\n    <string name=\"label_congratulation\">Congratulations!</string>\n    <string name=\"label_info_finished_session\">You finished your session in</string>\n\n    <string name=\"label_start\">Start</string>\n    <string name=\"label_break\">Take a break</string>\n    <string name=\"label_prepare\">Prepare your workout</string>\n    <string name=\"label_workout\">Do your workout</string>\n    <string name=\"speak_next_workout\">Your next workout is</string>\n    <string name=\"speak_halftime\">halftime</string>\n    <string name=\"speak_five\">five</string>\n    <string name=\"speak_four\">four</string>\n    <string name=\"speak_three\">three</string>\n    <string name=\"speak_two\">two</string>\n    <string name=\"speak_one\">one</string>\n\n    <string name=\"label_about\">About</string>\n    <string name=\"label_about_info\" translatable=\"false\">Copyright (C) 2020 olie.xdev@googlemail.com\\n\\nThis program is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation, either version 3 of the License, or\\n(at your option) any later version.\\n\\nThis program is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with this program.  If not, see http://www.gnu.org/licenses/</string>\n    <string name=\"label_help\">Help</string>\n    <string name=\"label_ok\">OK</string>\n    <string name=\"label_cancel\">Cancel</string>\n    <string name=\"label_save\">Save</string>\n    <string name=\"label_edit\">Edit</string>\n    <string name=\"label_reset\">Reset</string>\n    <string name=\"label_delete\">Delete</string>\n    <string name=\"label_export_local\">Export</string>\n    <string name=\"label_publish\">Publish</string>\n    <string name=\"label_publish_message\">For publishing your training plan, please save and upload the exported training file via a pull request on the <![CDATA[<a href=\"https://github.com/oliexdev/openWorkout\">openWorkout GitHub</a>]]> project page.\n        <![CDATA[<br><br>]]>\n        For more information visit the <![CDATA[<a href=\"https://github.com/oliexdev/openWorkout/wiki\">openWorkout wikipage</a>]]>.</string>\n    <string name=\"label_add\">Add</string>\n    <string name=\"label_add_session\">Add new session</string>\n    <string name=\"label_add_training\">Add new training</string>\n    <string name=\"label_add_workout\">Add new workout</string>\n    <string name=\"label_add_from_database\">Add from database</string>\n    <string name=\"label_duplicate\">Duplicate</string>\n\n    <string name=\"label_training_plans\">training plans</string>\n    <string name=\"label_add_toast\">%s added</string>\n    <string name=\"label_delete_toast\">%s deleted</string>\n    <string name=\"label_reset_toast\">%s reset</string>\n    <string name=\"label_save_toast\">%s saved</string>\n    <string name=\"label_package_size_mbytes\">%s MBytes package size</string>\n    <string name=\"label_package_size_kbytes\">%s kBytes package size</string>\n\n    <string name=\"label_new_training_plan\">New training plan</string>\n    <string name=\"label_new_workout_item\">New workout item</string>\n    <string name=\"label_name\">Name</string>\n    <string name=\"label_description\">Description</string>\n    <string name=\"label_preparation_time\">Preparation time</string>\n    <string name=\"label_workout_time\">Workout time</string>\n    <string name=\"label_break_time\">Break time</string>\n    <string name=\"label_repetition_count\">Repetition count</string>\n    <string name=\"label_time_mode\">Time mode</string>\n    <string name=\"label_video_mode\">Video mode</string>\n    <string name=\"label_video\">Video</string>\n    <string name=\"label_image\">Image</string>\n\n    <string name=\"label_male\">Male</string>\n    <string name=\"label_female\">Female</string>\n\n    <string name=\"label_select_image_file\">Select an image file</string>\n    <string name=\"label_select_video_file\">Select a video file</string>\n    <string name=\"label_select_export_file\">Export openWorkout training package</string>\n    <string name=\"label_select_import_file\">Import openWorkout training package</string>\n    <string name=\"label_select_debug_file\">Save debug file</string>\n    <string name=\"label_local_import\">Local import</string>\n    <string name=\"label_cloud_import\">Cloud import</string>\n\n    <string name=\"label_info_exported\">Training plan %s exported to %s</string>\n    <string name=\"label_info_imported\">Training plan %s imported from %s</string>\n\n    <string name=\"label_input_create_days\">How many sessions do you want to insert?</string>\n    <string name=\"label_really_reset_dialog\">Do you really want to reset the status of all items?</string>\n\n    <string name=\"error_no_trainings\">No workout trainings found. Please create a workout training.</string>\n    <string name=\"error_no_sessions\">No workout session in %s found. Please create a workout session.</string>\n    <string name=\"error_no_workout_items\">No workout item in %s found. Please create a workout item.</string>\n    <string name=\"error_empty_text\">field can\\'t be empty</string>\n    <string name=\"error_no_github_connection\">Can\\'t connect to GitHub API, make sure you are online</string>\n    <string name=\"error_no_github_download\">Can\\'t download file via GitHub API</string>\n    <string name=\"error_no_valid_training_package\">%s is not a valid training package</string>\n    <string name=\"error_no_access_to_file\">Can\\'t access file</string>\n\n    <string name=\"workout_name_jumping_jack\">Jumping jack</string>\n    <string name=\"workout_name_wall_sit\">Wall sit</string>\n    <string name=\"workout_name_push_ups\">Push-up</string>\n    <string name=\"workout_name_abdominal_crunch\">Abdominal crunch</string>\n    <string name=\"workout_name_step_up\">Step-up</string>\n    <string name=\"workout_name_squat\">Squat</string>\n    <string name=\"workout_name_triceps_dip\">Triceps dip</string>\n    <string name=\"workout_name_plank\">Plank</string>\n    <string name=\"workout_name_high_knees\">High knees</string>\n    <string name=\"workout_name_lunge\">Lunge</string>\n    <string name=\"workout_name_push_up_rotation\">Push-up rotation</string>\n    <string name=\"workout_name_side_plank\">Side plank</string>\n    <string name=\"workout_name_cross_jump_rotation\">Cross jump rotation</string>\n    <string name=\"workout_name_quick_steps\">Quick steps</string>\n    <string name=\"workout_name_jump_push_ups\">Jump push-up</string>\n    <string name=\"workout_name_bicycle_crunch\">Bicycle crunch</string>\n    <string name=\"workout_name_burpee\">Burpee</string>\n    <string name=\"workout_name_box_jump\">Box jump</string>\n    <string name=\"workout_name_circle_crunch\">Circle crunch</string>\n    <string name=\"workout_name_pike_walk\">Pike walk</string>\n    <string name=\"workout_name_cross_jump\">Cross jump</string>\n    <string name=\"workout_name_air_squad_bent_arms\">Air squad bent arms</string>\n    <string name=\"workout_name_lunge_kick\">Lunge kick</string>\n    <string name=\"workout_name_mountain_climbers\">Mountain climber</string>\n    <string name=\"workout_name_russian_twist\">Russian twist</string>\n    <string name=\"workout_name_donkey_kick\">Donkey kick</string>\n\n    <string name=\"workout_description_jumping_jack\">Stand up with your legs spread and your hands touching overhead. Then as you jump, bring your legs back together and put your arms to your sides. You can speed these up or slow them down to suit your fitness level.</string>\n    <string name=\"workout_description_wall_sit\">Stand with your back to a wall, feet hip-width apart and slightly in front of you. Lean back into the wall, and slide down like you’re sitting down into a chair. Your knees should finish above your ankles, bent at 90 degrees.</string>\n    <string name=\"workout_description_push_ups\">Get into a \"plank\" position on the floor or mat, feet together with toes tucked under, hands planted flat below your shoulders. Slowly bend your elbows and lower your body toward the floor, as far down as you can go keeping back and hips level. Then press back up and repeat.</string>\n    <string name=\"workout_description_abdominal_crunch\">Start with a basic crunch: Lie flat on your back, with your knees bent and feet on floor. Tighten your core. Press your lower back into the mat and reach toward top of knees. Return to starting position but keep core tight and repeat.</string>\n    <string name=\"workout_description_step_up\">Stand facing a sturdy chair or bench. Step up onto the chair or bench with your left leg, coming all the way up to stand on it with both feet fully. Then step back down and come back up, starting with your right leg this time.</string>\n    <string name=\"workout_description_squat\">Stand with your feet shoulder-width apart and toes forward. Bend your knees as you hinge at the hips, shifting them back and down like you’re about to sit in a chair. Lower yourself as far as you comfortably can, keeping most of your weight on your heels. Stand back up.</string>\n    <string name=\"workout_description_triceps_dip\">Sit on the front edge of a stable and sturdy chair or bench, and put your palms on the edge, fingers pointing forward or slightly toward you. Ease off the chair, supporting your weight with your heels and your palms. Slowly bend your elbows as you lower yourself toward the floor, then push back up. </string>\n    <string name=\"workout_description_plank\">Lie on your stomach on an exercise mat, with your elbows close to your sides, palms down and fingers facing forward. Lift your torso and thighs off the floor, keeping your body straight. Rest your weight on your elbows and your feet, with toes tucked toward shins. Use your core muscles, and stay in this position.</string>\n    <string name=\"workout_description_high_knees\">Run in place, bringing your knees up as high as you can with each step. Focus on lifting your knees up and down rapidly. Try holding your palms out in front of you at waist height, working to \"smack\" your knee into your palm with each step.</string>\n    <string name=\"workout_description_lunge\">Stand with your feet together. Step forward on your right foot, dropping your pelvis down toward the floor (not forward), lowering yourself until both front and back knees are bent as close to a 90-degree angle as possible. Then push back with the front leg and return to your starting position. Switch legs.</string>\n    <string name=\"workout_description_push_up_rotation\">Start in a standard push-up position. Begin a traditional push-up, but as you come back up, shift your weight onto your left side. Rotate your upper body and extend your right arm straight up toward the ceiling. Return to your starting position, then repeat with right side.</string>\n    <string name=\"workout_description_side_plank\">Lie on your right side on a mat, with your legs straight and your left leg stacked directly on top of the right. Keeping your ankles, knees, hips, and trunk in a straight line, push your weight up on your bent right elbow, which should be directly under your shoulder. Lift your hips, knees, and trunk off the mat. Hold the position for 15 seconds. Then switch sides.</string>\n    <string name=\"workout_description_cross_jump_rotation\">Stand upright with your feet close together, bend your elbows and place your palms against your chest. Slightly bend your knees and then jump to the right, jump forward and to the left, jump back and continue jumping in a circle. Perform this exercise for as long as indicated.</string>\n    <string name=\"workout_description_quick_steps\">Stand in front of three- to six-inch high step. Step up with right foot, then left. Step down with right foot, then left. Repeat pattern as quickly as possible </string>\n    <string name=\"workout_description_jump_push_ups\">no description</string>\n    <string name=\"workout_description_bicycle_crunch\">Lie flat on the floor with your lower back pressed to the ground (pull your navel in to also target your deep abs). Put your hands behind your head, then bring your knees in towards your chest and lift your shoulder blades off the ground, but be sure not to pull on your neck. Straighten your right leg out to about a 45-degree angle to the ground while turning your upper body to the left, bringing your right elbow towards the left knee. Make sure your rib cage is moving and not just your elbows. Now switch sides and do the same motion on the other side to complete one rep.</string>\n    <string name=\"workout_description_burpee\">Begin in a standing position. Move into a squat position with your hands on the ground. Kick your feet back into a plank position, while keeping your arms extended. Immediately return your feet into squat position. Stand up from the squat position</string>\n    <string name=\"workout_description_box_jump\">Stand in front of the box with your feet shoulder-width apart. Bend into a quarter squat and swing your arms back, then swing them forward and explode up off the ground. Land on the box as softly as possible. You’re aiming to mimic your take-off position on landing – feet flat and knees slightly bent (don’t let them collapse inwards). If you land in a deep squat rather than a quarter squat, it’s a sign that you’ve picked too high a box. Then jump back down. Again, you’re aiming to land as softly as possible. You can also opt to step down slowly one leg at a time, which will work the glutes even more and safeguard your joints.</string>\n    <string name=\"workout_description_circle_crunch\">Lie face up with your knees bent and feet flat on the floor, hands behind your head with light fingers. Lift your shoulders off the floor until you feel a tight contraction, and curl your torso around in a small, clockwise circular motion (starting from 6 to 9 to 12 to 3 and back down to 6)</string>\n    <string name=\"workout_description_pike_walk\">Start standing straight up and with your feet about shoulder width apart. Bend over at the waist put your hands on the floor. Keep your legs straight. Begin walking your hands forward. Walk your hands out as far as you can and then back in to your feet. You do not need to stand back up every time.</string>\n    <string name=\"workout_description_cross_jump\">Stand upright with your feet close together then bend your elbows and bring your palms close to your chest. Slightly bend your knees and then jump to the right then jump forward and jump to the left then jump back and continue jumping in a circle.</string>\n    <string name=\"workout_description_air_squad_bent_arms\">no description</string>\n    <string name=\"workout_description_lunge_kick\">Put your feet together, take a step back with your right leg and do a lunge. As you come up, push the right leg up. Return to the starting position and repeat with the left leg. Alternate legs until the set is complete. Proper Form and Breathing Stand up straight, face forward, keep your torso tense and your back flat. As you lunge, keep your front knee in line with your ankle and load your front heel with your weight. Exhale as you push off, then return to the starting position or transition directly into a new lunge.</string>\n    <string name=\"workout_description_mountain_climbers\">This is a cardiovascular exercise that promotes heart health and burns calories. As you perform the movement, your shoulders, arms and chest work to stabilize your upper body while your core stabilizes the rest of your body. As the main driving force, your quads also get an incredible workout. Take a plank position, making sure to distribute your weight evenly between your hands and toes. Check your form – your hands should be about shoulder-width apart, your back flat, your abs tight and your head in line. Pull your right knee toward your chest as far as possible. Switch legs by pulling one knee out and bringing the other knee in. Keeping your hips lowered, bring your knees in and out as far and as fast as you can. Breathe in and out alternately with each leg change.</string>\n    <string name=\"workout_description_russian_twist\">To perform the Russian twist, sit on the floor and bend both knees while keeping the feet together and slightly above the floor (or placed under a stable surface). Ideally, keep the upper body straight while the back is off the floor at a 45-degree angle. The arms are held together straight away from the body, and the hands are interlocked like a ball (it is possible to hold a weight to increase the difficulty). Arms are next swung from side to side in a twisting motion, with each swing to one side counted as one repetition. The slower you move your arms from side to side, the harder the exercise will be and the better your abdominal workout will be. As you move your arms during the exercise, it is important not to pause between repetitions, or you will lose the effect of the abdominal work. Breathing in and out evenly during the exercise is important to ensure proper oxygenation.</string>\n    <string name=\"workout_description_donkey_kick\">Position yourself on all fours with your hands directly under your shoulders and your knees under your hips. Make sure your back is flat (think about balancing a glass of water on your lower back), and tilt your chin slightly, so your neck is facing the ceiling. Tighten your lower abs without curving your spine. Maintain 0 or 90-degree flexion in your right knee, and slowly lift your leg back and up toward the ceiling. Your maximum height is reached just before your back arches or your hips begin to rotate. Continue to return to the starting position. Do all the repetitions on one side and then switch legs.</string>\n\n    <string name=\"training_seven_minutes_workout_training\">Seven minutes workout training</string>\n    <string name=\"training_beginners_training\">Beginners training</string>\n    <string name=\"training_abdominal_muscle_training\">Abdominal muscle training</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.DayNight\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"AppTheme.AppBarOverlay\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\" />\n\n    <style name=\"AppTheme.PopupOverlay\" parent=\"ThemeOverlay.AppCompat.Light\" />\n\n    <!-- Style for an Preference Entry -->\n    <style name=\"AppPreference\">\n        <item name=\"android:layout\">@layout/preference_material</item>\n    </style>\n\n    <!-- Style for a DialogPreference Entry -->\n    <style name=\"AppPreference.DialogPreference\">\n        <item name=\"positiveButtonText\">@android:string/ok</item>\n        <item name=\"negativeButtonText\">@android:string/cancel</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources>\n    <string name=\"app_name\" translatable=\"false\">openWorkout</string>\n    <string name=\"navigation_drawer_open\">Navigationsschublade öffnen</string>\n    <string name=\"navigation_drawer_close\">Navigationsschublade schließen</string>\n    <string name=\"nav_header_desc\">Navigation Kopfzeile</string>\n    <string name=\"action_settings\">Einstellungen</string>\n\n    <string name=\"menu_home\">Home</string>\n    <string name=\"menu_trainings\">Trainings</string>\n    <string name=\"menu_trainingsdatabase\">Datenbank für Übungen</string>\n    <string name=\"menu_sessions\">Sitzungen</string>\n    <string name=\"menu_workout\">Workout</string>\n    <string name=\"menu_settings\">Einstellungen</string>\n    <string name=\"menu_trophy\">Trophäe</string>\n    <string name=\"menu_workoutslide\">Workout slide</string>\n    <string name=\"menu_workoutsettings\">Workout-Einstellungen</string>\n    <string name=\"menu_workoutdatabase\">Datenbank der Trainingseinheiten</string>\n    <string name=\"menu_billing\">Billing</string>\n\n    <string name=\"preference_reminder_general\">Allgemein</string>\n    <string name=\"preference_reminder_title\">Erinnerung</string>\n    <string name=\"preference_enable_dark_theme\">Dunkler Themenmodus</string>\n    <string name=\"preference_reminder\">Erinnerung</string>\n    <string name=\"preference_reminder_days\">Tage</string>\n    <string name=\"preference_reminder_time\">Zeit</string>\n    <string name=\"preference_reminder_text\">Benachrichtigungstext</string>\n    <string name=\"preference_reminder_default_text\">Zeit für dein Training</string>\n    <string name=\"preference_enable_debug_logging\">Debug-Protokollierung einschalten</string>\n    <string name=\"preference_remove_advertisements\">Werbung entfernen</string>\n    <string name=\"preference_sound\">Ton</string>\n    <string name=\"preference_speech_countdown\">Countdown für die Ansprache</string>\n    <string name=\"preference_speech_workout_state\">Speech workout state</string>\n\n\n    <string name=\"label_info_remove_permanently\">Zahlen Sie einmal und entfernen Sie dauerhaft jegliche Werbung von openWorkout</string>\n    <string name=\"label_info_purchase_for\">Jetzt kaufen für %s</string>\n    <string name=\"label_pending_purchase\">Sie haben einen offenen Kauf, bitte füllen Sie die Bestellung aus %s</string>\n    <string name=\"label_already_purchased\">Du hast es bereits gekauft</string>\n    <string name=\"label_successful_purchased\">Erfolgreich gekauft</string>\n    <string name=\"label_purchase_canceled\">Kauf storniert</string>\n    <string name=\"label_purchase_unexpected_error\">Unerwarteter Fehler Abbruch des Einkaufs</string>\n\n    <string name=\"Monday\">Montag</string>\n    <string name=\"Tuesday\">Dienstag</string>\n    <string name=\"Wednesday\">Mittwoch</string>\n    <string name=\"Thursday\">Donnerstag</string>\n    <string name=\"Friday\">Freitag</string>\n    <string name=\"Saturday\">Sonnabend</string>\n    <string name=\"Sunday\">Sonntag</string>\n\n    <string name=\"seconds_unit\">s</string>\n    <string name=\"day_unit\">%d. Tag</string>\n\n    <string name=\"label_session_size_completed\">%d von %d abgeschlossenen Sitzungen</string>\n    <string name=\"label_repetition_info\">%d x %s Wiederholungen</string>\n    <string name=\"label_repetition_item_info\">%d x Wiederholung</string>\n    <string name=\"label_work_duration_item_info\">%d s Workout-Dauer</string>\n    <string name=\"label_break_duration_item_info\">%d s Pausen</string>\n    <string name=\"label_prep_duration_item_info\">%d s Wiederholungen</string>\n\n    <string name=\"label_congratulation\">Herzlichen Glückwunsch!</string>\n    <string name=\"label_info_finished_session\">Du hast deine Sitzung in</string>\n\n    <string name=\"label_start\">Start</string>\n    <string name=\"label_break\">Eine Pause einlegen</string>\n    <string name=\"label_prepare\">Bereite dein Training vor</string>\n    <string name=\"label_workout\">Mach dein Training</string>\n    <string name=\"speak_next_workout\">Dein nächstes Workout ist</string>\n    <string name=\"speak_halftime\">Halbzeit</string>\n    <string name=\"speak_five\">Fünf</string>\n    <string name=\"speak_four\">Vier</string>\n    <string name=\"speak_three\">Drei</string>\n    <string name=\"speak_two\">Zwei</string>\n    <string name=\"speak_one\">Eins</string>\n\n    <string name=\"label_about\">Über</string>\n    <string name=\"label_about_info\" translatable=\"false\">Copyright (C) 2020 olie.xdev@googlemail.com\\n\\nThis program is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation, either version 3 of the License, or\\n(at your option) any later version.\\n\\nThis program is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with this program.  If not, see http://www.gnu.org/licenses/</string>\n    <string name=\"label_help\">Hilfe</string>\n    <string name=\"label_ok\">OK</string>\n    <string name=\"label_cancel\">Abbrechen</string>\n    <string name=\"label_save\">Speichern</string>\n    <string name=\"label_edit\">Bearbeiten</string>\n    <string name=\"label_reset\">Zurücksetzen</string>\n    <string name=\"label_delete\">Löschen</string>\n    <string name=\"label_export_local\">Exportieren</string>\n    <string name=\"label_publish\">Veröffentlichen</string>\n    <string name=\"label_publish_message\">Um Ihren Trainingsplan zu veröffentlichen, speicher bitte die exportierte Trainingsdatei und lade sie über einen Pull-Request auf der Projektseite <![CDATA[<a href=\"https://github.com/oliexdev/openWorkout\">openWorkout GitHub</a>]]> hoch.\n        <![CDATA[<br><br>]]>\n        Weitere Informationen findet man auf <![CDATA[<a href=\"https://github.com/oliexdev/openWorkout/wiki\">openWorkout wikipage</a>]]>.</string>\n    <string name=\"label_add\">Hinzufügen</string>\n    <string name=\"label_add_session\">Neue Sitzung hinzufügen</string>\n    <string name=\"label_add_training\">Neues Training hinzufügen</string>\n    <string name=\"label_add_workout\">Neues Workout hinzufügen</string>\n    <string name=\"label_add_from_database\">Aus der Datenbank hinzufügen</string>\n    <string name=\"label_duplicate\">Duplizieren</string>\n\n    <string name=\"label_training_plans\">Trainingspläne</string>\n    <string name=\"label_add_toast\">%s Hinzugefügt</string>\n    <string name=\"label_delete_toast\">%s gelöscht</string>\n    <string name=\"label_reset_toast\">%s zurückgesetzt</string>\n    <string name=\"label_save_toast\">%s gespeichert</string>\n    <string name=\"label_package_size_mbytes\">%s MBytes Paketgröße</string>\n    <string name=\"label_package_size_kbytes\">%s kBytes Paketgröße</string>\n\n    <string name=\"label_new_training_plan\">Neuer Trainingsplan</string>\n    <string name=\"label_new_workout_item\">Neues Trainingselement</string>\n    <string name=\"label_name\">Name</string>\n    <string name=\"label_description\">Beschreibung</string>\n    <string name=\"label_preparation_time\">Vorbereitungszeit</string>\n    <string name=\"label_workout_time\">Zeit für das Training</string>\n    <string name=\"label_break_time\">Pausenzeit</string>\n    <string name=\"label_repetition_count\">Anzahl der Wiederholungen</string>\n    <string name=\"label_time_mode\">Zeitmodus</string>\n    <string name=\"label_video_mode\">Videomodus</string>\n    <string name=\"label_video\">Video</string>\n    <string name=\"label_image\">Bild</string>\n\n    <string name=\"label_male\">Männlich</string>\n    <string name=\"label_female\">Weiblich</string>\n\n    <string name=\"label_select_image_file\">Wähle eine Bilddatei</string>\n    <string name=\"label_select_video_file\">Wählen eine Videodatei</string>\n    <string name=\"label_select_export_file\">Exportiere openWorkout Trainingspaket</string>\n    <string name=\"label_select_import_file\">Importiere openWorkout Trainingspaket</string>\n    <string name=\"label_select_debug_file\">Debug-Datei speichern</string>\n    <string name=\"label_local_import\">Lokal Import</string>\n    <string name=\"label_cloud_import\">Cloud-Import</string>\n\n    <string name=\"label_info_exported\">Trainingsplan %s exportiert nach %s</string>\n    <string name=\"label_info_imported\">Trainingsplan %s importiert von %s</string>\n\n    <string name=\"label_input_create_days\">Wie viele Sitzungen möchtest Du einfügen?</string>\n    <string name=\"label_really_reset_dialog\">Möchtest Du wirklich den Status aller Artikel zurücksetzen?</string>\n\n    <string name=\"error_no_trainings\">Keine Workout-Trainings gefunden. Bitte erstelle ein Workout-Training.</string>\n    <string name=\"error_no_sessions\">Keine Trainingssitzung in %s gefunden. Bitte erstelle eine Trainingssitzung.</string>\n    <string name=\"error_no_workout_items\">Kein Workout-Element in %s gefunden. Bitte erstelle ein Trainingselement.</string>\n    <string name=\"error_empty_text\">Feld darf nicht leer sein</string>\n    <string name=\"error_no_github_connection\">Kann keine Verbindung zur GitHub-API herstellen, stelle sicher, dass du online bist</string>\n    <string name=\"error_no_github_download\">Datei kann nicht über GitHub-API heruntergeladen werden</string>\n    <string name=\"error_no_valid_training_package\">%s ist kein gültiges Trainingspaket</string>\n    <string name=\"error_no_access_to_file\">Kann nicht auf Datei zugreifen</string>\n\n    <string name=\"workout_name_jumping_jack\">Hampelmann (Jumping jack)</string>\n    <string name=\"workout_name_wall_sit\">Wall sit</string>\n    <string name=\"workout_name_push_ups\">Push-up</string>\n    <string name=\"workout_name_abdominal_crunch\">Abdominal crunch</string>\n    <string name=\"workout_name_step_up\">Step-up</string>\n    <string name=\"workout_name_squat\">Hocke (Squat)</string>\n    <string name=\"workout_name_triceps_dip\">Triceps dip</string>\n    <string name=\"workout_name_plank\">Plank</string>\n    <string name=\"workout_name_high_knees\">High knees</string>\n    <string name=\"workout_name_lunge\">Lunge</string>\n    <string name=\"workout_name_push_up_rotation\">Push-up rotation</string>\n    <string name=\"workout_name_side_plank\">Side plank</string>\n    <string name=\"workout_name_cross_jump_rotation\">Cross jump rotation</string>\n    <string name=\"workout_name_quick_steps\">Quick steps</string>\n    <string name=\"workout_name_jump_push_ups\">Jump push-up</string>\n    <string name=\"workout_name_bicycle_crunch\">Bicycle crunch</string>\n    <string name=\"workout_name_burpee\">Burpee</string>\n    <string name=\"workout_name_box_jump\">Box jump</string>\n    <string name=\"workout_name_circle_crunch\">Circle crunch</string>\n    <string name=\"workout_name_pike_walk\">Hechtsprung (Pike walk)</string>\n    <string name=\"workout_name_cross_jump\">Kreuzsprung (Cross jump)</string>\n    <string name=\"workout_name_air_squad_bent_arms\">Air squad bent arms</string>\n    <string name=\"workout_name_lunge_kick\">Ausfallschritt (Lunge kick)</string>\n    <string name=\"workout_name_mountain_climbers\">Bergsteiger|in (Mountain climber)</string>\n    <string name=\"workout_name_russian_twist\">Russian twist</string>\n    <string name=\"workout_name_donkey_kick\">Eselstritt (Donkey kick)</string>\n\n    <string name=\"workout_description_jumping_jack\">Stelle dich mit gespreizten Beinen auf und berühren deine Hände über dem Kopf. Wenn du springst, führe die Beine wieder zusammen und lege die Arme an die Seite. Du kannst diese Übungen beschleunigen oder verlangsamen, je nach deinem Fitnesslevel.</string>\n    <string name=\"workout_description_wall_sit\">Stelle dich mit dem Rücken an eine Wand, die Füße hüftbreit auseinander und leicht vor dich. Lehne dich mit dem Rücken an die Wand und lasse dich nach unten gleiten, als ob du dich auf einen Stuhl setzen würdest. Deine Knie sollten oberhalb der Knöchel enden und im 90-Grad-Winkel gebeugt sein.</string>\n    <string name=\"workout_description_push_ups\">Stell dich auf den Boden oder eine Matte, die Füße zusammen, die Zehen angezogen, die Hände flach unter die Schultern gelegt. Beuge langsam die Ellbogen und senke deinen Körper so weit wie möglich nach unten, wobei dein Rücken und Hüfte gerade gehalten wird. Dann wieder hochdrücken und wiederholen.</string>\n    <string name=\"workout_description_abdominal_crunch\">Beginne mit einem einfachen Crunch: Lege dich flach auf den Rücken, beuge die Knie und stell die Füße auf den Boden. Spann deinen Kern an. Drücke den unteren Rücken auf die Matte und strecke die Knie nach oben. Kehre in die Ausgangsposition zurück, aber halte die Körpermitte angespannt und wiederhole die Übung.</string>\n    <string name=\"workout_description_step_up\">Stell dich vor einen stabilen Stuhl oder eine Bank. Steigen Sie mit dem linken Bein auf den Stuhl oder die Bank und stell sich mit beiden Füßen ganz darauf. Gehe dann wieder nach unten und komme wieder hoch, diesmal mit dem rechten Bein.</string>\n    <string name=\"workout_description_squat\">Stell dich mit den Füßen schulterbreit auseinander und den Zehen nach vorne. Beuge die Knie in den Hüften und schiebe sie nach hinten und unten, als ob du dich auf einen Stuhl setzen willst. Senke dich so weit ab, wie es dir möglich ist, und verlager dabei den größten Teil deines Gewichts auf deine Fersen. Steh wieder auf.</string>\n    <string name=\"workout_description_triceps_dip\">Setze dich auf die Vorderkante eines stabilen Stuhls oder einer Bank und lege deine Handflächen auf die Kante, wobei die Finger nach vorne oder leicht zu dir zeigen. Steige vom Stuhl ab und stütze dein Gewicht auf deine Fersen und deine Handflächen. Beugen langsam die Ellbogen, während du dich zum Boden absenkst, und drücken dich dann wieder hoch.</string>\n    <string name=\"workout_description_plank\">Lege dich auf den Bauch auf eine Gymnastikmatte und stütze die Ellbogen seitlich ab, wobei die Handflächen nach unten und die Finger nach vorne zeigen. Hebe den Oberkörper und die Oberschenkel vom Boden ab und halte deinen Körper gerade. Stützen dein Gewicht auf die Ellenbogen und die Füße, wobei die Zehen zu den Schienbeinen zeigen. Spannen deine Rumpfmuskeln an und bleibe in dieser Position.</string>\n    <string name=\"workout_description_high_knees\">Laufe auf der Stelle und hebe die Knie bei jedem Schritt so weit wie möglich an. Konzentriere dich darauf, die Knie schnell hoch und runter zu heben. Versuche, die Handflächen in Hüfthöhe vor dir zu halten und bei jedem Schritt das Knie in die Handfläche zu \"klatschen\".</string>\n    <string name=\"workout_description_lunge\">Stelle deine Füßen zusammen. Trete mit dem rechten Fuß nach vorne und lassen das Becken in Richtung Boden fallen (nicht nach vorne). Senken dich ab, bis die vorderen und hinteren Knie so weit wie möglich im 90-Grad-Winkel gebeugt sind. Drücke dich dann mit dem vorderen Bein zurück und kehre in deine Ausgangsposition zurück. Wechsel die Beine.</string>\n    <string name=\"workout_description_push_up_rotation\">Beginn in einer normalen Liegestützposition. Beginne in einen traditionellen Liegestütz, verlagere dein Gewicht jedoch auf die linke Seite, wenn du wieder nach oben kommst. Drehe deinen Oberkörper und strecke den rechten Arm gerade nach oben zur Decke. Kehre in die Ausgangsposition zurück, und wiederhole die Übung mit der rechten Seite.</string>\n    <string name=\"workout_description_side_plank\">Lege dich mit der rechten Seite auf eine Matte, die Beine sind gestreckt und das linke Bein liegt direkt über dem rechten. Halte Knöchel, Knie, Hüfte und Rumpf in einer geraden Linie und stütze dein Gewicht auf den gebeugten rechten Ellbogen, der sich direkt unter Ihrer Schulter befinden sollte. Hebe die Hüfte, Knie und Rumpf von der Matte ab. Halte die Position für 15 Sekunden. Wechseln Sie dann die Seite.</string>\n    <string name=\"workout_description_cross_jump_rotation\">Stell dich aufrecht hin, mit den Füßen dicht nebeneinander, beuge die Ellbogen und lege die Handflächen an die Brust. Beuge leicht die Knie und springe dann nach rechts, springe nach vorne und nach links, springe zurück und springe weiter im Kreis. Führe diese Übung so lange wie angegeben durch.</string>\n    <string name=\"workout_description_quick_steps\">Stell dich vor eine drei bis sechs Zentimeter hohe Stufe. Schritt nach oben mit dem rechten Fuß, dann mit dem linken. Mit dem rechten Fuß abwärts treten, dann mit dem linken. Wiederholen Sie das Muster so schnell wie möglich.</string>\n    <string name=\"workout_description_jump_push_ups\">no description</string>\n    <string name=\"workout_description_bicycle_crunch\">Lege dich flach auf den Boden und drücke den unteren Rücken auf den Boden (ziehe den Bauchnabel nach innen, um auch die tiefen Bauchmuskeln zu trainieren). Verschränke die Hände hinter dem Kopf, ziehe die Knie zur Brust und hebe die Schulterblätter vom Boden ab, aber achte darauf, nicht am Nacken zu ziehen. Strecke dein rechtes Bein in einem 45-Grad-Winkel zum Boden aus, während der Oberkörper nach links dreht und der rechte Ellbogen zum linken Knie geführt wird. Achte darauf, dass sich dein Brustkorb bewegt und nicht nur dein Ellbogen. Wechsel nun die Seite und führe die gleiche Bewegung auf der anderen Seite aus, um eine Wiederholung zu absolvieren.</string>\n    <string name=\"workout_description_burpee\">Beginn in einer stehenden Position. Geh in die Hocke und lege die Hände auf den Boden. Tritt mit den Füßen zurück in die Plank-Position und halte dabei die Arme gestreckt. Stell die Füße sofort wieder in die Hocke. Steh aus der Hocke auf.</string>\n    <string name=\"workout_description_box_jump\">Stell dich mit schulterbreit auseinander stehenden Füßen vor den Kasten. Beuge dich in eine viertel Hocke und schwing die Arme nach hinten, dann nach vorne und hebe Sie vom Boden ab. Lande so sanft wie möglich auf dem Kasten. Bei der Landung solltest du deine Startposition nachahmen - die Füße sind flach und die Knie leicht gebeugt (lasse sie nicht nach innen kippen). Wenn du eher in einer tiefen Hocke als in einer Viertelhocke landest, ist das ein Zeichen dafür, dass du einen zu hohen Kasten gewählt hast. Springe dann wieder ab. Hier ist es dein Ziel, so weich wie möglich zu landen. Du kannst auch langsam mit einem Bein nach dem anderen absteigen, was die Gesäßmuskulatur noch mehr trainiert und deine Gelenke schont.</string>\n    <string name=\"workout_description_circle_crunch\">Lege dich mit dem Gesicht nach oben, mit gebeugten Knien und flachen Füßen auf den Boden, die Hände hinter dem Kopf mit leichten Fingern. Hebe die Schultern vom Boden ab, bis du eine feste Kontraktion spürst, und krümm deinen Oberkörper in einer kleinen Kreisbewegung im Uhrzeigersinn (von 6 über 9 zu 12 zu 3 und wieder zurück zu 6).</string>\n    <string name=\"workout_description_pike_walk\">Stell dich aufrecht hin und stelle die Füße etwa schulterbreit auseinander. Beuge dich in der Taille und lege die Hände auf den Boden. Halte die Beine gerade. Beginne die Hände nach vorne zu führen. Gehe mit den Händen so weit wie möglich nach außen und dann wieder zurück zu den Füßen. Du brauchst nicht jedes Mal wieder aufzustehen.</string>\n    <string name=\"workout_description_cross_jump\">Stell dich aufrecht hin, die Füße eng beieinander, beuge die Ellbogen und lege die Handflächen an die Brust. Beugen deine Knie leicht und springe dann nach rechts, spring nach vorne und nach links, springen zurück und springen Sie weiter im Kreis.</string>\n    <string name=\"workout_description_air_squad_bent_arms\">no description</string>\n    <string name=\"workout_description_lunge_kick\">Stell die Füße zusammen, gehe mit dem rechten Bein einen Schritt zurück und mache einen Ausfallschritt. Wenn du hochkommst, drücke das rechte Bein nach oben. Kehre in die Ausgangsposition zurück und wiederhole die Übung mit dem linken Bein. Wechsel die Beine ab, bis der Satz beendet ist. Für die richtige Form und Atmung stelle dich gerade hin, schaue nach vorn, halten deinen Oberkörper angespannt und deinen Rücken flach. Halte beim Ausfallschritt das vordere Knie in einer Linie mit dem Knöchel und belaste deine vordere Ferse mit deinem Gewicht. Atme aus, wenn du dich abstößt, und kehre in die Ausgangsposition zurück oder gehe direkt in einen neuen Ausfallschritt über.</string>\n    <string name=\"workout_description_mountain_climbers\">Dies ist eine Herz-Kreislauf-Übung, die die Gesundheit des Herzens fördert und Kalorien verbrennt. Während du die Bewegung ausführst, arbeiten deine Schultern, Arme und Brust daran, deinen Oberkörper zu stabilisieren, während deine Körpermitte den Rest deines Körpers stabilisiert. Als Hauptantriebskraft erhalten auch deine Quads ein Training. Nehme eine Plank-Position ein und achte darauf, das Gewicht gleichmäßig auf Hände und Zehen zu verteilen. Überprüfe deine Form - Ihre Hände sollten etwa schulterbreit auseinander stehen, dein Rücken flach, deine Bauchmuskeln angespannt und dein Kopf in einer Linie sein. Ziehe dein rechtes Knie so weit wie möglich zur Brust. Wechsel die Beine, indem du ein Knie nach außen zieht und das andere Knie nach innen bringst. Halte die Hüfte gesenkt und ziehe die Knie so weit und so schnell wie möglich ein und aus. Atme bei jedem Beinwechsel abwechselnd ein und aus.</string>\n    <string name=\"workout_description_russian_twist\">Um die russische Drehung auszuführen, setze dich auf den Boden und beugen deine beide Knie, während die Füße zusammen und leicht über dem Boden (oder unter einer stabilen Oberfläche) halten. Idealerweise halte den Oberkörper gerade, während sich der Rücken in einem 45-Grad-Winkel vom Boden abhebt. Die Arme werden gerade vom Körper weg gehalten, und die Hände werden wie ein Ball verschränkt (man kann ein Gewicht halten, um den Schwierigkeitsgrad zu erhöhen). Anschließend werden die Arme in einer Drehbewegung von einer Seite zur anderen geschwungen, wobei jeder Schwung zu einer Seite als eine Wiederholung gezählt wird. Je langsamer du die Arme von einer Seite zur anderen bewegst, desto härter wird die Übung und desto besser wird dein Bauchmuskeltraining. Wenn du die Arme während der Übung bewegst, ist es wichtig, dass du zwischen den Wiederholungen keine Pausen machst, da sonst der Effekt der Bauchmuskelarbeit verloren geht. Ein gleichmäßiges Ein- und Ausatmen während der Übung ist wichtig, um eine gute Sauerstoffversorgung zu gewährleisten.</string>\n    <string name=\"workout_description_donkey_kick\">Stelle dich auf alle Viere, mit den Händen direkt unter den Schultern und den Knien unter den Hüften. Achte darauf, dass dein Rücken flach ist (stellen dir vor, du balancierst ein Glas Wasser auf deinem unteren Rücken), und neige dein Kinn leicht, sodass dein Nacken zur Decke zeigt. Spanne deine unteren Bauchmuskeln an, ohne die Wirbelsäule zu krümmen. Halte dein rechtes Knie in einer Beugung von 0 oder 90 Grad und heben dein Bein langsam nach hinten und oben zur Decke. Deine maximale Höhe ist erreicht, kurz bevor sich dein Rücken wölbt oder deine Hüfte zu rotieren beginnt. Kehre dann in die Ausgangsposition zurück. Führe alle Wiederholungen auf einer Seite durch und wechsel dann das Bein.</string>\n\n    <string name=\"training_seven_minutes_workout_training\">Sieben Minuten Workout-Training</string>\n    <string name=\"training_beginners_training\">Training für Anfänger</string>\n    <string name=\"training_abdominal_muscle_training\">Training der Bauchmuskeln</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v21/styles.xml",
    "content": "<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<resources>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/main_preferences.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<PreferenceScreen xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <SwitchPreferenceCompat\n        app:key=\"darkTheme\"\n        app:title=\"@string/preference_enable_dark_theme\"\n        app:icon=\"@drawable/ic_dark_mode\"\n        app:useSimpleSummaryProvider=\"true\"\n        app:defaultValue=\"false\"/>\n\n    <SwitchPreferenceCompat\n        app:key=\"debugLogging\"\n        app:title=\"@string/preference_enable_debug_logging\"\n        app:icon=\"@drawable/ic_debug_logging\"\n        app:useSimpleSummaryProvider=\"true\"\n        app:defaultValue=\"false\"/>\n\n    <Preference\n        app:key=\"reminder\"\n        app:icon=\"@drawable/ic_reminder\"\n        app:title=\"@string/preference_reminder\" />\n\n    <Preference\n        app:key=\"sound\"\n        app:icon=\"@drawable/ic_sound\"\n        app:title=\"@string/preference_sound\" />\n\n    <Preference\n        app:key=\"removeAd\"\n        app:icon=\"@drawable/ic_billing\"\n        app:title=\"@string/preference_remove_advertisements\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/reminder_preferences.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<PreferenceScreen xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <SwitchPreferenceCompat\n        app:defaultValue=\"false\"\n        app:key=\"reminderEnable\"\n        app:title=\"@string/preference_reminder\"/>\n\n    <MultiSelectListPreference\n        app:defaultValue=\"@array/days_default\"\n        app:dependency=\"reminderEnable\"\n        app:dialogTitle=\"@string/preference_reminder_days\"\n        app:entries=\"@array/days_entries\"\n        app:entryValues=\"@array/days_values\"\n        app:key=\"reminderDays\"\n        app:title=\"@string/preference_reminder_days\" />\n\n    <com.health.openworkout.gui.preference.TimePreference\n        app:dependency=\"reminderEnable\"\n        app:key=\"reminderTime\"\n        app:defaultValue=\"0\"\n        app:title=\"@string/preference_reminder_time\"\n        style=\"@style/AppPreference.DialogPreference\" />\n\n    <EditTextPreference\n        app:defaultValue=\"@string/preference_reminder_default_text\"\n        app:dependency=\"reminderEnable\"\n        app:key=\"reminderNotifyText\"\n        app:useSimpleSummaryProvider=\"true\"\n        app:title=\"@string/preference_reminder_text\" />\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/sound_preferences.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<PreferenceScreen xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <SwitchPreferenceCompat\n        app:key=\"speechWorkoutState\"\n        app:title=\"@string/preference_speech_workout_state\"\n        app:useSimpleSummaryProvider=\"true\"\n        app:defaultValue=\"false\"/>\n\n    <SwitchPreferenceCompat\n        app:key=\"speechCountdown\"\n        app:title=\"@string/preference_speech_countdown\"\n        app:useSimpleSummaryProvider=\"true\"\n        app:defaultValue=\"false\"/>\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/playStore/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.health.openworkout\">\n        <uses-permission android:name=\"android.permission.INTERNET\" />\n\n        <application>\n                <meta-data\n                    android:name=\"com.google.android.gms.ads.APPLICATION_ID\"\n                    android:value=\"@string/APP_ID\"/>\n        </application>\n</manifest>"
  },
  {
    "path": "app/src/playStore/res/layout/fragment_billing.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n  ~\n  ~ This program is free software: you can redistribute it and/or modify\n  ~ it under the terms of the GNU General Public License as published by\n  ~ the Free Software Foundation, either version 3 of the License, or\n  ~ (at your option) any later version.\n  ~\n  ~ This program is distributed in the hope that it will be useful,\n  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of\n  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n  ~ GNU General Public License for more details.\n  ~\n  ~ You should have received a copy of the GNU General Public License\n  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>\n  -->\n\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@+id/imageView\"\n        android:layout_width=\"100dp\"\n        android:layout_height=\"100dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"32dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/textView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:srcCompat=\"@drawable/ic_openworkout\" />\n\n    <TextView\n        android:id=\"@+id/textView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/preference_remove_advertisements\"\n        android:textSize=\"30sp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/infoView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"24dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/label_info_remove_permanently\"\n        android:textAlignment=\"center\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/textView\" />\n\n    <Button\n        android:id=\"@+id/purchaseView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"32dp\"\n        android:background=\"@drawable/button_flat_selector\"\n        android:text=\"@string/label_info_purchase_for\"\n        android:textAllCaps=\"false\"\n        android:textColor=\"@android:color/white\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "build.gradle",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\n// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    \n    repositories {\n        google()\n        jcenter()\n        \n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:8.5.2'\n        classpath \"androidx.navigation:navigation-safe-args-gradle-plugin:2.8.4\"\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        \n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "fastlane/Appfile",
    "content": "json_key_file(\"../fastlane_secrect_keys.json\") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one\npackage_name(\"com.health.openworkout\") # e.g. com.krausefx.app\n"
  },
  {
    "path": "fastlane/Fastfile",
    "content": "# This file contains the fastlane.tools configuration\n# You can find the documentation at https://docs.fastlane.tools\n#\n# For a list of all available actions, check out\n#\n#     https://docs.fastlane.tools/actions\n#\n# For a list of all available plugins, check out\n#\n#     https://docs.fastlane.tools/plugins/available-plugins\n#\n\nopt_out_usage\n\n# Uncomment the line if you want fastlane to automatically update itself\n# update_fastlane\n\n# Add gradle get version name plugin\n# fastlane add_plugin get_version_name\n\ndefault_platform(:android)\n\nplatform :android do \n    versionName = get_version_name(\n        gradle_file_path:\"app/build.gradle\",\n        ext_constant_name:\"versionName\"\n    )\n\n    versionCode = get_version_name(\n        gradle_file_path:\"app/build.gradle\",\n        ext_constant_name:\"versionCode\"\n    )\n\n    desc \"Generate release version\"\n    lane :playStoreRelease do |options|\n        gradle(task: \"clean\")\n        gradle(\n            task: \"assemble\",\n            flavor: \"playStore\",\n            build_type: \"Release\",\n        )\n    end\n\n    desc \"Deploy a new version to Google Play\"\n    lane :deployPlayStoreRelease do\n        gradle(task: \"clean\")\n        gradle(\n            task: \"assemble\",\n            flavor: \"playStore\",\n            build_type: \"Release\"\n        )\n        upload_to_play_store\n    end\n\n    desc \"Deploy a new version to GitHub\"\n    lane :deployGitHubRelease do\n        gradle(task: \"clean\")\n        gradle(\n            task: \"assemble\",\n            flavor: \"fdroid\",\n            build_type: \"Release\"\n        )\n        APK_LOCATION = \"#{lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]}\"        \n        set_github_release(\n            repository_name: \"oliexdev/openWorkout\",\n            api_token: ENV[\"OLIEXDEV_GITHUB_API_TOKEN\"],\n            name: \"openWorkout #{versionName} release\",\n            tag_name: \"v#{versionName}\",\n            description: (File.read(\"metadata/android/en-GB/changelogs/#{versionCode}.txt\") rescue \"No changelog provided\"),\n            upload_assets: [ \"#{APK_LOCATION}\" ]\n        )\n    end\nend\n"
  },
  {
    "path": "fastlane/Pluginfile",
    "content": "# Autogenerated by fastlane\n#\n# Ensure this file is checked in to source control!\n\ngem 'fastlane-plugin-get_version_name'\n"
  },
  {
    "path": "fastlane/metadata/android/de/full_description.txt",
    "content": "<i>openWorkout</i> ist ein einfacher Trainingstrainer, bei dem Ihre Privatsphäre an erster Stelle steht.\n\n<b>Wichtig</b>\n\nDieses Projekt wird nicht mehr aktiv gepflegt.\nIch habe beschlossen, die Weiterentwicklung von openWorkout einzustellen.\nGerne kannst du das Projekt forken und weiterführen, wenn du möchtest.\n\n<b>Features</b>\n\n* Vorkonfigurierter 7-Minuten-Trainingsplan und Trainingsplan für Anfänger\n* Animierte auswählbare weibliche und männliche Figur\n* Detaillierte Informationen für jede Übung\n* Integrierte Trainingserinnerungsfunktion\n* Sie müssen kein Konto erstellen.\n* Respektiert Ihre Privatsphäre\n* Fügen Sie Ihren individuellen Trainingsplan und Trainingsgegenstände hinzu\n* Vollständig konfigurierbare Trainingselemente\n* Optionales dunkles Thema wählbar\n"
  },
  {
    "path": "fastlane/metadata/android/de/short_description.txt",
    "content": "Einfacher Trainingstrainer, bei dem Ihre Privatsphäre an erster Stelle steht"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/10.txt",
    "content": "* remove permantenly any advertisements with InApp purchase\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/11.txt",
    "content": "* new file project structure introduced\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/12.txt",
    "content": "* fixed some minor bugs\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/13.txt",
    "content": "* added options for voice indications\n* show time/rep of workout item during preparation time\n* added pause and resume function\n* show image in workout slide if no video is selected\n* support for changing video files for SDK <= 23\n* fixed some minor bugs\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/14.txt",
    "content": "* fixed correct database path\n* retain workout status on screen rotation\n* added floating action buttons for adding new items\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/15.txt",
    "content": "* updated libraries and set android target version to 34\n* removed ads from Google Play Store version\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/5.txt",
    "content": "* speed up app sound and edit performance"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/6.txt",
    "content": "* added option to duplicate items\n* added input dialog for auto generate sessions\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/7.txt",
    "content": "* added selectable dark mode\n* implemented an optional reminder function\n* displays a simple trophy screen at the end of a completed workout session\n* GUI layout improvement\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/8.txt",
    "content": "* added a lot new workout items for example russian twist, cross jumps, pike walk, burpee, quick steps, mountaint climbers and many more\n* added abdominal muscle training\n* import/export any self created trainings\n* download avaiable trainings and share training on GitHub\n* added option to enable debug logging to a file\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/9.txt",
    "content": "* fixed major bug with proGuard obfuscation\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "openWorkout is a simple workout trainer that puts your privacy first.\n\n# Important\n\nThis project is no longer actively maintained. \nI’ve decided to stop further development of openWorkout.\nFeel free to fork and continue if you’d like.\n\n# Features\n\n* Pre configured 7 minutes workout plan and beginners training plan\n* Animated selectable female and male character\n* Detailed information for each exercise\n* Integrated workout reminder function\n* Doesn't require you to create an account,\n* Respects your privacy \n* Add your own individual training plan and workout items\n* Full configuable workout items\n* Optional dark theme selectable\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "Simple workout trainer that puts your privacy first"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "content": "openWorkout"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sun Nov 10 16:56:55 CET 2024\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.7-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "#\n# Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>\n#\n\n# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\nandroid.nonTransitiveRClass=false\nandroid.nonFinalResIds=false\n\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\nAPP_HOME=$( cd \"${APP_HOME:-./}\" && pwd -P ) || exit\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=${0##*/}\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n# Collect all arguments for the java command;\n#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of\n#     shell script including quotes and variable substitutions, so put them in\n#     double quotes to make sure that they get re-expanded; and\n#   * put everything else in single quotes, so that it's not re-expanded.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "/*\n * Copyright (C) 2020 olie.xdev <olie.xdev@googlemail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>\n */\n\nrootProject.name='openWorkout'\ninclude ':app'\n"
  }
]