| Index: webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java
 | 
| diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java
 | 
| index 5a84c446299703cd30180865894945678649489b..2b9d51c845774dbf29488f2e67e64352f5e3ed7a 100644
 | 
| --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java
 | 
| +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java
 | 
| @@ -144,8 +144,10 @@ public class ConnectActivity extends Activity {
 | 
|      if ("android.intent.action.VIEW".equals(intent.getAction()) && !commandLineRun) {
 | 
|        boolean loopback = intent.getBooleanExtra(CallActivity.EXTRA_LOOPBACK, false);
 | 
|        int runTimeMs = intent.getIntExtra(CallActivity.EXTRA_RUNTIME, 0);
 | 
| +      boolean useValuesFromIntent = intent.getBooleanExtra(
 | 
| +          CallActivity.EXTRA_USE_VALUES_FROM_INTENT, false);
 | 
|        String room = sharedPref.getString(keyprefRoom, "");
 | 
| -      connectToRoom(room, true, loopback, runTimeMs);
 | 
| +      connectToRoom(room, true, loopback, useValuesFromIntent, runTimeMs);
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -190,7 +192,7 @@ public class ConnectActivity extends Activity {
 | 
|        startActivity(intent);
 | 
|        return true;
 | 
|      } else if (item.getItemId() == R.id.action_loopback) {
 | 
| -      connectToRoom(null, false, true, 0);
 | 
| +      connectToRoom(null, false, true, false, 0);
 | 
|        return true;
 | 
|      } else {
 | 
|        return super.onOptionsItemSelected(item);
 | 
| @@ -243,8 +245,43 @@ public class ConnectActivity extends Activity {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  /**
 | 
| +   * Get a value from the shared preference or from the intent, if it does not
 | 
| +   * exist the default is used.
 | 
| +   */
 | 
| +  private String sharedPrefGetString(int attributeId, String intentName,
 | 
| +      int defaultId, boolean useFromIntent) {
 | 
| +    String defaultValue = getString(defaultId);
 | 
| +    if (useFromIntent) {
 | 
| +      String value = getIntent().getStringExtra(intentName);
 | 
| +      if (value != null) {
 | 
| +        return value;
 | 
| +      }
 | 
| +      return defaultValue;
 | 
| +    } else {
 | 
| +      String attributeName = getString(attributeId);
 | 
| +      return sharedPref.getString(attributeName, defaultValue);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  /**
 | 
| +   * Get a value from the shared preference or from the intent, if it does not
 | 
| +   * exist the default is used.
 | 
| +   */
 | 
| +  private boolean sharedPrefGetBoolean(int attributeId, String intentName,
 | 
| +      int defaultId, boolean useFromIntent) {
 | 
| +    boolean defaultValue = Boolean.valueOf(getString(defaultId));
 | 
| +    if (useFromIntent) {
 | 
| +      return getIntent().getBooleanExtra(intentName, defaultValue);
 | 
| +    } else {
 | 
| +      String attributeName = getString(attributeId);
 | 
| +      return sharedPref.getBoolean(attributeName, defaultValue);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
|    private void connectToRoom(
 | 
| -      String roomId, boolean commandLineRun, boolean loopback, int runTimeMs) {
 | 
| +      String roomId, boolean commandLineRun, boolean loopback,
 | 
| +      boolean useValuesFromIntent, int runTimeMs) {
 | 
|      this.commandLineRun = commandLineRun;
 | 
|  
 | 
|      // roomId is random for loopback.
 | 
| @@ -256,112 +293,188 @@ public class ConnectActivity extends Activity {
 | 
|          keyprefRoomServerUrl, getString(R.string.pref_room_server_url_default));
 | 
|  
 | 
|      // Video call enabled flag.
 | 
| -    boolean videoCallEnabled = sharedPref.getBoolean(
 | 
| -        keyprefVideoCallEnabled, Boolean.valueOf(getString(R.string.pref_videocall_default)));
 | 
| +    boolean videoCallEnabled = sharedPrefGetBoolean(
 | 
| +        R.string.pref_videocall_key,
 | 
| +        CallActivity.EXTRA_VIDEO_CALL,
 | 
| +        R.string.pref_videocall_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Use Camera2 option.
 | 
| -    boolean useCamera2 = sharedPref.getBoolean(
 | 
| -        keyprefCamera2, Boolean.valueOf(getString(R.string.pref_camera2_default)));
 | 
| +    boolean useCamera2 = sharedPrefGetBoolean(
 | 
| +        R.string.pref_camera2_key,
 | 
| +        CallActivity.EXTRA_CAMERA2,
 | 
| +        R.string.pref_camera2_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Get default codecs.
 | 
| -    String videoCodec =
 | 
| -        sharedPref.getString(keyprefVideoCodec, getString(R.string.pref_videocodec_default));
 | 
| -    String audioCodec =
 | 
| -        sharedPref.getString(keyprefAudioCodec, getString(R.string.pref_audiocodec_default));
 | 
| +    String videoCodec = sharedPrefGetString(
 | 
| +        R.string.pref_videocodec_key,
 | 
| +        CallActivity.EXTRA_VIDEOCODEC,
 | 
| +        R.string.pref_videocodec_default,
 | 
| +        useValuesFromIntent);
 | 
| +    String audioCodec = sharedPrefGetString(
 | 
| +        R.string.pref_audiocodec_key,
 | 
| +        CallActivity.EXTRA_AUDIOCODEC,
 | 
| +        R.string.pref_audiocodec_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check HW codec flag.
 | 
| -    boolean hwCodec = sharedPref.getBoolean(
 | 
| -        keyprefHwCodecAcceleration, Boolean.valueOf(getString(R.string.pref_hwcodec_default)));
 | 
| +    boolean hwCodec = sharedPrefGetBoolean(
 | 
| +        R.string.pref_hwcodec_key,
 | 
| +        CallActivity.EXTRA_HWCODEC_ENABLED,
 | 
| +        R.string.pref_hwcodec_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Capture to texture.
 | 
| -    boolean captureToTexture = sharedPref.getBoolean(keyprefCaptureToTexture,
 | 
| -        Boolean.valueOf(getString(R.string.pref_capturetotexture_default)));
 | 
| +    boolean captureToTexture = sharedPrefGetBoolean(
 | 
| +        R.string.pref_capturetotexture_key,
 | 
| +        CallActivity.EXTRA_CAPTURETOTEXTURE_ENABLED,
 | 
| +        R.string.pref_capturetotexture_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Disable Audio Processing flag.
 | 
| -    boolean noAudioProcessing = sharedPref.getBoolean(keyprefNoAudioProcessingPipeline,
 | 
| -        Boolean.valueOf(getString(R.string.pref_noaudioprocessing_default)));
 | 
| +    boolean noAudioProcessing = sharedPrefGetBoolean(
 | 
| +        R.string.pref_noaudioprocessing_key,
 | 
| +        CallActivity.EXTRA_NOAUDIOPROCESSING_ENABLED,
 | 
| +        R.string.pref_noaudioprocessing_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Disable Audio Processing flag.
 | 
| -    boolean aecDump = sharedPref.getBoolean(
 | 
| -        keyprefAecDump, Boolean.valueOf(getString(R.string.pref_aecdump_default)));
 | 
| +    boolean aecDump = sharedPrefGetBoolean(
 | 
| +        R.string.pref_aecdump_key,
 | 
| +        CallActivity.EXTRA_AECDUMP_ENABLED,
 | 
| +        R.string.pref_aecdump_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check OpenSL ES enabled flag.
 | 
| -    boolean useOpenSLES = sharedPref.getBoolean(
 | 
| -        keyprefOpenSLES, Boolean.valueOf(getString(R.string.pref_opensles_default)));
 | 
| +    boolean useOpenSLES = sharedPrefGetBoolean(
 | 
| +        R.string.pref_opensles_key,
 | 
| +        CallActivity.EXTRA_OPENSLES_ENABLED,
 | 
| +        R.string.pref_opensles_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Disable built-in AEC flag.
 | 
| -    boolean disableBuiltInAEC = sharedPref.getBoolean(keyprefDisableBuiltInAec,
 | 
| -        Boolean.valueOf(getString(R.string.pref_disable_built_in_aec_default)));
 | 
| +    boolean disableBuiltInAEC = sharedPrefGetBoolean(
 | 
| +        R.string.pref_disable_built_in_aec_key,
 | 
| +        CallActivity.EXTRA_DISABLE_BUILT_IN_AEC,
 | 
| +        R.string.pref_disable_built_in_aec_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Disable built-in AGC flag.
 | 
| -    boolean disableBuiltInAGC = sharedPref.getBoolean(keyprefDisableBuiltInAgc,
 | 
| -        Boolean.valueOf(getString(R.string.pref_disable_built_in_agc_default)));
 | 
| +    boolean disableBuiltInAGC = sharedPrefGetBoolean(
 | 
| +        R.string.pref_disable_built_in_agc_key,
 | 
| +        CallActivity.EXTRA_DISABLE_BUILT_IN_AGC,
 | 
| +        R.string.pref_disable_built_in_agc_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Disable built-in NS flag.
 | 
| -    boolean disableBuiltInNS = sharedPref.getBoolean(keyprefDisableBuiltInNs,
 | 
| -        Boolean.valueOf(getString(R.string.pref_disable_built_in_ns_default)));
 | 
| +    boolean disableBuiltInNS = sharedPrefGetBoolean(
 | 
| +        R.string.pref_disable_built_in_ns_key,
 | 
| +        CallActivity.EXTRA_DISABLE_BUILT_IN_NS,
 | 
| +        R.string.pref_disable_built_in_ns_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Check Enable level control.
 | 
| -    boolean enableLevelControl = sharedPref.getBoolean(keyprefEnableLevelControl,
 | 
| -        Boolean.valueOf(getString(R.string.pref_enable_level_control_key)));
 | 
| +    boolean enableLevelControl = sharedPrefGetBoolean(
 | 
| +        R.string.pref_enable_level_control_key,
 | 
| +        CallActivity.EXTRA_ENABLE_LEVEL_CONTROL,
 | 
| +        R.string.pref_enable_level_control_key,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Get video resolution from settings.
 | 
|      int videoWidth = 0;
 | 
|      int videoHeight = 0;
 | 
| -    String resolution =
 | 
| -        sharedPref.getString(keyprefResolution, getString(R.string.pref_resolution_default));
 | 
| -    String[] dimensions = resolution.split("[ x]+");
 | 
| -    if (dimensions.length == 2) {
 | 
| -      try {
 | 
| -        videoWidth = Integer.parseInt(dimensions[0]);
 | 
| -        videoHeight = Integer.parseInt(dimensions[1]);
 | 
| -      } catch (NumberFormatException e) {
 | 
| -        videoWidth = 0;
 | 
| -        videoHeight = 0;
 | 
| -        Log.e(TAG, "Wrong video resolution setting: " + resolution);
 | 
| +    if (useValuesFromIntent) {
 | 
| +      videoWidth = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_WIDTH, 0);
 | 
| +      videoHeight = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_HEIGHT, 0);
 | 
| +    }
 | 
| +    if (videoWidth == 0 && videoHeight == 0) {
 | 
| +      String resolution = sharedPref.getString(
 | 
| +          keyprefResolution,
 | 
| +          getString(R.string.pref_resolution_default));
 | 
| +      String[] dimensions = resolution.split("[ x]+");
 | 
| +      if (dimensions.length == 2) {
 | 
| +        try {
 | 
| +          videoWidth = Integer.parseInt(dimensions[0]);
 | 
| +          videoHeight = Integer.parseInt(dimensions[1]);
 | 
| +        } catch (NumberFormatException e) {
 | 
| +          videoWidth = 0;
 | 
| +          videoHeight = 0;
 | 
| +          Log.e(TAG, "Wrong video resolution setting: " + resolution);
 | 
| +        }
 | 
|        }
 | 
|      }
 | 
|  
 | 
|      // Get camera fps from settings.
 | 
|      int cameraFps = 0;
 | 
| -    String fps = sharedPref.getString(keyprefFps, getString(R.string.pref_fps_default));
 | 
| -    String[] fpsValues = fps.split("[ x]+");
 | 
| -    if (fpsValues.length == 2) {
 | 
| -      try {
 | 
| -        cameraFps = Integer.parseInt(fpsValues[0]);
 | 
| -      } catch (NumberFormatException e) {
 | 
| -        Log.e(TAG, "Wrong camera fps setting: " + fps);
 | 
| +    if (useValuesFromIntent) {
 | 
| +      cameraFps = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_FPS, 0);
 | 
| +    }
 | 
| +    if (cameraFps == 0) {
 | 
| +      String fps = sharedPref.getString(keyprefFps,
 | 
| +          getString(R.string.pref_fps_default));
 | 
| +      String[] fpsValues = fps.split("[ x]+");
 | 
| +      if (fpsValues.length == 2) {
 | 
| +        try {
 | 
| +          cameraFps = Integer.parseInt(fpsValues[0]);
 | 
| +        } catch (NumberFormatException e) {
 | 
| +          cameraFps = 0;
 | 
| +          Log.e(TAG, "Wrong camera fps setting: " + fps);
 | 
| +        }
 | 
|        }
 | 
|      }
 | 
|  
 | 
|      // Check capture quality slider flag.
 | 
| -    boolean captureQualitySlider = sharedPref.getBoolean(keyprefCaptureQualitySlider,
 | 
| -        Boolean.valueOf(getString(R.string.pref_capturequalityslider_default)));
 | 
| +    boolean captureQualitySlider = sharedPrefGetBoolean(
 | 
| +        R.string.pref_capturequalityslider_key,
 | 
| +        CallActivity.EXTRA_VIDEO_CAPTUREQUALITYSLIDER_ENABLED,
 | 
| +        R.string.pref_capturequalityslider_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Get video and audio start bitrate.
 | 
|      int videoStartBitrate = 0;
 | 
| -    String bitrateTypeDefault = getString(R.string.pref_maxvideobitrate_default);
 | 
| -    String bitrateType = sharedPref.getString(keyprefVideoBitrateType, bitrateTypeDefault);
 | 
| -    if (!bitrateType.equals(bitrateTypeDefault)) {
 | 
| -      String bitrateValue = sharedPref.getString(
 | 
| -          keyprefVideoBitrateValue, getString(R.string.pref_maxvideobitratevalue_default));
 | 
| -      videoStartBitrate = Integer.parseInt(bitrateValue);
 | 
| +    if (useValuesFromIntent) {
 | 
| +      videoStartBitrate = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_BITRATE, 0);
 | 
|      }
 | 
| +    if (videoStartBitrate == 0) {
 | 
| +      String bitrateTypeDefault = getString(
 | 
| +          R.string.pref_maxvideobitrate_default);
 | 
| +      String bitrateType = sharedPref.getString(
 | 
| +          keyprefVideoBitrateType, bitrateTypeDefault);
 | 
| +      if (!bitrateType.equals(bitrateTypeDefault)) {
 | 
| +        String bitrateValue = sharedPref.getString(keyprefVideoBitrateValue,
 | 
| +            getString(R.string.pref_maxvideobitratevalue_default));
 | 
| +        videoStartBitrate = Integer.parseInt(bitrateValue);
 | 
| +      }
 | 
| +    }
 | 
| +
 | 
|      int audioStartBitrate = 0;
 | 
| -    bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
 | 
| -    bitrateType = sharedPref.getString(keyprefAudioBitrateType, bitrateTypeDefault);
 | 
| -    if (!bitrateType.equals(bitrateTypeDefault)) {
 | 
| -      String bitrateValue = sharedPref.getString(
 | 
| -          keyprefAudioBitrateValue, getString(R.string.pref_startaudiobitratevalue_default));
 | 
| -      audioStartBitrate = Integer.parseInt(bitrateValue);
 | 
| +    if (useValuesFromIntent) {
 | 
| +      audioStartBitrate = getIntent().getIntExtra(CallActivity.EXTRA_AUDIO_BITRATE, 0);
 | 
| +    }
 | 
| +    if (audioStartBitrate == 0) {
 | 
| +      String bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
 | 
| +      String bitrateType = sharedPref.getString(
 | 
| +          keyprefAudioBitrateType, bitrateTypeDefault);
 | 
| +      if (!bitrateType.equals(bitrateTypeDefault)) {
 | 
| +        String bitrateValue = sharedPref.getString(keyprefAudioBitrateValue,
 | 
| +            getString(R.string.pref_startaudiobitratevalue_default));
 | 
| +        audioStartBitrate = Integer.parseInt(bitrateValue);
 | 
| +      }
 | 
|      }
 | 
|  
 | 
|      // Check statistics display option.
 | 
| -    boolean displayHud = sharedPref.getBoolean(
 | 
| -        keyprefDisplayHud, Boolean.valueOf(getString(R.string.pref_displayhud_default)));
 | 
| -
 | 
| -    boolean tracing = sharedPref.getBoolean(
 | 
| -        keyprefTracing, Boolean.valueOf(getString(R.string.pref_tracing_default)));
 | 
| +    boolean displayHud = sharedPrefGetBoolean(
 | 
| +        R.string.pref_displayhud_key,
 | 
| +        CallActivity.EXTRA_DISPLAY_HUD,
 | 
| +        R.string.pref_displayhud_default,
 | 
| +        useValuesFromIntent);
 | 
| +
 | 
| +    boolean tracing = sharedPrefGetBoolean(
 | 
| +        R.string.pref_tracing_key,
 | 
| +        CallActivity.EXTRA_TRACING,
 | 
| +        R.string.pref_tracing_default,
 | 
| +        useValuesFromIntent);
 | 
|  
 | 
|      // Start AppRTCMobile activity.
 | 
|      Log.d(TAG, "Connecting to room " + roomId + " at URL " + roomUrl);
 | 
| @@ -395,6 +508,38 @@ public class ConnectActivity extends Activity {
 | 
|        intent.putExtra(CallActivity.EXTRA_CMDLINE, commandLineRun);
 | 
|        intent.putExtra(CallActivity.EXTRA_RUNTIME, runTimeMs);
 | 
|  
 | 
| +      if (useValuesFromIntent) {
 | 
| +        if (getIntent().hasExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA)) {
 | 
| +          String videoFileAsCamera = getIntent().getStringExtra(
 | 
| +              CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA);
 | 
| +          intent.putExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA,
 | 
| +              videoFileAsCamera);
 | 
| +        }
 | 
| +
 | 
| +        if (getIntent().hasExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE)) {
 | 
| +          String saveRemoteVideoToFile = getIntent().getStringExtra(
 | 
| +              CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE);
 | 
| +          intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE,
 | 
| +              saveRemoteVideoToFile);
 | 
| +        }
 | 
| +
 | 
| +        if (getIntent().hasExtra(
 | 
| +              CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH)) {
 | 
| +          int videoOutWidth = getIntent().getIntExtra(
 | 
| +              CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, 0);
 | 
| +          intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH,
 | 
| +              videoOutWidth);
 | 
| +        }
 | 
| +
 | 
| +        if (getIntent().hasExtra(
 | 
| +              CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT)) {
 | 
| +          int videoOutHeight = getIntent().getIntExtra(
 | 
| +              CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, 0);
 | 
| +          intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT,
 | 
| +              videoOutHeight);
 | 
| +        }
 | 
| +      }
 | 
| +
 | 
|        startActivityForResult(intent, CONNECTION_REQUEST);
 | 
|      }
 | 
|    }
 | 
| @@ -424,7 +569,7 @@ public class ConnectActivity extends Activity {
 | 
|          @Override
 | 
|          public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
 | 
|            String roomId = ((TextView) view).getText().toString();
 | 
| -          connectToRoom(roomId, false, false, 0);
 | 
| +          connectToRoom(roomId, false, false, false, 0);
 | 
|          }
 | 
|        };
 | 
|  
 | 
| @@ -442,7 +587,7 @@ public class ConnectActivity extends Activity {
 | 
|    private final OnClickListener connectListener = new OnClickListener() {
 | 
|      @Override
 | 
|      public void onClick(View view) {
 | 
| -      connectToRoom(roomEditText.getText().toString(), false, false, 0);
 | 
| +      connectToRoom(roomEditText.getText().toString(), false, false, false, 0);
 | 
|      }
 | 
|    };
 | 
|  }
 | 
| 
 |