From f78754e26c6274f997bbfe0798f47aa86f8f8133 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Mon, 2 Nov 2026 13:31:30 +0100 Subject: 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 --- .../autofill/oreo/ui/AutofillSmsActivity.kt | 24 --- app/src/main/java/app/passwordstore/Application.kt | 11 -- .../autofill/oreo/ui/AutofillSmsActivity.kt | 26 ++++ app/src/nonFree/AndroidManifest.xml | 12 -- .../autofill/oreo/ui/AutofillSmsActivity.kt | 171 --------------------- .../res/layout/activity_oreo_autofill_sms.xml | 61 -------- app/src/nonFree/res/values-ar-rSA/strings.xml | 8 - app/src/nonFree/res/values-ar/strings.xml | 8 - app/src/nonFree/res/values-de/strings.xml | 8 - app/src/nonFree/res/values-es-rES/strings.xml | 8 - app/src/nonFree/res/values-es/strings.xml | 8 - app/src/nonFree/res/values-fi-rFI/strings.xml | 8 - app/src/nonFree/res/values-fi/strings.xml | 8 - app/src/nonFree/res/values-gl-rES/strings.xml | 8 - app/src/nonFree/res/values-gl/strings.xml | 8 - app/src/nonFree/res/values-hu-rHU/strings.xml | 8 - app/src/nonFree/res/values-hu/strings.xml | 8 - app/src/nonFree/res/values-it/strings.xml | 8 - app/src/nonFree/res/values-ko-rKR/strings.xml | 8 - app/src/nonFree/res/values-ko/strings.xml | 8 - app/src/nonFree/res/values-pl-rPL/strings.xml | 8 - app/src/nonFree/res/values-pl/strings.xml | 8 - app/src/nonFree/res/values-pt-rBR/strings.xml | 8 - app/src/nonFree/res/values-ru/strings.xml | 8 - app/src/nonFree/res/values-uk-rUA/strings.xml | 8 - app/src/nonFree/res/values-uk/strings.xml | 8 - app/src/nonFree/res/values/strings.xml | 9 -- 27 files changed, 26 insertions(+), 448 deletions(-) delete mode 100644 app/src/free/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt create mode 100644 app/src/main/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt delete mode 100644 app/src/nonFree/AndroidManifest.xml delete mode 100644 app/src/nonFree/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt delete mode 100644 app/src/nonFree/res/layout/activity_oreo_autofill_sms.xml delete mode 100644 app/src/nonFree/res/values-ar-rSA/strings.xml delete mode 100644 app/src/nonFree/res/values-ar/strings.xml delete mode 100644 app/src/nonFree/res/values-de/strings.xml delete mode 100644 app/src/nonFree/res/values-es-rES/strings.xml delete mode 100644 app/src/nonFree/res/values-es/strings.xml delete mode 100644 app/src/nonFree/res/values-fi-rFI/strings.xml delete mode 100644 app/src/nonFree/res/values-fi/strings.xml delete mode 100644 app/src/nonFree/res/values-gl-rES/strings.xml delete mode 100644 app/src/nonFree/res/values-gl/strings.xml delete mode 100644 app/src/nonFree/res/values-hu-rHU/strings.xml delete mode 100644 app/src/nonFree/res/values-hu/strings.xml delete mode 100644 app/src/nonFree/res/values-it/strings.xml delete mode 100644 app/src/nonFree/res/values-ko-rKR/strings.xml delete mode 100644 app/src/nonFree/res/values-ko/strings.xml delete mode 100644 app/src/nonFree/res/values-pl-rPL/strings.xml delete mode 100644 app/src/nonFree/res/values-pl/strings.xml delete mode 100644 app/src/nonFree/res/values-pt-rBR/strings.xml delete mode 100644 app/src/nonFree/res/values-ru/strings.xml delete mode 100644 app/src/nonFree/res/values-uk-rUA/strings.xml delete mode 100644 app/src/nonFree/res/values-uk/strings.xml delete mode 100644 app/src/nonFree/res/values/strings.xml (limited to 'app/src') diff --git a/app/src/free/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt b/app/src/free/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt deleted file mode 100644 index 83d1fdae..00000000 --- a/app/src/free/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -package app.passwordstore.autofill.oreo.ui - -import android.content.Context -import android.content.IntentSender -import androidx.appcompat.app.AppCompatActivity - -@Suppress("UNUSED_PARAMETER") -class AutofillSmsActivity : AppCompatActivity() { - - companion object { - - fun shouldOfferFillFromSms(context: Context): Boolean { - return false - } - - fun makeFillOtpFromSmsIntentSender(context: Context): IntentSender { - throw NotImplementedError("Filling OTPs from SMS requires non-free dependencies") - } - } -} 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/main/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt b/app/src/main/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt new file mode 100644 index 00000000..7acc72f9 --- /dev/null +++ b/app/src/main/java/app/passwordstore/autofill/oreo/ui/AutofillSmsActivity.kt @@ -0,0 +1,26 @@ +/* + * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ +package app.passwordstore.autofill.oreo.ui + +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() { + + companion object { + + fun shouldOfferFillFromSms(context: Context): Boolean { + return false + } + + fun makeFillOtpFromSmsIntentSender(context: Context): IntentSender { + throw NotImplementedError("Filling OTPs from SMS requires non-free dependencies") + } + } +} 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 @@ - - - - - - - - - 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 Task.suspendableAwait() = - suspendCoroutine { 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 @@ - - - - - - - - - - -