diff options
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") |
