diff options
| author | Danilo M. <danix@danix.xyz> | 2026-11-02 13:31:30 +0100 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-11-02 13:31:30 +0100 |
| commit | f78754e26c6274f997bbfe0798f47aa86f8f8133 (patch) | |
| tree | b232000eafbb4b143a63b66e2930a1064b59a494 | |
| parent | 5972d8bb6ab2369e298be0e6641d92ab8f1b2f7a (diff) | |
| download | HardenedPass-f78754e26c6274f997bbfe0798f47aa86f8f8133.tar.gz HardenedPass-f78754e26c6274f997bbfe0798f47aa86f8f8133.zip | |
build: drop the nonFree flavor, Sentry and Play Services
The fork targets GrapheneOS and ships only FOSS builds. The nonFree
flavor added Sentry crash reporting, wired to upstream's Sentry project,
and Play Services SMS one-time-code autofill, which needs Google's
servers. Neither is wanted, so remove the flavor dimension entirely:
- Delete app/src/nonFree, the SentryPlugin, the sentry-stub module, the
Sentry and Play Services catalog entries, and the Sentry scope setup
in Application.
- Move the free AutofillSmsActivity stub into main; it keeps the SMS
OTP feature off exactly as the free build did. A ponytail note marks
the FillOtpFromSms paths for later removal.
- SlimTests no longer needs to skip a nonFree variant.
- Workflows and docs use :app:assembleDebug / :app:assembleRelease. A
bare assembleRelease would also verify library modules in release
mode, where ui:compose fails on a pre-existing AppCompat attribute
reference the old flavored task never touched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 files changed, 23 insertions, 600 deletions
diff --git a/.github/workflows/codeql_analysis.yml b/.github/workflows/codeql_analysis.yml index 8928d64e..63661320 100644 --- a/.github/workflows/codeql_analysis.yml +++ b/.github/workflows/codeql_analysis.yml @@ -5,8 +5,6 @@ on: schedule: - cron: '0 6 * * 1' -env: - SENTRY_DSN: 'https://public_key@example.com/project_id' jobs: analyze: @@ -29,7 +27,7 @@ jobs: - name: Build project shell: bash - run: ./gradlew assembleNonFreeRelease + run: ./gradlew :app:assembleRelease - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@c36620d31ac7c881962c3d9dd939c40ec9434f2b # v3.26.12 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index b61a5320..8c1b3605 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -11,8 +11,6 @@ concurrency: group: ${{ github.head_ref || github.ref_name }} cancel-in-progress: true -env: - SENTRY_DSN: 'https://public_key@example.com/project_id' jobs: check-codestyle: @@ -64,7 +62,7 @@ jobs: - name: Build debug APKs shell: bash - run: ./gradlew assembleFreeDebug assembleNonFreeDebug assembleNonFreeRelease + run: ./gradlew :app:assembleDebug :app:assembleRelease - name: Upload Kotlin build report if: "${{ always() }}" @@ -11,7 +11,7 @@ started in November 2026 from upstream's last commit. Kotlin, Gradle, about 18k Modules: `app` (UI, git sync, autofill service), `autofill-parser`, `crypto:common`, `crypto:pgpainless`, `format:common`, `passgen:diceware`, `passgen:random`, `ui:compose`, -`coroutine-utils`, `sentry-stub`. Build conventions live in `build-logic/`. +`coroutine-utils`. Build conventions live in `build-logic/`. The app name and `applicationId` (`app.passwordstore`) are still upstream's on purpose. Do not rename them unless asked: it is tied to the release-signing decision (see Releases). @@ -30,7 +30,7 @@ rename them unless asked: it is tied to the release-signing decision (see Releas Needs JDK 17 and the Android SDK. `local.properties` (gitignored) holds `sdk.dir`. - ./gradlew assembleFreeDebug # debug APK + ./gradlew :app:assembleDebug # debug APK ./gradlew test -PslimTests # unit tests, as CI runs them ./gradlew spotlessApply # formatting (ktfmt); CI runs spotlessCheck ./gradlew lint # all modules and variants, as CI runs it @@ -38,11 +38,13 @@ Needs JDK 17 and the Android SDK. `local.properties` (gitignored) holds `sdk.dir Prefix with `CI=1` to match CI: it turns Kotlin warnings into errors, so a deprecation warning that passes locally fails CI. Before committing, run: - CI=1 ./gradlew spotlessCheck test -PslimTests assembleFreeDebug assembleFreeRelease \ - assembleNonFreeDebug assembleNonFreeRelease lint metalavaCheckCompatibilityRelease + CI=1 ./gradlew spotlessCheck test -PslimTests :app:assembleDebug :app:assembleRelease \ + lint metalavaCheckCompatibilityRelease -Flavors: `free` (no proprietary dependencies, Sentry replaced by `sentry-stub`) and `nonFree` -(adds Sentry and Play Services SMS OTP). +No product flavors: the app has no proprietary dependencies, no Sentry and no Play Services +(the upstream `nonFree` flavor was removed). Scope `assemble*` to `:app`; a bare +`assembleRelease` also verifies library modules in release mode, where `ui:compose` fails on a +drawable using an AppCompat attribute it does not depend on. CI is `.github/workflows/pull_request.yml` (named "CI"), on push to `master`. Workflows use the `setup-gradle` composite action from this fork at `@master`. It checks the repository out @@ -61,7 +63,7 @@ in `local.properties`: $ANDROID_HOME/emulator/emulator -avd aps-test -no-window -no-audio -no-boot-anim \ -no-snapshot-save -gpu swiftshader_indirect & - ./gradlew installFreeDebug + ./gradlew installDebug Drive it with `adb shell input`, `uiautomator dump` and `screencap`. Decrypt screens set `FLAG_SECURE`, so screenshots of them are black; read them from the `uiautomator` dump. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 097c61dc..7f83d413 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,7 +28,6 @@ The source code is split across 12 modules and 1 subproject. - `format/common` handles parsing the `pass` file format. - `passgen/diceware` is our new password generator that implements the [Diceware](https://theworld.com/~reinhold/diceware.html) algorithm. - `passgen/random` contains the default password generator. -- `sentry-stub` contains no-op variants of [Sentry](https://sentry.io/) APIs that we use to ensure the FOSS-only, telemetry-free variant of APS continues to compile in absence of Sentry dependencies. - `ui/compose` has the theming code for building UI components in [Jetpack Compose](https://developer.android.com/jetpack/compose). - `app` is everything else that constitutes APS. @@ -47,11 +46,10 @@ We bundle a [`ignore-revs-file`](https://git-scm.com/docs/git-blame#Documentatio This document assumes that you already have an Android development environment ready. If not, refer to Google's documentation on [installing Android Studio](https://developer.android.com/studio/preview). APS will build with all editions of Android Studio, but development typically happens with the Canary channel. -The app comes in two 'flavors', a FOSS-only **free** variant and a **nonFree** variant that contains proprietary Google dependencies to facilitate some additional features as documented [here](https://android-password-store.github.io/docs/users/build-types). Decide what flavor you want to build, then run the following command to generate a debug APK. +Run the following command to generate a debug APK. ```shell -./gradlew collectFreeDebugApks # for 'free' flavor -./gradlew collectNonFreeDebugApks # for 'nonFree' flavor +./gradlew collectDebugApks ``` You can find the generated APK at `app/outputs`. @@ -24,12 +24,12 @@ Requires JDK 17 and the Android SDK command-line tools. Point Gradle at the SDK `local.properties` file (`sdk.dir=/path/to/Android/Sdk`), then: ``` -./gradlew assembleFreeDebug # APK in app/build/outputs/apk/free/debug/ +./gradlew :app:assembleDebug # APK in app/build/outputs/apk/debug/ ./gradlew test -PslimTests # unit tests ``` -The `free` flavor has no proprietary dependencies. The `nonFree` flavor adds Sentry crash -reporting and Google Play Services SMS OTP autofill. +The app has no proprietary dependencies: no crash reporting, no telemetry, no Google Play +Services. ## Issues diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bff7d73a..0105bd4e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -8,7 +8,6 @@ plugins { id("com.github.android-password-store.android-application") id("com.github.android-password-store.kotlin-android") id("com.github.android-password-store.versioning-plugin") - id("com.github.android-password-store.sentry") id("com.github.android-password-store.rename-artifacts") alias(libs.plugins.hilt) alias(libs.plugins.ksp) @@ -100,10 +99,6 @@ dependencies { because("SSHJ now uses SLF4J 2.0 which we don't want") } - nonFreeImplementation(libs.thirdparty.nonfree.googlePlayAuthApiPhone) - nonFreeImplementation(libs.thirdparty.nonfree.sentry) - freeImplementation(projects.sentryStub) - testImplementation(libs.testing.robolectric) testImplementation(libs.testing.sharedPrefsMock) testImplementation(libs.bundles.testDependencies) diff --git a/app/src/main/java/app/passwordstore/Application.kt b/app/src/main/java/app/passwordstore/Application.kt index 9bc4c83e..8eb421f4 100644 --- a/app/src/main/java/app/passwordstore/Application.kt +++ b/app/src/main/java/app/passwordstore/Application.kt @@ -17,7 +17,6 @@ import app.passwordstore.injection.context.FilesDirPath import app.passwordstore.injection.prefs.SettingsPreferences import app.passwordstore.util.coroutines.DispatcherProvider import app.passwordstore.util.extensions.getString -import app.passwordstore.util.features.Feature import app.passwordstore.util.features.Features import app.passwordstore.util.git.sshj.setUpBouncyCastleForSshj import app.passwordstore.util.proxy.ProxyUtils @@ -26,8 +25,6 @@ import app.passwordstore.util.settings.PreferenceKeys import app.passwordstore.util.settings.runMigrations import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp -import io.sentry.Sentry -import io.sentry.protocol.User import java.util.concurrent.Executors import javax.inject.Inject import logcat.AndroidLogcatLogger @@ -67,14 +64,6 @@ class Application : android.app.Application(), SharedPreferences.OnSharedPrefere runMigrations(filesDirPath, prefs, gitSettings) proxyUtils.setDefaultProxy() DynamicColors.applyToActivitiesIfAvailable(this) - Sentry.configureScope { scope -> - val user = User() - user.data = - Feature.entries.associate { feature -> - "features.${feature.configKey}" to features.isEnabled(feature).toString() - } - scope.user = user - } setupScreenOffHandler() } diff --git a/app/src/free/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt b/app/src/main/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt index 83d1fdae..7acc72f9 100644 --- a/app/src/free/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt +++ b/app/src/main/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt @@ -8,6 +8,8 @@ import android.content.Context import android.content.IntentSender import androidx.appcompat.app.AppCompatActivity +// ponytail: filling OTPs from SMS needed Play Services (removed with the nonFree flavor), so +// this stub keeps the feature off. Delete it together with the FillOtpFromSms autofill paths. @Suppress("UNUSED_PARAMETER") class AutofillSmsActivity : AppCompatActivity() { diff --git a/app/src/nonFree/AndroidManifest.xml b/app/src/nonFree/AndroidManifest.xml deleted file mode 100644 index 8a03b626..00000000 --- a/app/src/nonFree/AndroidManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android"> - <application> - <meta-data android:name="io.sentry.dsn" android:value="${sentryDsn}" /> - <meta-data android:name="io.sentry.traces.sample-rate" android:value="1.0" /> - <meta-data android:name="io.sentry.traces.profiling.sample-rate" android:value="1.0" /> - </application> -</manifest> diff --git a/app/src/nonFree/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt b/app/src/nonFree/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt deleted file mode 100644 index 1f627c06..00000000 --- a/app/src/nonFree/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -package app.passwordstore.autofill.oreo.ui - -import android.app.Activity -import android.app.PendingIntent -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.content.IntentSender -import android.os.Build -import android.os.Bundle -import android.view.autofill.AutofillManager -import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat -import androidx.lifecycle.lifecycleScope -import app.passwordstore.databinding.ActivityOreoAutofillSmsBinding -import app.passwordstore.util.autofill.AutofillResponseBuilder -import app.passwordstore.util.coroutines.DispatcherProvider -import app.passwordstore.util.extensions.viewBinding -import com.github.androidpasswordstore.autofillparser.AutofillAction -import com.github.androidpasswordstore.autofillparser.Credentials -import com.github.michaelbull.result.onFailure -import com.github.michaelbull.result.runCatching -import com.google.android.gms.auth.api.phone.SmsCodeRetriever -import com.google.android.gms.auth.api.phone.SmsRetriever -import com.google.android.gms.common.ConnectionResult -import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.common.api.ResolvableApiException -import com.google.android.gms.tasks.Task -import dagger.hilt.android.AndroidEntryPoint -import java.util.concurrent.ExecutionException -import javax.inject.Inject -import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException -import kotlin.coroutines.suspendCoroutine -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import logcat.LogPriority.ERROR -import logcat.LogPriority.WARN -import logcat.asLog -import logcat.logcat - -suspend fun <T> Task<T>.suspendableAwait() = - suspendCoroutine<T> { cont -> - addOnSuccessListener { result: T -> cont.resume(result) } - addOnFailureListener { e -> - // Unwrap specific exceptions (e.g. ResolvableApiException) from ExecutionException. - val cause = (e as? ExecutionException)?.cause ?: e - cont.resumeWithException(cause) - } - } - -@AndroidEntryPoint -class AutofillSmsActivity : AppCompatActivity() { - - @Inject lateinit var dispatcherProvider: DispatcherProvider - - companion object { - - private var fillOtpFromSmsRequestCode = 1 - - fun shouldOfferFillFromSms(context: Context): Boolean { - if (Build.VERSION.SDK_INT < 28) return false - val googleApiAvailabilityInstance = GoogleApiAvailability.getInstance() - val googleApiStatus = googleApiAvailabilityInstance.isGooglePlayServicesAvailable(context) - if (googleApiStatus != ConnectionResult.SUCCESS) { - logcat(WARN) { - "Google Play Services unavailable or not updated: ${googleApiAvailabilityInstance.getErrorString(googleApiStatus)}" - } - return false - } - // https://developer.android.com/guide/topics/text/autofill-services#sms-autofill - if (googleApiAvailabilityInstance.getApkVersion(context) < 190056000) { - logcat(WARN) { "Google Play Service 19.0.56 or higher required for SMS OTP Autofill" } - return false - } - return true - } - - fun makeFillOtpFromSmsIntentSender(context: Context): IntentSender { - val intent = Intent(context, AutofillSmsActivity::class.java) - return PendingIntent.getActivity( - context, - fillOtpFromSmsRequestCode++, - intent, - PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE, - ) - .intentSender - } - } - - private val binding by viewBinding(ActivityOreoAutofillSmsBinding::inflate) - - private lateinit var clientState: Bundle - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(binding.root) - setResult(RESULT_CANCELED) - binding.cancelButton.setOnClickListener { finish() } - } - - override fun onStart() { - super.onStart() - clientState = - intent?.getBundleExtra(AutofillManager.EXTRA_CLIENT_STATE) - ?: run { - logcat(WARN) { "AutofillSmsActivity started without EXTRA_CLIENT_STATE" } - finish() - return - } - - ContextCompat.registerReceiver( - this, - smsCodeRetrievedReceiver, - IntentFilter(SmsCodeRetriever.SMS_CODE_RETRIEVED_ACTION), - SmsRetriever.SEND_PERMISSION, - null, - ContextCompat.RECEIVER_EXPORTED, - ) - lifecycleScope.launch { waitForSms() } - } - - // Retry starting the SMS code retriever after a permission request. - @Deprecated("Deprecated in Java") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode != Activity.RESULT_OK) return - lifecycleScope.launch { waitForSms() } - } - - private suspend fun waitForSms() { - val smsClient = SmsCodeRetriever.getAutofillClient(this@AutofillSmsActivity) - runCatching { - withContext(dispatcherProvider.io()) { - smsClient.startSmsCodeRetriever().suspendableAwait() - } - } - .onFailure { e -> - if (e is ResolvableApiException) { - e.startResolutionForResult(this@AutofillSmsActivity, 1) - } else { - logcat(ERROR) { e.asLog() } - withContext(dispatcherProvider.main()) { finish() } - } - } - } - - private val smsCodeRetrievedReceiver = - object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val smsCode = intent.getStringExtra(SmsCodeRetriever.EXTRA_SMS_CODE) - val fillInDataset = - AutofillResponseBuilder.makeFillInDataset( - this@AutofillSmsActivity, - Credentials(null, null, smsCode), - clientState, - AutofillAction.FillOtpFromSms, - ) - setResult( - RESULT_OK, - Intent().apply { putExtra(AutofillManager.EXTRA_AUTHENTICATION_RESULT, fillInDataset) }, - ) - finish() - } - } -} diff --git a/app/src/nonFree/res/layout/activity_oreo_autofill_sms.xml b/app/src/nonFree/res/layout/activity_oreo_autofill_sms.xml deleted file mode 100644 index aa921185..00000000 --- a/app/src/nonFree/res/layout/activity_oreo_autofill_sms.xml +++ /dev/null @@ -1,61 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> - -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingHorizontal="10dp" - tools:context="app.passwordstore.AutofillFilterView"> - - <ImageView - android:id="@+id/cover" - android:layout_width="0dp" - android:layout_height="50dp" - android:layout_margin="10dp" - android:contentDescription="@string/app_name" - android:src="@drawable/ic_launcher_foreground" - app:layout_constraintBottom_toTopOf="@id/text" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.0" /> - - <TextView - android:id="@+id/text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="10dp" - android:text="@string/oreo_autofill_waiting_for_sms" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/cover" /> - - <ProgressBar - android:id="@+id/progress" - style="@style/Widget.MaterialComponents.CircularProgressIndicator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="10dp" - app:layout_constraintBottom_toTopOf="@id/cancelButton" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/text" /> - - <Button - android:id="@+id/cancelButton" - style="@style/Widget.MaterialComponents.Button.TextButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_margin="10dp" - android:text="@string/dialog_cancel" - android:textColor="?attr/colorSecondary" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/progress" /> - -</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/app/src/nonFree/res/values-ar-rSA/strings.xml b/app/src/nonFree/res/values-ar-rSA/strings.xml deleted file mode 100644 index 7a6a3cb6..00000000 --- a/app/src/nonFree/res/values-ar-rSA/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">في انتظار الرسائل القصيرة…</string> -</resources> diff --git a/app/src/nonFree/res/values-ar/strings.xml b/app/src/nonFree/res/values-ar/strings.xml deleted file mode 100644 index 7a6a3cb6..00000000 --- a/app/src/nonFree/res/values-ar/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">في انتظار الرسائل القصيرة…</string> -</resources> diff --git a/app/src/nonFree/res/values-de/strings.xml b/app/src/nonFree/res/values-de/strings.xml deleted file mode 100644 index 1e615e43..00000000 --- a/app/src/nonFree/res/values-de/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Warte auf SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-es-rES/strings.xml b/app/src/nonFree/res/values-es-rES/strings.xml deleted file mode 100644 index a80f9454..00000000 --- a/app/src/nonFree/res/values-es-rES/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Esperando por SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-es/strings.xml b/app/src/nonFree/res/values-es/strings.xml deleted file mode 100644 index a80f9454..00000000 --- a/app/src/nonFree/res/values-es/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Esperando por SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-fi-rFI/strings.xml b/app/src/nonFree/res/values-fi-rFI/strings.xml deleted file mode 100644 index a57feb73..00000000 --- a/app/src/nonFree/res/values-fi-rFI/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Odotetaan SMS-viestiä…</string> -</resources> diff --git a/app/src/nonFree/res/values-fi/strings.xml b/app/src/nonFree/res/values-fi/strings.xml deleted file mode 100644 index a57feb73..00000000 --- a/app/src/nonFree/res/values-fi/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Odotetaan SMS-viestiä…</string> -</resources> diff --git a/app/src/nonFree/res/values-gl-rES/strings.xml b/app/src/nonFree/res/values-gl-rES/strings.xml deleted file mode 100644 index b68283db..00000000 --- a/app/src/nonFree/res/values-gl-rES/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Agardando polo SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-gl/strings.xml b/app/src/nonFree/res/values-gl/strings.xml deleted file mode 100644 index b68283db..00000000 --- a/app/src/nonFree/res/values-gl/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Agardando polo SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-hu-rHU/strings.xml b/app/src/nonFree/res/values-hu-rHU/strings.xml deleted file mode 100644 index 6ebce291..00000000 --- a/app/src/nonFree/res/values-hu-rHU/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">SMS-re várakozás…</string> -</resources> diff --git a/app/src/nonFree/res/values-hu/strings.xml b/app/src/nonFree/res/values-hu/strings.xml deleted file mode 100644 index 6ebce291..00000000 --- a/app/src/nonFree/res/values-hu/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">SMS-re várakozás…</string> -</resources> diff --git a/app/src/nonFree/res/values-it/strings.xml b/app/src/nonFree/res/values-it/strings.xml deleted file mode 100644 index dcd1264d..00000000 --- a/app/src/nonFree/res/values-it/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">In attesa del SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-ko-rKR/strings.xml b/app/src/nonFree/res/values-ko-rKR/strings.xml deleted file mode 100644 index d98dca63..00000000 --- a/app/src/nonFree/res/values-ko-rKR/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">SMS를 기다리는 중입니다…</string> -</resources> diff --git a/app/src/nonFree/res/values-ko/strings.xml b/app/src/nonFree/res/values-ko/strings.xml deleted file mode 100644 index d98dca63..00000000 --- a/app/src/nonFree/res/values-ko/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">SMS를 기다리는 중입니다…</string> -</resources> diff --git a/app/src/nonFree/res/values-pl-rPL/strings.xml b/app/src/nonFree/res/values-pl-rPL/strings.xml deleted file mode 100644 index ba2f05ed..00000000 --- a/app/src/nonFree/res/values-pl-rPL/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Oczekiwanie na SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-pl/strings.xml b/app/src/nonFree/res/values-pl/strings.xml deleted file mode 100644 index ba2f05ed..00000000 --- a/app/src/nonFree/res/values-pl/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Oczekiwanie na SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-pt-rBR/strings.xml b/app/src/nonFree/res/values-pt-rBR/strings.xml deleted file mode 100644 index 0f4b8ed5..00000000 --- a/app/src/nonFree/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Esperando pelo SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-ru/strings.xml b/app/src/nonFree/res/values-ru/strings.xml deleted file mode 100644 index 5f214d53..00000000 --- a/app/src/nonFree/res/values-ru/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Ожидание SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-uk-rUA/strings.xml b/app/src/nonFree/res/values-uk-rUA/strings.xml deleted file mode 100644 index 86d935ee..00000000 --- a/app/src/nonFree/res/values-uk-rUA/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Очікування SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values-uk/strings.xml b/app/src/nonFree/res/values-uk/strings.xml deleted file mode 100644 index 86d935ee..00000000 --- a/app/src/nonFree/res/values-uk/strings.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> -<resources> - <string name="oreo_autofill_waiting_for_sms">Очікування SMS…</string> -</resources> diff --git a/app/src/nonFree/res/values/strings.xml b/app/src/nonFree/res/values/strings.xml deleted file mode 100644 index 7d9570b6..00000000 --- a/app/src/nonFree/res/values/strings.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - ~ SPDX-License-Identifier: GPL-3.0-only - --> - -<resources> - - <string name="oreo_autofill_waiting_for_sms">Waiting for SMS…</string> -</resources> diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index dd9c0c8b..2d7700f0 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -45,10 +45,6 @@ gradlePlugin { id = "com.github.android-password-store.rename-artifacts" implementationClass = "app.passwordstore.gradle.RenameArtifactsPlugin" } - register("sentry") { - id = "com.github.android-password-store.sentry" - implementationClass = "app.passwordstore.gradle.SentryPlugin" - } register("spotless") { id = "com.github.android-password-store.spotless" implementationClass = "app.passwordstore.gradle.SpotlessPlugin" @@ -77,7 +73,6 @@ dependencies { implementation(libs.build.moshi.kotlin) implementation(libs.build.okhttp) implementation(libs.build.semver) - implementation(libs.build.sentry) implementation(libs.build.spotless) implementation(libs.build.vcu) implementation(libs.kotlinx.coroutines.core) diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/ApplicationPlugin.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/ApplicationPlugin.kt index 9b43cbe1..6d38d1fc 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/ApplicationPlugin.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/ApplicationPlugin.kt @@ -7,8 +7,6 @@ package app.passwordstore.gradle -import app.passwordstore.gradle.flavors.FlavorDimensions -import app.passwordstore.gradle.flavors.ProductFlavors import app.passwordstore.gradle.signing.configureBuildSigning import com.android.build.api.dsl.ApplicationExtension import com.android.build.gradle.AppPlugin @@ -55,12 +53,6 @@ class ApplicationPlugin : Plugin<Project> { } } - flavorDimensions.add(FlavorDimensions.FREE) - productFlavors { - register(ProductFlavors.FREE) {} - register(ProductFlavors.NON_FREE) {} - } - project.configureBuildSigning() } } diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/SentryPlugin.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/SentryPlugin.kt deleted file mode 100644 index 1503bb9d..00000000 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/SentryPlugin.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -package app.passwordstore.gradle - -import app.passwordstore.gradle.flavors.FlavorDimensions -import app.passwordstore.gradle.flavors.ProductFlavors -import com.android.build.api.variant.ApplicationAndroidComponentsExtension -import io.sentry.android.gradle.SentryPlugin -import io.sentry.android.gradle.extensions.SentryPluginExtension -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.kotlin.dsl.apply -import org.gradle.kotlin.dsl.configure - -@Suppress("Unused") -class SentryPlugin : Plugin<Project> { - - override fun apply(project: Project) { - project.pluginManager.withPlugin("com.android.application") { - project.extensions.configure<ApplicationAndroidComponentsExtension> { - onVariants(selector().withFlavor(FlavorDimensions.FREE to ProductFlavors.NON_FREE)) { - variant -> - val sentryDsn = project.providers.environmentVariable(SENTRY_DSN_PROPERTY).orElse("") - variant.manifestPlaceholders.put("sentryDsn", sentryDsn.get()) - } - } - project.plugins.apply(SentryPlugin::class) - project.extensions.configure<SentryPluginExtension> { - includeProguardMapping.set( - project.providers.gradleProperty(SENTRY_UPLOAD_MAPPINGS_PROPERTY).isPresent - ) - autoUploadProguardMapping.set( - project.providers.gradleProperty(SENTRY_UPLOAD_MAPPINGS_PROPERTY).isPresent - ) - ignoredBuildTypes.set(setOf("debug")) - ignoredFlavors.set(setOf(ProductFlavors.FREE)) - tracingInstrumentation { enabled.set(false) } - autoInstallation.enabled.set(false) - includeDependenciesReport.set(false) - } - } - } - - private companion object { - - private const val SENTRY_DSN_PROPERTY = "SENTRY_DSN" - private const val SENTRY_UPLOAD_MAPPINGS_PROPERTY = "sentryUploadMappings" - } -} diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/ProductFlavors.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/ProductFlavors.kt deleted file mode 100644 index 2206c4c8..00000000 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/ProductFlavors.kt +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -package app.passwordstore.gradle.flavors - -object FlavorDimensions { - const val FREE = "free" -} - -object ProductFlavors { - const val FREE = "free" - const val NON_FREE = "nonFree" -} diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/SlimTests.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/SlimTests.kt index 0ed72afa..3ba2acf8 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/SlimTests.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/flavors/SlimTests.kt @@ -12,12 +12,11 @@ import org.gradle.api.Project import org.gradle.kotlin.dsl.findByType /** - * When the "slimTests" project property is provided, disable the unit test tasks on `release` build - * type and `nonFree` product flavor to avoid running the same tests repeatedly in different build - * variants. + * When the "slimTests" project property is provided, disable the unit test tasks on the `release` + * build type to avoid running the same tests twice. * - * Examples: `./gradlew test -PslimTests` will run unit tests for `nonFreeDebug` and `debug` build - * variants in Android App and Library projects, and all tests in JVM projects. + * Example: `./gradlew test -PslimTests` runs unit tests for the `debug` variant in Android App and + * Library projects, and all tests in JVM projects. */ @Suppress("UnstableApiUsage") internal fun Project.configureSlimTests() { @@ -30,16 +29,11 @@ internal fun Project.configureSlimTests() { } } - // Disable unit test tasks on the release build type and free flavor for Android Application - // projects. + // Disable unit test tasks on the release build type for Android Application projects. extensions.findByType<ApplicationAndroidComponentsExtension>()?.run { beforeVariants(selector().withBuildType(BUILD_TYPE_RELEASE)) { (it as HasUnitTestBuilder).enableUnitTest = false } - beforeVariants(selector().withFlavor(FlavorDimensions.FREE to ProductFlavors.NON_FREE)) { - (it as HasUnitTestBuilder).enableUnitTest = false - it.androidTest.enable = false - } } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ca3ecaa5..56a83a3d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -45,7 +45,6 @@ build-moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" } build-moshi-kotlin = { module = "com.squareup.moshi:moshi-kotlin", version.ref = "moshi" } build-okhttp = "com.squareup.okhttp3:okhttp:5.5.1" build-semver = "com.github.zafarkhaja:java-semver:0.10.2" -build-sentry = "io.sentry.android.gradle:io.sentry.android.gradle.gradle.plugin:6.25.0" build-spotless = "com.diffplug.spotless:spotless-plugin-gradle:8.10.4" build-vcu = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin:1.1.2" compose-bom = "androidx.compose:compose-bom:2024.09.03" @@ -85,8 +84,6 @@ thirdparty-kotlinResult-coroutines = { module = "com.michael-bull.kotlin-result: thirdparty-leakcanary-plumber = "com.squareup.leakcanary:plumber-android-startup:2.14" thirdparty-logcat = "com.squareup.logcat:logcat:0.1" thirdparty-modernAndroidPrefs = "de.maxr1998:modernandroidpreferences:2.4.0-beta2" -thirdparty-nonfree-googlePlayAuthApiPhone = "com.google.android.gms:play-services-auth-api-phone:18.1.0" -thirdparty-nonfree-sentry = "io.sentry:sentry-android:8.62.0" thirdparty-pgpainless = "org.pgpainless:pgpainless-core:1.7.8" thirdparty-slack-lints = "com.slack.lint:slack-lint-checks:0.8.0" thirdparty-slf4j-api = { module = "org.slf4j:slf4j-api", version = { strictly = "[1.7, 1.8[", prefer = "1.7.36" } } diff --git a/sentry-stub/build.gradle.kts b/sentry-stub/build.gradle.kts deleted file mode 100644 index 0a1cdfea..00000000 --- a/sentry-stub/build.gradle.kts +++ /dev/null @@ -1,5 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -plugins { id("com.github.android-password-store.kotlin-jvm-library") } diff --git a/sentry-stub/lint-baseline.xml b/sentry-stub/lint-baseline.xml deleted file mode 100644 index 2c8fe410..00000000 --- a/sentry-stub/lint-baseline.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<issues format="6" by="lint 8.6.0" type="baseline" client="gradle" dependencies="false" name="AGP (8.6.0)" variant="all" version="8.6.0"> - -</issues> diff --git a/sentry-stub/src/main/kotlin/io/sentry/Scope.kt b/sentry-stub/src/main/kotlin/io/sentry/Scope.kt deleted file mode 100644 index 256496cd..00000000 --- a/sentry-stub/src/main/kotlin/io/sentry/Scope.kt +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -@file:Suppress("Unused", "UNUSED_PARAMETER") - -package io.sentry - -import io.sentry.protocol.User - -public class Scope { - public var user: User? = null - - public fun setTag(tag: String, value: String) {} -} diff --git a/sentry-stub/src/main/kotlin/io/sentry/Sentry.kt b/sentry-stub/src/main/kotlin/io/sentry/Sentry.kt deleted file mode 100644 index 103766a8..00000000 --- a/sentry-stub/src/main/kotlin/io/sentry/Sentry.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -@file:Suppress("Unused", "UNUSED_PARAMETER") - -package io.sentry - -/** Stubs for the Sentry SDK */ -public object Sentry { - public fun configureScope(callback: (Scope) -> Unit) {} -} diff --git a/sentry-stub/src/main/kotlin/io/sentry/protocol/User.kt b/sentry-stub/src/main/kotlin/io/sentry/protocol/User.kt deleted file mode 100644 index 318ab8cf..00000000 --- a/sentry-stub/src/main/kotlin/io/sentry/protocol/User.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -@file:Suppress("Unused", "UNUSED_PARAMETER") - -package io.sentry.protocol - -public data class User( - public var email: String? = null, - public var id: String? = null, - public var username: String? = null, - public var ipAddress: String? = null, - public var data: Map<String?, String>? = null, - public var unknown: Map<String?, String>? = null, -) diff --git a/settings.gradle.kts b/settings.gradle.kts index a27a0cbd..481b2706 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -75,6 +75,4 @@ include("passgen:diceware") include("passgen:random") -include("sentry-stub") - include("ui:compose") |
