summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2013-12-20 09:06:56 -0800
committerCraig Mautner <cmautner@google.com>2014-01-10 10:54:55 -0800
commit4504de5d5a8e1c7dfb306b16282f348856c24764 (patch)
tree37a2024993d2d4baf9db3e19878f5c32fbd92236 /core
parent9c9975ac3dc63423751c4783162d4ade11d156c1 (diff)
downloadframeworks_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.java163
-rw-r--r--core/java/android/app/IActivityContainer.aidl3
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();
}