diff --git a/app/build.gradle b/app/build.gradle index f03f31095..b8a30714c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -638,15 +638,6 @@ dependencies { implementation Deps.protobuf_javalite implementation Deps.google_material - implementation Deps.adjust - implementation Deps.installreferrer // Required by Adjust - - implementation Deps.google_ads_id // Required for the Google Advertising ID - - // Required for in-app reviews - implementation Deps.google_play_review - implementation Deps.google_play_review_ktx - androidTestImplementation Deps.uiautomator androidTestImplementation "tools.fastlane:screengrab:2.0.0" // This Falcon version is added to maven central now required for Screengrab diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index dd21b2978..7904a8169 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -12,6 +12,7 @@ import android.os.Bundle import android.view.Gravity import android.view.LayoutInflater import android.view.Menu +import android.view.MenuItem import android.view.MenuInflater import android.view.View import android.view.ViewGroup @@ -20,7 +21,10 @@ import android.view.inputmethod.EditorInfo import androidx.appcompat.widget.SearchView import androidx.annotation.VisibleForTesting import androidx.core.view.isVisible +import androidx.core.view.MenuHost +import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs @@ -69,16 +73,6 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) // downloaded for the non-suspending search function private var addons: List? = null - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View? { - logger.info("Creating view for AddonsManagementFragment") - setHasOptionsMenu(true) - return super.onCreateView(inflater, container, savedInstanceState) - } - private var installExternalAddonComplete: Boolean set(value) { arguments?.putBoolean(BUNDLE_KEY_INSTALL_EXTERNAL_ADDON_COMPLETE, value) @@ -90,28 +84,40 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { logger.info("View created for AddonsManagementFragment") super.onViewCreated(view, savedInstanceState) + setupMenu() binding = FragmentAddOnsManagementBinding.bind(view) bindRecyclerView() } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.addons_menu, menu) - val searchItem = menu.findItem(R.id.search) - val searchView: SearchView = searchItem.actionView as SearchView - searchView.imeOptions = EditorInfo.IME_ACTION_DONE - searchView.queryHint = getString(R.string.addons_search_hint) - - searchView.setOnQueryTextListener( - object : SearchView.OnQueryTextListener { - override fun onQueryTextSubmit(query: String): Boolean { - return searchAddons(query.trim()) - } + private fun setupMenu() { + val menuHost: MenuHost = requireActivity() + + menuHost.addMenuProvider(object : MenuProvider { + override fun onCreateMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.addons_menu, menu) + val searchItem = menu.findItem(R.id.search) + val searchView: SearchView = searchItem.actionView as SearchView + searchView.imeOptions = EditorInfo.IME_ACTION_DONE + searchView.queryHint = getString(R.string.addons_search_hint) + + searchView.setOnQueryTextListener( + object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String): Boolean { + return searchAddons(query.trim()) + } - override fun onQueryTextChange(newText: String): Boolean { - return searchAddons(newText.trim()) - } - }, - ) + override fun onQueryTextChange(newText: String): Boolean { + return searchAddons(newText.trim()) + } + }, + ) + } + + override fun onMenuItemSelected(menuItem: MenuItem): Boolean { + // Handle the menu selection + return true + } + }, viewLifecycleOwner, Lifecycle.State.RESUMED) } private fun searchAddons(addonNameSubStr: String): Boolean { diff --git a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt index 33e8704ad..87c3a831b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/ReviewPromptController.kt @@ -6,15 +6,10 @@ package org.mozilla.fenix.components import android.app.Activity import androidx.annotation.VisibleForTesting -import com.google.android.play.core.review.ReviewInfo import com.google.android.play.core.review.ReviewManager import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.withContext -import org.mozilla.fenix.GleanMetrics.ReviewPrompt import org.mozilla.fenix.utils.Settings -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale /** * Interface that describes the settings needed to track the Review Prompt. @@ -55,11 +50,6 @@ class ReviewPromptController( flow.addOnCompleteListener { if (it.isSuccessful) { manager.launchReviewFlow(activity, it.result) - recordReviewPromptEvent( - it.result.toString(), - reviewSettings.numberOfAppLaunches, - Date(), - ) } } } @@ -108,44 +98,3 @@ class ReviewPromptController( private const val NUMBER_OF_MONTHS_TO_PASS = 4 } } - -/** - * Records a [ReviewPrompt] with the required data. - * - * **Note:** The docs for [ReviewManager.launchReviewFlow] state 'In some circumstances the review - * flow will not be shown to the user, e.g. they have already seen it recently, so do not assume that - * calling this method will always display the review dialog.' - * However, investigation has shown that a [ReviewInfo] instance with the flag: - * - 'isNoOp=true' indicates that the prompt has NOT been displayed. - * - 'isNoOp=false' indicates that a prompt has been displayed. - * [ReviewManager.launchReviewFlow] will modify the ReviewInfo instance which can be used to determine - * which of these flags is present. - */ -@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) -fun recordReviewPromptEvent( - reviewInfoAsString: String, - numberOfAppLaunches: Int, - now: Date, -) { - val formattedLocalDatetime = - SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault()).format(now) - - // The internals of ReviewInfo cannot be accessed directly or cast nicely, so lets simply use - // the object as a string. - // ReviewInfo is susceptible to changes outside of our control hence the catch-all 'else' statement. - val promptWasDisplayed = if (reviewInfoAsString.contains("isNoOp=true")) { - "false" - } else if (reviewInfoAsString.contains("isNoOp=false")) { - "true" - } else { - "error" - } - - ReviewPrompt.promptAttempt.record( - ReviewPrompt.PromptAttemptExtra( - promptWasDisplayed = promptWasDisplayed, - localDatetime = formattedLocalDatetime, - numberOfAppLaunches = numberOfAppLaunches, - ), - ) -}