Compare commits

..
40 Commits
Author SHA1 Message Date
darken 753d311593 Tweak versioning and bump (1.3.14-rc0) 2022-08-24 11:56:42 +02:00
darken 5bae3d9931 Remove in-app email shortcut 2022-08-24 11:40:16 +02:00
darken a3495a8218 Update translations 2022-08-24 11:33:48 +02:00
Poussinou 5fa68f77a2 Update README.md 2022-07-31 11:13:51 +02:00
darken dbba2e9791 Another fastlane gplay upload fix. 2022-07-25 21:00:43 +02:00
darken 6207f26a68 Update fastlane to 2.208 2022-07-25 20:57:24 +02:00
darken 7fcd39822e Update fastlane to 2.208 2022-07-25 20:56:45 +02:00
darken d20f8a604f Fix CI issues with Google Play upload (part 2...) 2022-07-25 20:47:26 +02:00
darken a742646127 Fix CI github release apk search path. 2022-07-25 20:09:37 +02:00
darken f5078d5ef2 Tell fastlane to skip APK upload 2022-07-25 20:04:22 +02:00
darken 3784084abc Fix fastlane build arguments 2022-07-25 19:53:23 +02:00
darken 2f463b7735 Adjust description to pass markdown parsing 2022-07-25 19:42:15 +02:00
darken 7be5625d66 Fix gplay deploy script 2022-07-25 19:40:49 +02:00
darken aef14a9cd2 Create changelog file for v1.3.13(1031300) 2022-07-25 17:42:26 +02:00
darken 67648a04d3 Update translations 2022-07-25 17:36:29 +02:00
Matthias Urhahn 58345e3194 Update FUNDING.yml 2022-07-25 10:22:32 +02:00
darken 4cb2ad9a5a Adjust support item order 2022-07-25 01:29:18 +02:00
darken 27395d8e22 Remove email from readme 2022-07-25 01:29:07 +02:00
darken 230c5ea180 Adjust donation links in foss build 2022-07-25 01:22:07 +02:00
Matthias Urhahn 4d4370ddce Update README.md 2022-07-24 16:01:07 +02:00
darken 7e913e7847 Make bugsnag opt-out in gplay and opt-in in foss builds. 2022-07-24 16:00:38 +02:00
darken ec7871e4e9 Change issue tracker icon 2022-07-24 16:00:07 +02:00
darken cc5a45a14f Update repo links 2022-07-24 16:00:07 +02:00
Matthias Urhahn 5fff3457ba Update README.md 2022-07-24 15:03:19 +02:00
darken 6f5d66c1d9 Update README.md 2022-07-24 14:02:53 +02:00
darken d94795bf4f Update PRIVACY_POLICY.md 2022-07-24 13:58:17 +02:00
darken 009b71c42a Update PP 2022-07-24 13:43:47 +02:00
darken a10716d74e Update gitignore 2022-07-24 13:43:06 +02:00
darken b44bf5f401 Setup CI for testing, gplay release and foss release. 2022-07-24 13:38:52 +02:00
Matthias Urhahn e0af1838e2 Delete local.properties 2022-07-24 13:38:43 +02:00
darken 7d5502a34f Version bump (1.3.13) 2022-07-08 19:27:28 +02:00
darken 78ccddf87c Fix notification icon/text color to match light/dark theme. 2022-05-01 17:48:32 +02:00
darken df1bc48e84 Version bump (1.3.12) 2022-05-01 17:36:17 +02:00
darken 3b48d61571 Version bump (1.3.11) 2022-05-01 17:17:53 +02:00
darken 92d5e2a40d Updated translations 2022-05-01 17:13:42 +02:00
darken 234857c414 When enabling unfiltered BLE data, also enable "show all" to make debugging easier. 2022-05-01 16:42:17 +02:00
darken b1bbe785ea Fix debug log naming 2022-04-18 11:10:10 +02:00
darken 487fb49bff Update translations 2022-04-17 13:27:23 +02:00
darken b14b7fa926 Version bump (1.3.10) 2022-04-17 13:08:42 +02:00
darken 4cc1ab143d Change fake airpods pro name. 2022-04-17 13:07:27 +02:00
68 changed files with 654 additions and 245 deletions
+2 -1
View File
@@ -1,4 +1,5 @@
# These are supported funding model platforms # These are supported funding model platforms
github:
- d4rken
custom: custom:
- "https://www.buymeacoffee.com/tydarken" - "https://www.buymeacoffee.com/tydarken"
@@ -1,4 +1,4 @@
name: Android CI name: Code tests & eval
on: on:
push: push:
@@ -7,13 +7,13 @@ on:
branches: [ main ] branches: [ main ]
jobs: jobs:
build: build-and-test:
name: Build and test name: Build and test
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: set up JDK 11 - name: Set up JDK 11
uses: actions/setup-java@v2 uses: actions/setup-java@v2
with: with:
java-version: '11' java-version: '11'
@@ -22,7 +22,13 @@ jobs:
- name: Grant execute permission for gradlew - name: Grant execute permission for gradlew
run: chmod +x gradlew run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew assembleDebug - name: Build FOSS variant
- name: Run tests run: ./gradlew assembleFossDebug
run: ./gradlew testGplayDebugUnitTest testFossDebugUnitTest - name: Test FOSS variant
run: ./gradlew testFossDebugUnitTest
- name: Build Google Play variant
run: ./gradlew assembleGplayDebug
- name: Test Google Play variant
run: ./gradlew testGplayDebugUnitTest
+153
View File
@@ -0,0 +1,153 @@
name: Tagged releases
on:
push:
tags:
- 'v*'
jobs:
release-github:
name: Create GitHub release
runs-on: ubuntu-latest
environment: foss-production
steps:
- name: Decode Keystore
env:
ENCODED_KEYSTORE: ${{ secrets.SIGNING_KEYSTORE_BASE64 }}
run: |
TMP_KEYSTORE_DIR_PATH="${RUNNER_TEMP}"/keystore
mkdir -p "${TMP_KEYSTORE_DIR_PATH}"
TMP_KEYSTORE_FILE_PATH="${TMP_KEYSTORE_DIR_PATH}"/keystore.jks
echo $ENCODED_KEYSTORE | base64 -di > "${TMP_KEYSTORE_FILE_PATH}"
echo "STORE_PATH=$(echo $TMP_KEYSTORE_FILE_PATH)" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Get the version
id: tagger
uses: jimschubert/query-tag-action@v2
with:
skip-unshallow: 'true'
abbrev: false
commit-ish: HEAD
- name: Install JDK ${{ matrix.java_version }}
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: 11
- name: Assemble beta APK
if: contains(steps.tagger.outputs.tag, '-beta')
run: ./gradlew assembleFossBeta
env:
VERSION: ${{ github.ref }}
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
- name: Assemble production APK
if: "!contains(steps.tagger.outputs.tag, '-beta')"
run: ./gradlew assembleFossRelease
env:
VERSION: ${{ github.ref }}
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
- name: Create pre-release
if: contains(steps.tagger.outputs.tag, '-beta')
uses: softprops/action-gh-release@v1
with:
prerelease: true
tag_name: ${{ steps.tagger.outputs.tag }}
name: ${{ steps.tagger.outputs.tag }}
generate_release_notes: true
files: app/build/outputs/apk/foss/beta/*.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Create release
if: "!contains(steps.tagger.outputs.tag, '-beta')"
uses: softprops/action-gh-release@v1
with:
prerelease: false
tag_name: ${{ steps.tagger.outputs.tag }}
name: ${{ steps.tagger.outputs.tag }}
generate_release_notes: true
files: app/build/outputs/apk/foss/release/*.apk
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release-gplay:
name: Create Google Play release
runs-on: ubuntu-latest
environment: gplay-production
steps:
- name: Decode Keystore
env:
ENCODED_KEYSTORE: ${{ secrets.SIGNING_KEYSTORE_BASE64 }}
run: |
TMP_KEYSTORE_DIR_PATH="${RUNNER_TEMP}"/keystore
mkdir -p "${TMP_KEYSTORE_DIR_PATH}"
TMP_KEYSTORE_FILE_PATH="${TMP_KEYSTORE_DIR_PATH}"/keystore.jks
echo $ENCODED_KEYSTORE | base64 -di > "${TMP_KEYSTORE_FILE_PATH}"
echo "STORE_PATH=$(echo $TMP_KEYSTORE_FILE_PATH)" >> $GITHUB_ENV
- name: Decode Google Play service account key
env:
ENCODED_SERVICE_KEY: ${{ secrets.GPLAY_SERVICE_ACCOUNT_KEY_JSON_BASE64 }}
run: |
TMP_SERVICEKEY_DIR="${RUNNER_TEMP}"/gplaykey
mkdir -p "${TMP_SERVICEKEY_DIR}"
TMP_SERVICEKEY_FILE_PATH="${TMP_SERVICEKEY_DIR}"/service_account.json
echo $ENCODED_SERVICE_KEY | base64 -di > "${TMP_SERVICEKEY_FILE_PATH}"
echo "SUPPLY_JSON_KEY=$(echo $TMP_SERVICEKEY_FILE_PATH)" >> $GITHUB_ENV
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Get the version
id: tagger
uses: jimschubert/query-tag-action@v2
with:
skip-unshallow: 'true'
abbrev: false
commit-ish: HEAD
- name: Install JDK ${{ matrix.java_version }}
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: 11
- name: Set up ruby env
uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7.6
bundler-cache: true
- name: Assemble beta and upload to Google Play
if: contains(steps.tagger.outputs.tag, '-beta')
run: bundle exec fastlane beta
env:
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
- name: Assemble production and upload to Google Play
if: "!contains(steps.tagger.outputs.tag, '-beta')"
run: bundle exec fastlane production
env:
STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
BUGSNAG_API_KEY: ${{ secrets.BUGSNAG_API_KEY }}
+12
View File
@@ -2,3 +2,15 @@
.gradle .gradle
build/ build/
/fastlane/report.xml /fastlane/report.xml
*.iml
local.properties
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
/.idea/**/*
!/.idea/codeStyles/
!/.idea/codeStyles/**/*
*.jks
.local/*
+37 -37
View File
@@ -8,20 +8,20 @@ GEM
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.2.0) aws-eventstream (1.2.0)
aws-partitions (1.554.0) aws-partitions (1.610.0)
aws-sdk-core (3.126.0) aws-sdk-core (3.131.3)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0) aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
jmespath (~> 1.0) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.54.0) aws-sdk-kms (1.58.0)
aws-sdk-core (~> 3, >= 3.126.0) aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.112.0) aws-sdk-s3 (1.114.0)
aws-sdk-core (~> 3, >= 3.126.0) aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.4) aws-sigv4 (~> 1.4)
aws-sigv4 (1.4.0) aws-sigv4 (1.5.1)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4) babosa (1.0.4)
claide (1.1.0) claide (1.1.0)
@@ -36,8 +36,8 @@ GEM
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6) dotenv (2.7.6)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.91.0) excon (0.92.4)
faraday (1.9.3) faraday (1.10.0)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1) faraday-excon (~> 1.1)
@@ -56,8 +56,8 @@ GEM
faraday-em_synchrony (1.0.0) faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0) faraday-excon (1.1.0)
faraday-httpclient (1.0.1) faraday-httpclient (1.0.1)
faraday-multipart (1.0.3) faraday-multipart (1.0.4)
multipart-post (>= 1.2, < 3) multipart-post (~> 2)
faraday-net_http (1.0.1) faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0) faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0) faraday-patron (1.0.0)
@@ -66,7 +66,7 @@ GEM
faraday_middleware (1.2.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.6) fastimage (2.2.6)
fastlane (2.204.3) fastlane (2.208.0)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -106,9 +106,9 @@ GEM
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.16.0) google-apis-androidpublisher_v3 (0.25.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.7, < 2.a)
google-apis-core (0.4.2) google-apis-core (0.7.0)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -117,19 +117,19 @@ GEM
retriable (>= 2.0, < 4.a) retriable (>= 2.0, < 4.a)
rexml rexml
webrick webrick
google-apis-iamcredentials_v1 (0.10.0) google-apis-iamcredentials_v1 (0.13.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.7, < 2.a)
google-apis-playcustomapp_v1 (0.7.0) google-apis-playcustomapp_v1 (0.10.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.7, < 2.a)
google-apis-storage_v1 (0.11.0) google-apis-storage_v1 (0.18.0)
google-apis-core (>= 0.4, < 2.a) google-apis-core (>= 0.7, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0) google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.5.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.2.0) google-cloud-errors (1.2.0)
google-cloud-storage (1.36.1) google-cloud-storage (1.37.0)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1) google-apis-iamcredentials_v1 (~> 0.1)
@@ -137,20 +137,20 @@ GEM
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
googleauth (1.1.0) googleauth (1.2.0)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0) jwt (>= 1.4, < 3.0)
memoist (~> 0.16) memoist (~> 0.16)
multi_json (~> 1.11) multi_json (~> 1.11)
os (>= 0.9, < 2.0) os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a) signet (>= 0.16, < 2.a)
highline (2.0.3) highline (2.0.3)
http-cookie (1.0.4) http-cookie (1.0.5)
domain_name (~> 0.5) domain_name (~> 0.5)
httpclient (2.8.3) httpclient (2.8.3)
jmespath (1.5.0) jmespath (1.6.1)
json (2.6.1) json (2.6.2)
jwt (2.3.0) jwt (2.4.1)
memoist (0.16.2) memoist (0.16.2)
mini_magick (4.11.0) mini_magick (4.11.0)
mini_mime (1.1.2) mini_mime (1.1.2)
@@ -161,9 +161,9 @@ GEM
optparse (0.1.1) optparse (0.1.1)
os (1.1.4) os (1.1.4)
plist (3.6.0) plist (3.6.0)
public_suffix (4.0.6) public_suffix (4.0.7)
rake (13.0.6) rake (13.0.6)
representable (3.1.1) representable (3.2.0)
declarative (< 0.1.0) declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0) trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0) uber (< 0.2.0)
@@ -173,9 +173,9 @@ GEM
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
rubyzip (2.3.2) rubyzip (2.3.2)
security (0.1.3) security (0.1.3)
signet (0.16.0) signet (0.17.0)
addressable (~> 2.8) addressable (~> 2.8)
faraday (>= 0.17.3, < 2.0) faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0) jwt (>= 1.5, < 3.0)
multi_json (~> 1.10) multi_json (~> 1.10)
simctl (1.6.8) simctl (1.6.8)
@@ -192,11 +192,11 @@ GEM
uber (0.1.0) uber (0.1.0)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.8) unf_ext (0.0.8.2)
unicode-display_width (1.8.0) unicode-display_width (1.8.0)
webrick (1.7.0) webrick (1.7.0)
word_wrap (1.0.0) word_wrap (1.0.0)
xcodeproj (1.21.0) xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0) CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3) atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0) claide (>= 1.0.2, < 2.0)
+28 -10
View File
@@ -1,24 +1,42 @@
# Privacy policy for the app `CAPod` # Privacy policy
This is the privacy policy for the Android app "CAPod - Companion for AirPods".
* I do not collect personal information ## Preamble
* I do not sell, monetize or otherwise misappropriate any collected data. CAPod respects your privacy.
Anonymous device information may be collected in the event of a crash (see [Automatic crash reports](#automatic-crash-reports)). I do not collect, share or sell personal information.
Send a [quick mail](mailto:support@darken.eu) if you have questions.
My underlying privacy principle is the [Golden Rule](https://en.wikipedia.org/wiki/Golden_Rule). My underlying privacy principle is the [Golden Rule](https://en.wikipedia.org/wiki/Golden_Rule).
Send a [quick mail](mailto:support@darken.eu) if you have further questions. ## Location data
CAPod does not collect, share or sell location data.
Location permissions are required to receive Bluetooth Low Energy (BLE) data and ebale its core functionality.
The permission "access fine location" (`ACCESS_FINE_LOCATION`) and "access coarse location" (`ACCESS_COARSE_LOCATION`) are required to receive Bluetooth Low Energy data on Android 11 and lower.
On Android 12+ the newer and more fine grained `BLUETOOTH_SCAN` permission is used instead.
Bluetooth Low Energy is a technology that devices like AirPods use to communicate their status to nearby devices.
CAPod requests location permissions because these permissions are required to work with Bluetooth Low Energy data.
This is a privacy measure on Android's side because you could determine someones location by scanning for Bluetooth devices:
If you know the physical location of a Bluetooth device (e.g. AirTags) you could use Bluetooth data to calculate your position.
### Location access in the background
CAPod uses the "location access in the background" permission (`ACCESS_BACKGROUND_LOCATION`) on Android 11 and older to receive Bluetooth Low Energy data while the app is in the background. This permission enables the "Show popup" and "Autoconnect" features and allows CAPod to react to nearby devices whil the app is closed.
## Automatic crash reports ## Automatic crash reports
The app uses "Bugsnag" for automatic crash reports: Anonymous device information may be collected in the event of an app crash or error.
To do this the app uses the service "Bugsnag":
https://www.bugsnag.com/ https://www.bugsnag.com/
Bugsnags privacy policy can be found here: Bugsnag's privacy policy can be found here:
https://docs.bugsnag.com/legal/privacy-policy/ https://docs.bugsnag.com/legal/privacy-policy/
Crash reports may contain device and app related information. Crash reports may contain device and app related information, e.g. your phone model, Android version and app version.
You can disable automatic crash reports in the app's settings. You can disable automatic reports in the app's settings.
+13 -10
View File
@@ -1,9 +1,10 @@
<img src="https://github.com/d4rken/capod/raw/main/.assets/banner.png" width="400"> <img src="https://github.com/d4rken-org/capod/raw/main/.assets/banner.png" width="400">
# Companion App for AirPods (CAPod) # Companion App for AirPods (CAPod)
[![GitHub release (latest SemVer including pre-releases)](https://img.shields.io/github/v/release/d4rken-org/capod?include_prereleases)](https://github.com/d4rken-org/capod/releases/latest)
![Build](https://github.com/d4rken/capod/actions/workflows/android.yml/badge.svg) [![Code tests & eval](https://github.com/d4rken-org/capod/actions/workflows/code-checks.yml/badge.svg)](https://github.com/d4rken/capod/actions/workflows/code-checks.yml)
[![Github All Releases](https://img.shields.io/github/downloads/d4rken/capod/total.svg)](https://github.com/d4rken/capod/releases/latest) [![Crowdin](https://badges.crowdin.net/capod/localized.svg)](https://crowdin.com/project/capod)
[![Github All Releases](https://img.shields.io/github/downloads/d4rken-org/capod/total.svg)](https://github.com/d4rken-org/capod/releases/latest)
A companion app that adds support for AirPod specific features to Android: A companion app that adds support for AirPod specific features to Android:
@@ -19,8 +20,9 @@ CAPod is ad-free. Some additional features require an in-app purchase.
Currently supported models: Currently supported models:
* AirPods Gen1 * AirPods 1. Generation
* AirPods Gen2 * AirPods 2. Generation
* AirPods 3. Generation
* AirPods Pro * AirPods Pro
* AirPods Max * AirPods Max
* Power Beats Pro * Power Beats Pro
@@ -33,22 +35,23 @@ Currently supported models:
## Download ## Download
* [Google Play](https://play.google.com/store/apps/details?id=eu.darken.capod) * [Google Play](https://play.google.com/store/apps/details?id=eu.darken.capod)
* [GitHub](https://github.com/d4rken/capod/releases/latest) * [GitHub](https://github.com/d4rken-org/capod/releases/latest)
* [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.darken.capod)
## Support the project ## Support the project
* Buy the CAPod Pro In-App purchase on [Google Play](https://play.google.com/store/apps/details?id=eu.darken.capod) * Buy the CAPod Pro In-App purchase on [Google Play](https://play.google.com/store/apps/details?id=eu.darken.capod)
* [Sponsor development](https://github.com/sponsors/d4rken) on GitHub
* Help translate CAPod [on Crowdin](https://crowdin.com/project/capod) * Help translate CAPod [on Crowdin](https://crowdin.com/project/capod)
* [Buy me a coffee](https://www.buymeacoffee.com/tydarken)
## Get help ## Get help
* [Github Issues](https://github.com/d4rken/capod/issues) * [Github Issues](https://github.com/d4rken-org/capod/issues)
* [Discord](https://discord.gg/vHubYPp) * [Discord](https://discord.gg/vHubYPp)
## Screenshots ## Screenshots
<img src="https://github.com/d4rken/capod/raw/main/.assets/screenshots/1.png" width="200"><img src="https://github.com/d4rken/capod/raw/main/.assets/screenshots/2.png" width="200"><img src="https://github.com/d4rken/capod/raw/main/.assets/screenshots/3.png" width="200"><img src="https://github.com/d4rken/capod/raw/main/.assets/screenshots/4.png" width="200"> <img src="https://github.com/d4rken-org/capod/raw/main/.assets/screenshots/1.png" width="200"><img src="https://github.com/d4rken-org/capod/raw/main/.assets/screenshots/2.png" width="200"><img src="https://github.com/d4rken-org/capod/raw/main/.assets/screenshots/3.png" width="200"><img src="https://github.com/d4rken-org/capod/raw/main/.assets/screenshots/4.png" width="200">
## Thanks to ## Thanks to
+57 -28
View File
@@ -16,10 +16,6 @@ android {
compileSdkVersion buildConfig.compileSdk compileSdkVersion buildConfig.compileSdk
Properties bugsnagProps = new Properties()
def bugsnagPropsFile = new File(System.properties['user.home'], ".appconfig/${packageName}/bugsnag.properties")
if (bugsnagPropsFile.canRead()) bugsnagProps.load(new FileInputStream(bugsnagPropsFile))
defaultConfig { defaultConfig {
applicationId "${packageName}" applicationId "${packageName}"
@@ -38,22 +34,55 @@ android {
} }
signingConfigs { signingConfigs {
release {} releaseFoss {}
releaseGplay {}
} }
def signingPropFile = new File(System.properties['user.home'], ".appconfig/${packageName}/signing.properties")
if (signingPropFile.canRead()) { signingConfigs {
Properties signingProps = new Properties() releaseFoss {
signingProps.load(new FileInputStream(signingPropFile)) def signingFossPropFile = new File(System.properties['user.home'], ".appconfig/${packageName}/signing-foss.properties")
signingConfigs { Properties signingPropsFoss = new Properties()
release { if (signingFossPropFile.canRead()) signingPropsFoss.load(new FileInputStream(signingFossPropFile))
storeFile new File(signingProps['release.storePath']) String keyStorePathFoss = System.getenv("STORE_PATH") ?: signingPropsFoss["release.storePath"]
keyAlias signingProps['release.keyAlias'] File keyStoreFoss = keyStorePathFoss ? new File(keyStorePathFoss) : null
storePassword signingProps['release.storePassword'] if (keyStoreFoss?.canRead()) {
keyPassword signingProps['release.keyPassword'] storeFile keyStoreFoss
storePassword System.getenv("STORE_PASSWORD") ?: signingPropsFoss['release.storePassword']
keyAlias System.getenv("KEY_ALIAS") ?: signingPropsFoss['release.keyAlias']
keyPassword System.getenv("KEY_PASSWORD") ?: signingPropsFoss['release.keyPassword']
}
}
releaseGplay {
def signingGplayPropFile = new File(System.properties['user.home'], ".appconfig/${packageName}/signing-gplay.properties")
Properties signingPropsGplay = new Properties()
if (signingGplayPropFile.canRead()) signingPropsGplay.load(new FileInputStream(signingGplayPropFile))
String keyStorePathGplay = System.getenv("STORE_PATH") ?: signingPropsGplay["release.storePath"]
File keyStoreGplay = keyStorePathGplay ? new File(keyStorePathGplay) : null
if (keyStoreGplay?.canRead()) {
storeFile keyStoreGplay
storePassword System.getenv("STORE_PASSWORD") ?: signingPropsGplay['release.storePassword']
keyAlias System.getenv("KEY_ALIAS") ?: signingPropsGplay['release.keyAlias']
keyPassword System.getenv("KEY_PASSWORD") ?: signingPropsGplay['release.keyPassword']
} }
} }
} }
flavorDimensions "version"
productFlavors {
foss {
signingConfig signingConfigs.releaseFoss
}
gplay {
signingConfig signingConfigs.releaseGplay
}
}
Properties bugsnagProps = new Properties()
def bugsnagPropsFile = new File(System.properties['user.home'], ".appconfig/${packageName}/bugsnag.properties")
if (bugsnagPropsFile.canRead()) bugsnagProps.load(new FileInputStream(bugsnagPropsFile))
String bugSnagApiKey = System.getenv("BUGSNAG_API_KEY") ?: bugsnagProps.getProperty("bugsnag.apikey", "")
buildTypes { buildTypes {
def proguardRulesRelease = fileTree(dir: "../proguard", include: ["*.pro"]).asList().toArray() def proguardRulesRelease = fileTree(dir: "../proguard", include: ["*.pro"]).asList().toArray()
debug { debug {
@@ -62,10 +91,9 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
proguardFiles proguardRulesRelease proguardFiles proguardRulesRelease
proguardFiles 'proguard-rules-debug.pro' proguardFiles 'proguard-rules-debug.pro'
manifestPlaceholders = [bugsnagApiKey: bugsnagProps.getProperty("bugsnag.apikey", "")] manifestPlaceholders = [bugsnagApiKey: bugSnagApiKey]
} }
release { beta {
signingConfig signingConfigs.release
lintOptions { lintOptions {
abortOnError true abortOnError true
fatal 'StopShip' fatal 'StopShip'
@@ -74,17 +102,18 @@ android {
shrinkResources true shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
proguardFiles proguardRulesRelease proguardFiles proguardRulesRelease
manifestPlaceholders = [bugsnagApiKey: bugsnagProps.getProperty("bugsnag.apikey", "")] manifestPlaceholders = [bugsnagApiKey: bugSnagApiKey]
} }
} release {
lintOptions {
flavorDimensions "version" abortOnError true
productFlavors { fatal 'StopShip'
gplay { }
minifyEnabled true
} shrinkResources true
foss { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
proguardFiles proguardRulesRelease
manifestPlaceholders = [bugsnagApiKey: bugSnagApiKey]
} }
} }
@@ -40,7 +40,7 @@ class UpgradeControlFoss @Inject constructor(
upgradedAt = Instant.now(), upgradedAt = Instant.now(),
reason = FossUpgrade.Reason.DONATED reason = FossUpgrade.Reason.DONATED
) )
webpageTool.open("https://github.com/d4rken/capod") webpageTool.open("https://github.com/d4rken-org/capod#support-the-project")
Toast.makeText(activity, R.string.general_thank_you_label, Toast.LENGTH_SHORT).show() Toast.makeText(activity, R.string.general_thank_you_label, Toast.LENGTH_SHORT).show()
} }
setNegativeButton(R.string.foss_upgrade_alreadydonated_label) { _, _ -> setNegativeButton(R.string.foss_upgrade_alreadydonated_label) { _, _ ->
+5 -1
View File
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string name="foss_upgrade_donate_label">Ахвяраваць</string>
<string name="foss_upgrade_alreadydonated_label">Я ўжо ахвяраваў</string>
<string name="foss_upgrade_no_money_label" comment="Can't be too long otherwise the dialog ellipsizes it. foss_upgrade_no_money_label" maxLength="35">Я патраціў усе грошы на AirPods</string>
</resources>
+1 -1
View File
@@ -2,5 +2,5 @@
<resources> <resources>
<string name="foss_upgrade_donate_label">Spenden</string> <string name="foss_upgrade_donate_label">Spenden</string>
<string name="foss_upgrade_alreadydonated_label">Ich habe schon gespendet</string> <string name="foss_upgrade_alreadydonated_label">Ich habe schon gespendet</string>
<string name="foss_upgrade_no_money_label">Ich gebe mein ganzes Geld für AirPods aus</string> <string name="foss_upgrade_no_money_label" comment="Can't be too long otherwise the dialog ellipsizes it. foss_upgrade_no_money_label" maxLength="35">Hab alles für AirPods ausgegeben</string>
</resources> </resources>
+1 -1
View File
@@ -2,5 +2,5 @@
<resources> <resources>
<string name="foss_upgrade_donate_label">Derma</string> <string name="foss_upgrade_donate_label">Derma</string>
<string name="foss_upgrade_alreadydonated_label">Saya sudah menderma</string> <string name="foss_upgrade_alreadydonated_label">Saya sudah menderma</string>
<string name="foss_upgrade_no_money_label">Saya belanjakan semua wang saya untuk AirPods</string> <string name="foss_upgrade_no_money_label" comment="Can't be too long otherwise the dialog ellipsizes it. foss_upgrade_no_money_label" maxLength="35">Saya belanjakan semua wang saya untuk AirPods</string>
</resources> </resources>
+1 -1
View File
@@ -2,5 +2,5 @@
<resources> <resources>
<string name="foss_upgrade_donate_label">Quyên tặng</string> <string name="foss_upgrade_donate_label">Quyên tặng</string>
<string name="foss_upgrade_alreadydonated_label">Tôi đã quyên góp</string> <string name="foss_upgrade_alreadydonated_label">Tôi đã quyên góp</string>
<string name="foss_upgrade_no_money_label">Tôi tiêu hết tiền cho AirPods</string> <string name="foss_upgrade_no_money_label" comment="Can't be too long otherwise the dialog ellipsizes it. foss_upgrade_no_money_label" maxLength="35">Tôi tiêu hết tiền cho AirPods</string>
</resources> </resources>
+1 -1
View File
@@ -2,5 +2,5 @@
<resources> <resources>
<string name="foss_upgrade_donate_label">抖內</string> <string name="foss_upgrade_donate_label">抖內</string>
<string name="foss_upgrade_alreadydonated_label">我已經抖內了</string> <string name="foss_upgrade_alreadydonated_label">我已經抖內了</string>
<string name="foss_upgrade_no_money_label">我已經為 AirPods 傾家蕩產了</string> <string name="foss_upgrade_no_money_label" comment="Can't be too long otherwise the dialog ellipsizes it. foss_upgrade_no_money_label" maxLength="35">我已經為 AirPods 傾家蕩產了</string>
</resources> </resources>
+4 -1
View File
@@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources></resources> <resources>
<string name="upgrades_gplay_unavailable_error">Службы Google Play недаступныя.</string>
<string name="upgrades_no_purchases_found_check_account">Пакупак не знойдзена. Вы выкарыстоўваеце правільны ўліковы запіс?</string>
</resources>
@@ -6,10 +6,34 @@ import eu.darken.capod.BuildConfig
// Can't be const because that prevents them from being mocked in tests // Can't be const because that prevents them from being mocked in tests
@Suppress("MayBeConstant") @Suppress("MayBeConstant")
object BuildConfigWrap { object BuildConfigWrap {
val FLAVOR: String = BuildConfig.FLAVOR
val BUILD_TYPE: String = BuildConfig.BUILD_TYPE
val DEBUG: Boolean = BuildConfig.DEBUG val DEBUG: Boolean = BuildConfig.DEBUG
val BUILD_TYPE: BuildType = when (val typ = BuildConfig.BUILD_TYPE) {
"debug" -> BuildType.DEV
"beta" -> BuildType.BETA
"release" -> BuildType.RELEASE
else -> throw IllegalArgumentException("Unknown buildtype: $typ")
}
enum class BuildType {
DEV,
BETA,
RELEASE,
;
}
val FLAVOR: Flavor = when (val flav = BuildConfig.FLAVOR) {
"gplay" -> Flavor.GPLAY
"foss" -> Flavor.FOSS
else -> throw IllegalStateException("Unknown flavor: $flav")
}
enum class Flavor {
GPLAY,
FOSS,
;
}
val APPLICATION_ID = BuildConfig.APPLICATION_ID val APPLICATION_ID = BuildConfig.APPLICATION_ID
val VERSION_CODE: Long = BuildConfig.VERSION_CODE.toLong() val VERSION_CODE: Long = BuildConfig.VERSION_CODE.toLong()
@@ -18,4 +42,5 @@ object BuildConfigWrap {
val VERSION_DESCRIPTION_LONG: String = "v$VERSION_NAME ($VERSION_CODE) [$GIT_SHA] ${FLAVOR}_$BUILD_TYPE" val VERSION_DESCRIPTION_LONG: String = "v$VERSION_NAME ($VERSION_CODE) [$GIT_SHA] ${FLAVOR}_$BUILD_TYPE"
val VERSION_DESCRIPTION_SHORT: String = "v$VERSION_NAME [$GIT_SHA] $FLAVOR" val VERSION_DESCRIPTION_SHORT: String = "v$VERSION_NAME [$GIT_SHA] $FLAVOR"
val VERSION_DESCRIPTION_TINY: String = "v$VERSION_NAME"
} }
@@ -1,5 +1,5 @@
package eu.darken.capod.common package eu.darken.capod.common
object PrivacyPolicy { object PrivacyPolicy {
const val URL = "https://raw.githubusercontent.com/d4rken/capod-public/main/PRIVACY_POLICY.md" const val URL = "https://raw.githubusercontent.com/d4rken-org/capod/main/PRIVACY_POLICY.md"
} }
@@ -28,12 +28,12 @@ class AutoReporting @Inject constructor(
) { ) {
fun setup() { fun setup() {
val isEnabled = debugSettings.isAutoReportEnabled.value val isEnabled = debugSettings.isAutoReportingEnabled.value
log(TAG) { "setup(): isEnabled=$isEnabled" } log(TAG) { "setup(): isEnabled=$isEnabled" }
try { try {
val bugsnagConfig = Configuration.load(context).apply { val bugsnagConfig = Configuration.load(context).apply {
if (debugSettings.isAutoReportEnabled.value) { if (debugSettings.isAutoReportingEnabled.value) {
Logging.install(bugsnagLogger.get()) Logging.install(bugsnagLogger.get())
setUser(installId.id, null, null) setUser(installId.id, null, null)
autoTrackSessions = true autoTrackSessions = true
@@ -4,6 +4,7 @@ import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceDataStore
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.common.BuildConfigWrap
import eu.darken.capod.common.preferences.PreferenceStoreMapper import eu.darken.capod.common.preferences.PreferenceStoreMapper
import eu.darken.capod.common.preferences.Settings import eu.darken.capod.common.preferences.Settings
import eu.darken.capod.common.preferences.createFlowPreference import eu.darken.capod.common.preferences.createFlowPreference
@@ -17,8 +18,11 @@ class DebugSettings @Inject constructor(
override val preferences: SharedPreferences = context.getSharedPreferences("settings_debug", Context.MODE_PRIVATE) override val preferences: SharedPreferences = context.getSharedPreferences("settings_debug", Context.MODE_PRIVATE)
val isAutoReportEnabled = preferences.createFlowPreference("debug.bugreport.automatic.enabled", true) val isAutoReportingEnabled = preferences.createFlowPreference(
key = "debug.bugreport.automatic.enabled",
// Reporting is opt-out for gplay, and opt-in for github builds
defaultValue = BuildConfigWrap.FLAVOR == BuildConfigWrap.Flavor.GPLAY
)
val isDebugModeEnabled = preferences.createFlowPreference("debug.mode.enabled", false) val isDebugModeEnabled = preferences.createFlowPreference("debug.mode.enabled", false)
val showFakeData = preferences.createFlowPreference("debug.fakedata.enabled", false) val showFakeData = preferences.createFlowPreference("debug.fakedata.enabled", false)
@@ -32,7 +32,7 @@ class BugsnagErrorHandler @Inject constructor(
context.tryFormattedSignature()?.let { event.addMetadata(tab, "signatures", it) } context.tryFormattedSignature()?.let { event.addMetadata(tab, "signatures", it) }
} }
return debugSettings.isAutoReportEnabled.value && !BuildConfigWrap.DEBUG return debugSettings.isAutoReportingEnabled.value && !BuildConfigWrap.DEBUG
} }
companion object { companion object {
@@ -90,7 +90,7 @@ class RecorderModule @Inject constructor(
private fun createRecordingFilePath() = File( private fun createRecordingFilePath() = File(
File(context.cacheDir, "debug/logs"), File(context.cacheDir, "debug/logs"),
"bb_logfile_${System.currentTimeMillis()}.log" "capod_logfile_${System.currentTimeMillis()}.log"
) )
suspend fun startRecorder(): File { suspend fun startRecorder(): File {
@@ -123,6 +123,6 @@ class RecorderModule @Inject constructor(
companion object { companion object {
internal val TAG = logTag("Debug", "Log", "Recorder", "Module") internal val TAG = logTag("Debug", "Log", "Recorder", "Module")
private const val FORCE_FILE = "bb_force_debug_run" private const val FORCE_FILE = "capod_force_debug_run"
} }
} }
@@ -67,6 +67,6 @@ class GeneralSettings @Inject constructor(
showAll, showAll,
minimumSignalQuality, minimumSignalQuality,
mainDeviceAddress, mainDeviceAddress,
debugSettings.isAutoReportEnabled, debugSettings.isAutoReportingEnabled,
) )
} }
@@ -68,7 +68,7 @@ class SettingsFragment : Fragment2(R.layout.settings_fragment),
} }
ui.toolbar.apply { ui.toolbar.apply {
subtitle = BuildConfigWrap.VERSION_DESCRIPTION_SHORT subtitle = BuildConfigWrap.VERSION_DESCRIPTION_TINY
setNavigationOnClickListener { requireActivity().onBackPressed() } setNavigationOnClickListener { requireActivity().onBackPressed() }
} }
@@ -34,6 +34,7 @@ class DebugSettingsFragment : PreferenceFragment2() {
vm.toggleRecorder() vm.toggleRecorder()
true true
} }
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
} }
@@ -3,10 +3,15 @@ package eu.darken.capod.main.ui.settings.general.debug
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import eu.darken.capod.common.coroutine.DispatcherProvider import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.debug.autoreport.DebugSettings
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.debug.recording.core.RecorderModule import eu.darken.capod.common.debug.recording.core.RecorderModule
import eu.darken.capod.common.uix.ViewModel3 import eu.darken.capod.common.uix.ViewModel3
import eu.darken.capod.main.core.GeneralSettings
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
@@ -14,10 +19,24 @@ class DebugSettingsFragmentVM @Inject constructor(
private val handle: SavedStateHandle, private val handle: SavedStateHandle,
dispatcherProvider: DispatcherProvider, dispatcherProvider: DispatcherProvider,
private val recorderModule: RecorderModule, private val recorderModule: RecorderModule,
private val generalSettings: GeneralSettings,
private val debugSettings: DebugSettings,
) : ViewModel3(dispatcherProvider) { ) : ViewModel3(dispatcherProvider) {
val state = recorderModule.state.asLiveData2() val state = recorderModule.state.asLiveData2()
init {
debugSettings.showUnfiltered.flow
.distinctUntilChanged()
.onEach { showUnfiltered ->
if (showUnfiltered) {
log(TAG) { "Enabling 'show all' due to debug setting 'show unfiltered' enabled" }
generalSettings.showAll.value = true
}
}
.launchInViewModel()
}
fun toggleRecorder() = launch { fun toggleRecorder() = launch {
if (recorderModule.state.first().isRecording) { if (recorderModule.state.first().isRecording) {
recorderModule.stopRecorder() recorderModule.stopRecorder()
@@ -28,17 +28,12 @@ class SupportFragment : PreferenceFragment2() {
@Inject lateinit var clipboardHelper: ClipboardHelper @Inject lateinit var clipboardHelper: ClipboardHelper
private val installIdPref by lazy { findPreference<Preference>("support.installid")!! } private val installIdPref by lazy { findPreference<Preference>("support.installid")!! }
private val supportMailPref by lazy { findPreference<Preference>("support.email.darken")!! }
override fun onPreferencesCreated() { override fun onPreferencesCreated() {
installIdPref.setOnPreferenceClickListener { installIdPref.setOnPreferenceClickListener {
vm.copyInstallID() vm.copyInstallID()
true true
} }
supportMailPref.setOnPreferenceClickListener {
vm.sendSupportMail()
true
}
super.onPreferencesCreated() super.onPreferencesCreated()
} }
@@ -52,8 +47,6 @@ class SupportFragment : PreferenceFragment2() {
.show() .show()
} }
vm.emailEvent.observe2(this) { startActivity(it) }
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
} }
} }
@@ -1,11 +1,7 @@
package eu.darken.capod.main.ui.settings.support package eu.darken.capod.main.ui.settings.support
import android.content.Intent
import android.os.Build
import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.SavedStateHandle
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import eu.darken.capod.common.BuildConfigWrap
import eu.darken.capod.common.EmailTool
import eu.darken.capod.common.InstallId import eu.darken.capod.common.InstallId
import eu.darken.capod.common.coroutine.DispatcherProvider import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.livedata.SingleLiveEvent import eu.darken.capod.common.livedata.SingleLiveEvent
@@ -15,34 +11,12 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class SupportFragmentVM @Inject constructor( class SupportFragmentVM @Inject constructor(
private val handle: SavedStateHandle, private val handle: SavedStateHandle,
private val emailTool: EmailTool,
private val installId: InstallId,
private val dispatcherProvider: DispatcherProvider, private val dispatcherProvider: DispatcherProvider,
private val installId: InstallId,
) : ViewModel3(dispatcherProvider) { ) : ViewModel3(dispatcherProvider) {
val emailEvent = SingleLiveEvent<Intent>()
val clipboardEvent = SingleLiveEvent<String>() val clipboardEvent = SingleLiveEvent<String>()
fun sendSupportMail() = launch {
val bodyInfo = StringBuilder("\n\n\n")
bodyInfo.append("--- Infos for the developer ---\n")
bodyInfo.append("App version: ").append(BuildConfigWrap.VERSION_DESCRIPTION_LONG).append("\n")
bodyInfo.append("Device: ").append(Build.FINGERPRINT).append("\n")
bodyInfo.append("Install ID: ").append(installId.id).append("\n")
val email = EmailTool.Email(
receipients = listOf("support@darken.eu"),
subject = "[CAPod] Question/Suggestion/Request\n",
body = bodyInfo.toString()
)
emailEvent.postValue(emailTool.build(email))
}
fun copyInstallID() = launch { fun copyInstallID() = launch {
clipboardEvent.postValue(installId.id) clipboardEvent.postValue(installId.id)
} }
@@ -104,7 +104,7 @@ interface PodDevice {
"TWS i99999" "TWS i99999"
), ),
@Json(name = "fakes.varunr.airpodspro") VARUNR_AIRPODS_PRO( @Json(name = "fakes.varunr.airpodspro") VARUNR_AIRPODS_PRO(
"Varunr AirPods Pro" "Fake AirPods Pro"
), ),
@Json(name = "unknown") UNKNOWN( @Json(name = "unknown") UNKNOWN(
"Unknown" "Unknown"
@@ -6,5 +6,5 @@
android:tint="?attr/colorControlNormal"> android:tint="?attr/colorControlNormal">
<path <path
android:fillColor="@android:color/white" android:fillColor="@android:color/white"
android:pathData="M20.38,8.53C20.54,8.13 21.06,6.54 20.21,4.39C20.21,4.39 18.9,4 15.91,6C14.66,5.67 13.33,5.62 12,5.62C10.68,5.62 9.34,5.67 8.09,6C5.1,3.97 3.79,4.39 3.79,4.39C2.94,6.54 3.46,8.13 3.63,8.53C2.61,9.62 2,11 2,12.72C2,19.16 6.16,20.61 12,20.61C17.79,20.61 22,19.16 22,12.72C22,11 21.39,9.62 20.38,8.53M12,19.38C7.88,19.38 4.53,19.19 4.53,15.19C4.53,14.24 5,13.34 5.8,12.61C7.14,11.38 9.43,12.03 12,12.03C14.59,12.03 16.85,11.38 18.2,12.61C19,13.34 19.5,14.23 19.5,15.19C19.5,19.18 16.13,19.38 12,19.38M8.86,13.12C8.04,13.12 7.36,14.12 7.36,15.34C7.36,16.57 8.04,17.58 8.86,17.58C9.69,17.58 10.36,16.58 10.36,15.34C10.36,14.11 9.69,13.12 8.86,13.12M15.14,13.12C14.31,13.12 13.64,14.11 13.64,15.34C13.64,16.58 14.31,17.58 15.14,17.58C15.96,17.58 16.64,16.58 16.64,15.34C16.64,14.11 16,13.12 15.14,13.12Z" /> android:pathData="M12,2A10,10 0 0,0 2,12C2,16.42 4.87,20.17 8.84,21.5C9.34,21.58 9.5,21.27 9.5,21C9.5,20.77 9.5,20.14 9.5,19.31C6.73,19.91 6.14,17.97 6.14,17.97C5.68,16.81 5.03,16.5 5.03,16.5C4.12,15.88 5.1,15.9 5.1,15.9C6.1,15.97 6.63,16.93 6.63,16.93C7.5,18.45 8.97,18 9.54,17.76C9.63,17.11 9.89,16.67 10.17,16.42C7.95,16.17 5.62,15.31 5.62,11.5C5.62,10.39 6,9.5 6.65,8.79C6.55,8.54 6.2,7.5 6.75,6.15C6.75,6.15 7.59,5.88 9.5,7.17C10.29,6.95 11.15,6.84 12,6.84C12.85,6.84 13.71,6.95 14.5,7.17C16.41,5.88 17.25,6.15 17.25,6.15C17.8,7.5 17.45,8.54 17.35,8.79C18,9.5 18.38,10.39 18.38,11.5C18.38,15.32 16.04,16.16 13.81,16.41C14.17,16.72 14.5,17.33 14.5,18.26C14.5,19.6 14.5,20.68 14.5,21C14.5,21.27 14.66,21.59 15.17,21.5C19.14,20.16 22,16.42 22,12A10,10 0 0,0 12,2Z" />
</vector> </vector>
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M20.38,8.53C20.54,8.13 21.06,6.54 20.21,4.39C20.21,4.39 18.9,4 15.91,6C14.66,5.67 13.33,5.62 12,5.62C10.68,5.62 9.34,5.67 8.09,6C5.1,3.97 3.79,4.39 3.79,4.39C2.94,6.54 3.46,8.13 3.63,8.53C2.61,9.62 2,11 2,12.72C2,19.16 6.16,20.61 12,20.61C17.79,20.61 22,19.16 22,12.72C22,11 21.39,9.62 20.38,8.53M12,19.38C7.88,19.38 4.53,19.19 4.53,15.19C4.53,14.24 5,13.34 5.8,12.61C7.14,11.38 9.43,12.03 12,12.03C14.59,12.03 16.85,11.38 18.2,12.61C19,13.34 19.5,14.23 19.5,15.19C19.5,19.18 16.13,19.38 12,19.38M8.86,13.12C8.04,13.12 7.36,14.12 7.36,15.34C7.36,16.57 8.04,17.58 8.86,17.58C9.69,17.58 10.36,16.58 10.36,15.34C10.36,14.11 9.69,13.12 8.86,13.12M15.14,13.12C14.31,13.12 13.64,14.11 13.64,15.34C13.64,16.58 14.31,17.58 15.14,17.58C15.96,17.58 16.64,16.58 16.64,15.34C16.64,14.11 16,13.12 15.14,13.12Z" />
</vector>
@@ -18,12 +18,12 @@
<ImageView <ImageView
android:id="@+id/pod_left_icon" android:id="@+id/pod_left_icon"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_airpod_left_24" /> android:src="@drawable/ic_airpod_left_24" />
<TextView <TextView
android:id="@+id/pod_left_label" android:id="@+id/pod_left_label"
style="@style/TextAppearance.Compat.Notification.Title" style="@style/PodInfoItemText.Notification"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
@@ -31,12 +31,12 @@
<ImageView <ImageView
android:id="@+id/pod_left_charging" android:id="@+id/pod_left_charging"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_power_24" /> android:src="@drawable/ic_baseline_power_24" />
<ImageView <ImageView
android:id="@+id/pod_left_ear" android:id="@+id/pod_left_ear"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_hearing_24" /> android:src="@drawable/ic_baseline_hearing_24" />
</LinearLayout> </LinearLayout>
@@ -52,12 +52,12 @@
<ImageView <ImageView
android:id="@+id/pod_case_icon" android:id="@+id/pod_case_icon"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_airpod_case_24" /> android:src="@drawable/ic_airpod_case_24" />
<TextView <TextView
android:id="@+id/pod_case_label" android:id="@+id/pod_case_label"
style="@style/TextAppearance.Compat.Notification.Title" style="@style/PodInfoItemText.Notification"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
@@ -65,7 +65,7 @@
<ImageView <ImageView
android:id="@+id/pod_case_charging" android:id="@+id/pod_case_charging"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_power_24" /> android:src="@drawable/ic_baseline_power_24" />
</LinearLayout> </LinearLayout>
@@ -81,12 +81,12 @@
<ImageView <ImageView
android:id="@+id/pod_right_icon" android:id="@+id/pod_right_icon"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_airpod_right_24" /> android:src="@drawable/ic_airpod_right_24" />
<TextView <TextView
android:id="@+id/pod_right_label" android:id="@+id/pod_right_label"
style="@style/TextAppearance.Compat.Notification.Title" style="@style/PodInfoItemText.Notification"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
@@ -94,12 +94,12 @@
<ImageView <ImageView
android:id="@+id/pod_right_charging" android:id="@+id/pod_right_charging"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_power_24" /> android:src="@drawable/ic_baseline_power_24" />
<ImageView <ImageView
android:id="@+id/pod_right_ear" android:id="@+id/pod_right_ear"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_hearing_24" /> android:src="@drawable/ic_baseline_hearing_24" />
</LinearLayout> </LinearLayout>
@@ -7,7 +7,7 @@
<TextView <TextView
android:id="@+id/headphones_label" android:id="@+id/headphones_label"
style="@style/TextAppearance.Compat.Notification.Title" style="@style/PodInfoItemText.Notification"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
@@ -21,12 +21,12 @@
<ImageView <ImageView
android:id="@+id/headphones_battery_icon" android:id="@+id/headphones_battery_icon"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_battery_unknown_24" /> android:src="@drawable/ic_baseline_battery_unknown_24" />
<TextView <TextView
android:id="@+id/headphones_battery_label" android:id="@+id/headphones_battery_label"
style="@style/TextAppearance.Compat.Notification.Title" style="@style/PodInfoItemText.Notification"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
@@ -35,12 +35,12 @@
<ImageView <ImageView
android:id="@+id/headphones_charging" android:id="@+id/headphones_charging"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_power_24" /> android:src="@drawable/ic_baseline_power_24" />
<ImageView <ImageView
android:id="@+id/headphones_worn" android:id="@+id/headphones_worn"
style="@style/PodInfoItemIcon" style="@style/PodInfoItemIcon.Notification"
android:src="@drawable/ic_baseline_hearing_24" /> android:src="@drawable/ic_baseline_hearing_24" />
</LinearLayout> </LinearLayout>
@@ -6,7 +6,7 @@
<TextView <TextView
android:id="@+id/device" android:id="@+id/device"
style="@style/TextAppearance.Compat.Notification.Title" style="@style/PodInfoItemText.Notification"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp" android:layout_marginHorizontal="8dp"
+110
View File
@@ -26,4 +26,114 @@
<string name="permission_bluetooth_label">Bluetooth</string> <string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Гэтай праграме патрабуецца дазвол на выкарыстанне Bluetooth для злучэння са спалучанымі прыладамі.</string> <string name="permission_bluetooth_description">Гэтай праграме патрабуецца дазвол на выкарыстанне Bluetooth для злучэння са спалучанымі прыладамі.</string>
<string name="permission_access_fine_location_label">Доступ да дакладнага месцазнаходжання</string> <string name="permission_access_fine_location_label">Доступ да дакладнага месцазнаходжання</string>
<string name="permission_access_fine_location_description">CAPod выкарыстоўвае дазвол \"Дакладнае месцазнаходжанне\" для атрымання даных Bluetooth Low Energy. Вашы навушнікі з дапамогай тэхналогіі Bluetooth Low Energy перадаюць інфармацыю пра свой стан. Гэта праграма НЕ будзе карыстацца данымі Bluetooth для вызначэння вашага месцазнаходжання.</string>
<string name="permission_background_location_label">Доступ да месцазнаходжання ў фоне</string>
<string name="permission_background_location_description">CAPod выкарыстоўвае службу \"Доступ да месцазнаходжання ў фоне\" для ўключэння такіх функцый, як \"Апавяшчэнні\" і \"Аўтапакдлючэнне\", калі праграма закрыта. Фонавы доступ да месцазнаходжання дазваляе праграме атрымліваць даныя Bluetooth Low Energy у фоне. Гэтая праграма НЕ будзе выкарыстоўваць даныя Bluetooth для вызначэння Вашага месцазнаходжання.</string>
<string name="permission_ignore_battery_optimizations_label">Адключыць аптымізацыю батарэі</string>
<string name="permission_ignore_battery_optimizations_description">Аптымізацыя батарэі перашкаджае гэтай праграме надзейна атрымліваць даныя Bluetooth падчас яе знаходжання ў фоне.</string>
<string name="pods_dual_left_label">Левы навушнік</string>
<string name="pods_dual_right_label">Правы навушнік</string>
<string name="pods_case_label">Футляр</string>
<string name="pods_case_status_open_label">Адчынены</string>
<string name="pods_case_status_closed_label">Зачынены</string>
<string name="pods_connection_state_disconnected_label">Не падключаны да прылады</string>
<string name="pods_connection_state_idle_label">Злучаны з прыладай, але ў рэжыме чакання</string>
<string name="pods_connection_state_music_label">У рэжыме музыкі</string>
<string name="pods_connection_state_call_label">У рэжыме выкліку</string>
<string name="pods_connection_state_ringing_label">Выклік</string>
<string name="pods_connection_state_hanging_up_label">Адбой выкліку</string>
<string name="pods_connection_state_unknown_label">Невядомы стан падключэння</string>
<string name="pods_unknown_raw_data_label">Неапрацаваныя даныя</string>
<string name="pods_unknown_label">Невядомая прылада</string>
<string name="pods_unknown_contact_dev">Гэта невядомая прылада, але яна выкарыстоўвае падобны фармат даных. Забяспечце яго падтрымку — звяжыцеся са мной :)</string>
<string name="pods_none_label_short">Няма прылады</string>
<string name="pods_charging_label">Зарадка</string>
<string name="pods_inear_label">У вуху</string>
<string name="pods_microphone_label">Мікрафон</string>
<string name="pods_yours">Вашы</string>
<string name="headset_being_worn_label">Надзеты</string>
<string name="pods_case_unknown_state">Невядомы стан</string>
<string name="overview_nomaindevice_label">Няма асноўнай прылады</string>
<string name="overview_nomaindevice_description">Сярод усіх выяўленых прылад не знойдзена вашай. Уключыце сілкаванне і падключыце вашу прыладу, або змяніце налады.</string>
<string name="settings_label">Налады</string>
<string name="settings_privacy_policy_label">Палітыка канфідэнцыяльнасці</string>
<string name="settings_privacy_policy_desc">Адказнасць за апрацоўку даных.</string>
<string name="settings_licenses_label">Ліцэнзіі</string>
<string name="settings_category_other_label">Іншае</string>
<string name="settings_general_label">Налады</string>
<string name="settings_general_description">Генеральныя налады, якія ўплываюць на ўсю праграму.</string>
<string name="settings_acknowledgements_label">Падзякі</string>
<string name="changelog_label">Спіс змяненняў</string>
<string name="settings_support_email_developer_label" comment="settings_support_email_developer_label&#10;&#10;Pressing this setting will open your default email app with a template for a mail to me and some device info (e.g. versions).">Ліст распрацоўшчыку</string>
<string name="settings_support_installid_label">ID інсталяцыі</string>
<string name="settings_support_installid_desc">Аўтаматычныя справаздачы пра памылкі з\'яўляюцца ананімнымі. Падзяліцеся вашым ID інсталяцыі, калі распрацоўшчыку спатрэбіцца доступ да вашых справаздач пра памылкі.</string>
<string name="settings_support_label">Падтрымка</string>
<string name="settings_support_description">Калі неабходна дапамога.</string>
<string name="issue_tracker_label">Спіс праблем</string>
<string name="issue_tracker_description">Агульнадаступны спіс для справаздач пра памылкі і запыту новых функцый (толькі англійская мова).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Месца для гутарак і задавання пытанняў.</string>
<string name="settings_support_email_developer_description">Звярніце ўвагу, што я магу адказваць толькі на нямецкай або англійскай мове.</string>
<string name="settings_debug_autoreports_label">Аўтаматычная справаздача пра памылкі</string>
<string name="settings_debug_autoreports_description">Аўтаматычныя справаздачы пра памылкі, напрыклад, дэталі пра збой у праграме, якія могуць дапамагчы ў вырашэнні праблемы.</string>
<string name="settings_debug_mode_label">Рэжым адладкі</string>
<string name="settings_debug_mode_description">Паказваць дадатковую інфармацыю з мэтай вырашэння ўзнікшых праблем.</string>
<string name="settings_monitor_mode_label">Рэжым маніторынгу</string>
<string name="settings_monitor_mode_description">Пры якіх умовах гэта праграма збірае даныя Bluetooth.</string>
<string name="settings_scanner_mode_label">Рэжым сканера</string>
<string name="settings_scanner_mode_description">На якім рэжыме мае сканцэнтравацца сканер даных Bluetooth Low Energy — прадукцыйным або эканоміі энергіі?</string>
<string name="settings_monitor_mode_manual_label">Калі праграма адкрыта</string>
<string name="settings_monitor_mode_automatic_label">Калі прылада падключана</string>
<string name="settings_monitor_mode_always_label">Заўсёды</string>
<string name="settings_scanner_mode_lowpower_label">Эканомія энергіі</string>
<string name="settings_scanner_mode_balanced_label">Збалансаваны</string>
<string name="settings_scanner_mode_lowlatency_label">Малая затрымка</string>
<string name="settings_autopause_label">Аўтапаўза</string>
<string name="settings_autopause_description">Прайграванне аўдыяфайла прыпыняецца, калі навушнік прыбраны з вашага вуха.</string>
<string name="settings_showall_label">Паказаць усе прылады</string>
<string name="settings_showall_description">Паказаць прылады іншых людзей, якія знаходзяцца побач з вамі.</string>
<string name="settings_autopplay_label">Аўтапрайграванне</string>
<string name="settings_autoplay_description">Пачаць прайграванне аўдыяфайлаў пры абуджэнні прылады.</string>
<string name="settings_fake_data_label">Пустыя даныя</string>
<string name="settings_fake_data_description">Адлюстроўваць пустыя даныя, напрыклад, сімуляваць прылады, якіх не існуе.</string>
<string name="settings_debug_label">Налады аладкі</string>
<string name="settings_debug_description">Дадатковыя налады для вырашэння праблем з дапамогай праграмы.</string>
<string name="settings_signal_minimum_label">Мінімальная якасць сігналу</string>
<string name="settings_signal_minimum_description">Мінімальная якасць сігналу, неабходная прыладзе, для распазнання яе як вашай.</string>
<string name="settings_autoconnect_label">Аўтазлучэнне</string>
<string name="settings_autoconnect_description">Калі Android не падключаецца аўтаматычна, мы можам даслаць яму запыт. Такім чынам рэжым маніторынгу зменіць свой статус на \'Заўсёды\'.</string>
<string name="settings_autoconnect_condition_label">Умова аўтаматычнага падключэння</string>
<string name="settings_autoconnect_condition_description">Калі неабходна здзейсняць спробу падключэння да вашай прылады?</string>
<string name="settings_reaction_label">Рэакцыі</string>
<string name="settings_reaction_description">Рэакцыі на падзеі і дзеянні.</string>
<string name="settings_category_yourdevice_label">Ваша прылада</string>
<string name="settings_maindevice_address_label">Адрас вашай прылады</string>
<string name="settings_maindevice_address_description">Адрас вашай звязанай прылады. Праграма выкарыстоўвае яго для вызначэння падключэння да вашага тэлефона.</string>
<string name="settings_maindevice_address_none">Няма</string>
<string name="settings_maindevice_model_label">Мадэль вашай прылады</string>
<string name="settings_maindevice_model_description">Мадэль вашай прылады. Гэта дапамагае праграме апазнаць вашу прыладу, калі яна не падключана да вашага тэлефона.</string>
<string name="settings_reaction_autoconnect_whenseen_label">Пры выяўленні</string>
<string name="settings_reaction_autoconnect_caseopen_label">Футляр адкрыты</string>
<string name="settings_reaction_autoconnect_inear_label">У вуху</string>
<string name="upgrade_capod_label">Палепшыць CAPod</string>
<string name="upgrade_capod_description">Атрымайце дадатковыя функцыі і падтрымайце распрацоўшчыка.</string>
<string name="settings_popup_caseopen_label">Паказваць апавяшчэнне</string>
<string name="settings_popup_caseopen_description">Паказваць апавяшчэнне, калі футляр прылады адчынены (эксперыментальная функцыя).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth адключаны</string>
<string name="overview_bluetooth_disabled_description">Bluetooth адключаны, уключыце яго ;)</string>
<string name="help_translate_label">Пераклад</string>
<string name="help_translate_description">Дапамажыце перакласці гэту праграму на вашу мову.</string>
<string name="settings_onepod_mode_label">Рэжым аднаго навушніка</string>
<string name="settings_onepod_mode_description">Нашэнне абодвух навушнікаў не абавязкова, нашэнне аднаго навушніка цалкам дастаткова для запуску рэакцый.</string>
<string name="permission_system_alert_window_label">Акно сістэмных папярэджанняў</string>
<string name="permission_system_alert_window_description">Дазвольце CAPod накладанне паверх іншых праграм для карэктнай работы функцыі \"Апавяшчэнні\".</string>
<string name="last_seen_x">Апошні раз быў: %s</string>
<string name="first_seen_x">Упершыню быў: %s</string>
<string name="settings_blescanner_unfiltered_label">Нефільтраваныя даныя BLE</string>
<string name="settings_blescanner_unfiltered_description">Выдаліце ўсе фільтры са сканера BLE, каб паказаць усе перададзеныя даныя BLE. Карысна пры дадаванні падтрымкі новых тыпаў навушнікаў.</string>
<string name="permission_required_title">Патрабуецца наступны дазвол:</string>
<string name="settings_compatibility_mode_label">Рэжым сумяшчальнасці</string>
<string name="settings_compatibility_mode_description">Рэжым адключае аптымізацыю для паляпшэння сумяшчальнасці. Паспрабуйце яго, калі вы не бачыце ніякіх даных.</string>
<string name="translators_thanks_title">Перакладчыкі</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Goshaproject(goooosha@gmail.com)</string>
</resources> </resources>
+3 -3
View File
@@ -11,7 +11,7 @@
<string name="general_thank_you_label">Danke</string> <string name="general_thank_you_label">Danke</string>
<string name="general_value_not_available_label">k.A.</string> <string name="general_value_not_available_label">k.A.</string>
<string name="general_grant_permission_action">Berechtigung erteilen</string> <string name="general_grant_permission_action">Berechtigung erteilen</string>
<string name="general_upgrade_action">Aktualisierung</string> <string name="general_upgrade_action">Upgrade</string>
<string name="general_check_action">Überprüfen</string> <string name="general_check_action">Überprüfen</string>
<string name="general_close_action">Schließen</string> <string name="general_close_action">Schließen</string>
<string name="debug_debuglog_size_label">Größe</string> <string name="debug_debuglog_size_label">Größe</string>
@@ -115,7 +115,7 @@
<string name="settings_reaction_autoconnect_whenseen_label">Wenn gesehen</string> <string name="settings_reaction_autoconnect_whenseen_label">Wenn gesehen</string>
<string name="settings_reaction_autoconnect_caseopen_label">Fall ist offen</string> <string name="settings_reaction_autoconnect_caseopen_label">Fall ist offen</string>
<string name="settings_reaction_autoconnect_inear_label">Im Ohr</string> <string name="settings_reaction_autoconnect_inear_label">Im Ohr</string>
<string name="upgrade_capod_label">Aktualisieren Sie CAPod</string> <string name="upgrade_capod_label">Verbesser CAPod</string>
<string name="upgrade_capod_description">Erhalten Sie zusätzliche Funktionen und unterstützen Sie den Entwickler.</string> <string name="upgrade_capod_description">Erhalten Sie zusätzliche Funktionen und unterstützen Sie den Entwickler.</string>
<string name="settings_popup_caseopen_label">Popup zeigen</string> <string name="settings_popup_caseopen_label">Popup zeigen</string>
<string name="settings_popup_caseopen_description">Ein Popup anzeigen, wenn das Gerätegehäuse geöffnet wird (experimentell).</string> <string name="settings_popup_caseopen_description">Ein Popup anzeigen, wenn das Gerätegehäuse geöffnet wird (experimentell).</string>
@@ -135,5 +135,5 @@
<string name="settings_compatibility_mode_label">Kompatibilitätsmodus</string> <string name="settings_compatibility_mode_label">Kompatibilitätsmodus</string>
<string name="settings_compatibility_mode_description">Deaktivieren Sie Optimierungen, um die Kompatibilität zu verbessern. Versuchen Sie dies, wenn Sie keine Daten sehen.</string> <string name="settings_compatibility_mode_description">Deaktivieren Sie Optimierungen, um die Kompatibilität zu verbessern. Versuchen Sie dies, wenn Sie keine Daten sehen.</string>
<string name="translators_thanks_title">Übersetzer</string> <string name="translators_thanks_title">Übersetzer</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">darken</string> <string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Gamechanger181</string>
</resources> </resources>
+2
View File
@@ -134,4 +134,6 @@
<string name="permission_required_title">Izin berikut diperlukan:</string> <string name="permission_required_title">Izin berikut diperlukan:</string>
<string name="settings_compatibility_mode_label">Mode kompatibilitas</string> <string name="settings_compatibility_mode_label">Mode kompatibilitas</string>
<string name="settings_compatibility_mode_description">Nonaktifkan pengoptimalan untuk meningkatkan kompatibilitas. Coba ini jika anda tidak melihat data apa pun.</string> <string name="settings_compatibility_mode_description">Nonaktifkan pengoptimalan untuk meningkatkan kompatibilitas. Coba ini jika anda tidak melihat data apa pun.</string>
<string name="translators_thanks_title">Penerjemah</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">darken</string>
</resources> </resources>
+1 -1
View File
@@ -71,7 +71,7 @@
<string name="settings_support_description">Jika anda perlukan bantuan.</string> <string name="settings_support_description">Jika anda perlukan bantuan.</string>
<string name="issue_tracker_label">Penjejak isu</string> <string name="issue_tracker_label">Penjejak isu</string>
<string name="issue_tracker_description">Penjejak isu awam untuk laporan pepijat dan permintaan ciri (bahasa Inggeris sahaja).</string> <string name="issue_tracker_description">Penjejak isu awam untuk laporan pepijat dan permintaan ciri (bahasa Inggeris sahaja).</string>
<string name="discord_label">Perselisihan</string> <string name="discord_label">Discord</string>
<string name="discord_description">Tempat melepak dan bertanya soalan.</string> <string name="discord_description">Tempat melepak dan bertanya soalan.</string>
<string name="settings_support_email_developer_description">Ambil perhatian bahawa saya hanya boleh membalas dalam bahasa Jerman atau Inggeris.</string> <string name="settings_support_email_developer_description">Ambil perhatian bahawa saya hanya boleh membalas dalam bahasa Jerman atau Inggeris.</string>
<string name="settings_debug_autoreports_label">Laporan pepijat automatik</string> <string name="settings_debug_autoreports_label">Laporan pepijat automatik</string>
+2 -2
View File
@@ -118,7 +118,7 @@
<string name="upgrade_capod_label">Atualizar CAPod</string> <string name="upgrade_capod_label">Atualizar CAPod</string>
<string name="upgrade_capod_description">Obtenha recursos adicionais e dê suporte ao desenvolvedor.</string> <string name="upgrade_capod_description">Obtenha recursos adicionais e dê suporte ao desenvolvedor.</string>
<string name="settings_popup_caseopen_label">Mostrar pop-up</string> <string name="settings_popup_caseopen_label">Mostrar pop-up</string>
<string name="settings_popup_caseopen_description">Mostrar um pop-up quando o estojo do dispositivo for aberta (experimental).</string> <string name="settings_popup_caseopen_description">Mostrar um pop-up quando o estojo do dispositivo for aberto (experimental).</string>
<string name="overview_bluetooth_disabled_label">Bluetooth está desativado</string> <string name="overview_bluetooth_disabled_label">Bluetooth está desativado</string>
<string name="overview_bluetooth_disabled_description">O Bluetooth está desabilitado, habilite-o ;)</string> <string name="overview_bluetooth_disabled_description">O Bluetooth está desabilitado, habilite-o ;)</string>
<string name="help_translate_label">Tradução</string> <string name="help_translate_label">Tradução</string>
@@ -135,5 +135,5 @@
<string name="settings_compatibility_mode_label">Modo de compatibilidade</string> <string name="settings_compatibility_mode_label">Modo de compatibilidade</string>
<string name="settings_compatibility_mode_description">Desative as otimizações para melhorar a compatibilidade. Tente isso se você não estiver vendo nenhum dado.</string> <string name="settings_compatibility_mode_description">Desative as otimizações para melhorar a compatibilidade. Tente isso se você não estiver vendo nenhum dado.</string>
<string name="translators_thanks_title">Tradutores</string> <string name="translators_thanks_title">Tradutores</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Igor Silva(ferrare42@gmail.com)</string> <string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Igor Silva (ferrare42@gmail.com)</string>
</resources> </resources>
+1
View File
@@ -95,6 +95,7 @@
<string name="last_seen_x">Востаннє був: %s</string> <string name="last_seen_x">Востаннє був: %s</string>
<string name="first_seen_x">Уперше був: %s</string> <string name="first_seen_x">Уперше був: %s</string>
<string name="permission_required_title">Необхідні наступні дозволи:</string> <string name="permission_required_title">Необхідні наступні дозволи:</string>
<string name="settings_compatibility_mode_label">Режим сумісності</string>
<string name="translators_thanks_title">Перекладачі</string> <string name="translators_thanks_title">Перекладачі</string>
<string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Ievgen Gil</string> <string name="translators_thanks_description" comment="translators_thanks_description&#10;&#10;You can voluntarily add your name here to have it displayed in the app. It will be shown in the Settings&gt;Acknowledgements&gt;Thank you section.&#10;&#10;Separate names by semicolons and an optional email may be included in brackets, example:&#10;&#10;darken(darken@darken.eu);John Doe(john@example.com)&#10;&#10;&quot;darken&quot; is just a placeholder and does not have to be kept if/when you add yours.&#10;&#10;Be nice to each other!">Ievgen Gil</string>
</resources> </resources>
+2 -2
View File
@@ -21,8 +21,8 @@
<string name="debug_debuglog_record_action">Ghi nhật ký gỡ lỗi</string> <string name="debug_debuglog_record_action">Ghi nhật ký gỡ lỗi</string>
<string name="permission_bluetooth_connect_label">Kết nối Bluetooth</string> <string name="permission_bluetooth_connect_label">Kết nối Bluetooth</string>
<string name="permission_bluetooth_connect_description">Ứng dụng này yêu cầu quyền \"Kết nối Bluetooth\" để tương tác với các thiết bị được ghép nối và bắt đầu kết nối.</string> <string name="permission_bluetooth_connect_description">Ứng dụng này yêu cầu quyền \"Kết nối Bluetooth\" để tương tác với các thiết bị được ghép nối và bắt đầu kết nối.</string>
<string name="permission_bluetooth_scan_label">Quét Bluetooth</string> <string name="permission_bluetooth_scan_label">Quét qua Bluetooth</string>
<string name="permission_bluetooth_scan_description">Quyền \"quét Bluetooth\" cho phép ứng dụng này khám phá và nhận dữ liệu Bluetooth từ các thiết bị lân cận, chẳng hạn như AirPods của bạn.</string> <string name="permission_bluetooth_scan_description">Quyền \"quét qua Bluetooth\" cho phép ứng dụng này khám phá và nhận dữ liệu Bluetooth từ các thiết bị lân cận, chẳng hạn như AirPods của bạn.</string>
<string name="permission_bluetooth_label">Bluetooth</string> <string name="permission_bluetooth_label">Bluetooth</string>
<string name="permission_bluetooth_description">Ứng dụng này yêu cầu quyền \"Bluetooth\" để kết nối với các thiết bị Bluetooth được ghép nối.</string> <string name="permission_bluetooth_description">Ứng dụng này yêu cầu quyền \"Bluetooth\" để kết nối với các thiết bị Bluetooth được ghép nối.</string>
<string name="permission_access_fine_location_label">Truy cập vị trí chính xác</string> <string name="permission_access_fine_location_label">Truy cập vị trí chính xác</string>
+6 -6
View File
@@ -17,8 +17,8 @@
<string name="debug_debuglog_size_label">大小</string> <string name="debug_debuglog_size_label">大小</string>
<string name="debug_debuglog_size_compressed_label">壓縮後大小</string> <string name="debug_debuglog_size_compressed_label">壓縮後大小</string>
<string name="debug_notification_channel_label">偵錯通知</string> <string name="debug_notification_channel_label">偵錯通知</string>
<string name="debug_debuglog_file_label">已記錄的日誌</string> <string name="debug_debuglog_file_label">已記錄的記錄</string>
<string name="debug_debuglog_record_action">記錄偵錯日誌</string> <string name="debug_debuglog_record_action">記錄偵錯記錄</string>
<string name="permission_bluetooth_connect_label">藍牙連線</string> <string name="permission_bluetooth_connect_label">藍牙連線</string>
<string name="permission_bluetooth_connect_description">本應用程式需要「藍牙連線」權限以與已配對的裝置交互或配對新裝置。</string> <string name="permission_bluetooth_connect_description">本應用程式需要「藍牙連線」權限以與已配對的裝置交互或配對新裝置。</string>
<string name="permission_bluetooth_scan_label">藍牙掃描</string> <string name="permission_bluetooth_scan_label">藍牙掃描</string>
@@ -83,8 +83,8 @@
<string name="settings_scanner_mode_label">掃描模式</string> <string name="settings_scanner_mode_label">掃描模式</string>
<string name="settings_scanner_mode_description">低功耗藍牙掃描器應該優先考慮效能還是節能?</string> <string name="settings_scanner_mode_description">低功耗藍牙掃描器應該優先考慮效能還是節能?</string>
<string name="settings_monitor_mode_manual_label">應用程式開啟時</string> <string name="settings_monitor_mode_manual_label">應用程式開啟時</string>
<string name="settings_monitor_mode_automatic_label">裝置連</string> <string name="settings_monitor_mode_automatic_label">裝置連</string>
<string name="settings_monitor_mode_always_label">總是</string> <string name="settings_monitor_mode_always_label">一律</string>
<string name="settings_scanner_mode_lowpower_label">節電</string> <string name="settings_scanner_mode_lowpower_label">節電</string>
<string name="settings_scanner_mode_balanced_label">平衡</string> <string name="settings_scanner_mode_balanced_label">平衡</string>
<string name="settings_scanner_mode_lowlatency_label">低延遲</string> <string name="settings_scanner_mode_lowlatency_label">低延遲</string>
@@ -101,7 +101,7 @@
<string name="settings_signal_minimum_label">最低訊號質量</string> <string name="settings_signal_minimum_label">最低訊號質量</string>
<string name="settings_signal_minimum_description">可以被認為是你的裝置的最低訊號質量。</string> <string name="settings_signal_minimum_description">可以被認為是你的裝置的最低訊號質量。</string>
<string name="settings_autoconnect_label">自動連線</string> <string name="settings_autoconnect_label">自動連線</string>
<string name="settings_autoconnect_description">如果 Android 不會自動連線,我們也可以要求它。這將把監視模式設定為「總是」。</string> <string name="settings_autoconnect_description">如果 Android 不會自動連線,我們也可以要求它。這將把監視模式設定為「一律」。</string>
<string name="settings_autoconnect_condition_label">自動連線條件</string> <string name="settings_autoconnect_condition_label">自動連線條件</string>
<string name="settings_autoconnect_condition_description">何時連線到你的裝置?</string> <string name="settings_autoconnect_condition_description">何時連線到你的裝置?</string>
<string name="settings_reaction_label">反應</string> <string name="settings_reaction_label">反應</string>
@@ -123,7 +123,7 @@
<string name="overview_bluetooth_disabled_description">藍牙已停用,啟用它 ;)</string> <string name="overview_bluetooth_disabled_description">藍牙已停用,啟用它 ;)</string>
<string name="help_translate_label">翻譯</string> <string name="help_translate_label">翻譯</string>
<string name="help_translate_description">協助翻譯為你的最愛語言。</string> <string name="help_translate_description">協助翻譯為你的最愛語言。</string>
<string name="settings_onepod_mode_label">耳模式</string> <string name="settings_onepod_mode_label">單耳模式</string>
<string name="settings_onepod_mode_description">不需要同時佩戴兩隻耳機,單隻耳機就可充分觸發反應。</string> <string name="settings_onepod_mode_description">不需要同時佩戴兩隻耳機,單隻耳機就可充分觸發反應。</string>
<string name="permission_system_alert_window_label">系統警報視窗</string> <string name="permission_system_alert_window_label">系統警報視窗</string>
<string name="permission_system_alert_window_description">允許 CAPod 在其他應用程式上繪圖,使「顯示彈出式視窗」功能成為可能。</string> <string name="permission_system_alert_window_description">允許 CAPod 在其他應用程式上繪圖,使「顯示彈出式視窗」功能成為可能。</string>
+11 -1
View File
@@ -7,7 +7,17 @@
<item name="android:layout_marginEnd">8dp</item> <item name="android:layout_marginEnd">8dp</item>
</style> </style>
<style name="PodInfoItemIcon"> <style name="PodInfoItemIcon.Notification" parent="TextAppearance.Compat.Notification.Title">
<item name="android:layout_height">20dp</item>
<item name="android:layout_width">20dp</item>
</style>
<style name="PodInfoItemText.Notification" parent="TextAppearance.Compat.Notification.Title">
<item name="android:singleLine">true</item>
<item name="android:ellipsize">end</item>
</style>
<style name="PodInfoItemIcon" parent="TextAppearance.MaterialComponents.Body2">
<item name="android:layout_height">20dp</item> <item name="android:layout_height">20dp</item>
<item name="android:layout_width">20dp</item> <item name="android:layout_width">20dp</item>
</style> </style>
@@ -50,13 +50,6 @@
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/settings_category_other_label"> <PreferenceCategory android:title="@string/settings_category_other_label">
<CheckBoxPreference
android:icon="@drawable/ic_spider_thread_onsurface"
android:key="debug.bugreport.automatic.enabled"
android:summary="@string/settings_debug_autoreports_description"
android:title="@string/settings_debug_autoreports_label" />
<Preference <Preference
android:fragment="eu.darken.capod.main.ui.settings.general.debug.DebugSettingsFragment" android:fragment="eu.darken.capod.main.ui.settings.general.debug.DebugSettingsFragment"
android:icon="@drawable/ic_baseline_bug_report_24" android:icon="@drawable/ic_baseline_bug_report_24"
+1 -1
View File
@@ -27,7 +27,7 @@
app:summary="v?.?.?"> app:summary="v?.?.?">
<intent <intent
android:action="android.intent.action.VIEW" android:action="android.intent.action.VIEW"
android:data="https://github.com/d4rken/capod-public/releases/latest" /> android:data="https://github.com/d4rken-org/capod/releases/latest" />
</Preference> </Preference>
<Preference <Preference
+13 -13
View File
@@ -1,15 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
android:icon="@drawable/ic_github_onsurface"
android:summary="@string/issue_tracker_description"
android:title="@string/issue_tracker_label">
<intent
android:action="android.intent.action.VIEW"
android:data="https://github.com/d4rken/capod-public/issues" />
</Preference>
<Preference <Preference
android:icon="@drawable/ic_discord_onsurface" android:icon="@drawable/ic_discord_onsurface"
android:summary="@string/discord_description" android:summary="@string/discord_description"
@@ -19,10 +10,13 @@
android:data="https://discord.gg/rrxxng35jq" /> android:data="https://discord.gg/rrxxng35jq" />
</Preference> </Preference>
<Preference <Preference
android:icon="@drawable/ic_email_onsurface" android:icon="@drawable/ic_github_onsurface"
android:key="support.email.darken" android:summary="@string/issue_tracker_description"
android:summary="@string/settings_support_email_developer_description" android:title="@string/issue_tracker_label">
android:title="@string/settings_support_email_developer_label" /> <intent
android:action="android.intent.action.VIEW"
android:data="https://github.com/d4rken-org/capod/issues" />
</Preference>
<PreferenceCategory app:title="@string/settings_category_other_label"> <PreferenceCategory app:title="@string/settings_category_other_label">
<Preference <Preference
@@ -30,5 +24,11 @@
android:key="support.installid" android:key="support.installid"
android:summary="@string/settings_support_installid_desc" android:summary="@string/settings_support_installid_desc"
android:title="@string/settings_support_installid_label" /> android:title="@string/settings_support_installid_label" />
<CheckBoxPreference
android:icon="@drawable/ic_spider_thread_onsurface"
android:key="debug.bugreport.automatic.enabled"
android:summary="@string/settings_debug_autoreports_description"
android:title="@string/settings_debug_autoreports_label" />
</PreferenceCategory> </PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>
+2 -3
View File
@@ -8,13 +8,12 @@ buildscript {
'version' : [ 'version' : [
'major': 1, 'major': 1,
'minor': 3, 'minor': 3,
'patch': 9, 'patch': 14,
'build': 0, 'build': 0,
], ],
] ]
ext.buildConfig.version['name'] = "${buildConfig.version.major}.${buildConfig.version.minor}.${buildConfig.version.patch}" ext.buildConfig.version['name'] = "${buildConfig.version.major}.${buildConfig.version.minor}.${buildConfig.version.patch}-rc${buildConfig.version.build}"
ext.buildConfig.version['fullName'] = "${buildConfig.version.name}.${buildConfig.version.build}"
ext.buildConfig.version['code'] = buildConfig.version.major * 1000000 + buildConfig.version.minor * 10000 + buildConfig.version.patch * 100 + buildConfig.version.build ext.buildConfig.version['code'] = buildConfig.version.major * 1000000 + buildConfig.version.minor * 10000 + buildConfig.version.patch * 100 + buildConfig.version.build
ext.versions = [ ext.versions = [
-2
View File
@@ -1,2 +0,0 @@
json_key_file "~/.fastlaneconfig/androiddev-console-darken_development-4f6965ff0eda.json" # Path to the json secret file - Follow https://github.com/fastlane/supply#setup to get one
package_name "eu.darken.capod" # e.g. com.krausefx.app
+23 -9
View File
@@ -11,7 +11,7 @@
# This is the minimum version number required. # This is the minimum version number required.
# Update this, if you use features of a newer version # Update this, if you use features of a newer version
fastlane_version "2.204.3" fastlane_version "2.208.0"
default_platform :android default_platform :android
@@ -21,17 +21,31 @@ platform :android do
end end
lane :beta do lane :beta do
ensure_git_branch(branch: 'dev') gradle(task: 'clean bundleGplayBeta')
git_pull sh "bash ./remove_unsupported_languages.sh"
gradle(task: 'clean assembleRelease') supply(
supply(track: 'beta') track: 'beta',
package_name: 'eu.darken.capod',
skip_upload_changelogs: 'false',
skip_upload_apk: 'true',
skip_upload_images: 'true',
skip_upload_screenshots: 'true',
skip_upload_metadata: 'true',
)
end end
lane :production do lane :production do
ensure_git_branch(branch: 'master') gradle(task: 'clean bundleGplayRelease')
git_pull sh "bash ./remove_unsupported_languages.sh"
gradle(task: 'clean assembleRelease') supply(
supply(track: 'rollout', rollout: '0.1') track: 'beta',
package_name: 'eu.darken.capod',
skip_upload_changelogs: 'false',
skip_upload_apk: 'true',
skip_upload_images: 'true',
skip_upload_screenshots: 'true',
skip_upload_metadata: 'true',
)
end end
lane :listing_only do lane :listing_only do
@@ -1,17 +1,17 @@
CAPod is a companion app for AirPods. CAPod — праграма-кампаньён для AirPods.
Features: Магчымасці:
* Battery level for pods and cases. * Узровень зараду батарэі для навушнікаў і футляраў.
* Charging status for pods and case. * Статус зарадкі для навушнікаў і футляра.
* Additional infos about connection, microphone and case. * Дадатковыя звесткі пра злучэнне, мікрафон і футляр.
* Can receive and show all nearby devices. * Магчымасць атрымання і адлюстравання інфармацыі пра ўсе прылады паблізу.
* Ear detection with automatic play/pause. * Выяўленне вуха з аўтаматычным прайграваннем/паўзай.
* Automatically connect phone and AirPods. * Аўтаматычнае злучэнне тэлефона і AirPods.
* Show popup when case is opened. * Адлюстраванне апавяшчэння пры адкрытым футляры.
CAPod is ad-free. Some features require an in-app purchase. CAPod не змяшчае рэкламы. Некаторыя функцыі патрабуюць пакупак у праграме.
Most popular AirPods and Beats devices are supported. Падтрымліваюцца найбольш папулярныя мадэлі AirPods і Beats.
If your device is similar to AirPods but not yet supported, send me a short mail. Калі ваша прылада падобная да AirPods, але яшчэ не падтрымліваецца, дашліце мне кароткі ліст па эл. пошце.
Got a cool idea for a new feature? Reach out! Маеце файную ідэю для новай функцыі? Вам сюды!
@@ -1 +1 @@
CAPod is a companion app for AirPods on Android. CAPod — праграма-кампаньён для AirPods на Android.
+1 -1
View File
@@ -1 +1 @@
CAPod - Companion for AirPods CAPod - кампаньён для AirPods
@@ -0,0 +1,4 @@
v1.3.13(1031300)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031301)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031302)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031303)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031304)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031305)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031306)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,4 @@
v1.3.13(1031307)
• Updated translations
• Updated internal dependencies
• Tweaked placement of UI elements
@@ -0,0 +1,3 @@
Bugfixes and performance improvements.
¯\_(ツ)_/¯
@@ -1,6 +1,7 @@
CAPod is a companion app for AirPods. CAPod is a companion app for AirPods.
Features: Features:
* Battery level for pods and cases. * Battery level for pods and cases.
* Charging status for pods and case. * Charging status for pods and case.
* Additional infos about connection, microphone and case. * Additional infos about connection, microphone and case.
+1 -1
View File
@@ -1 +1 @@
CAPod - Companion for AirPods A CAPod az AirPods kísérőalkalmazása
+1 -1
View File
@@ -1 +1 @@
CAPod - Companion for AirPods CAPod - Companion app per le Airpods
+1 -1
View File
@@ -1 +1 @@
CAPod - Companion for AirPods CAPod - Complemento para AirPods
+1 -1
View File
@@ -1 +1 @@
CAPod - Companion for AirPods CAPod - Bạn đồng hành cho AirPods
@@ -9,7 +9,7 @@ CAPod 是一個能提供 AirPods 相關功能的應用程式。
* 自動連線手機和 AirPods。 * 自動連線手機和 AirPods。
* 開啟充電盒時顯示彈出式視窗。 * 開啟充電盒時顯示彈出式視窗。
CAPod 是無廣告的應用程式。 一些功能需要應用內購 CAPod 是無廣告的應用程式。 一些功能需要應用內購。
支援大部分流行的 AirPods 和 Beats 裝置。 支援大部分流行的 AirPods 和 Beats 裝置。
如果你的裝置和 AirPods 相似但不支援,請寄給我一封郵件。 如果你的裝置和 AirPods 相似但不支援,請寄給我一封郵件。
+1
View File
@@ -11,5 +11,6 @@ rm -rv ./metadata/android/ku-TR
rm -rv ./metadata/android/kmr-TR rm -rv ./metadata/android/kmr-TR
rm -rv ./metadata/android/ur-IN rm -rv ./metadata/android/ur-IN
rm -rv ./metadata/android/zu rm -rv ./metadata/android/zu
rm -rv ./metadata/android/si-LK
find ./metadata/android -empty -type d -delete find ./metadata/android -empty -type d -delete
exit 0 exit 0
-10
View File
@@ -1,10 +0,0 @@
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=/home/darken/Android/sdk