diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f1b4d943660e..82fcff694b80 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -280,6 +280,7 @@ android { buildConfigField("String", "OFWEBSITE", "\"https://world.openfoodfacts.org/\"") buildConfigField("String", "WIKIDATA", "\"https://www.wikidata.org/wiki/Special:EntityData/\"") buildConfigField("String", "STATICURL", "\"https://static.openfoodfacts.org\"") + buildConfigField("String", "MATOMO_URL", "\"https://analytics.openfoodfacts.org/piwik.php\"") dimension = "versionCode" } create("obf") { @@ -291,6 +292,7 @@ android { buildConfigField("String", "OFWEBSITE", "\"https://world.openbeautyfacts.org/\"") buildConfigField("String", "WIKIDATA", "\"https://www.wikidata.org/wiki/Special:EntityData/\"") buildConfigField("String", "STATICURL", "\"https://static.openbeautyfacts.org\"") + buildConfigField("String", "MATOMO_URL", "\"https://analytics.openfoodfacts.org/piwik.php\"") dimension = "versionCode" } create("opff") { @@ -302,6 +304,7 @@ android { buildConfigField("String", "OFWEBSITE", "\"https://world.openpetfoodfacts.org/\"") buildConfigField("String", "WIKIDATA", "\"https://www.wikidata.org/wiki/Special:EntityData/\"") buildConfigField("String", "STATICURL", "\"https://static.openpetfoodfacts.org\"") + buildConfigField("String", "MATOMO_URL", "\"https://analytics.openfoodfacts.org/piwik.php\"") dimension = "versionCode" } create("opf") { @@ -313,6 +316,7 @@ android { buildConfigField("String", "OFWEBSITE", "\"https://world.openproductsfacts.org/\"") buildConfigField("String", "WIKIDATA", "\"https://www.wikidata.org/wiki/Special:EntityData/\"") buildConfigField("String", "STATICURL", "\"https://static.openproductsfacts.org\"") + buildConfigField("String", "MATOMO_URL", "\"https://analytics.openfoodfacts.org/piwik.php\"") dimension = "versionCode" } create("playstore") { diff --git a/app/src/fdroid/java/openfoodfacts/github/scrachx/openfood/features/scan/ContinuousScanActivity.kt b/app/src/fdroid/java/openfoodfacts/github/scrachx/openfood/features/scan/ContinuousScanActivity.kt index 17893cedfbc7..6246c0e5d76e 100644 --- a/app/src/fdroid/java/openfoodfacts/github/scrachx/openfood/features/scan/ContinuousScanActivity.kt +++ b/app/src/fdroid/java/openfoodfacts/github/scrachx/openfood/features/scan/ContinuousScanActivity.kt @@ -58,6 +58,9 @@ import io.reactivex.schedulers.Schedulers import openfoodfacts.github.scrachx.openfood.AppFlavors.OFF import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsView +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.databinding.ActivityContinuousScanBinding import openfoodfacts.github.scrachx.openfood.features.ImagesManageActivity @@ -217,7 +220,7 @@ class ContinuousScanActivity : AppCompatActivity() { putExtra(ProductCompareActivity.KEY_PRODUCT_ALREADY_EXISTS, true) } else { productsToCompare.add(product) - AnalyticsEvent.AddProductToComparison(product.code).track() + MatomoAnalytics.trackEvent(AnalyticsEvent.AddProductToComparison(product.code)) } putExtra(ProductCompareActivity.KEY_PRODUCTS_TO_COMPARE, productsToCompare) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) @@ -508,7 +511,7 @@ class ContinuousScanActivity : AppCompatActivity() { if (quickViewBehavior.state != BottomSheetBehavior.STATE_EXPANDED) { binding.barcodeScanner.resume() } - AnalyticsService.getInstance().trackView(AnalyticsView.SCANNER) + MatomoAnalytics.trackView(AnalyticsView.Scanner) } override fun onSaveInstanceState(outState: Bundle) { @@ -703,7 +706,7 @@ class ContinuousScanActivity : AppCompatActivity() { } BottomSheetBehavior.STATE_EXPANDED -> { binding.barcodeScanner.pause() - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ScannedBarcodeResultExpanded(lastBarcode)) + MatomoAnalytics.trackEvent(AnalyticsEvent.ScannedBarcodeResultExpanded(lastBarcode)) } else -> binding.barcodeScanner.pause() } @@ -791,7 +794,7 @@ class ContinuousScanActivity : AppCompatActivity() { lastBarcode = result.text if (!isFinishing) { setShownProduct(result.text) - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ScannedBarcode(result.text)) + MatomoAnalytics.trackEvent(AnalyticsEvent.ScannedBarcode(result.text)) } } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/AnalyticsEvent.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/AnalyticsEvent.kt new file mode 100644 index 000000000000..2314b91d1478 --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/AnalyticsEvent.kt @@ -0,0 +1,111 @@ +package openfoodfacts.github.scrachx.openfood.analytics + +sealed class AnalyticsEvent { + + abstract val category: String + abstract val action: String + abstract val name: String? + abstract val value: Float? + + data class ScannedBarcode(override val name: String) : AnalyticsEvent() { + override val category = "scanner" + override val action = "scanned" + override val value: Float? = null + } + + data class ScannedBarcodeResultExpanded(override val name: String?) : AnalyticsEvent() { + override val category = "scanner" + override val action = "result-expanded" + override val value: Float? = null + } + + data class AllergenAlertCreated(override val name: String) : AnalyticsEvent() { + override val category = "allergen-alerts" + override val action = "created" + override val value: Float? = null + } + + data class ProductCreated(override val name: String?) : AnalyticsEvent() { + override val category = "products" + override val action = "created" + override val value: Float? = null + } + + data class ProductEdited(override val name: String?) : AnalyticsEvent() { + override val category = "products" + override val action = "edited" + override val value: Float? = null + } + + data class ProductIngredientsPictureEdited(override val name: String?) : AnalyticsEvent() { + override val category = "products" + override val action = "edited-ingredients-picture" + override val value: Float? = null + } + + object UserLogin : AnalyticsEvent() { + override val category = "user-account" + override val action = "login" + override val name: String? = null + override val value: Float? = null + } + + object UserLogout : AnalyticsEvent() { + override val category = "user-account" + override val action = "logout" + override val name: String? = null + override val value: Float? = null + } + + object RobotoffLoginPrompt : AnalyticsEvent() { + override val category = "user-account" + override val action = "login-prompt" + override val name = "robotoff" + override val value: Float? = null + } + + object RobotoffLoggedInAfterPrompt : AnalyticsEvent() { + override val category = "user-account" + override val action = "logged-in-after-prompt" + override val name = "robotoff" + override val value: Float? = null + } + + object ShoppingListCreated : AnalyticsEvent() { + override val category = "shopping-lists" + override val action = "created" + override val name: String? = null + override val value: Float? = null + } + + object ShoppingListExported : AnalyticsEvent() { + override val category = "shopping-lists" + override val action = "exported" + override val name: String? = null + override val value: Float? = null + } + + data class IngredientAnalysisEnabled(override val name: String) : AnalyticsEvent() { + override val category = "ingredient-analysis" + override val action = "enabled" + override val value: Float? = null + } + + data class IngredientAnalysisDisabled(override val name: String) : AnalyticsEvent() { + override val category = "ingredient-analysis" + override val action = "disabled" + override val value: Float? = null + } + + data class AddProductToComparison(override val name: String) : AnalyticsEvent() { + override val category = "products" + override val action = "compare-add" + override val value: Float? = null + } + + data class CompareProducts(override val value: Float) : AnalyticsEvent() { + override val category = "products" + override val action = "compare-multiple" + override val name: String? = null + } +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/AnalyticsView.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/AnalyticsView.kt new file mode 100644 index 000000000000..f66d38f1dc1c --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/AnalyticsView.kt @@ -0,0 +1,8 @@ +package openfoodfacts.github.scrachx.openfood.analytics + +enum class AnalyticsView(val path: String) { + Scanner("scanner"), + ProductEditOverview("products/edit/overview"), + ProductEditIngredients("products/edit/ingredients"), + ProductEditNutritionFacts("products/edit/nutrition_facts"); +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/MatomoAnalytics.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/MatomoAnalytics.kt new file mode 100644 index 000000000000..6cbc753ae4aa --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/MatomoAnalytics.kt @@ -0,0 +1,54 @@ +package openfoodfacts.github.scrachx.openfood.analytics + +import androidx.fragment.app.FragmentManager +import androidx.preference.PreferenceManager +import openfoodfacts.github.scrachx.openfood.BuildConfig +import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.app.OFFApplication +import openfoodfacts.github.scrachx.openfood.features.analyticsusage.AnalyticsUsageDialogFragment +import org.matomo.sdk.Matomo +import org.matomo.sdk.TrackerBuilder +import org.matomo.sdk.extra.TrackHelper + + +object MatomoAnalytics { + + //TODO: change matomo url and id from properties + private val tracker = TrackerBuilder + .createDefault(BuildConfig.MATOMO_URL, 1) + .build(Matomo.getInstance(OFFApplication.instance)) + .apply { + isOptOut = PreferenceManager.getDefaultSharedPreferences(OFFApplication.instance) + .getBoolean(OFFApplication.instance.getString(R.string.pref_analytics_reporting_key), false) + } + .also { + TrackHelper.track().download().with(it) + } + + fun trackView(view: AnalyticsView) { + TrackHelper.track() + .screen(view.path) + .with(tracker) + } + + fun trackEvent(event: AnalyticsEvent) { + TrackHelper.track() + .event(event.category, event.action) + .name(event.name) + .value(event.value) + .with(tracker) + } + + fun showAnalyticsBottomSheetIfNeeded(childFragmentManager: FragmentManager) { + if (PreferenceManager.getDefaultSharedPreferences(OFFApplication.instance).contains(OFFApplication.instance.getString(R.string.pref_analytics_reporting_key))) { + //key already exists, do not show + return + } + val bottomSheet = AnalyticsUsageDialogFragment() + bottomSheet.show(childFragmentManager, AnalyticsUsageDialogFragment.TAG) + } + + fun onAnalyticsEnabledToggled(enabled: Boolean) { + tracker.isOptOut = !enabled + } +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/SentryAnalytics.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/SentryAnalytics.kt new file mode 100644 index 000000000000..eda7df6bee59 --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/analytics/SentryAnalytics.kt @@ -0,0 +1,43 @@ +package openfoodfacts.github.scrachx.openfood.analytics + +import androidx.preference.PreferenceManager +import io.sentry.Sentry +import io.sentry.android.core.SentryAndroid +import openfoodfacts.github.scrachx.openfood.BuildConfig +import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.app.OFFApplication + + +object SentryAnalytics { + + // isCrashReportingEnabled is not dynamic, as sentry can not be enabled / disabled, so it takes the value at startup, and changes will only be taken into account after an app restart + private val isCrashReportingEnabled by lazy { + PreferenceManager.getDefaultSharedPreferences(OFFApplication.instance) + .getBoolean(OFFApplication.instance.getString(R.string.pref_crash_reporting_key), true) + } + + fun init() { + if (isCrashReportingEnabled) { + SentryAndroid.init(OFFApplication.instance) + Sentry.configureScope { scope -> + scope.setTag("flavor", BuildConfig.FLAVOR) + } + } + } + + fun setBarcode(barcode: String) { + setTag("barcode", barcode) + } + + fun setTag(key: String, value: String) { + if (isCrashReportingEnabled) { + Sentry.setTag(key, value) + } + } + + fun record(exception: Throwable) { + if (isCrashReportingEnabled) { + Sentry.captureException(exception) + } + } +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/AnalyticsService.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/AnalyticsService.kt deleted file mode 100644 index bbdcc6a3b48b..000000000000 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/AnalyticsService.kt +++ /dev/null @@ -1,14 +0,0 @@ -package openfoodfacts.github.scrachx.openfood.app - -import io.sentry.Sentry -import openfoodfacts.github.scrachx.openfood.BuildConfig - -object AnalyticsService { - fun init() = Sentry.configureScope { it.setTag("flavor", BuildConfig.FLAVOR) } - - fun setBarcode(barcode: String) = setTag("barcode", barcode) - - fun setTag(key: String, value: String) = Sentry.setTag(key, value) - - fun record(exception: Throwable) = Sentry.captureException(exception) -} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/OFFApplication.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/OFFApplication.kt index 3733968d4694..9aaac66b5bb4 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/OFFApplication.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/app/OFFApplication.kt @@ -34,7 +34,7 @@ import openfoodfacts.github.scrachx.openfood.utils.OFFDatabaseHelper import org.greenrobot.eventbus.EventBus import org.greenrobot.greendao.query.QueryBuilder import java.io.IOException -import openfoodfacts.github.scrachx.openfood.app.AnalyticsService.init as initAnalytics +import openfoodfacts.github.scrachx.openfood.analytics.SentryAnalytics.init as initAnalytics class OFFApplication : MultiDexApplication() { override fun onCreate() { @@ -102,4 +102,4 @@ class OFFApplication : MultiDexApplication() { private set } -} \ No newline at end of file +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/LoginActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/LoginActivity.kt index 37ec9840ff03..99bb74ffee06 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/LoginActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/LoginActivity.kt @@ -38,13 +38,14 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors.OFF import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.BuildConfig import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabsHelper import openfoodfacts.github.scrachx.openfood.customtabs.WebViewFallback import openfoodfacts.github.scrachx.openfood.databinding.ActivityLoginBinding import openfoodfacts.github.scrachx.openfood.features.shared.BaseActivity import openfoodfacts.github.scrachx.openfood.network.CommonApiManager.productsApi -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsEvent import openfoodfacts.github.scrachx.openfood.utils.Utils import openfoodfacts.github.scrachx.openfood.utils.getLoginPreferences import retrofit2.Response @@ -149,7 +150,7 @@ class LoginActivity : BaseActivity() { binding.txtInfoLogin.setTextColor(ContextCompat.getColor(this, R.color.green_500)) binding.txtInfoLogin.setText(R.string.txtInfoLoginOk) - AnalyticsEvent.UserLogin().track() + MatomoAnalytics.trackEvent(AnalyticsEvent.UserLogin) setResult(RESULT_OK) finish() diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt index 4bbd27287e63..937b3c2f63af 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/MainActivity.kt @@ -71,16 +71,18 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.BuildConfig import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabsHelper import openfoodfacts.github.scrachx.openfood.customtabs.WebViewFallback import openfoodfacts.github.scrachx.openfood.databinding.ActivityMainBinding -import openfoodfacts.github.scrachx.openfood.features.changelog.ChangelogDialog import openfoodfacts.github.scrachx.openfood.features.LoginActivity.Companion.LoginContract import openfoodfacts.github.scrachx.openfood.features.adapters.PhotosAdapter import openfoodfacts.github.scrachx.openfood.features.additives.AdditiveListActivity import openfoodfacts.github.scrachx.openfood.features.allergensalert.AllergensAlertFragment import openfoodfacts.github.scrachx.openfood.features.categories.activity.CategoryActivity +import openfoodfacts.github.scrachx.openfood.features.changelog.ChangelogDialog import openfoodfacts.github.scrachx.openfood.features.compare.ProductCompareActivity import openfoodfacts.github.scrachx.openfood.features.listeners.CommonBottomListenerInstaller.installBottomNavigation import openfoodfacts.github.scrachx.openfood.features.listeners.CommonBottomListenerInstaller.selectNavigationItem @@ -513,7 +515,7 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { private fun logout() { getSharedPreferences(PreferencesFragment.LOGIN_PREF, MODE_PRIVATE).edit { clear() } updateConnectedState() - AnalyticsEvent.UserLogout().track() + MatomoAnalytics.trackEvent(AnalyticsEvent.UserLogout) } override fun onSaveInstanceState(outState: Bundle) { @@ -723,7 +725,7 @@ class MainActivity : BaseActivity(), NavigationDrawerListener { public override fun onResume() { super.onResume() binding.bottomNavigationInclude.bottomNavigation.selectNavigationItem(R.id.home_page) - AnalyticsService.getInstance().showAnalyticsBottomSheetIfNeeded(supportFragmentManager) + MatomoAnalytics.showAnalyticsBottomSheetIfNeeded(supportFragmentManager) // change drawer menu item from "install" to "open" when navigating back from play store. if (isApplicationInstalled(this@MainActivity, BuildConfig.OFOTHERLINKAPP)) { diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt index 8c08d6de69a5..0990827721bd 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/PreferencesFragment.kt @@ -52,6 +52,8 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors.OFF import openfoodfacts.github.scrachx.openfood.AppFlavors.OPFF import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.WebViewFallback @@ -273,7 +275,9 @@ class PreferencesFragment : PreferenceFragmentCompat(), INavigationItem, OnShare // Disable photo mode for OpenProductFacts - if (isFlavors(AppFlavors.OPF)) requirePreference(getString(R.string.pref_show_product_photos_key)).isVisible = false + if (isFlavors(AppFlavors.OPF)) { + requirePreference(getString(R.string.pref_show_product_photos_key)).isVisible = false + } // Preference to show version name requirePreference(getString(R.string.pref_version_key)).let { @@ -292,6 +296,13 @@ class PreferencesFragment : PreferenceFragmentCompat(), INavigationItem, OnShare preferenceScreen.removePreference(preferenceScreen.requirePreference(getString(R.string.pref_key_display))) } } + + requirePreference(getString(R.string.pref_analytics_reporting_key)).let { + it.setOnPreferenceChangeListener { _, newValue -> + MatomoAnalytics.onAnalyticsEnabledToggled(newValue == true) + true + } + } } private fun buildDisplayCategory(configs: List?) { @@ -337,6 +348,15 @@ class PreferencesFragment : PreferenceFragmentCompat(), INavigationItem, OnShare summaryOn = null summaryOff = null title = getString(R.string.display_analysis_tag_status, config.typeName.toLowerCase(Locale.getDefault())) + setOnPreferenceChangeListener { _, newValue -> + val event = if (newValue == true) { + AnalyticsEvent.IngredientAnalysisEnabled(config.type) + } else { + AnalyticsEvent.IngredientAnalysisDisabled(config.type) + } + MatomoAnalytics.trackEvent(event) + true + } }) } } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt index bf2d256402d9..41e6ee7cf301 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt @@ -36,8 +36,8 @@ import openfoodfacts.github.scrachx.openfood.databinding.FragmentAlertAllergensB import openfoodfacts.github.scrachx.openfood.features.shared.NavigationBaseFragment import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenName import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsEvent -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsService +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.utils.LocaleHelper import openfoodfacts.github.scrachx.openfood.utils.NavigationDrawerListener import openfoodfacts.github.scrachx.openfood.utils.NavigationDrawerListener.NavigationDrawerType @@ -132,7 +132,7 @@ class AllergensAlertFragment : NavigationBaseFragment() { mAllergensEnabled!!.add(allergens[position]) adapter.notifyItemInserted(mAllergensEnabled!!.size - 1) binding.allergensRecycle.scrollToPosition(adapter.itemCount - 1) - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.AllergenAlertCreated(allergens[position].allergenTag)) + MatomoAnalytics.trackEvent(AnalyticsEvent.AllergenAlertCreated(allergens[position].allergenTag)) } }.show() }.addTo(disp) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/analyticsusage/AnalyticsUsageDialogFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/analyticsusage/AnalyticsUsageDialogFragment.kt new file mode 100644 index 000000000000..674d759faed5 --- /dev/null +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/analyticsusage/AnalyticsUsageDialogFragment.kt @@ -0,0 +1,46 @@ +package openfoodfacts.github.scrachx.openfood.features.analyticsusage + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.preference.PreferenceManager +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics +import openfoodfacts.github.scrachx.openfood.app.OFFApplication +import openfoodfacts.github.scrachx.openfood.databinding.FragmentAnalyticsUsageBottomSheetBinding + +class AnalyticsUsageDialogFragment : BottomSheetDialogFragment() { + + companion object { + const val TAG = "AnalyticsUsageDialogFragment" + } + + init { + isCancelable = false + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + val binding: FragmentAnalyticsUsageBottomSheetBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_analytics_usage_bottom_sheet, container, false) + binding.grantButton.setOnClickListener { + saveAnalyticsReportingPref(true) + MatomoAnalytics.onAnalyticsEnabledToggled(true) + dismiss() + } + binding.declineButton.setOnClickListener { + saveAnalyticsReportingPref(false) + MatomoAnalytics.onAnalyticsEnabledToggled(false) + dismiss() + } + return binding.root + } + + private fun saveAnalyticsReportingPref(value: Boolean) { + PreferenceManager.getDefaultSharedPreferences(OFFApplication.instance) + .edit() + .putBoolean(OFFApplication.instance.getString(R.string.pref_analytics_reporting_key), value) + .apply() + } +} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/changelog/ChangelogDialog.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/changelog/ChangelogDialog.kt index fe26caf4ecd6..cfbe8a969e54 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/changelog/ChangelogDialog.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/changelog/ChangelogDialog.kt @@ -17,7 +17,7 @@ import androidx.recyclerview.widget.RecyclerView import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import openfoodfacts.github.scrachx.openfood.R -import openfoodfacts.github.scrachx.openfood.app.AnalyticsService +import openfoodfacts.github.scrachx.openfood.analytics.SentryAnalytics import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabsHelper import openfoodfacts.github.scrachx.openfood.customtabs.WebViewFallback @@ -80,7 +80,7 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) { saveVersionCode(activity, currentVersionCode) } } catch (ex: NameNotFoundException) { - AnalyticsService.record(ex) + SentryAnalytics.record(ex) Unit } } @@ -128,7 +128,7 @@ class ChangelogDialog : DialogFragment(R.layout.fragment_changelog) { .observeOn(AndroidSchedulers.mainThread()) .subscribe( { items -> recyclerView.adapter = ChangelogAdapter(items) }, - { throwable -> AnalyticsService.record(throwable) } + { throwable -> SentryAnalytics.record(throwable) } ) ) } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt index 10ae8736173a..e348a4409ccc 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/compare/ProductCompareActivity.kt @@ -18,7 +18,8 @@ import openfoodfacts.github.scrachx.openfood.features.listeners.CommonBottomList import openfoodfacts.github.scrachx.openfood.features.scan.ContinuousScanActivity import openfoodfacts.github.scrachx.openfood.features.shared.BaseActivity import openfoodfacts.github.scrachx.openfood.models.Product -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.utils.MY_PERMISSIONS_REQUEST_CAMERA import openfoodfacts.github.scrachx.openfood.utils.PhotoReceiverHandler import openfoodfacts.github.scrachx.openfood.utils.isHardwareCameraInstalled @@ -48,7 +49,7 @@ class ProductCompareActivity : BaseActivity() { } if (productsToCompare.size > 1) { - AnalyticsEvent.CompareProducts(productsToCompare.size).track(); + MatomoAnalytics.trackEvent(AnalyticsEvent.CompareProducts(productsToCompare.size.toFloat())) } productComparisonAdapter = ProductCompareAdapter(productsToCompare, this) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditActivity.kt index a6240bdb32d7..3d1d6422bf13 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditActivity.kt @@ -42,6 +42,8 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors.OPF import openfoodfacts.github.scrachx.openfood.AppFlavors.OPFF import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.app.OFFApplication.Companion.appComponent import openfoodfacts.github.scrachx.openfood.databinding.ActivityEditProductBinding @@ -57,8 +59,6 @@ import openfoodfacts.github.scrachx.openfood.network.ApiFields import openfoodfacts.github.scrachx.openfood.network.CommonApiManager.productsApi import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIClient import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIClient.Companion.addToHistorySync -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsEvent -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsService import openfoodfacts.github.scrachx.openfood.utils.OfflineProductService.getOfflineProductByBarcode import openfoodfacts.github.scrachx.openfood.utils.Utils.daoSession import openfoodfacts.github.scrachx.openfood.utils.Utils.hideKeyboard @@ -305,9 +305,9 @@ class ProductEditActivity : AppCompatActivity() { hideKeyboard(this) if (editingMode) { - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ProductEdited(productDetails["code"])) + MatomoAnalytics.trackEvent(AnalyticsEvent.ProductEdited(productDetails["code"])) } else { - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ProductCreated(productDetails["code"])) + MatomoAnalytics.trackEvent(AnalyticsEvent.ProductCreated(productDetails["code"])) } setResult(RESULT_OK) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditIngredientsFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditIngredientsFragment.kt index 412d37ed9e29..9925aaea949a 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditIngredientsFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditIngredientsFragment.kt @@ -31,6 +31,9 @@ import com.squareup.picasso.Picasso import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.rxkotlin.addTo import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsView +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.databinding.FragmentAddProductIngredientsBinding import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditActivity.Companion.KEY_PERFORM_OCR @@ -90,7 +93,7 @@ class ProductEditIngredientsFragment : ProductEditFragment() { filePath = uri.path } (activity as? ProductEditActivity)?.addToPhotoMap(image, 1) - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ProductIngredientsPictureEdited(code)) + MatomoAnalytics.trackEvent(AnalyticsEvent.ProductIngredientsPictureEdited(code)) hideImageProgress(false, getString(R.string.image_uploaded_successfully)) } val intent = if (activity == null) null else requireActivity().intent @@ -152,7 +155,7 @@ class ProductEditIngredientsFragment : ProductEditFragment() { override fun onResume() { super.onResume() - AnalyticsService.getInstance().trackView(AnalyticsView.PRODUCT_EDIT_INGREDIENTS) + MatomoAnalytics.trackView(AnalyticsView.ProductEditIngredients) } private fun getImageIngredients() = productDetails[ApiFields.Keys.IMAGE_INGREDIENTS] diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditNutritionFactsFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditNutritionFactsFragment.kt index 09253a197f79..f20969cfed5a 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditNutritionFactsFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditNutritionFactsFragment.kt @@ -35,8 +35,9 @@ import com.squareup.picasso.Callback import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.rxkotlin.addTo import openfoodfacts.github.scrachx.openfood.R -import openfoodfacts.github.scrachx.openfood.app.AnalyticsService -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsService as MatomoAnalytics +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsView +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics +import openfoodfacts.github.scrachx.openfood.analytics.SentryAnalytics import openfoodfacts.github.scrachx.openfood.databinding.FragmentAddProductNutritionFactsBinding import openfoodfacts.github.scrachx.openfood.features.shared.views.CustomValidatingEditTextView import openfoodfacts.github.scrachx.openfood.images.ProductImage @@ -162,7 +163,7 @@ class ProductEditNutritionFactsFragment : ProductEditFragment() { override fun onResume() { super.onResume() - MatomoAnalytics.getInstance().trackView(AnalyticsView.PRODUCT_EDIT_NUTRITION_FACTS) + MatomoAnalytics.trackView(AnalyticsView.ProductEditNutritionFacts) } override fun onDestroyView() { @@ -722,7 +723,7 @@ class ProductEditNutritionFactsFragment : ProductEditFragment() { modSpinner.setSelection(modSelectedIndex) } } catch (t: Throwable) { - AnalyticsService.record(IllegalStateException("Can't find weight units for nutriment: $nutrientShortName", t)) + SentryAnalytics.record(IllegalStateException("Can't find weight units for nutriment: $nutrientShortName", t)) closeScreenWithAlert() } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditOverviewFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditOverviewFragment.kt index 2acbd1113d6e..2a44e5f0bc40 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditOverviewFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/edit/ProductEditOverviewFragment.kt @@ -43,6 +43,8 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors.OFF import openfoodfacts.github.scrachx.openfood.AppFlavors.OPF import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsView +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabsHelper @@ -212,7 +214,7 @@ class ProductEditOverviewFragment : ProductEditFragment() { override fun onResume() { super.onResume() - AnalyticsService.getInstance().trackView(AnalyticsView.PRODUCT_EDIT_OVERVIEW) + MatomoAnalytics.trackView(AnalyticsView.ProductEditOverview) } override fun onDestroyView() { diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/summary/SummaryProductFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/summary/SummaryProductFragment.kt index adf5c6ecc53f..2260f0c8ac14 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/summary/SummaryProductFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/summary/SummaryProductFragment.kt @@ -47,6 +47,8 @@ import io.reactivex.rxkotlin.addTo import openfoodfacts.github.scrachx.openfood.AppFlavors.OFF import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabsHelper @@ -127,7 +129,7 @@ class SummaryProductFragment : BaseFragment(), ISummaryProductPresenter.View { private val loginThenProcessInsight = registerForActivityResult(LoginContract()) { isLogged -> if (isLogged) { - AnalyticsEvent.RobotoffLoggedInAfterPrompt().track() + MatomoAnalytics.trackEvent(AnalyticsEvent.RobotoffLoggedInAfterPrompt) processInsight() } } @@ -641,7 +643,7 @@ class SummaryProductFragment : BaseFragment(), ISummaryProductPresenter.View { if (requireActivity().isUserSet()) { processInsight() } else { - AnalyticsEvent.RobotoffLoginPrompt().track() + MatomoAnalytics.trackEvent(AnalyticsEvent.RobotoffLoginPrompt) MaterialDialog.Builder(requireActivity()).run { title(getString(R.string.sign_in_to_answer)) positiveText(getString(R.string.sign_in_or_register)) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlist/ProductListActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlist/ProductListActivity.kt index d572666db777..f29c39ac5056 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlist/ProductListActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlist/ProductListActivity.kt @@ -26,6 +26,8 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors import openfoodfacts.github.scrachx.openfood.AppFlavors.isFlavors import openfoodfacts.github.scrachx.openfood.BuildConfig import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.databinding.ActivityYourListedProductsBinding import openfoodfacts.github.scrachx.openfood.features.listeners.CommonBottomListenerInstaller.installBottomNavigation import openfoodfacts.github.scrachx.openfood.features.listeners.CommonBottomListenerInstaller.selectNavigationItem @@ -219,7 +221,7 @@ class ProductListActivity : BaseActivity(), SwipeController.Actions { } } else { exportAsCSV() - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ShoppingListExported()) + MatomoAnalytics.trackEvent(AnalyticsEvent.ShoppingListExported) } true } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlists/ProductListsActivity.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlists/ProductListsActivity.kt index bb797ec0e447..d3e208abb036 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlists/ProductListsActivity.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/productlists/ProductListsActivity.kt @@ -36,6 +36,8 @@ import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.addTo import io.reactivex.schedulers.Schedulers import openfoodfacts.github.scrachx.openfood.R +import openfoodfacts.github.scrachx.openfood.analytics.AnalyticsEvent +import openfoodfacts.github.scrachx.openfood.analytics.MatomoAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.databinding.ActivityProductListsBinding import openfoodfacts.github.scrachx.openfood.features.listeners.CommonBottomListenerInstaller.installBottomNavigation @@ -51,8 +53,6 @@ import openfoodfacts.github.scrachx.openfood.models.entities.ProductLists import openfoodfacts.github.scrachx.openfood.models.entities.ProductListsDao import openfoodfacts.github.scrachx.openfood.models.entities.YourListedProduct import openfoodfacts.github.scrachx.openfood.models.entities.YourListedProductDao -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsEvent -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsService import openfoodfacts.github.scrachx.openfood.utils.SwipeController import openfoodfacts.github.scrachx.openfood.utils.Utils import org.apache.commons.csv.CSVFormat @@ -134,8 +134,7 @@ class ProductListsActivity : BaseActivity(), SwipeController.Actions { .positiveText(R.string.dialog_create) .negativeText(R.string.dialog_cancel) .onPositive { dialog, _ -> // this enable to avoid dismissing dialog if list name already exist - Log.d("CreateListDialog", "Positive clicked") - AnalyticsService.getInstance().trackEvent(AnalyticsEvent.ShoppingListCreated()) + MatomoAnalytics.trackEvent(AnalyticsEvent.ShoppingListCreated) val inputEditText = dialog.inputEditText!! val listName = inputEditText.text.toString() val productList = ProductLists(listName, if (productToAdd != null) 1 else 0) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/AnalyticsUsageBottomSheetDialogFragment.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/AnalyticsUsageBottomSheetDialogFragment.java deleted file mode 100644 index f404074ed683..000000000000 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/AnalyticsUsageBottomSheetDialogFragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package openfoodfacts.github.scrachx.openfood.fragments; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.databinding.DataBindingUtil; -import androidx.preference.PreferenceManager; - -import com.google.android.material.bottomsheet.BottomSheetDialogFragment; - -import openfoodfacts.github.scrachx.openfood.R; -import openfoodfacts.github.scrachx.openfood.databinding.FragmentAnalyticsUsageBottomSheetBinding; -import openfoodfacts.github.scrachx.openfood.utils.AnalyticsService; -import openfoodfacts.github.scrachx.openfood.views.OFFApplication; - -public class AnalyticsUsageBottomSheetDialogFragment extends BottomSheetDialogFragment { - public AnalyticsUsageBottomSheetDialogFragment() { - setCancelable(false); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - - FragmentAnalyticsUsageBottomSheetBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_analytics_usage_bottom_sheet, container, false); - - binding.grantButton.setOnClickListener(view -> { - PreferenceManager.getDefaultSharedPreferences(OFFApplication.getInstance()).edit().putBoolean("privacyAnalyticsReporting", true).apply(); - AnalyticsService.getInstance().onAnalyticsEnabledToggled(true); - dismiss(); - }); - binding.declineButton.setOnClickListener(view -> { - PreferenceManager.getDefaultSharedPreferences(OFFApplication.getInstance()).edit().putBoolean("privacyAnalyticsReporting", false).apply(); - AnalyticsService.getInstance().onAnalyticsEnabledToggled(false); - dismiss(); - }); - - return binding.getRoot(); - } -} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/OpenFoodAPIClient.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/OpenFoodAPIClient.kt index 162e02256325..7dfc7ece9fa9 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/OpenFoodAPIClient.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/network/OpenFoodAPIClient.kt @@ -22,7 +22,7 @@ import openfoodfacts.github.scrachx.openfood.AppFlavors.OPF import openfoodfacts.github.scrachx.openfood.AppFlavors.OPFF import openfoodfacts.github.scrachx.openfood.BuildConfig import openfoodfacts.github.scrachx.openfood.R -import openfoodfacts.github.scrachx.openfood.app.AnalyticsService +import openfoodfacts.github.scrachx.openfood.analytics.SentryAnalytics import openfoodfacts.github.scrachx.openfood.app.OFFApplication import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditActivity import openfoodfacts.github.scrachx.openfood.features.product.edit.ProductEditActivity.Companion.KEY_EDIT_PRODUCT @@ -48,7 +48,7 @@ class OpenFoodAPIClient(private val context: Context) { private var historySyncDisp = CompositeDisposable() fun getProductStateFull(barcode: String, customHeader: String = Utils.HEADER_USER_AGENT_SEARCH): Single { - AnalyticsService.setBarcode(barcode) + SentryAnalytics.setBarcode(barcode) return productsApi.getProductByBarcode(barcode, getAllFields(), getUserAgent(customHeader)) } diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/AnalyticsEvent.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/AnalyticsEvent.java deleted file mode 100644 index d20693f027d2..000000000000 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/AnalyticsEvent.java +++ /dev/null @@ -1,83 +0,0 @@ -package openfoodfacts.github.scrachx.openfood.utils; - -public class AnalyticsEvent { - public String category; - public String action; - public String name; - public Float value; - - private AnalyticsEvent(String category, String action, String name, Float value) { - this.category = category; - this.action = action; - this.name = name; - this.value = value; - } - - public void track() { - AnalyticsService.getInstance().trackEvent(this); - } - - public static AnalyticsEvent ScannedBarcode(String barcode) { - return new AnalyticsEvent("scanner", "scanned", barcode, null); - } - - public static AnalyticsEvent ScannedBarcodeResultExpanded(String barcode) { - return new AnalyticsEvent("scanner", "result-expanded", barcode, null); - } - - public static AnalyticsEvent AllergenAlertCreated(String allergenCode) { - return new AnalyticsEvent("allergen-alerts", "created", allergenCode, null); - } - - public static AnalyticsEvent ProductCreated(String barcode) { - return new AnalyticsEvent("products", "created", barcode, null); - } - - public static AnalyticsEvent ProductEdited(String barcode) { - return new AnalyticsEvent("products", "edited", barcode, null); - } - - public static AnalyticsEvent ProductIngredientsPictureEdited(String barcode) { - return new AnalyticsEvent("products", "edited-ingredients-picture", barcode, null); - } - - public static AnalyticsEvent UserLogin() { - return new AnalyticsEvent("user-account", "login", null, null); - } - - public static AnalyticsEvent UserLogout() { - return new AnalyticsEvent("user-account", "logout", null, null); - } - - public static AnalyticsEvent RobotoffLoginPrompt() { - return new AnalyticsEvent("user-account", "login-prompt", "robotoff", null); - } - - public static AnalyticsEvent RobotoffLoggedInAfterPrompt() { - return new AnalyticsEvent("user-account", "logged-in-after-prompt", "robotoff", null); - } - - public static AnalyticsEvent ShoppingListCreated() { - return new AnalyticsEvent("shopping-lists", "created", null, null); - } - - public static AnalyticsEvent ShoppingListExported() { - return new AnalyticsEvent("shopping-lists", "exported", null, null); - } - - public static AnalyticsEvent IngredientAnalysisEnabled(String name) { - return new AnalyticsEvent("ingredient-analysis", "enabled", name, null); - } - - public static AnalyticsEvent IngredientAnalysisDisabled(String name) { - return new AnalyticsEvent("ingredient-analysis", "disabled", name, null); - } - - public static AnalyticsEvent AddProductToComparison(String barcode) { - return new AnalyticsEvent("products", "compare-add", barcode, null); - } - - public static AnalyticsEvent CompareProducts(int count) { - return new AnalyticsEvent("products", "compare-multiple", null, (float) count); - } -} diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/AnalyticsView.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/AnalyticsView.java deleted file mode 100644 index 08db355ab191..000000000000 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/utils/AnalyticsView.java +++ /dev/null @@ -1,13 +0,0 @@ -package openfoodfacts.github.scrachx.openfood.utils; - -public enum AnalyticsView { - SCANNER("scanner"), - PRODUCT_EDIT_OVERVIEW("products/edit/overview"), - PRODUCT_EDIT_INGREDIENTS("products/edit/ingredients"), - PRODUCT_EDIT_NUTRITION_FACTS("products/edit/nutrition_facts"); - public String path; - - AnalyticsView(String path) { - this.path = path; - } -} diff --git a/app/src/main/res/values/pref_keys.xml b/app/src/main/res/values/pref_keys.xml index 6a7de000c6a0..4a27b8c03271 100644 --- a/app/src/main/res/values/pref_keys.xml +++ b/app/src/main/res/values/pref_keys.xml @@ -90,6 +90,9 @@ Version Version + privacyAnalyticsReporting + privacyCrashReports + fastAdditionMode Fast Addition Mode Enables fast addition of products with fewer attributes @@ -102,4 +105,4 @@ Switch off to use Classic Barcode Scanner. select_scanner - \ No newline at end of file + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 15880a9c34ef..e2a3a7807092 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -154,14 +154,14 @@