diff options
| author | 2011-01-28 14:17:45 -0800 | |
|---|---|---|
| committer | 2011-01-28 14:17:45 -0800 | |
| commit | b0c939adfa339c5cbb7f458072119269368b3ba5 (patch) | |
| tree | 1e7baa556e20315527009948555c9f43f6193b2a | |
| parent | 2a8f8d57d23a171eaa367faa143f45fdd2f9cc1c (diff) | |
| parent | 01d5edc49ae8995aabffe1a30bfd966faaf70bd6 (diff) | |
Merge "Prevent crash when detaching a SurfaceView. Bug #3400461" into honeycomb
| -rw-r--r-- | core/java/android/view/SurfaceView.java | 22 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 5 |
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; } |