summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java18
-rw-r--r--components/web_contents_delegate_android/android/java/src/org/chromium/components/web_contents_delegate_android/ColorChooserAndroid.java6
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java3
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java17
-rw-r--r--ui/android/java/src/org/chromium/ui/base/ActivityWindowAndroid.java15
-rw-r--r--ui/android/java/src/org/chromium/ui/base/WindowAndroid.java19
6 files changed, 45 insertions, 33 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 8ecc734..2352b57 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -925,28 +925,28 @@ public class AwContents implements SmartClipProvider,
}
}
private static WindowAndroidWrapper sCachedWindowAndroid;
- private static WeakHashMap<Activity, WindowAndroidWrapper> sActivityWindowMap;
+ private static WeakHashMap<Context, WindowAndroidWrapper> sActivityContextWindowMap;
// getWindowAndroid is only called on UI thread, so there are no threading issues with lazy
// initialization.
@SuppressFBWarnings("LI_LAZY_INIT_STATIC")
private static WindowAndroidWrapper getWindowAndroid(Context context) {
// TODO(boliu): WebView does not currently initialize ApplicationStatus, crbug.com/470582.
- Activity activity = ContentViewCore.activityFromContext(context);
- if (activity == null) {
+ boolean contextWrapsActivity = activityFromContext(context) != null;
+ if (!contextWrapsActivity) {
if (sCachedWindowAndroid == null) {
sCachedWindowAndroid = new WindowAndroidWrapper(new WindowAndroid(context));
}
return sCachedWindowAndroid;
}
- if (sActivityWindowMap == null) sActivityWindowMap = new WeakHashMap<>();
- WindowAndroidWrapper activityWindowAndroid = sActivityWindowMap.get(activity);
+ if (sActivityContextWindowMap == null) sActivityContextWindowMap = new WeakHashMap<>();
+ WindowAndroidWrapper activityWindowAndroid = sActivityContextWindowMap.get(context);
if (activityWindowAndroid == null) {
final boolean listenToActivityState = false;
activityWindowAndroid = new WindowAndroidWrapper(
- new ActivityWindowAndroid(activity, listenToActivityState));
- sActivityWindowMap.put(activity, activityWindowAndroid);
+ new ActivityWindowAndroid(context, listenToActivityState));
+ sActivityContextWindowMap.put(context, activityWindowAndroid);
}
return activityWindowAndroid;
}
@@ -1208,7 +1208,7 @@ public class AwContents implements SmartClipProvider,
}
public static Activity activityFromContext(Context context) {
- return ContentViewCore.activityFromContext(context);
+ return WindowAndroid.activityFromContext(context);
}
/**
* Disables contents of JS-to-Java bridge objects to be inspectable using
@@ -2256,7 +2256,7 @@ public class AwContents implements SmartClipProvider,
intent.putExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, true);
}
- if (ContentViewCore.activityFromContext(mContext) == null) {
+ if (WindowAndroid.activityFromContext(mContext) == null) {
mContext.startActivity(intent);
return;
}
diff --git a/components/web_contents_delegate_android/android/java/src/org/chromium/components/web_contents_delegate_android/ColorChooserAndroid.java b/components/web_contents_delegate_android/android/java/src/org/chromium/components/web_contents_delegate_android/ColorChooserAndroid.java
index 207fee2..25f5f62 100644
--- a/components/web_contents_delegate_android/android/java/src/org/chromium/components/web_contents_delegate_android/ColorChooserAndroid.java
+++ b/components/web_contents_delegate_android/android/java/src/org/chromium/components/web_contents_delegate_android/ColorChooserAndroid.java
@@ -12,6 +12,7 @@ import org.chromium.content.browser.ContentViewCore;
import org.chromium.ui.ColorPickerDialog;
import org.chromium.ui.ColorSuggestion;
import org.chromium.ui.OnColorChangedListener;
+import org.chromium.ui.base.WindowAndroid;
/**
* ColorChooserAndroid communicates with the java ColorPickerDialog and the
@@ -51,8 +52,11 @@ public class ColorChooserAndroid {
ContentViewCore contentViewCore,
int initialColor,
ColorSuggestion[] suggestions) {
+ if (contentViewCore.getWindowAndroid() == null) return null;
+ Context windowContext = contentViewCore.getWindowAndroid().getContext().get();
+ if (WindowAndroid.activityFromContext(windowContext) == null) return null;
ColorChooserAndroid chooser = new ColorChooserAndroid(nativeColorChooserAndroid,
- contentViewCore.getContext(), initialColor, suggestions);
+ windowContext, initialColor, suggestions);
chooser.openColorChooser();
return chooser;
}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java b/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java
index 76db5cb..52e00d0 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentVideoView.java
@@ -26,6 +26,7 @@ import org.chromium.base.Log;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
+import org.chromium.ui.base.WindowAndroid;
/**
* This class implements accelerated fullscreen video playback using surface view.
@@ -227,7 +228,7 @@ public class ContentVideoView extends FrameLayout
mCurrentState = STATE_ERROR;
- if (ContentViewCore.activityFromContext(getContext()) == null) {
+ if (WindowAndroid.activityFromContext(getContext()) == null) {
Log.w(TAG, "Unable to show alert dialog because it requires an activity context");
return;
}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index b7bbcf4..7147b93 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -12,7 +12,6 @@ import android.app.assist.AssistStructure.ViewNode;
import android.content.ClipboardManager;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.ContextWrapper;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
@@ -433,22 +432,6 @@ public class ContentViewCore implements AccessibilityStateChangeListener, Screen
public void onSmartClipDataExtracted(String text, String html, Rect clipRect);
}
- /**
- * Cast from Context to Activity taking ContextWrapper into account.
- */
- public static Activity activityFromContext(Context context) {
- // Only retrieve the base context if the supplied context is a ContextWrapper but not
- // an Activity, given that Activity is already a subclass of ContextWrapper.
- if (context instanceof Activity) {
- return ((Activity) context);
- } else if (context instanceof ContextWrapper) {
- context = ((ContextWrapper) context).getBaseContext();
- return activityFromContext(context);
- } else {
- return null;
- }
- }
-
private final Context mContext;
private ViewGroup mContainerView;
private InternalAccessDelegate mContainerViewInternals;
diff --git a/ui/android/java/src/org/chromium/ui/base/ActivityWindowAndroid.java b/ui/android/java/src/org/chromium/ui/base/ActivityWindowAndroid.java
index 615b0ab..3993815 100644
--- a/ui/android/java/src/org/chromium/ui/base/ActivityWindowAndroid.java
+++ b/ui/android/java/src/org/chromium/ui/base/ActivityWindowAndroid.java
@@ -7,6 +7,7 @@ package org.chromium.ui.base;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
+import android.content.Context;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.content.SharedPreferences;
@@ -52,8 +53,8 @@ public class ActivityWindowAndroid
* indicate their activity state listening preference.
* @param activity The activity associated with the WindowAndroid.
*/
- public ActivityWindowAndroid(Activity activity) {
- this(activity, true);
+ public ActivityWindowAndroid(Context context) {
+ this(context, true);
}
/**
@@ -61,8 +62,12 @@ public class ActivityWindowAndroid
* @param activity The activity associated with the WindowAndroid.
* @param listenToActivityState Whether to listen to activity state changes.
*/
- public ActivityWindowAndroid(Activity activity, boolean listenToActivityState) {
- super(activity);
+ public ActivityWindowAndroid(Context context, boolean listenToActivityState) {
+ super(context);
+ Activity activity = activityFromContext(context);
+ if (activity == null) {
+ throw new IllegalArgumentException("Context is not and does not wrap an Activity");
+ }
mHandler = new Handler();
mOutstandingPermissionRequests = new SparseArray<PermissionCallback>();
if (listenToActivityState) {
@@ -207,7 +212,7 @@ public class ActivityWindowAndroid
@Override
public WeakReference<Activity> getActivity() {
- return new WeakReference<Activity>((Activity) getContext().get());
+ return new WeakReference<Activity>(activityFromContext(getContext().get()));
}
@Override
diff --git a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
index 658d0be..25951fb 100644
--- a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
+++ b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
@@ -12,6 +12,7 @@ import android.app.Activity;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.ContextWrapper;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
@@ -125,6 +126,24 @@ public class WindowAndroid {
};
/**
+ * Extract the activity if the given Context either is or wraps one.
+ * Only retrieve the base context if the supplied context is a {@link ContextWrapper} but not
+ * an Activity, given that Activity is already a subclass of ContextWrapper.
+ * @param context The context to check.
+ * @return The {@link Activity} that is extracted through the given Context.
+ */
+ public static Activity activityFromContext(Context context) {
+ if (context instanceof Activity) {
+ return ((Activity) context);
+ } else if (context instanceof ContextWrapper) {
+ context = ((ContextWrapper) context).getBaseContext();
+ return activityFromContext(context);
+ } else {
+ return null;
+ }
+ }
+
+ /**
* @return true if onVSync handler is executing.
*
* @see org.chromium.ui.VSyncMonitor#isInsideVSync()