├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── ---bug-report.md
│ └── ---feature-request.md
└── workflows
│ ├── ci.yml
│ ├── release.yml
│ └── weblate.yml
├── .gitignore
├── .metadata
├── .vscode
├── launch.json
├── lemmur.code-snippets
├── settings.json
└── tasks.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── PRIVACY_POLICY.md
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── krawieck
│ │ │ │ └── lemmur
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-hdpi
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── splash.png
│ │ │ ├── drawable-mdpi
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── splash.png
│ │ │ ├── drawable-xhdpi
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── splash.png
│ │ │ ├── drawable-xxhdpi
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── splash.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── splash.png
│ │ │ ├── drawable
│ │ │ └── splash_screen.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ └── ic_launcher.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── values-night
│ │ │ └── colors.xml
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
├── adaptive_icon_fg.png
├── app_icon.png
├── app_icon.svg
├── l10n
│ ├── intl_ar.arb
│ ├── intl_bg.arb
│ ├── intl_bn.arb
│ ├── intl_ca.arb
│ ├── intl_cs.arb
│ ├── intl_cy.arb
│ ├── intl_da.arb
│ ├── intl_de.arb
│ ├── intl_el.arb
│ ├── intl_en.arb
│ ├── intl_eo.arb
│ ├── intl_es.arb
│ ├── intl_eu.arb
│ ├── intl_fa.arb
│ ├── intl_fi.arb
│ ├── intl_fr.arb
│ ├── intl_ga.arb
│ ├── intl_gl.arb
│ ├── intl_hi.arb
│ ├── intl_hr.arb
│ ├── intl_hu.arb
│ ├── intl_id.arb
│ ├── intl_it.arb
│ ├── intl_ja.arb
│ ├── intl_ka.arb
│ ├── intl_km.arb
│ ├── intl_ko.arb
│ ├── intl_ml.arb
│ ├── intl_mnc.arb
│ ├── intl_nb.arb
│ ├── intl_nl.arb
│ ├── intl_oc.arb
│ ├── intl_pl.arb
│ ├── intl_pt.arb
│ ├── intl_pt_BR.arb
│ ├── intl_ru.arb
│ ├── intl_sk.arb
│ ├── intl_sq.arb
│ ├── intl_sr.arb
│ ├── intl_sr_Latn.arb
│ ├── intl_sv.arb
│ ├── intl_th.arb
│ ├── intl_tr.arb
│ ├── intl_uk.arb
│ ├── intl_vi.arb
│ ├── intl_zh.arb
│ └── intl_zh_Hant.arb
└── readme_icon.svg
├── fastlane
├── Fastfile
├── Gemfile
├── Gemfile.lock
├── README.md
└── metadata
│ └── android
│ ├── de-DE
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ └── en-US
│ ├── changelogs
│ ├── 11.txt
│ ├── 12.txt
│ ├── 13.txt
│ ├── 14.txt
│ ├── 15.txt
│ ├── 16.txt
│ ├── 17.txt
│ ├── 18.txt
│ └── 19.txt
│ ├── full_description.txt
│ ├── images
│ ├── featureGraphic.png
│ ├── icon.png
│ └── phoneScreenshots
│ │ ├── 1.png
│ │ ├── 2.png
│ │ ├── 3.png
│ │ ├── 4.png
│ │ ├── 5.png
│ │ └── 6.png
│ ├── short_description.txt
│ └── title.txt
├── ios
├── .gitignore
├── Flutter
│ ├── .last_build_id
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ ├── dev.xcscheme
│ │ └── prod.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ ├── Contents.json
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── README.md
│ │ ├── phone-dark.png
│ │ ├── phone-light.png
│ │ ├── universal-dark.png
│ │ └── universal-light.png
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── l10n.yaml
├── lib
├── app.dart
├── app_config.dart
├── comment_tree.dart
├── gen
│ └── assets.gen.dart
├── hooks
│ ├── debounce.dart
│ ├── delayed_loading.dart
│ ├── infinite_scroll.dart
│ ├── logged_in_action.dart
│ ├── memo_future.dart
│ ├── refreshable.dart
│ └── stores.dart
├── l10n
│ ├── l10n.dart
│ ├── l10n_api.dart
│ ├── l10n_from_string.dart
│ └── timeago
│ │ └── pl.dart
├── main_common.dart
├── main_dev.dart
├── main_prod.dart
├── markdown_formatter.dart
├── pages
│ ├── communities_list.dart
│ ├── communities_tab.dart
│ ├── community
│ │ ├── community.dart
│ │ ├── community_about_tab.dart
│ │ ├── community_follow_button.dart
│ │ ├── community_more_menu.dart
│ │ ├── community_overview.dart
│ │ ├── community_store.dart
│ │ └── community_store.g.dart
│ ├── create_post
│ │ ├── create_post.dart
│ │ ├── create_post_community_picker.dart
│ │ ├── create_post_fab.dart
│ │ ├── create_post_instance_picker.dart
│ │ ├── create_post_store.dart
│ │ ├── create_post_store.g.dart
│ │ └── create_post_url_field.dart
│ ├── full_post
│ │ ├── comment_section.dart
│ │ ├── full_post.dart
│ │ ├── full_post_store.dart
│ │ └── full_post_store.g.dart
│ ├── home_page.dart
│ ├── home_tab.dart
│ ├── inbox.dart
│ ├── instance
│ │ ├── instance.dart
│ │ ├── instance_about_tab.dart
│ │ ├── instance_more_menu.dart
│ │ ├── instance_store.dart
│ │ └── instance_store.g.dart
│ ├── log_console
│ │ ├── log_console.dart
│ │ ├── log_console_page_store.dart
│ │ └── log_console_page_store.g.dart
│ ├── manage_account.dart
│ ├── media_view.dart
│ ├── modlog
│ │ ├── modlog.dart
│ │ ├── modlog_entry.dart
│ │ ├── modlog_page_store.dart
│ │ ├── modlog_page_store.g.dart
│ │ └── modlog_table.dart
│ ├── profile_tab.dart
│ ├── saved_page.dart
│ ├── search_results.dart
│ ├── search_tab.dart
│ ├── settings
│ │ ├── add_account_page.dart
│ │ ├── add_instance_page.dart
│ │ ├── blocks
│ │ │ ├── block_dialog.dart
│ │ │ ├── block_tile.dart
│ │ │ ├── blocks.dart
│ │ │ ├── blocks_store.dart
│ │ │ ├── blocks_store.g.dart
│ │ │ ├── community_block_store.dart
│ │ │ ├── community_block_store.g.dart
│ │ │ ├── user_block_store.dart
│ │ │ └── user_block_store.g.dart
│ │ └── settings.dart
│ ├── user.dart
│ ├── users_list.dart
│ └── write_message.dart
├── resources
│ ├── links.dart
│ └── theme.dart
├── stores
│ ├── accounts_store.dart
│ ├── accounts_store.g.dart
│ ├── config_store.dart
│ └── config_store.g.dart
├── url_launcher.dart
├── util
│ ├── async_store.dart
│ ├── async_store.freezed.dart
│ ├── async_store.g.dart
│ ├── async_store_listener.dart
│ ├── cleanup_url.dart
│ ├── delayed_action.dart
│ ├── extensions
│ │ ├── api.dart
│ │ ├── brightness.dart
│ │ ├── context.dart
│ │ ├── iterators.dart
│ │ └── spaced.dart
│ ├── files.dart
│ ├── goto.dart
│ ├── hot_rank.dart
│ ├── icons.dart
│ ├── mobx_provider.dart
│ ├── observer_consumers.dart
│ ├── pictrs.dart
│ ├── share.dart
│ ├── text_color.dart
│ └── text_lines_iterator.dart
└── widgets
│ ├── about_tile.dart
│ ├── avatar.dart
│ ├── bottom_modal.dart
│ ├── bottom_safe.dart
│ ├── cached_network_image.dart
│ ├── comment
│ ├── comment.dart
│ ├── comment_actions.dart
│ ├── comment_more_menu_button.dart
│ ├── comment_store.dart
│ └── comment_store.g.dart
│ ├── editor
│ ├── editor.dart
│ ├── editor_picking_dialog.dart
│ ├── editor_toolbar.dart
│ ├── editor_toolbar_store.dart
│ └── editor_toolbar_store.g.dart
│ ├── failed_to_load.dart
│ ├── fullscreenable_image.dart
│ ├── infinite_scroll.dart
│ ├── info_table_popup.dart
│ ├── markdown_mode_icon.dart
│ ├── markdown_text.dart
│ ├── post
│ ├── post.dart
│ ├── post_actions.dart
│ ├── post_body.dart
│ ├── post_info_section.dart
│ ├── post_link_preview.dart
│ ├── post_media.dart
│ ├── post_more_menu.dart
│ ├── post_status.dart
│ ├── post_store.dart
│ ├── post_store.g.dart
│ ├── post_title.dart
│ ├── post_voting.dart
│ └── save_post_button.dart
│ ├── post_list_options.dart
│ ├── pull_to_refresh.dart
│ ├── radio_picker.dart
│ ├── report_dialog.dart
│ ├── reveal_after_scroll.dart
│ ├── sortable_infinite_list.dart
│ ├── tile_action.dart
│ ├── user_profile.dart
│ ├── user_tile.dart
│ └── write_comment.dart
├── linux
├── .gitignore
├── CMakeLists.txt
├── flutter
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
├── main.cc
├── my_application.cc
└── my_application.h
├── pubspec.lock
├── pubspec.yaml
├── scripts
├── common.dart
├── gen_l10n_from_string.dart
├── migrate_lemmy_l10n.dart
└── release.dart
├── test
├── pages
│ └── modlog
│ │ └── modlog_page_test.dart
├── stores
│ └── config_store_test.dart
└── util
│ └── async_store_test.dart
└── windows
├── .gitignore
├── CMakeLists.txt
├── flutter
├── CMakeLists.txt
├── generated_plugin_registrant.cc
├── generated_plugin_registrant.h
└── generated_plugins.cmake
└── runner
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── main.cpp
├── resource.h
├── resources
└── app_icon.ico
├── run_loop.cpp
├── run_loop.h
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | patreon: lemmur
2 | custom:
3 | - https://www.buymeacoffee.com/lemmur
4 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/---bug-report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: "\U0001F41B Bug report"
3 | about: Create a report to help us improve
4 | title: ""
5 | labels: bug
6 | assignees: ""
7 | ---
8 |
9 | ### Device info
10 |
11 | - OS: [eg. iOS/Android]
12 | - OS version: [eg. 10]
13 | - Device: [eg. OnePlus 6]
14 | - Lemmur version: [eg. v1.2.3]
15 |
16 | ### Describe the bug
17 |
18 | A clear and concise description of what the bug is.
19 |
20 | ### Steps to reproduce
21 |
22 | 1. Go to '...'
23 | 2. Click on '....'
24 | 3. Scroll down to '....'
25 | 4. See error
26 |
27 | ### Relevant logs
28 |
29 |
30 | Logs
31 |
32 | Paste your logs here. Logs can be found in lemmur: settings > about lemmur > logs.
33 |
34 |
35 | ### Expected behavior
36 |
37 | A clear and concise description of what you expected to happen.
38 |
39 | ### Screenshots/Screencasts
40 |
41 | If applicable, add screenshots to help explain your problem.
42 |
43 | ### Additional context
44 |
45 | Add any other context about the problem here.
46 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/---feature-request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: "\U0001F680 Feature request"
3 | about: Suggest an idea for Lemmur
4 | title: ""
5 | labels: enhancement
6 | assignees: ""
7 | ---
8 |
9 | ### Is your feature request related to a problem? Please describe.
10 |
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | ### Describe the solution you'd like
14 |
15 | A clear and concise description of what you want to happen.
16 |
17 | ### Describe alternatives you've considered
18 |
19 | A clear and concise description of any alternative solutions or features you've considered.
20 |
21 | ### Additional context
22 |
23 | Add any other context or screenshots about the feature request here.
24 |
--------------------------------------------------------------------------------
/.github/workflows/weblate.yml:
--------------------------------------------------------------------------------
1 | name: weblate
2 |
3 | on:
4 | workflow_dispatch:
5 | schedule:
6 | # every friday at 19:00 UTC
7 | - cron: "0 19 * * 5"
8 |
9 | jobs:
10 | weblate:
11 | name: Pull Weblate changes to repo
12 | runs-on: ubuntu-latest
13 | steps:
14 | - uses: actions/checkout@v2
15 | with:
16 | fetch-depth: 0
17 |
18 | - name: Fetch changes
19 | run: |
20 | git remote add weblate https://weblate.yerbamate.ml/git/lemmur/lemmur/
21 | git fetch weblate
22 | git merge weblate/master
23 |
24 | - name: Regenerate l10n_from_string
25 | run: |
26 | dart run scripts/gen_l10n_from_string.dart
27 |
28 | - name: Create Pull Request
29 | uses: peter-evans/create-pull-request@v3.12.0
30 | with:
31 | reviewers: shilangyu,krawieck
32 | title: Weblate update
33 | branch: weblate
34 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # Flutter/Dart/Pub related
19 | **/doc/api/
20 | .dart_tool/
21 | .flutter-plugins
22 | .flutter-plugins-dependencies
23 | .packages
24 | .pub-cache/
25 | .pub/
26 | /build/
27 | lib/l10n/gen
28 |
29 | # Web related
30 | lib/generated_plugin_registrant.dart
31 |
32 | # Symbolication related
33 | app.*.symbols
34 |
35 | # Obfuscation related
36 | app.*.map.json
37 |
38 | # Exceptions to above rules.
39 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
40 |
41 | # Xcode build files
42 | ios/build
43 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 8af6b2f038c1172e61d418869363a28dffec3cb4
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Debug",
6 | "request": "launch",
7 | "type": "dart",
8 | "program": "lib/main_dev.dart",
9 | "args": ["--flavor", "dev"]
10 | },
11 | {
12 | "name": "Profile",
13 | "request": "launch",
14 | "type": "dart",
15 | "flutterMode": "profile",
16 | "program": "lib/main_dev.dart",
17 | "args": ["--flavor", "dev"]
18 | },
19 | {
20 | "name": "Release",
21 | "request": "launch",
22 | "type": "dart",
23 | "flutterMode": "release",
24 | "program": "lib/main_dev.dart",
25 | "args": ["--flavor", "dev"]
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/.vscode/lemmur.code-snippets:
--------------------------------------------------------------------------------
1 | {
2 | "New ARB file l10n term": {
3 | "scope": "json",
4 | "prefix": "term",
5 | "body": ["\"$1\": \"$2\",", "\"@$1\": {}$0"]
6 | },
7 | "Assert not null": {
8 | "scope": "dart",
9 | "prefix": "assnotnull",
10 | "body": ["assert($1 != null)$0"]
11 | },
12 | "sizedbox": {
13 | "scope": "dart",
14 | "prefix": "sizedbox",
15 | "body": ["const SizedBox($1)$0"]
16 | },
17 | "theme": {
18 | "scope": "dart",
19 | "prefix": "theme",
20 | "body": ["final theme = Theme.of(context);"]
21 | },
22 | "sleep": {
23 | "scope": "dart",
24 | "prefix": "sleep",
25 | "body": [
26 | "await Future.delayed(const Duration(milliseconds: ${1:1000}));$0"
27 | ]
28 | },
29 | "repeat widget": {
30 | "scope": "dart",
31 | "prefix": "repeat",
32 | "body": ["for(int i = 0; i < $1; i++)$0"]
33 | },
34 | "L10n string": {
35 | "scope": "dart",
36 | "prefix": "l10n",
37 | "body": ["L10n.of(context).$0"]
38 | },
39 | "Mobx store": {
40 | "prefix": "mobxstore",
41 | "body": [
42 | "import 'package:mobx/mobx.dart';",
43 | "",
44 | "part '$TM_FILENAME_BASE.g.dart';",
45 | "",
46 | "class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g} = _${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g} with _$${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g};",
47 | "",
48 | "abstract class _${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/g} with Store {",
49 | "\t@observable",
50 | "\t$0",
51 | "}"
52 | ]
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.associations": {
3 | "*.arb": "json"
4 | },
5 | "dart.showTodos": false,
6 | "xml.format.preserveAttributeLineBreaks": true
7 | }
8 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "type": "flutter",
6 | "command": "flutter",
7 | "args": [
8 | "pub",
9 | "run",
10 | "build_runner",
11 | "build",
12 | "--delete-conflicting-outputs"
13 | ],
14 | "problemMatcher": ["$dart-build_runner"],
15 | "group": "build",
16 | "label": "flutter: build_runner build"
17 | },
18 | {
19 | "type": "flutter",
20 | "command": "flutter",
21 | "args": [
22 | "pub",
23 | "run",
24 | "build_runner",
25 | "watch",
26 | "--delete-conflicting-outputs"
27 | ],
28 | "problemMatcher": ["$dart-build_runner"],
29 | "group": "build",
30 | "label": "flutter: flutter pub run build_runner watch"
31 | }
32 | ]
33 | }
34 |
--------------------------------------------------------------------------------
/PRIVACY_POLICY.md:
--------------------------------------------------------------------------------
1 | # Privacy Policy
2 |
3 | We don't store your data. We don't use any intermediary services that could store your data.
4 |
5 | For any questions contact us at lemmurapp@protonmail.com
6 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
8 |
9 |
13 |
14 |
22 |
23 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/krawieck/lemmur/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.krawieck.lemmur
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-hdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-mdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-xhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-xxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/drawable-xxxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/splash_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #303030
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #ffffff
4 | #fafafa
5 |
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.7.0'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.2.1'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | project.evaluationDependsOn(':app')
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | // Copyright 2014 The Flutter Authors. All rights reserved.
2 | // Use of this source code is governed by a BSD-style license that can be
3 | // found in the LICENSE file.
4 |
5 | include ':app'
6 |
7 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
8 | def properties = new Properties()
9 |
10 | assert localPropertiesFile.exists()
11 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
12 |
13 | def flutterSdkPath = properties.getProperty("flutter.sdk")
14 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
15 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
16 |
--------------------------------------------------------------------------------
/assets/adaptive_icon_fg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/assets/adaptive_icon_fg.png
--------------------------------------------------------------------------------
/assets/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/assets/app_icon.png
--------------------------------------------------------------------------------
/assets/app_icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
26 |
--------------------------------------------------------------------------------
/assets/l10n/intl_bn.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "bn",
3 | "settings": "পছন্দসমূহ",
4 | "posts": "ভুক্তি",
5 | "comments": "মন্তব্য",
6 | "modlog": "ব্যবস্থাপনা সূচী",
7 | "post": "ভুক্তি",
8 | "deleted_by_creator": "লেখক মুছেছে",
9 | "more": "আরো",
10 | "mark_as_read": "পঠিত",
11 | "mark_as_unread": "অপঠিত",
12 | "reply": "উত্তর",
13 | "edit": "সম্পাদনা",
14 | "delete": "মুছো",
15 | "avatar": "অবতার",
16 | "banner": "কেতন",
17 | "delete_account": "অ্যাকাউন্ট মুছো",
18 | "communities": "সম্প্রদায়",
19 | "users": "ব্যবহারকারী",
20 | "admin": "প্রশাসক",
21 | "locked": "বন্ধ",
22 | "invalid_community_name": "অগ্রহণযোগ্য নাম।",
23 | "number_of_comments": "{formattedCount,plural, =1{{formattedCount}টি মন্তব্য} other{{formattedCount}টি মন্তব্য}}",
24 | "number_of_posts": "{formattedCount,plural, =1{{formattedCount}টি ভুক্তি} other{{formattedCount}টি ভুক্তি}}",
25 | "delete_account_confirm": "সতর্কতা:",
26 | "show_avatars": "অবতার দেখাও",
27 | "send_message": "বার্তা পাঠাও",
28 | "bot_account": "বট অ্যাকাউন্ট",
29 | "show_bot_accounts": "বট অ্যাকাউন্ট দেখাও",
30 | "show_read_posts": "পঠিত ভুক্তি দেখাও"
31 | }
32 |
--------------------------------------------------------------------------------
/assets/l10n/intl_cy.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "cy",
3 | "posts": "Postiadau",
4 | "comments": "Sylwadau",
5 | "post": "post"
6 | }
7 |
--------------------------------------------------------------------------------
/assets/l10n/intl_hi.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "hi",
3 | "settings": "समायोजन (सेटिंग्स)",
4 | "posts": "पोस्ट",
5 | "comments": "टिप्पणी (कमेंट )",
6 | "community": "समुदाय",
7 | "post": "पोस्ट",
8 | "more": "और भी",
9 | "reply": "जवाब दें",
10 | "edit": "संपादित करें ( एडिट करें )",
11 | "avatar": "अवतार",
12 | "communities": "सामुदायिक",
13 | "users": "उपयोगकर्ता",
14 | "admin": "प्रशासक",
15 | "couldnt_find_post": "पोस्ट नहीं ढूंढ़ पाएं |",
16 | "locked": "बंद",
17 | "couldnt_create_comment": "टिप्पणी (कमेंट) नहीं बना पाईं |",
18 | "couldnt_find_community": "समुदायों नहीं ढूंढ़ पाएं |",
19 | "community_already_exists": "यह समुदाय पहले स मौजूद है |",
20 | "number_of_comments": "{formattedCount,plural, =1{{{ count }} टिप्पणी (कमेंट )} other{{{ count }} टिप्पणियाँ (कोम्मेंट्स )}}",
21 | "number_of_posts": "{formattedCount,plural, =1{{formattedCount} पोस्ट} other{{formattedCount} पोस्ट्स}}",
22 | "show_avatars": "अवतार दिखाएँ",
23 | "send_message": "संदेश भेजें"
24 | }
25 |
--------------------------------------------------------------------------------
/assets/l10n/intl_hr.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "hr"
3 | }
4 |
--------------------------------------------------------------------------------
/assets/l10n/intl_km.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "km"
3 | }
4 |
--------------------------------------------------------------------------------
/assets/l10n/intl_mnc.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "mnc",
3 | "posts": "ᡧᡠ",
4 | "comments": "ᠯᡝᠣᠯᡝᠨ",
5 | "post": "ᡧ",
6 | "number_of_comments": "{formattedCount,plural, =1{{formattedCount} ᠯᡝᠣᠯᡝᠨ} other{{formattedCount} ᠯᡝᠣᠯᡝᠨ}}",
7 | "number_of_posts": "{formattedCount,plural, =1{{formattedCount} ᡧᡠ} other{{formattedCount} ᡧᡠ}}"
8 | }
9 |
--------------------------------------------------------------------------------
/assets/l10n/intl_nb.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "nb",
3 | "posts": "innleggene",
4 | "comments": "Kommentarer",
5 | "post": "Innlegg",
6 | "more": "mer",
7 | "reply": "svare",
8 | "edit": "Redigere",
9 | "avatar": "Profilbilde",
10 | "banner": "Banner",
11 | "display_name": "Vis navn",
12 | "communities": "Nettsamfunn",
13 | "users": "Brukere",
14 | "number_of_comments": "{formattedCount,plural, =1{{formattedCount} Kommentar} other{{formattedCount} Kommentarer}}",
15 | "number_of_posts": "{formattedCount,plural, =1{{formattedCount} Innlegg} other{{formattedCount} innleggene}}",
16 | "show_avatars": "Vis profilbilder",
17 | "send_message": "Sende melding",
18 | "bot_account": "Bot Konto",
19 | "show_bot_accounts": "Vis Bot Kontoer"
20 | }
21 |
--------------------------------------------------------------------------------
/assets/l10n/intl_oc.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "oc",
3 | "settings": "Paramètres",
4 | "password": "Senhal",
5 | "posts": "Publicacions",
6 | "comments": "Comentaris",
7 | "community": "Comunitat",
8 | "url": "URL",
9 | "title": "Títol",
10 | "body": "Còs",
11 | "post": "publicar",
12 | "replies": "Responsas",
13 | "mentions": "Mencions",
14 | "more": "mai",
15 | "reply": "respondre",
16 | "edit": "editar",
17 | "delete": "suprimir",
18 | "restore": "restaurar",
19 | "yes": "òc",
20 | "no": "non",
21 | "avatar": "Avatar",
22 | "banner": "Bandièra",
23 | "display_name": "Nom d'afichatge",
24 | "bio": "Biografia",
25 | "email": "Adreça electronica",
26 | "sort_type": "Triar per tipe",
27 | "type": "Tipe",
28 | "delete_account": "Suprimir lo compte",
29 | "saved": "Enregistrat",
30 | "communities": "Comunitats",
31 | "users": "Utilizaires",
32 | "theme": "Tèma",
33 | "language": "Lenga",
34 | "new_": "Nòu",
35 | "by": "per",
36 | "not_logged_in": "Pas connectat.",
37 | "invalid_url": "URL invalida.",
38 | "invalid_community_name": "Nom invalid.",
39 | "invalid_username": "Nom d'utilizaire invalid.",
40 | "user_already_exists": "L’utilizaire existís ja.",
41 | "number_of_users_online": "{formattedCount,plural, =1{{formattedCount} utilizaire en linha} other{{formattedCount} utilizaires en linha}}",
42 | "number_of_comments": "{formattedCount,plural, =1{{formattedCount} comentari} other{{formattedCount} comentaris}}",
43 | "number_of_posts": "{formattedCount,plural, =1{{formattedCount} publicacion} other{{formattedCount} publicacions}}",
44 | "number_of_users": "{formattedCount,plural, =1{{formattedCount} utilizaire} other{{formattedCount} utilizaires}}",
45 | "messages": "Messatges",
46 | "new_password": "Senhal novèl",
47 | "verify_password": "Verificar lo senhal",
48 | "old_password": "Senhal ancian",
49 | "show_avatars": "Mostrar los avatars",
50 | "search": "Recercar",
51 | "send_message": "Enviar un messatge",
52 | "new_comments": "Comentaris novèls",
53 | "bot_account": "Compte de robòt",
54 | "show_bot_accounts": "Mostrar los comptes de robòts"
55 | }
56 |
--------------------------------------------------------------------------------
/assets/l10n/intl_sk.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "sk",
3 | "posts": "Príspevky",
4 | "comments": "Komentáre",
5 | "post": "Poslať",
6 | "communities": "Komunity",
7 | "users": "Užívatelia"
8 | }
9 |
--------------------------------------------------------------------------------
/assets/l10n/intl_sr.arb:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/assets/l10n/intl_sr_Latn.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "sr_Latn",
3 | "password": "Lozinka",
4 | "community": "Zajednica",
5 | "url": "URL",
6 | "body": "Sadržaj",
7 | "nsfw": "NSFW",
8 | "from": "od",
9 | "to": "do",
10 | "yes": "da",
11 | "no": "ne",
12 | "email": "Email",
13 | "matrix_user": "Korisnik Matrixa",
14 | "show_nsfw": "Prikaži NSFW sadržaj",
15 | "send_notifications_to_email": "Primajte notifikacie na Vaš Email",
16 | "theme": "Tema",
17 | "language": "Jezik",
18 | "chat": "Ćaskanje",
19 | "by": "od",
20 | "downvotes_disabled": "Onemogućite negativne glasove",
21 | "registration_closed": "Zatvorena registracija",
22 | "new_password": "Nova Lozinka",
23 | "verify_password": "Potvrdite Loziku",
24 | "old_password": "Stara Lozinka"
25 | }
26 |
--------------------------------------------------------------------------------
/assets/l10n/intl_th.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "th",
3 | "settings": "การตั้งค่า",
4 | "password": "รหัสผ่าน",
5 | "email_or_username": "อีเมลหรือชื่อผู้ใช้",
6 | "posts": "โพสต์",
7 | "comments": "ความคิดเห็น",
8 | "community": "ชุมชน",
9 | "url": "ลิงก์",
10 | "title": "หัวข้อ",
11 | "body": "แสดง",
12 | "post": "โพสต์",
13 | "save": "บันทึก",
14 | "all": "ทั้งหมด",
15 | "replies": "การตอบกลับ",
16 | "mentions": "การกล่าวถึง",
17 | "from": "จาก",
18 | "to": "ไปยัง",
19 | "more": "เพิ่มเติม",
20 | "mark_as_read": "ทำเครื่องหมายว่าอ่านแล้ว",
21 | "mark_as_unread": "ทำเครื่องหมายว่ายังไม่อ่าน",
22 | "reply": "ตอบกลับ",
23 | "edit": "แก้ไข",
24 | "delete": "ลบ",
25 | "yes": "ใช่",
26 | "no": "ไม่",
27 | "avatar": "รูปประจำตัว",
28 | "banner": "แบนเนอร์",
29 | "bio": "ชีวประวัติ",
30 | "email": "อีเมล",
31 | "type": "ชนิด",
32 | "delete_account": "ลบบัญชี",
33 | "saved": "บันทึกแล้ว",
34 | "communities": "ชุมชน",
35 | "users": "ผู้ใช้งาน",
36 | "theme": "ธีม",
37 | "language": "ภาษา",
38 | "new_": "ใหม่",
39 | "old": "เก่า",
40 | "chat": "แชท",
41 | "admin": "ผู้ดูแล",
42 | "by": "โดย",
43 | "not_logged_in": "ไม่ได้เข้าสู่ระบบ",
44 | "couldnt_save_comment": "ไม่สามารถบันทึกความคิดเห็นได้",
45 | "report_too_long": "รายงานยาวเกินไป",
46 | "couldnt_create_report": "ไม่สามารถสร้างรายงานได้",
47 | "couldnt_create_post": "ไม่สามารถสร้างโพสต์ได้",
48 | "couldnt_save_post": "ไม่สามารถบันทึกโพสต์ได้",
49 | "invalid_community_name": "ชื่อไม่ถูกต้อง",
50 | "password_incorrect": "รหัสผ่านไม่ถูกต้อง",
51 | "registration_closed": "การลงทะเบียนปิดอยู่",
52 | "passwords_dont_match": "รหัสผ่านไม่ตรงกัน",
53 | "post_title_too_long": "หัวข้อโพสต์ยาวเกินไป",
54 | "email_already_exists": "อีเมลถูกใช้งานแล้ว",
55 | "number_of_comments": "{formattedCount,plural, other{{formattedCount} ความคิดเห็น}}",
56 | "number_of_posts": "{formattedCount,plural, other{{formattedCount} โพสต์}}",
57 | "number_of_users": "{formattedCount,plural, other{ผู้ใช้ {formattedCount} คน}}",
58 | "unsubscribe": "เลิกติดตาม",
59 | "subscribe": "ติดตาม",
60 | "messages": "ข้อความ",
61 | "new_password": "รหัสผ่านใหม่",
62 | "verify_password": "ยืนยันรหัสผ่าน",
63 | "old_password": "รหัสผ่านเก่า",
64 | "show_avatars": "แสดงรูปประจำตัว",
65 | "search": "ค้นหา",
66 | "send_message": "ส่งข้อความ",
67 | "bot_account": "บัญชีบอต",
68 | "show_bot_accounts": "แสดงบัญชีบอต",
69 | "show_read_posts": "แสดงโพสต์ที่อ่านแล้ว"
70 | }
71 |
--------------------------------------------------------------------------------
/assets/l10n/intl_zh_Hant.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "zh_Hant",
3 | "settings": "設定",
4 | "posts": "貼文",
5 | "comments": "評論",
6 | "modlog": "管理紀錄",
7 | "post": "回文",
8 | "deleted_by_creator": "作者已刪除",
9 | "more": "更多",
10 | "mark_as_read": "標記為已讀",
11 | "mark_as_unread": "標記為未讀",
12 | "reply": "回覆",
13 | "edit": "編輯",
14 | "delete": "刪除",
15 | "avatar": "頭貼",
16 | "banner": "橫幅",
17 | "delete_account": "刪除帳號",
18 | "communities": "社群",
19 | "users": "使用者",
20 | "locked": "已鎖定",
21 | "invalid_community_name": "無效的名稱。",
22 | "number_of_comments": "{formattedCount,plural, other{{formattedCount} 則評論}}",
23 | "number_of_posts": "{formattedCount,plural, other{{formattedCount} 貼文}}",
24 | "show_avatars": "顯示頭貼",
25 | "send_message": "發送私人訊息",
26 | "bot_account": "機器人帳號",
27 | "show_bot_accounts": "顯示機器人帳號",
28 | "show_read_posts": "顯示已讀貼文"
29 | }
30 |
--------------------------------------------------------------------------------
/assets/readme_icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
30 |
--------------------------------------------------------------------------------
/fastlane/Fastfile:
--------------------------------------------------------------------------------
1 | platform :android do
2 | desc "Deploy a new version to the Google Play"
3 | lane :prod do
4 | upload_to_play_store(
5 | package_name: "com.krawieck.lemmur",
6 | json_key: ENV["GOOGLE_SERVICE_ACCOUNT_KEY_PATH"],
7 | aab: ENV["ABB_PATH"]
8 | )
9 | end
10 | end
11 |
--------------------------------------------------------------------------------
/fastlane/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 |
3 | gem "fastlane"
4 |
--------------------------------------------------------------------------------
/fastlane/README.md:
--------------------------------------------------------------------------------
1 | fastlane documentation
2 | ================
3 | # Installation
4 |
5 | Make sure you have the latest version of the Xcode command line tools installed:
6 |
7 | ```
8 | xcode-select --install
9 | ```
10 |
11 | Install _fastlane_ using
12 | ```
13 | [sudo] gem install fastlane -NV
14 | ```
15 | or alternatively using `brew install fastlane`
16 |
17 | # Available Actions
18 | ## Android
19 | ### android prod
20 | ```
21 | fastlane android prod
22 | ```
23 | Deploy a new version to the Google Play
24 |
25 | ----
26 |
27 | This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.
28 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
29 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
30 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/full_description.txt:
--------------------------------------------------------------------------------
1 | Ein mobiler Client für Lemmy - eine föderierte Reddit-Alternative
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/short_description.txt:
--------------------------------------------------------------------------------
1 | Ein mobiler Client für Lemmy - eine föderierte Reddit-Alternative
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | lemmur
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | Lemmur is now available on the [play store](https://play.google.com/store/apps/details?id=com.krawieck.lemmur) and [f-droid](https://f-droid.org/packages/com.krawieck.lemmur)
2 |
3 | ### Changed
4 |
5 | - Posts with large amount of text are now truncated in infinite scroll views
6 | - Changed image viewer dismissal to be more fun. The image now also moves on the x axis, changes scale and rotates a bit for more user enjoyment
7 |
8 | ### Fixed
9 |
10 | - Fixed issue where the "About lemmur" tile would not appear on Windows/Linux
11 | - Added a bigger bottom margin in the comment section to prevent the floating action button from covering the last comment
12 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/12.txt:
--------------------------------------------------------------------------------
1 | WARNING: due to some internal changes your local settings will be reset (logged out of accounts, removed instances, theme back to default)
2 |
3 | ### Added
4 |
5 | - Added inbox page, that can be accessed by tapping bell in the home tab
6 | - Added page with saved posts/comments. It can be accessed from the profile tab under the bookmark icon
7 | - Added ability to send private messages
8 | - Added modlog page. Can be visited in the context of an instance or community from the about tab
9 |
10 | ### Changed
11 |
12 | - Titles on some pages, have an appear affect when scrolling down
13 | - Long pressing comments now has a ripple effect
14 | - Nerd stuff now contains more nerd stuff
15 | - Communities that a user follows will no longer appear on a user's profile in most scenarios
16 |
17 | ### Fixed
18 |
19 | - Time of posts is now displayed properly. Unless you live in UTC zone, then you won't notice a difference
20 | - Fixed a bug where links would not work on Android 11
21 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | ### Added
2 |
3 | - Share buttons on windows/linux now copy the data to the clipboard
4 | - Initial translations have been incorporated into lemmur. It is not yet possible to contribute translation strings
5 |
6 | ### Changed
7 |
8 | - Transitioned to Lemmy API v3
9 |
10 | ### Fixed
11 |
12 | - Quote blocks in posts and comments are now much prettier
13 | - Code blocks now have monospace font. As they should
14 | - Switching accounts in the profile tab now correctly reacts to the change
15 | - You can no longer add the same instance twice just by changing capitalization (thanks to @ryg-git)
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | ### Fixed
2 |
3 | - Some actions would pass the wrong user id around causing infinite spinners, this is now fixed
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/15.txt:
--------------------------------------------------------------------------------
1 | ### Changed
2 |
3 | - Disable commenting on locked posts
4 | - Enhanced keyboard experience
5 | - appropriate keyboard types are opened
6 | - correct capitalization
7 | - added text input hints for things like password managers
8 | - Account actions in settings are more obvious to access: long press an account/instance to see possible actions such as setting as default or removal
9 |
10 | ### Added
11 |
12 | - When writing a comment, the parent text is now selectable
13 | - Text of a post is now selectable
14 | - Tapping outside of a text input hides the keyboard
15 |
16 | ### Fixed
17 |
18 | - Actually fixed the thing that v0.4.1 supposedly fixed
19 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/16.txt:
--------------------------------------------------------------------------------
1 | ### Added
2 |
3 | - Editing posts
4 | - Editing comments
5 | - Show avatars setting toggle
6 | - Show scores setting toggle
7 | - Default sort type setting
8 | - Default listing type setting
9 | - Import Lemmy settings: long press an account in account settings then choose the import option
10 | - Support lemmy v0.11.0
11 |
12 | ### Fixed
13 |
14 | - Added deduplication in infinite scrolls
15 | - Fixed bug where creating post would crash after uploading a picture
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/17.txt:
--------------------------------------------------------------------------------
1 | ### Added
2 |
3 | - Support for Lemmy v0.12.0
4 | - Show cake day on a user's profile and next to their name in a comment
5 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/18.txt:
--------------------------------------------------------------------------------
1 | ### Added
2 |
3 | - Blocking of users and communities (from post and from comment)
4 | - Reporting posts and comments
5 | - Android theme-aware splash screen (thanks to [@mimi89999](https://github.com/mimi89999))
6 | - Logging: local logs about some actions/errors. Can be accessed from **settings > about lemmur > logs**
7 |
8 | ### Fixed
9 |
10 | - Fixed a bug where post would go out of sync with full version of the post
11 | - Fixed a bug where making a comment selectable would not always result in making the comment selectable
12 | - Full post will now open no matter where you press on the post card
13 | - Fixed overflows in various places
14 |
15 | ### Changed
16 |
17 | - User banner photo now fits better on user profile
18 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/19.txt:
--------------------------------------------------------------------------------
1 | ### Added
2 |
3 | - Support for Lemmy v0.15.0
4 |
5 | ### Changed
6 |
7 | - "Time ago" strings, dates, and compact numbers are now localized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | Lemmur aims to provide a seamless experience when browsing different Lemmy instances.
2 |
3 | You can have multiple multiple instances added at the same time without having to awkwardly switch between them.
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | A mobile client for lemmy - a federated reddit alternative
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | lemmur
2 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/ios/Flutter/.last_build_id:
--------------------------------------------------------------------------------
1 | 20ad19f2b9a812ac7774ca58ddf04b2e
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 9.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 | use_modular_headers!
33 |
34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
35 | end
36 |
37 | post_install do |installer|
38 | installer.pods_project.targets.each do |target|
39 | flutter_additional_ios_build_settings(target)
40 | end
41 | end
42 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "appearances" : [
9 | {
10 | "appearance" : "luminosity",
11 | "value" : "dark"
12 | }
13 | ],
14 | "idiom" : "universal",
15 | "scale" : "1x"
16 | },
17 | {
18 | "idiom" : "universal",
19 | "scale" : "2x"
20 | },
21 | {
22 | "appearances" : [
23 | {
24 | "appearance" : "luminosity",
25 | "value" : "dark"
26 | }
27 | ],
28 | "idiom" : "universal",
29 | "scale" : "2x"
30 | },
31 | {
32 | "filename" : "universal-light.png",
33 | "idiom" : "universal",
34 | "scale" : "3x"
35 | },
36 | {
37 | "appearances" : [
38 | {
39 | "appearance" : "luminosity",
40 | "value" : "dark"
41 | }
42 | ],
43 | "filename" : "universal-dark.png",
44 | "idiom" : "universal",
45 | "scale" : "3x"
46 | },
47 | {
48 | "idiom" : "iphone",
49 | "scale" : "1x"
50 | },
51 | {
52 | "appearances" : [
53 | {
54 | "appearance" : "luminosity",
55 | "value" : "dark"
56 | }
57 | ],
58 | "idiom" : "iphone",
59 | "scale" : "1x"
60 | },
61 | {
62 | "idiom" : "iphone",
63 | "scale" : "2x"
64 | },
65 | {
66 | "appearances" : [
67 | {
68 | "appearance" : "luminosity",
69 | "value" : "dark"
70 | }
71 | ],
72 | "idiom" : "iphone",
73 | "scale" : "2x"
74 | },
75 | {
76 | "filename" : "phone-light.png",
77 | "idiom" : "iphone",
78 | "scale" : "3x"
79 | },
80 | {
81 | "appearances" : [
82 | {
83 | "appearance" : "luminosity",
84 | "value" : "dark"
85 | }
86 | ],
87 | "filename" : "phone-dark.png",
88 | "idiom" : "iphone",
89 | "scale" : "3x"
90 | }
91 | ],
92 | "info" : {
93 | "author" : "xcode",
94 | "version" : 1
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/phone-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/LaunchImage.imageset/phone-dark.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/phone-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/LaunchImage.imageset/phone-light.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/universal-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/LaunchImage.imageset/universal-dark.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/universal-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LemmurOrg/lemmur/0a95fefba087d4109440cd5d371516d9f846aec5/ios/Runner/Assets.xcassets/LaunchImage.imageset/universal-light.png
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(BUNDLE_NAME)
15 | CFBundleDisplayName
16 | $(BUNDLE_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | $(FLUTTER_BUILD_NAME)
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | $(FLUTTER_BUILD_NUMBER)
25 | LSRequiresIPhoneOS
26 |
27 | UILaunchStoryboardName
28 | LaunchScreen
29 | UIMainStoryboardFile
30 | Main
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 | UIViewControllerBasedStatusBarAppearance
45 |
46 | CADisableMinimumFrameDurationOnPhone
47 |
48 |
49 |
50 | NSPhotoLibraryUsageDescription
51 | For uploading images for posts/avatars
52 | NSCameraUsageDescription
53 | For uploading images for posts/avatars
54 | NSMicrophoneUsageDescription
55 | For recording videos for posts
56 | CADisableMinimumFrameDurationOnPhone
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/l10n.yaml:
--------------------------------------------------------------------------------
1 | arb-dir: assets/l10n
2 | output-dir: lib/l10n/gen
3 | template-arb-file: intl_en.arb
4 | output-localization-file: l10n.dart
5 | preferred-supported-locales: [en]
6 | output-class: L10n
7 | synthetic-package: false
8 | nullable-getter: false
9 |
--------------------------------------------------------------------------------
/lib/app.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:keyboard_dismisser/keyboard_dismisser.dart';
3 |
4 | import 'l10n/l10n.dart';
5 | import 'pages/home_page.dart';
6 | import 'resources/theme.dart';
7 | import 'stores/config_store.dart';
8 | import 'util/observer_consumers.dart';
9 |
10 | class MyApp extends StatelessWidget {
11 | const MyApp();
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return KeyboardDismisser(
16 | child: ObserverBuilder(
17 | builder: (context, store) => MaterialApp(
18 | title: 'lemmur',
19 | supportedLocales: L10n.supportedLocales,
20 | localizationsDelegates: L10n.localizationsDelegates,
21 | themeMode: store.theme,
22 | darkTheme: store.amoledDarkMode ? amoledTheme : darkTheme,
23 | locale: store.locale,
24 | theme: lightTheme,
25 | home: const HomePage(),
26 | ),
27 | ),
28 | );
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/lib/app_config.dart:
--------------------------------------------------------------------------------
1 | class AppConfig {
2 | final bool debugMode;
3 |
4 | const AppConfig({
5 | required this.debugMode,
6 | });
7 | }
8 |
--------------------------------------------------------------------------------
/lib/comment_tree.dart:
--------------------------------------------------------------------------------
1 | import 'package:lemmy_api_client/v3.dart';
2 |
3 | import 'util/hot_rank.dart';
4 |
5 | enum CommentSortType {
6 | hot,
7 | top,
8 | new_,
9 | old,
10 | chat;
11 |
12 | /// returns a compare function for sorting a CommentTree according
13 | /// to the comment sort type
14 | int Function(CommentTree a, CommentTree b) get sortFunction {
15 | switch (this) {
16 | case CommentSortType.chat:
17 | throw Exception('Sorting a CommentTree in chat mode is not supported'
18 | ' because it would restructure the whole tree');
19 |
20 | case CommentSortType.hot:
21 | return (b, a) =>
22 | a.comment.computedHotRank.compareTo(b.comment.computedHotRank);
23 |
24 | case CommentSortType.new_:
25 | return (b, a) =>
26 | a.comment.comment.published.compareTo(b.comment.comment.published);
27 |
28 | case CommentSortType.old:
29 | return (b, a) =>
30 | b.comment.comment.published.compareTo(a.comment.comment.published);
31 |
32 | case CommentSortType.top:
33 | return (b, a) =>
34 | a.comment.counts.score.compareTo(b.comment.counts.score);
35 | }
36 | }
37 | }
38 |
39 | extension SortCommentTreeList on List {
40 | void sortBy(CommentSortType sortType) {
41 | sort(sortType.sortFunction);
42 | for (final el in this) {
43 | el._sort(sortType.sortFunction);
44 | }
45 | }
46 | }
47 |
48 | class CommentTree {
49 | CommentView comment;
50 | List children = [];
51 |
52 | CommentTree(this.comment);
53 |
54 | /// takes raw linear comments and turns them into a CommentTree
55 | static List fromList(List comments) {
56 | CommentTree gatherChildren(CommentTree parent) {
57 | for (final el in comments) {
58 | if (el.comment.parentId == parent.comment.comment.id) {
59 | parent.children.add(gatherChildren(CommentTree(el)));
60 | }
61 | }
62 | return parent;
63 | }
64 |
65 | final topLevelParents =
66 | comments.where((e) => e.comment.parentId == null).map(CommentTree.new);
67 |
68 | final result = topLevelParents.map(gatherChildren).toList();
69 | return result;
70 | }
71 |
72 | /// recursive sorter
73 | void _sort(int compare(CommentTree a, CommentTree b)) {
74 | children.sort(compare);
75 | for (final el in children) {
76 | el._sort(compare);
77 | }
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/lib/gen/assets.gen.dart:
--------------------------------------------------------------------------------
1 | /// GENERATED CODE - DO NOT MODIFY BY HAND
2 | /// *****************************************************
3 | /// FlutterGen
4 | /// *****************************************************
5 |
6 | import 'package:flutter/widgets.dart';
7 |
8 | class Assets {
9 | Assets._();
10 |
11 | static const AssetGenImage appIcon = AssetGenImage('assets/app_icon.png');
12 | }
13 |
14 | class AssetGenImage extends AssetImage {
15 | const AssetGenImage(String assetName)
16 | : _assetName = assetName,
17 | super(assetName);
18 | final String _assetName;
19 |
20 | Image image({
21 | Key? key,
22 | ImageFrameBuilder? frameBuilder,
23 | ImageLoadingBuilder? loadingBuilder,
24 | ImageErrorWidgetBuilder? errorBuilder,
25 | String? semanticLabel,
26 | bool excludeFromSemantics = false,
27 | double? width,
28 | double? height,
29 | Color? color,
30 | BlendMode? colorBlendMode,
31 | BoxFit? fit,
32 | AlignmentGeometry alignment = Alignment.center,
33 | ImageRepeat repeat = ImageRepeat.noRepeat,
34 | Rect? centerSlice,
35 | bool matchTextDirection = false,
36 | bool gaplessPlayback = false,
37 | bool isAntiAlias = false,
38 | FilterQuality filterQuality = FilterQuality.low,
39 | }) {
40 | return Image(
41 | key: key,
42 | image: this,
43 | frameBuilder: frameBuilder,
44 | loadingBuilder: loadingBuilder,
45 | errorBuilder: errorBuilder,
46 | semanticLabel: semanticLabel,
47 | excludeFromSemantics: excludeFromSemantics,
48 | width: width,
49 | height: height,
50 | color: color,
51 | colorBlendMode: colorBlendMode,
52 | fit: fit,
53 | alignment: alignment,
54 | repeat: repeat,
55 | centerSlice: centerSlice,
56 | matchTextDirection: matchTextDirection,
57 | gaplessPlayback: gaplessPlayback,
58 | isAntiAlias: isAntiAlias,
59 | filterQuality: filterQuality,
60 | );
61 | }
62 |
63 | String get path => _assetName;
64 | }
65 |
--------------------------------------------------------------------------------
/lib/hooks/debounce.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:flutter_hooks/flutter_hooks.dart';
5 |
6 | class Debounce {
7 | final bool loading;
8 | final VoidCallback callback;
9 |
10 | const Debounce({
11 | required this.loading,
12 | required this.callback,
13 | });
14 |
15 | void call() => callback();
16 | }
17 |
18 | /// will run `callback()` after debounce hook hasn't been called for the
19 | /// specified `delayDuration`
20 | Debounce useDebounce(
21 | Future Function() callback, [
22 | Duration delayDuration = const Duration(seconds: 1),
23 | ]) {
24 | final loading = useState(false);
25 | final timerHandle = useRef(null);
26 |
27 | cancel() {
28 | timerHandle.value?.cancel();
29 | loading.value = false;
30 | }
31 |
32 | useEffect(() => () => timerHandle.value?.cancel(), []);
33 |
34 | start() {
35 | timerHandle.value = Timer(delayDuration, () async {
36 | loading.value = true;
37 | await callback();
38 | cancel();
39 | });
40 | }
41 |
42 | return Debounce(
43 | loading: loading.value,
44 | callback: () {
45 | cancel();
46 | start();
47 | },
48 | );
49 | }
50 |
--------------------------------------------------------------------------------
/lib/hooks/delayed_loading.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:flutter_hooks/flutter_hooks.dart';
5 |
6 | class DelayedLoading {
7 | final bool pending;
8 | final bool loading;
9 | final VoidCallback start;
10 | final VoidCallback cancel;
11 |
12 | const DelayedLoading({
13 | required this.pending,
14 | required this.loading,
15 | required this.start,
16 | required this.cancel,
17 | });
18 | }
19 |
20 | /// When loading is [.start()]ed, it goes into a pending state
21 | /// and loading is triggered after [delayDuration].
22 | /// Everything can be reset with [.cancel()]
23 | DelayedLoading useDelayedLoading(
24 | [Duration delayDuration = const Duration(milliseconds: 500)]) {
25 | final loading = useState(false);
26 | final pending = useState(false);
27 | final timerHandle = useRef(null);
28 |
29 | return DelayedLoading(
30 | loading: loading.value,
31 | pending: pending.value,
32 | start: () {
33 | timerHandle.value = Timer(delayDuration, () => loading.value = true);
34 | pending.value = true;
35 | },
36 | cancel: () {
37 | timerHandle.value?.cancel();
38 | pending.value = false;
39 | loading.value = false;
40 | },
41 | );
42 | }
43 |
--------------------------------------------------------------------------------
/lib/hooks/infinite_scroll.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_hooks/flutter_hooks.dart';
2 |
3 | import '../widgets/infinite_scroll.dart';
4 |
5 | InfiniteScrollController useInfiniteScrollController() =>
6 | useMemoized(InfiniteScrollController.new);
7 |
--------------------------------------------------------------------------------
/lib/hooks/logged_in_action.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_hooks/flutter_hooks.dart';
3 | import 'package:lemmy_api_client/v3.dart';
4 |
5 | import '../pages/settings/settings.dart';
6 | import '../util/goto.dart';
7 | import 'stores.dart';
8 |
9 | /// If user has an account for the given instance the passed wrapper will call
10 | /// the passed action with a Jwt token. Otherwise the action is ignored and a
11 | /// Snackbar is rendered. If [any] is set to true, this check is performed for
12 | /// all instances and if any of them have an account, the wrapped action will be
13 | /// called with a null token.
14 |
15 | VoidCallback Function(
16 | void Function(Jwt token) action, [
17 | String? message,
18 | ]) useAnyLoggedInAction() {
19 | final context = useContext();
20 | final store = useAccountsStore();
21 |
22 | return (action, [message]) {
23 | if (store.hasNoAccount) {
24 | return () {
25 | ScaffoldMessenger.of(context).showSnackBar(SnackBar(
26 | content: Text(message ?? 'you have to be logged in to do that'),
27 | action: SnackBarAction(
28 | label: 'log in',
29 | onPressed: () => goTo(context, (_) => AccountsConfigPage())),
30 | ));
31 | };
32 | }
33 | return () => action(store.defaultUserData!.jwt);
34 | };
35 | }
36 |
37 | VoidCallback Function(
38 | void Function(Jwt token) action, [
39 | String? message,
40 | ]) useLoggedInAction(String instanceHost) {
41 | final context = useContext();
42 | final store = useAccountsStore();
43 |
44 | return (action, [message]) {
45 | if (store.isAnonymousFor(instanceHost)) {
46 | return () {
47 | ScaffoldMessenger.of(context).showSnackBar(SnackBar(
48 | content: Text(message ?? 'you have to be logged in to do that'),
49 | action: SnackBarAction(
50 | label: 'log in',
51 | onPressed: () => goTo(context, (_) => AccountsConfigPage())),
52 | ));
53 | };
54 | }
55 | final token = store.defaultUserDataFor(instanceHost)!.jwt;
56 | return () => action(token);
57 | };
58 | }
59 |
--------------------------------------------------------------------------------
/lib/hooks/memo_future.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_hooks/flutter_hooks.dart';
3 |
4 | /// creates an [AsyncSnapshot] from the Future returned from the valueBuilder.
5 | /// [keys] can be used to rebuild the Future
6 | AsyncSnapshot useMemoFuture(
7 | Future Function() valueBuilder, [
8 | List