Commit dc730dc2 authored by tedchoc's avatar tedchoc Committed by Commit bot

Ensure the startup failure dialog is public because it is a fragment.

BUG=b/19901904

Review URL: https://codereview.chromium.org/1032713002

Cr-Commit-Position: refs/heads/master@{#322108}
parent 7eb5bb21
...@@ -5,15 +5,10 @@ ...@@ -5,15 +5,10 @@
package org.chromium.chrome.browser; package org.chromium.chrome.browser;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log; import android.util.Log;
import org.chromium.base.ActivityState; import org.chromium.base.ActivityState;
...@@ -21,14 +16,13 @@ import org.chromium.base.ApplicationStatus; ...@@ -21,14 +16,13 @@ import org.chromium.base.ApplicationStatus;
import org.chromium.base.CalledByNative; import org.chromium.base.CalledByNative;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.library_loader.LoaderErrors; import org.chromium.base.library_loader.LoaderErrors;
import org.chromium.base.library_loader.ProcessInitException; import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.child_accounts.ChildAccountService; import org.chromium.chrome.browser.child_accounts.ChildAccountService;
import org.chromium.chrome.browser.firstrun.FirstRunActivity; import org.chromium.chrome.browser.firstrun.FirstRunActivity;
import org.chromium.chrome.browser.init.InvalidStartupDialog;
import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings; import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations; import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
import org.chromium.chrome.browser.preferences.LocationSettings; import org.chromium.chrome.browser.preferences.LocationSettings;
...@@ -215,51 +209,10 @@ public abstract class ChromiumApplication extends ContentApplication { ...@@ -215,51 +209,10 @@ public abstract class ChromiumApplication extends ContentApplication {
*/ */
public static void reportStartupErrorAndExit(final ProcessInitException e) { public static void reportStartupErrorAndExit(final ProcessInitException e) {
Activity activity = ApplicationStatus.getLastTrackedFocusedActivity(); Activity activity = ApplicationStatus.getLastTrackedFocusedActivity();
if (ApplicationStatus.getStateForActivity(activity) == ActivityState.DESTROYED if (ApplicationStatus.getStateForActivity(activity) == ActivityState.DESTROYED) {
|| !(activity instanceof FragmentActivity)) {
return; return;
} }
int errorCode = e.getErrorCode(); InvalidStartupDialog.show(activity, e.getErrorCode());
int msg;
switch (errorCode) {
case LoaderErrors.LOADER_ERROR_NATIVE_LIBRARY_LOAD_FAILED:
msg = R.string.os_version_missing_features;
break;
case LoaderErrors.LOADER_ERROR_NATIVE_LIBRARY_WRONG_VERSION:
msg = R.string.incompatible_libraries;
break;
default:
msg = R.string.native_startup_failed;
}
final String message = activity.getResources().getString(msg);
DialogFragment dialog = new DialogFragment() {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
dialogBuilder
.setMessage(message)
.setCancelable(true)
.setPositiveButton(getResources().getString(android.R.string.ok),
new DialogInterface.OnClickListener() {
@SuppressFBWarnings("DM_EXIT")
@Override
public void onClick(DialogInterface dialog, int which) {
System.exit(-1);
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@SuppressFBWarnings("DM_EXIT")
@Override
public void onCancel(DialogInterface dialog) {
System.exit(-1);
}
});
return dialogBuilder.create();
}
};
dialog.show(
((FragmentActivity) activity).getSupportFragmentManager(), "InvalidStartupDialog");
} }
/** /**
......
...@@ -16,6 +16,9 @@ import android.view.ViewTreeObserver; ...@@ -16,6 +16,9 @@ import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.ViewTreeObserver.OnPreDrawListener;
import org.chromium.base.TraceEvent; import org.chromium.base.TraceEvent;
import org.chromium.base.library_loader.LoaderErrors;
import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.chrome.browser.ChromiumApplication;
import org.chromium.chrome.browser.WarmupManager; import org.chromium.chrome.browser.WarmupManager;
import org.chromium.chrome.browser.metrics.MemoryUma; import org.chromium.chrome.browser.metrics.MemoryUma;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
...@@ -96,7 +99,9 @@ public abstract class AsyncInitializationActivity extends ActionBarActivity impl ...@@ -96,7 +99,9 @@ public abstract class AsyncInitializationActivity extends ActionBarActivity impl
@Override @Override
public void onStartupFailure() { public void onStartupFailure() {
finish(); ProcessInitException e =
new ProcessInitException(LoaderErrors.LOADER_ERROR_NATIVE_STARTUP_FAILED);
ChromiumApplication.reportStartupErrorAndExit(e);
} }
/** /**
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.init;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.library_loader.LoaderErrors;
import org.chromium.chrome.R;
/**
* Dialog shown when startup fails.
* <br>
* Fragments are required to be public with a public empty constructor, hence the visibility.
*/
public class InvalidStartupDialog extends DialogFragment {
private static final String TAG = "InvalidStartupDialog";
private static final String MESSAGE_KEY = "InvalidStartupErrorKey";
/**
* Shows the invalid startup dialog for a given error code.
*
* @param activity The activity showing the dialog.
* @param errorCode The error code that triggered the failure.
*/
@SuppressFBWarnings("DM_EXIT")
public static void show(Activity activity, int errorCode) {
int msg;
switch (errorCode) {
case LoaderErrors.LOADER_ERROR_NATIVE_LIBRARY_LOAD_FAILED:
msg = R.string.os_version_missing_features;
break;
case LoaderErrors.LOADER_ERROR_NATIVE_LIBRARY_WRONG_VERSION:
msg = R.string.incompatible_libraries;
break;
default:
msg = R.string.native_startup_failed;
}
final String message = activity.getResources().getString(msg);
if (!(activity instanceof FragmentActivity)) {
Log.e(TAG, "Unable to start chrome due to: " + msg);
System.exit(-1);
return;
}
Bundle dialogArgs = new Bundle();
dialogArgs.putString(MESSAGE_KEY, message);
InvalidStartupDialog dialog = new InvalidStartupDialog();
dialog.setArguments(dialogArgs);
dialog.show(((FragmentActivity) activity).getSupportFragmentManager(),
"InvalidStartupDialog");
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments();
String message = arguments.getString(MESSAGE_KEY, "Failed to start");
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
dialogBuilder
.setMessage(message)
.setCancelable(true)
.setPositiveButton(getResources().getString(android.R.string.ok), null);
return dialogBuilder.create();
}
@SuppressFBWarnings("DM_EXIT")
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
System.exit(-1);
}
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment