diff --git a/app/src/main/java/app/opendocument/droid/ui/activity/LandingFragment.kt b/app/src/main/java/app/opendocument/droid/ui/activity/LandingFragment.kt
index 03d4a9d7949b..146e3c91b54a 100644
--- a/app/src/main/java/app/opendocument/droid/ui/activity/LandingFragment.kt
+++ b/app/src/main/java/app/opendocument/droid/ui/activity/LandingFragment.kt
@@ -315,6 +315,19 @@ class LandingFragment : Fragment(), LandingAdapter.Listener {
state.catchAllEnabled,
)
)
+
+ // asked here rather than carried in the state: what billing knows lives on the activity,
+ // not in anything the ViewModel reads. it is only ever false in pro or after a purchase,
+ // both of which are settled long before the first refresh comes back
+ if (mainActivity.offersAdRemoval()) {
+ items.add(
+ LandingItem.Action(
+ LandingItem.ACTION_REMOVE_ADS,
+ R.string.menu_remove_ads,
+ R.drawable.ic_block,
+ )
+ )
+ }
}
/** "2 hours ago", or nothing at all for entries written before this was recorded. */
@@ -417,6 +430,11 @@ class LandingFragment : Fragment(), LandingAdapter.Listener {
when (action) {
LandingItem.ACTION_ADD_FOLDER -> addFolder()
LandingItem.ACTION_UP -> viewModel.leaveFolder()
+ LandingItem.ACTION_REMOVE_ADS -> {
+ mainActivity.analyticsManager.report("settings_remove_ads")
+
+ mainActivity.buyAdRemoval()
+ }
}
}
diff --git a/app/src/main/java/app/opendocument/droid/ui/activity/MainActivity.kt b/app/src/main/java/app/opendocument/droid/ui/activity/MainActivity.kt
index a5688407183c..30779b51bdfb 100644
--- a/app/src/main/java/app/opendocument/droid/ui/activity/MainActivity.kt
+++ b/app/src/main/java/app/opendocument/droid/ui/activity/MainActivity.kt
@@ -365,10 +365,6 @@ class MainActivity : AppCompatActivity(), MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_main, menu)
-
- if (billingManager.hasPurchased()) {
- menu.findItem(R.id.menu_remove_ads).isVisible = false
- }
}
// The play services availability dialog calls startActivityForResult() itself with a
@@ -470,12 +466,6 @@ class MainActivity : AppCompatActivity(), MenuProvider {
analyticsManager.report("menu_share")
}
- R.id.menu_remove_ads -> {
- analyticsManager.report("menu_remove_ads")
-
- buyAdRemoval()
- }
-
R.id.menu_fullscreen -> {
if (fullscreen) {
analyticsManager.report("menu_fullscreen_leave")
@@ -572,7 +562,18 @@ class MainActivity : AppCompatActivity(), MenuProvider {
ttsActionMode = null
}
- private fun buyAdRemoval() {
+ /**
+ * Whether the ad removal is still worth offering: never in pro, where the purchase is implied,
+ * and not once it has been bought.
+ *
+ * The landing screen asks rather than being told, because billing is set up by
+ * [initializeProprietaryLibraries] - which can run a second time, after the play services
+ * dialog - and it is not something the ViewModel could read off disk itself.
+ */
+ fun offersAdRemoval(): Boolean =
+ ::billingManager.isInitialized && !billingManager.hasPurchased()
+
+ fun buyAdRemoval() {
analyticsManager.report(AnalyticsConstants.EVENT_ADD_TO_CART)
// the play listing id is the applicationId, which stays at.tomtasche.reader.pro
diff --git a/app/src/main/java/app/opendocument/droid/ui/widget/LandingItem.kt b/app/src/main/java/app/opendocument/droid/ui/widget/LandingItem.kt
index e6d74cca2fb5..f94f2cc28e16 100644
--- a/app/src/main/java/app/opendocument/droid/ui/widget/LandingItem.kt
+++ b/app/src/main/java/app/opendocument/droid/ui/widget/LandingItem.kt
@@ -67,6 +67,7 @@ sealed class LandingItem {
companion object {
const val ACTION_ADD_FOLDER: Int = 1
const val ACTION_UP: Int = 2
+ const val ACTION_REMOVE_ADS: Int = 3
const val SETTING_CATCH_ALL: Int = 1
}
diff --git a/app/src/main/res/drawable/ic_block.xml b/app/src/main/res/drawable/ic_block.xml
new file mode 100644
index 000000000000..53979f05ff4c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_block.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 7e8de18e11dc..5e0e7c730bfe 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -56,8 +56,4 @@
android:visible="false"
app:showAsAction="never" />
-