mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-14 18:26:11 -04:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e913e7847 | ||
|
|
ec7871e4e9 | ||
|
|
cc5a45a14f | ||
|
|
5fff3457ba | ||
|
|
6f5d66c1d9 | ||
|
|
d94795bf4f | ||
|
|
009b71c42a | ||
|
|
a10716d74e | ||
|
|
b44bf5f401 | ||
|
|
e0af1838e2 | ||
|
|
7d5502a34f | ||
|
|
78ccddf87c | ||
|
|
df1bc48e84 |
@@ -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
|
||||||
@@ -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/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/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
@@ -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/*
|
||||||
|
|||||||
+28
-10
@@ -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.
|
||||||
|
|||||||
@@ -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)
|
||||||
|
[](https://github.com/d4rken-org/capod/releases/latest)
|
||||||

|
[](https://github.com/d4rken/capod/actions/workflows/code-checks.yml)
|
||||||
[](https://github.com/d4rken/capod/releases/latest)
|
[](https://crowdin.com/project/capod)
|
||||||
|
[](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,22 @@ 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)
|
||||||
|
|
||||||
## 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)
|
||||||
* 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)
|
||||||
|
* [Email](mailto:support@darken.eu)
|
||||||
|
|
||||||
## 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
@@ -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")
|
||||||
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) { _, _ ->
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
+1
-1
@@ -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 {
|
||||||
|
|||||||
@@ -67,6 +67,6 @@ class GeneralSettings @Inject constructor(
|
|||||||
showAll,
|
showAll,
|
||||||
minimumSignalQuality,
|
minimumSignalQuality,
|
||||||
mainDeviceAddress,
|
mainDeviceAddress,
|
||||||
debugSettings.isAutoReportEnabled,
|
debugSettings.isAutoReportingEnabled,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -15,9 +15,9 @@ import javax.inject.Inject
|
|||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class SupportFragmentVM @Inject constructor(
|
class SupportFragmentVM @Inject constructor(
|
||||||
private val handle: SavedStateHandle,
|
private val handle: SavedStateHandle,
|
||||||
|
private val dispatcherProvider: DispatcherProvider,
|
||||||
private val emailTool: EmailTool,
|
private val emailTool: EmailTool,
|
||||||
private val installId: InstallId,
|
private val installId: InstallId,
|
||||||
private val dispatcherProvider: DispatcherProvider,
|
|
||||||
) : ViewModel3(dispatcherProvider) {
|
) : ViewModel3(dispatcherProvider) {
|
||||||
|
|
||||||
val emailEvent = SingleLiveEvent<Intent>()
|
val emailEvent = SingleLiveEvent<Intent>()
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
android:title="@string/issue_tracker_label">
|
android:title="@string/issue_tracker_label">
|
||||||
<intent
|
<intent
|
||||||
android:action="android.intent.action.VIEW"
|
android:action="android.intent.action.VIEW"
|
||||||
android:data="https://github.com/d4rken/capod-public/issues" />
|
android:data="https://github.com/d4rken-org/capod/issues" />
|
||||||
</Preference>
|
</Preference>
|
||||||
<Preference
|
<Preference
|
||||||
android:icon="@drawable/ic_discord_onsurface"
|
android:icon="@drawable/ic_discord_onsurface"
|
||||||
@@ -30,5 +30,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>
|
||||||
+1
-1
@@ -8,7 +8,7 @@ buildscript {
|
|||||||
'version' : [
|
'version' : [
|
||||||
'major': 1,
|
'major': 1,
|
||||||
'minor': 3,
|
'minor': 3,
|
||||||
'patch': 11,
|
'patch': 13,
|
||||||
'build': 0,
|
'build': 0,
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
|
|||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
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
|
json_key_file "~/.appconfig/eu.darken.capod/gplay-capod-ci_api.json"
|
||||||
package_name "eu.darken.capod" # e.g. com.krausefx.app
|
package_name "eu.darken.capod"
|
||||||
|
|||||||
+21
-9
@@ -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.175.0"
|
||||||
|
|
||||||
default_platform :android
|
default_platform :android
|
||||||
|
|
||||||
@@ -21,17 +21,29 @@ platform :android do
|
|||||||
end
|
end
|
||||||
|
|
||||||
lane :beta do
|
lane :beta do
|
||||||
ensure_git_branch(branch: 'dev')
|
gradle(task: 'clean assembleGplayBeta')
|
||||||
git_pull
|
sh "bash ./remove_unsupported_languages.sh"
|
||||||
gradle(task: 'clean assembleRelease')
|
supply(
|
||||||
supply(track: 'beta')
|
track: 'beta',
|
||||||
|
skip_upload_changelogs: 'false',
|
||||||
|
skip_upload_images: 'true',
|
||||||
|
skip_upload_screenshots: 'true',
|
||||||
|
skip_upload_aab: 'true',
|
||||||
|
skip_upload_metadata: 'true',
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
lane :production do
|
lane :production do
|
||||||
ensure_git_branch(branch: 'master')
|
gradle(task: 'clean assembleGplayRelease')
|
||||||
git_pull
|
sh "bash ./remove_unsupported_languages.sh"
|
||||||
gradle(task: 'clean assembleRelease')
|
supply(
|
||||||
supply(track: 'rollout', rollout: '0.1')
|
track: 'beta',
|
||||||
|
skip_upload_changelogs: 'false',
|
||||||
|
skip_upload_images: 'true',
|
||||||
|
skip_upload_screenshots: 'true',
|
||||||
|
skip_upload_aab: 'true',
|
||||||
|
skip_upload_metadata: 'true',
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
lane :listing_only do
|
lane :listing_only do
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
|
||||||
Reference in New Issue
Block a user