Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..92d10edd286fae2f05900856cd38a73165141b58 |
| --- /dev/null |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java |
| @@ -0,0 +1,137 @@ |
| +// 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.externalauth; |
| + |
| +import android.app.Activity; |
| +import android.app.Dialog; |
| +import android.content.Context; |
| +import android.content.DialogInterface; |
| + |
| +import com.google.android.gms.common.GooglePlayServicesUtil; |
| + |
| +import java.util.concurrent.atomic.AtomicBoolean; |
| + |
| +/** |
| + * Handles situations where Google Play Services encounters a user-recoverable |
| + * error. This is typically because Google Play Services requires an upgrade. |
| + * Three "canned" handlers are provided, with suggested use cases as described |
| + * below. |
| + * <br> |
| + * <strong>Silent</strong>: use this handler if the dependency is purely for |
| + * convenience and a (potentially suboptimal) fallback is available. |
| + * <br> |
| + * <strong>SystemNotification</strong>: use this handler if the dependency is |
| + * for a feature that the user isn't actively trying to access interactively. |
| + * To avoid excessively nagging the user, only one notification will ever be |
| + * shown during the lifetime of the process. |
| + * <br> |
| + * <strong>ModalDialog</strong>: use this handler if the dependency is |
| + * for a feature that the user is actively trying to access interactively where |
| + * the feature cannot function (or would be severely impaired) unless the |
| + * dependency is satisfied. The dialog will be presented as many times as the |
| + * user tries to access the feature. |
| + */ |
| +public abstract class UserRecoverableErrorHandler implements Runnable { |
| + /** |
| + * A handler that does nothing. |
| + */ |
| + public static final class Silent extends UserRecoverableErrorHandler { |
| + @Override |
| + public void run() { |
| + // Do nothing. |
| + } |
| + } |
| + |
| + /** |
| + * A handler that displays a System Notification. To avoid repeatedly nagging the user, this |
| + * is done at most one time per process. |
| + * @see GooglePlayServicesUtil#showErrorNotification(int, Context) |
| + */ |
| + public static final class SystemNotification extends UserRecoverableErrorHandler { |
| + /** |
| + * The error code returned from Google Play Services. |
| + */ |
| + private final int mErrorCode; |
| + |
| + /** |
| + * The context in which the error was encountered. |
| + */ |
| + private final Context mContext; |
| + |
| + /** |
| + * Tracks whether the notification has yet been shown. |
| + */ |
| + private static final AtomicBoolean sNotificationShown = new AtomicBoolean(false); |
| + |
| + /** |
| + * Create a new System Notification handler for the specified context and error code. |
| + * @param context the context in which the error was encountered. |
| + * @param errorCode the error code from Google Play Services. |
| + */ |
| + public SystemNotification(Context context, int errorCode) { |
| + mContext = context; |
| + mErrorCode = errorCode; |
| + } |
| + |
| + @Override |
| + public void run() { |
| + if (!sNotificationShown.getAndSet(true)) { |
| + return; |
| + } |
| + GooglePlayServicesUtil.showErrorNotification(mErrorCode, mContext); |
| + } |
| + } |
| + |
| + /** |
| + * A handler that displays a modal dialog. Unlike {@link SystemNotification}, this handler |
| + * will take action every time it is invoked. |
| + * @see GooglePlayServicesUtil#getErrorDialog(int, Activity, int, |
| + * android.content.DialogInterface.OnCancelListener) |
| + */ |
| + public static final class ModalDialog extends UserRecoverableErrorHandler { |
|
dgn
2015/05/20 16:33:07
How about :
ErrorHandler <|---- Silent
|
| + /** |
| + * The error code returned from Google Play Services. |
| + */ |
| + private final int mErrorCode; |
| + |
| + /** |
| + * The activity in which the error was encountered. |
| + */ |
| + private final Activity mActivity; |
| + |
| + /** |
| + * The request code given when calling startActivityForResult. |
| + */ |
| + private final int mRequestCode; |
| + |
| + /** |
| + * The DialogInterface.OnCancelListener to invoke if the dialog is canceled. |
| + */ |
| + private final DialogInterface.OnCancelListener mOnCancelListener; |
| + |
| + /** |
| + * Create a new Modal Dialog handler for the specified activity and error code. |
| + * @param activity the activity in which the dialog is to be displayed. |
| + * @param errorCode the error code from Google Play Services. |
| + * @param requestCode the request code given when calling startActivityForResult. |
| + * @param onCancelListener the DialogInterface.OnCancelListener to invoke if the dialog |
| + * is canceled. |
| + */ |
| + public ModalDialog(Activity activity, int errorCode, int requestCode, |
|
dgn
2015/05/20 16:33:07
Second constructor with -1 as request code and nu
|
| + DialogInterface.OnCancelListener onCancelListener) { |
| + mActivity = activity; |
| + mErrorCode = errorCode; |
| + mRequestCode = requestCode; |
| + mOnCancelListener = onCancelListener; |
| + } |
| + |
| + @Override |
| + public void run() { |
| + Dialog dialog = GooglePlayServicesUtil.getErrorDialog( |
| + mErrorCode, mActivity, mRequestCode, mOnCancelListener); |
| + dialog.show(); |
| + } |
| + } |
| +} |