diff options
author | Craig Mautner <cmautner@google.com> | 2013-12-20 09:06:56 -0800 |
---|---|---|
committer | Craig Mautner <cmautner@google.com> | 2014-01-10 10:54:55 -0800 |
commit | 4504de5d5a8e1c7dfb306b16282f348856c24764 (patch) | |
tree | 37a2024993d2d4baf9db3e19878f5c32fbd92236 /core | |
parent | 9c9975ac3dc63423751c4783162d4ade11d156c1 (diff) | |
download | frameworks_base-4504de5d5a8e1c7dfb306b16282f348856c24764.zip frameworks_base-4504de5d5a8e1c7dfb306b16282f348856c24764.tar.gz frameworks_base-4504de5d5a8e1c7dfb306b16282f348856c24764.tar.bz2 |
Implement ActivityView.
With an existing ActivityContainer a caller can now create an
ActivityView which consists of a new VirtualDisplay immediately
attached to the ActivityContainer.
Change-Id: Id70333dcbef55d524a87df8f8c92d72ca5579364
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/app/ActivityView.java | 163 | ||||
-rw-r--r-- | core/java/android/app/IActivityContainer.aidl | 3 |
2 files changed, 166 insertions, 0 deletions
diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java new file mode 100644 index 0000000..fef4597 --- /dev/null +++ b/core/java/android/app/ActivityView.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.graphics.SurfaceTexture; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.Surface; +import android.view.TextureView; +import android.view.TextureView.SurfaceTextureListener; +import android.view.ViewGroup; +import android.view.WindowManager; + +public class ActivityView extends ViewGroup { + private final TextureView mTextureView; + private IActivityContainer mActivityContainer; + private Activity mActivity; + private boolean mAttached; + private int mWidth; + private int mHeight; + + public ActivityView(Context context) { + this(context, null); + } + + public ActivityView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ActivityView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + mActivity = (Activity)context; + break; + } + context = ((ContextWrapper)context).getBaseContext(); + } + if (mActivity == null) { + throw new IllegalStateException("The ActivityView's Context is not an Activity."); + } + + mTextureView = new TextureView(context); + mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener()); + addView(mTextureView); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mTextureView.layout(l, t, r, b); + } + + @Override + protected void onAttachedToWindow() { + try { + final IBinder token = mActivity.getActivityToken(); + mActivityContainer = + ActivityManagerNative.getDefault().createActivityContainer(token, null); + } catch (RemoteException e) { + throw new IllegalStateException("ActivityView: Unable to create ActivityContainer. " + + e); + } + + final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); + if (surfaceTexture != null) { + createActivityView(surfaceTexture); + } + } + + @Override + protected void onDetachedFromWindow() { + if (mActivityContainer != null) { + try { + mActivityContainer.deleteActivityView(); + } catch (RemoteException e) { + } + mActivityContainer = null; + } + mAttached = false; + } + + public void startActivity(Intent intent) { + if (mActivityContainer != null && mAttached) { + try { + mActivityContainer.startActivity(intent); + } catch (RemoteException e) { + throw new IllegalStateException("ActivityView: Unable to startActivity. " + e); + } + } + } + + /** Call when both mActivityContainer and mTextureView's SurfaceTexture are not null */ + private void createActivityView(SurfaceTexture surfaceTexture) { + WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics metrics = new DisplayMetrics(); + wm.getDefaultDisplay().getMetrics(metrics); + + try { + mActivityContainer.createActivityView(new Surface(surfaceTexture), mWidth, mHeight, + metrics.densityDpi); + } catch (RemoteException e) { + mActivityContainer = null; + throw new IllegalStateException( + "ActivityView: Unable to create ActivityContainer. " + e); + } + mAttached = true; + } + + private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, + int height) { + mWidth = width; + mHeight = height; + if (mActivityContainer != null) { + createActivityView(surfaceTexture); + } + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, + int height) { + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { + try { + mActivityContainer.deleteActivityView(); + // TODO: Add binderDied to handle this nullification. + mActivityContainer = null; + } catch (RemoteException r) { + } + mAttached = false; + return false; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { + + } + + } +} diff --git a/core/java/android/app/IActivityContainer.aidl b/core/java/android/app/IActivityContainer.aidl index 2d8d18f..b03a459 100644 --- a/core/java/android/app/IActivityContainer.aidl +++ b/core/java/android/app/IActivityContainer.aidl @@ -19,6 +19,7 @@ package android.app; import android.app.IActivityContainerCallback; import android.content.Intent; import android.os.IBinder; +import android.view.Surface; /** @hide */ interface IActivityContainer { @@ -26,4 +27,6 @@ interface IActivityContainer { int getDisplayId(); void detachFromDisplay(); int startActivity(in Intent intent); + void createActivityView(in Surface surface, int width, int height, int density); + void deleteActivityView(); } |