17bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org/*
2a8736448970fedd82f051c6b2cc89185b755ddf3Donald E Curtis *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
37bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *
4a8736448970fedd82f051c6b2cc89185b755ddf3Donald E Curtis *  Use of this source code is governed by a BSD-style license
5a8736448970fedd82f051c6b2cc89185b755ddf3Donald E Curtis *  that can be found in the LICENSE file in the root of the source
6a8736448970fedd82f051c6b2cc89185b755ddf3Donald E Curtis *  tree. An additional intellectual property rights grant can be found
7a8736448970fedd82f051c6b2cc89185b755ddf3Donald E Curtis *  in the file PATENTS.  All contributing project authors may
8a8736448970fedd82f051c6b2cc89185b755ddf3Donald E Curtis *  be found in the AUTHORS file in the root of the source tree.
97bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org */
107bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
117bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgpackage org.appspot.apprtc;
127bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
137bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.app.Activity;
147bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.app.AlertDialog;
157bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.content.DialogInterface;
167bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.content.Intent;
17243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.content.SharedPreferences;
187bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.net.Uri;
197bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.os.Bundle;
20243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.preference.PreferenceManager;
21243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.util.Log;
227bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.KeyEvent;
23243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.view.Menu;
24243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.view.MenuItem;
257bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.View;
267bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.View.OnClickListener;
277bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.inputmethod.EditorInfo;
287bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.webkit.URLUtil;
295f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.AdapterView;
305f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.ArrayAdapter;
317bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.widget.EditText;
325f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.ImageButton;
335f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.ListView;
347bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.widget.TextView;
357bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
365f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport org.json.JSONArray;
375f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport org.json.JSONException;
38470988742a2ad2edbeba3a99b86481b4fb0cd0d3perkj@webrtc.org
395eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.orgimport java.util.ArrayList;
405eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.orgimport java.util.Random;
415f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
427bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org/**
437bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * Handles the initial setup where the user selects which room to join.
447bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org */
457bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgpublic class ConnectActivity extends Activity {
465eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org  private static final String TAG = "ConnectActivity";
475eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org  private static final int CONNECTION_REQUEST = 1;
48369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org  private static boolean commandLineRun = false;
496f6ef72950b9bda79392e83d7b1495d4ff07b4a2henrik.lundin@webrtc.org
505f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton addRoomButton;
515f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton removeRoomButton;
525f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton connectButton;
535f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton connectLoopbackButton;
547bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  private EditText roomEditText;
555f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ListView roomListView;
56243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  private SharedPreferences sharedPref;
57e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefVideoCallEnabled;
58243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  private String keyprefResolution;
595f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private String keyprefFps;
6067e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert  private String keyprefCaptureQualitySlider;
61e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefVideoBitrateType;
62e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefVideoBitrateValue;
6344ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org  private String keyprefVideoCodec;
64e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefAudioBitrateType;
65e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefAudioBitrateValue;
66e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefAudioCodec;
6744ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org  private String keyprefHwCodecAcceleration;
68d48015364d1a3545ea503ce03ec49762a480d42cPer  private String keyprefCaptureToTexture;
698a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom  private String keyprefNoAudioProcessingPipeline;
700b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs  private String keyprefAecDump;
71e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev  private String keyprefOpenSLES;
72bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org  private String keyprefDisplayHud;
736f28cf0b951a9d41246f022f48a6cd035fad151dPeter Boström  private String keyprefTracing;
74a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org  private String keyprefRoomServerUrl;
75243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  private String keyprefRoom;
765f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private String keyprefRoomList;
775f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ArrayList<String> roomList;
785f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ArrayAdapter<String> adapter;
797bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
807bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  @Override
817bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  public void onCreate(Bundle savedInstanceState) {
827bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    super.onCreate(savedInstanceState);
837bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
84243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    // Get setting keys.
85243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
86243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
87e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefVideoCallEnabled = getString(R.string.pref_videocall_key);
88243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    keyprefResolution = getString(R.string.pref_resolution_key);
895f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    keyprefFps = getString(R.string.pref_fps_key);
9067e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert    keyprefCaptureQualitySlider = getString(R.string.pref_capturequalityslider_key);
91e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefVideoBitrateType = getString(R.string.pref_startvideobitrate_key);
92e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefVideoBitrateValue = getString(R.string.pref_startvideobitratevalue_key);
9344ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    keyprefVideoCodec = getString(R.string.pref_videocodec_key);
9444ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    keyprefHwCodecAcceleration = getString(R.string.pref_hwcodec_key);
95d48015364d1a3545ea503ce03ec49762a480d42cPer    keyprefCaptureToTexture = getString(R.string.pref_capturetotexture_key);
96e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefAudioBitrateType = getString(R.string.pref_startaudiobitrate_key);
97e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefAudioBitrateValue = getString(R.string.pref_startaudiobitratevalue_key);
98e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefAudioCodec = getString(R.string.pref_audiocodec_key);
998a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom    keyprefNoAudioProcessingPipeline = getString(R.string.pref_noaudioprocessing_key);
1000b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs    keyprefAecDump = getString(R.string.pref_aecdump_key);
101e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev    keyprefOpenSLES = getString(R.string.pref_opensles_key);
102bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    keyprefDisplayHud = getString(R.string.pref_displayhud_key);
1036f28cf0b951a9d41246f022f48a6cd035fad151dPeter Boström    keyprefTracing = getString(R.string.pref_tracing_key);
104a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org    keyprefRoomServerUrl = getString(R.string.pref_room_server_url_key);
105243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    keyprefRoom = getString(R.string.pref_room_key);
1065f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    keyprefRoomList = getString(R.string.pref_room_list_key);
107243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
1087bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    setContentView(R.layout.activity_connect);
1097bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
1107bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    roomEditText = (EditText) findViewById(R.id.room_edittext);
1117bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    roomEditText.setOnEditorActionListener(
112edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      new TextView.OnEditorActionListener() {
113edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org        @Override
114edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org        public boolean onEditorAction(
115edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org            TextView textView, int i, KeyEvent keyEvent) {
116edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org          if (i == EditorInfo.IME_ACTION_DONE) {
117edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org            addRoomButton.performClick();
118edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org            return true;
1197bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org          }
120edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org          return false;
121edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org        }
1227bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    });
1237bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    roomEditText.requestFocus();
1247bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
1255f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomListView = (ListView) findViewById(R.id.room_listview);
1265f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
127470988742a2ad2edbeba3a99b86481b4fb0cd0d3perkj@webrtc.org
1285f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    addRoomButton = (ImageButton) findViewById(R.id.add_room_button);
1295f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    addRoomButton.setOnClickListener(addRoomListener);
1305f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    removeRoomButton = (ImageButton) findViewById(R.id.remove_room_button);
1315f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    removeRoomButton.setOnClickListener(removeRoomListener);
1325f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectButton = (ImageButton) findViewById(R.id.connect_button);
1335f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectButton.setOnClickListener(connectListener);
1345f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectLoopbackButton =
1355f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        (ImageButton) findViewById(R.id.connect_loopback_button);
1365f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectLoopbackButton.setOnClickListener(connectListener);
137edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org
138edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    // If an implicit VIEW intent is launching the app, go directly to that URL.
139edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    final Intent intent = getIntent();
1405eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org    if ("android.intent.action.VIEW".equals(intent.getAction())
1415eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org        && !commandLineRun) {
142edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      commandLineRun = true;
143bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      boolean loopback = intent.getBooleanExtra(
144bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org          CallActivity.EXTRA_LOOPBACK, false);
145bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      int runTimeMs = intent.getIntExtra(
146bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org          CallActivity.EXTRA_RUNTIME, 0);
147369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      String room = sharedPref.getString(keyprefRoom, "");
148369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      roomEditText.setText(room);
149369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      connectToRoom(loopback, runTimeMs);
150edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      return;
151edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    }
1527bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  }
1537bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
154243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
155243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public boolean onCreateOptionsMenu(Menu menu) {
156243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    getMenuInflater().inflate(R.menu.connect_menu, menu);
157243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    return true;
158243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
159243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
160243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
161243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public boolean onOptionsItemSelected(MenuItem item) {
162243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    // Handle presses on the action bar items.
163243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    if (item.getItemId() == R.id.action_settings) {
164243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      Intent intent = new Intent(this, SettingsActivity.class);
165243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      startActivity(intent);
166243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      return true;
167243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    } else {
168243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      return super.onOptionsItemSelected(item);
169243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    }
170243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
171243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
172243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
173243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public void onPause() {
174243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    super.onPause();
175243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    String room = roomEditText.getText().toString();
1765f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    String roomListJson = new JSONArray(roomList).toString();
177243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    SharedPreferences.Editor editor = sharedPref.edit();
178243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    editor.putString(keyprefRoom, room);
1795f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    editor.putString(keyprefRoomList, roomListJson);
180243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    editor.commit();
181243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
182243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
183243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
184243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public void onResume() {
185243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    super.onResume();
186243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    String room = sharedPref.getString(keyprefRoom, "");
187243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    roomEditText.setText(room);
1885f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomList = new ArrayList<String>();
1895f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    String roomListJson = sharedPref.getString(keyprefRoomList, null);
1905f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (roomListJson != null) {
1915f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      try {
1925f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        JSONArray jsonArray = new JSONArray(roomListJson);
1935f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        for (int i = 0; i < jsonArray.length(); i++) {
1945f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org          roomList.add(jsonArray.get(i).toString());
1955f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        }
1965f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      } catch (JSONException e) {
1975f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        Log.e(TAG, "Failed to load room list: " + e.toString());
1985f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
1995f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
2005f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    adapter = new ArrayAdapter<String>(
2015f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        this, android.R.layout.simple_list_item_1, roomList);
2025f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomListView.setAdapter(adapter);
2035f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (adapter.getCount() > 0) {
2045f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      roomListView.requestFocus();
2055f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      roomListView.setItemChecked(0, true);
2065f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
207243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
208243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
209edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org  @Override
210edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org  protected void onActivityResult(
211edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      int requestCode, int resultCode, Intent data) {
212edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    if (requestCode == CONNECTION_REQUEST && commandLineRun) {
213edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      Log.d(TAG, "Return: " + resultCode);
214edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      setResult(resultCode);
215bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      commandLineRun = false;
216edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      finish();
217edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    }
218edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org  }
219edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org
2205f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private final OnClickListener connectListener = new OnClickListener() {
2215f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    @Override
2225f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    public void onClick(View view) {
2235f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      boolean loopback = false;
2245f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (view.getId() == R.id.connect_loopback_button) {
2255f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        loopback = true;
2265f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
227369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      commandLineRun = false;
228369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      connectToRoom(loopback, 0);
229369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
230369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org  };
231369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
232369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org  private void connectToRoom(boolean loopback, int runTimeMs) {
233369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Get room name (random for loopback).
234bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    String roomId;
235369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (loopback) {
236bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      roomId = Integer.toString((new Random()).nextInt(100000000));
237369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    } else {
238bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      roomId = getSelectedItem();
239bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      if (roomId == null) {
240bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        roomId = roomEditText.getText().toString();
2416f6ef72950b9bda79392e83d7b1495d4ff07b4a2henrik.lundin@webrtc.org      }
242369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
243369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
244bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    String roomUrl = sharedPref.getString(
245a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org        keyprefRoomServerUrl,
246a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org        getString(R.string.pref_room_server_url_default));
247369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
248e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    // Video call enabled flag.
249e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    boolean videoCallEnabled = sharedPref.getBoolean(keyprefVideoCallEnabled,
250e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        Boolean.valueOf(getString(R.string.pref_videocall_default)));
251e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org
252e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    // Get default codecs.
25344ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    String videoCodec = sharedPref.getString(keyprefVideoCodec,
25444ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org        getString(R.string.pref_videocodec_default));
255e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    String audioCodec = sharedPref.getString(keyprefAudioCodec,
256e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        getString(R.string.pref_audiocodec_default));
25744ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org
258369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Check HW codec flag.
25944ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    boolean hwCodec = sharedPref.getBoolean(keyprefHwCodecAcceleration,
260369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Boolean.valueOf(getString(R.string.pref_hwcodec_default)));
261369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
262d48015364d1a3545ea503ce03ec49762a480d42cPer    // Check Capture to texture.
263d48015364d1a3545ea503ce03ec49762a480d42cPer    boolean captureToTexture = sharedPref.getBoolean(keyprefCaptureToTexture,
264d48015364d1a3545ea503ce03ec49762a480d42cPer        Boolean.valueOf(getString(R.string.pref_capturetotexture_default)));
265d48015364d1a3545ea503ce03ec49762a480d42cPer
2668a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom    // Check Disable Audio Processing flag.
2678a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom    boolean noAudioProcessing = sharedPref.getBoolean(
2688a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom        keyprefNoAudioProcessingPipeline,
2698a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom        Boolean.valueOf(getString(R.string.pref_noaudioprocessing_default)));
2708a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom
2710b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs    // Check Disable Audio Processing flag.
2720b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs    boolean aecDump = sharedPref.getBoolean(
2730b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs        keyprefAecDump,
2740b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs        Boolean.valueOf(getString(R.string.pref_aecdump_default)));
2750b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs
276e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev    // Check OpenSL ES enabled flag.
277e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev    boolean useOpenSLES = sharedPref.getBoolean(
278e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev        keyprefOpenSLES,
279e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev        Boolean.valueOf(getString(R.string.pref_opensles_default)));
280e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev
281bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    // Get video resolution from settings.
282bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    int videoWidth = 0;
283bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    int videoHeight = 0;
284369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String resolution = sharedPref.getString(keyprefResolution,
285369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        getString(R.string.pref_resolution_default));
286369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String[] dimensions = resolution.split("[ x]+");
287369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (dimensions.length == 2) {
288369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      try {
289bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoWidth = Integer.parseInt(dimensions[0]);
290bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoHeight = Integer.parseInt(dimensions[1]);
291369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      } catch (NumberFormatException e) {
292bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoWidth = 0;
293bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoHeight = 0;
294369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Log.e(TAG, "Wrong video resolution setting: " + resolution);
2955f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
296369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
297369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
298bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    // Get camera fps from settings.
299bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    int cameraFps = 0;
300369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String fps = sharedPref.getString(keyprefFps,
301369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        getString(R.string.pref_fps_default));
302369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String[] fpsValues = fps.split("[ x]+");
303369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (fpsValues.length == 2) {
304369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      try {
305bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        cameraFps = Integer.parseInt(fpsValues[0]);
306369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      } catch (NumberFormatException e) {
307369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Log.e(TAG, "Wrong camera fps setting: " + fps);
3085f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
309369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
310369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
31167e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert    // Check capture quality slider flag.
31267e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert    boolean captureQualitySlider = sharedPref.getBoolean(keyprefCaptureQualitySlider,
31367e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert        Boolean.valueOf(getString(R.string.pref_capturequalityslider_default)));
31467e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert
315e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    // Get video and audio start bitrate.
316e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    int videoStartBitrate = 0;
317e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    String bitrateTypeDefault = getString(
318e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        R.string.pref_startvideobitrate_default);
319369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String bitrateType = sharedPref.getString(
320e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        keyprefVideoBitrateType, bitrateTypeDefault);
321e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    if (!bitrateType.equals(bitrateTypeDefault)) {
322e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      String bitrateValue = sharedPref.getString(keyprefVideoBitrateValue,
323e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org          getString(R.string.pref_startvideobitratevalue_default));
324e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      videoStartBitrate = Integer.parseInt(bitrateValue);
325e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    }
326e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    int audioStartBitrate = 0;
327e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
328e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    bitrateType = sharedPref.getString(
329e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        keyprefAudioBitrateType, bitrateTypeDefault);
330369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (!bitrateType.equals(bitrateTypeDefault)) {
331e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      String bitrateValue = sharedPref.getString(keyprefAudioBitrateValue,
332e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org          getString(R.string.pref_startaudiobitratevalue_default));
333e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      audioStartBitrate = Integer.parseInt(bitrateValue);
334369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
335369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
336bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    // Check statistics display option.
337bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    boolean displayHud = sharedPref.getBoolean(keyprefDisplayHud,
338bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        Boolean.valueOf(getString(R.string.pref_displayhud_default)));
339369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
3406f28cf0b951a9d41246f022f48a6cd035fad151dPeter Boström    boolean tracing = sharedPref.getBoolean(
3416f28cf0b951a9d41246f022f48a6cd035fad151dPeter Boström            keyprefTracing, Boolean.valueOf(getString(R.string.pref_tracing_default)));
3426f28cf0b951a9d41246f022f48a6cd035fad151dPeter Boström
343369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Start AppRTCDemo activity.
344bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    Log.d(TAG, "Connecting to room " + roomId + " at URL " + roomUrl);
345bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    if (validateUrl(roomUrl)) {
346bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      Uri uri = Uri.parse(roomUrl);
347bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      Intent intent = new Intent(this, CallActivity.class);
348369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      intent.setData(uri);
349bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_ROOMID, roomId);
350bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_LOOPBACK, loopback);
351e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_CALL, videoCallEnabled);
352bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_WIDTH, videoWidth);
353bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_HEIGHT, videoHeight);
354bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_FPS, cameraFps);
35567e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert      intent.putExtra(CallActivity.EXTRA_VIDEO_CAPTUREQUALITYSLIDER_ENABLED,
35667e0cf15d323642516f40b619f6474db333524a7Magnus Jedvert          captureQualitySlider);
357e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_BITRATE, videoStartBitrate);
358e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEOCODEC, videoCodec);
359e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_HWCODEC_ENABLED, hwCodec);
360d48015364d1a3545ea503ce03ec49762a480d42cPer      intent.putExtra(CallActivity.EXTRA_CAPTURETOTEXTURE_ENABLED, captureToTexture);
3618a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom      intent.putExtra(CallActivity.EXTRA_NOAUDIOPROCESSING_ENABLED,
3628a19f3dc62f4817404c322280d8f035de1adb56aNiklas Enbom          noAudioProcessing);
3630b0a88b918062ee50a36a8e8b5d7f0cc040046fbaluebs      intent.putExtra(CallActivity.EXTRA_AECDUMP_ENABLED, aecDump);
364e66339296b3d2a3f077bf96a7c221c18d96ae630glaznev      intent.putExtra(CallActivity.EXTRA_OPENSLES_ENABLED, useOpenSLES);
365e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_AUDIO_BITRATE, audioStartBitrate);
366e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_AUDIOCODEC, audioCodec);
367bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_DISPLAY_HUD, displayHud);
3686f28cf0b951a9d41246f022f48a6cd035fad151dPeter Boström      intent.putExtra(CallActivity.EXTRA_TRACING, tracing);
369bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_CMDLINE, commandLineRun);
370bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_RUNTIME, runTimeMs);
371bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org
372edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      startActivityForResult(intent, CONNECTION_REQUEST);
3737bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    }
3747bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  }
3757bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
3767bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  private boolean validateUrl(String url) {
3775eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org    if (URLUtil.isHttpsUrl(url) || URLUtil.isHttpUrl(url)) {
3787bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org      return true;
3795eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org    }
3807bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
3817bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    new AlertDialog.Builder(this)
3827bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setTitle(getText(R.string.invalid_url_title))
3837bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setMessage(getString(R.string.invalid_url_text, url))
3847bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setCancelable(false)
3857bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
3867bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org            public void onClick(DialogInterface dialog, int id) {
3877bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org              dialog.cancel();
3887bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org            }
3897bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org          }).create().show();
3907bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    return false;
3917bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  }
3925f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
3935f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private final OnClickListener addRoomListener = new OnClickListener() {
3945f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    @Override
3955f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    public void onClick(View view) {
3965f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      String newRoom = roomEditText.getText().toString();
3975f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (newRoom.length() > 0 && !roomList.contains(newRoom)) {
3985f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.add(newRoom);
3995f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.notifyDataSetChanged();
4005f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
4015f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
4025f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  };
4035f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
4045f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private final OnClickListener removeRoomListener = new OnClickListener() {
4055f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    @Override
4065f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    public void onClick(View view) {
4075f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      String selectedRoom = getSelectedItem();
4085f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (selectedRoom != null) {
4095f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.remove(selectedRoom);
4105f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.notifyDataSetChanged();
4115f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
4125f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
4135f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  };
4145f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
4155f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private String getSelectedItem() {
4165f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    int position = AdapterView.INVALID_POSITION;
4175f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (roomListView.getCheckedItemCount() > 0 && adapter.getCount() > 0) {
4185f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      position = roomListView.getCheckedItemPosition();
4195f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (position >= adapter.getCount()) {
4205f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        position = AdapterView.INVALID_POSITION;
4215f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
4225f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
4235f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (position != AdapterView.INVALID_POSITION) {
4245f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      return adapter.getItem(position);
4255f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    } else {
4265f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      return null;
4275f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
4285f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  }
4295f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
4307bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org}
431