summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Romain Guy <romainguy@google.com> 2011-01-28 14:17:45 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2011-01-28 14:17:45 -0800
commitb0c939adfa339c5cbb7f458072119269368b3ba5 (patch)
tree1e7baa556e20315527009948555c9f43f6193b2a
parent2a8f8d57d23a171eaa367faa143f45fdd2f9cc1c (diff)
parent01d5edc49ae8995aabffe1a30bfd966faaf70bd6 (diff)
Merge "Prevent crash when detaching a SurfaceView. Bug #3400461" into honeycomb
-rw-r--r--core/java/android/view/SurfaceView.java22
-rw-r--r--core/java/android/view/View.java5
2 files changed, 19 insertions, 8 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 966bd8d47789..87b3d79d2e01 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -174,6 +174,7 @@ public class SurfaceView extends View {
return true;
}
};
+ private boolean mGlobalListenersAdded;
public SurfaceView(Context context) {
super(context);
@@ -212,9 +213,13 @@ public class SurfaceView extends View {
mLayout.token = getWindowToken();
mLayout.setTitle("SurfaceView");
mViewVisibility = getVisibility() == VISIBLE;
- ViewTreeObserver observer = getViewTreeObserver();
- observer.addOnScrollChangedListener(mScrollChangedListener);
- observer.addOnPreDrawListener(mDrawListener);
+
+ if (!mGlobalListenersAdded) {
+ ViewTreeObserver observer = getViewTreeObserver();
+ observer.addOnScrollChangedListener(mScrollChangedListener);
+ observer.addOnPreDrawListener(mDrawListener);
+ mGlobalListenersAdded = true;
+ }
}
@Override
@@ -275,9 +280,13 @@ public class SurfaceView extends View {
@Override
protected void onDetachedFromWindow() {
- ViewTreeObserver observer = getViewTreeObserver();
- observer.removeOnScrollChangedListener(mScrollChangedListener);
- observer.removeOnPreDrawListener(mDrawListener);
+ if (mGlobalListenersAdded) {
+ ViewTreeObserver observer = getViewTreeObserver();
+ observer.removeOnScrollChangedListener(mScrollChangedListener);
+ observer.removeOnPreDrawListener(mDrawListener);
+ mGlobalListenersAdded = false;
+ }
+
mRequestedVisible = false;
updateWindow(false, false);
mHaveFrame = false;
@@ -285,6 +294,7 @@ public class SurfaceView extends View {
try {
mSession.remove(mWindow);
} catch (RemoteException ex) {
+ // Not much we can do here...
}
mWindow = null;
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index fc0039ea731a..142061b721d6 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -7897,7 +7897,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
}
void dispatchDetachedFromWindow() {
- //System.out.println("Detached! " + this);
AttachInfo info = mAttachInfo;
if (info != null) {
int vis = info.mWindowVisibility;
@@ -7907,10 +7906,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility
}
onDetachedFromWindow();
- if ((mPrivateFlags&SCROLL_CONTAINER_ADDED) != 0) {
+
+ if ((mPrivateFlags & SCROLL_CONTAINER_ADDED) != 0) {
mAttachInfo.mScrollContainers.remove(this);
mPrivateFlags &= ~SCROLL_CONTAINER_ADDED;
}
+
mAttachInfo = null;
}