From 915171b64a6b00c702e0bbc3f613b3379441eaf0 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sat, 28 Sep 2024 15:41:10 +0200 Subject: [PATCH 1/6] Add Jekyll gem --- Gemfile | 9 +++++- Gemfile.lock | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index ffb9e539..d38dc16e 100644 --- a/Gemfile +++ b/Gemfile @@ -2,4 +2,11 @@ source 'https://rubygems.org' -gem 'fastlane' +gem 'fastlane', '~> 2.223.0' + +gem 'jekyll', '~> 3.10.0' + +# Jekyll theme +gem 'jekyll-theme-basically-basic' + +gem 'kramdown-parser-gfm' diff --git a/Gemfile.lock b/Gemfile.lock index 617af736..28b2bf34 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -28,16 +28,23 @@ GEM babosa (1.0.4) base64 (0.2.0) claide (1.1.0) + colorator (1.1.0) colored (1.2) colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) + concurrent-ruby (1.3.4) + csv (3.3.0) declarative (0.0.20) digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) domain_name (0.6.20240107) dotenv (2.8.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) emoji_regex (3.2.3) + eventmachine (1.2.7) excon (0.111.0) faraday (1.10.4) faraday-em_http (~> 1.0) @@ -109,6 +116,10 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) + ffi (1.17.0) + ffi (1.17.0-arm64-darwin) + ffi (1.17.0-x86_64-darwin) + forwardable-extended (2.6.0) gh_inspector (1.1.3) google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) @@ -149,11 +160,55 @@ GEM highline (2.0.3) http-cookie (1.0.7) domain_name (~> 0.5) + http_parser.rb (0.8.0) httpclient (2.8.3) + i18n (1.14.6) + concurrent-ruby (~> 1.0) + jekyll (3.10.0) + addressable (~> 2.4) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + webrick (>= 1.0) + jekyll-feed (0.17.0) + jekyll (>= 3.7, < 5.0) + jekyll-paginate (1.1.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-theme-basically-basic (1.4.5) + jekyll (>= 3.6, < 5.0) + jekyll-feed (~> 0.1) + jekyll-paginate (~> 1.1) + jekyll-seo-tag (~> 2.6) + jekyll-sitemap (~> 1.3) + jekyll-watch (2.2.1) + listen (~> 3.0) jmespath (1.6.2) json (2.7.2) jwt (2.9.1) base64 + kramdown (2.4.0) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.4) + listen (3.9.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) mini_magick (4.13.2) mini_mime (1.1.5) multi_json (1.15.0) @@ -163,9 +218,14 @@ GEM nkf (0.2.0) optparse (0.5.0) os (1.1.4) + pathutil (0.16.2) + forwardable-extended (~> 2.6) plist (3.7.1) public_suffix (6.0.1) rake (13.2.1) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -175,6 +235,12 @@ GEM rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) security (0.1.5) signet (0.19.0) addressable (~> 2.8) @@ -194,6 +260,7 @@ GEM tty-cursor (~> 0.7) uber (0.1.0) unicode-display_width (2.6.0) + webrick (1.8.2) word_wrap (1.0.0) xcodeproj (1.25.0) CFPropertyList (>= 2.3.3, < 4.0) @@ -208,11 +275,15 @@ GEM xcpretty (~> 0.2, >= 0.0.7) PLATFORMS - arm64-darwin-22 + arm64-darwin ruby + x86_64-darwin DEPENDENCIES - fastlane + fastlane (~> 2.223.0) + jekyll (~> 3.10.0) + jekyll-theme-basically-basic + kramdown-parser-gfm BUNDLED WITH - 2.5.5 + 2.5.20 From 2779c08db9f49245b07f48b4bdefb640fcdf7d7e Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sat, 28 Sep 2024 17:15:57 +0200 Subject: [PATCH 2/6] Add initial draft of website # Conflicts: # .gitignore --- .gitignore | 2 + website/.gitignore | 3 ++ website/404.html | 24 ++++++++++ website/_config.yml | 13 ++++++ website/_data/theme.yml | 53 ++++++++++++++++++++++ website/assets | 1 + website/google39d9f86160cab107.html | 1 + website/index.md | 22 +++++++++ website/legal/privacy-policy.md | 69 +++++++++++++++++++++++++++++ 9 files changed, 188 insertions(+) create mode 100644 website/.gitignore create mode 100644 website/404.html create mode 100644 website/_config.yml create mode 100644 website/_data/theme.yml create mode 120000 website/assets create mode 100644 website/google39d9f86160cab107.html create mode 100644 website/index.md create mode 100644 website/legal/privacy-policy.md diff --git a/.gitignore b/.gitignore index 568e8d24..e8963c92 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ client_secret_*.apps.googleusercontent.com.json _ci/*.keystore _ci/api-*.json bundletool-*.jar + +_site/ diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 00000000..45c15053 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,3 @@ +_site +.sass-cache +.jekyll-metadata diff --git a/website/404.html b/website/404.html new file mode 100644 index 00000000..c472b4ea --- /dev/null +++ b/website/404.html @@ -0,0 +1,24 @@ +--- +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/website/_config.yml b/website/_config.yml new file mode 100644 index 00000000..55b5f446 --- /dev/null +++ b/website/_config.yml @@ -0,0 +1,13 @@ +title: Taskfolio +email: olivier.patry@gmail.com +description: >- + Taskfolio is an Android task management app built using Google Tasks API. + Developed to demonstrate my expertise in modern Android development, it highlights my skills in architecture, + UI design with Jetpack Compose, OAuth authentication, and more—all packaged in a sleek, user-friendly interface. +baseurl: '/taskfolio' +url: 'https://opatry.github.io' +twitter_username: o_patry +github_username: opatry + +markdown: kramdown +theme: jekyll-theme-basically-basic diff --git a/website/_data/theme.yml b/website/_data/theme.yml new file mode 100644 index 00000000..910d7ffd --- /dev/null +++ b/website/_data/theme.yml @@ -0,0 +1,53 @@ +# Theme Skin +skin: night # default, night, plum, sea, soft, steel + +# Theme Text +t: + skip_links: 'Skip links' + skip_primary_nav: 'Skip to primary navigation' + skip_content: 'Skip to content' + skip_footer: 'Skip to footer' + menu: 'Menu' + search: 'Search' + site_search: 'Site Search' + results_found: 'Result(s) found' + search_placeholder_text: 'Enter your search term…' + home: 'Home' + newer: 'Newer' + older: 'Older' + email: 'Email' + subscribe: 'Subscribe' + read_more: 'Read More' + posts: 'Posts' + page: 'Page' + of: 'of' + min_read: 'min read' + present: 'Present' + cv_awards: 'Awards' + cv_summary_contact: 'Contact' + cv_summary_contact_email: 'Email' + cv_summary_contact_phone: 'Phone' + cv_summary_contact_website: 'Website' + cv_location: 'Location' + cv_education: 'Education' + cv_education_courses: 'Courses' + cv_interests: 'Interests' + cv_languages: 'Languages' + cv_publications: 'Publications' + cv_references: 'References' + cv_skills: 'Skills' + cv_volunteer: 'Volunteer' + cv_work: 'Work' + +# Google Fonts +google_fonts: + - name: 'Fira Sans' + weights: '400,400i,600,600i' + +# Link to specific internal pages in the navigation. +# Create a custom list to override the default setting of including links to all +# pages that have a `title`. Add raw page paths in the order you'd like. + +navigation_pages: + - about.md + - cv.md \ No newline at end of file diff --git a/website/assets b/website/assets new file mode 120000 index 00000000..ec2e4be2 --- /dev/null +++ b/website/assets @@ -0,0 +1 @@ +../assets \ No newline at end of file diff --git a/website/google39d9f86160cab107.html b/website/google39d9f86160cab107.html new file mode 100644 index 00000000..3ee82ab3 --- /dev/null +++ b/website/google39d9f86160cab107.html @@ -0,0 +1 @@ +google-site-verification: google39d9f86160cab107.html \ No newline at end of file diff --git a/website/index.md b/website/index.md new file mode 100644 index 00000000..b3615afa --- /dev/null +++ b/website/index.md @@ -0,0 +1,22 @@ +--- +layout: home +--- + +**Taskfolio** is a personal project designed to showcase my Android development skills. +The app is a lightweight task manager that integrates with [Google Tasks](https://developers.google.com/tasks) through its REST API, +adhering to a clean and modern MVVM architecture. I’ve used [Kotlin Multiplatform](https://kotlinlang.org/docs/multiplatform.html), +[Jetpack Compose](https://developer.android.com/compose) and +[Material Design 3](https://developer.android.com/develop/ui/compose/designsystems/material3) to create a smooth and visually appealing UI, +while also incorporating Room for local data persistence and OAuth 2.0 for secure authentication. + +This project highlights the breadth of my Android knowledge, from API integration and UI design to database management and CI/CD setup. +It’s designed not just as a functioning task manager, but as a demonstration of my ability to deliver well-structured, maintainable, +and scalable Android apps. + +[![Taskfolio Android Application]({{ site.baseurl }}/assets/GetItOnGooglePlay_Badge_Web_color_English.png)](https://play.google.com/store/apps/details?id=net.opatry.tasks.app) + +| --------------------------------------- |--------------------------------------- | ---------------------------------- | +| ![]({{ site.baseurl }}/assets/screens/task_lists_light.png) | ![]({{ site.baseurl }}/assets/screens/groceries_light.png) | ![](assets/screens/home_dark.png) | + +- {% include icon-github.svg %} [opatry/taskfolio](https://github.com/opatry/taskfolio) +- [Privacy Policy]({{ site.baseurl }}{% link legal/privacy-policy.md %}) diff --git a/website/legal/privacy-policy.md b/website/legal/privacy-policy.md new file mode 100644 index 00000000..c905dd71 --- /dev/null +++ b/website/legal/privacy-policy.md @@ -0,0 +1,69 @@ +--- +layout: page +title: Privacy Policy Taskfolio +title: Privacy Policy +permalink: /privacy-policy/ +--- + +Olivier Patry built the Taskfolio app as a Free app. This SERVICE is provided by Olivier Patry at no cost and is intended for use as is. + +This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. + +If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. + +The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which are accessible at Taskfolio unless otherwise defined in this Privacy Policy. + +## Information Collection and Use + +For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way. + +The app does use third-party services that may collect information used to identify you. + +Link to the privacy policy of third-party service providers used by the app + +* [Google Play Services](https://www.google.com/policies/privacy/) + +## Log Data + +I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third-party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. + +## Cookies + +Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory. + +This Service does not use these “cookies” explicitly. However, the app may use third-party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service. + +## Service Providers + +I may employ third-party companies and individuals due to the following reasons: + +* To facilitate our Service; +* To provide the Service on our behalf; +* To perform Service-related services; or +* To assist us in analyzing how our Service is used. + +I want to inform users of this Service that these third parties have access to their Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. + +## Security + +I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. + +## Links to Other Sites + +This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. + +## Children’s Privacy + +These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13 years of age. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do the necessary actions. + +## Changes to This Privacy Policy + +I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. + +This policy is effective as of 2024-09-25 + +## Contact Us + +If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me at olivier.patry@gmail.com. + +This privacy policy page was created at [privacypolicytemplate.net](https://privacypolicytemplate.net) and modified/generated by [App Privacy Policy Generator](https://app-privacy-policy-generator.nisrulz.com/) \ No newline at end of file From 4159e1f24e5a03b7d69f8d6f7e8248902633c63f Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Sat, 28 Sep 2024 15:12:41 +0200 Subject: [PATCH 3/6] Add Website deployment Workflow --- .github/workflows/deploy-website.yml | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/deploy-website.yml diff --git a/.github/workflows/deploy-website.yml b/.github/workflows/deploy-website.yml new file mode 100644 index 00000000..4e8c7510 --- /dev/null +++ b/.github/workflows/deploy-website.yml @@ -0,0 +1,50 @@ +name: 🌎 Deploy Website + +on: + workflow_dispatch: + +permissions: + contents: write + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 1 + + # allows Bundler gem installation (used for fastlane gem) + - name: 💎 Setup Ruby 3.0 + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.0 + + - name: 🐙 Setup Github Pages + uses: actions/configure-pages@v5 + + - name: 🧪 Build with Jekyll + run: | + gem install bundler + bundle config set --local path .bundler + bundle install --jobs "$(nproc)" + cd website + bundle exec jekyll build + + - name: 🚀 Deploy + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: website/_site + From 4ea388f63bb43061bc7f2bc6d6cac07df138ad54 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Mon, 30 Sep 2024 10:11:42 +0200 Subject: [PATCH 4/6] Add project breakdown section in README | Step (%) | Hex Color | |----------|-----------| | 0% | `#FF0000` | | 10% | `#FF3300` | | 20% | `#FF6600` | | 30% | `#FF9900` | | 40% | `#FFCC00` | | 50% | `#FFFF00` | | 60% | `#CCFF00` | | 70% | `#99FF00` | | 80% | `#66FF00` | | 90% | `#33FF00` | | 100% | `#00FF00` | --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index a8a56ab3..e6d712e1 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ [**Taskfolio**](https://opatry.github.io/taskfolio) is an Android task management app built using [Google Tasks API](https://developers.google.com/tasks/reference/rest). Developed to demonstrate my expertise in modern Android development, it highlights my skills in architecture, UI design with Jetpack Compose, OAuth authentication, and more—all packaged in a sleek, user-friendly interface. +> I set out to revisit the classical TODO app, ‘local-first’ syncing with Google Tasks—aiming for an MVE in 2 weeks, focusing on the 80/20 rule to nail the essentials. + | ![](assets/screens/task_lists_light.png) | ![](assets/screens/groceries_light.png) | ![](assets/screens/home_dark.png) | | --------------------------------------- |--------------------------------------- | ---------------------------------- | @@ -21,6 +23,36 @@ - [Jetpack Compose](https://developer.android.com/jetpack/compose) - [Coil](https://coil-kt.github.io/coil/) +## Project breakdown + +- `:google` + - [`:oauth`](google/oauth/) ■■■■■■■■■■ 100% + - [Google OAuth2](https://developers.google.com/identity/protocols/oauth2) authentication with Kotlin & Ktor + - KMP + - [`:tasks`](google/tasks) ■■■■■■■■■■ 100% + - [Google Tasks REST API](https://developers.google.com/tasks/reference/rest) bindings for Kotlin using Ktor HTTP client + - KMP +- [`:lucide-icons`](lucide-icons) ■■■■■■■■■■ 100% + - [Lucide Icons](https://lucide.dev/icons/) for Compose + - Made from [Compose Icons](https://composeicons.com/icon-libraries/lucide) (not using the direct Gradle dependency to tweak stroke width) + - Only integrates what seem relevant for the app needs + - KMP +- [`:tasks-core`](tasks-core) ■■■■■■□□□□ 60% + - Taskfolio business logic + - Local first with Room database, sync with Google Tasks + - KMP +- [`:tasks-app-shared`](tasks-app-shared) ■■■■■■■□□□ 70% + - All screens & UI components integrating the `:tasks-core` business logic + in Compose + - KMP +- [`:tasks-app-desktop`](tasks-app-desktop) ■■■■■■■■■□ 90% + - The Desktop application (thin layer fully reusing `:tasks-app-shared`) +- [`:tasks-app-android`](tasks-app-android) ■■■■■■■■□□ 80% + - The Android application (thin layer fully reusing `:tasks-app-shared`) +- [`website/`](website) ■■□□□□□□□□ 20% + - The [static site](https://opatry.github.io/taskfolio/) presenting the project + - Made with [Jekyll](https://jekyllrb.com/) and served by [Github pages](https://pages.github.com/) + ## Local development
From d3a07484428f01d3dfa52c7c08f122fc1eedaeae Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Mon, 30 Sep 2024 22:43:30 +0200 Subject: [PATCH 5/6] Update tech stack & align with Website --- README.md | 17 ++++++++++++----- website/index.md | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e6d712e1..cdc26f52 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,26 @@ [![Taskfolio on Play Store](assets/GetItOnGooglePlay_Badge_Web_color_English.png)](https://play.google.com/store/apps/details?id=net.opatry.tasks.app) -## Tech stack +## 🛠️ Tech stack - [Kotlin](https://kotlinlang.org/), [Multiplatform (KMP)](https://kotlinlang.org/docs/multiplatform.html) (currently Desktop & Android are supported) + - iOS & Web are not planned any time soon (contribution are welcome 🤝) - [Kotlin coroutines](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) - [Kotlin multiplatform](https://kotlinlang.org/docs/multiplatform.html) (aka KMP) - [Ktor client](https://ktor.io/) (+ [Kotlinx serialization](https://kotlinlang.org/docs/serialization.html)) -- [Room](https://developer.android.com/training/data-storage/room) +- [Room](https://developer.android.com/training/data-storage/room) (local persistance) - [Koin](https://insert-koin.io/) for dependency injection - [Material Design Components](https://developer.android.com/develop/ui/compose/designsystems/material3) - [Jetpack Compose](https://developer.android.com/jetpack/compose) +- Kinda follows [Google architecture guidelines](https://developer.android.com/topic/architecture) - [Coil](https://coil-kt.github.io/coil/) +- [GitHub Actions](https://docs.github.com/en/actions) for CI + - build Android & Desktop apps + - run tests + - publish app on Play Store + - publish companion website on [Github pages](https://pages.github.com/) -## Project breakdown +## 🗺️ Project breakdown - `:google` - [`:oauth`](google/oauth/) ■■■■■■■■■■ 100% @@ -53,7 +60,7 @@ - The [static site](https://opatry.github.io/taskfolio/) presenting the project - Made with [Jekyll](https://jekyllrb.com/) and served by [Github pages](https://pages.github.com/) -## Local development +## 🧑‍💻 Local development
See details… @@ -71,7 +78,7 @@ and store this in `_ci/google-services.json.gpg`. The `decrypt_secrets.sh` will take it into account.
-## License +## ⚖️ License ``` The MIT License (MIT) diff --git a/website/index.md b/website/index.md index b3615afa..ef52959c 100644 --- a/website/index.md +++ b/website/index.md @@ -18,5 +18,26 @@ and scalable Android apps. | --------------------------------------- |--------------------------------------- | ---------------------------------- | | ![]({{ site.baseurl }}/assets/screens/task_lists_light.png) | ![]({{ site.baseurl }}/assets/screens/groceries_light.png) | ![](assets/screens/home_dark.png) | +## 🛠️ Tech stack + +- [Kotlin](https://kotlinlang.org/), [Multiplatform (KMP)](https://kotlinlang.org/docs/multiplatform.html) (currently Desktop & Android are supported) + - iOS & Web are not planned any time soon (contribution are welcome 🤝) +- [Kotlin coroutines](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) +- [Kotlin multiplatform](https://kotlinlang.org/docs/multiplatform.html) (aka KMP) +- [Ktor client](https://ktor.io/) (+ [Kotlinx serialization](https://kotlinlang.org/docs/serialization.html)) +- [Room](https://developer.android.com/training/data-storage/room) (local persistance) +- [Koin](https://insert-koin.io/) for dependency injection +- [Material Design Components](https://developer.android.com/develop/ui/compose/designsystems/material3) +- [Jetpack Compose](https://developer.android.com/jetpack/compose) +- Kinda follows [Google architecture guidelines](https://developer.android.com/topic/architecture) +- [Coil](https://coil-kt.github.io/coil/) +- [GitHub Actions](https://docs.github.com/en/actions) for CI + - build Android & Desktop apps + - run tests + - publish app on Play Store + - publish companion website on [Github pages](https://pages.github.com/) + +## 🔗 Links + - {% include icon-github.svg %} [opatry/taskfolio](https://github.com/opatry/taskfolio) - [Privacy Policy]({{ site.baseurl }}{% link legal/privacy-policy.md %}) From ee940ed3fe01991e4410b97b1cb0d9355feb4779 Mon Sep 17 00:00:00 2001 From: Olivier Patry Date: Mon, 30 Sep 2024 22:43:52 +0200 Subject: [PATCH 6/6] Add project intentions & non goals --- README.md | 31 +++++++++++++++++++++++++++++++ website/index.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/README.md b/README.md index cdc26f52..d7e68ae3 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,37 @@ [![Taskfolio on Play Store](assets/GetItOnGooglePlay_Badge_Web_color_English.png)](https://play.google.com/store/apps/details?id=net.opatry.tasks.app) +## 🎯 Project intentions + +- [x] Showcase my expertise in Android application development +- [x] Demonstrate UI development using Jetpack Compose with Material Design 3. +- [x] Include local-first capabilities for local data storage using Room. +- [x] OAuth 2.0 authentication. +- [x] Provide sync capabilities with Google Tasks for seamless task management. +- [x] Illustrate my ability to set up CI/CD pipelines and publish apps to the Play Store. + +## ❌ Out of scope + +This project is not intended as a comprehensive task manager for public use. +I do not aim to implement advanced features beyond what is supported by the Google Tasks REST API. +- no starred task +- no task priority +- only due date, no custom time support +- no task recurrence +- limited hierarchy (2 levels) + +## 🚧 Known Limitations + +- Authentication flow isn't 100% reliable yet. +- Local-first support with Google Tasks sync is limited, in particular sorting & conflict management is barely implemented. +- Task deletion undo is not implemented +- Very limited move capabilities + - can't move task from one list to another + - can't indent/unindent + - can't create sub-task + - no drag'n'drop +- Task list ordering isn't supported (there is no API for that in the Google Tasks API) + ## 🛠️ Tech stack - [Kotlin](https://kotlinlang.org/), [Multiplatform (KMP)](https://kotlinlang.org/docs/multiplatform.html) (currently Desktop & Android are supported) diff --git a/website/index.md b/website/index.md index ef52959c..aa9751e1 100644 --- a/website/index.md +++ b/website/index.md @@ -18,6 +18,37 @@ and scalable Android apps. | --------------------------------------- |--------------------------------------- | ---------------------------------- | | ![]({{ site.baseurl }}/assets/screens/task_lists_light.png) | ![]({{ site.baseurl }}/assets/screens/groceries_light.png) | ![](assets/screens/home_dark.png) | +## 🎯 Project intentions + +- [x] Showcase my expertise in Android application development +- [x] Demonstrate UI development using Jetpack Compose with Material Design 3. +- [x] Include local-first capabilities for local data storage using Room. +- [x] OAuth 2.0 authentication. +- [x] Provide sync capabilities with Google Tasks for seamless task management. +- [x] Illustrate my ability to set up CI/CD pipelines and publish apps to the Play Store. + +## ❌ Out of scope + +This project is not intended as a comprehensive task manager for public use. +I do not aim to implement advanced features beyond what is supported by the Google Tasks REST API. +- no starred task +- no task priority +- only due date, no custom time support +- no task recurrence +- limited hierarchy (2 levels) + +## 🚧 Known Limitations + +- Authentication flow isn't 100% reliable yet. +- Local-first support with Google Tasks sync is limited, in particular sorting & conflict management is barely implemented. +- Task deletion undo is not implemented +- Very limited move capabilities + - can't move task from one list to another + - can't indent/unindent + - can't create sub-task + - no drag'n'drop +- Task list ordering isn't supported (there is no API for that in the Google Tasks API) + ## 🛠️ Tech stack - [Kotlin](https://kotlinlang.org/), [Multiplatform (KMP)](https://kotlinlang.org/docs/multiplatform.html) (currently Desktop & Android are supported)