diff --git a/webrtc/examples/androidapp/AndroidManifest.xml b/webrtc/examples/androidapp/AndroidManifest.xml index 608e381fcb..48e2e8f3ff 100644 --- a/webrtc/examples/androidapp/AndroidManifest.xml +++ b/webrtc/examples/androidapp/AndroidManifest.xml @@ -16,6 +16,7 @@ + Enable video in a call. true + screencapture_preference + Use screencapture. + false + camera2_preference Use Camera2. true diff --git a/webrtc/examples/androidapp/res/xml/preferences.xml b/webrtc/examples/androidapp/res/xml/preferences.xml index 146ff5e62f..35a6e6ef4e 100644 --- a/webrtc/examples/androidapp/res/xml/preferences.xml +++ b/webrtc/examples/androidapp/res/xml/preferences.xml @@ -10,6 +10,11 @@ android:dialogTitle="@string/pref_videocall_dlg" android:defaultValue="@string/pref_videocall_default" /> + + 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)); diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java index 80ea90f93a..8d1668894d 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java @@ -33,12 +33,10 @@ import android.widget.EditText; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; - -import org.json.JSONArray; -import org.json.JSONException; - import java.util.ArrayList; import java.util.Random; +import org.json.JSONArray; +import org.json.JSONException; /** * Handles the initial setup where the user selects which room to join. @@ -55,6 +53,7 @@ public class ConnectActivity extends Activity { private ListView roomListView; private SharedPreferences sharedPref; private String keyprefVideoCallEnabled; + private String keyprefScreencapture; private String keyprefCamera2; private String keyprefResolution; private String keyprefFps; @@ -90,6 +89,7 @@ public class ConnectActivity extends Activity { PreferenceManager.setDefaultValues(this, R.xml.preferences, false); sharedPref = PreferenceManager.getDefaultSharedPreferences(this); keyprefVideoCallEnabled = getString(R.string.pref_videocall_key); + keyprefScreencapture = getString(R.string.pref_screencapture_key); keyprefCamera2 = getString(R.string.pref_camera2_key); keyprefResolution = getString(R.string.pref_resolution_key); keyprefFps = getString(R.string.pref_fps_key); @@ -295,6 +295,10 @@ public class ConnectActivity extends Activity { boolean videoCallEnabled = sharedPrefGetBoolean(R.string.pref_videocall_key, CallActivity.EXTRA_VIDEO_CALL, R.string.pref_videocall_default, useValuesFromIntent); + // Use screencapture option. + boolean useScreencapture = sharedPrefGetBoolean(R.string.pref_screencapture_key, + CallActivity.EXTRA_SCREENCAPTURE, R.string.pref_screencapture_default, useValuesFromIntent); + // Use Camera2 option. boolean useCamera2 = sharedPrefGetBoolean(R.string.pref_camera2_key, CallActivity.EXTRA_CAMERA2, R.string.pref_camera2_default, useValuesFromIntent); @@ -438,6 +442,7 @@ public class ConnectActivity extends Activity { intent.putExtra(CallActivity.EXTRA_ROOMID, roomId); intent.putExtra(CallActivity.EXTRA_LOOPBACK, loopback); intent.putExtra(CallActivity.EXTRA_VIDEO_CALL, videoCallEnabled); + intent.putExtra(CallActivity.EXTRA_SCREENCAPTURE, useScreencapture); intent.putExtra(CallActivity.EXTRA_CAMERA2, useCamera2); intent.putExtra(CallActivity.EXTRA_VIDEO_WIDTH, videoWidth); intent.putExtra(CallActivity.EXTRA_VIDEO_HEIGHT, videoHeight); diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java index 8166b90adc..c152f945a8 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java @@ -10,13 +10,23 @@ package org.appspot.apprtc; -import org.appspot.apprtc.AppRTCClient.SignalingParameters; - import android.content.Context; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.util.Log; - +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.EnumSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.appspot.apprtc.AppRTCClient.SignalingParameters; import org.webrtc.AudioSource; import org.webrtc.AudioTrack; import org.webrtc.CameraVideoCapturer; @@ -42,19 +52,6 @@ import org.webrtc.VideoTrack; import org.webrtc.voiceengine.WebRtcAudioManager; import org.webrtc.voiceengine.WebRtcAudioUtils; -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.EnumSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Peer connection client implementation. * @@ -82,9 +79,6 @@ public class PeerConnectionClient { private static final String DTLS_SRTP_KEY_AGREEMENT_CONSTRAINT = "DtlsSrtpKeyAgreement"; private static final int HD_VIDEO_WIDTH = 1280; private static final int HD_VIDEO_HEIGHT = 720; - private static final int MAX_VIDEO_WIDTH = 1280; - private static final int MAX_VIDEO_HEIGHT = 1280; - private static final int MAX_VIDEO_FPS = 30; private static final int BPS_IN_KBPS = 1000; private static final PeerConnectionClient instance = new PeerConnectionClient(); @@ -428,10 +422,7 @@ public class PeerConnectionClient { if (videoFps == 0) { videoFps = 30; } - - videoWidth = Math.min(videoWidth, MAX_VIDEO_WIDTH); - videoHeight = Math.min(videoHeight, MAX_VIDEO_HEIGHT); - videoFps = Math.min(videoFps, MAX_VIDEO_FPS); + Logging.d(TAG, "Capturing format: " + videoWidth + "x" + videoHeight + "@" + videoFps); } // Create audio constraints. diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java index fd38f9039f..aee778bcfc 100644 --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java @@ -16,7 +16,6 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; - import org.webrtc.Camera2Enumerator; import org.webrtc.voiceengine.WebRtcAudioUtils; @@ -26,6 +25,7 @@ import org.webrtc.voiceengine.WebRtcAudioUtils; public class SettingsActivity extends Activity implements OnSharedPreferenceChangeListener { private SettingsFragment settingsFragment; private String keyprefVideoCall; + private String keyprefScreencapture; private String keyprefCamera2; private String keyprefResolution; private String keyprefFps; @@ -56,6 +56,7 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); keyprefVideoCall = getString(R.string.pref_videocall_key); + keyprefScreencapture = getString(R.string.pref_screencapture_key); keyprefCamera2 = getString(R.string.pref_camera2_key); keyprefResolution = getString(R.string.pref_resolution_key); keyprefFps = getString(R.string.pref_fps_key); @@ -98,6 +99,7 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan settingsFragment.getPreferenceScreen().getSharedPreferences(); sharedPreferences.registerOnSharedPreferenceChangeListener(this); updateSummaryB(sharedPreferences, keyprefVideoCall); + updateSummaryB(sharedPreferences, keyprefScreencapture); updateSummaryB(sharedPreferences, keyprefCamera2); updateSummary(sharedPreferences, keyprefResolution); updateSummary(sharedPreferences, keyprefFps); @@ -186,6 +188,7 @@ public class SettingsActivity extends Activity implements OnSharedPreferenceChan || key.equals(keyprefStartAudioBitrateValue)) { updateSummaryBitrate(sharedPreferences, key); } else if (key.equals(keyprefVideoCall) + || key.equals(keyprefScreencapture) || key.equals(keyprefCamera2) || key.equals(keyPrefTracing) || key.equals(keyprefCaptureQualitySlider)