From fb16343314a732b9d86271fccac1bb2d31e0b99a Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Wed, 20 Mar 2019 10:47:22 -0700 Subject: [PATCH] [fenix] Closes https://github.com/mozilla-mobile/fenix/issues/1039: Adds crash reporting (https://github.com/mozilla-mobile/fenix/pull/1053) * For https://github.com/mozilla-mobile/fenix/issues/1039: Small cleanup * Closes https://github.com/mozilla-mobile/fenix/issues/1039: Adds crash reporting * Add images * Adds build settings back * Fix nits --- .../java/org/mozilla/fenix/HomeActivity.kt | 26 +++-- .../org/mozilla/fenix/components/Analytics.kt | 17 ++- .../fenix/crashes/CrashReporterFragment.kt | 56 ++++++++++ .../res/drawable/ic_error_session_crashed.png | Bin 0 -> 31455 bytes app/src/main/res/layout/fragment_browser.xml | 7 ++ .../res/layout/fragment_crash_reporter.xml | 99 ++++++++++++++++++ app/src/main/res/navigation/nav_graph.xml | 15 +++ app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/dimens.xml | 2 + app/src/main/res/values/strings.xml | 12 +++ 10 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/crashes/CrashReporterFragment.kt create mode 100644 app/src/main/res/drawable/ic_error_session_crashed.png create mode 100644 app/src/main/res/layout/fragment_crash_reporter.xml diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 873b4acbbb..da2a72325a 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -19,6 +19,7 @@ import androidx.navigation.ui.NavigationUI import mozilla.components.browser.session.Session import mozilla.components.concept.engine.EngineView import mozilla.components.feature.intent.IntentProcessor +import mozilla.components.lib.crash.Crash import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.ktx.kotlin.isUrl import mozilla.components.support.ktx.kotlin.toNormalizedUrl @@ -38,6 +39,10 @@ open class HomeActivity : AppCompatActivity() { } } + private val navHost by lazy { + supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment + } + lateinit var browsingModeManager: DefaultBrowsingModeManager override fun onCreate(savedInstanceState: Bundle?) { @@ -50,12 +55,10 @@ open class HomeActivity : AppCompatActivity() { setContentView(R.layout.activity_home) - val host = supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment - val hostNavController = host.navController val appBarConfiguration = AppBarConfiguration.Builder(setOf(R.id.libraryFragment)).build() val navigationToolbar = findViewById(R.id.navigationToolbar) setSupportActionBar(navigationToolbar) - NavigationUI.setupWithNavController(navigationToolbar, hostNavController, appBarConfiguration) + NavigationUI.setupWithNavController(navigationToolbar, navHost.navController, appBarConfiguration) handleOpenedFromExternalSourceIfNecessary(intent) } @@ -67,6 +70,7 @@ open class HomeActivity : AppCompatActivity() { override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) + handleCrashIfNecessary(intent) handleOpenedFromExternalSourceIfNecessary(intent) } @@ -104,6 +108,18 @@ open class HomeActivity : AppCompatActivity() { } } + private fun handleCrashIfNecessary(intent: Intent?) { + if (intent == null) { return } + if (!Crash.isCrashIntent(intent)) { return } + + openToCrashReporter(intent) + } + + private fun openToCrashReporter(intent: Intent) { + val directions = NavGraphDirections.actionGlobalCrashReporter(intent) + navHost.navController.navigate(directions) + } + private fun handleOpenedFromExternalSourceIfNecessary(intent: Intent?) { if (intent?.extras?.getBoolean(OPEN_TO_BROWSER) == true) { handleOpenedFromExternalSource() @@ -121,8 +137,6 @@ open class HomeActivity : AppCompatActivity() { } fun openToBrowser(sessionId: String?, from: BrowserDirection) { - val host = supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment - val directions = when (from) { BrowserDirection.FromGlobal -> NavGraphDirections.actionGlobalBrowser(sessionId) BrowserDirection.FromHome -> HomeFragmentDirections.actionHomeFragmentToBrowserFragment(sessionId) @@ -131,7 +145,7 @@ open class HomeActivity : AppCompatActivity() { SettingsFragmentDirections.actionSettingsFragmentToBrowserFragment(sessionId) } - host.navController.navigate(directions) + navHost.navController.navigate(directions) } private fun load(text: String, sessionId: String?) { diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt index fd69e280c6..4588ad6f85 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt @@ -5,11 +5,14 @@ package org.mozilla.fenix.components import android.app.Application +import android.app.PendingIntent import android.content.Context +import android.content.Intent import mozilla.components.lib.crash.CrashReporter import mozilla.components.lib.crash.service.MozillaSocorroService import mozilla.components.lib.crash.service.SentryService import org.mozilla.fenix.BuildConfig +import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.GleanMetricsService import org.mozilla.fenix.components.metrics.LeanplumMetricsService @@ -34,6 +37,17 @@ class Analytics( val socorroService = MozillaSocorroService(context, "Fenix") + val intent = Intent(context, HomeActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + } + + val pendingIntent = PendingIntent.getActivity( + context, + 0, + intent, + 0 + ) + CrashReporter( services = listOf(sentryService, socorroService), shouldPrompt = CrashReporter.Prompt.ALWAYS, @@ -41,7 +55,8 @@ class Analytics( appName = context.getString(R.string.app_name), organizationName = "Mozilla" ), - enabled = true + enabled = true, + nonFatalCrashIntent = pendingIntent ) } diff --git a/app/src/main/java/org/mozilla/fenix/crashes/CrashReporterFragment.kt b/app/src/main/java/org/mozilla/fenix/crashes/CrashReporterFragment.kt new file mode 100644 index 0000000000..40a018858e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/crashes/CrashReporterFragment.kt @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.crashes + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.navigation.Navigation +import kotlinx.android.synthetic.main.fragment_crash_reporter.* +import mozilla.components.lib.crash.Crash +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.requireComponents + +class CrashReporterFragment : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? = inflater.inflate(R.layout.fragment_crash_reporter, container, false) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val crashIntent = CrashReporterFragmentArgs.fromBundle(arguments!!).crashIntent + + val crash = Crash.fromIntent(CrashReporterFragmentArgs.fromBundle(arguments!!).crashIntent) + // TODO TelemetryWrapper.crashReporterOpened() + + closeTabButton.setOnClickListener { + val wantsToSubmitCrashReport = sendCrashCheckbox.isChecked + val selectedSession = requireComponents.core.sessionManager.selectedSession + + selectedSession?.let { session -> requireComponents.useCases.tabsUseCases.removeTab.invoke(session) } + // TODO TelemetryWrapper.crashReporterClosed(wantsSubmitCrashReport) + + if (wantsToSubmitCrashReport) { + requireComponents.analytics.crashReporter.submitReport(crash) + } + + navigateHome(view) + } + } + + fun navigateHome(fromView: View) { + val directions = CrashReporterFragmentDirections.actionCrashReporterFragmentToHomeFragment() + Navigation.findNavController(fromView).navigate(directions) + } + + fun onBackPressed() { + // TODO TelemetryWrapper.crashReporterClosed(false) + } +} diff --git a/app/src/main/res/drawable/ic_error_session_crashed.png b/app/src/main/res/drawable/ic_error_session_crashed.png new file mode 100644 index 0000000000000000000000000000000000000000..776cc05e167f44a851d0b5e5614aad8bf4320547 GIT binary patch literal 31455 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_browser.xml b/app/src/main/res/layout/fragment_browser.xml index b821b73d9d..7a53d81a51 100644 --- a/app/src/main/res/layout/fragment_browser.xml +++ b/app/src/main/res/layout/fragment_browser.xml @@ -11,6 +11,13 @@ android:layout_height="match_parent" tools:context="browser.BrowserFragment"> + + + + + + + + + + + + + +