Compare commits
186 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b0bb26f84b | ||
|
|
e94fcf3128 | ||
|
|
bd6e818f36 | ||
|
|
96d0c35c31 | ||
|
|
4ef3281a0b | ||
|
|
c56e3dba0f | ||
|
|
53d284ace4 | ||
|
|
c2733482e5 | ||
|
|
67f0c926c4 | ||
|
|
889be2ff2c | ||
|
|
52b51954aa | ||
|
|
1c76293559 | ||
|
|
250d6793a2 | ||
|
|
121af2bca3 | ||
|
|
e410dcb2eb | ||
|
|
63ff9772e5 | ||
|
|
1ae29c5ade | ||
|
|
fedd6a71bb | ||
|
|
8f64cfcbca | ||
|
|
1edb2c13da | ||
|
|
7f83204b24 | ||
|
|
0fe52494d0 | ||
|
|
56dbcde3b4 | ||
|
|
8fbc5e6ce4 | ||
|
|
979a4b7c73 | ||
|
|
7b1da24748 | ||
|
|
7014aa85d1 | ||
|
|
abab674322 | ||
|
|
498bb22a69 | ||
|
|
11fe43a750 | ||
|
|
2a60a7306c | ||
|
|
ad12a7e15d | ||
|
|
1c5fea2dd4 | ||
|
|
90ac4dc59b | ||
|
|
11e50946d2 | ||
|
|
abd0bcd4b9 | ||
|
|
c3c957d527 | ||
|
|
f415d8a98f | ||
|
|
963c15636c | ||
|
|
7562d93113 | ||
|
|
aae58bc5ee | ||
|
|
5be08c16d5 | ||
|
|
0f29b757ee | ||
|
|
49b8d2c423 | ||
|
|
f0f812e66a | ||
|
|
35b037f66c | ||
|
|
985995d45d | ||
|
|
cb786d6360 | ||
|
|
89416a9017 | ||
|
|
6aa8df7d9a | ||
|
|
16f9f8c54d | ||
|
|
2b041580de | ||
|
|
9de0984553 | ||
|
|
4a73c0ba17 | ||
|
|
3d1d226c43 | ||
|
|
ccead686aa | ||
|
|
1f57cc503c | ||
|
|
24f9fddae0 | ||
|
|
e4875b10de | ||
|
|
48f1a4ca3a | ||
|
|
0a475c0a0f | ||
|
|
1859c5c32d | ||
|
|
f159a8fc42 | ||
|
|
f700ac9935 | ||
|
|
70729bb0e5 | ||
|
|
7d5b0d285d | ||
|
|
72f53d6d21 | ||
|
|
5707c93295 | ||
|
|
46a90169a9 | ||
|
|
27754bd3c3 | ||
|
|
2bf3e8853d | ||
|
|
e14099472a | ||
|
|
ac06e21f37 | ||
|
|
92e2fd93f9 | ||
|
|
a5ccba69ec | ||
|
|
23eb05a368 | ||
|
|
1f9ee9b462 | ||
|
|
237b8d2fc6 | ||
|
|
35eada710e | ||
|
|
86ef5af6f6 | ||
|
|
76b290c8b3 | ||
|
|
a92ad7bfc9 | ||
|
|
1944add558 | ||
|
|
05e4b46469 | ||
|
|
00652952d8 | ||
|
|
83864217f9 | ||
|
|
b3ab75699e | ||
|
|
5cde911113 | ||
|
|
7fda50857f | ||
|
|
4ab51ea11a | ||
|
|
fcd5c1b167 | ||
|
|
2ccb397164 | ||
|
|
4e3a3133d7 | ||
|
|
2edd3a73fd | ||
|
|
4855043cda | ||
|
|
e6e997e4b5 | ||
|
|
c78fc65279 | ||
|
|
52e95dc959 | ||
|
|
b8948fb646 | ||
|
|
a91ac29626 | ||
|
|
aca677a432 | ||
|
|
708a404a21 | ||
|
|
7fa861d609 | ||
|
|
5a201c783f | ||
|
|
f98ed31475 | ||
|
|
6ebf1d265e | ||
|
|
07c4d14adf | ||
|
|
6b1b4c2c4f | ||
|
|
658d134f64 | ||
|
|
a9dbcfb69d | ||
|
|
860a4cec16 | ||
|
|
4905f75564 | ||
|
|
6b53d9444d | ||
|
|
f39a29159a | ||
|
|
c1a4b5ede8 | ||
|
|
d0319eb32d | ||
|
|
9524080d00 | ||
|
|
cba32e75b3 | ||
|
|
37d81cb87a | ||
|
|
f911688c78 | ||
|
|
bfa6b6f08a | ||
|
|
87e83516a1 | ||
|
|
8196704ccd | ||
|
|
cbd88d0f13 | ||
|
|
ecb706310b | ||
|
|
caf544069e | ||
|
|
8bc4caae78 | ||
|
|
5a2ab98af5 | ||
|
|
3ab9ea9fe8 | ||
|
|
b761ad8b84 | ||
|
|
5169b726ce | ||
|
|
41f00ef3f1 | ||
|
|
abdd1667b7 | ||
|
|
b6c689ea7e | ||
|
|
2c8bcbcb2f | ||
|
|
e412b33d4e | ||
|
|
081251061d | ||
|
|
09ca4974c5 | ||
|
|
d9781f3a47 | ||
|
|
ec390f593c | ||
|
|
6883a556bf | ||
|
|
100be96fca | ||
|
|
c1e26d23cf | ||
|
|
329ef919f7 | ||
|
|
336e106e01 | ||
|
|
c0f802c27b | ||
|
|
da033e697f | ||
|
|
5bb32df16b | ||
|
|
6cb364531b | ||
|
|
72fa2c765d | ||
|
|
0643b6d719 | ||
|
|
da79b306b2 | ||
|
|
9a6f8b86fc | ||
|
|
37214fcbdc | ||
|
|
eb578fa5e6 | ||
|
|
51f79ac8ad | ||
|
|
ddef0fc2c8 | ||
|
|
dbc72d5259 | ||
|
|
f686294aab | ||
|
|
29cdebe424 | ||
|
|
ef476552e0 | ||
|
|
dd0d4d52c1 | ||
|
|
0c825a3d85 | ||
|
|
2d07d5f1fa | ||
|
|
2dc9e71ab5 | ||
|
|
062b0cadd2 | ||
|
|
ad92e6d3ff | ||
|
|
328956d84a | ||
|
|
9d58e15b39 | ||
|
|
721a42f60f | ||
|
|
6a0f5678ec | ||
|
|
dbfc4172fb | ||
|
|
2097a9f7fd | ||
|
|
3053e2b5c9 | ||
|
|
7f1585a6ad | ||
|
|
704edfbaaf | ||
|
|
5622c007f2 | ||
|
|
3719a71e0f | ||
|
|
44fb9a022d | ||
|
|
45cc51192a | ||
|
|
d981690ba6 | ||
|
|
161a621d71 | ||
|
|
7da1afa643 | ||
|
|
77e89fc9e2 | ||
|
|
36e97cb621 | ||
|
|
c539376cc4 |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
[android]
|
|
||||||
target = Google Inc.:Google APIs:23
|
|
||||||
|
|
||||||
[maven_repositories]
|
|
||||||
central = https://repo1.maven.org/maven2
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
# Windows files
|
|
||||||
[*.bat]
|
|
||||||
end_of_line = crlf
|
|
||||||
4
.env.example
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
TEST_SERVER_NAME=Subsonic Demo
|
||||||
|
TEST_SERVER_URL=http://demo.subsonic.org
|
||||||
|
TEST_SERVER_USERNAME=guest
|
||||||
|
TEST_SERVER_PASSWORD=guest
|
||||||
@ -1,9 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
extends: '@react-native-community',
|
|
||||||
rules: {
|
|
||||||
'@typescript-eslint/no-unused-vars': ['warn'],
|
|
||||||
semi: 0,
|
|
||||||
'no-spaced-func': 0,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
4
.fvm/fvm_config.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"flutterSdkVersion": "3.7.11",
|
||||||
|
"flavors": {}
|
||||||
|
}
|
||||||
6
.gitattributes
vendored
@ -1,6 +0,0 @@
|
|||||||
# Windows files should use crlf line endings
|
|
||||||
# https://help.github.com/articles/dealing-with-line-endings/
|
|
||||||
*.bat text eol=crlf
|
|
||||||
|
|
||||||
# ignore these paths for GitHub language percentages
|
|
||||||
android/app/src/main/assets/licenses/* linguist-vendored=true
|
|
||||||
1
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
ko_fi: austinried
|
||||||
36
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Device**
|
||||||
|
- Model: [e.g. Pixel 4]
|
||||||
|
- OS: [e.g. Android 12]
|
||||||
|
- Subtracks version [e.g. 1.2.0]
|
||||||
|
|
||||||
|
**Server**
|
||||||
|
- Software: [e.g. Navidrome]
|
||||||
|
- Version: [e.g. 0.49.3]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
17
.github/release.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
changelog:
|
||||||
|
exclude:
|
||||||
|
labels:
|
||||||
|
- ignore-for-release
|
||||||
|
- dependencies
|
||||||
|
authors:
|
||||||
|
- weblate
|
||||||
|
categories:
|
||||||
|
- title: New
|
||||||
|
labels:
|
||||||
|
- enhancement
|
||||||
|
- title: Fixed
|
||||||
|
labels:
|
||||||
|
- bug
|
||||||
|
- title: Other Changes
|
||||||
|
labels:
|
||||||
|
- "*"
|
||||||
78
.github/workflows/build-flutter-release.yml
vendored
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
name: build-flutter-release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags: ['v*']
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-apk:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Get subtracks version
|
||||||
|
run: echo "SUBTRACKS_VERSION=$(yq '.version' pubspec.yaml | cut -d '+' -f 1)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: '3.7.11'
|
||||||
|
channel: 'stable'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- run: cp .env.example .env
|
||||||
|
- run: flutter pub get
|
||||||
|
|
||||||
|
- name: Retrieve subtracks.keystore
|
||||||
|
env:
|
||||||
|
SUBTRACKS_KEYSTORE_BASE64: ${{ secrets.SUBTRACKS_KEYSTORE_BASE64 }}
|
||||||
|
run: |
|
||||||
|
echo "$SUBTRACKS_KEYSTORE_BASE64" | base64 --decode > android/subtracks.keystore
|
||||||
|
- name: Retrieve key.properties
|
||||||
|
env:
|
||||||
|
SUBTRACKS_KEYPROPERTIES_BASE64: ${{ secrets.SUBTRACKS_KEYPROPERTIES_BASE64 }}
|
||||||
|
run: |
|
||||||
|
echo "$SUBTRACKS_KEYPROPERTIES_BASE64" | base64 --decode > android/key.properties
|
||||||
|
|
||||||
|
- run: flutter build apk -PsignRelease
|
||||||
|
|
||||||
|
- run: mv build/app/outputs/flutter-apk/app-release.apk subtracks-${SUBTRACKS_VERSION}.apk
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: subtracks-release-apk
|
||||||
|
path: subtracks-*.apk
|
||||||
|
|
||||||
|
build-aab:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Get subtracks version
|
||||||
|
run: echo "SUBTRACKS_VERSION=$(yq '.version' pubspec.yaml)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: '3.7.11'
|
||||||
|
channel: 'stable'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- run: cp .env.example .env
|
||||||
|
- run: flutter pub get
|
||||||
|
|
||||||
|
- name: Retrieve subtracks.keystore
|
||||||
|
env:
|
||||||
|
SUBTRACKS_KEYSTORE_BASE64: ${{ secrets.SUBTRACKS_KEYSTORE_BASE64 }}
|
||||||
|
run: |
|
||||||
|
echo "$SUBTRACKS_KEYSTORE_BASE64" | base64 --decode > android/subtracks.keystore
|
||||||
|
- name: Retrieve key.properties
|
||||||
|
env:
|
||||||
|
SUBTRACKS_KEYPROPERTIES_BASE64: ${{ secrets.SUBTRACKS_KEYPROPERTIES_BASE64 }}
|
||||||
|
run: |
|
||||||
|
echo "$SUBTRACKS_KEYPROPERTIES_BASE64" | base64 --decode > android/key.properties
|
||||||
|
|
||||||
|
- run: flutter build appbundle -PsignRelease
|
||||||
|
|
||||||
|
- run: mv build/app/outputs/bundle/release/app-release.aab subtracks-${SUBTRACKS_VERSION}.aab
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: subtracks-release-aab
|
||||||
|
path: subtracks-*.aab
|
||||||
30
.github/workflows/build-flutter.yml
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
name: build-flutter
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ['main']
|
||||||
|
pull_request:
|
||||||
|
branches: ['main']
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-apk:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: '3.7.11'
|
||||||
|
channel: 'stable'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- run: cp .env.example .env
|
||||||
|
- run: flutter pub get
|
||||||
|
- run: flutter analyze
|
||||||
|
- run: flutter build apk
|
||||||
|
|
||||||
|
- run: mv build/app/outputs/flutter-apk/app-release.apk subtracks-$(git rev-parse --short HEAD).apk
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: subtracks-testing
|
||||||
|
path: subtracks-*.apk
|
||||||
51
.github/workflows/build-release-debugsign.yml
vendored
@ -1,51 +0,0 @@
|
|||||||
name: build-release-debugsign
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- assets/**
|
|
||||||
- README.md
|
|
||||||
- LICENSE
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- release/*
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- assets/**
|
|
||||||
- README.md
|
|
||||||
- LICENSE
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: '14'
|
|
||||||
cache: 'yarn'
|
|
||||||
- run: |
|
|
||||||
yarn install
|
|
||||||
- run: |
|
|
||||||
yarn lint --max-warnings 0
|
|
||||||
- run: |
|
|
||||||
yarn license
|
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
|
||||||
- uses: gradle/gradle-build-action@v1
|
|
||||||
with:
|
|
||||||
distributions-cache-enabled: true
|
|
||||||
dependencies-cache-enabled: true
|
|
||||||
configuration-cache-enabled: true
|
|
||||||
build-root-directory: android
|
|
||||||
arguments: assembleRelease -PsignReleaseWithDebug=true
|
|
||||||
- run: |
|
|
||||||
mkdir bin
|
|
||||||
- run: >
|
|
||||||
mv android/app/build/outputs/apk/release/app-release.apk
|
|
||||||
bin/subtracks-${GITHUB_SHA}.apk
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: subtracks-testing
|
|
||||||
path: bin/*
|
|
||||||
63
.github/workflows/build-release.yml
vendored
@ -1,63 +0,0 @@
|
|||||||
name: build-release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: '14'
|
|
||||||
cache: 'yarn'
|
|
||||||
- name: Get subtracks version
|
|
||||||
run: |
|
|
||||||
echo "SUBTRACKS_VERSION=$(node -e "console.log(require('./package.json').version);")" >> $GITHUB_ENV
|
|
||||||
- run: |
|
|
||||||
yarn install
|
|
||||||
- run: |
|
|
||||||
yarn license
|
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
|
||||||
- name: Retrieve keystore file
|
|
||||||
env:
|
|
||||||
SUBTRACKS_KEYSTORE_BASE64: ${{ secrets.SUBTRACKS_KEYSTORE_BASE64 }}
|
|
||||||
run: |
|
|
||||||
echo "$SUBTRACKS_KEYSTORE_BASE64" | base64 --decode > android/app/subtracks.keystore
|
|
||||||
- name: Build release APK
|
|
||||||
env:
|
|
||||||
SUBTRACKS_UPLOAD_KEY_PASSWORD: ${{ secrets.SUBTRACKS_UPLOAD_KEY_PASSWORD }}
|
|
||||||
SUBTRACKS_UPLOAD_STORE_PASSWORD: ${{ secrets.SUBTRACKS_UPLOAD_STORE_PASSWORD }}
|
|
||||||
run: >
|
|
||||||
./android/gradlew assembleRelease
|
|
||||||
-p android
|
|
||||||
-PSUBTRACKS_UPLOAD_STORE_FILE=subtracks.keystore
|
|
||||||
-PSUBTRACKS_UPLOAD_KEY_ALIAS=subtracks
|
|
||||||
-PSUBTRACKS_UPLOAD_KEY_PASSWORD="$SUBTRACKS_UPLOAD_KEY_PASSWORD"
|
|
||||||
-PSUBTRACKS_UPLOAD_STORE_PASSWORD="$SUBTRACKS_UPLOAD_STORE_PASSWORD"
|
|
||||||
- run: |
|
|
||||||
mkdir bin
|
|
||||||
- run: >
|
|
||||||
mv android/app/build/outputs/apk/release/app-release.apk
|
|
||||||
bin/subtracks-${SUBTRACKS_VERSION}.apk
|
|
||||||
- name: Build release AAB
|
|
||||||
env:
|
|
||||||
SUBTRACKS_UPLOAD_KEY_PASSWORD: ${{ secrets.SUBTRACKS_UPLOAD_KEY_PASSWORD }}
|
|
||||||
SUBTRACKS_UPLOAD_STORE_PASSWORD: ${{ secrets.SUBTRACKS_UPLOAD_STORE_PASSWORD }}
|
|
||||||
run: >
|
|
||||||
./android/gradlew bundleRelease
|
|
||||||
-p android
|
|
||||||
-PSUBTRACKS_UPLOAD_STORE_FILE=subtracks.keystore
|
|
||||||
-PSUBTRACKS_UPLOAD_KEY_ALIAS=subtracks
|
|
||||||
-PSUBTRACKS_UPLOAD_KEY_PASSWORD="$SUBTRACKS_UPLOAD_KEY_PASSWORD"
|
|
||||||
-PSUBTRACKS_UPLOAD_STORE_PASSWORD="$SUBTRACKS_UPLOAD_STORE_PASSWORD"
|
|
||||||
- run: >
|
|
||||||
mv android/app/build/outputs/bundle/release/app-release.aab
|
|
||||||
bin/subtracks-${SUBTRACKS_VERSION}.aab
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: subtracks-release
|
|
||||||
path: bin/*
|
|
||||||
96
.gitignore
vendored
@ -1,59 +1,49 @@
|
|||||||
# OSX
|
# Miscellaneous
|
||||||
#
|
*.class
|
||||||
|
*.log
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.atom/
|
||||||
|
.buildlog/
|
||||||
|
.history
|
||||||
|
.svn/
|
||||||
|
migrate_working_dir/
|
||||||
|
|
||||||
# Xcode
|
# IntelliJ related
|
||||||
#
|
|
||||||
build/
|
|
||||||
*.pbxuser
|
|
||||||
!default.pbxuser
|
|
||||||
*.mode1v3
|
|
||||||
!default.mode1v3
|
|
||||||
*.mode2v3
|
|
||||||
!default.mode2v3
|
|
||||||
*.perspectivev3
|
|
||||||
!default.perspectivev3
|
|
||||||
xcuserdata
|
|
||||||
*.xccheckout
|
|
||||||
*.moved-aside
|
|
||||||
DerivedData
|
|
||||||
*.hmap
|
|
||||||
*.ipa
|
|
||||||
*.xcuserstate
|
|
||||||
|
|
||||||
# Android/IntelliJ
|
|
||||||
#
|
|
||||||
build/
|
|
||||||
.idea
|
|
||||||
.gradle
|
|
||||||
local.properties
|
|
||||||
*.iml
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
# node.js
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
#
|
# VS Code which you may wish to be included in version control, so this line
|
||||||
node_modules/
|
# is commented out by default.
|
||||||
npm-debug.log
|
#.vscode/
|
||||||
yarn-error.log
|
|
||||||
|
|
||||||
# BUCK
|
# Flutter/Dart/Pub related
|
||||||
buck-out/
|
**/doc/api/
|
||||||
\.buckd/
|
**/ios/Flutter/.last_build_id
|
||||||
|
.dart_tool/
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
.packages
|
||||||
|
.pub-cache/
|
||||||
|
.pub/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# Symbolication related
|
||||||
|
app.*.symbols
|
||||||
|
|
||||||
|
# Obfuscation related
|
||||||
|
app.*.map.json
|
||||||
|
|
||||||
|
# Android Studio will place build artifacts here
|
||||||
|
/android/app/debug
|
||||||
|
/android/app/profile
|
||||||
|
/android/app/release
|
||||||
|
|
||||||
|
/.env
|
||||||
|
*.sqlite*
|
||||||
|
/.fvm/flutter_sdk
|
||||||
*.keystore
|
*.keystore
|
||||||
!debug.keystore
|
|
||||||
|
|
||||||
# fastlane
|
|
||||||
#
|
|
||||||
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
|
|
||||||
# screenshots whenever they are needed.
|
|
||||||
# For more information about the recommended setup visit:
|
|
||||||
# https://docs.fastlane.tools/best-practices/source-control/
|
|
||||||
|
|
||||||
*/fastlane/report.xml
|
|
||||||
*/fastlane/Preview.html
|
|
||||||
*/fastlane/screenshots
|
|
||||||
|
|
||||||
# Bundle artifact
|
|
||||||
*.jsbundle
|
|
||||||
|
|
||||||
# CocoaPods
|
|
||||||
/ios/Pods/
|
|
||||||
|
|||||||
30
.metadata
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# This file tracks properties of this Flutter project.
|
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
|
#
|
||||||
|
# This file should be version controlled.
|
||||||
|
|
||||||
|
version:
|
||||||
|
revision: 9944297138845a94256f1cf37beb88ff9a8e811a
|
||||||
|
channel: stable
|
||||||
|
|
||||||
|
project_type: app
|
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command
|
||||||
|
migration:
|
||||||
|
platforms:
|
||||||
|
- platform: root
|
||||||
|
create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a
|
||||||
|
base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a
|
||||||
|
- platform: android
|
||||||
|
create_revision: 9944297138845a94256f1cf37beb88ff9a8e811a
|
||||||
|
base_revision: 9944297138845a94256f1cf37beb88ff9a8e811a
|
||||||
|
|
||||||
|
# User provided section
|
||||||
|
|
||||||
|
# List of Local paths (relative to this file) that should be
|
||||||
|
# ignored by the migrate tool.
|
||||||
|
#
|
||||||
|
# Files that are not part of the templates will be ignored by default.
|
||||||
|
unmanaged_files:
|
||||||
|
- 'lib/main.dart'
|
||||||
|
- 'ios/Runner.xcodeproj/project.pbxproj'
|
||||||
@ -1,9 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
bracketSpacing: true,
|
|
||||||
jsxBracketSameLine: true,
|
|
||||||
singleQuote: true,
|
|
||||||
trailingComma: 'all',
|
|
||||||
arrowParens: 'avoid',
|
|
||||||
printWidth: 120,
|
|
||||||
semi: false,
|
|
||||||
}
|
|
||||||
500
.untranslated-messages.json
Normal file
@ -0,0 +1,500 @@
|
|||||||
|
{
|
||||||
|
"ar": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ca": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"cs": [
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsMusicName",
|
||||||
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
|
"settingsMusicOptionsScrobbleDescriptionOn",
|
||||||
|
"settingsMusicOptionsScrobbleTitle",
|
||||||
|
"settingsNetworkOptionsMaxBufferTitle",
|
||||||
|
"settingsNetworkOptionsMinBufferTitle",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn"
|
||||||
|
],
|
||||||
|
|
||||||
|
"da": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"actionsStar",
|
||||||
|
"actionsUnstar",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterStarred",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAdded",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByFrequentlyPlayed",
|
||||||
|
"resourcesSortByRecentlyPlayed",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName",
|
||||||
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff",
|
||||||
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn",
|
||||||
|
"settingsServersOptionsForcePlaintextPasswordTitle"
|
||||||
|
],
|
||||||
|
|
||||||
|
"de": [
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog"
|
||||||
|
],
|
||||||
|
|
||||||
|
"es": [
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"fr": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"it": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"ja": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"actionsStar",
|
||||||
|
"actionsUnstar",
|
||||||
|
"controlsShuffle",
|
||||||
|
"messagesNothingHere",
|
||||||
|
"resourcesAlbumActionsPlay",
|
||||||
|
"resourcesAlbumActionsView",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesAlbumListsSort",
|
||||||
|
"resourcesArtistActionsView",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesArtistListsSort",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterGenre",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistActionsPlay",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesQueueName",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAdded",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByArtist",
|
||||||
|
"resourcesSortByName",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"resourcesSortByYear",
|
||||||
|
"searchHeaderTitle",
|
||||||
|
"searchMoreResults",
|
||||||
|
"searchNowPlayingContext",
|
||||||
|
"settingsAboutActionsLicenses",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutName",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsAboutVersion",
|
||||||
|
"settingsMusicOptionsScrobbleDescriptionOff",
|
||||||
|
"settingsMusicOptionsScrobbleDescriptionOn",
|
||||||
|
"settingsMusicOptionsScrobbleTitle",
|
||||||
|
"settingsNetworkOptionsMaxBitrateMobileTitle",
|
||||||
|
"settingsNetworkOptionsMaxBitrateWifiTitle",
|
||||||
|
"settingsNetworkOptionsMaxBufferTitle",
|
||||||
|
"settingsNetworkOptionsMinBufferTitle",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsNetworkValuesKbps",
|
||||||
|
"settingsNetworkValuesSeconds",
|
||||||
|
"settingsNetworkValuesUnlimitedKbps",
|
||||||
|
"settingsResetActionsClearImageCache",
|
||||||
|
"settingsServersActionsAdd",
|
||||||
|
"settingsServersActionsDelete",
|
||||||
|
"settingsServersActionsEdit",
|
||||||
|
"settingsServersActionsSave",
|
||||||
|
"settingsServersActionsTestConnection",
|
||||||
|
"settingsServersFieldsAddress",
|
||||||
|
"settingsServersFieldsName",
|
||||||
|
"settingsServersFieldsPassword",
|
||||||
|
"settingsServersFieldsUsername",
|
||||||
|
"settingsServersMessagesConnectionFailed",
|
||||||
|
"settingsServersMessagesConnectionOk",
|
||||||
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOff",
|
||||||
|
"settingsServersOptionsForcePlaintextPasswordDescriptionOn",
|
||||||
|
"settingsServersOptionsForcePlaintextPasswordTitle"
|
||||||
|
],
|
||||||
|
|
||||||
|
"nb": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"pa": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"pl": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"pt": [
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"tr": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"vi": [
|
||||||
|
"actionsCancel",
|
||||||
|
"actionsDelete",
|
||||||
|
"actionsDownload",
|
||||||
|
"actionsDownloadCancel",
|
||||||
|
"actionsDownloadDelete",
|
||||||
|
"actionsOk",
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesFilterAlbum",
|
||||||
|
"resourcesFilterArtist",
|
||||||
|
"resourcesFilterOwner",
|
||||||
|
"resourcesFilterYear",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"resourcesSongListDeleteAllContent",
|
||||||
|
"resourcesSongListDeleteAllTitle",
|
||||||
|
"resourcesSortByAlbum",
|
||||||
|
"resourcesSortByAlbumCount",
|
||||||
|
"resourcesSortByTitle",
|
||||||
|
"resourcesSortByUpdated",
|
||||||
|
"settingsAboutActionsSupport",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
],
|
||||||
|
|
||||||
|
"zh": [
|
||||||
|
"controlsShuffle",
|
||||||
|
"resourcesAlbumCount",
|
||||||
|
"resourcesArtistCount",
|
||||||
|
"resourcesPlaylistCount",
|
||||||
|
"resourcesSongCount",
|
||||||
|
"settingsAboutShareLogs",
|
||||||
|
"settingsAboutChooseLog",
|
||||||
|
"settingsNetworkOptionsOfflineMode",
|
||||||
|
"settingsNetworkOptionsOfflineModeOff",
|
||||||
|
"settingsNetworkOptionsOfflineModeOn",
|
||||||
|
"settingsNetworkOptionsStreamFormat",
|
||||||
|
"settingsNetworkOptionsStreamFormatServerDefault",
|
||||||
|
"settingsServersFieldsName"
|
||||||
|
]
|
||||||
|
}
|
||||||
26
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "debug",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "dart",
|
||||||
|
"flutterMode": "debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "profile mode",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "dart",
|
||||||
|
"flutterMode": "profile"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "release mode",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "dart",
|
||||||
|
"flutterMode": "release"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1 +0,0 @@
|
|||||||
{}
|
|
||||||
0
BUILDING.md
Normal file
9
PRIVACY.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Privacy Policy
|
||||||
|
|
||||||
|
Subtracks does not contain advertisements, and does not collect personal data. I am not interested in advertisements or your personal data at all. There is no Subtracks server for any data to be sent to, so no information is ever transmitted to me or stored by me outside of your device in any way.
|
||||||
|
|
||||||
|
The only data that is stored on your device is information about the music on the servers that you choose to connect to. Data that is transmitted to those servers is subject to that server's privacy policy, and I do not collect or store it.
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
If you have any questions about this policy, you may contact me at: subtracks(@)functionkey(.)xyz
|
||||||
71
README.md
@ -1,23 +1,44 @@
|
|||||||
<img src="assets/header.png" alt="subtracks logo" width="500"/>
|
<div align="center">
|
||||||
|
|
||||||
#
|
<img src=".assets/header.png" alt="subtracks logo" width="500"/>
|
||||||
Subtracks is an Android open source music streaming app for [Subsonic-API-compatible](http://www.subsonic.org/pages/api.jsp) servers ([Subsonic](http://www.subsonic.org/pages/index.jsp), [Navidrome](https://www.navidrome.org/), [Airsonic](https://airsonic.github.io/), and more). It's designed to give you clean and convenient access to your music in the style of modern media players.
|
|
||||||
|
|
||||||
# Screenshots
|
#
|
||||||
<p float="left">
|
|
||||||
<img src="assets/screenshots/01_home.png" alt="home" width="200"/>
|
|
||||||
<img src="assets/screenshots/02_now-playing.png" alt="now playing" width="200"/>
|
|
||||||
<img src="assets/screenshots/03_library-albums.png" alt="library albums" width="200"/>
|
|
||||||
<img src="assets/screenshots/04_album.png" alt="album view" width="200"/>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
# Download
|
#### Subtracks is an Android open source music streaming app for [Subsonic-compatible](http://www.subsonic.org/pages/api.jsp) servers ([Subsonic](http://www.subsonic.org/pages/index.jsp), [Navidrome](https://www.navidrome.org/), [Airsonic](https://airsonic.github.io/), and more). It's designed to give you clean and convenient access to your music in the style of modern media players.
|
||||||
<p float="left">
|
|
||||||
<a href="https://github.com/austinried/subtracks/releases/latest" disabled><img src="assets/github-badge.png" width="250"/></a>
|

|
||||||
</p>
|
[](https://github.com/austinried/subtracks/releases/latest/)
|
||||||
|
[](https://f-droid.org/en/packages/com.subtracks)
|
||||||
|
[](https://github.com/austinried/subtracks/releases/)
|
||||||
|
[](https://github.com/austinried/subtracks/stargazers)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
## 📱 Screenshots
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img src="metadata/en-US/images/phoneScreenshots/01_home.png" alt="home" width="200"/>
|
||||||
|
<img src="metadata/en-US/images/phoneScreenshots/02_now-playing.png" alt="now playing" width="200"/>
|
||||||
|
<img src="metadata/en-US/images/phoneScreenshots/03_library-albums.png" alt="library albums" width="200"/>
|
||||||
|
<img src="metadata/en-US/images/phoneScreenshots/04_album.png" alt="album view" width="200"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## ⬇️ Download
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<a href="https://play.google.com/store/apps/details?id=com.subtracks"><img src=".assets/google-play-badge.png" width="250"/></a>
|
||||||
|
<a href="https://f-droid.org/en/packages/com.subtracks/"><img src=".assets/f-droid-badge.png" width="250"></a>
|
||||||
|
<a href="https://github.com/austinried/subtracks/releases/"><img src=".assets/github-badge.png" width="250"/></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
>**Warning**
|
||||||
|
>
|
||||||
|
>Each download source above is signed with a different key, so you cannot switch between them without first uninstalling and then re-installing the app.
|
||||||
|
|
||||||
|
## ✨ Features
|
||||||
|
|
||||||
# Features
|
|
||||||
- Album and artist art display by default (full-res in detail/now playing views)
|
- Album and artist art display by default (full-res in detail/now playing views)
|
||||||
|
- Gapless playback
|
||||||
- Mulitple server support
|
- Mulitple server support
|
||||||
- Filterable/sortable album and artist library views
|
- Filterable/sortable album and artist library views
|
||||||
- Search artists, albums, and songs
|
- Search artists, albums, and songs
|
||||||
@ -26,7 +47,8 @@ Subtracks is an Android open source music streaming app for [Subsonic-API-compat
|
|||||||
- Loop and shuffle playback options
|
- Loop and shuffle playback options
|
||||||
- Long-press for context menu shortcuts
|
- Long-press for context menu shortcuts
|
||||||
|
|
||||||
# Coming Soon™
|
## 🔜 Coming Soon™
|
||||||
|
|
||||||
- Offline support
|
- Offline support
|
||||||
- Customizable home screen categories
|
- Customizable home screen categories
|
||||||
- Browse by folder support (currently only browses by tags)
|
- Browse by folder support (currently only browses by tags)
|
||||||
@ -36,3 +58,20 @@ Subtracks is an Android open source music streaming app for [Subsonic-API-compat
|
|||||||
- Queue management (add/remove/sort)
|
- Queue management (add/remove/sort)
|
||||||
- Multi-select actions
|
- Multi-select actions
|
||||||
- Performance & animation improvements
|
- Performance & animation improvements
|
||||||
|
- More shuffle play modes
|
||||||
|
|
||||||
|
## ⚙️ Building
|
||||||
|
|
||||||
|
See [Building from source](BUILDING.md).
|
||||||
|
|
||||||
|
## 🔤 Translations
|
||||||
|
|
||||||
|
Want to see Subtracks in your language? Visit the project on [Weblate](https://hosted.weblate.org/engage/subtracks/) to help!
|
||||||
|
|
||||||
|
<a href="https://hosted.weblate.org/engage/subtracks/">
|
||||||
|
<img src="https://hosted.weblate.org/widgets/subtracks/-/subtracks/multi-auto.svg" alt="Translation status" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## 📃 License
|
||||||
|
|
||||||
|
[](https://github.com/austinried/subtracks/blob/main/LICENSE)
|
||||||
|
|||||||
30
TODO.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
## To-do
|
||||||
|
- Star/unstar
|
||||||
|
- Context menus
|
||||||
|
- Download actions for song
|
||||||
|
- Playlist management
|
||||||
|
- Add to playlist (from context)
|
||||||
|
- Queue management
|
||||||
|
- View playing queue
|
||||||
|
- Re-order queue
|
||||||
|
- Add to queue (from context)
|
||||||
|
- Remove from queue
|
||||||
|
- Scrobbling
|
||||||
|
- Library filters (year/genre/etc)
|
||||||
|
- Library list display modes
|
||||||
|
- Search
|
||||||
|
- Individual "more" results pages
|
||||||
|
- Now playing gestures
|
||||||
|
- Swipe bar/album to skip
|
||||||
|
- Double-tap to seek forward/back (bar only)
|
||||||
|
- Settings
|
||||||
|
- Music
|
||||||
|
- Scrobble
|
||||||
|
- Downloads
|
||||||
|
- Used/available space
|
||||||
|
- Clear downloads
|
||||||
|
- Clear images
|
||||||
|
- About
|
||||||
|
- Licenses
|
||||||
|
- Welcome/setup flow
|
||||||
|
- Proper loading screen/animation
|
||||||
19
analysis_options.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
|
linter:
|
||||||
|
rules:
|
||||||
|
prefer_relative_imports: true
|
||||||
|
|
||||||
|
analyzer:
|
||||||
|
exclude:
|
||||||
|
- '**.freezed.dart'
|
||||||
|
- '**.g.dart'
|
||||||
|
- '**.gr.dart'
|
||||||
|
plugins:
|
||||||
|
# broken currently and may not get fixed
|
||||||
|
# https://github.com/simolus3/drift/issues/2342
|
||||||
|
# - drift
|
||||||
|
|
||||||
|
# also broken but only recently reported
|
||||||
|
# https://github.com/rrousselGit/riverpod/issues/2180
|
||||||
|
# - custom_lint
|
||||||
13
android/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
gradle-wrapper.jar
|
||||||
|
/.gradle
|
||||||
|
/captures/
|
||||||
|
/gradlew
|
||||||
|
/gradlew.bat
|
||||||
|
/local.properties
|
||||||
|
GeneratedPluginRegistrant.java
|
||||||
|
|
||||||
|
# Remember to never publicly share your keystore.
|
||||||
|
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||||
|
key.properties
|
||||||
|
**/*.keystore
|
||||||
|
**/*.jks
|
||||||
@ -1,55 +0,0 @@
|
|||||||
# To learn about Buck see [Docs](https://buckbuild.com/).
|
|
||||||
# To run your application with Buck:
|
|
||||||
# - install Buck
|
|
||||||
# - `npm start` - to start the packager
|
|
||||||
# - `cd android`
|
|
||||||
# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
|
|
||||||
# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
|
|
||||||
# - `buck install -r android/app` - compile, install and run application
|
|
||||||
#
|
|
||||||
|
|
||||||
load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
|
|
||||||
|
|
||||||
lib_deps = []
|
|
||||||
|
|
||||||
create_aar_targets(glob(["libs/*.aar"]))
|
|
||||||
|
|
||||||
create_jar_targets(glob(["libs/*.jar"]))
|
|
||||||
|
|
||||||
android_library(
|
|
||||||
name = "all-libs",
|
|
||||||
exported_deps = lib_deps,
|
|
||||||
)
|
|
||||||
|
|
||||||
android_library(
|
|
||||||
name = "app-code",
|
|
||||||
srcs = glob([
|
|
||||||
"src/main/java/**/*.java",
|
|
||||||
]),
|
|
||||||
deps = [
|
|
||||||
":all-libs",
|
|
||||||
":build_config",
|
|
||||||
":res",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
android_build_config(
|
|
||||||
name = "build_config",
|
|
||||||
package = "com.subtracks",
|
|
||||||
)
|
|
||||||
|
|
||||||
android_resource(
|
|
||||||
name = "res",
|
|
||||||
package = "com.subtracks",
|
|
||||||
res = "src/main/res",
|
|
||||||
)
|
|
||||||
|
|
||||||
android_binary(
|
|
||||||
name = "app",
|
|
||||||
keystore = "//android/keystores:debug",
|
|
||||||
manifest = "src/main/AndroidManifest.xml",
|
|
||||||
package_type = "debug",
|
|
||||||
deps = [
|
|
||||||
":app-code",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
@ -1,305 +1,88 @@
|
|||||||
apply plugin: "com.android.application"
|
def localProperties = new Properties()
|
||||||
|
def localPropertiesFile = rootProject.file('local.properties')
|
||||||
|
if (localPropertiesFile.exists()) {
|
||||||
|
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||||
|
localProperties.load(reader)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
import com.android.build.OutputFile
|
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||||
|
if (flutterRoot == null) {
|
||||||
|
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||||
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
|
if (flutterVersionCode == null) {
|
||||||
* and bundleReleaseJsAndAssets).
|
flutterVersionCode = '1'
|
||||||
* These basically call `react-native bundle` with the correct arguments during the Android build
|
}
|
||||||
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
|
|
||||||
* bundle directly from the development server. Below you can see all the possible configurations
|
|
||||||
* and their defaults. If you decide to add a configuration block, make sure to add it before the
|
|
||||||
* `apply from: "../../node_modules/react-native/react.gradle"` line.
|
|
||||||
*
|
|
||||||
* project.ext.react = [
|
|
||||||
* // the name of the generated asset file containing your JS bundle
|
|
||||||
* bundleAssetName: "index.android.bundle",
|
|
||||||
*
|
|
||||||
* // the entry file for bundle generation. If none specified and
|
|
||||||
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
|
|
||||||
* // default. Can be overridden with ENTRY_FILE environment variable.
|
|
||||||
* entryFile: "index.android.js",
|
|
||||||
*
|
|
||||||
* // https://reactnative.dev/docs/performance#enable-the-ram-format
|
|
||||||
* bundleCommand: "ram-bundle",
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in debug mode
|
|
||||||
* bundleInDebug: false,
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in release mode
|
|
||||||
* bundleInRelease: true,
|
|
||||||
*
|
|
||||||
* // whether to bundle JS and assets in another build variant (if configured).
|
|
||||||
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
|
|
||||||
* // The configuration property can be in the following formats
|
|
||||||
* // 'bundleIn${productFlavor}${buildType}'
|
|
||||||
* // 'bundleIn${buildType}'
|
|
||||||
* // bundleInFreeDebug: true,
|
|
||||||
* // bundleInPaidRelease: true,
|
|
||||||
* // bundleInBeta: true,
|
|
||||||
*
|
|
||||||
* // whether to disable dev mode in custom build variants (by default only disabled in release)
|
|
||||||
* // for example: to disable dev mode in the staging build type (if configured)
|
|
||||||
* devDisabledInStaging: true,
|
|
||||||
* // The configuration property can be in the following formats
|
|
||||||
* // 'devDisabledIn${productFlavor}${buildType}'
|
|
||||||
* // 'devDisabledIn${buildType}'
|
|
||||||
*
|
|
||||||
* // the root of your project, i.e. where "package.json" lives
|
|
||||||
* root: "../../",
|
|
||||||
*
|
|
||||||
* // where to put the JS bundle asset in debug mode
|
|
||||||
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
|
|
||||||
*
|
|
||||||
* // where to put the JS bundle asset in release mode
|
|
||||||
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
|
|
||||||
*
|
|
||||||
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
||||||
* // require('./image.png')), in debug mode
|
|
||||||
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
|
|
||||||
*
|
|
||||||
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
||||||
* // require('./image.png')), in release mode
|
|
||||||
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
|
|
||||||
*
|
|
||||||
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
|
|
||||||
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
|
|
||||||
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
|
|
||||||
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
|
|
||||||
* // for example, you might want to remove it from here.
|
|
||||||
* inputExcludes: ["android/**", "ios/**"],
|
|
||||||
*
|
|
||||||
* // override which node gets called and with what additional arguments
|
|
||||||
* nodeExecutableAndArgs: ["node"],
|
|
||||||
*
|
|
||||||
* // supply additional arguments to the packager
|
|
||||||
* extraPackagerArgs: []
|
|
||||||
* ]
|
|
||||||
*/
|
|
||||||
|
|
||||||
project.ext.react = [
|
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||||
enableHermes: true, // clean and rebuild if changing
|
if (flutterVersionName == null) {
|
||||||
]
|
flutterVersionName = '1.0'
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "../../node_modules/react-native/react.gradle"
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||||
|
|
||||||
/**
|
def keystoreProperties = new Properties()
|
||||||
* Set this to true to create two separate APKs instead of one:
|
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||||
* - An APK that only works on ARM devices
|
if (keystorePropertiesFile.exists()) {
|
||||||
* - An APK that only works on x86 devices
|
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||||
* The advantage is the size of the APK is reduced by about 4MB.
|
}
|
||||||
* Upload all the APKs to the Play Store and people will download
|
|
||||||
* the correct one based on the CPU architecture of their device.
|
|
||||||
*/
|
|
||||||
def enableSeparateBuildPerCPUArchitecture = false
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run Proguard to shrink the Java bytecode in release builds.
|
|
||||||
*/
|
|
||||||
def enableProguardInReleaseBuilds = true
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The preferred build flavor of JavaScriptCore.
|
|
||||||
*
|
|
||||||
* For example, to use the international variant, you can use:
|
|
||||||
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
|
||||||
*
|
|
||||||
* The international variant includes ICU i18n library and necessary data
|
|
||||||
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
|
||||||
* give correct results when using with locales other than en-US. Note that
|
|
||||||
* this variant is about 6MiB larger per architecture than default.
|
|
||||||
*/
|
|
||||||
def jscFlavor = 'org.webkit:android-jsc:+'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether to enable the Hermes VM.
|
|
||||||
*
|
|
||||||
* This should be set on project.ext.react and mirrored here. If it is not set
|
|
||||||
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
|
|
||||||
* and the benefits of using Hermes will therefore be sharply reduced.
|
|
||||||
*/
|
|
||||||
def enableHermes = project.ext.react.get("enableHermes", false);
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
ndkVersion rootProject.ext.ndkVersion
|
compileSdkVersion flutter.compileSdkVersion
|
||||||
|
ndkVersion flutter.ndkVersion
|
||||||
compileSdkVersion rootProject.ext.compileSdkVersion
|
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = '1.8'
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.subtracks"
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
applicationId "com.subtracks2"
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
// You can update the following values to match your application needs.
|
||||||
versionCode 1
|
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||||
versionName '0.1.0'
|
minSdkVersion 19
|
||||||
}
|
targetSdkVersion flutter.targetSdkVersion
|
||||||
splits {
|
versionCode flutterVersionCode.toInteger()
|
||||||
abi {
|
versionName flutterVersionName
|
||||||
reset()
|
|
||||||
enable enableSeparateBuildPerCPUArchitecture
|
|
||||||
universalApk false // If true, also generate a universal APK
|
|
||||||
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
debug {
|
release {
|
||||||
storeFile file('debug.keystore')
|
keyAlias keystoreProperties['keyAlias']
|
||||||
storePassword 'android'
|
keyPassword keystoreProperties['keyPassword']
|
||||||
keyAlias 'androiddebugkey'
|
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
|
||||||
keyPassword 'android'
|
storePassword keystoreProperties['storePassword']
|
||||||
}
|
}
|
||||||
release {
|
}
|
||||||
if (project.hasProperty("SUBTRACKS_UPLOAD_STORE_FILE")) {
|
|
||||||
storeFile file(SUBTRACKS_UPLOAD_STORE_FILE)
|
|
||||||
storePassword SUBTRACKS_UPLOAD_STORE_PASSWORD
|
|
||||||
keyAlias SUBTRACKS_UPLOAD_KEY_ALIAS
|
|
||||||
keyPassword SUBTRACKS_UPLOAD_KEY_PASSWORD
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
debug {
|
|
||||||
signingConfig signingConfigs.debug
|
|
||||||
}
|
|
||||||
release {
|
release {
|
||||||
if (project.hasProperty("signReleaseWithDebug")) {
|
if (project.hasProperty("signRelease")) {
|
||||||
signingConfig signingConfigs.debug
|
|
||||||
} else {
|
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
|
} else {
|
||||||
|
signingConfig signingConfigs.debug
|
||||||
}
|
}
|
||||||
minifyEnabled enableProguardInReleaseBuilds
|
|
||||||
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// applicationVariants are e.g. debug, release
|
flutter {
|
||||||
applicationVariants.all { variant ->
|
source '../..'
|
||||||
variant.outputs.each { output ->
|
|
||||||
// For each separate APK per architecture, set a unique version code as described here:
|
|
||||||
// https://developer.android.com/studio/build/configure-apk-splits.html
|
|
||||||
// Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
|
|
||||||
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
|
|
||||||
def abi = output.getFilter(OutputFile.ABI)
|
|
||||||
if (abi != null) { // null for the universal-debug, universal-release variants
|
|
||||||
output.versionCodeOverride =
|
|
||||||
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
//noinspection GradleDynamicVersion
|
|
||||||
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
||||||
|
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
|
|
||||||
|
|
||||||
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.fbjni'
|
|
||||||
}
|
|
||||||
|
|
||||||
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.flipper'
|
|
||||||
exclude group:'com.squareup.okhttp3', module:'okhttp'
|
|
||||||
}
|
|
||||||
|
|
||||||
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
|
|
||||||
exclude group:'com.facebook.flipper'
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enableHermes) {
|
|
||||||
def hermesPath = "../../node_modules/hermes-engine/android/";
|
|
||||||
debugImplementation files(hermesPath + "hermes-debug.aar")
|
|
||||||
releaseImplementation files(hermesPath + "hermes-release.aar")
|
|
||||||
} else {
|
|
||||||
implementation jscFlavor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run this once to be able to run the application with BUCK
|
|
||||||
// puts all compile dependencies into folder libs for BUCK to use
|
|
||||||
task copyDownloadableDepsToLibs(type: Copy) {
|
|
||||||
from configurations.compile
|
|
||||||
into 'libs'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
|
||||||
|
|
||||||
class Version {
|
|
||||||
|
|
||||||
private int major
|
|
||||||
private int minor
|
|
||||||
private int patch
|
|
||||||
private int code
|
|
||||||
|
|
||||||
Version(int code, String version) {
|
|
||||||
this.code = code
|
|
||||||
|
|
||||||
def (major, minor, patch) = version.tokenize('.')
|
|
||||||
this.major = major.toInteger()
|
|
||||||
this.minor = minor.toInteger()
|
|
||||||
this.patch = patch.toInteger()
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
void bumpMajor() {
|
|
||||||
major += 1
|
|
||||||
minor = 0
|
|
||||||
patch = 0
|
|
||||||
|
|
||||||
code += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
void bumpMinor() {
|
|
||||||
minor += 1
|
|
||||||
patch = 0
|
|
||||||
|
|
||||||
code += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
void bumpPatch() {
|
|
||||||
patch += 1
|
|
||||||
code += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
String getName() { "$major.$minor.$patch" }
|
|
||||||
|
|
||||||
int getCode() { code }
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.addRule("Pattern: bump<TYPE>Version") { String taskName ->
|
|
||||||
if (taskName.matches("bump(Major|Minor|Patch)Version")) {
|
|
||||||
task(taskName) {
|
|
||||||
doLast {
|
|
||||||
String type = (taskName - 'bump' - 'Version')
|
|
||||||
|
|
||||||
println "Bumping ${type.toLowerCase()} version…"
|
|
||||||
|
|
||||||
int oldVersionCode = android.defaultConfig.versionCode
|
|
||||||
String oldVersionName = android.defaultConfig.versionName
|
|
||||||
|
|
||||||
version = new Version(oldVersionCode, oldVersionName)
|
|
||||||
version."bump$type"()
|
|
||||||
|
|
||||||
String newVersionName = version.getName()
|
|
||||||
String newVersionCode = version.getCode()
|
|
||||||
|
|
||||||
println "$oldVersionName ($oldVersionCode) → $newVersionName ($newVersionCode)"
|
|
||||||
|
|
||||||
def updated = buildFile.getText()
|
|
||||||
updated = updated.replaceFirst("versionName '$oldVersionName'", "versionName '$newVersionName'")
|
|
||||||
updated = updated.replaceFirst("versionCode $oldVersionCode", "versionCode $newVersionCode")
|
|
||||||
|
|
||||||
buildFile.setText(updated)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,19 +0,0 @@
|
|||||||
"""Helper definitions to glob .aar and .jar targets"""
|
|
||||||
|
|
||||||
def create_aar_targets(aarfiles):
|
|
||||||
for aarfile in aarfiles:
|
|
||||||
name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
|
|
||||||
lib_deps.append(":" + name)
|
|
||||||
android_prebuilt_aar(
|
|
||||||
name = name,
|
|
||||||
aar = aarfile,
|
|
||||||
)
|
|
||||||
|
|
||||||
def create_jar_targets(jarfiles):
|
|
||||||
for jarfile in jarfiles:
|
|
||||||
name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
|
|
||||||
lib_deps.append(":" + name)
|
|
||||||
prebuilt_jar(
|
|
||||||
name = name,
|
|
||||||
binary_jar = jarfile,
|
|
||||||
)
|
|
||||||
12
android/app/proguard-rules.pro
vendored
@ -1,12 +0,0 @@
|
|||||||
# Add project specific ProGuard rules here.
|
|
||||||
# By default, the flags in this file are appended to flags specified
|
|
||||||
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
|
|
||||||
# You can edit the include path and order by changing the proguardFiles
|
|
||||||
# directive in build.gradle.
|
|
||||||
#
|
|
||||||
# For more details, see
|
|
||||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
|
||||||
|
|
||||||
# Add any project specific keep options here:
|
|
||||||
|
|
||||||
-keep class com.facebook.react.turbomodule.** { *; }
|
|
||||||
@ -1,13 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
package="com.subtracks2">
|
||||||
|
<!-- The INTERNET permission is required for development. Specifically,
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
the Flutter tool needs it to communicate with the running application
|
||||||
|
to allow setting breakpoints, to provide hot reload, etc.
|
||||||
<application
|
-->
|
||||||
android:usesCleartextTraffic="true"
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
tools:targetApi="28"
|
|
||||||
tools:ignore="GoogleAppIndexingWarning">
|
|
||||||
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
|
|
||||||
</application>
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@ -1,72 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
||||||
*
|
|
||||||
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
|
|
||||||
* directory of this source tree.
|
|
||||||
*/
|
|
||||||
package com.subtracks;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import com.facebook.flipper.android.AndroidFlipperClient;
|
|
||||||
import com.facebook.flipper.android.utils.FlipperUtils;
|
|
||||||
import com.facebook.flipper.core.FlipperClient;
|
|
||||||
import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
|
|
||||||
import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.inspector.DescriptorMapping;
|
|
||||||
import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
|
|
||||||
import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
|
|
||||||
import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
|
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.bridge.ReactContext;
|
|
||||||
import com.facebook.react.modules.network.NetworkingModule;
|
|
||||||
import okhttp3.OkHttpClient;
|
|
||||||
|
|
||||||
public class ReactNativeFlipper {
|
|
||||||
public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
|
|
||||||
if (FlipperUtils.shouldEnableFlipper(context)) {
|
|
||||||
final FlipperClient client = AndroidFlipperClient.getInstance(context);
|
|
||||||
|
|
||||||
client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
|
|
||||||
client.addPlugin(new ReactFlipperPlugin());
|
|
||||||
client.addPlugin(new DatabasesFlipperPlugin(context));
|
|
||||||
client.addPlugin(new SharedPreferencesFlipperPlugin(context));
|
|
||||||
client.addPlugin(CrashReporterPlugin.getInstance());
|
|
||||||
|
|
||||||
NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
|
|
||||||
NetworkingModule.setCustomClientBuilder(
|
|
||||||
new NetworkingModule.CustomClientBuilder() {
|
|
||||||
@Override
|
|
||||||
public void apply(OkHttpClient.Builder builder) {
|
|
||||||
builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
client.addPlugin(networkFlipperPlugin);
|
|
||||||
client.start();
|
|
||||||
|
|
||||||
// Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
|
|
||||||
// Hence we run if after all native modules have been initialized
|
|
||||||
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
|
|
||||||
if (reactContext == null) {
|
|
||||||
reactInstanceManager.addReactInstanceEventListener(
|
|
||||||
new ReactInstanceManager.ReactInstanceEventListener() {
|
|
||||||
@Override
|
|
||||||
public void onReactContextInitialized(ReactContext reactContext) {
|
|
||||||
reactInstanceManager.removeReactInstanceEventListener(this);
|
|
||||||
reactContext.runOnNativeModulesQueueThread(
|
|
||||||
new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
client.addPlugin(new FrescoFlipperPlugin());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
client.addPlugin(new FrescoFlipperPlugin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,17 +1,72 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.subtracks">
|
<manifest
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme" android:usesCleartextTraffic="true">
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustPan">
|
package="com.subtracks2">
|
||||||
<intent-filter>
|
<application
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
android:label="subtracks"
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
android:name="${applicationName}"
|
||||||
</intent-filter>
|
android:icon="@mipmap/ic_launcher"
|
||||||
<intent-filter>
|
android:usesCleartextTraffic="true">
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<activity
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
android:name="com.ryanheise.audioservice.AudioServiceActivity"
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
android:exported="true"
|
||||||
<data android:scheme="trackplayer"/>
|
android:launchMode="singleTop"
|
||||||
</intent-filter>
|
android:theme="@style/LaunchTheme"
|
||||||
</activity>
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
</application>
|
android:hardwareAccelerated="true"
|
||||||
</manifest>
|
android:windowSoftInputMode="adjustResize">
|
||||||
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
|
the Android process has started. This theme is visible to the user
|
||||||
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
|
to determine the Window background behind the Flutter UI. -->
|
||||||
|
<meta-data
|
||||||
|
android:name="io.flutter.embedding.android.NormalTheme"
|
||||||
|
android:resource="@style/NormalTheme" />
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<service
|
||||||
|
android:name="com.ryanheise.audioservice.AudioService"
|
||||||
|
android:foregroundServiceType="mediaPlayback"
|
||||||
|
android:exported="true"
|
||||||
|
tools:ignore="Instantiatable">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.media.browse.MediaBrowserService" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
<service
|
||||||
|
android:name="com.ryanheise.audioservice.AudioService"
|
||||||
|
android:foregroundServiceType="mediaPlayback"
|
||||||
|
android:exported="true"
|
||||||
|
tools:ignore="Instantiatable">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.media.browse.MediaBrowserService" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
<receiver
|
||||||
|
android:name="com.ryanheise.audioservice.MediaButtonReceiver"
|
||||||
|
android:exported="true"
|
||||||
|
tools:ignore="Instantiatable">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
<!-- Don't delete the meta-data below.
|
||||||
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
|
<meta-data
|
||||||
|
android:name="flutterEmbedding"
|
||||||
|
android:value="2" />
|
||||||
|
<!-- <meta-data
|
||||||
|
android:name="io.flutter.embedding.android.EnableImpeller"
|
||||||
|
android:value="true" /> -->
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
<!-- audio_service -->
|
||||||
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
</manifest>
|
||||||
|
|||||||
BIN
android/app/src/main/ic_launcher-playstore.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
@ -1,21 +0,0 @@
|
|||||||
package com.subtracks;
|
|
||||||
|
|
||||||
import com.facebook.react.ReactActivity;
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
public class MainActivity extends ReactActivity {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the main component registered from JavaScript. This is used to schedule
|
|
||||||
* rendering of the component.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected String getMainComponentName() {
|
|
||||||
return "subtracks";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,93 +0,0 @@
|
|||||||
package com.subtracks;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
import android.content.Context;
|
|
||||||
import com.facebook.react.PackageList;
|
|
||||||
import com.facebook.react.ReactApplication;
|
|
||||||
import com.reactnativecommunity.netinfo.NetInfoPackage;
|
|
||||||
import com.oblador.vectoricons.VectorIconsPackage;
|
|
||||||
import com.rnfs.RNFSPackage;
|
|
||||||
import com.facebook.react.ReactInstanceManager;
|
|
||||||
import com.facebook.react.ReactNativeHost;
|
|
||||||
import com.facebook.react.ReactPackage;
|
|
||||||
import com.facebook.soloader.SoLoader;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
// for reanimated
|
|
||||||
import com.facebook.react.bridge.JSIModulePackage;
|
|
||||||
import com.swmansion.reanimated.ReanimatedJSIModulePackage;
|
|
||||||
|
|
||||||
public class MainApplication extends Application implements ReactApplication {
|
|
||||||
|
|
||||||
private final ReactNativeHost mReactNativeHost =
|
|
||||||
new ReactNativeHost(this) {
|
|
||||||
@Override
|
|
||||||
public boolean getUseDeveloperSupport() {
|
|
||||||
return BuildConfig.DEBUG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<ReactPackage> getPackages() {
|
|
||||||
@SuppressWarnings("UnnecessaryLocalVariable")
|
|
||||||
List<ReactPackage> packages = new PackageList(this).getPackages();
|
|
||||||
// Packages that cannot be autolinked yet can be added manually here, for example:
|
|
||||||
// packages.add(new MyReactNativePackage());
|
|
||||||
return packages;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getJSMainModuleName() {
|
|
||||||
return "index";
|
|
||||||
}
|
|
||||||
|
|
||||||
// for reanimated
|
|
||||||
@Override
|
|
||||||
protected JSIModulePackage getJSIModulePackage() {
|
|
||||||
return new ReanimatedJSIModulePackage();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ReactNativeHost getReactNativeHost() {
|
|
||||||
return mReactNativeHost;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
SoLoader.init(this, /* native exopackage */ false);
|
|
||||||
initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads Flipper in React Native templates. Call this in the onCreate method with something like
|
|
||||||
* initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param reactInstanceManager
|
|
||||||
*/
|
|
||||||
private static void initializeFlipper(
|
|
||||||
Context context, ReactInstanceManager reactInstanceManager) {
|
|
||||||
if (BuildConfig.DEBUG) {
|
|
||||||
try {
|
|
||||||
/*
|
|
||||||
We use reflection here to pick up the class that initializes Flipper,
|
|
||||||
since Flipper library is not available in release mode
|
|
||||||
*/
|
|
||||||
Class<?> aClass = Class.forName("com.subtracks.ReactNativeFlipper");
|
|
||||||
aClass
|
|
||||||
.getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
|
|
||||||
.invoke(null, context, reactInstanceManager);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
// Generated file.
|
||||||
|
//
|
||||||
|
// If you wish to remove Flutter's multidex support, delete this entire file.
|
||||||
|
//
|
||||||
|
// Modifications to this file should be done in a copy under a different name
|
||||||
|
// as this file may be regenerated.
|
||||||
|
|
||||||
|
package io.flutter.app;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
import androidx.annotation.CallSuper;
|
||||||
|
import androidx.multidex.MultiDex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension of {@link android.app.Application}, adding multidex support.
|
||||||
|
*/
|
||||||
|
public class FlutterMultiDexApplication extends Application {
|
||||||
|
@Override
|
||||||
|
@CallSuper
|
||||||
|
protected void attachBaseContext(Context base) {
|
||||||
|
super.attachBaseContext(base);
|
||||||
|
MultiDex.install(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package com.subtracks2
|
||||||
|
|
||||||
|
import io.flutter.embedding.android.FlutterActivity
|
||||||
|
|
||||||
|
class MainActivity: FlutterActivity() {
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="299.84"
|
||||||
|
android:viewportHeight="219.51"
|
||||||
|
android:tint="#FFFFFF">
|
||||||
|
<group android:scaleX="0.92"
|
||||||
|
android:scaleY="0.6735232"
|
||||||
|
android:translateX="11.9936"
|
||||||
|
android:translateY="35.83246">
|
||||||
|
<path
|
||||||
|
android:pathData="m23.84,-0c-12.76,0 -23.44,13 -23.65,25.12 -0.42,79.03 0,160.73 0,170.4 0,12.59 9.8,23.99 23.41,23.99l253.58,0c11.4,0 22.66,-12.38 22.66,-22.79L299.84,24.12c0,-10.8 -10.24,-23.81 -21.84,-23.81 -11.6,0 -254.16,-0.31 -254.16,-0.31zM39.05,25.28c0,0 217.71,0.71 223.67,0.71 6.07,0 12.17,6.83 12.17,12.06l0,142.25c0,8.97 -6.97,14.63 -12.48,14.64l-33.42,0.07c-5.32,0.01 -9.93,-7.19 -11.35,-10.61 -1.89,-4.55 -11.08,-25.75 -12.1,-28.1 -0.6,-1.38 -2.9,-2.83 -5.89,-2.83L98.33,153.45c-2.68,0 -4.89,2.87 -5.67,4.71 -1.12,2.66 -9.02,21.39 -11.63,27.57 -2.73,6.46 -4.37,9.06 -11.47,9.06l-30.97,0c-7.44,0 -13.69,-7.17 -13.67,-15.18l0.28,-139.51c0,-6.88 5.54,-14.83 13.85,-14.83z"
|
||||||
|
android:strokeWidth="0.9"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M90.09,95.03m-32.1,0a32.42,32.1 90,1 1,64.21 0a32.42,32.1 90,1 1,-64.21 0"
|
||||||
|
android:strokeWidth="0.86"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M209.94,95.03m-32.1,0a32.42,32.1 90,1 1,64.21 0a32.42,32.1 90,1 1,-64.21 0"
|
||||||
|
android:strokeWidth="0.86"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
29
android/app/src/main/res/drawable-anydpi/ic_action_name.xml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="299.84"
|
||||||
|
android:viewportHeight="219.51"
|
||||||
|
android:tint="#333333"
|
||||||
|
android:alpha="0.6">
|
||||||
|
<group android:scaleY="0.7320905"
|
||||||
|
android:translateY="29.404413">
|
||||||
|
<path
|
||||||
|
android:pathData="m23.84,-0c-12.76,0 -23.44,13 -23.65,25.12 -0.42,79.03 0,160.73 0,170.4 0,12.59 9.8,23.99 23.41,23.99l253.58,0c11.4,0 22.66,-12.38 22.66,-22.79L299.84,24.12c0,-10.8 -10.24,-23.81 -21.84,-23.81 -11.6,0 -254.16,-0.31 -254.16,-0.31zM39.05,25.28c0,0 217.71,0.71 223.67,0.71 6.07,0 12.17,6.83 12.17,12.06l0,142.25c0,8.97 -6.97,14.63 -12.48,14.64l-33.42,0.07c-5.32,0.01 -9.93,-7.19 -11.35,-10.61 -1.89,-4.55 -11.08,-25.75 -12.1,-28.1 -0.6,-1.38 -2.9,-2.83 -5.89,-2.83L98.33,153.45c-2.68,0 -4.89,2.87 -5.67,4.71 -1.12,2.66 -9.02,21.39 -11.63,27.57 -2.73,6.46 -4.37,9.06 -11.47,9.06l-30.97,0c-7.44,0 -13.69,-7.17 -13.67,-15.18l0.28,-139.51c0,-6.88 5.54,-14.83 13.85,-14.83z"
|
||||||
|
android:strokeWidth="0.9"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M90.09,95.03m-32.1,0a32.42,32.1 90,1 1,64.21 0a32.42,32.1 90,1 1,-64.21 0"
|
||||||
|
android:strokeWidth="0.86"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M209.94,95.03m-32.1,0a32.42,32.1 90,1 1,64.21 0a32.42,32.1 90,1 1,-64.21 0"
|
||||||
|
android:strokeWidth="0.86"
|
||||||
|
android:fillColor="#ffffff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
BIN
android/app/src/main/res/drawable-hdpi/ic_action_name.png
Normal file
|
After Width: | Height: | Size: 441 B |
BIN
android/app/src/main/res/drawable-hdpi/ic_stat_name.png
Normal file
|
After Width: | Height: | Size: 401 B |
BIN
android/app/src/main/res/drawable-mdpi/ic_action_name.png
Normal file
|
After Width: | Height: | Size: 318 B |
BIN
android/app/src/main/res/drawable-mdpi/ic_stat_name.png
Normal file
|
After Width: | Height: | Size: 284 B |
12
android/app/src/main/res/drawable-v21/launch_background.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Modify this file to customize your launch splash screen -->
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="?android:colorBackground" />
|
||||||
|
|
||||||
|
<!-- You can insert your own image assets here -->
|
||||||
|
<!-- <item>
|
||||||
|
<bitmap
|
||||||
|
android:gravity="center"
|
||||||
|
android:src="@mipmap/launch_image" />
|
||||||
|
</item> -->
|
||||||
|
</layer-list>
|
||||||
BIN
android/app/src/main/res/drawable-xhdpi/ic_action_name.png
Normal file
|
After Width: | Height: | Size: 600 B |
BIN
android/app/src/main/res/drawable-xhdpi/ic_stat_name.png
Normal file
|
After Width: | Height: | Size: 575 B |
BIN
android/app/src/main/res/drawable-xxhdpi/ic_action_name.png
Normal file
|
After Width: | Height: | Size: 925 B |
BIN
android/app/src/main/res/drawable-xxhdpi/ic_stat_name.png
Normal file
|
After Width: | Height: | Size: 921 B |
29
android/app/src/main/res/drawable/ic_launcher_foreground.xml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="299.84"
|
||||||
|
android:viewportHeight="219.51">
|
||||||
|
<group android:scaleX="0.43"
|
||||||
|
android:scaleY="0.3147989"
|
||||||
|
android:translateX="85.4544"
|
||||||
|
android:translateY="75.20425">
|
||||||
|
<path
|
||||||
|
android:pathData="m23.84,-0c-12.76,0 -23.44,13 -23.65,25.12 -0.42,79.03 0,160.73 0,170.4 0,12.59 9.8,23.99 23.41,23.99l253.58,0c11.4,0 22.66,-12.38 22.66,-22.79L299.84,24.12c0,-10.8 -10.24,-23.81 -21.84,-23.81 -11.6,0 -254.16,-0.31 -254.16,-0.31zM39.05,25.28c0,0 217.71,0.71 223.67,0.71 6.07,0 12.17,6.83 12.17,12.06l0,142.25c0,8.97 -6.97,14.63 -12.48,14.64l-33.42,0.07c-5.32,0.01 -9.93,-7.19 -11.35,-10.61 -1.89,-4.55 -11.08,-25.75 -12.1,-28.1 -0.6,-1.38 -2.9,-2.83 -5.89,-2.83L98.33,153.45c-2.68,0 -4.89,2.87 -5.67,4.71 -1.12,2.66 -9.02,21.39 -11.63,27.57 -2.73,6.46 -4.37,9.06 -11.47,9.06l-30.97,0c-7.44,0 -13.69,-7.17 -13.67,-15.18l0.28,-139.51c0,-6.88 5.54,-14.83 13.85,-14.83z"
|
||||||
|
android:strokeWidth="0.9"
|
||||||
|
android:fillColor="#f4d9ff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M90.09,95.03m-32.1,0a32.42,32.1 90,1 1,64.21 0a32.42,32.1 90,1 1,-64.21 0"
|
||||||
|
android:strokeWidth="0.86"
|
||||||
|
android:fillColor="#f4d9ff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M209.94,95.03m-32.1,0a32.42,32.1 90,1 1,64.21 0a32.42,32.1 90,1 1,-64.21 0"
|
||||||
|
android:strokeWidth="0.86"
|
||||||
|
android:fillColor="#f4d9ff"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:strokeColor="#00000000"/>
|
||||||
|
</group>
|
||||||
|
</vector>
|
||||||
12
android/app/src/main/res/drawable/launch_background.xml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Modify this file to customize your launch splash screen -->
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@android:color/white" />
|
||||||
|
|
||||||
|
<!-- You can insert your own image assets here -->
|
||||||
|
<!-- <item>
|
||||||
|
<bitmap
|
||||||
|
android:gravity="center"
|
||||||
|
android:src="@mipmap/launch_image" />
|
||||||
|
</item> -->
|
||||||
|
</layer-list>
|
||||||
|
Before Width: | Height: | Size: 13 KiB |
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.1 KiB |