| Index: webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java
|
| diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java
|
| index 48a771632ab7132b6d7c19ba7d154a5ae898bcff..ed31ba1ab3f39a46877ac932d7476021dcddb74c 100644
|
| --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java
|
| +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java
|
| @@ -10,44 +10,47 @@
|
|
|
| package org.appspot.apprtc;
|
|
|
| -import org.appspot.apprtc.AppRTCClient.RoomConnectionParameters;
|
| -import org.appspot.apprtc.AppRTCClient.SignalingParameters;
|
| -import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
|
| -
|
| import android.app.Activity;
|
| import android.app.AlertDialog;
|
| import android.app.FragmentTransaction;
|
| +import android.content.Context;
|
| import android.content.DialogInterface;
|
| import android.content.Intent;
|
| import android.content.pm.PackageManager;
|
| +import android.media.projection.MediaProjection;
|
| +import android.media.projection.MediaProjectionManager;
|
| import android.net.Uri;
|
| import android.os.Bundle;
|
| import android.os.Handler;
|
| +import android.util.DisplayMetrics;
|
| import android.util.Log;
|
| import android.view.View;
|
| import android.view.Window;
|
| +import android.view.WindowManager;
|
| import android.view.WindowManager.LayoutParams;
|
| import android.widget.Toast;
|
| -
|
| import java.io.IOException;
|
| import java.lang.RuntimeException;
|
| import java.util.ArrayList;
|
| import java.util.List;
|
| -
|
| +import org.appspot.apprtc.AppRTCClient.RoomConnectionParameters;
|
| +import org.appspot.apprtc.AppRTCClient.SignalingParameters;
|
| +import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
|
| import org.webrtc.Camera1Enumerator;
|
| import org.webrtc.Camera2Enumerator;
|
| import org.webrtc.CameraEnumerator;
|
| import org.webrtc.EglBase;
|
| import org.webrtc.FileVideoCapturer;
|
| -import org.webrtc.VideoFileRenderer;
|
| import org.webrtc.IceCandidate;
|
| import org.webrtc.Logging;
|
| import org.webrtc.PeerConnectionFactory;
|
| import org.webrtc.RendererCommon.ScalingType;
|
| +import org.webrtc.ScreenCapturerAndroid;
|
| import org.webrtc.SessionDescription;
|
| import org.webrtc.StatsReport;
|
| import org.webrtc.SurfaceViewRenderer;
|
| import org.webrtc.VideoCapturer;
|
| +import org.webrtc.VideoFileRenderer;
|
| import org.webrtc.VideoRenderer;
|
|
|
| /**
|
| @@ -60,6 +63,7 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| public static final String EXTRA_ROOMID = "org.appspot.apprtc.ROOMID";
|
| public static final String EXTRA_LOOPBACK = "org.appspot.apprtc.LOOPBACK";
|
| public static final String EXTRA_VIDEO_CALL = "org.appspot.apprtc.VIDEO_CALL";
|
| + public static final String EXTRA_SCREENCAPTURE = "org.appspot.apprtc.SCREENCAPTURE";
|
| public static final String EXTRA_CAMERA2 = "org.appspot.apprtc.CAMERA2";
|
| public static final String EXTRA_VIDEO_WIDTH = "org.appspot.apprtc.VIDEO_WIDTH";
|
| public static final String EXTRA_VIDEO_HEIGHT = "org.appspot.apprtc.VIDEO_HEIGHT";
|
| @@ -94,6 +98,7 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| public static final String EXTRA_USE_VALUES_FROM_INTENT =
|
| "org.appspot.apprtc.USE_VALUES_FROM_INTENT";
|
| private static final String TAG = "CallRTCClient";
|
| + private static final int CAPTURE_PERMISSION_REQUEST_CODE = 1;
|
|
|
| // List of mandatory application permissions.
|
| private static final String[] MANDATORY_PERMISSIONS = {"android.permission.MODIFY_AUDIO_SETTINGS",
|
| @@ -140,6 +145,9 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| private boolean callControlFragmentVisible = true;
|
| private long callStartedTimeMs = 0;
|
| private boolean micEnabled = true;
|
| + private boolean screencaptureEnabled = false;
|
| + private static Intent mediaProjectionPermissionResultData;
|
| + private static int mediaProjectionPermissionResultCode;
|
|
|
| // Controls
|
| private CallFragment callFragment;
|
| @@ -243,10 +251,23 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| boolean loopback = intent.getBooleanExtra(EXTRA_LOOPBACK, false);
|
| boolean tracing = intent.getBooleanExtra(EXTRA_TRACING, false);
|
|
|
| + int videoWidth = intent.getIntExtra(EXTRA_VIDEO_WIDTH, 0);
|
| + int videoHeight = intent.getIntExtra(EXTRA_VIDEO_HEIGHT, 0);
|
| +
|
| + screencaptureEnabled = intent.getBooleanExtra(EXTRA_SCREENCAPTURE, false);
|
| + // If capturing format is not specified for screencapture, use screen resolution.
|
| + if (screencaptureEnabled && videoWidth == 0 && videoHeight == 0) {
|
| + DisplayMetrics displayMetrics = new DisplayMetrics();
|
| + WindowManager windowManager =
|
| + (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
|
| + windowManager.getDefaultDisplay().getRealMetrics(displayMetrics);
|
| + videoWidth = displayMetrics.widthPixels;
|
| + videoHeight = displayMetrics.heightPixels;
|
| + }
|
| +
|
| peerConnectionParameters =
|
| new PeerConnectionParameters(intent.getBooleanExtra(EXTRA_VIDEO_CALL, true), loopback,
|
| - tracing, intent.getIntExtra(EXTRA_VIDEO_WIDTH, 0),
|
| - intent.getIntExtra(EXTRA_VIDEO_HEIGHT, 0), intent.getIntExtra(EXTRA_VIDEO_FPS, 0),
|
| + tracing, videoWidth, videoHeight, intent.getIntExtra(EXTRA_VIDEO_FPS, 0),
|
| intent.getIntExtra(EXTRA_VIDEO_BITRATE, 0), intent.getStringExtra(EXTRA_VIDEOCODEC),
|
| intent.getBooleanExtra(EXTRA_HWCODEC_ENABLED, true),
|
| intent.getIntExtra(EXTRA_AUDIO_BITRATE, 0), intent.getStringExtra(EXTRA_AUDIOCODEC),
|
| @@ -285,7 +306,6 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| ft.add(R.id.call_fragment_container, callFragment);
|
| ft.add(R.id.hud_fragment_container, hudFragment);
|
| ft.commit();
|
| - startCall();
|
|
|
| // For command line execution run connection for <runTimeMs> and exit.
|
| if (commandLineRun && runTimeMs > 0) {
|
| @@ -305,6 +325,25 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| }
|
| peerConnectionClient.createPeerConnectionFactory(
|
| CallActivity.this, peerConnectionParameters, CallActivity.this);
|
| +
|
| + if (screencaptureEnabled) {
|
| + MediaProjectionManager mediaProjectionManager =
|
| + (MediaProjectionManager) getApplication().getSystemService(
|
| + Context.MEDIA_PROJECTION_SERVICE);
|
| + startActivityForResult(
|
| + mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE);
|
| + } else {
|
| + startCall();
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
| + if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE)
|
| + return;
|
| + mediaProjectionPermissionResultCode = resultCode;
|
| + mediaProjectionPermissionResultData = data;
|
| + startCall();
|
| }
|
|
|
| private boolean useCamera2() {
|
| @@ -352,7 +391,9 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| public void onPause() {
|
| super.onPause();
|
| activityRunning = false;
|
| - if (peerConnectionClient != null) {
|
| + // Don't stop the video when using screencapture to allow user to show other apps to the remote
|
| + // end.
|
| + if (peerConnectionClient != null && !screencaptureEnabled) {
|
| peerConnectionClient.stopVideoSource();
|
| }
|
| cpuMonitor.pause();
|
| @@ -362,7 +403,8 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| public void onResume() {
|
| super.onResume();
|
| activityRunning = true;
|
| - if (peerConnectionClient != null) {
|
| + // Video is not paused for screencapture. See onPause.
|
| + if (peerConnectionClient != null && !screencaptureEnabled) {
|
| peerConnectionClient.startVideoSource();
|
| }
|
| cpuMonitor.resume();
|
| @@ -588,6 +630,18 @@ public class CallActivity extends Activity implements AppRTCClient.SignalingEven
|
| reportError("Failed to open video file for emulated camera");
|
| return null;
|
| }
|
| + } else if (screencaptureEnabled) {
|
| + if (mediaProjectionPermissionResultCode != Activity.RESULT_OK) {
|
| + reportError("User didn't give permission to capture the screen.");
|
| + return null;
|
| + }
|
| + return new ScreenCapturerAndroid(
|
| + mediaProjectionPermissionResultData, new MediaProjection.Callback() {
|
| + @Override
|
| + public void onStop() {
|
| + reportError("User revoked permission to capture the screen.");
|
| + }
|
| + });
|
| } else if (useCamera2()) {
|
| if (!captureToTexture()) {
|
| reportError(getString(R.string.camera2_texture_only_error));
|
|
|