blob: c075ed675948eb89d464ebd076f08e4291f7b77c [file] [log] [blame]
Craig Mautner4504de52013-12-20 09:06:56 -08001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.app;
18
Craig Mautnerb9168362015-02-26 20:40:19 -080019import static android.app.ActivityManager.START_CANCELED;
20
Craig Mautner4504de52013-12-20 09:06:56 -080021import android.content.Context;
22import android.content.ContextWrapper;
Craig Mautner4e5b67e2014-02-07 15:30:03 -080023import android.content.IIntentSender;
Craig Mautner4504de52013-12-20 09:06:56 -080024import android.content.Intent;
Craig Mautnerdf88d732014-01-27 09:21:32 -080025import android.content.IntentSender;
Craig Mautner4504de52013-12-20 09:06:56 -080026import android.graphics.SurfaceTexture;
27import android.os.IBinder;
Filip Gruszczynski2df62bf2015-06-01 12:57:43 -070028import android.os.Message;
Craig Mautnerb9168362015-02-26 20:40:19 -080029import android.os.OperationCanceledException;
Craig Mautner4504de52013-12-20 09:06:56 -080030import android.os.RemoteException;
31import android.util.AttributeSet;
32import android.util.DisplayMetrics;
Craig Mautner34b73df2014-01-12 21:11:08 -080033import android.util.Log;
Jeff Brown38f96e52014-02-11 14:32:56 -080034import android.view.InputDevice;
35import android.view.InputEvent;
36import android.view.MotionEvent;
Craig Mautner4504de52013-12-20 09:06:56 -080037import android.view.Surface;
38import android.view.TextureView;
39import android.view.TextureView.SurfaceTextureListener;
Craig Mautnerd13a5582014-05-05 12:07:40 -070040import android.view.View;
Craig Mautner4504de52013-12-20 09:06:56 -080041import android.view.ViewGroup;
42import android.view.WindowManager;
Craig Mautnerf4c909b2014-04-17 18:39:38 -070043import dalvik.system.CloseGuard;
44
45import java.lang.ref.WeakReference;
Daniel Koulomzin71c012e2015-09-24 14:38:17 -040046import java.util.ArrayDeque;
47import java.util.concurrent.Executor;
48import java.util.concurrent.BlockingQueue;
49import java.util.concurrent.LinkedBlockingQueue;
50import java.util.concurrent.ThreadFactory;
51import java.util.concurrent.ThreadPoolExecutor;
52import java.util.concurrent.TimeUnit;
53import java.util.concurrent.atomic.AtomicInteger;
54
55import com.android.internal.annotations.GuardedBy;
56
Craig Mautner4504de52013-12-20 09:06:56 -080057
Craig Mautner95da1082014-02-24 17:54:35 -080058/** @hide */
Craig Mautner4504de52013-12-20 09:06:56 -080059public class ActivityView extends ViewGroup {
Craig Mautnerf4c909b2014-04-17 18:39:38 -070060 private static final String TAG = "ActivityView";
61 private static final boolean DEBUG = false;
Craig Mautner34b73df2014-01-12 21:11:08 -080062
Filip Gruszczynski2df62bf2015-06-01 12:57:43 -070063 private static final int MSG_SET_SURFACE = 1;
64
Daniel Koulomzin71c012e2015-09-24 14:38:17 -040065 private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
66 private static final int MINIMUM_POOL_SIZE = 1;
67 private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
68 private static final int KEEP_ALIVE = 1;
69
70 private static final ThreadFactory sThreadFactory = new ThreadFactory() {
71 private final AtomicInteger mCount = new AtomicInteger(1);
72
73 public Thread newThread(Runnable r) {
74 return new Thread(r, "ActivityView #" + mCount.getAndIncrement());
75 }
76 };
77
78 private static final BlockingQueue<Runnable> sPoolWorkQueue =
79 new LinkedBlockingQueue<Runnable>(128);
80
81 /**
82 * An {@link Executor} that can be used to execute tasks in parallel.
83 */
84 private static final Executor sExecutor = new ThreadPoolExecutor(MINIMUM_POOL_SIZE,
85 MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
86
87
88 private static class SerialExecutor implements Executor {
89 private final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
90 private Runnable mActive;
91
92 public synchronized void execute(final Runnable r) {
93 mTasks.offer(new Runnable() {
94 public void run() {
95 try {
96 r.run();
97 } finally {
98 scheduleNext();
99 }
100 }
101 });
102 if (mActive == null) {
103 scheduleNext();
104 }
105 }
106
107 protected synchronized void scheduleNext() {
108 if ((mActive = mTasks.poll()) != null) {
109 sExecutor.execute(mActive);
110 }
111 }
112 }
113
114 private final SerialExecutor mExecutor = new SerialExecutor();
115
116 private final int mDensityDpi;
Craig Mautner4504de52013-12-20 09:06:56 -0800117 private final TextureView mTextureView;
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400118
119 @GuardedBy("mActivityContainerLock")
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700120 private ActivityContainerWrapper mActivityContainer;
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400121 private Object mActivityContainerLock = new Object();
122
Craig Mautner4504de52013-12-20 09:06:56 -0800123 private Activity mActivity;
Craig Mautner4504de52013-12-20 09:06:56 -0800124 private int mWidth;
125 private int mHeight;
Craig Mautner34b73df2014-01-12 21:11:08 -0800126 private Surface mSurface;
Craig Mautnerd13a5582014-05-05 12:07:40 -0700127 private int mLastVisibility;
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700128 private ActivityViewCallback mActivityViewCallback;
Craig Mautner4504de52013-12-20 09:06:56 -0800129
Filip Gruszczynski2df62bf2015-06-01 12:57:43 -0700130
Craig Mautner4504de52013-12-20 09:06:56 -0800131 public ActivityView(Context context) {
132 this(context, null);
133 }
134
135 public ActivityView(Context context, AttributeSet attrs) {
136 this(context, attrs, 0);
137 }
138
139 public ActivityView(Context context, AttributeSet attrs, int defStyle) {
140 super(context, attrs, defStyle);
141
142 while (context instanceof ContextWrapper) {
143 if (context instanceof Activity) {
144 mActivity = (Activity)context;
145 break;
146 }
147 context = ((ContextWrapper)context).getBaseContext();
148 }
149 if (mActivity == null) {
150 throw new IllegalStateException("The ActivityView's Context is not an Activity.");
151 }
152
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700153 try {
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700154 mActivityContainer = new ActivityContainerWrapper(
Todd Kennedyca4d8422015-01-15 15:19:22 -0800155 ActivityManagerNative.getDefault().createVirtualActivityContainer(
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700156 mActivity.getActivityToken(), new ActivityContainerCallback(this)));
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700157 } catch (RemoteException e) {
Craig Mautner6985bad2014-04-21 15:22:06 -0700158 throw new RuntimeException("ActivityView: Unable to create ActivityContainer. "
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700159 + e);
160 }
161
Craig Mautner4504de52013-12-20 09:06:56 -0800162 mTextureView = new TextureView(context);
163 mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener());
164 addView(mTextureView);
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700165
166 WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400167 DisplayMetrics metrics = new DisplayMetrics();
168 wm.getDefaultDisplay().getMetrics(metrics);
169 mDensityDpi = metrics.densityDpi;
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700170
Craig Mautnerd13a5582014-05-05 12:07:40 -0700171 mLastVisibility = getVisibility();
172
Craig Mautner12ff7392014-02-21 21:08:00 -0800173 if (DEBUG) Log.v(TAG, "ctor()");
Craig Mautner4504de52013-12-20 09:06:56 -0800174 }
175
176 @Override
177 protected void onLayout(boolean changed, int l, int t, int r, int b) {
Griff Hazenaf745f62014-02-10 08:58:32 -0800178 mTextureView.layout(0, 0, r - l, b - t);
Craig Mautner4504de52013-12-20 09:06:56 -0800179 }
180
Craig Mautnerd13a5582014-05-05 12:07:40 -0700181 @Override
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400182 protected void onVisibilityChanged(View changedView, final int visibility) {
Craig Mautnerd13a5582014-05-05 12:07:40 -0700183 super.onVisibilityChanged(changedView, visibility);
184
Filip Gruszczynski2df62bf2015-06-01 12:57:43 -0700185 if (mSurface != null && (visibility == View.GONE || mLastVisibility == View.GONE)) {
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400186 if (DEBUG) Log.v(TAG, "visibility changed; enqueing runnable");
187 final Surface surface = (visibility == View.GONE) ? null : mSurface;
188 setSurfaceAsync(surface, mWidth, mHeight, mDensityDpi, false);
Craig Mautnerd13a5582014-05-05 12:07:40 -0700189 }
190 mLastVisibility = visibility;
191 }
192
Jeff Brown38f96e52014-02-11 14:32:56 -0800193 private boolean injectInputEvent(InputEvent event) {
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700194 return mActivityContainer != null && mActivityContainer.injectEvent(event);
Jeff Brown38f96e52014-02-11 14:32:56 -0800195 }
196
197 @Override
198 public boolean onTouchEvent(MotionEvent event) {
199 return injectInputEvent(event) || super.onTouchEvent(event);
200 }
201
202 @Override
203 public boolean onGenericMotionEvent(MotionEvent event) {
204 if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) {
205 if (injectInputEvent(event)) {
206 return true;
207 }
208 }
209 return super.onGenericMotionEvent(event);
210 }
211
Craig Mautner6985bad2014-04-21 15:22:06 -0700212 @Override
213 public void onAttachedToWindow() {
214 if (DEBUG) Log.v(TAG, "onAttachedToWindow(): mActivityContainer=" + mActivityContainer +
215 " mSurface=" + mSurface);
216 }
217
218 @Override
219 public void onDetachedFromWindow() {
220 if (DEBUG) Log.v(TAG, "onDetachedFromWindow(): mActivityContainer=" + mActivityContainer +
221 " mSurface=" + mSurface);
222 }
223
Craig Mautnerdf88d732014-01-27 09:21:32 -0800224 public boolean isAttachedToDisplay() {
225 return mSurface != null;
Craig Mautner4504de52013-12-20 09:06:56 -0800226 }
227
228 public void startActivity(Intent intent) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700229 if (mActivityContainer == null) {
230 throw new IllegalStateException("Attempt to call startActivity after release");
231 }
Craig Mautnerb9168362015-02-26 20:40:19 -0800232 if (mSurface == null) {
233 throw new IllegalStateException("Surface not yet created.");
234 }
Craig Mautner12ff7392014-02-21 21:08:00 -0800235 if (DEBUG) Log.v(TAG, "startActivity(): intent=" + intent + " " +
236 (isAttachedToDisplay() ? "" : "not") + " attached");
Craig Mautnerb9168362015-02-26 20:40:19 -0800237 if (mActivityContainer.startActivity(intent) == START_CANCELED) {
238 throw new OperationCanceledException();
Craig Mautner4e5b67e2014-02-07 15:30:03 -0800239 }
240 }
241
Craig Mautnerdf88d732014-01-27 09:21:32 -0800242 public void startActivity(IntentSender intentSender) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700243 if (mActivityContainer == null) {
244 throw new IllegalStateException("Attempt to call startActivity after release");
245 }
Craig Mautnerb9168362015-02-26 20:40:19 -0800246 if (mSurface == null) {
247 throw new IllegalStateException("Surface not yet created.");
248 }
Craig Mautner12ff7392014-02-21 21:08:00 -0800249 if (DEBUG) Log.v(TAG, "startActivityIntentSender(): intentSender=" + intentSender + " " +
250 (isAttachedToDisplay() ? "" : "not") + " attached");
Craig Mautner4e5b67e2014-02-07 15:30:03 -0800251 final IIntentSender iIntentSender = intentSender.getTarget();
Craig Mautnerb9168362015-02-26 20:40:19 -0800252 if (mActivityContainer.startActivityIntentSender(iIntentSender) == START_CANCELED) {
253 throw new OperationCanceledException();
Craig Mautnerdf88d732014-01-27 09:21:32 -0800254 }
255 }
256
257 public void startActivity(PendingIntent pendingIntent) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700258 if (mActivityContainer == null) {
259 throw new IllegalStateException("Attempt to call startActivity after release");
260 }
Craig Mautnerb9168362015-02-26 20:40:19 -0800261 if (mSurface == null) {
262 throw new IllegalStateException("Surface not yet created.");
263 }
Craig Mautner12ff7392014-02-21 21:08:00 -0800264 if (DEBUG) Log.v(TAG, "startActivityPendingIntent(): PendingIntent=" + pendingIntent + " "
265 + (isAttachedToDisplay() ? "" : "not") + " attached");
Craig Mautner4e5b67e2014-02-07 15:30:03 -0800266 final IIntentSender iIntentSender = pendingIntent.getTarget();
Craig Mautnerb9168362015-02-26 20:40:19 -0800267 if (mActivityContainer.startActivityIntentSender(iIntentSender) == START_CANCELED) {
268 throw new OperationCanceledException();
Craig Mautnerdf88d732014-01-27 09:21:32 -0800269 }
270 }
271
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700272 public void release() {
Craig Mautner6985bad2014-04-21 15:22:06 -0700273 if (DEBUG) Log.v(TAG, "release() mActivityContainer=" + mActivityContainer +
274 " mSurface=" + mSurface);
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700275 if (mActivityContainer == null) {
276 Log.e(TAG, "Duplicate call to release");
277 return;
278 }
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400279 synchronized (mActivityContainerLock) {
280 mActivityContainer.release();
281 mActivityContainer = null;
282 }
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700283
284 if (mSurface != null) {
285 mSurface.release();
286 mSurface = null;
287 }
288
289 mTextureView.setSurfaceTextureListener(null);
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700290 }
291
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400292 private void setSurfaceAsync(final Surface surface, final int width, final int height,
293 final int densityDpi, final boolean callback) {
294 mExecutor.execute(new Runnable() {
295 public void run() {
296 try {
297 synchronized (mActivityContainerLock) {
298 if (mActivityContainer != null) {
299 mActivityContainer.setSurface(surface, width, height, densityDpi);
300 }
301 }
302 } catch (RemoteException e) {
303 throw new RuntimeException(
304 "ActivityView: Unable to set surface of ActivityContainer. ",
305 e);
306 }
307 if (callback) {
308 post(new Runnable() {
309 @Override
310 public void run() {
311 if (mActivityViewCallback != null) {
312 if (surface != null) {
313 mActivityViewCallback.onSurfaceAvailable(ActivityView.this);
314 } else {
315 mActivityViewCallback.onSurfaceDestroyed(ActivityView.this);
316 }
317 }
318 }
319 });
320 }
321 }
322 });
Craig Mautner4504de52013-12-20 09:06:56 -0800323 }
324
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700325 /**
326 * Set the callback to use to report certain state changes.
Craig Mautnerb9168362015-02-26 20:40:19 -0800327 *
328 * Note: If the surface has been created prior to this call being made, then
329 * ActivityViewCallback.onSurfaceAvailable will be called from within setCallback.
330 *
331 * @param callback The callback to report events to.
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700332 *
333 * @see ActivityViewCallback
334 */
335 public void setCallback(ActivityViewCallback callback) {
336 mActivityViewCallback = callback;
Craig Mautnerb9168362015-02-26 20:40:19 -0800337
338 if (mSurface != null) {
339 mActivityViewCallback.onSurfaceAvailable(this);
340 }
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700341 }
342
343 public static abstract class ActivityViewCallback {
344 /**
345 * Called when all activities in the ActivityView have completed and been removed. Register
346 * using {@link ActivityView#setCallback(ActivityViewCallback)}. Each ActivityView may
347 * have at most one callback registered.
348 */
349 public abstract void onAllActivitiesComplete(ActivityView view);
Craig Mautnerb9168362015-02-26 20:40:19 -0800350 /**
351 * Called when the surface is ready to be drawn to. Calling startActivity prior to this
352 * callback will result in an IllegalStateException.
353 */
354 public abstract void onSurfaceAvailable(ActivityView view);
355 /**
356 * Called when the surface has been removed. Calling startActivity after this callback
357 * will result in an IllegalStateException.
358 */
359 public abstract void onSurfaceDestroyed(ActivityView view);
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700360 }
361
Craig Mautner4504de52013-12-20 09:06:56 -0800362 private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
363 @Override
364 public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
365 int height) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700366 if (mActivityContainer == null) {
367 return;
368 }
Craig Mautner12ff7392014-02-21 21:08:00 -0800369 if (DEBUG) Log.d(TAG, "onSurfaceTextureAvailable: width=" + width + " height="
370 + height);
Craig Mautner4504de52013-12-20 09:06:56 -0800371 mWidth = width;
372 mHeight = height;
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400373 mSurface = new Surface(surfaceTexture);
374 setSurfaceAsync(mSurface, mWidth, mHeight, mDensityDpi, true);
Craig Mautner4504de52013-12-20 09:06:56 -0800375 }
376
377 @Override
378 public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
379 int height) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700380 if (mActivityContainer == null) {
381 return;
382 }
Craig Mautner12ff7392014-02-21 21:08:00 -0800383 if (DEBUG) Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height);
Craig Mautner4504de52013-12-20 09:06:56 -0800384 }
385
386 @Override
387 public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700388 if (mActivityContainer == null) {
389 return true;
390 }
Craig Mautner12ff7392014-02-21 21:08:00 -0800391 if (DEBUG) Log.d(TAG, "onSurfaceTextureDestroyed");
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700392 mSurface.release();
393 mSurface = null;
Daniel Koulomzin71c012e2015-09-24 14:38:17 -0400394 setSurfaceAsync(null, mWidth, mHeight, mDensityDpi, true);
Craig Mautner34b73df2014-01-12 21:11:08 -0800395 return true;
Craig Mautner4504de52013-12-20 09:06:56 -0800396 }
397
398 @Override
399 public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
Craig Mautner34b73df2014-01-12 21:11:08 -0800400// Log.d(TAG, "onSurfaceTextureUpdated");
Craig Mautner4504de52013-12-20 09:06:56 -0800401 }
402
403 }
Craig Mautnere3a00d72014-04-16 08:31:19 -0700404
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700405 private static class ActivityContainerCallback extends IActivityContainerCallback.Stub {
406 private final WeakReference<ActivityView> mActivityViewWeakReference;
407
408 ActivityContainerCallback(ActivityView activityView) {
Craig Mautnerb9168362015-02-26 20:40:19 -0800409 mActivityViewWeakReference = new WeakReference<>(activityView);
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700410 }
411
Craig Mautnere3a00d72014-04-16 08:31:19 -0700412 @Override
413 public void setVisible(IBinder container, boolean visible) {
Craig Mautnerf4c909b2014-04-17 18:39:38 -0700414 if (DEBUG) Log.v(TAG, "setVisible(): container=" + container + " visible=" + visible +
415 " ActivityView=" + mActivityViewWeakReference.get());
Craig Mautnere3a00d72014-04-16 08:31:19 -0700416 }
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700417
418 @Override
419 public void onAllActivitiesComplete(IBinder container) {
420 final ActivityView activityView = mActivityViewWeakReference.get();
421 if (activityView != null) {
422 final ActivityViewCallback callback = activityView.mActivityViewCallback;
423 if (callback != null) {
Gus Prevas3e7bebf2015-03-24 17:05:55 -0400424 final WeakReference<ActivityViewCallback> callbackRef =
425 new WeakReference<>(callback);
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700426 activityView.post(new Runnable() {
427 @Override
428 public void run() {
Gus Prevas3e7bebf2015-03-24 17:05:55 -0400429 ActivityViewCallback callback = callbackRef.get();
430 if (callback != null) {
431 callback.onAllActivitiesComplete(activityView);
432 }
Craig Mautnerd94b47f2014-06-02 15:06:40 -0700433 }
434 });
435 }
436 }
437 }
Craig Mautnere3a00d72014-04-16 08:31:19 -0700438 }
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700439
440 private static class ActivityContainerWrapper {
441 private final IActivityContainer mIActivityContainer;
442 private final CloseGuard mGuard = CloseGuard.get();
Craig Mautnerd163e752014-06-13 17:18:47 -0700443 boolean mOpened; // Protected by mGuard.
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700444
445 ActivityContainerWrapper(IActivityContainer container) {
446 mIActivityContainer = container;
Craig Mautnerd163e752014-06-13 17:18:47 -0700447 mOpened = true;
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700448 mGuard.open("release");
449 }
450
451 void attachToDisplay(int displayId) {
452 try {
453 mIActivityContainer.attachToDisplay(displayId);
454 } catch (RemoteException e) {
455 }
456 }
457
458 void setSurface(Surface surface, int width, int height, int density)
459 throws RemoteException {
460 mIActivityContainer.setSurface(surface, width, height, density);
461 }
462
463 int startActivity(Intent intent) {
464 try {
465 return mIActivityContainer.startActivity(intent);
466 } catch (RemoteException e) {
Craig Mautner6985bad2014-04-21 15:22:06 -0700467 throw new RuntimeException("ActivityView: Unable to startActivity. " + e);
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700468 }
469 }
470
471 int startActivityIntentSender(IIntentSender intentSender) {
472 try {
473 return mIActivityContainer.startActivityIntentSender(intentSender);
474 } catch (RemoteException e) {
Craig Mautner6985bad2014-04-21 15:22:06 -0700475 throw new RuntimeException(
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700476 "ActivityView: Unable to startActivity from IntentSender. " + e);
477 }
478 }
479
480 int getDisplayId() {
481 try {
482 return mIActivityContainer.getDisplayId();
483 } catch (RemoteException e) {
484 return -1;
485 }
486 }
487
488 boolean injectEvent(InputEvent event) {
489 try {
490 return mIActivityContainer.injectEvent(event);
491 } catch (RemoteException e) {
492 return false;
493 }
494 }
495
496 void release() {
Craig Mautnerd163e752014-06-13 17:18:47 -0700497 synchronized (mGuard) {
498 if (mOpened) {
499 if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: release called");
500 try {
501 mIActivityContainer.release();
502 mGuard.close();
503 } catch (RemoteException e) {
504 }
505 mOpened = false;
506 }
Craig Mautner6cdf51f2014-04-19 14:56:31 -0700507 }
508 }
509
510 @Override
511 protected void finalize() throws Throwable {
512 if (DEBUG) Log.v(TAG, "ActivityContainerWrapper: finalize called");
513 try {
514 if (mGuard != null) {
515 mGuard.warnIfOpen();
516 release();
517 }
518 } finally {
519 super.finalize();
520 }
521 }
522
523 }
Craig Mautner4504de52013-12-20 09:06:56 -0800524}