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)