summaryrefslogtreecommitdiffstats
path: root/ui/android
diff options
context:
space:
mode:
authoryusufo <yusufo@chromium.org>2015-12-18 10:19:36 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-18 18:20:24 +0000
commitfdf17ed2da4f4554400c25993aa688cb9355c004 (patch)
treeba52b8e2ba567330bea1fbaf42c525ed85f9c234 /ui/android
parentf910b1af241f8d79e28035ce167b8d626457e333 (diff)
downloadchromium_src-fdf17ed2da4f4554400c25993aa688cb9355c004.zip
chromium_src-fdf17ed2da4f4554400c25993aa688cb9355c004.tar.gz
chromium_src-fdf17ed2da4f4554400c25993aa688cb9355c004.tar.bz2
Pull the Activity context from WindowAndroid if possible
WebView uses ContentViewCore's context for displaying dialogs and wraps it at construction time. This change makes sure that if there is an activity that can be reached through WindowAndroid, we use that as the context inside ColorChooser. Also make sure if there is no activity, we dont attempt to create a color chooser and try to show it. Update ActivityWindowAndroid to take a Context type so that in Android WebView, the activity context can remain wrapped. BUG=550410, 570429 Review URL: https://codereview.chromium.org/1528733002 Cr-Commit-Position: refs/heads/master@{#366125}
Diffstat (limited to 'ui/android')
-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
2 files changed, 29 insertions, 5 deletions
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()