From f2b030c66cff8a55893d0cc692d0a595cbeae47d Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Fri, 21 Sep 2018 20:14:47 +0200 Subject: [PATCH 01/11] Crash service support --- .../vrbrowser/CrashReporterService.java | 67 +++++++++ .../org/mozilla/vrbrowser/SessionStore.java | 32 ++-- .../mozilla/vrbrowser/VRBrowserActivity.java | 78 ++++++++++ .../mozilla/vrbrowser/ui/BrowserWidget.java | 1 + .../vrbrowser/ui/CrashDialogWidget.java | 139 ++++++++++++++++++ .../mozilla/vrbrowser/ui/SettingsWidget.java | 4 - app/src/main/AndroidManifest.xml | 10 ++ app/src/main/res/drawable/checkbox.xml | 15 ++ .../res/drawable/crash_dialog_background.xml | 7 + .../crash_dialog_button_background.xml | 23 +++ .../crash_dialog_button_send_background.xml | 23 +++ .../crash_dialog_button_text_color.xml | 10 ++ .../res/drawable/ic_button_checkbox_off.xml | 9 ++ .../res/drawable/ic_button_checkbox_on.xml | 12 ++ app/src/main/res/drawable/sad_fox.png | Bin 0 -> 31507 bytes app/src/main/res/layout/crash_dialog.xml | 88 +++++++++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/dimen.xml | 6 + app/src/main/res/values/non_L10n.xml | 2 + app/src/main/res/values/strings.xml | 7 + 20 files changed, 518 insertions(+), 16 deletions(-) create mode 100644 app/src/common/shared/org/mozilla/vrbrowser/CrashReporterService.java create mode 100644 app/src/common/shared/org/mozilla/vrbrowser/ui/CrashDialogWidget.java create mode 100644 app/src/main/res/drawable/checkbox.xml create mode 100644 app/src/main/res/drawable/crash_dialog_background.xml create mode 100644 app/src/main/res/drawable/crash_dialog_button_background.xml create mode 100644 app/src/main/res/drawable/crash_dialog_button_send_background.xml create mode 100644 app/src/main/res/drawable/crash_dialog_button_text_color.xml create mode 100644 app/src/main/res/drawable/ic_button_checkbox_off.xml create mode 100644 app/src/main/res/drawable/ic_button_checkbox_on.xml create mode 100644 app/src/main/res/drawable/sad_fox.png create mode 100644 app/src/main/res/layout/crash_dialog.xml diff --git a/app/src/common/shared/org/mozilla/vrbrowser/CrashReporterService.java b/app/src/common/shared/org/mozilla/vrbrowser/CrashReporterService.java new file mode 100644 index 000000000..34d71cd0e --- /dev/null +++ b/app/src/common/shared/org/mozilla/vrbrowser/CrashReporterService.java @@ -0,0 +1,67 @@ +package org.mozilla.vrbrowser; + +import android.app.ActivityManager; +import android.app.IntentService; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.Process; +import android.support.annotation.Nullable; +import android.util.Log; +import org.mozilla.geckoview.GeckoRuntime; + +public class CrashReporterService extends IntentService { + + private static final String LOGTAG = "VRB"; + + public static final String CRASH_ACTION = "org.mozilla.vrbrowser.CRASH_ACTION"; + public static final String DATA_TAG = "intent"; + private static final int PID_CHECK_INTERVAL = 100; + + private Handler mHandler; + + public CrashReporterService() { + super("CrashReporterService"); + + mHandler = new Handler(); + } + + @Override + protected void onHandleIntent(@Nullable final Intent intent) { + boolean fatal = false; + if (GeckoRuntime.ACTION_CRASHED.equals(intent.getAction())) { + fatal = intent.getBooleanExtra(GeckoRuntime.EXTRA_CRASH_FATAL, false); + } + + if (fatal) { + Log.d(LOGTAG, "======> PARENT CRASH" + intent); + final int pid = Process.myPid(); + final ActivityManager activityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + boolean otherProcessesFound = false; + for (final ActivityManager.RunningAppProcessInfo info : activityManager.getRunningAppProcesses()) { + if (pid != info.pid) { + otherProcessesFound = true; + } + } + + if (!otherProcessesFound) { + intent.setClass(CrashReporterService.this, VRBrowserActivity.class); + startActivity(intent); + + } else { + mHandler.postDelayed(this, PID_CHECK_INTERVAL); + } + } + }, PID_CHECK_INTERVAL); + + } else { + Log.d(LOGTAG, "======> CONTENT CRASH" + intent); + Intent broadcastIntent = new Intent(CRASH_ACTION); + broadcastIntent.putExtra(DATA_TAG, intent); + sendBroadcast(broadcastIntent, getString(R.string.app_permission_name)); + } + } +} diff --git a/app/src/common/shared/org/mozilla/vrbrowser/SessionStore.java b/app/src/common/shared/org/mozilla/vrbrowser/SessionStore.java index c0fa487da..cef01867a 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/SessionStore.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/SessionStore.java @@ -54,6 +54,14 @@ public interface SessionChangeListener { void onCurrentSessionChange(GeckoSession aSession, int aId); } + class SessionSettings { + boolean multiprocess = SettingsStore.getInstance(mContext).isMultiprocessEnabled(); + boolean privateMode = false; + boolean trackingProtection = true; + boolean suspendMediaWhenInactive = true; + int userAgentMode = SettingsStore.getInstance(mContext).getUaMode(); + } + class State { boolean mCanGoBack; boolean mCanGoForward; @@ -64,6 +72,7 @@ class State { String mTitle; boolean mFullScreen; GeckoSession mSession; + SessionSettings mSettings; } private GeckoRuntime mRuntime; @@ -131,8 +140,10 @@ public void setContext(Context aContext, Bundle aExtras) { // FIXME: Once GeckoView has a prefs API vrPrefsWorkAround(aContext, aExtras); GeckoRuntimeSettings.Builder runtimeSettingsBuilder = new GeckoRuntimeSettings.Builder(); -// runtimeSettingsBuilder.javaCrashReportingEnabled(SettingsStore.getInstance(aContext).isCrashReportingEnabled()); -// runtimeSettingsBuilder.nativeCrashReportingEnabled(SettingsStore.getInstance(aContext).isCrashReportingEnabled()); + // FIXME: Temporarily disabling crash handler for Oculus until https://github.com/MozillaReality/FirefoxReality/issues/564 gets fixed + if (!BuildConfig.FLAVOR.equals("oculusvr")) { + runtimeSettingsBuilder.crashHandler(CrashReporterService.class); + } runtimeSettingsBuilder.trackingProtectionCategories(GeckoSession.TrackingProtectionDelegate.CATEGORY_AD | GeckoSession.TrackingProtectionDelegate.CATEGORY_SOCIAL | GeckoSession.TrackingProtectionDelegate.CATEGORY_ANALYTIC); runtimeSettingsBuilder.consoleOutput(SettingsStore.getInstance(aContext).isConsoleLogsEnabled()); runtimeSettingsBuilder.displayDensityOverride(SettingsStore.getInstance(aContext).getDisplayDensity()); @@ -275,19 +286,12 @@ public void removePromptListener(GeckoSession.PromptDelegate aListener) { mPromptListeners.remove(aListener); } - public class SessionSettings { - public boolean multiprocess = SettingsStore.getInstance(mContext).isMultiprocessEnabled(); - public boolean privateMode = false; - public boolean trackingProtection = true; - public boolean suspendMediaWhenInactive = true; - public int userAgentMode = SettingsStore.getInstance(mContext).getUaMode(); - } - public int createSession() { return createSession(new SessionSettings()); } - public int createSession(SessionSettings aSettings) { + int createSession(SessionSettings aSettings) { State state = new State(); + state.mSettings = aSettings; state.mSession = new GeckoSession(); int result = state.mSession.hashCode(); @@ -937,7 +941,11 @@ public void onExternalResponse(GeckoSession session, GeckoSession.WebResponseInf @Override public void onCrash(GeckoSession session) { - + Log.e(LOGTAG,"Child crashed. Creating new session"); + removeSession(SessionStore.get().getCurrentSessionId()); + int id = createSession(); + setCurrentSession(id); + loadUri(getHomeUri()); } // TextInput Delegate diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index 2563999c8..ca6802435 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -5,7 +5,10 @@ package org.mozilla.vrbrowser; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.graphics.SurfaceTexture; import android.net.Uri; import android.opengl.GLES11Ext; @@ -20,18 +23,33 @@ import android.view.ViewTreeObserver; import android.widget.FrameLayout; import org.mozilla.gecko.GeckoVRManager; +import org.mozilla.gecko.util.ThreadUtils; +import org.mozilla.geckoview.CrashReporter; +import org.mozilla.geckoview.GeckoRuntime; import org.mozilla.vrbrowser.audio.AudioEngine; import org.mozilla.vrbrowser.audio.VRAudioTheme; import org.mozilla.vrbrowser.search.SearchEngine; import org.mozilla.vrbrowser.telemetry.TelemetryWrapper; import org.mozilla.vrbrowser.ui.*; +import java.io.IOException; +import java.net.URISyntaxException; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; public class VRBrowserActivity extends PlatformActivity implements WidgetManagerDelegate { + private BroadcastReceiver mCrashReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if(intent.getAction().equals(CrashReporterService.CRASH_ACTION)) { + Intent crashIntent = intent.getParcelableExtra(CrashReporterService.DATA_TAG); + handleCrashIntent(crashIntent); + } + } + }; + class SwipeRunnable implements Runnable { boolean mCanceled = false; @Override @@ -65,6 +83,7 @@ public void run() { BrowserWidget mBrowserWidget; KeyboardWidget mKeyboard; NavigationBarWidget mNavigationBar; + CrashDialogWidget mCrashDialog; TopBarWidget mTopBar; TrayWidget mTray; PermissionDelegate mPermissionDelegate; @@ -84,6 +103,11 @@ protected void onCreate(Bundle savedInstanceState) { Bundle extras = getIntent() != null ? getIntent().getExtras() : null; SessionStore.get().setContext(this, extras); + // Create broadcast receiver for getting crash messages from crash process + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(CrashReporterService.CRASH_ACTION); + registerReceiver(mCrashReceiver, intentFilter, getString(R.string.app_permission_name), null); + mLastGesture = NoGesture; super.onCreate(savedInstanceState); @@ -199,6 +223,9 @@ protected void onResume() { @Override protected void onDestroy() { + // Unregister the crash service broadcast receiver + unregisterReceiver(mCrashReceiver); + for (Widget widget: mWidgets.values()) { widget.releaseWidget(); } @@ -227,14 +254,21 @@ protected void onNewIntent(final Intent intent) { if (intent.getData() != null) { loadFromIntent(intent); } + } else if (GeckoRuntime.ACTION_CRASHED.equals(intent.getAction())) { + handleCrashIntent(intent); } } void loadFromIntent(final Intent intent) { + if (GeckoRuntime.ACTION_CRASHED.equals(intent.getAction())) { + handleCrashIntent(intent); + } + Uri uri = intent.getData(); if (uri == null && intent.getExtras() != null && intent.getExtras().containsKey("url")) { uri = Uri.parse(intent.getExtras().getString("url")); } + if (SessionStore.get().getCurrentSession() == null) { String url = (uri != null ? uri.toString() : null); int id = SessionStore.get().createSession(); @@ -247,6 +281,50 @@ void loadFromIntent(final Intent intent) { } } + private void handleCrashIntent(final Intent intent) { + Log.e(LOGTAG, "======> Got crashed intent"); + Log.d(LOGTAG, "======> Dump File: " + + intent.getStringExtra(GeckoRuntime.EXTRA_MINIDUMP_PATH)); + Log.d(LOGTAG, "======> Extras File: " + + intent.getStringExtra(GeckoRuntime.EXTRA_EXTRAS_PATH)); + Log.d(LOGTAG, "======> Dump Success: " + + intent.getBooleanExtra(GeckoRuntime.EXTRA_MINIDUMP_SUCCESS, false)); + Log.d(LOGTAG, "======> Fatal: " + + intent.getBooleanExtra(GeckoRuntime.EXTRA_CRASH_FATAL, false)); + + boolean isCrashReportingEnabled = SettingsStore.getInstance(this).isCrashReportingEnabled(); + if (isCrashReportingEnabled) { + sendCrashData(intent); + + } else { + if (mCrashDialog == null) { + mCrashDialog = new CrashDialogWidget(this); + mCrashDialog.setCrashDialogDelegate(new CrashDialogWidget.CrashDialogDelegate() { + @Override + public void onSendData() { + sendCrashData(intent); + } + }); + } + + mCrashDialog.show(); + } + } + + private void sendCrashData(final Intent intent) { + ThreadUtils.postToBackgroundThread(new Runnable() { + @Override + public void run() { + try { + CrashReporter.sendCrashReport(VRBrowserActivity.this, intent, getString(R.string.crash_app_name)); + + } catch (IOException | URISyntaxException e) { + Log.e(LOGTAG, "Failed to send crash report: " + e.toString()); + } + } + }); + } + @Override public void onBackPressed() { if (mIsPresentingImmersive) { diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/BrowserWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/BrowserWidget.java index 4610bf1fc..52376c828 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/BrowserWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/BrowserWidget.java @@ -178,6 +178,7 @@ public void handleResizeEvent(float aWorldWidth, float aWorldHeight) { @Override public void releaseWidget() { SessionStore.get().removeSessionChangeListener(this); + SessionStore.get().removePromptListener(this); GeckoSession session = SessionStore.get().getSession(mSessionId); if (session == null) { return; diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/CrashDialogWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/CrashDialogWidget.java new file mode 100644 index 000000000..b0aa2681e --- /dev/null +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/CrashDialogWidget.java @@ -0,0 +1,139 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * 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.vrbrowser.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import org.mozilla.geckoview.GeckoSession; +import org.mozilla.vrbrowser.R; +import org.mozilla.vrbrowser.SessionStore; +import org.mozilla.vrbrowser.SettingsStore; +import org.mozilla.vrbrowser.WidgetPlacement; +import org.mozilla.vrbrowser.audio.AudioEngine; + +public class CrashDialogWidget extends UIWidget { + private static final String LOGTAG = "VRB"; + + public interface CrashDialogDelegate { + void onSendData(); + } + + private Button mLearnMoreButton; + private Button mDontSendButton; + private Button mSendDataButton; + private CheckBox mSendDataCheckBox; + private AudioEngine mAudio; + private CrashDialogDelegate mCrashDialogDelegate; + + public CrashDialogWidget(Context aContext) { + super(aContext); + initialize(aContext); + } + + public CrashDialogWidget(Context aContext, AttributeSet aAttrs) { + super(aContext, aAttrs); + initialize(aContext); + } + + public CrashDialogWidget(Context aContext, AttributeSet aAttrs, int aDefStyle) { + super(aContext, aAttrs, aDefStyle); + initialize(aContext); + } + + private void initialize(Context aContext) { + inflate(aContext, R.layout.crash_dialog, this); + + mLearnMoreButton = findViewById(R.id.learnMoreButton); + mDontSendButton = findViewById(R.id.dontSendButton); + mSendDataButton = findViewById(R.id.sendDataButton); + + mLearnMoreButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (mAudio != null) { + mAudio.playSound(AudioEngine.Sound.CLICK); + } + + GeckoSession session = SessionStore.get().getCurrentSession(); + if (session == null) { + int sessionId = SessionStore.get().createSession(); + SessionStore.get().setCurrentSession(sessionId); + } + + SessionStore.get().loadUri(getContext().getString(R.string.crash_dialog_learn_more_url)); + + hide(); + } + }); + mDontSendButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (mAudio != null) { + mAudio.playSound(AudioEngine.Sound.CLICK); + } + + hide(); + } + }); + mSendDataButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + if (mAudio != null) { + mAudio.playSound(AudioEngine.Sound.CLICK); + } + + if(mCrashDialogDelegate != null) { + mCrashDialogDelegate.onSendData(); + } + + SettingsStore.getInstance(getContext()).setCrashReportingEnabled(mSendDataCheckBox.isChecked()); + + hide(); + } + }); + + mSendDataCheckBox = findViewById(R.id.crashSendDataCheckbox); + mSendDataCheckBox.setChecked(SettingsStore.getInstance(getContext()).isCrashReportingEnabled()); + mSendDataCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if (mAudio != null) { + mAudio.playSound(AudioEngine.Sound.CLICK); + } + } + }); + + mAudio = AudioEngine.fromContext(aContext); + } + + @Override + protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { + aPlacement.visible = false; + aPlacement.width = WidgetPlacement.dpDimension(getContext(), R.dimen.crash_dialog_width); + aPlacement.height = WidgetPlacement.dpDimension(getContext(), R.dimen.crash_dialog_width); + aPlacement.parentAnchorX = 0.5f; + aPlacement.parentAnchorY = 0.5f; + aPlacement.anchorX = 0.5f; + aPlacement.anchorY = 0.5f; + aPlacement.translationY = WidgetPlacement.unitFromMeters(getContext(), R.dimen.crash_dialog_world_y); + aPlacement.translationZ = WidgetPlacement.unitFromMeters(getContext(), R.dimen.crash_dialog_world_z); + } + + @Override + protected void onBackButton() { + hide(); + if (mDelegate != null) + mDelegate.onWidgetClosed(getHandle()); + } + + public void setCrashDialogDelegate(CrashDialogDelegate aDelegate) { + mCrashDialogDelegate = aDelegate; + } +} diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/SettingsWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/SettingsWidget.java index 87cbccb05..3c4c288c8 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/SettingsWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/SettingsWidget.java @@ -201,10 +201,6 @@ protected void initializeWidgetPlacement(WidgetPlacement aPlacement) { private void onSettingsCrashReportingChange(boolean isEnabled) { SettingsStore.getInstance(getContext()).setCrashReportingEnabled(isEnabled); - - showRestartDialog(); - - hide(); } private void onSettingsTelemetryChange(boolean isEnabled) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4d2bdee14..a6c4e3624 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/checkbox.xml b/app/src/main/res/drawable/checkbox.xml new file mode 100644 index 000000000..bb70f3999 --- /dev/null +++ b/app/src/main/res/drawable/checkbox.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/crash_dialog_background.xml b/app/src/main/res/drawable/crash_dialog_background.xml new file mode 100644 index 000000000..24d17e39d --- /dev/null +++ b/app/src/main/res/drawable/crash_dialog_background.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/drawable/crash_dialog_button_background.xml b/app/src/main/res/drawable/crash_dialog_button_background.xml new file mode 100644 index 000000000..c858500c3 --- /dev/null +++ b/app/src/main/res/drawable/crash_dialog_button_background.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/crash_dialog_button_send_background.xml b/app/src/main/res/drawable/crash_dialog_button_send_background.xml new file mode 100644 index 000000000..a526302b0 --- /dev/null +++ b/app/src/main/res/drawable/crash_dialog_button_send_background.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/crash_dialog_button_text_color.xml b/app/src/main/res/drawable/crash_dialog_button_text_color.xml new file mode 100644 index 000000000..e25a30918 --- /dev/null +++ b/app/src/main/res/drawable/crash_dialog_button_text_color.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_button_checkbox_off.xml b/app/src/main/res/drawable/ic_button_checkbox_off.xml new file mode 100644 index 000000000..ec32a4814 --- /dev/null +++ b/app/src/main/res/drawable/ic_button_checkbox_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_button_checkbox_on.xml b/app/src/main/res/drawable/ic_button_checkbox_on.xml new file mode 100644 index 000000000..addf9c114 --- /dev/null +++ b/app/src/main/res/drawable/ic_button_checkbox_on.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/sad_fox.png b/app/src/main/res/drawable/sad_fox.png new file mode 100644 index 0000000000000000000000000000000000000000..b8024455157d07a0f8c1fd4554a0d34bdbd6d04c GIT binary patch literal 31507 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 + + + + + + + +