diff options
| author | Filip Gruszczynski <gruszczy@google.com> | 2015-06-05 02:18:35 +0000 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2015-06-05 02:18:35 +0000 |
| commit | 43c4cd1c82eab55decd88816a505ed102b79fb81 (patch) | |
| tree | 664b27077b3d1d0e2a7319515f91a8ca358cc414 /core/java | |
| parent | 44dc1667eb186eed6374b3119c1c2c6ac14b7e43 (diff) | |
| parent | 93634166c8c78bdeccf045c62a0f601dceed74e3 (diff) | |
am 93634166: am d88e4d50: Merge "ActivityView: set surface on a background thread." into cw-d-mr1-dev
* commit '93634166c8c78bdeccf045c62a0f601dceed74e3':
ActivityView: set surface on a background thread.
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/app/ActivityView.java | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index eafcdb24c3d1..9c0d93123d77 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -24,7 +24,10 @@ import android.content.IIntentSender; import android.content.Intent; import android.content.IntentSender; import android.graphics.SurfaceTexture; +import android.os.Handler; +import android.os.HandlerThread; import android.os.IBinder; +import android.os.Message; import android.os.OperationCanceledException; import android.os.RemoteException; import android.util.AttributeSet; @@ -48,7 +51,9 @@ public class ActivityView extends ViewGroup { private static final String TAG = "ActivityView"; private static final boolean DEBUG = false; - DisplayMetrics mMetrics; + private static final int MSG_SET_SURFACE = 1; + + DisplayMetrics mMetrics = new DisplayMetrics(); private final TextureView mTextureView; private ActivityContainerWrapper mActivityContainer; private Activity mActivity; @@ -58,6 +63,9 @@ public class ActivityView extends ViewGroup { private int mLastVisibility; private ActivityViewCallback mActivityViewCallback; + private HandlerThread mThread = new HandlerThread("ActivityViewThread"); + private Handler mHandler; + public ActivityView(Context context) { this(context, null); } @@ -89,12 +97,27 @@ public class ActivityView extends ViewGroup { + e); } + mThread.start(); + mHandler = new Handler(mThread.getLooper()) { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (msg.what == MSG_SET_SURFACE) { + try { + mActivityContainer.setSurface((Surface) msg.obj, msg.arg1, msg.arg2, + mMetrics.densityDpi); + } catch (RemoteException e) { + throw new RuntimeException( + "ActivityView: Unable to set surface of ActivityContainer. " + e); + } + } + } + }; mTextureView = new TextureView(context); mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener()); addView(mTextureView); WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE); - mMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(mMetrics); mLastVisibility = getVisibility(); @@ -111,18 +134,12 @@ public class ActivityView extends ViewGroup { protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); - if (mSurface != null) { - try { - if (visibility == View.GONE) { - mActivityContainer.setSurface(null, mWidth, mHeight, mMetrics.densityDpi); - } else if (mLastVisibility == View.GONE) { - // Don't change surface when going between View.VISIBLE and View.INVISIBLE. - mActivityContainer.setSurface(mSurface, mWidth, mHeight, mMetrics.densityDpi); - } - } catch (RemoteException e) { - throw new RuntimeException( - "ActivityView: Unable to set surface of ActivityContainer. " + e); - } + if (mSurface != null && (visibility == View.GONE || mLastVisibility == View.GONE)) { + Message msg = Message.obtain(mHandler, MSG_SET_SURFACE); + msg.obj = (visibility == View.GONE) ? null : mSurface; + msg.arg1 = mWidth; + msg.arg2 = mHeight; + mHandler.sendMessage(msg); } mLastVisibility = visibility; } |
